aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/examples/example01.pd45
-rw-r--r--doc/examples/example02.pd44
-rw-r--r--doc/examples/example03.pd86
-rw-r--r--doc/examples/example04.pd85
-rw-r--r--doc/examples/example05.pd142
-rw-r--r--doc/examples/example06.pd76
-rw-r--r--doc/examples/example07.pd73
-rw-r--r--doc/examples/example08.pd57
-rw-r--r--doc/examples/example09.pd35
-rw-r--r--doc/examples/example10.pd55
-rw-r--r--doc/examples/example11.pd80
-rw-r--r--doc/examples/example12.pd42
-rw-r--r--doc/examples/example13.pd104
-rw-r--r--doc/examples/example14.pd54
-rw-r--r--doc/examples/example15.pd27
-rw-r--r--doc/introduction/control.pd17
-rw-r--r--doc/introduction/input_output.pd82
-rw-r--r--doc/introduction/quicktime.pd101
-rw-r--r--doc/introduction/traffic.pd101
-rw-r--r--doc/objects/README4
-rw-r--r--doc/objects/pdp_abs.pd21
-rw-r--r--doc/objects/pdp_add.pd34
-rw-r--r--doc/objects/pdp_and.pd24
-rw-r--r--doc/objects/pdp_bitdepth.pd32
-rw-r--r--doc/objects/pdp_bitmask.pd22
-rw-r--r--doc/objects/pdp_bq.pd154
-rw-r--r--doc/objects/pdp_bqt.pd98
-rw-r--r--doc/objects/pdp_cheby.pd66
-rw-r--r--doc/objects/pdp_chrot.pd13
-rw-r--r--doc/objects/pdp_cog.pd32
-rw-r--r--doc/objects/pdp_constant.pd21
-rw-r--r--doc/objects/pdp_control.pd59
-rw-r--r--doc/objects/pdp_conv.pd44
-rw-r--r--doc/objects/pdp_convert.pd17
-rw-r--r--doc/objects/pdp_del.pd31
-rw-r--r--doc/objects/pdp_description.pd28
-rw-r--r--doc/objects/pdp_flip_lr.pd11
-rw-r--r--doc/objects/pdp_flip_tb.pd11
-rw-r--r--doc/objects/pdp_gain.pd23
-rw-r--r--doc/objects/pdp_grey2mask.pd25
-rw-r--r--doc/objects/pdp_help_input.pd79
-rw-r--r--doc/objects/pdp_help_output.pd14
-rw-r--r--doc/objects/pdp_histo.pd36
-rw-r--r--doc/objects/pdp_hthresh.pd26
-rw-r--r--doc/objects/pdp_loop.pd62
-rw-r--r--doc/objects/pdp_mix.pd21
-rw-r--r--doc/objects/pdp_mix2.pd25
-rw-r--r--doc/objects/pdp_mul.pd28
-rw-r--r--doc/objects/pdp_netsend.pd62
-rw-r--r--doc/objects/pdp_noise.pd21
-rw-r--r--doc/objects/pdp_not.pd21
-rw-r--r--doc/objects/pdp_or.pd24
-rw-r--r--doc/objects/pdp_plasma.pd29
-rw-r--r--doc/objects/pdp_pointcloud.pd32
-rw-r--r--doc/objects/pdp_positive.pd27
-rw-r--r--doc/objects/pdp_qt.pd71
-rw-r--r--doc/objects/pdp_qt~.pd25
-rw-r--r--doc/objects/pdp_randmix.pd24
-rw-r--r--doc/objects/pdp_rawin.pd28
-rw-r--r--doc/objects/pdp_rawout.pd28
-rw-r--r--doc/objects/pdp_reg.pd38
-rw-r--r--doc/objects/pdp_rotate.pd30
-rw-r--r--doc/objects/pdp_route.pd22
-rw-r--r--doc/objects/pdp_scale.pd32
-rw-r--r--doc/objects/pdp_scanxy~.pd76
-rw-r--r--doc/objects/pdp_scan~.pd41
-rw-r--r--doc/objects/pdp_scope~.pd23
-rw-r--r--doc/objects/pdp_sign.pd25
-rw-r--r--doc/objects/pdp_snap.pd21
-rw-r--r--doc/objects/pdp_sthresh.pd26
-rw-r--r--doc/objects/pdp_trigger.pd79
-rw-r--r--doc/objects/pdp_v4l.pd71
-rw-r--r--doc/objects/pdp_xor.pd28
-rw-r--r--doc/objects/pdp_xv.pd61
-rw-r--r--doc/objects/pdp_zoom.pd41
-rw-r--r--doc/objects/pdp_zrot.pd47
-rw-r--r--doc/objects/pdp_zthresh.pd21
77 files changed, 3441 insertions, 0 deletions
diff --git a/doc/examples/example01.pd b/doc/examples/example01.pd
new file mode 100644
index 0000000..94db2ea
--- /dev/null
+++ b/doc/examples/example01.pd
@@ -0,0 +1,45 @@
+#N canvas 657 0 518 446 10;
+#X obj 133 414 pdp_xv;
+#X obj 177 76 pdp_v4l;
+#X obj 177 33 metro 40;
+#X obj 176 8 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 35 149 pdp_conv;
+#X obj 35 173 pdp_conv_sobel_edge;
+#X obj 412 60 pdp_control;
+#X msg 412 32 thread \$1;
+#X obj 412 8 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 133 352 pdp_gradient;
+#X obj 133 288 pdp_motion_phase;
+#X msg 254 30 type grey;
+#X obj 35 125 pdp_del 8;
+#X obj 35 198 pdp_gain 6;
+#X msg 240 252 0.45;
+#X text 223 125 8 frames delay;
+#X text 223 149 smooth;
+#X text 223 174 edge detect;
+#X text 222 200 amplify;
+#X text 232 6 process in greyscale;
+#X text 322 287 motion phase shifter;
+#X text 320 354 grey -> colour palette;
+#X msg 36 323 rgb 1 0.5 0;
+#X obj 133 252 pdp_add;
+#X msg 133 216 debug;
+#X connect 1 0 12 0;
+#X connect 1 0 23 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 13 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 0 0;
+#X connect 10 0 9 0;
+#X connect 11 0 1 0;
+#X connect 12 0 4 0;
+#X connect 13 0 23 0;
+#X connect 14 0 10 1;
+#X connect 22 0 9 0;
+#X connect 23 0 10 0;
+#X connect 24 0 23 0;
diff --git a/doc/examples/example02.pd b/doc/examples/example02.pd
new file mode 100644
index 0000000..0a46e04
--- /dev/null
+++ b/doc/examples/example02.pd
@@ -0,0 +1,44 @@
+#N canvas 85 437 473 316 10;
+#X obj 91 268 pdp_xv;
+#X obj 91 73 pdp_v4l;
+#X obj 91 30 metro 40;
+#X obj 90 5 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1
+;
+#X obj 326 57 pdp_control;
+#X msg 326 29 thread \$1;
+#X obj 326 5 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 146 3 process in greyscale;
+#X obj 135 195 pdp_gain;
+#X obj 135 222 pdp_gain;
+#X msg 168 27 type yv12;
+#X obj 91 129 pdp_mix;
+#X msg 169 51 type grey;
+#X obj 216 194 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 0.62 256;
+#X obj 139 103 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 0.82 256;
+#X obj 215 133 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 8 256;
+#X obj 135 162 pdp_del 25;
+#X obj 216 173 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 1.5 256;
+#X text 289 177 gains clip at -1 \, 1;
+#X msg 159 129 reset;
+#X connect 1 0 11 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 1;
+#X connect 10 0 1 0;
+#X connect 11 0 0 0;
+#X connect 11 0 16 0;
+#X connect 12 0 1 0;
+#X connect 13 0 9 1;
+#X connect 14 0 11 2;
+#X connect 15 0 16 1;
+#X connect 16 0 8 0;
+#X connect 17 0 8 1;
+#X connect 19 0 16 0;
diff --git a/doc/examples/example03.pd b/doc/examples/example03.pd
new file mode 100644
index 0000000..0eddd0d
--- /dev/null
+++ b/doc/examples/example03.pd
@@ -0,0 +1,86 @@
+#N canvas 141 84 841 685 10;
+#X obj 68 318 pdp_noise;
+#X obj 68 85 metro 40;
+#X obj 68 58 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 68 484 pdp_del 50;
+#X obj 112 424 pdp_gain;
+#X floatatom 240 518 5 0 0;
+#X obj 68 514 pdp_blur;
+#X obj 243 499 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 10100 1;
+#X floatatom 240 367 5 0 0;
+#X obj 243 342 hsl 128 15 0 5 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X floatatom 240 587 5 0 0;
+#X obj 243 567 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 4100 1;
+#X floatatom 239 428 5 0 0;
+#X obj 242 409 hsl 128 15 -5 5 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 11900 1;
+#X msg 15 460 reset;
+#X obj 68 459 pdp_add;
+#X obj 68 357 pdp_gain;
+#X text 203 7 this example shows how to use a delay line with a loop
+gain > 1 and some processing inside the loop to produce a plasma like
+effect. (WARNING: this can produce a very intense strobe effect \,
+so if you're sensitive to flashing lights please be careful...);
+#X text 391 407 a |gain| > 1 ensures regeneration;
+#X floatatom 119 56 5 0 0;
+#X obj 68 582 pdp_motion_phase;
+#X floatatom 133 459 5 0 0;
+#X text 392 495 blur ensures spatial coupling (determines the speed
+at which "blobs" move around the screen);
+#X text 392 565 a motion phase effect to spice it up (this causes local
+negative feedback around suddon changes);
+#X msg 109 13 40;
+#X msg 144 13 1000;
+#X msg 109 250 type grey;
+#X msg 109 135 type yv12;
+#X obj 68 619 pdp_xv;
+#X text 201 247 it also works for black and white \, but all negative
+colours will be clipped to 0 (black) on output.;
+#X text 393 340 mix in some noise to get it going (set blur to minimal
+when starting so the added noise won't be blurred to black);
+#X text 202 96 it illustrates one of the advantages of working in an
+additive/subtractive colour space. (here yuv or YCrCb). since legal
+colours can be both positive and negative \, the analogy with audio
+signals is easily drawn. this network can be seen as a nonlinear feedback
+delay network. (nonlinear because of the saturating gain). the image
+delay line can be seen as a parallel delay line \, one for each pixel.
+coupling between the delays is done using a spatial blur effect. the
+additional temporal filtering isn't necessary \, but it produces a
+nice additional effect.;
+#X obj 534 661 pdp_control;
+#X obj 534 684 print;
+#X msg 534 637 thread \$1;
+#X obj 534 614 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X connect 0 0 16 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 4 0 15 1;
+#X connect 6 0 20 0;
+#X connect 7 0 5 0;
+#X connect 7 0 6 1;
+#X connect 9 0 8 0;
+#X connect 9 0 16 1;
+#X connect 11 0 10 0;
+#X connect 11 0 20 1;
+#X connect 13 0 12 0;
+#X connect 13 0 4 1;
+#X connect 14 0 3 0;
+#X connect 15 0 3 0;
+#X connect 16 0 15 0;
+#X connect 19 0 1 1;
+#X connect 20 0 4 0;
+#X connect 20 0 28 0;
+#X connect 21 0 3 1;
+#X connect 24 0 19 0;
+#X connect 25 0 19 0;
+#X connect 26 0 0 0;
+#X connect 27 0 0 0;
+#X connect 32 0 33 0;
+#X connect 34 0 32 0;
+#X connect 35 0 34 0;
diff --git a/doc/examples/example04.pd b/doc/examples/example04.pd
new file mode 100644
index 0000000..501d283
--- /dev/null
+++ b/doc/examples/example04.pd
@@ -0,0 +1,85 @@
+#N canvas 89 39 931 736 10;
+#X obj 68 204 pdp_noise;
+#X obj 68 85 metro 40;
+#X obj 68 58 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 112 303 pdp_gain;
+#X floatatom 240 518 5 0 0;
+#X obj 68 514 pdp_blur;
+#X obj 243 499 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 6500 1;
+#X floatatom 240 233 5 0 0;
+#X obj 243 208 hsl 128 15 0 5 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X floatatom 240 587 5 0 0;
+#X obj 243 567 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 5000 1;
+#X floatatom 239 307 5 0 0;
+#X obj 242 288 hsl 128 15 -5 5 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 8920 1;
+#X msg 15 339 reset;
+#X obj 68 338 pdp_add;
+#X obj 68 243 pdp_gain;
+#X text 393 286 a |gain| > 1 ensures regeneration;
+#X floatatom 119 56 5 0 0;
+#X obj 68 582 pdp_motion_phase;
+#X floatatom 133 338 5 0 0;
+#X text 392 495 blur ensures spatial coupling (determines the speed
+at which "blobs" move around the screen);
+#X text 392 565 a motion phase effect to spice it up (this causes local
+negative feedback around suddon changes);
+#X msg 109 13 40;
+#X msg 144 13 1000;
+#X msg 146 119 type grey;
+#X msg 147 90 type yv12;
+#X obj 68 619 pdp_xv;
+#X text 393 206 mix in some noise to get it going (set blur to minimal
+when starting so the added noise won't be blurred to black);
+#X obj 68 363 pdp_del 50;
+#X text 242 14 this example is like example03 with a zoom / rotation
+object thrown in;
+#X obj 68 480 pdp_zrot;
+#X floatatom 239 377 5 0 0;
+#X obj 242 358 hsl 128 15 0.1 10 1 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 8567 1;
+#X floatatom 239 446 5 0 0;
+#X obj 242 426 hsl 128 15 0 360 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 300 1;
+#X text 393 357 zoom;
+#X msg 239 334 1;
+#X msg 239 403 0;
+#X msg 239 261 1;
+#X text 392 420 rotation;
+#X connect 0 0 15 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 14 1;
+#X connect 5 0 18 0;
+#X connect 6 0 4 0;
+#X connect 6 0 5 1;
+#X connect 8 0 7 0;
+#X connect 8 0 15 1;
+#X connect 10 0 9 0;
+#X connect 10 0 18 1;
+#X connect 12 0 11 0;
+#X connect 12 0 3 1;
+#X connect 13 0 28 0;
+#X connect 14 0 28 0;
+#X connect 15 0 14 0;
+#X connect 17 0 1 1;
+#X connect 18 0 3 0;
+#X connect 18 0 26 0;
+#X connect 19 0 28 1;
+#X connect 22 0 17 0;
+#X connect 23 0 17 0;
+#X connect 24 0 0 0;
+#X connect 25 0 0 0;
+#X connect 28 0 30 0;
+#X connect 30 0 5 0;
+#X connect 31 0 30 1;
+#X connect 32 0 31 0;
+#X connect 33 0 30 2;
+#X connect 34 0 33 0;
+#X connect 36 0 32 0;
+#X connect 37 0 34 0;
+#X connect 38 0 12 0;
diff --git a/doc/examples/example05.pd b/doc/examples/example05.pd
new file mode 100644
index 0000000..02bc688
--- /dev/null
+++ b/doc/examples/example05.pd
@@ -0,0 +1,142 @@
+#N canvas 584 220 538 637 10;
+#X obj 10 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 120 117 pdp_grey;
+#X obj 435 194 pdp_control;
+#X msg 435 167 thread 0;
+#X obj 121 224 pdp_reg;
+#X floatatom 81 7 5 0 0;
+#X msg 35 10 stop;
+#X floatatom 187 341 5 0 0;
+#X obj 120 410 pdp_zrot;
+#X floatatom 188 389 5 0 0;
+#X obj 120 453 pdp_blur;
+#X floatatom 188 435 5 0 0;
+#X obj 120 92 pdp_noise;
+#X obj 120 70 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 623 175 567 478 nlmap 0;
+#X obj 89 138 pdp_affine;
+#X msg 123 108 -1;
+#X msg 156 108 1;
+#X obj 92 161 pdp_mul;
+#X obj 95 189 pdp_gain;
+#X floatatom 234 159 5 0 0;
+#X msg 259 119 3.73;
+#X obj 100 272 pdp_affine;
+#X msg 134 242 -1;
+#X msg 167 242 1;
+#X obj 103 295 pdp_mul;
+#X obj 106 323 pdp_gain;
+#X floatatom 168 299 5 0 0;
+#X msg 185 271 3.73;
+#X obj 254 54 inlet;
+#X obj 79 55 inlet;
+#X obj 98 405 outlet;
+#X obj 164 60 loadbang;
+#X obj 190 84 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 260 220 this computes f(f(image));
+#X text 261 236 with f(x) = k*x*(1-x);
+#X text 286 160 k;
+#X text 260 253 the logistic map;
+#X text 173 353 2 iterations are used to eliminate most of the high
+frequency flickering;
+#X connect 0 0 3 0;
+#X connect 1 0 0 1;
+#X connect 2 0 0 2;
+#X connect 3 0 4 0;
+#X connect 4 0 10 1;
+#X connect 4 0 7 0;
+#X connect 5 0 4 1;
+#X connect 5 0 12 0;
+#X connect 6 0 5 0;
+#X connect 7 0 10 0;
+#X connect 8 0 7 1;
+#X connect 9 0 7 2;
+#X connect 10 0 11 0;
+#X connect 11 0 16 0;
+#X connect 12 0 11 1;
+#X connect 13 0 12 0;
+#X connect 14 0 5 0;
+#X connect 15 0 3 1;
+#X connect 15 0 0 0;
+#X connect 17 0 18 0;
+#X connect 18 0 2 0;
+#X connect 18 0 1 0;
+#X connect 18 0 6 0;
+#X connect 18 0 8 0;
+#X connect 18 0 9 0;
+#X restore 121 274 pd nlmap;
+#X obj 73 576 pdp_xv;
+#X floatatom 180 232 5 0 0;
+#X text 196 275 2 iterations of the logistic map function;
+#X obj 121 143 pdp_mul;
+#X obj 297 94 pdp_noise;
+#X obj 297 72 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 297 121 pdp_mul;
+#X obj 73 521 pdp_saturation;
+#X floatatom 166 490 5 0 0;
+#X obj 30 36 metro 70;
+#X msg 181 206 3.8;
+#X msg 186 318 1.17;
+#X msg 188 368 -2.33;
+#X text 242 341 zoom;
+#X text 241 391 rotate;
+#X msg 188 414 0.33;
+#X text 139 12 feedback with nonlinear mapping + zoom + rotate + blur
+;
+#X msg 82 -15 40;
+#X msg 116 -15 500;
+#X text 111 47 grey1;
+#X obj 212 119 pdp_grey;
+#X obj 212 94 pdp_noise;
+#X obj 212 72 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 203 49 grey2;
+#X text 287 50 colour1;
+#X obj 388 95 pdp_noise;
+#X obj 388 73 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 378 51 colour2;
+#X msg 238 463 -0.5;
+#X msg 282 463 0.5;
+#X connect 0 0 24 0;
+#X connect 1 0 18 1;
+#X connect 1 0 18 0;
+#X connect 3 0 2 0;
+#X connect 4 0 14 0;
+#X connect 5 0 24 1;
+#X connect 6 0 24 0;
+#X connect 7 0 8 1;
+#X connect 8 0 10 0;
+#X connect 9 0 8 2;
+#X connect 10 0 4 1;
+#X connect 11 0 10 1;
+#X connect 12 0 1 0;
+#X connect 13 0 12 0;
+#X connect 14 0 8 0;
+#X connect 14 0 22 0;
+#X connect 16 0 14 1;
+#X connect 18 0 4 0;
+#X connect 19 0 21 1;
+#X connect 19 0 21 0;
+#X connect 20 0 19 0;
+#X connect 21 0 4 0;
+#X connect 22 0 15 0;
+#X connect 23 0 22 1;
+#X connect 24 0 4 0;
+#X connect 25 0 16 0;
+#X connect 26 0 7 0;
+#X connect 27 0 9 0;
+#X connect 30 0 11 0;
+#X connect 32 0 5 0;
+#X connect 33 0 5 0;
+#X connect 35 0 4 0;
+#X connect 36 0 35 0;
+#X connect 37 0 36 0;
+#X connect 40 0 4 0;
+#X connect 41 0 40 0;
+#X connect 43 0 23 0;
+#X connect 44 0 23 0;
diff --git a/doc/examples/example06.pd b/doc/examples/example06.pd
new file mode 100644
index 0000000..82de63b
--- /dev/null
+++ b/doc/examples/example06.pd
@@ -0,0 +1,76 @@
+#N canvas 92 197 605 585 10;
+#X obj 24 85 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 42 25 stop;
+#X msg 80 24 bang;
+#X floatatom 122 25 5 0 0;
+#X obj 60 485 pdp_xv;
+#X obj 60 439 pdp_bq;
+#X obj 111 334 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 169 332 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 97 278 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 154 277 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X msg 95 303 lr \$1;
+#X msg 150 304 rl \$1;
+#X msg 99 350 tb \$1;
+#X msg 154 351 bt \$1;
+#X obj 392 240 hsl 128 15 0.05 0.5 1 1 empty empty empty -2 -6 0 8
+-262144 -1 -1 3000 1;
+#X obj 450 280 hsl 128 15 0.1 10 1 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 1900 1;
+#X obj 391 307 t b f;
+#X obj 394 345 pack s 0 0;
+#X msg 391 378 \$1 \$2 \$3;
+#X obj 447 310 t b f;
+#X msg 301 199 lpf;
+#X msg 333 200 apf;
+#X obj 130 198 random 2;
+#X obj 195 198 random 2;
+#X obj 60 147 pdp_trigger;
+#X obj 128 235 random 2;
+#X obj 193 235 random 2;
+#X obj 60 111 pdp_v4l;
+#X obj 301 121 loadbang;
+#X obj 60 53 metro 40;
+#X text 388 219 frequency;
+#X text 447 261 Q;
+#X text 312 175 filter type;
+#X connect 0 0 27 0;
+#X connect 1 0 29 0;
+#X connect 2 0 29 0;
+#X connect 3 0 29 1;
+#X connect 5 0 4 0;
+#X connect 6 0 12 0;
+#X connect 7 0 13 0;
+#X connect 8 0 10 0;
+#X connect 9 0 11 0;
+#X connect 10 0 5 0;
+#X connect 11 0 5 0;
+#X connect 12 0 5 0;
+#X connect 13 0 5 0;
+#X connect 14 0 16 0;
+#X connect 15 0 19 0;
+#X connect 16 0 17 0;
+#X connect 16 1 17 1;
+#X connect 17 0 18 0;
+#X connect 18 0 5 0;
+#X connect 19 0 17 0;
+#X connect 19 1 17 2;
+#X connect 20 0 17 0;
+#X connect 21 0 17 0;
+#X connect 22 0 8 0;
+#X connect 23 0 9 0;
+#X connect 24 0 5 0;
+#X connect 24 1 23 0;
+#X connect 24 1 22 0;
+#X connect 24 1 26 0;
+#X connect 24 1 25 0;
+#X connect 25 0 6 0;
+#X connect 26 0 7 0;
+#X connect 27 0 24 0;
+#X connect 28 0 20 0;
+#X connect 29 0 27 0;
diff --git a/doc/examples/example07.pd b/doc/examples/example07.pd
new file mode 100644
index 0000000..0c1ca8c
--- /dev/null
+++ b/doc/examples/example07.pd
@@ -0,0 +1,73 @@
+#N canvas 466 98 659 764 10;
+#X obj 18 649 pdp_xv;
+#X obj 17 58 pdp_noise;
+#X obj 16 14 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 17 325 pdp_add;
+#X obj 17 277 pdp_gain;
+#X obj 87 277 pdp_gain;
+#X floatatom 127 238 5 0 0;
+#X floatatom 174 238 5 0 0;
+#X obj 17 120 pdp_mix;
+#X floatatom 96 92 5 0 0;
+#X obj 16 35 metro 40;
+#X obj 17 87 pdp_grey;
+#X msg 96 70 0.8;
+#X floatatom 76 212 5 0 0;
+#X obj 105 375 pdp_del 1;
+#X msg 163 349 1;
+#X obj 17 440 pdp_add;
+#X obj 105 400 pdp_gain;
+#X floatatom 208 382 5 0 0;
+#X obj 17 243 pdp_blur;
+#X msg 133 69 1;
+#X floatatom 76 560 5 0 0;
+#X obj 17 591 pdp_blur;
+#X obj 18 619 pdp_gain;
+#X floatatom 101 594 5 0 0;
+#X msg 73 535 0.22;
+#X msg 208 358 -0.61;
+#X msg 132 214 4.3;
+#X msg 178 215 -6.69;
+#X msg 76 183 0.32;
+#X msg 130 566 4;
+#X text 287 386 subtract previous frame (time derivative);
+#X text 97 47 some noise to get started;
+#X text 235 216 construct a laplace like operator by blurring the image
+and subtractiong the original from it;
+#X text 371 12 a surface wave patch;
+#X floatatom 67 8 5 0 0;
+#X connect 1 0 11 0;
+#X connect 2 0 10 0;
+#X connect 3 0 16 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 1;
+#X connect 6 0 4 1;
+#X connect 7 0 5 1;
+#X connect 8 0 5 0;
+#X connect 8 0 14 0;
+#X connect 8 0 19 0;
+#X connect 9 0 8 2;
+#X connect 10 0 1 0;
+#X connect 11 0 8 0;
+#X connect 12 0 9 0;
+#X connect 13 0 19 1;
+#X connect 14 0 17 0;
+#X connect 15 0 14 1;
+#X connect 16 0 22 0;
+#X connect 16 0 8 1;
+#X connect 17 0 16 1;
+#X connect 18 0 17 1;
+#X connect 19 0 4 0;
+#X connect 20 0 9 0;
+#X connect 21 0 22 1;
+#X connect 22 0 23 0;
+#X connect 23 0 0 0;
+#X connect 24 0 23 1;
+#X connect 25 0 21 0;
+#X connect 26 0 18 0;
+#X connect 27 0 6 0;
+#X connect 28 0 7 0;
+#X connect 29 0 13 0;
+#X connect 30 0 24 0;
+#X connect 35 0 10 1;
diff --git a/doc/examples/example08.pd b/doc/examples/example08.pd
new file mode 100644
index 0000000..9008ccd
--- /dev/null
+++ b/doc/examples/example08.pd
@@ -0,0 +1,57 @@
+#N canvas 508 53 640 487 10;
+#X obj 17 376 pdp_xv;
+#X obj 17 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 17 32 metro 40;
+#X floatatom 67 8 5 0 0 0 - - -;
+#X obj 17 58 pdp_v4l;
+#X obj 17 279 pdp_zrot;
+#X obj 175 144 unpack 0 0;
+#X obj 280 263 * 360;
+#X obj 281 240 * 3;
+#X msg 140 303 cursor;
+#X obj 140 280 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X floatatom 325 226 5 0 0 0 - - -;
+#X floatatom 325 249 5 0 0 0 - - -;
+#X obj 175 108 route drag;
+#X obj 17 231 pdp_mix;
+#X floatatom 61 205 5 0 0 0 - - -;
+#X obj 17 453 print;
+#X obj 17 422 spigot;
+#X obj 54 397 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 83 396 print the mouse event messages;
+#X floatatom 175 180 5 0 0 0 - - -;
+#X floatatom 240 182 5 0 0 0 - - -;
+#X text 109 41 using the mouse pointer in an xv window to control a
+patch;
+#X text 262 108 drag event coordinates mapped to zoom and rotation
+;
+#X msg 86 178 0.98;
+#X msg 47 177 0;
+#X connect 0 0 13 0;
+#X connect 0 0 17 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 1;
+#X connect 4 0 14 0;
+#X connect 5 0 0 0;
+#X connect 5 0 14 1;
+#X connect 6 0 8 0;
+#X connect 6 0 20 0;
+#X connect 6 1 7 0;
+#X connect 6 1 21 0;
+#X connect 7 0 5 2;
+#X connect 8 0 5 1;
+#X connect 9 0 0 0;
+#X connect 10 0 9 0;
+#X connect 11 0 8 1;
+#X connect 12 0 7 1;
+#X connect 13 0 6 0;
+#X connect 14 0 5 0;
+#X connect 15 0 14 2;
+#X connect 17 0 16 0;
+#X connect 18 0 17 1;
+#X connect 24 0 15 0;
+#X connect 25 0 15 0;
diff --git a/doc/examples/example09.pd b/doc/examples/example09.pd
new file mode 100644
index 0000000..2da1b51
--- /dev/null
+++ b/doc/examples/example09.pd
@@ -0,0 +1,35 @@
+#N canvas 43 348 497 337 10;
+#X obj 88 104 pdp_grey2mask;
+#X obj 88 148 pdp_gain;
+#X obj 88 174 pdp_gain;
+#X obj 88 198 pdp_gain;
+#X msg 6 130 chanmask 1;
+#X msg 6 180 chanmask 4;
+#X msg 6 156 chanmask 2;
+#X obj 6 103 loadbang;
+#X floatatom 208 130 5 0 0;
+#X floatatom 208 156 5 0 0;
+#X floatatom 208 180 5 0 0;
+#X obj 88 234 pdp_xv;
+#X obj 88 40 metro 30;
+#X obj 88 13 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 88 75 pdp_v4l;
+#X text 26 267 a simple colour gradient patch using grey2mask and individual
+channel gains (set with the binary chanmask);
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 11 0;
+#X connect 4 0 1 0;
+#X connect 4 0 6 0;
+#X connect 5 0 3 0;
+#X connect 6 0 2 0;
+#X connect 6 0 5 0;
+#X connect 7 0 4 0;
+#X connect 8 0 1 1;
+#X connect 9 0 2 1;
+#X connect 10 0 3 1;
+#X connect 12 0 14 0;
+#X connect 13 0 12 0;
+#X connect 14 0 0 0;
diff --git a/doc/examples/example10.pd b/doc/examples/example10.pd
new file mode 100644
index 0000000..129209d
--- /dev/null
+++ b/doc/examples/example10.pd
@@ -0,0 +1,55 @@
+#N canvas 147 266 497 337 10;
+#X obj 88 104 pdp_grey2mask;
+#X msg 6 130 chanmask 1;
+#X msg 6 186 chanmask 4;
+#X msg 6 158 chanmask 2;
+#X obj 6 103 loadbang;
+#X floatatom 207 130 5 0 0;
+#X floatatom 253 130 5 0 0;
+#X floatatom 299 130 5 0 0;
+#X obj 88 234 pdp_xv;
+#X obj 88 40 metro 30;
+#X obj 88 13 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 88 75 pdp_v4l;
+#X obj 88 148 pdp_cheby3o;
+#X floatatom 345 130 5 0 0;
+#X floatatom 207 158 5 0 0;
+#X floatatom 253 158 5 0 0;
+#X floatatom 299 158 5 0 0;
+#X obj 88 176 pdp_cheby3o;
+#X floatatom 345 158 5 0 0;
+#X floatatom 207 186 5 0 0;
+#X floatatom 253 186 5 0 0;
+#X floatatom 299 186 5 0 0;
+#X obj 88 204 pdp_cheby3o;
+#X floatatom 345 186 5 0 0;
+#X text 26 267 a more complex colour gradient patch using grey2mask
+and individual channel chebychev colour shapers (set with the binary
+chanmask);
+#X connect 0 0 12 0;
+#X connect 1 0 3 0;
+#X connect 1 0 12 0;
+#X connect 1 0 12 0;
+#X connect 2 0 22 0;
+#X connect 3 0 2 0;
+#X connect 3 0 17 0;
+#X connect 4 0 1 0;
+#X connect 5 0 12 1;
+#X connect 6 0 12 2;
+#X connect 7 0 12 3;
+#X connect 9 0 11 0;
+#X connect 10 0 9 0;
+#X connect 11 0 0 0;
+#X connect 12 0 17 0;
+#X connect 13 0 12 4;
+#X connect 14 0 17 1;
+#X connect 15 0 17 2;
+#X connect 16 0 17 3;
+#X connect 17 0 22 0;
+#X connect 18 0 17 4;
+#X connect 19 0 22 1;
+#X connect 20 0 22 2;
+#X connect 21 0 22 3;
+#X connect 22 0 8 0;
+#X connect 23 0 22 4;
diff --git a/doc/examples/example11.pd b/doc/examples/example11.pd
new file mode 100644
index 0000000..c427e9a
--- /dev/null
+++ b/doc/examples/example11.pd
@@ -0,0 +1,80 @@
+#N canvas 210 529 680 275 10;
+#N canvas 0 0 450 300 graph1 0;
+#X array mapping 64 float 1;
+#A 0 0.0916017 -0.201423 -0.477099 -0.711681 -0.884964 -0.982024 -0.9945
+-0.921318 -0.76878 -0.550026 -0.283897 0.00668462 0.296691 0.561142
+0.777261 0.926433 0.995809 0.979413 0.878658 0.702222 0.465302 0.188305
+-0.104911 -0.389091 -0.639758 -0.835322 -0.958937 -0.999957 -0.954848
+-0.827497 -0.628871 -0.37608 -0.0908956 0.202118 0.477722 0.712179
+0.885295 0.982158 0.994426 0.92104 0.768324 0.54943 0.283212 -0.00739881
+-0.297373 -0.561733 -0.777711 -0.926702 -0.995875 -0.979271 -0.87832
+-0.701718 -0.464675 -0.187609 0.105617 0.389745 0.640304 0.835712 0.959139
+0.999952 0.954637 0.827096 0.628316 0.375418;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 242 21 graph;
+#X msg 50 142 approx mapping;
+#X obj 20 86 pdp_t;
+#X text 235 165 -1 ----------- 0 ----------- 1;
+#X obj 50 115 spigot;
+#X obj 87 92 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 20 225 pdp_cheby 10;
+#X obj 515 138 tabsend~ mapping;
+#X obj 515 112 osc~;
+#X floatatom 515 65 5 0 0;
+#X floatatom 573 64 5 0 0;
+#N canvas 0 0 450 300 fblock 0;
+#X obj 36 36 inlet;
+#X obj 101 35 inlet;
+#X obj 42 196 outlet;
+#X obj 104 83 samplerate~;
+#X obj 59 158 +;
+#X obj 103 144 *;
+#X obj 103 59 t b b f;
+#X text 200 35 fblock: compute block relative frequencies;
+#X text 200 79 right inlet is also "active";
+#X text 201 119 main usage is to compute block synchronous frequencies
+;
+#X text 200 134 for spectral domain processing;
+#X text 201 49 out = left + right * (sys samplerate / blocksize);
+#X obj 101 115 / 64;
+#X connect 0 0 4 0;
+#X connect 1 0 6 0;
+#X connect 3 0 12 0;
+#X connect 4 0 2 0;
+#X connect 5 0 4 1;
+#X connect 6 0 4 0;
+#X connect 6 1 3 0;
+#X connect 6 2 5 1;
+#X connect 12 0 5 0;
+#X restore 515 89 pd fblock;
+#X obj 20 40 metro 40;
+#X obj 20 62 pdp_v4l;
+#X msg 515 37 0.17;
+#X text 236 208 send a signal to a table and use this as an intensity
+mapping function in pdp_cheby;
+#X obj 20 250 pdp_xv;
+#X obj 20 15 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X msg 573 36 3;
+#X msg 133 207 chanmask \$1;
+#X floatatom 133 185 5 0 0;
+#X msg 133 165 1;
+#X connect 1 0 6 0;
+#X connect 2 0 6 0;
+#X connect 2 1 4 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 1;
+#X connect 6 0 16 0;
+#X connect 8 0 7 0;
+#X connect 9 0 11 0;
+#X connect 10 0 11 1;
+#X connect 11 0 8 0;
+#X connect 12 0 13 0;
+#X connect 13 0 2 0;
+#X connect 14 0 9 0;
+#X connect 17 0 12 0;
+#X connect 18 0 10 0;
+#X connect 19 0 6 0;
+#X connect 20 0 19 0;
+#X connect 21 0 20 0;
diff --git a/doc/examples/example12.pd b/doc/examples/example12.pd
new file mode 100644
index 0000000..faa2730
--- /dev/null
+++ b/doc/examples/example12.pd
@@ -0,0 +1,42 @@
+#N canvas 578 52 635 489 10;
+#X obj 83 183 metro 40;
+#X obj 83 154 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 83 361 pdp_xv;
+#X obj 165 299 pdp_loop 50;
+#X obj 218 167 f 0;
+#X obj 218 198 + 1;
+#X obj 218 107 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 247 140 0;
+#X obj 165 361 pdp_xv;
+#X msg 165 259 store \$1;
+#X obj 83 225 pdp_v4l;
+#X msg 29 118 open /dev/video1;
+#X floatatom 218 230 5 0 0;
+#X obj 312 385 pdp_save_png_sequence 50;
+#X obj 312 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 29 96 open /dev/video0;
+#X text 337 349 <- click to save sequence in /tmp dir;
+#X text 247 106 <- click to make a snapshot;
+#X text 288 139 <- click to reset recording to loop;
+#X text 273 229 <- recorded frame;
+#X text 28 27 make loop of snapshots;
+#X connect 0 0 10 0;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 3 0 8 0;
+#X connect 3 0 13 0;
+#X connect 4 0 5 0;
+#X connect 5 0 4 1;
+#X connect 5 0 9 0;
+#X connect 5 0 12 0;
+#X connect 6 0 4 0;
+#X connect 7 0 4 1;
+#X connect 9 0 3 0;
+#X connect 10 0 2 0;
+#X connect 10 0 3 0;
+#X connect 11 0 10 0;
+#X connect 14 0 13 0;
+#X connect 15 0 11 0;
diff --git a/doc/examples/example13.pd b/doc/examples/example13.pd
new file mode 100644
index 0000000..369c895
--- /dev/null
+++ b/doc/examples/example13.pd
@@ -0,0 +1,104 @@
+#N canvas 419 114 799 646 10;
+#X obj 450 429 pdp_xv;
+#X obj 545 76 pdp_control;
+#X msg 545 48 thread \$1;
+#X obj 545 24 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 134 40 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 471 397 size 640 480;
+#X obj 239 393 +;
+#X obj 190 432 vsl 15 128 1 0 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 190 393 -;
+#X obj 59 386 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 59 401 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 59 416 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 205 432 vsl 15 128 1 0 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 220 432 vsl 15 128 1 0 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 190 366 unpack f f;
+#X obj 62 317 unpack f f;
+#X obj 68 360 +;
+#X obj 45 360 -;
+#X obj 151 264 pack f f;
+#X obj 215 265 pack f f;
+#X msg 295 77 dim 320 240;
+#X obj 134 72 metro 40;
+#X msg 294 54 dim 640 480;
+#X obj 134 100 pdp_v4l;
+#X obj 450 366 pdp_zoom;
+#X floatatom 450 308 5 0 0;
+#X msg 553 311 centerx \$1;
+#X floatatom 553 289 5 0 0;
+#X floatatom 636 292 5 0 0;
+#X msg 635 310 centery \$1;
+#X obj 511 197 unpack f f f f;
+#X obj 450 287 min;
+#X obj 446 252 expr .5/($f1+.02);
+#X obj 572 252 expr .5/($f1+.02);
+#X msg 450 339 zoomx \$1 \, zoomy \$1;
+#X msg 295 8 open /dev/video0;
+#X msg 295 30 open /dev/video1;
+#X obj 309 244 pack f f f f;
+#X obj 134 156 pdp_diff;
+#X text 208 156 <- compute difference between current and previous
+frame;
+#X obj 134 226 pdp_cog_abs_thresh 0.15;
+#X text 331 492 using the blob tracker on a difference signal to detect
+motion;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 21 0;
+#X connect 5 0 0 0;
+#X connect 6 0 13 0;
+#X connect 8 0 7 0;
+#X connect 14 0 12 0;
+#X connect 14 0 8 0;
+#X connect 14 0 6 0;
+#X connect 14 1 8 1;
+#X connect 14 1 6 1;
+#X connect 15 0 17 0;
+#X connect 15 0 16 0;
+#X connect 15 0 10 0;
+#X connect 15 1 16 1;
+#X connect 15 1 17 1;
+#X connect 16 0 11 0;
+#X connect 17 0 9 0;
+#X connect 18 0 15 0;
+#X connect 19 0 14 0;
+#X connect 20 0 23 0;
+#X connect 21 0 23 0;
+#X connect 22 0 23 0;
+#X connect 23 0 38 0;
+#X connect 24 0 0 0;
+#X connect 25 0 34 0;
+#X connect 26 0 24 0;
+#X connect 27 0 26 0;
+#X connect 28 0 29 0;
+#X connect 29 0 24 0;
+#X connect 30 0 27 0;
+#X connect 30 1 32 0;
+#X connect 30 2 28 0;
+#X connect 30 3 33 0;
+#X connect 31 0 25 0;
+#X connect 32 0 31 0;
+#X connect 33 0 31 1;
+#X connect 34 0 24 0;
+#X connect 35 0 23 0;
+#X connect 36 0 23 0;
+#X connect 37 0 30 0;
+#X connect 38 0 24 0;
+#X connect 38 0 40 0;
+#X connect 40 1 18 0;
+#X connect 40 1 37 0;
+#X connect 40 2 19 0;
+#X connect 40 2 37 2;
+#X connect 40 3 18 1;
+#X connect 40 3 37 1;
+#X connect 40 4 19 1;
+#X connect 40 4 37 3;
diff --git a/doc/examples/example14.pd b/doc/examples/example14.pd
new file mode 100644
index 0000000..f29e1b2
--- /dev/null
+++ b/doc/examples/example14.pd
@@ -0,0 +1,54 @@
+#N canvas 621 348 611 467 10;
+#X obj 168 329 pdp_xv;
+#X obj 168 78 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 168 142 pdp_v4l;
+#X obj 168 108 metro 40;
+#X msg 265 83 open /dev/video1;
+#X floatatom 311 151 5 0 0;
+#X obj 168 194 pdp_agc 0.5;
+#X floatatom 310 211 5 0 0;
+#X obj 168 245 pdp_contrast 0.5;
+#X msg 4 157 chanmask \$1;
+#X floatatom 4 133 5 0 0;
+#X msg 4 104 1;
+#X msg 35 104 3;
+#X msg 67 104 5;
+#X msg 99 104 7;
+#X obj 314 192 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 12300 1;
+#X obj 314 132 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 7900 1;
+#X msg 265 58 open /dev/video0;
+#X floatatom 310 272 5 0 0;
+#X obj 314 253 hsl 128 15 0 3 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 168 298 pdp_saturation 0.5;
+#X text 7 79 Y;
+#X text 36 78 YCr;
+#X text 68 79 YCb;
+#X text 98 78 YCrCb;
+#X text 25 15 some basic image enhancements;
+#X text 13 60 agc color channels;
+#X obj 183 166 pdp_flip_lr;
+#X connect 1 0 3 0;
+#X connect 2 0 27 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 6 1;
+#X connect 6 0 8 0;
+#X connect 7 0 8 1;
+#X connect 8 0 20 0;
+#X connect 9 0 6 0;
+#X connect 10 0 9 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 13 0 10 0;
+#X connect 14 0 10 0;
+#X connect 15 0 7 0;
+#X connect 16 0 5 0;
+#X connect 17 0 2 0;
+#X connect 18 0 20 1;
+#X connect 19 0 18 0;
+#X connect 20 0 0 0;
+#X connect 27 0 6 0;
diff --git a/doc/examples/example15.pd b/doc/examples/example15.pd
new file mode 100644
index 0000000..5301fc0
--- /dev/null
+++ b/doc/examples/example15.pd
@@ -0,0 +1,27 @@
+#N canvas 632 359 559 496 10;
+#X obj 127 57 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 127 81 metro 40;
+#X obj 148 57 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 126 110 pdp_v4l;
+#X msg 229 56 open /dev/video0;
+#X msg 228 80 open /dev/video1;
+#X obj 126 151 pdp_motion_fade 1;
+#X obj 126 174 pdp_contrast 0.16;
+#X obj 126 199 pdp_mul;
+#X obj 126 224 pdp_gain 22;
+#X text 7 2 using motion_fade \, contrast \, mul and gain to get a
+motion triggered effect;
+#X obj 126 258 pdp_xv;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
diff --git a/doc/introduction/control.pd b/doc/introduction/control.pd
new file mode 100644
index 0000000..3898e1e
--- /dev/null
+++ b/doc/introduction/control.pd
@@ -0,0 +1,17 @@
+#N canvas 372 355 668 154 10;
+#X obj 33 107 pdp_xv;
+#X obj 33 57 pdp_v4l;
+#X msg 33 12 bang;
+#X obj 33 81 pdp_trigger;
+#X obj 33 35 metro 1000;
+#X obj 105 108 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 140 20 pdp_trigger sends out a bang message on the right outlet
+before it passes the incoming pdp message on the left outlet.;
+#X msg 73 12 stop;
+#X connect 1 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 0 0;
+#X connect 3 1 5 0;
+#X connect 4 0 1 0;
+#X connect 7 0 4 0;
diff --git a/doc/introduction/input_output.pd b/doc/introduction/input_output.pd
new file mode 100644
index 0000000..07aa793
--- /dev/null
+++ b/doc/introduction/input_output.pd
@@ -0,0 +1,82 @@
+#N canvas 250 34 894 848 10;
+#X obj 107 427 pdp_v4l;
+#X obj 107 53 metro 40;
+#X msg 159 14 stop;
+#X msg 107 14 bang;
+#X msg 51 14 bang;
+#X obj 107 695 pdp_xv;
+#X msg 209 93 open /dev/video0;
+#X msg 209 117 open /dev/video1;
+#X text 347 95 you can choose the input device using the 'open' message.
+the default is /dev/video0;
+#X msg 209 142 close;
+#X text 348 143 closes the video port;
+#X msg 209 168 type yv12;
+#X msg 209 192 type grey;
+#X text 348 171 type sets the ouput image package type. currently only
+yv12 (luma/chroma color) and greyscale are supported.;
+#X msg 210 221 dim 320 240;
+#X msg 210 244 dim 640 480;
+#X text 348 215 dim sets the dimensions of the captured frame. please
+note that in all objects dimensions and packet type (color/greyscale)
+have to be the same to be combined (i.e. mixed);
+#X msg 210 556 dim 320 240;
+#X msg 210 579 dim 640 480;
+#X text 349 559 dim sets the window dimensions;
+#X msg 210 510 create;
+#X msg 210 531 destroy;
+#X text 208 447 pdp_xv ouputs video in a window using the xVideo extension.
+if your graphics card/driver supports it you can have multiple output
+windows. if a pdp message is received and a window is not open \, one
+is created automaticly.;
+#X text 349 513 use these messages to explicitly create/destroy the
+window;
+#X text 207 18 pdp_v4l grabs video from the video4linux device. it
+grabs a frame whenever a bang message is received. the output rate
+is limited by the maximum framerate of the video device. if there is
+no device opened \, it will attempt to open /dev/video0;
+#X msg 212 627 cursor \$1;
+#X obj 212 607 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 348 627 enables/disables cursor in xv window;
+#X msg 210 319 channel \$1;
+#X floatatom 210 295 5 0 0 0 - - -;
+#X text 347 320 sets the v4l channel (like tuner \, composite \, svideo
+\, ...);
+#X floatatom 210 359 5 0 0 0 - - -;
+#X msg 210 383 freq \$1;
+#X floatatom 271 359 5 0 0 0 - - -;
+#X msg 271 383 freqMHz \$1;
+#X text 346 359 sets the v4l tuner frequency (in v4l units and MHz)
+;
+#X text 347 655 specify the x window display;
+#X msg 212 653 display :0;
+#X obj 107 748 print;
+#X text 211 745 the output channel sends mouse event messages (press/release/drag
+and individual p/r/d for each button);
+#X connect 0 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 5 0 38 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 9 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 17 0 5 0;
+#X connect 18 0 5 0;
+#X connect 20 0 5 0;
+#X connect 21 0 5 0;
+#X connect 25 0 5 0;
+#X connect 26 0 25 0;
+#X connect 28 0 0 0;
+#X connect 29 0 28 0;
+#X connect 31 0 32 0;
+#X connect 32 0 0 0;
+#X connect 33 0 34 0;
+#X connect 34 0 0 0;
+#X connect 37 0 5 0;
diff --git a/doc/introduction/quicktime.pd b/doc/introduction/quicktime.pd
new file mode 100644
index 0000000..2f32cfd
--- /dev/null
+++ b/doc/introduction/quicktime.pd
@@ -0,0 +1,101 @@
+#N canvas 400 126 715 814 10;
+#X obj 59 391 pdp_qt;
+#X obj 59 462 pdp_xv;
+#X floatatom 77 429 5 0 0;
+#X floatatom 127 430 5 0 0;
+#X obj 56 41 metro 40;
+#X msg 56 13 bang;
+#X msg 97 13 stop;
+#X msg 15 13 bang;
+#X obj 140 41 openpanel;
+#X msg 140 66 open \$1;
+#X msg 140 13 bang;
+#X msg 140 92 close;
+#X text 249 66 open/close for file access;
+#X floatatom 140 120 5 0 0;
+#X floatatom 140 146 5 0 0;
+#X text 248 117 float on left inlet selects a frame for output;
+#X msg 140 197 loop \$1;
+#X obj 203 182 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 250 198 automatic looping can be enabled/disabled;
+#X text 251 9 pdp_qt plays a quicktime movie.;
+#X text 250 221 this enables automatic playback at the frame rate specified
+in the movie file. in pdp_qt~ playback is synchronized to the audio
+stream.;
+#X obj 335 535 table array;
+#X msg 142 341 dump array 0;
+#X text 252 330 if the movie contains audio \, this command dumps the
+audio data into an array specified by the first argument. the second
+argument is the audio channel (default = 0 = left);
+#X msg 142 291 stop;
+#X text 251 289 stops automatic playback (same as autoplay 0);
+#X msg 141 222 autoplay 1;
+#X msg 142 267 play;
+#X text 252 432 the second outlet outputs the current frame number.
+the third outlet outputs the total number of frames in a movie when
+it is opened.;
+#X obj 56 786 pdp_xv;
+#X obj 56 715 pdp_qt~;
+#X obj 84 757 dac~;
+#X msg 33 644 play;
+#X obj 127 635 openpanel;
+#X msg 127 660 open \$1;
+#X msg 127 607 bang;
+#X msg 9 760 close;
+#X text 251 660 pdp_qt~ is the same as pdp_qt exept that it also outputs
+the audio data corresponding to the current frame on its 2 rightmost
+outlets. if there is a lag between audio and video a pdp_del object
+can be inserted to delay the image. note that in order to get acceptable
+audio quality with relatively few dropouts you might need to increase
+the pd audio latency.;
+#X msg 7 429 close;
+#X msg 142 315 cont;
+#X text 251 269 starts automatic playback (same as 0 \, autplay 1 \,
+bang);
+#X text 251 310 resumes automatic playback (same as autplay 1 \, bang)
+;
+#X msg 9 617 loop 1;
+#X floatatom 78 645 5 0 0;
+#X obj 448 535 tabplay~ array;
+#X obj 448 576 dac~;
+#X obj 448 506 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 126 685 dump array 0;
+#X text 249 137 float on right inlet selects the frame to be read on
+the next sync event (bang message / internal sync).;
+#X connect 0 0 1 0;
+#X connect 0 1 2 0;
+#X connect 0 2 3 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X connect 7 0 0 0;
+#X connect 8 0 9 0;
+#X connect 9 0 0 0;
+#X connect 10 0 8 0;
+#X connect 11 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 0 1;
+#X connect 16 0 0 0;
+#X connect 17 0 16 0;
+#X connect 22 0 0 0;
+#X connect 24 0 0 0;
+#X connect 26 0 0 0;
+#X connect 27 0 0 0;
+#X connect 30 0 29 0;
+#X connect 30 3 31 0;
+#X connect 30 4 31 1;
+#X connect 32 0 30 0;
+#X connect 33 0 34 0;
+#X connect 34 0 30 0;
+#X connect 35 0 33 0;
+#X connect 36 0 29 0;
+#X connect 38 0 1 0;
+#X connect 39 0 0 0;
+#X connect 42 0 30 0;
+#X connect 43 0 30 1;
+#X connect 44 0 45 0;
+#X connect 44 0 45 1;
+#X connect 46 0 44 0;
+#X connect 47 0 30 0;
diff --git a/doc/introduction/traffic.pd b/doc/introduction/traffic.pd
new file mode 100644
index 0000000..40f102d
--- /dev/null
+++ b/doc/introduction/traffic.pd
@@ -0,0 +1,101 @@
+#N canvas 155 92 978 574 10;
+#X msg 362 2 stop;
+#X obj 362 27 metro 40;
+#X obj 362 53 pdp_v4l;
+#X obj 32 524 pdp_xv;
+#X obj 847 336 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 847 388 pdp_control;
+#X msg 847 361 thread \$1;
+#X obj 434 56 hdl 15 1 1 4 empty empty empty 0 -6 0 8 -262144 -1 -1
+2;
+#X obj 432 278 pdp_del 25;
+#X obj 410 332 pdp_mix;
+#X obj 457 305 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 6500 1;
+#X floatatom 497 249 5 0 0;
+#X text 457 83 packet router. second inlet sets destination outlet.
+creation argument sets number of outlets.;
+#X obj 240 333 pdp_snap;
+#X obj 240 302 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 249 357 packet snapshot;
+#X msg 262 301 snap;
+#X obj 410 456 pdp_trigger;
+#X text 508 463 before it passes the packet;
+#X text 507 450 trigger sends a bang on right outlet;
+#X obj 482 487 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 248 389 bang sends out packet;
+#X obj 434 146 send packet;
+#X text 524 138 pdp packets can be sent over send/receive pairs;
+#X text 523 152 (not over netsend/netreceive pairs!);
+#X obj 451 382 pdp_pps;
+#X floatatom 451 412 5 0 0;
+#X text 513 381 packet rate calculator;
+#X obj 32 21 receive packet;
+#X obj 203 254 pdp_reg;
+#X text 68 222 a packet register;
+#X text 58 235 (like int and float);
+#X obj 32 81 pdp_mix;
+#X obj 79 51 hsl 128 15 0 1 0 1 empty empty empty -2 -6 0 8 -262144
+-1 -1 10500 1;
+#X obj 32 136 pdp_conv;
+#X obj 203 227 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 115 70 feedback;
+#X obj 362 87 pdp_route 4;
+#X text 107 82 is allowed;
+#X obj 335 3 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 754 292 enable or disable processing;
+#X text 754 307 in separate thread;
+#X text 471 342 second inlet 0->1;
+#X text 472 328 mix (crossfade) 2 packets.;
+#X floatatom 83 111 5 0 0;
+#X text 58 253 left: hot packet;
+#X text 58 267 right: cold packet;
+#X floatatom 847 449 5 0 0;
+#X obj 847 420 route pdp_drop;
+#X text 801 473 dropped packet counter;
+#X text 43 159 convolution: default is blur;
+#X text 135 110 number of passes;
+#X text 248 373 snap takes snapshot;
+#X text 134 118 comment;
+#X text 431 185 packet delay line. second inlet sets delay. creation
+argument sets total delay line length. WARNING: this uses a lot of
+memory. keep the size small to prevent the system to start swapping
+to disk.;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 37 0;
+#X connect 4 0 6 0;
+#X connect 5 0 48 0;
+#X connect 6 0 5 0;
+#X connect 7 0 37 1;
+#X connect 8 0 9 1;
+#X connect 9 0 17 0;
+#X connect 9 0 25 0;
+#X connect 10 0 9 2;
+#X connect 11 0 8 1;
+#X connect 13 0 3 0;
+#X connect 14 0 13 0;
+#X connect 16 0 13 0;
+#X connect 17 0 3 0;
+#X connect 17 1 20 0;
+#X connect 25 0 26 0;
+#X connect 28 0 32 0;
+#X connect 29 0 3 0;
+#X connect 32 0 34 0;
+#X connect 33 0 32 2;
+#X connect 34 0 32 1;
+#X connect 34 0 3 0;
+#X connect 35 0 29 0;
+#X connect 37 0 29 1;
+#X connect 37 1 13 1;
+#X connect 37 2 8 0;
+#X connect 37 2 9 0;
+#X connect 37 3 22 0;
+#X connect 39 0 1 0;
+#X connect 44 0 34 1;
+#X connect 48 0 47 0;
diff --git a/doc/objects/README b/doc/objects/README
new file mode 100644
index 0000000..94f8bb5
--- /dev/null
+++ b/doc/objects/README
@@ -0,0 +1,4 @@
+This directory contains help patches for the individual pdp modules and abstractions.
+Use the pdp_help_input.pd and pdp_help_output.pd patches to setup your desired in/out for
+the help patches.
+
diff --git a/doc/objects/pdp_abs.pd b/doc/objects/pdp_abs.pd
new file mode 100644
index 0000000..eef5a94
--- /dev/null
+++ b/doc/objects/pdp_abs.pd
@@ -0,0 +1,21 @@
+#N canvas 504 211 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 340 pdp_help_output;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0;
+#X msg 128 109 0.5;
+#X obj 77 296 pdp_gain;
+#X msg 128 268 1;
+#X text 229 235 absolute value;
+#X obj 77 231 pdp_abs;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 10 0;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 1;
+#X connect 10 0 7 0;
diff --git a/doc/objects/pdp_add.pd b/doc/objects/pdp_add.pd
new file mode 100644
index 0000000..fa5cd1f
--- /dev/null
+++ b/doc/objects/pdp_add.pd
@@ -0,0 +1,34 @@
+#N canvas 180 63 511 383 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 322 pdp_help_output;
+#X obj 77 279 pdp_add;
+#X obj 121 246 pdp_reg;
+#X obj 196 183 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 229 181 click here;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0 0 - - -;
+#X msg 128 109 0.5;
+#X text 229 283 adds (and saturates) 2 packets;
+#X msg 230 246 chanmask \$1;
+#X floatatom 230 221 5 0 0 0 - - -;
+#X msg 374 131 thread \$1;
+#X obj 373 107 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 377 164 pdp_control;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 8 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 8 0 4 0;
+#X connect 8 0 5 1;
+#X connect 9 0 8 1;
+#X connect 10 0 9 0;
+#X connect 12 0 4 0;
+#X connect 13 0 12 0;
+#X connect 14 0 16 0;
+#X connect 15 0 14 0;
diff --git a/doc/objects/pdp_and.pd b/doc/objects/pdp_and.pd
new file mode 100644
index 0000000..e352b16
--- /dev/null
+++ b/doc/objects/pdp_and.pd
@@ -0,0 +1,24 @@
+#N canvas 552 356 511 383 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 322 pdp_help_output;
+#X obj 121 246 pdp_reg;
+#X obj 196 183 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 229 181 click here;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0;
+#X msg 128 109 0.5;
+#X obj 77 279 pdp_and;
+#X text 229 283 bitwise and;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 0;
+#X connect 4 0 10 1;
+#X connect 5 0 4 0;
+#X connect 7 0 10 0;
+#X connect 7 0 4 1;
+#X connect 8 0 7 1;
+#X connect 9 0 8 0;
+#X connect 10 0 3 0;
diff --git a/doc/objects/pdp_bitdepth.pd b/doc/objects/pdp_bitdepth.pd
new file mode 100644
index 0000000..4c5ae11
--- /dev/null
+++ b/doc/objects/pdp_bitdepth.pd
@@ -0,0 +1,32 @@
+#N canvas 504 211 500 438 10;
+#X msg 140 61 start;
+#X msg 187 61 stop;
+#X obj 140 93 pdp_help_input;
+#X obj 140 352 pdp_help_output;
+#X obj 140 308 pdp_gain;
+#X msg 191 280 1;
+#X floatatom 219 209 8 0 0;
+#X obj 222 185 hsl 128 15 0 8 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 2500 1;
+#X floatatom 238 278 5 0 0;
+#X obj 140 243 pdp_bitdepth;
+#X text 292 247 set bit depth (0->16);
+#X obj 140 158 pdp_gain;
+#X msg 191 130 1;
+#X floatatom 227 130 5 0 0;
+#X msg 32 192 chanmask \$1;
+#X floatatom 32 164 5 0 0;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 11 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 1;
+#X connect 6 0 9 1;
+#X connect 7 0 6 0;
+#X connect 8 0 4 1;
+#X connect 9 0 4 0;
+#X connect 11 0 9 0;
+#X connect 12 0 11 1;
+#X connect 13 0 11 1;
+#X connect 14 0 9 0;
+#X connect 15 0 14 0;
diff --git a/doc/objects/pdp_bitmask.pd b/doc/objects/pdp_bitmask.pd
new file mode 100644
index 0000000..c92ab9e
--- /dev/null
+++ b/doc/objects/pdp_bitmask.pd
@@ -0,0 +1,22 @@
+#N canvas 504 211 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 287 pdp_help_output;
+#X obj 77 243 pdp_gain;
+#X msg 128 215 1;
+#X text 229 182 apply a bitwise mask (16 bit);
+#X floatatom 149 144 8 0 0;
+#X obj 152 120 hsl 128 15 0 65535 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X floatatom 175 213 5 0 0;
+#X obj 77 178 pdp_bitmask;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 10 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 1;
+#X connect 7 0 10 1;
+#X connect 8 0 7 0;
+#X connect 9 0 4 1;
+#X connect 10 0 4 0;
diff --git a/doc/objects/pdp_bq.pd b/doc/objects/pdp_bq.pd
new file mode 100644
index 0000000..3078c45
--- /dev/null
+++ b/doc/objects/pdp_bq.pd
@@ -0,0 +1,154 @@
+#N canvas 364 134 765 779 10;
+#X floatatom 100 598 5 0 0;
+#X msg 28 361 ver \$1;
+#X msg 28 393 hor \$1;
+#X obj 96 362 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 95 389 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 28 629 pdp_bq;
+#X floatatom 89 495 5 0 0;
+#X msg 28 495 onep \$1;
+#X floatatom 89 526 5 0 0;
+#X msg 28 530 twop \$1;
+#X obj 85 272 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 87 304 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 79 209 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 82 244 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 28 209 lr \$1;
+#X msg 28 244 rl \$1;
+#X msg 28 277 tb \$1;
+#X msg 28 305 bt \$1;
+#X obj 454 406 t b f;
+#X floatatom 489 369 5 0 0;
+#X floatatom 488 317 5 0 0;
+#X obj 454 436 pack s 0 0;
+#X msg 454 469 \$1 \$2 \$3;
+#X obj 489 405 t b f;
+#X msg 410 370 lpf;
+#X msg 409 344 hpf;
+#X msg 409 398 apf;
+#X msg 409 425 bsf;
+#X obj 461 38 pdp_help_input;
+#X msg 461 13 start;
+#X msg 507 13 stop;
+#X obj 28 746 pdp_help_output;
+#X text 159 598 right inlet sets number of passes;
+#X text 37 16 pdp_bq: a spatial biquad filter;
+#X obj 495 196 pdp_blur;
+#X obj 598 194 pdp_phase;
+#X obj 461 93 pdp_route 3;
+#X obj 533 65 hdl 15 1 0 3 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X obj 41 670 r \$0-out;
+#X obj 495 246 s \$0-out;
+#X floatatom 544 119 5 0 0;
+#X floatatom 617 117 5 0 0;
+#X text 312 358 high pass;
+#X text 313 382 low pass;
+#X text 314 410 all pass;
+#X text 313 439 band stop;
+#X text 541 367 pole Q;
+#X text 94 31 it is a bit awkward to use directly;
+#X text 94 45 try one of the abstractions (pdp_blur and;
+#X text 95 61 pdp_phase);
+#X text 122 208 left->right;
+#X text 124 242 right->left;
+#X text 126 272 top->bottom;
+#X text 126 300 bottom->top;
+#X text 133 359 bt and tb;
+#X text 132 383 lr and rl;
+#X text 147 494 one pole filter;
+#X text 146 524 double one pole filter;
+#X msg 89 464 0.1;
+#X msg 556 95 0.5;
+#X msg 616 94 0.5;
+#X text 588 62 choose example here;
+#X msg 672 118 1;
+#X msg 673 140 0;
+#X msg 673 163 -1;
+#X msg 712 116 1;
+#X msg 713 138 0;
+#X msg 713 161 -1;
+#X text 93 91 "unstable" behaviour is possible;
+#X msg 490 347 0.1;
+#X msg 488 293 0.3;
+#X obj 28 720 pdp_gain;
+#X floatatom 112 693 5 0 0;
+#X msg 112 671 1;
+#X text 95 107 when frequency and Q are outside their;
+#X text 96 122 sensible ranges;
+#X text 122 180 set filter direction:;
+#X text 264 342 set the filter type:;
+#X text 137 476 set the filter type:;
+#X text 538 319 (between 0 and 1 \, 0.5 = nyquist);
+#X text 540 333 comment;
+#X text 540 305 pole frequency;
+#X msg 100 572 1;
+#X msg 457 611 chanmask \$1;
+#X floatatom 457 585 5 0 0;
+#X text 456 633 binary channel mask;
+#X connect 0 0 5 1;
+#X connect 1 0 5 0;
+#X connect 2 0 5 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 71 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 0;
+#X connect 9 0 5 0;
+#X connect 10 0 16 0;
+#X connect 11 0 17 0;
+#X connect 12 0 14 0;
+#X connect 13 0 15 0;
+#X connect 14 0 5 0;
+#X connect 15 0 5 0;
+#X connect 16 0 5 0;
+#X connect 17 0 5 0;
+#X connect 18 0 21 0;
+#X connect 18 1 21 1;
+#X connect 19 0 23 0;
+#X connect 20 0 18 0;
+#X connect 21 0 22 0;
+#X connect 22 0 5 0;
+#X connect 23 0 21 0;
+#X connect 23 1 21 2;
+#X connect 24 0 21 0;
+#X connect 25 0 21 0;
+#X connect 26 0 21 0;
+#X connect 27 0 21 0;
+#X connect 28 0 36 0;
+#X connect 29 0 28 0;
+#X connect 30 0 28 0;
+#X connect 34 0 39 0;
+#X connect 35 0 39 0;
+#X connect 36 0 5 0;
+#X connect 36 1 34 0;
+#X connect 36 2 35 0;
+#X connect 37 0 36 1;
+#X connect 38 0 71 0;
+#X connect 40 0 34 1;
+#X connect 41 0 35 1;
+#X connect 58 0 6 0;
+#X connect 59 0 40 0;
+#X connect 60 0 41 0;
+#X connect 62 0 35 2;
+#X connect 63 0 35 2;
+#X connect 64 0 35 2;
+#X connect 65 0 35 3;
+#X connect 66 0 35 3;
+#X connect 67 0 35 3;
+#X connect 69 0 19 0;
+#X connect 70 0 20 0;
+#X connect 71 0 31 0;
+#X connect 72 0 71 1;
+#X connect 73 0 72 0;
+#X connect 82 0 0 0;
+#X connect 83 0 5 0;
+#X connect 84 0 83 0;
diff --git a/doc/objects/pdp_bqt.pd b/doc/objects/pdp_bqt.pd
new file mode 100644
index 0000000..5076168
--- /dev/null
+++ b/doc/objects/pdp_bqt.pd
@@ -0,0 +1,98 @@
+#N canvas 384 88 785 659 10;
+#X floatatom 88 211 5 0 0;
+#X msg 27 211 onep \$1;
+#X floatatom 88 242 5 0 0;
+#X msg 27 246 twop \$1;
+#X obj 454 406 t b f;
+#X floatatom 489 369 5 0 0;
+#X floatatom 488 317 5 0 0;
+#X obj 454 436 pack s 0 0;
+#X msg 454 469 \$1 \$2 \$3;
+#X obj 489 405 t b f;
+#X msg 410 370 lpf;
+#X msg 409 344 hpf;
+#X msg 409 398 apf;
+#X msg 409 425 bsf;
+#X obj 461 38 pdp_help_input;
+#X msg 461 13 start;
+#X msg 507 13 stop;
+#X obj 27 616 pdp_help_output;
+#X obj 461 93 pdp_route 3;
+#X obj 533 65 hdl 15 1 0 3 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X obj 40 540 r \$0-out;
+#X obj 558 231 s \$0-out;
+#X floatatom 490 157 5 0 0;
+#X floatatom 601 156 5 0 0;
+#X text 312 358 high pass;
+#X text 313 382 low pass;
+#X text 314 410 all pass;
+#X text 313 439 band stop;
+#X text 541 367 pole Q;
+#X text 99 31 it is a bit awkward to use directly;
+#X text 146 210 one pole filter;
+#X text 145 240 double one pole filter;
+#X msg 88 180 0.1;
+#X msg 502 133 0.5;
+#X msg 600 133 0.5;
+#X text 588 62 choose example here;
+#X text 93 91 "unstable" behaviour is possible;
+#X msg 490 347 0.1;
+#X msg 488 293 0.3;
+#X obj 27 590 pdp_gain;
+#X floatatom 118 564 5 0 0;
+#X msg 118 542 1;
+#X text 95 107 when frequency and Q are outside their;
+#X text 96 122 sensible ranges;
+#X text 264 342 set the filter type:;
+#X text 136 192 set the filter type:;
+#X text 538 319 (between 0 and 1 \, 0.5 = nyquist);
+#X text 540 333 comment;
+#X text 540 305 pole frequency;
+#X text 37 16 pdp_bqt: a temporal biquad filter;
+#X text 99 45 try one of the abstractions (pdp_motion_blur and;
+#X text 100 61 pdp_motion_phase);
+#X obj 434 190 pdp_motion_blur;
+#X obj 558 190 pdp_motion_phase;
+#X obj 27 499 pdp_bqt;
+#X msg 48 312 reset;
+#X text 95 313 reset state;
+#X connect 0 0 1 0;
+#X connect 1 0 54 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 0;
+#X connect 3 0 54 0;
+#X connect 4 0 7 0;
+#X connect 4 1 7 1;
+#X connect 5 0 9 0;
+#X connect 6 0 4 0;
+#X connect 7 0 8 0;
+#X connect 8 0 54 0;
+#X connect 9 0 7 0;
+#X connect 9 1 7 2;
+#X connect 10 0 7 0;
+#X connect 11 0 7 0;
+#X connect 12 0 7 0;
+#X connect 13 0 7 0;
+#X connect 14 0 18 0;
+#X connect 15 0 14 0;
+#X connect 16 0 14 0;
+#X connect 18 0 54 0;
+#X connect 18 1 52 0;
+#X connect 18 2 53 0;
+#X connect 19 0 18 1;
+#X connect 20 0 39 0;
+#X connect 22 0 52 1;
+#X connect 23 0 53 1;
+#X connect 32 0 0 0;
+#X connect 33 0 22 0;
+#X connect 34 0 23 0;
+#X connect 37 0 5 0;
+#X connect 38 0 6 0;
+#X connect 39 0 17 0;
+#X connect 40 0 39 1;
+#X connect 41 0 40 0;
+#X connect 52 0 21 0;
+#X connect 53 0 21 0;
+#X connect 54 0 39 0;
+#X connect 55 0 54 0;
diff --git a/doc/objects/pdp_cheby.pd b/doc/objects/pdp_cheby.pd
new file mode 100644
index 0000000..68e24a4
--- /dev/null
+++ b/doc/objects/pdp_cheby.pd
@@ -0,0 +1,66 @@
+#N canvas 117 219 672 516 10;
+#X msg 67 108 coef 0 \$1;
+#X floatatom 67 84 5 0 0;
+#X floatatom 137 84 5 0 0;
+#X msg 137 108 coef 1 \$1;
+#X floatatom 206 83 5 0 0;
+#X msg 206 108 coef 2 \$1;
+#X floatatom 275 84 5 0 0;
+#X msg 275 108 coef 3 \$1;
+#X floatatom 243 359 5 0 0;
+#X text 122 394 creation arg: order (nb coefs = order + 1);
+#X text 123 410 (default = minimal order = 2);
+#X msg 243 309 reset;
+#X obj 21 46 pdp_help_input;
+#X msg 21 16 start;
+#X msg 70 16 stop;
+#X obj 21 445 pdp_help_output;
+#X text 296 359 right inlet: number of iterations;
+#X text 295 308 set all coefs to 0;
+#X msg 243 338 1;
+#X msg 243 267 chanmask \$1;
+#X floatatom 243 244 5 0 0;
+#X text 157 63 set individual coefficients;
+#N canvas 0 0 450 300 graph1 0;
+#X array mapping 64 float 1;
+#A 0 -0.908307 -0.86545 -0.794021 -0.76545 -0.694021 -0.622593 -0.451164
+-0.0511646 0.234549 0.377406 0.427406 0.477406 0.520263 0.534549 0.548835
+0.534549 0.505978 0.477406 0.448835 0.420264 0.348835 0.298835 0.148835
+0.0845496 -0.0511645 -0.151164 -0.236879 -0.322593 -0.436878 -0.436878
+-0.436878 -0.436878 -0.422593 -0.394021 -0.36545 -0.308307 -0.26545
+-0.136879 0.120264 0.291692 0.434549 0.534549 0.591692 0.648835 0.677406
+0.677406 0.663121 0.648835 0.648835 0.634549 0.605978 0.605978 0.605978
+0.605978 0.605978 0.605978 0.634549 0.648835 0.677406 0.705978 0.76312
+0.848835 0.934549 0.977406;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 427 20 graph;
+#X msg 242 217 approx mapping;
+#X obj 21 158 pdp_t;
+#X text 418 165 -1 ----------- 0 ----------- 1;
+#X obj 242 190 spigot;
+#X obj 279 167 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 361 216 approximate a mapping function;
+#X obj 21 403 pdp_cheby 10;
+#X connect 0 0 29 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 29 0;
+#X connect 4 0 5 0;
+#X connect 5 0 29 0;
+#X connect 6 0 7 0;
+#X connect 7 0 29 0;
+#X connect 8 0 29 1;
+#X connect 11 0 29 0;
+#X connect 12 0 24 0;
+#X connect 13 0 12 0;
+#X connect 14 0 12 0;
+#X connect 18 0 8 0;
+#X connect 19 0 29 0;
+#X connect 20 0 19 0;
+#X connect 23 0 29 0;
+#X connect 24 0 29 0;
+#X connect 24 1 26 0;
+#X connect 26 0 23 0;
+#X connect 27 0 26 1;
+#X connect 29 0 15 0;
diff --git a/doc/objects/pdp_chrot.pd b/doc/objects/pdp_chrot.pd
new file mode 100644
index 0000000..fb59ed5
--- /dev/null
+++ b/doc/objects/pdp_chrot.pd
@@ -0,0 +1,13 @@
+#N canvas 355 66 554 208 10;
+#X obj 74 64 pdp_help_input;
+#X msg 74 31 start;
+#X msg 124 31 stop;
+#X obj 74 121 pdp_chrot;
+#X obj 74 157 pdp_help_output;
+#X floatatom 151 99 5 0 0;
+#X text 204 100 rotate the chroma components by this angle;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 5 0 3 1;
diff --git a/doc/objects/pdp_cog.pd b/doc/objects/pdp_cog.pd
new file mode 100644
index 0000000..70d8ef7
--- /dev/null
+++ b/doc/objects/pdp_cog.pd
@@ -0,0 +1,32 @@
+#N canvas 683 169 505 377 10;
+#X floatatom 146 142 5 0 0;
+#X floatatom 146 166 5 0 0;
+#X floatatom 146 190 5 0 0;
+#X floatatom 146 214 5 0 0;
+#X floatatom 146 239 5 0 0;
+#X text 32 12 pdp_cog: compute intensity \, center of gravity and standard
+deviation. (interpret an image as a gaussian blob).;
+#X text 201 215 standard deviation x;
+#X text 200 239 standard deviation y;
+#X obj 78 50 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 21 236 pdp_help_output;
+#X obj 78 73 pdp_help_input;
+#X text 200 141 average intensity;
+#X text 200 168 center of gravity x;
+#X text 200 190 center of gravity y;
+#X text 203 47 creation argument is threshold;
+#X obj 78 124 pdp_cog;
+#X floatatom 375 291 5 0 0;
+#X obj 226 317 pdp_cog_abs_thresh 0.1;
+#X text 87 342 the same \, but takes the absolute value and performs
+a thresholding operation;
+#X connect 8 0 10 0;
+#X connect 10 0 9 0;
+#X connect 10 0 15 0;
+#X connect 15 0 0 0;
+#X connect 15 1 1 0;
+#X connect 15 2 2 0;
+#X connect 15 3 3 0;
+#X connect 15 4 4 0;
+#X connect 16 0 17 1;
diff --git a/doc/objects/pdp_constant.pd b/doc/objects/pdp_constant.pd
new file mode 100644
index 0000000..b17c488
--- /dev/null
+++ b/doc/objects/pdp_constant.pd
@@ -0,0 +1,21 @@
+#N canvas 306 280 575 277 10;
+#X obj 46 231 pdp_help_output;
+#X obj 46 149 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 125 76 dim 320 240;
+#X text 221 76 set packet dimensions;
+#X msg 125 103 type grey;
+#X msg 125 126 type yv12;
+#X obj 46 198 pdp_constant;
+#X floatatom 125 172 5 0 0;
+#X text 221 105 generate greyscale image;
+#X text 221 124 generate colour image (default);
+#X text 221 174 set constant;
+#X text 118 26 pdp_constant creates an image filled with a constant
+when a bang is received;
+#X connect 1 0 6 0;
+#X connect 2 0 6 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 1;
diff --git a/doc/objects/pdp_control.pd b/doc/objects/pdp_control.pd
new file mode 100644
index 0000000..cfe7704
--- /dev/null
+++ b/doc/objects/pdp_control.pd
@@ -0,0 +1,59 @@
+#N canvas 259 276 910 567 10;
+#X obj 143 325 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 143 415 pdp_control;
+#X msg 143 366 thread \$1;
+#X obj 48 54 pdp_help_input;
+#X msg 48 24 start;
+#X msg 105 24 stop;
+#X obj 48 205 pdp_help_output;
+#X obj 48 154 pdp_conv;
+#X floatatom 117 86 5 0 0;
+#X obj 46 361 osc~;
+#X floatatom 46 326 5 0 0;
+#X obj 46 430 osc~;
+#X floatatom 79 402 5 0 0;
+#X obj 46 460 dac~;
+#X obj 143 454 print;
+#X text 182 323 switch thread processing on or of;
+#X text 197 455 a pdp_drop message will be sent out;
+#X text 197 471 when a package is dropped;
+#X text 119 155 a convolution object to burn cycles;
+#X obj 666 254 pdp_control;
+#X msg 666 226 collectgarbage;
+#X obj 646 478 pdp_control;
+#X text 175 82 increase this with thread processing enabled \, no audio
+should be dropped. if you do it with thread processing disabled \,
+increasing it too much can lock up the machine when real time scheduling
+is enabled.;
+#X msg 646 452 memlimit \$1;
+#X msg 688 422 5e+07;
+#X msg 615 421 0;
+#X text 687 402 50M;
+#X text 613 401 off;
+#X text 472 178 free all unused packets. pdp's garbage collection is
+"lazy" meaning packets will only be freed when the maximum usage limit
+is reached.;
+#X text 179 25 pdp_control: fine tune the pdp system. (threads & memory).
+;
+#X text 470 357 set the max memory usage limit for the packet pool.
+the default is off (value <= 0).;
+#X text 475 511 (this is a safety measure: in pdp it is easy to use
+too much memory \, i.e. with delay lines \, which will likely crash
+pd);
+#X connect 0 0 2 0;
+#X connect 1 0 14 0;
+#X connect 2 0 1 0;
+#X connect 3 0 7 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 1;
+#X connect 9 0 11 0;
+#X connect 10 0 9 0;
+#X connect 11 0 13 0;
+#X connect 12 0 11 1;
+#X connect 20 0 19 0;
+#X connect 23 0 21 0;
+#X connect 24 0 23 0;
+#X connect 25 0 23 0;
diff --git a/doc/objects/pdp_conv.pd b/doc/objects/pdp_conv.pd
new file mode 100644
index 0000000..aed62e2
--- /dev/null
+++ b/doc/objects/pdp_conv.pd
@@ -0,0 +1,44 @@
+#N canvas 450 114 702 535 10;
+#X obj 39 353 pdp_conv;
+#X floatatom 90 326 5 0 0;
+#X msg 87 195 hor \$1;
+#X msg 86 137 ver \$1;
+#X obj 87 170 tgl 15 0 empty empty empty 20 8 0 8 -262144 -1 -1 1 1
+;
+#X obj 86 112 tgl 15 0 empty empty empty 20 8 0 8 -262144 -1 -1 1 1
+;
+#X msg 89 264 vmask 0.25 0.5 0.25;
+#X msg 89 291 hmask 0.25 0.5 0.25;
+#X msg 88 239 vmask 0.25 -0.5 0.25;
+#X obj 39 63 pdp_help_input;
+#X msg 39 24 start;
+#X msg 86 24 stop;
+#X obj 39 480 pdp_help_output;
+#X obj 39 436 pdp_gain;
+#X floatatom 90 409 5 0 0;
+#X msg 90 386 1;
+#X text 162 327 right inlet sets number of iterations;
+#X text 263 239 these messages set the horizontal and vertical convolution
+masks. note that there is no support for 2 dimensional masks. if you
+want that you'll need to factor things out. (see the pdp_conv_* abstractions
+for examples);
+#X text 264 157 enable/disable horizontal and vertical masks;
+#X text 162 428 note: mask coefficents are between -1 and 1;
+#X text 162 441 use a gain object to compensate for this;
+#X msg 128 385 9;
+#X connect 0 0 13 0;
+#X connect 1 0 0 1;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 2 0;
+#X connect 5 0 3 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 0;
+#X connect 13 0 12 0;
+#X connect 14 0 13 1;
+#X connect 15 0 14 0;
+#X connect 21 0 14 0;
diff --git a/doc/objects/pdp_convert.pd b/doc/objects/pdp_convert.pd
new file mode 100644
index 0000000..498aaa3
--- /dev/null
+++ b/doc/objects/pdp_convert.pd
@@ -0,0 +1,17 @@
+#N canvas 556 468 575 277 10;
+#X obj 46 40 pdp_help_input;
+#X msg 46 10 start;
+#X msg 95 10 stop;
+#X obj 46 225 pdp_help_output;
+#X obj 118 69 hdl 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X obj 46 90 pdp_route 2;
+#X obj 118 154 pdp_convert image/grey/*;
+#X text 307 153 convert a packet;
+#X connect 0 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 4 0 5 1;
+#X connect 5 0 3 0;
+#X connect 5 1 6 0;
+#X connect 6 0 3 0;
diff --git a/doc/objects/pdp_del.pd b/doc/objects/pdp_del.pd
new file mode 100644
index 0000000..607a632
--- /dev/null
+++ b/doc/objects/pdp_del.pd
@@ -0,0 +1,31 @@
+#N canvas 414 20 609 368 10;
+#X floatatom 107 116 5 0 0 0 - - -;
+#X floatatom 64 207 5 0 0 0 - - -;
+#X obj 20 60 pdp_help_input;
+#X msg 20 31 start;
+#X msg 72 30 stop;
+#X obj 20 236 pdp_mix;
+#X obj 20 268 pdp_help_output;
+#X msg 64 183 0.5;
+#X text 164 116 right inlet sets current delay length;
+#X text 164 149 a packet delay line.;
+#X text 164 180 (dont make this too large \, packets are not compressed!)
+;
+#X obj 42 147 pdp_del 50;
+#X text 164 165 first creation arg = max delay length;
+#X text 165 213 second creation arg: initial delay (default = max)
+;
+#X obj 176 259 pdp_description;
+#X obj 176 285 print;
+#X msg 339 259 _debug;
+#X connect 0 0 11 1;
+#X connect 1 0 5 2;
+#X connect 2 0 5 0;
+#X connect 2 0 11 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X connect 7 0 1 0;
+#X connect 11 0 5 1;
+#X connect 11 0 14 0;
+#X connect 16 0 11 0;
diff --git a/doc/objects/pdp_description.pd b/doc/objects/pdp_description.pd
new file mode 100644
index 0000000..f065d83
--- /dev/null
+++ b/doc/objects/pdp_description.pd
@@ -0,0 +1,28 @@
+#N canvas 338 375 593 300 10;
+#X symbolatom 78 197 40 0 0;
+#X obj 78 46 pdp_noise;
+#X obj 78 23 bng 15 250 50 0 empty empty empty 0 -6 32 8 -262144 -1
+-1;
+#X obj 183 44 pdp_noise;
+#X obj 183 21 bng 15 250 50 0 empty empty empty 0 -6 32 8 -262144 -1
+-1;
+#X obj 183 71 pdp_grey;
+#X text 263 139 output packet description as a symbol;
+#X obj 288 44 pdp_noise;
+#X obj 288 21 bng 15 250 50 0 empty empty empty 0 -6 32 8 -262144 -1
+-1;
+#X obj 288 71 pdp_mchp;
+#X floatatom 178 171 5 0 0;
+#X obj 78 118 pdp_reg;
+#X obj 78 142 pdp_description;
+#X connect 1 0 11 0;
+#X connect 2 0 1 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 5 0 11 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 0 0;
+#X connect 12 1 10 0;
diff --git a/doc/objects/pdp_flip_lr.pd b/doc/objects/pdp_flip_lr.pd
new file mode 100644
index 0000000..b28c3bd
--- /dev/null
+++ b/doc/objects/pdp_flip_lr.pd
@@ -0,0 +1,11 @@
+#N canvas 504 211 449 178 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 136 pdp_help_output;
+#X obj 77 101 pdp_flip_lr;
+#X text 222 101 flip left <-> right;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 3 0;
diff --git a/doc/objects/pdp_flip_tb.pd b/doc/objects/pdp_flip_tb.pd
new file mode 100644
index 0000000..7048a75
--- /dev/null
+++ b/doc/objects/pdp_flip_tb.pd
@@ -0,0 +1,11 @@
+#N canvas 504 211 449 178 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 136 pdp_help_output;
+#X obj 77 101 pdp_flip_tb;
+#X text 222 101 flip top <-> bottom;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 3 0;
diff --git a/doc/objects/pdp_gain.pd b/doc/objects/pdp_gain.pd
new file mode 100644
index 0000000..7e3f50b
--- /dev/null
+++ b/doc/objects/pdp_gain.pd
@@ -0,0 +1,23 @@
+#N canvas 444 413 538 379 10;
+#X msg 91 25 start;
+#X msg 139 25 stop;
+#X obj 91 56 pdp_help_input;
+#X obj 91 312 pdp_help_output;
+#X obj 91 236 pdp_gain;
+#X floatatom 142 207 5 0 0;
+#X text 201 205 right inlet sets overal gain;
+#X text 201 252 creation argument sets initial gain;
+#X text 200 270 (default = 1);
+#X text 202 236 pdp_gain clips when overdriven;
+#X msg 109 124 chanmask \$1;
+#X floatatom 109 100 5 0 0;
+#X text 203 124 set which channels are processed;
+#X text 203 140 using a binary mask. LSB = chan 0;
+#X text 203 157 default (any negative number) = all;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 1;
+#X connect 10 0 4 0;
+#X connect 11 0 10 0;
diff --git a/doc/objects/pdp_grey2mask.pd b/doc/objects/pdp_grey2mask.pd
new file mode 100644
index 0000000..9a561ff
--- /dev/null
+++ b/doc/objects/pdp_grey2mask.pd
@@ -0,0 +1,25 @@
+#N canvas 369 257 656 300 10;
+#X obj 46 40 pdp_help_input;
+#X msg 46 10 start;
+#X msg 95 10 stop;
+#X obj 46 275 pdp_help_output;
+#X obj 90 146 pdp_grey2mask;
+#X obj 46 183 pdp_mul;
+#X obj 46 247 pdp_gain;
+#X floatatom 97 220 5 0 0;
+#X text 194 136 convert a grey scale image or the luma channel of a
+colour image to an image mask. (to be used for multiplication);
+#X obj 90 119 pdp_reg;
+#X obj 172 73 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 197 70 click here to propagate a new mask;
+#X connect 0 0 5 0;
+#X connect 0 0 9 1;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 4 0 5 1;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 7 0 6 1;
+#X connect 9 0 4 0;
+#X connect 10 0 9 0;
diff --git a/doc/objects/pdp_help_input.pd b/doc/objects/pdp_help_input.pd
new file mode 100644
index 0000000..3a9edf7
--- /dev/null
+++ b/doc/objects/pdp_help_input.pd
@@ -0,0 +1,79 @@
+#N canvas 394 33 741 682 10;
+#X obj 23 524 pdp_v4l;
+#X text 17 11 this abstraction is used as an input module in most of
+the documentation patches. change it to reflect your preferred input
+object.;
+#X obj 262 234 inlet;
+#X msg 315 324 stop;
+#X obj 258 672 outlet;
+#X obj 262 385 metro;
+#X obj 292 360 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 40 256;
+#X msg 23 287 open /dev/video0;
+#X obj 260 88 loadbang;
+#X obj 199 169 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 315 167 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 171 189 connect here;
+#X text 291 187 connect here;
+#X obj 187 470 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 334 468 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 45 329 v4l device;
+#X text 18 312 change this to your;
+#X obj 492 515 pdp_qt;
+#X obj 260 137 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 262 426 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 520 308 change this to the movie;
+#X text 519 323 you want to use;
+#X msg 520 379 loop 1;
+#X msg 262 325 bang;
+#X text 163 203 for video4linux;
+#X text 294 201 for quicktime;
+#X text 156 497 connect here;
+#X text 148 511 for video4linux;
+#X text 302 497 connect here;
+#X text 305 511 for quicktime;
+#X text 308 377 set framerate here;
+#X msg 492 288 open /tmp/test.mov;
+#X obj 262 258 route start stop;
+#X obj 329 292 select 0;
+#X obj 262 292 select 1;
+#X msg 40 357 open /dev/video1;
+#X obj 247 601 pdp_noise;
+#X obj 268 523 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 236 552 connect here;
+#X text 239 566 for noise input;
+#X text 293 137 disconnect for noise input;
+#X connect 0 0 4 0;
+#X connect 2 0 32 0;
+#X connect 3 0 5 0;
+#X connect 5 0 19 0;
+#X connect 6 0 5 1;
+#X connect 7 0 0 0;
+#X connect 8 0 18 0;
+#X connect 9 0 7 0;
+#X connect 10 0 31 0;
+#X connect 13 0 0 0;
+#X connect 14 0 17 0;
+#X connect 17 0 4 0;
+#X connect 18 0 9 0;
+#X connect 19 0 13 0;
+#X connect 22 0 17 0;
+#X connect 23 0 5 0;
+#X connect 31 0 17 0;
+#X connect 31 0 22 0;
+#X connect 32 0 23 0;
+#X connect 32 1 3 0;
+#X connect 32 2 34 0;
+#X connect 33 0 3 0;
+#X connect 34 0 23 0;
+#X connect 34 1 33 0;
+#X connect 35 0 0 0;
+#X connect 36 0 4 0;
+#X connect 37 0 36 0;
diff --git a/doc/objects/pdp_help_output.pd b/doc/objects/pdp_help_output.pd
new file mode 100644
index 0000000..0ed52d5
--- /dev/null
+++ b/doc/objects/pdp_help_output.pd
@@ -0,0 +1,14 @@
+#N canvas 482 342 510 304 10;
+#X obj 59 95 inlet;
+#X obj 59 178 pdp_xv;
+#X text 17 11 this abstraction is used as an output module in most
+of the documentation patches. change it to reflect your preferred output
+object.;
+#X obj 232 179 pdp_glx;
+#X text 31 201 X11 XVideo output;
+#X text 198 199 X11 openGL output;
+#X text 60 217 (linux);
+#X text 199 214 (linux \, mesa \, osx);
+#X msg 106 141 display acer:0;
+#X connect 0 0 1 0;
+#X connect 8 0 1 0;
diff --git a/doc/objects/pdp_histo.pd b/doc/objects/pdp_histo.pd
new file mode 100644
index 0000000..f99a27e
--- /dev/null
+++ b/doc/objects/pdp_histo.pd
@@ -0,0 +1,36 @@
+#N canvas 594 324 616 432 10;
+#X msg 87 208 size \$1;
+#X floatatom 87 184 5 0 0;
+#N canvas 0 0 450 300 graph2 0;
+#X array array1 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 390 32 graph;
+#X obj 127 47 pdp_help_input;
+#X obj 127 113 pdp_help_output;
+#X obj 127 77 pdp_gain;
+#X floatatom 251 50 5 0 0;
+#X obj 127 23 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X msg 86 271 array array1;
+#X floatatom 155 183 5 0 0;
+#X msg 155 207 scale \$1;
+#X text 37 355 the size is rounded to the next power of 2;
+#X text 36 373 first argument is size \, second is optional scaling
+factor.;
+#X text 37 338 create a histogram from an image and send to a table
+;
+#X floatatom 229 183 5 0 0;
+#X msg 229 207 samplesize \$1;
+#X obj 19 299 pdp_histo array1 64 10;
+#X connect 0 0 16 0;
+#X connect 1 0 0 0;
+#X connect 3 0 5 0;
+#X connect 5 0 4 0;
+#X connect 5 0 16 0;
+#X connect 6 0 5 1;
+#X connect 7 0 3 0;
+#X connect 8 0 16 0;
+#X connect 9 0 10 0;
+#X connect 10 0 16 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
diff --git a/doc/objects/pdp_hthresh.pd b/doc/objects/pdp_hthresh.pd
new file mode 100644
index 0000000..6d71925
--- /dev/null
+++ b/doc/objects/pdp_hthresh.pd
@@ -0,0 +1,26 @@
+#N canvas 504 211 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 340 pdp_help_output;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0;
+#X msg 128 109 0.5;
+#X obj 77 296 pdp_gain;
+#X msg 128 268 1;
+#X floatatom 160 199 5 0 0;
+#X text 234 283 (-t > x > t) -> 0;
+#X text 234 248 ( x > t) -> x;
+#X text 234 266 (-t > x) -> x;
+#X text 233 230 hard threshold;
+#X obj 77 231 pdp_hthresh;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 14 0;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 1;
+#X connect 9 0 14 1;
+#X connect 14 0 7 0;
diff --git a/doc/objects/pdp_loop.pd b/doc/objects/pdp_loop.pd
new file mode 100644
index 0000000..b097cd8
--- /dev/null
+++ b/doc/objects/pdp_loop.pd
@@ -0,0 +1,62 @@
+#N canvas 427 312 733 458 10;
+#X obj 32 85 metro 40;
+#X obj 17 59 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 152 393 pdp_loop 25;
+#X msg 275 109 record;
+#X floatatom 83 58 5 0 0;
+#X msg 39 58 stop;
+#X floatatom 274 363 5 0 0;
+#X floatatom 274 338 5 0 0;
+#X msg 275 82 store \$1;
+#X floatatom 275 57 5 0 0;
+#X msg 274 158 stop;
+#X obj 152 428 pdp_help_output;
+#X obj 152 87 pdp_help_input;
+#X msg 152 59 start;
+#X msg 199 59 stop;
+#X text 365 325 set playback position;
+#X text 372 345 hot;
+#X text 369 362 cold;
+#X text 365 159 stop recording;
+#X text 366 107 start recording at position 0;
+#X text 365 82 store a single packet at an arbitrary position;
+#X text 154 33 source playback;
+#X text 16 34 loop playback;
+#X text 272 393 creation arg: loop size;
+#X msg 275 132 record 10 2;
+#X text 365 133 start recording at position 10 \, recording 2 packets
+;
+#X msg 274 209 loop \$1;
+#X obj 274 188 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 365 210 looping on/off;
+#X msg 274 310 0;
+#X msg 274 273 size \$1;
+#X floatatom 274 249 5 0 0;
+#X text 366 270 set a new loop size. (don't make this too large);
+#X msg 561 356 collectgarbage;
+#X obj 561 387 pdp_control;
+#X msg 546 329 thread 1;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 2 0 11 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 1;
+#X connect 5 0 0 0;
+#X connect 6 0 2 1;
+#X connect 7 0 2 0;
+#X connect 8 0 2 0;
+#X connect 9 0 8 0;
+#X connect 10 0 2 0;
+#X connect 12 0 2 0;
+#X connect 13 0 12 0;
+#X connect 14 0 12 0;
+#X connect 24 0 2 0;
+#X connect 26 0 2 0;
+#X connect 27 0 26 0;
+#X connect 29 0 7 0;
+#X connect 30 0 2 0;
+#X connect 31 0 30 0;
+#X connect 33 0 34 0;
+#X connect 35 0 34 0;
diff --git a/doc/objects/pdp_mix.pd b/doc/objects/pdp_mix.pd
new file mode 100644
index 0000000..12dc169
--- /dev/null
+++ b/doc/objects/pdp_mix.pd
@@ -0,0 +1,21 @@
+#N canvas 314 353 576 288 10;
+#X obj 103 132 pdp_reg;
+#X obj 201 86 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 200 155 5 0 0;
+#X obj 81 48 pdp_help_input;
+#X msg 81 18 start;
+#X msg 130 18 stop;
+#X obj 81 238 pdp_help_output;
+#X text 268 80 click here;
+#X obj 81 184 pdp_mix;
+#X text 268 159 crossfade between 2 packets;
+#X text 268 175 0 = left inlet \, 1 = middle inlet;
+#X connect 0 0 8 1;
+#X connect 1 0 0 0;
+#X connect 2 0 8 2;
+#X connect 3 0 0 1;
+#X connect 3 0 8 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 8 0 6 0;
diff --git a/doc/objects/pdp_mix2.pd b/doc/objects/pdp_mix2.pd
new file mode 100644
index 0000000..aa492b1
--- /dev/null
+++ b/doc/objects/pdp_mix2.pd
@@ -0,0 +1,25 @@
+#N canvas 314 353 576 288 10;
+#X obj 98 132 pdp_reg;
+#X obj 201 86 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 205 138 5 0 0;
+#X obj 81 48 pdp_help_input;
+#X msg 81 18 start;
+#X msg 130 18 stop;
+#X obj 81 238 pdp_help_output;
+#X text 268 80 click here;
+#X obj 81 201 pdp_mix2;
+#X floatatom 205 161 5 0 0;
+#X text 158 199 pdp_mix2 adds two packets after applying attenuation
+;
+#X text 268 136 left packet attenuation;
+#X text 268 159 right packet attenuation;
+#X connect 0 0 8 1;
+#X connect 1 0 0 0;
+#X connect 2 0 8 2;
+#X connect 3 0 0 1;
+#X connect 3 0 8 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 8 0 6 0;
+#X connect 9 0 8 3;
diff --git a/doc/objects/pdp_mul.pd b/doc/objects/pdp_mul.pd
new file mode 100644
index 0000000..24d6461
--- /dev/null
+++ b/doc/objects/pdp_mul.pd
@@ -0,0 +1,28 @@
+#N canvas 224 229 462 390 10;
+#X msg 130 53 start;
+#X msg 177 53 stop;
+#X obj 130 85 pdp_help_input;
+#X obj 130 345 pdp_help_output;
+#X obj 174 179 pdp_reg;
+#X obj 248 142 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 281 140 click here;
+#X obj 130 310 pdp_gain;
+#X floatatom 181 282 5 0 0;
+#X text 282 216 multiplies 2 packets;
+#X obj 130 212 pdp_mul;
+#X msg 181 256 2;
+#X floatatom 40 150 5 0 0;
+#X msg 40 177 chanmask \$1;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 10 0;
+#X connect 2 0 4 1;
+#X connect 4 0 10 1;
+#X connect 5 0 4 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 1;
+#X connect 10 0 7 0;
+#X connect 11 0 8 0;
+#X connect 12 0 13 0;
+#X connect 13 0 10 0;
diff --git a/doc/objects/pdp_netsend.pd b/doc/objects/pdp_netsend.pd
new file mode 100644
index 0000000..8828c17
--- /dev/null
+++ b/doc/objects/pdp_netsend.pd
@@ -0,0 +1,62 @@
+#N canvas 236 47 523 395 10;
+#X obj 174 74 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 155 43 metro 40;
+#X obj 155 18 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 167 171 pdp_convert bitmap/yv12/*;
+#X floatatom 238 20 5 0 0 0 - - -;
+#X msg 263 132 sleepgrain \$1;
+#X floatatom 263 112 5 0 0 0 - - -;
+#X floatatom 308 74 5 0 0 0 - - -;
+#X msg 308 94 udpsize \$1;
+#X obj 295 44 hsl 128 15 1024 60000 1 0 empty empty empty -2 -6 0 8
+-262144 -1 -1 4000 1;
+#X msg 339 161 sleep \$1;
+#X obj 379 136 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X floatatom 327 200 5 0 0 0 - - -;
+#X msg 327 220 sleepperiod \$1;
+#X msg 16 13 connect acer 7777;
+#X obj 124 212 pdp_netsend;
+#X msg 324 15 1472;
+#X msg 211 81 dim 160 120;
+#X msg 212 62 dim 320 240;
+#X msg 18 44 connect localhost 7777;
+#X obj 65 247 pdp_netreceive 7777;
+#X obj 78 275 pdp_xv;
+#X obj 123 136 pdp_route;
+#X obj 203 130 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X floatatom 281 248 5 0 0 0 - - -;
+#X msg 281 268 timeout \$1;
+#X obj 154 103 pdp_v4l;
+#X obj 132 275 pdp_xv;
+#X text 97 334 this is still experimental (SIGSEGVs ahead);
+#X connect 0 0 26 0;
+#X connect 1 0 26 0;
+#X connect 2 0 1 0;
+#X connect 3 0 15 0;
+#X connect 4 0 1 1;
+#X connect 5 0 15 0;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 8 0 15 0;
+#X connect 9 0 7 0;
+#X connect 10 0 15 0;
+#X connect 11 0 10 0;
+#X connect 12 0 13 0;
+#X connect 13 0 15 0;
+#X connect 14 0 15 0;
+#X connect 16 0 8 0;
+#X connect 17 0 26 0;
+#X connect 18 0 26 0;
+#X connect 19 0 15 0;
+#X connect 20 0 21 0;
+#X connect 22 0 15 0;
+#X connect 22 1 3 0;
+#X connect 23 0 22 1;
+#X connect 24 0 25 0;
+#X connect 25 0 15 0;
+#X connect 26 0 22 0;
+#X connect 26 0 27 0;
diff --git a/doc/objects/pdp_noise.pd b/doc/objects/pdp_noise.pd
new file mode 100644
index 0000000..732d4a1
--- /dev/null
+++ b/doc/objects/pdp_noise.pd
@@ -0,0 +1,21 @@
+#N canvas 614 448 575 277 10;
+#X obj 46 231 pdp_help_output;
+#X obj 46 198 pdp_noise;
+#X obj 46 149 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 174 71 dim 320 240;
+#X text 270 71 set packet dimensions;
+#X msg 174 98 type grey;
+#X msg 174 121 type yv12;
+#X text 270 100 generate greyscale;
+#X text 270 119 generate colour (default);
+#X msg 174 152 seed 123;
+#X text 270 152 set seed value;
+#X text 167 21 pdp_noise creates a random image (with uniform distribution
+between -1 and 1) when a bang is received;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 5 0 1 0;
+#X connect 6 0 1 0;
+#X connect 9 0 1 0;
diff --git a/doc/objects/pdp_not.pd b/doc/objects/pdp_not.pd
new file mode 100644
index 0000000..c213080
--- /dev/null
+++ b/doc/objects/pdp_not.pd
@@ -0,0 +1,21 @@
+#N canvas 504 211 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 340 pdp_help_output;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0;
+#X msg 128 109 0.5;
+#X obj 77 231 pdp_not;
+#X text 229 235 bitwise not;
+#X obj 77 296 pdp_gain;
+#X msg 128 268 1;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 7 0;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 7 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 9 1;
diff --git a/doc/objects/pdp_or.pd b/doc/objects/pdp_or.pd
new file mode 100644
index 0000000..22e91e6
--- /dev/null
+++ b/doc/objects/pdp_or.pd
@@ -0,0 +1,24 @@
+#N canvas 552 356 511 383 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 322 pdp_help_output;
+#X obj 114 246 pdp_reg;
+#X obj 196 183 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 229 181 click here;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0;
+#X msg 128 109 0.5;
+#X obj 77 279 pdp_or;
+#X text 229 283 bitwise or;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 0;
+#X connect 4 0 10 1;
+#X connect 5 0 4 0;
+#X connect 7 0 4 1;
+#X connect 7 0 10 0;
+#X connect 8 0 7 1;
+#X connect 9 0 8 0;
+#X connect 10 0 3 0;
diff --git a/doc/objects/pdp_plasma.pd b/doc/objects/pdp_plasma.pd
new file mode 100644
index 0000000..3a9a566
--- /dev/null
+++ b/doc/objects/pdp_plasma.pd
@@ -0,0 +1,29 @@
+#N canvas 655 0 575 333 10;
+#X obj 46 262 pdp_help_output;
+#X obj 46 149 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 174 71 dim 320 240;
+#X text 270 71 set packet dimensions;
+#X msg 174 98 type grey;
+#X msg 174 121 type yv12;
+#X text 270 100 generate greyscale;
+#X text 270 119 generate colour (default);
+#X msg 174 152 seed 123;
+#X text 270 152 set seed value;
+#X text 167 21 pdp_noise creates a random image (with uniform distribution
+between -1 and 1) when a bang is received;
+#X obj 46 198 pdp_plasma;
+#X floatatom 174 176 5 0 0 0 - - -;
+#X text 270 176 turbulence;
+#X obj 46 241 pdp_reg;
+#X obj 113 221 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 1 0 11 0;
+#X connect 2 0 11 0;
+#X connect 4 0 11 0;
+#X connect 5 0 11 0;
+#X connect 8 0 11 0;
+#X connect 11 0 14 0;
+#X connect 12 0 11 1;
+#X connect 14 0 0 0;
+#X connect 15 0 14 0;
diff --git a/doc/objects/pdp_pointcloud.pd b/doc/objects/pdp_pointcloud.pd
new file mode 100644
index 0000000..c7c7f47
--- /dev/null
+++ b/doc/objects/pdp_pointcloud.pd
@@ -0,0 +1,32 @@
+#N canvas 462 571 450 371 10;
+#X obj 40 94 pdp_help_input;
+#X obj 40 36 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 40 174 pdp_help_output;
+#X text 111 11 convert an image to a point cloud;
+#X text 111 43 creation argument is number of points;
+#X text 111 26 (containing the points with highest intesity);
+#X floatatom 168 114 5 0 0;
+#X text 219 114 <- nb points;
+#X obj 40 140 pdp_pointcloud 10;
+#X floatatom 265 151 5 0 0;
+#X msg 267 174 nbclusters \$1;
+#X obj 180 216 pdp_description;
+#X obj 180 243 print;
+#X obj 35 296 pdp_xv;
+#X obj 39 221 pdp_m_mm A A^T;
+#X obj 34 273 pdp_scale 64 64;
+#X obj 34 252 pdp_convert image/*/*;
+#X connect 0 0 8 0;
+#X connect 1 0 0 0;
+#X connect 6 0 8 1;
+#X connect 8 0 2 0;
+#X connect 8 1 11 0;
+#X connect 8 1 14 1;
+#X connect 8 1 14 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X connect 11 0 12 0;
+#X connect 14 0 16 0;
+#X connect 15 0 13 0;
+#X connect 16 0 15 0;
diff --git a/doc/objects/pdp_positive.pd b/doc/objects/pdp_positive.pd
new file mode 100644
index 0000000..5452d2d
--- /dev/null
+++ b/doc/objects/pdp_positive.pd
@@ -0,0 +1,27 @@
+#N canvas 479 219 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 340 pdp_help_output;
+#X floatatom 128 135 5 0 0;
+#X obj 77 296 pdp_gain;
+#X msg 145 271 1;
+#X obj 77 231 pdp_positive;
+#X text 224 230 test positive and return a bitmask;
+#X text 225 245 >= 0 -> all one / < 0 -> all zero;
+#X text 223 264 to use in conjunction with logic ops;
+#X obj 77 268 pdp_xor;
+#X obj 277 146 pdp_cheby;
+#X obj 77 163 pdp_offset;
+#X msg 128 109 -0.5;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 11 1;
+#X connect 2 0 13 0;
+#X connect 4 0 13 1;
+#X connect 5 0 3 0;
+#X connect 6 0 5 1;
+#X connect 7 0 11 0;
+#X connect 11 0 5 0;
+#X connect 13 0 7 0;
+#X connect 14 0 4 0;
diff --git a/doc/objects/pdp_qt.pd b/doc/objects/pdp_qt.pd
new file mode 100644
index 0000000..9ff6154
--- /dev/null
+++ b/doc/objects/pdp_qt.pd
@@ -0,0 +1,71 @@
+#N canvas 400 126 740 623 10;
+#X obj 59 391 pdp_qt;
+#X floatatom 77 429 5 0 0;
+#X floatatom 127 430 5 0 0;
+#X obj 56 41 metro 40;
+#X msg 56 13 bang;
+#X msg 97 13 stop;
+#X msg 15 13 bang;
+#X obj 140 41 openpanel;
+#X msg 140 66 open \$1;
+#X msg 140 13 bang;
+#X msg 140 92 close;
+#X text 249 66 open/close for file access;
+#X floatatom 140 120 5 0 0;
+#X floatatom 140 146 5 0 0;
+#X text 248 117 float on left inlet selects a frame for output;
+#X msg 140 197 loop \$1;
+#X obj 203 182 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 250 198 automatic looping can be enabled/disabled;
+#X text 251 9 pdp_qt plays a quicktime movie.;
+#X text 250 221 this enables automatic playback at the frame rate specified
+in the movie file. in pdp_qt~ playback is synchronized to the audio
+stream.;
+#X msg 142 341 dump array 0;
+#X text 252 330 if the movie contains audio \, this command dumps the
+audio data into an array specified by the first argument. the second
+argument is the audio channel (default = 0 = left);
+#X msg 142 291 stop;
+#X text 251 289 stops automatic playback (same as autoplay 0);
+#X msg 141 222 autoplay 1;
+#X msg 142 267 play;
+#X text 252 432 the second outlet outputs the current frame number.
+the third outlet outputs the total number of frames in a movie when
+it is opened.;
+#X msg 142 315 cont;
+#X text 251 269 starts automatic playback (same as 0 \, autplay 1 \,
+bang);
+#X text 251 310 resumes automatic playback (same as autplay 1 \, bang)
+;
+#X text 249 137 float on right inlet selects the frame to be read on
+the next sync event (bang message / internal sync).;
+#X obj 59 462 pdp_help_output;
+#X obj 335 535 table array;
+#X obj 448 535 tabplay~ array;
+#X obj 448 576 dac~;
+#X obj 448 506 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 0 0 31 0;
+#X connect 0 1 1 0;
+#X connect 0 2 2 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 0 0;
+#X connect 7 0 8 0;
+#X connect 8 0 0 0;
+#X connect 9 0 7 0;
+#X connect 10 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 1;
+#X connect 15 0 0 0;
+#X connect 16 0 15 0;
+#X connect 20 0 0 0;
+#X connect 22 0 0 0;
+#X connect 24 0 0 0;
+#X connect 25 0 0 0;
+#X connect 27 0 0 0;
+#X connect 33 0 34 0;
+#X connect 33 0 34 1;
+#X connect 35 0 33 0;
diff --git a/doc/objects/pdp_qt~.pd b/doc/objects/pdp_qt~.pd
new file mode 100644
index 0000000..b03e4e1
--- /dev/null
+++ b/doc/objects/pdp_qt~.pd
@@ -0,0 +1,25 @@
+#N canvas 400 126 692 254 10;
+#X obj 62 122 pdp_qt~;
+#X obj 90 164 dac~;
+#X msg 39 51 play;
+#X obj 133 42 openpanel;
+#X msg 133 67 open \$1;
+#X msg 133 14 bang;
+#X text 257 67 pdp_qt~ is the same as pdp_qt exept that it also outputs
+the audio data corresponding to the current frame on its 2 rightmost
+outlets. if there is a lag between audio and video a pdp_del object
+can be inserted to delay the image. note that in order to get acceptable
+audio quality with relatively few dropouts you might need to increase
+the pd audio latency.;
+#X msg 15 24 loop 1;
+#X floatatom 84 52 5 0 0;
+#X obj 62 214 pdp_help_output;
+#X connect 0 0 9 0;
+#X connect 0 3 1 0;
+#X connect 0 4 1 1;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 3 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 1;
diff --git a/doc/objects/pdp_randmix.pd b/doc/objects/pdp_randmix.pd
new file mode 100644
index 0000000..6614979
--- /dev/null
+++ b/doc/objects/pdp_randmix.pd
@@ -0,0 +1,24 @@
+#N canvas 314 353 584 288 10;
+#X obj 81 184 pdp_randmix;
+#X obj 117 132 pdp_reg;
+#X obj 200 87 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 200 155 5 0 0;
+#X obj 81 48 pdp_help_input;
+#X msg 81 18 start;
+#X msg 130 18 stop;
+#X obj 81 238 pdp_help_output;
+#X text 268 80 click here;
+#X text 268 159 random crossfade between 2 packets;
+#X text 268 175 0 = left \, 1 = right;
+#X obj 203 125 hsl 128 15 0 1 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 6100 1;
+#X connect 0 0 7 0;
+#X connect 1 0 0 1;
+#X connect 2 0 1 0;
+#X connect 3 0 0 2;
+#X connect 4 0 0 0;
+#X connect 4 0 1 1;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X connect 11 0 3 0;
diff --git a/doc/objects/pdp_rawin.pd b/doc/objects/pdp_rawin.pd
new file mode 100644
index 0000000..6dcc342
--- /dev/null
+++ b/doc/objects/pdp_rawin.pd
@@ -0,0 +1,28 @@
+#N canvas 504 520 687 380 10;
+#X msg 137 68 open /tmp/otherpipe;
+#X msg 437 157 open;
+#X text 169 111 set type (how to interpret raw data);
+#X obj 75 307 pdp_help_output;
+#X text 476 157 open default pipe;
+#X text 177 196 creation args: <pipe> <type>;
+#X obj 405 218 print done;
+#X text 270 244 2nd outlet: bang if pipe is closed;
+#X text 271 260 connect to [open< to ensure pipe stays open;
+#X text 283 69 open any pipe for reading;
+#X msg 152 90 close;
+#X text 198 90 close pipe;
+#X obj 437 137 spigot;
+#X obj 473 116 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X msg 171 129 type bitmap/rgb/320x240;
+#X obj 137 174 pdp_rawin /tmp/pipe image/grey/320x240;
+#X text 102 19 pdp_rawin: read raw data from a pipe (or file);
+#X connect 0 0 15 0;
+#X connect 1 0 15 0;
+#X connect 10 0 15 0;
+#X connect 12 0 1 0;
+#X connect 13 0 12 1;
+#X connect 14 0 15 0;
+#X connect 15 0 3 0;
+#X connect 15 1 6 0;
+#X connect 15 1 12 0;
diff --git a/doc/objects/pdp_rawout.pd b/doc/objects/pdp_rawout.pd
new file mode 100644
index 0000000..0f231bf
--- /dev/null
+++ b/doc/objects/pdp_rawout.pd
@@ -0,0 +1,28 @@
+#N canvas 254 556 687 380 10;
+#X msg 132 63 open /tmp/otherpipe;
+#X msg 177 145 open;
+#X text 216 145 open default pipe;
+#X obj 132 219 print done;
+#X text 117 266 connect to [open< to ensure pipe stays open;
+#X text 278 64 open any pipe for reading;
+#X msg 147 85 close;
+#X text 193 85 close pipe;
+#X obj 177 125 spigot;
+#X obj 230 124 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X text 134 15 pdp_rawout: write raw data to a pipe (or file);
+#X text 293 169 creation args: <pipe>;
+#X obj 132 169 pdp_rawout /tmp/pipe;
+#X obj 15 124 pdp_help_input;
+#X obj 15 98 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X text 116 250 outlet: bang if pipe is closed;
+#X connect 0 0 12 0;
+#X connect 1 0 12 0;
+#X connect 6 0 12 0;
+#X connect 8 0 1 0;
+#X connect 9 0 8 1;
+#X connect 12 0 3 0;
+#X connect 12 0 8 0;
+#X connect 13 0 12 0;
+#X connect 14 0 13 0;
diff --git a/doc/objects/pdp_reg.pd b/doc/objects/pdp_reg.pd
new file mode 100644
index 0000000..dca00ef
--- /dev/null
+++ b/doc/objects/pdp_reg.pd
@@ -0,0 +1,38 @@
+#N canvas 327 276 676 444 10;
+#X obj 41 318 pdp_reg;
+#X obj 41 287 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 85 15 start;
+#X msg 135 15 stop;
+#X obj 85 53 pdp_help_input;
+#X obj 41 359 pdp_help_output;
+#X text 121 90 pdp_reg works in the same way as the pd float or int
+objects;
+#X text 271 124 bang: sends stored packet to output;
+#X text 271 109 pdp: stores packet and sends to output;
+#X text 271 145 pdp: stores a new packet;
+#X text 121 111 left intlet (hot):;
+#X text 120 145 right intlet (cold):;
+#X msg 122 236 load_png \$1;
+#X obj 122 212 openpanel;
+#X obj 122 190 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 219 189 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 219 235 save_png \$1;
+#X text 331 226 as a png image file.;
+#X text 332 211 you can save the contents of the register;
+#X obj 219 211 savepanel;
+#X msg 219 266 save_png /tmp/snap.png;
+#X connect 0 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 1;
+#X connect 12 0 0 0;
+#X connect 13 0 12 0;
+#X connect 14 0 13 0;
+#X connect 15 0 19 0;
+#X connect 16 0 0 0;
+#X connect 19 0 16 0;
+#X connect 20 0 0 0;
diff --git a/doc/objects/pdp_rotate.pd b/doc/objects/pdp_rotate.pd
new file mode 100644
index 0000000..6c60c60
--- /dev/null
+++ b/doc/objects/pdp_rotate.pd
@@ -0,0 +1,30 @@
+#N canvas 467 414 562 448 10;
+#X msg 195 174 centerx \$1;
+#X floatatom 195 145 5 0 0;
+#X floatatom 279 145 5 0 0;
+#X msg 279 174 centery \$1;
+#X obj 46 40 pdp_help_input;
+#X msg 46 10 start;
+#X msg 95 10 stop;
+#X obj 46 401 pdp_help_output;
+#X text 194 70 (0 \, 0) = top left;
+#X text 194 84 (1 \, 1) = bottom right;
+#X msg 247 113 0.5;
+#X floatatom 187 318 5 0 0;
+#X msg 187 288 0;
+#X text 192 6 pdp_zrot: zoom and rotation;
+#X obj 46 363 pdp_rotate;
+#X text 239 319 right inlet sets rotation angle;
+#X text 194 54 set rotation center;
+#X connect 0 0 14 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 14 0;
+#X connect 4 0 14 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X connect 10 0 1 0;
+#X connect 10 0 2 0;
+#X connect 11 0 14 1;
+#X connect 12 0 11 0;
+#X connect 14 0 7 0;
diff --git a/doc/objects/pdp_route.pd b/doc/objects/pdp_route.pd
new file mode 100644
index 0000000..c9d341d
--- /dev/null
+++ b/doc/objects/pdp_route.pd
@@ -0,0 +1,22 @@
+#N canvas 614 448 575 277 10;
+#X obj 46 40 pdp_help_input;
+#X msg 46 10 start;
+#X msg 95 10 stop;
+#X obj 46 225 pdp_help_output;
+#X obj 46 172 pdp_gain 1;
+#X obj 130 172 pdp_gain 2;
+#X obj 118 69 hdl 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X text 155 88 routes a packet to a specified outlet \, determined
+by the right inlet;
+#X text 155 124 creation argument = number of outlets (default = 2)
+;
+#X obj 46 90 pdp_route 2;
+#X connect 0 0 9 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 9 1;
+#X connect 9 0 4 0;
+#X connect 9 1 5 0;
diff --git a/doc/objects/pdp_scale.pd b/doc/objects/pdp_scale.pd
new file mode 100644
index 0000000..9ed7996
--- /dev/null
+++ b/doc/objects/pdp_scale.pd
@@ -0,0 +1,32 @@
+#N canvas 475 141 635 386 10;
+#X msg 76 207 dim 256 256;
+#X msg 76 235 dim 320 240;
+#X obj 28 275 pdp_scale 320 240;
+#X msg 75 181 dim 32 32;
+#X msg 259 234 quality \$1;
+#X obj 28 65 pdp_help_input;
+#X msg 28 36 start;
+#X msg 80 35 stop;
+#X obj 28 317 pdp_help_output;
+#X text 347 225 0 = nearest neighbour;
+#X text 347 240 1 = bilinear;
+#X text 74 154 set new packet dimensions;
+#X text 161 28 pdp_scale rescales the packet format.;
+#X text 161 56 use this if you want to combine different packet sizes.
+or have movies that don't have a legal size (not a multiple of 8x8)
+;
+#X msg 259 204 0;
+#X msg 294 204 1;
+#X text 159 103 (try to avoid rescaling by using movies with equal
+(legal) dimensions \, it is not a cheap operation and can easily be
+done in advance);
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 8 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 2 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 14 0 4 0;
+#X connect 15 0 4 0;
diff --git a/doc/objects/pdp_scanxy~.pd b/doc/objects/pdp_scanxy~.pd
new file mode 100644
index 0000000..5edad44
--- /dev/null
+++ b/doc/objects/pdp_scanxy~.pd
@@ -0,0 +1,76 @@
+#N canvas 362 152 806 785 10;
+#X floatatom 73 226 5 0 0;
+#X obj 73 602 dac~;
+#X obj 13 48 pdp_help_input;
+#X msg 13 19 start;
+#X obj 13 632 pdp_help_output;
+#X obj 73 546 *~;
+#X floatatom 89 517 5 0 0;
+#X obj 73 486 hip~ 20;
+#X floatatom 117 459 5 0 0;
+#X floatatom 131 406 5 0 0;
+#X obj 73 433 lop~ 1000;
+#X msg 222 342 interpolate \$1;
+#X obj 222 316 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X text 251 313 set interpolation between consecutive packets on/off
+;
+#X text 216 377 (the audio crossfade size is determined by the pd blocksize.
+so you can use a block~ object to set this);
+#X obj 73 375 pdp_scanxy~;
+#X floatatom 145 228 5 0 0;
+#X floatatom 73 146 5 0 0;
+#X msg 224 225 0;
+#X msg 255 225 0.25;
+#X obj 224 197 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 61 20 stop;
+#X obj 13 96 pdp_blur;
+#X floatatom 58 72 5 0 0;
+#X floatatom 161 167 5 0 0;
+#X obj 145 198 * 1;
+#X text 220 46 pdp_scanxy~: scanned synthesis with coordinate input.
+(0 \, 0) = top left \, (1 \, 1) = bottom right;
+#X obj 73 267 osc~;
+#X obj 145 266 osc~;
+#X text 223 164 set frequency ratio for lissajous path;
+#X text 250 196 resync phase;
+#X obj 73 293 *~ 0.5;
+#X obj 145 293 *~ 0.5;
+#X obj 73 318 +~ 0.5;
+#X obj 145 318 +~ 0.5;
+#X text 220 87 the waveform is scanned from the luma plane of an image.
+the path is determined by the left(x) and right(y) coordinate inlets.
+;
+#X connect 0 0 27 0;
+#X connect 2 0 22 0;
+#X connect 3 0 2 0;
+#X connect 5 0 1 0;
+#X connect 5 0 1 1;
+#X connect 6 0 5 1;
+#X connect 7 0 5 0;
+#X connect 8 0 7 1;
+#X connect 9 0 10 1;
+#X connect 10 0 7 0;
+#X connect 11 0 15 0;
+#X connect 12 0 11 0;
+#X connect 15 0 10 0;
+#X connect 16 0 28 0;
+#X connect 17 0 0 0;
+#X connect 17 0 25 0;
+#X connect 18 0 27 1;
+#X connect 19 0 28 1;
+#X connect 20 0 18 0;
+#X connect 20 0 19 0;
+#X connect 21 0 2 0;
+#X connect 22 0 4 0;
+#X connect 22 0 15 0;
+#X connect 23 0 22 1;
+#X connect 24 0 25 1;
+#X connect 25 0 16 0;
+#X connect 27 0 31 0;
+#X connect 28 0 32 0;
+#X connect 31 0 33 0;
+#X connect 32 0 34 0;
+#X connect 33 0 15 0;
+#X connect 34 0 15 1;
diff --git a/doc/objects/pdp_scan~.pd b/doc/objects/pdp_scan~.pd
new file mode 100644
index 0000000..69b0900
--- /dev/null
+++ b/doc/objects/pdp_scan~.pd
@@ -0,0 +1,41 @@
+#N canvas 387 370 666 499 10;
+#X obj 73 140 pdp_scan~;
+#X obj 73 113 phasor~;
+#X floatatom 73 86 5 0 0;
+#X obj 73 353 dac~;
+#X obj 13 48 pdp_help_input;
+#X msg 13 19 start;
+#X obj 13 397 pdp_help_output;
+#X obj 73 311 *~;
+#X floatatom 89 282 5 0 0;
+#X obj 73 251 hip~ 20;
+#X floatatom 117 224 5 0 0;
+#X floatatom 131 171 5 0 0;
+#X obj 73 198 lop~ 1000;
+#X msg 217 102 interpolate \$1;
+#X obj 217 76 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 216 124 set interpolation between consecutive packets on/off
+;
+#X text 216 142 (the audio crossfade size is determined by the pd blocksize.
+so you can use a block~ object to set this);
+#X text 218 236 the waveform is scanned from the luma plane of an image.
+the path is an oval centered at the middle of the image with axes equal
+to 60% of the image width/height.;
+#X text 214 43 pdp_scan~: oval scanned synthesis with a phase input
+;
+#X connect 0 0 12 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 4 0 0 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 7 0 3 0;
+#X connect 7 0 3 1;
+#X connect 8 0 7 1;
+#X connect 9 0 7 0;
+#X connect 10 0 9 1;
+#X connect 11 0 12 1;
+#X connect 12 0 9 0;
+#X connect 13 0 0 0;
+#X connect 14 0 13 0;
diff --git a/doc/objects/pdp_scope~.pd b/doc/objects/pdp_scope~.pd
new file mode 100644
index 0000000..eeeaabe
--- /dev/null
+++ b/doc/objects/pdp_scope~.pd
@@ -0,0 +1,23 @@
+#N canvas 526 43 567 300 10;
+#X obj 37 200 pdp_scope~;
+#X obj 37 44 metro 40;
+#X obj 37 19 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 94 18 5 0 0;
+#X msg 131 131 type grey;
+#X msg 131 109 type yv12;
+#X obj 37 256 pdp_help_output;
+#X msg 131 157 dim 320 240;
+#X obj 59 121 osc~;
+#X floatatom 59 88 5 0 0;
+#X text 131 66 a very simple oscilloscope;
+#X text 227 132 set output image type and dimensions;
+#X connect 0 0 6 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 1;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 8 0;
diff --git a/doc/objects/pdp_sign.pd b/doc/objects/pdp_sign.pd
new file mode 100644
index 0000000..2e3f775
--- /dev/null
+++ b/doc/objects/pdp_sign.pd
@@ -0,0 +1,25 @@
+#N canvas 479 219 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 340 pdp_help_output;
+#X floatatom 128 135 5 0 0;
+#X obj 77 296 pdp_gain;
+#X msg 145 271 1;
+#X msg 128 109 -0.5;
+#X obj 77 231 pdp_sign;
+#X text 239 231 get the sign (-1 \, 1);
+#X obj 77 268 pdp_mul;
+#X obj 77 163 pdp_gain;
+#X obj 173 207 pdp_abs;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 10 1;
+#X connect 2 0 11 0;
+#X connect 4 0 11 1;
+#X connect 5 0 3 0;
+#X connect 6 0 5 1;
+#X connect 7 0 4 0;
+#X connect 8 0 10 0;
+#X connect 10 0 5 0;
+#X connect 11 0 8 0;
diff --git a/doc/objects/pdp_snap.pd b/doc/objects/pdp_snap.pd
new file mode 100644
index 0000000..b5c2752
--- /dev/null
+++ b/doc/objects/pdp_snap.pd
@@ -0,0 +1,21 @@
+#N canvas 623 480 596 300 10;
+#X msg 92 15 start;
+#X msg 142 15 stop;
+#X obj 92 53 pdp_help_input;
+#X obj 41 240 pdp_help_output;
+#X text 140 172 bang: sends stored packet to output;
+#X text 113 143 left intlet (hot):;
+#X text 112 202 right intlet (cold):;
+#X obj 41 171 pdp_snap;
+#X text 115 103 pdp_reg takes a snapshot from a pdp stream.;
+#X text 263 201 pdp inlet;
+#X text 139 157 snap: stores the next packet that arrives on second
+inlet;
+#X msg 8 130 bang;
+#X msg 49 130 snap;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 1;
+#X connect 7 0 3 0;
+#X connect 11 0 7 0;
+#X connect 12 0 7 0;
diff --git a/doc/objects/pdp_sthresh.pd b/doc/objects/pdp_sthresh.pd
new file mode 100644
index 0000000..0267fc5
--- /dev/null
+++ b/doc/objects/pdp_sthresh.pd
@@ -0,0 +1,26 @@
+#N canvas 504 211 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 340 pdp_help_output;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0;
+#X msg 128 109 0.5;
+#X obj 77 296 pdp_gain;
+#X msg 128 268 1;
+#X obj 77 231 pdp_sthresh;
+#X floatatom 160 199 5 0 0;
+#X text 233 230 soft threshold;
+#X text 234 283 (-t > x > t) -> 0;
+#X text 234 266 (-t > x) -> (x + t);
+#X text 234 248 ( x > t) -> (x - t);
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 9 0;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 1;
+#X connect 9 0 7 0;
+#X connect 10 0 9 1;
diff --git a/doc/objects/pdp_trigger.pd b/doc/objects/pdp_trigger.pd
new file mode 100644
index 0000000..2cabece
--- /dev/null
+++ b/doc/objects/pdp_trigger.pd
@@ -0,0 +1,79 @@
+#N canvas 218 0 631 489 10;
+#X obj 46 40 pdp_help_input;
+#X msg 46 10 start;
+#X msg 95 10 stop;
+#X obj 46 179 pdp_help_output;
+#X obj 46 102 pdp_trigger;
+#X text 163 98 default behaviour is to outputs bang on the right output
+before sending packet to the left output;
+#X obj 118 146 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 45 269 pdp_noise;
+#X obj 45 245 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 45 294 pdp_trigger bang pdp bang bang pdp;
+#X obj 45 460 print o1;
+#X obj 278 326 print o5;
+#X obj 161 388 print o3;
+#X obj 103 429 print o2;
+#X obj 219 354 print o4;
+#X text 163 57 pdp_trigger behaves very much like the pd trigger object
+;
+#X text 162 243 you can give it pdp (p) or bang (b) arguments to send
+out packets or bangs from right to left;
+#X obj 365 406 pdp_t b p b b p;
+#X text 325 386 there is also a short version:;
+#X text 142 565 confusing note:;
+#X obj 46 575 pdp_noise;
+#X obj 46 551 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 46 604 pdp_add;
+#X obj 61 746 pdp_noise;
+#X obj 61 722 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 61 806 pdp_add;
+#X obj 105 776 pdp_gain;
+#X text 142 584 you don't need a trigger object if you connect a pdp
+object's outlet to only one active inlet.;
+#X text 139 657 if an outlet is connected to more than one active inlet
+\, you need a trigger object like you would do with standard pd message
+objects;
+#X obj 285 725 pdp_noise;
+#X obj 285 701 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 285 806 pdp_add;
+#X obj 343 778 pdp_gain;
+#X obj 285 751 pdp_t p p;
+#X floatatom 156 750 5 0 0;
+#X floatatom 394 750 5 0 0;
+#X text 287 829 correct;
+#X text 139 852 (even more confusing note: this is because pdp uses
+a 3 phase communication protocol.);
+#X text 452 459 (scroll down for more);
+#X text 48 829 unpredictable;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 4 0 3 0;
+#X connect 4 1 6 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 9 1 13 0;
+#X connect 9 2 12 0;
+#X connect 9 3 14 0;
+#X connect 9 4 11 0;
+#X connect 20 0 22 0;
+#X connect 20 0 22 1;
+#X connect 21 0 20 0;
+#X connect 23 0 25 0;
+#X connect 23 0 26 0;
+#X connect 24 0 23 0;
+#X connect 26 0 25 1;
+#X connect 29 0 33 0;
+#X connect 30 0 29 0;
+#X connect 32 0 31 1;
+#X connect 33 0 31 0;
+#X connect 33 1 32 0;
+#X connect 34 0 26 1;
+#X connect 35 0 32 1;
diff --git a/doc/objects/pdp_v4l.pd b/doc/objects/pdp_v4l.pd
new file mode 100644
index 0000000..3b1ea9d
--- /dev/null
+++ b/doc/objects/pdp_v4l.pd
@@ -0,0 +1,71 @@
+#N canvas 283 209 927 686 10;
+#X obj 107 53 metro 40;
+#X msg 159 14 stop;
+#X msg 107 14 bang;
+#X msg 51 14 bang;
+#X msg 210 132 open /dev/video0;
+#X msg 210 156 open /dev/video1;
+#X text 348 128 you can choose the input device using the 'open' message.
+the default is /dev/video0;
+#X msg 210 181 close;
+#X text 349 182 closes the video port;
+#X msg 210 207 type yv12;
+#X msg 210 231 type grey;
+#X text 349 210 type sets the ouput image package type. currently only
+yv12 (luma/chroma color) and greyscale are supported.;
+#X msg 211 260 dim 320 240;
+#X msg 211 283 dim 640 480;
+#X msg 212 336 channel \$1;
+#X floatatom 212 312 5 0 0 0 - - -;
+#X floatatom 210 459 5 0 0 0 - - -;
+#X msg 210 483 freq \$1;
+#X floatatom 271 459 5 0 0 0 - - -;
+#X msg 271 483 freqMHz \$1;
+#X text 346 459 sets the v4l tuner frequency (in v4l units and MHz)
+;
+#X obj 107 580 pdp_help_output;
+#X text 348 526 creation arguments: <input device> <capture format>
+;
+#X text 347 620 i.e. if you get weird colours \, try;
+#X obj 601 620 pdp_v4l /dev/video RGB24;
+#X text 206 14 pdp_v4l grabs video from the video4linux device. it
+sends out the most recently grabbed frame whenever a bang message is
+received \, and will then discard that frame (it will be sent out on
+time at most). the output framerate is limited by the device only.
+;
+#X text 206 89 (to make sure you receive every frame with little jitter
+\, poll pdp_v4l with a high rate metronome);
+#X text 348 554 capture format can be one of "auto" \, "YUV420P" \,
+"YUV422" \, "RGB24" or "RGB32". for most cards autodetect (default)
+should work. if not \, add the desired capture format argument when
+you create a pdp_v4l object.;
+#X obj 107 527 pdp_v4l;
+#X text 349 338 sets the v4l channel (like tuner \, composite \, svideo
+\, ...);
+#X msg 212 366 norm PAL;
+#X msg 211 410 norm SECAM;
+#X msg 211 388 norm NTSC;
+#X msg 211 431 norm AUTO;
+#X text 349 377 sets the video norm;
+#X connect 0 0 28 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 28 0;
+#X connect 4 0 28 0;
+#X connect 5 0 28 0;
+#X connect 7 0 28 0;
+#X connect 9 0 28 0;
+#X connect 10 0 28 0;
+#X connect 12 0 28 0;
+#X connect 13 0 28 0;
+#X connect 14 0 28 0;
+#X connect 15 0 14 0;
+#X connect 16 0 17 0;
+#X connect 17 0 28 0;
+#X connect 18 0 19 0;
+#X connect 19 0 28 0;
+#X connect 28 0 21 0;
+#X connect 30 0 28 0;
+#X connect 31 0 28 0;
+#X connect 32 0 28 0;
+#X connect 33 0 28 0;
diff --git a/doc/objects/pdp_xor.pd b/doc/objects/pdp_xor.pd
new file mode 100644
index 0000000..40366e2
--- /dev/null
+++ b/doc/objects/pdp_xor.pd
@@ -0,0 +1,28 @@
+#N canvas 552 356 511 383 10;
+#X msg 100 45 start;
+#X msg 147 45 stop;
+#X obj 100 77 pdp_help_input;
+#X obj 100 329 pdp_help_output;
+#X obj 144 252 pdp_reg;
+#X obj 213 204 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 246 202 click here;
+#X obj 100 170 pdp_gain;
+#X floatatom 151 142 5 0 0;
+#X msg 151 116 0.5;
+#X obj 100 286 pdp_xor;
+#X text 252 290 bitwise xor;
+#X msg 11 205 chanmask \$1;
+#X floatatom 11 180 5 0 0;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 0;
+#X connect 4 0 10 1;
+#X connect 5 0 4 0;
+#X connect 7 0 4 1;
+#X connect 7 0 10 0;
+#X connect 8 0 7 1;
+#X connect 9 0 8 0;
+#X connect 10 0 3 0;
+#X connect 12 0 10 0;
+#X connect 13 0 12 0;
diff --git a/doc/objects/pdp_xv.pd b/doc/objects/pdp_xv.pd
new file mode 100644
index 0000000..ef77559
--- /dev/null
+++ b/doc/objects/pdp_xv.pd
@@ -0,0 +1,61 @@
+#N canvas 251 11 708 682 10;
+#X msg 132 223 dim 320 240;
+#X msg 132 246 dim 640 480;
+#X text 300 227 dim sets the window dimensions;
+#X msg 131 151 create;
+#X msg 131 172 destroy;
+#X text 129 88 pdp_xv ouputs video in a window using the xVideo extension.
+if your graphics card/driver supports it you can have multiple output
+windows. if a pdp message is received and a window is not open \, one
+is created automaticly.;
+#X text 229 159 use these messages to explicitly create/destroy the
+window;
+#X msg 133 463 cursor \$1;
+#X obj 133 443 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 298 464 enables/disables cursor in xv window;
+#X obj 29 61 pdp_help_input;
+#X msg 29 25 start;
+#X msg 78 24 stop;
+#X text 295 200 specify the x window display;
+#X msg 131 197 display :0;
+#X obj 29 587 print;
+#X text 133 584 the output channel sends mouse event messages (press/release/drag
+and individual p/r/d for each button);
+#X obj 29 551 pdp_xv;
+#X msg 132 273 pos 100 100;
+#X text 300 273 set window position;
+#X msg 132 336 fullscreen;
+#X text 298 340 resize to entire screen;
+#X text 299 305 set both at once;
+#X msg 132 303 posdim 100 300 320 240;
+#X msg 131 417 tile 5 5 \$1 \$2;
+#X text 297 418 take a part of the screen (for tiling multiple pdp_xv's)
+;
+#X obj 131 396 pack 0 0;
+#X obj 190 396 t b f;
+#X floatatom 131 377 5 0 0 0 - - -;
+#X floatatom 190 376 5 0 0 0 - - -;
+#X msg 134 489 movecursor 0.5 0.5;
+#X text 299 486 move the cursor inside the window;
+#X connect 0 0 17 0;
+#X connect 1 0 17 0;
+#X connect 3 0 17 0;
+#X connect 4 0 17 0;
+#X connect 7 0 17 0;
+#X connect 8 0 7 0;
+#X connect 10 0 17 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 14 0 17 0;
+#X connect 17 0 15 0;
+#X connect 18 0 17 0;
+#X connect 20 0 17 0;
+#X connect 23 0 17 0;
+#X connect 24 0 17 0;
+#X connect 26 0 24 0;
+#X connect 27 0 26 0;
+#X connect 27 1 26 1;
+#X connect 28 0 26 0;
+#X connect 29 0 27 0;
+#X connect 30 0 17 0;
diff --git a/doc/objects/pdp_zoom.pd b/doc/objects/pdp_zoom.pd
new file mode 100644
index 0000000..19ec1a7
--- /dev/null
+++ b/doc/objects/pdp_zoom.pd
@@ -0,0 +1,41 @@
+#N canvas 467 414 562 448 10;
+#X obj 46 288 pdp_zoom;
+#X floatatom 121 264 5 0 0;
+#X floatatom 174 130 5 0 0;
+#X msg 87 160 zoomx \$1;
+#X msg 174 160 zoomy \$1;
+#X floatatom 87 129 5 0 0;
+#X msg 282 162 centerx \$1;
+#X floatatom 282 133 5 0 0;
+#X floatatom 366 133 5 0 0;
+#X msg 366 162 centery \$1;
+#X obj 46 40 pdp_help_input;
+#X msg 46 10 start;
+#X msg 95 10 stop;
+#X obj 46 341 pdp_help_output;
+#X text 173 265 right inlet sets zoom amount;
+#X text 281 42 set zoom center;
+#X text 281 58 (0 \, 0) = top left;
+#X text 281 72 (1 \, 1) = bottom right;
+#X text 71 79 set individual axis zoom;
+#X msg 142 102 1;
+#X msg 334 101 0.5;
+#X msg 121 234 1;
+#X connect 0 0 13 0;
+#X connect 1 0 0 1;
+#X connect 2 0 4 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 3 0;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X connect 8 0 9 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 19 0 2 0;
+#X connect 19 0 5 0;
+#X connect 20 0 7 0;
+#X connect 20 0 8 0;
+#X connect 21 0 1 0;
diff --git a/doc/objects/pdp_zrot.pd b/doc/objects/pdp_zrot.pd
new file mode 100644
index 0000000..f3937a0
--- /dev/null
+++ b/doc/objects/pdp_zrot.pd
@@ -0,0 +1,47 @@
+#N canvas 467 414 562 448 10;
+#X floatatom 257 275 5 0 0;
+#X floatatom 174 130 5 0 0;
+#X msg 87 160 zoomx \$1;
+#X msg 174 160 zoomy \$1;
+#X floatatom 87 129 5 0 0;
+#X msg 282 162 centerx \$1;
+#X floatatom 282 133 5 0 0;
+#X floatatom 366 133 5 0 0;
+#X msg 366 162 centery \$1;
+#X obj 46 40 pdp_help_input;
+#X msg 46 10 start;
+#X msg 95 10 stop;
+#X obj 46 401 pdp_help_output;
+#X text 281 58 (0 \, 0) = top left;
+#X text 281 72 (1 \, 1) = bottom right;
+#X text 71 79 set individual axis zoom;
+#X msg 142 102 1;
+#X msg 334 101 0.5;
+#X msg 257 245 1;
+#X obj 46 363 pdp_zrot;
+#X text 309 276 second inlet sets zoom amount;
+#X floatatom 257 333 5 0 0;
+#X msg 257 303 0;
+#X text 309 334 third inlet sets rotation angle;
+#X text 281 42 set zoom/rotation center;
+#X text 192 6 pdp_zrot: zoom and rotation;
+#X connect 0 0 19 1;
+#X connect 1 0 3 0;
+#X connect 2 0 19 0;
+#X connect 3 0 19 0;
+#X connect 4 0 2 0;
+#X connect 5 0 19 0;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 8 0 19 0;
+#X connect 9 0 19 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 0;
+#X connect 16 0 1 0;
+#X connect 16 0 4 0;
+#X connect 17 0 6 0;
+#X connect 17 0 7 0;
+#X connect 18 0 0 0;
+#X connect 19 0 12 0;
+#X connect 21 0 19 2;
+#X connect 22 0 21 0;
diff --git a/doc/objects/pdp_zthresh.pd b/doc/objects/pdp_zthresh.pd
new file mode 100644
index 0000000..df5209b
--- /dev/null
+++ b/doc/objects/pdp_zthresh.pd
@@ -0,0 +1,21 @@
+#N canvas 504 211 500 438 10;
+#X msg 77 38 start;
+#X msg 124 38 stop;
+#X obj 77 70 pdp_help_input;
+#X obj 77 340 pdp_help_output;
+#X obj 77 163 pdp_gain;
+#X floatatom 128 135 5 0 0;
+#X msg 128 109 0.5;
+#X obj 77 296 pdp_gain;
+#X msg 128 268 1;
+#X text 233 230 zero threshold ( < 0 -> 0 );
+#X obj 77 231 pdp_zthresh;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 10 0;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 1;
+#X connect 10 0 7 0;