aboutsummaryrefslogtreecommitdiff
path: root/abstractions
diff options
context:
space:
mode:
Diffstat (limited to 'abstractions')
-rw-r--r--abstractions/pdp_affine.pd15
-rw-r--r--abstractions/pdp_agc.pd28
-rw-r--r--abstractions/pdp_blur.pd27
-rw-r--r--abstractions/pdp_blur_hor.pd27
-rw-r--r--abstractions/pdp_blur_ver.pd27
-rw-r--r--abstractions/pdp_cheby3o.pd22
-rw-r--r--abstractions/pdp_contrast.pd41
-rw-r--r--abstractions/pdp_conv_alledge.pd28
-rw-r--r--abstractions/pdp_conv_emboss.pd37
-rw-r--r--abstractions/pdp_conv_smooth.pd14
-rw-r--r--abstractions/pdp_conv_sobel_edge.pd21
-rw-r--r--abstractions/pdp_conv_sobel_hor.pd15
-rw-r--r--abstractions/pdp_conv_sobel_ver.pd16
-rw-r--r--abstractions/pdp_diff.pd14
-rw-r--r--abstractions/pdp_dither.pd30
-rw-r--r--abstractions/pdp_gain3.pd27
-rw-r--r--abstractions/pdp_gradient.pd58
-rw-r--r--abstractions/pdp_grey.pd7
-rw-r--r--abstractions/pdp_invert.pd18
-rw-r--r--abstractions/pdp_m_inverse.pd11
-rw-r--r--abstractions/pdp_motion_blur.pd14
-rw-r--r--abstractions/pdp_motion_fade.pd19
-rw-r--r--abstractions/pdp_motion_phase.pd14
-rw-r--r--abstractions/pdp_offset.pd17
-rw-r--r--abstractions/pdp_phase.pd70
-rw-r--r--abstractions/pdp_phase_hor.pd41
-rw-r--r--abstractions/pdp_phase_ver.pd41
-rw-r--r--abstractions/pdp_png_to.pd21
-rw-r--r--abstractions/pdp_pps.pd18
-rw-r--r--abstractions/pdp_qt_control.pd147
-rw-r--r--abstractions/pdp_qtloop2~.pd190
-rw-r--r--abstractions/pdp_qtloop~.pd183
-rw-r--r--abstractions/pdp_saturation.pd18
-rw-r--r--abstractions/pdp_save_png_sequence.pd28
-rw-r--r--abstractions/pdp_sub.pd8
-rw-r--r--abstractions/pdp_tag.pd19
-rw-r--r--abstractions/pdp_xv_keycursor.pd77
-rw-r--r--abstractions/rgb2ycrcb.pd7
38 files changed, 1415 insertions, 0 deletions
diff --git a/abstractions/pdp_affine.pd b/abstractions/pdp_affine.pd
new file mode 100644
index 0000000..831d8ae
--- /dev/null
+++ b/abstractions/pdp_affine.pd
@@ -0,0 +1,15 @@
+#N canvas 600 556 450 300 10;
+#X obj 47 39 inlet;
+#X obj 111 39 inlet;
+#X obj 170 38 inlet;
+#X obj 98 151 pdp_cheby;
+#X obj 63 205 outlet;
+#X text 26 7 for patch compatibility with older versions of pdp;
+#X msg 119 98 coef 1 \$1;
+#X msg 197 97 coef 0 \$1;
+#X connect 0 0 3 0;
+#X connect 1 0 6 0;
+#X connect 2 0 7 0;
+#X connect 3 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 3 0;
diff --git a/abstractions/pdp_agc.pd b/abstractions/pdp_agc.pd
new file mode 100644
index 0000000..bd67c58
--- /dev/null
+++ b/abstractions/pdp_agc.pd
@@ -0,0 +1,28 @@
+#N canvas 572 396 450 300 10;
+#X obj 174 115 pdp_cog;
+#X obj 174 222 /;
+#X obj 174 147 t b f;
+#X obj 116 89 pdp_t p p;
+#X obj 116 252 pdp_gain;
+#X text 22 13 an automatic gain control using the pdp_cog object;
+#X obj 23 40 inlet;
+#X obj 238 146 inlet;
+#X obj 174 183 f \$1;
+#X obj 116 279 outlet;
+#X text 158 36 creation argument or right inlet;
+#X text 157 51 is desired average intensity;
+#X obj 23 62 route chanmask;
+#X msg 23 102 chanmask \$1;
+#X connect 0 0 2 0;
+#X connect 1 0 4 1;
+#X connect 2 0 8 0;
+#X connect 2 1 1 1;
+#X connect 3 0 4 0;
+#X connect 3 1 0 0;
+#X connect 4 0 9 0;
+#X connect 6 0 12 0;
+#X connect 7 0 8 1;
+#X connect 8 0 1 0;
+#X connect 12 0 13 0;
+#X connect 12 1 3 0;
+#X connect 13 0 4 0;
diff --git a/abstractions/pdp_blur.pd b/abstractions/pdp_blur.pd
new file mode 100644
index 0000000..46425dd
--- /dev/null
+++ b/abstractions/pdp_blur.pd
@@ -0,0 +1,27 @@
+#N canvas 344 526 521 227 10;
+#X obj 26 33 inlet;
+#X obj 26 174 outlet;
+#X obj 26 134 pdp_bq;
+#X obj 70 66 pdp_ut_addscaleclip -1 -0.5 0.05 0.48;
+#X obj 70 33 inlet;
+#X msg 181 34 2;
+#X msg 70 98 lpf \$1 0.25;
+#X msg 136 34 0;
+#X obj 136 10 loadbang;
+#X msg 163 98 hor 1;
+#X msg 209 98 ver 1;
+#X text 100 138 this uses pdp_bq as a 2 pass lowpass filter to produce
+a blur effect in all directions;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 1;
+#X connect 6 0 2 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 0;
+#X connect 8 0 5 0;
+#X connect 8 0 9 0;
+#X connect 8 0 10 0;
+#X connect 9 0 2 0;
+#X connect 10 0 2 0;
diff --git a/abstractions/pdp_blur_hor.pd b/abstractions/pdp_blur_hor.pd
new file mode 100644
index 0000000..00c4f89
--- /dev/null
+++ b/abstractions/pdp_blur_hor.pd
@@ -0,0 +1,27 @@
+#N canvas 344 526 521 227 10;
+#X obj 26 33 inlet;
+#X obj 26 174 outlet;
+#X obj 26 134 pdp_bq;
+#X obj 70 66 pdp_ut_addscaleclip -1 -0.5 0.05 0.48;
+#X obj 70 33 inlet;
+#X msg 181 34 2;
+#X msg 70 98 lpf \$1 0.25;
+#X msg 136 34 0;
+#X obj 136 10 loadbang;
+#X msg 163 98 hor 1;
+#X msg 209 98 ver 0;
+#X text 100 138 this uses pdp_bq as a 2 pass lowpass filter to produce
+a horzontal blur effect;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 1;
+#X connect 6 0 2 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 0;
+#X connect 8 0 5 0;
+#X connect 8 0 9 0;
+#X connect 8 0 10 0;
+#X connect 9 0 2 0;
+#X connect 10 0 2 0;
diff --git a/abstractions/pdp_blur_ver.pd b/abstractions/pdp_blur_ver.pd
new file mode 100644
index 0000000..915931f
--- /dev/null
+++ b/abstractions/pdp_blur_ver.pd
@@ -0,0 +1,27 @@
+#N canvas 368 520 521 227 10;
+#X obj 26 33 inlet;
+#X obj 26 174 outlet;
+#X obj 26 134 pdp_bq;
+#X obj 70 66 pdp_ut_addscaleclip -1 -0.5 0.05 0.48;
+#X obj 70 33 inlet;
+#X msg 181 34 2;
+#X msg 70 98 lpf \$1 0.25;
+#X msg 136 34 0;
+#X obj 136 10 loadbang;
+#X text 100 138 this uses pdp_bq as a 2 pass lowpass filter to produce
+a vertical blur effect;
+#X msg 209 98 ver 1;
+#X msg 163 98 hor 0;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 1;
+#X connect 6 0 2 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 0;
+#X connect 8 0 5 0;
+#X connect 8 0 11 0;
+#X connect 8 0 10 0;
+#X connect 10 0 2 0;
+#X connect 11 0 2 0;
diff --git a/abstractions/pdp_cheby3o.pd b/abstractions/pdp_cheby3o.pd
new file mode 100644
index 0000000..db9c83f
--- /dev/null
+++ b/abstractions/pdp_cheby3o.pd
@@ -0,0 +1,22 @@
+#N canvas 29 385 450 300 10;
+#X obj 42 87 inlet;
+#X obj 194 189 outlet;
+#X obj 194 159 pdp_cheby 3;
+#X msg 115 87 coef 0 \$1;
+#X msg 194 86 coef 1 \$1;
+#X msg 278 85 coef 2 \$1;
+#X msg 358 84 coef 3 \$1;
+#X obj 115 62 inlet;
+#X obj 194 62 inlet;
+#X obj 278 61 inlet;
+#X obj 358 60 inlet;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 7 0 3 0;
+#X connect 8 0 4 0;
+#X connect 9 0 5 0;
+#X connect 10 0 6 0;
diff --git a/abstractions/pdp_contrast.pd b/abstractions/pdp_contrast.pd
new file mode 100644
index 0000000..4aaa0d3
--- /dev/null
+++ b/abstractions/pdp_contrast.pd
@@ -0,0 +1,41 @@
+#N canvas 700 349 450 324 10;
+#X obj 42 159 pdp_sthresh;
+#X obj 42 261 pdp_gain;
+#X msg 100 211 -1;
+#X obj 100 235 /;
+#X obj 189 196 - 1;
+#X obj 189 168 * 2;
+#X text 10 -1 contrast enhancement (works on YCrCb and greyscale);
+#X obj 170 117 moses 0.49;
+#X msg 235 141 0.49;
+#X obj 170 94 / 2;
+#X msg 87 101 chanmask 1;
+#X obj 170 46 loadbang;
+#X obj 170 69 f \$1;
+#X obj 42 47 inlet;
+#X obj 238 47 inlet;
+#X obj 42 285 outlet;
+#X text 11 13 i.e. to process the output of pdp_agc;
+#X obj 170 142 f;
+#X obj 42 185 pdp_t p b;
+#X connect 0 0 18 0;
+#X connect 1 0 15 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 1;
+#X connect 4 0 3 1;
+#X connect 5 0 4 0;
+#X connect 7 0 17 0;
+#X connect 7 1 8 0;
+#X connect 8 0 17 0;
+#X connect 9 0 7 0;
+#X connect 10 0 1 0;
+#X connect 10 0 0 0;
+#X connect 11 0 10 0;
+#X connect 11 0 12 0;
+#X connect 12 0 9 0;
+#X connect 13 0 0 0;
+#X connect 14 0 9 0;
+#X connect 17 0 0 1;
+#X connect 17 0 5 0;
+#X connect 18 0 1 0;
+#X connect 18 1 2 0;
diff --git a/abstractions/pdp_conv_alledge.pd b/abstractions/pdp_conv_alledge.pd
new file mode 100644
index 0000000..0433c16
--- /dev/null
+++ b/abstractions/pdp_conv_alledge.pd
@@ -0,0 +1,28 @@
+#N canvas 245 202 522 199 10;
+#X obj 29 17 inlet;
+#X obj 29 156 outlet;
+#X obj 29 97 pdp_conv;
+#X msg 95 36 hmask 0.33 0.33 0.33;
+#X msg 95 59 vmask -0.33 -0.33 -0.33;
+#X obj 29 126 pdp_add;
+#X obj 95 13 loadbang;
+#X obj 292 34 int;
+#X obj 292 56 * 2;
+#X obj 292 79 - 1;
+#X obj 292 12 inlet;
+#X text 101 115 pdp_alledge is an all edge sensitive convolution filter
+using pdp_add and pdp_conv to compose a non separable edge detection
+convolution mask (pdp_conv can only compute separable convolution masks).
+the right inlet sets number of times the filter is run (2n-1);
+#X connect 0 0 2 0;
+#X connect 0 0 5 1;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 6 0 3 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 2 1;
+#X connect 10 0 7 0;
diff --git a/abstractions/pdp_conv_emboss.pd b/abstractions/pdp_conv_emboss.pd
new file mode 100644
index 0000000..5346bde
--- /dev/null
+++ b/abstractions/pdp_conv_emboss.pd
@@ -0,0 +1,37 @@
+#N canvas 172 505 641 290 10;
+#X obj 30 55 inlet;
+#X obj 29 206 outlet;
+#X obj 29 93 pdp_conv;
+#X obj 29 126 pdp_add;
+#X obj 108 9 loadbang;
+#X obj 218 86 pdp_conv;
+#X obj 29 176 pdp_affine 1;
+#X msg 108 151 0.5;
+#X msg 108 37 hmask 1 0 0;
+#X msg 218 35 hmask 0 0 1;
+#X obj 145 151 inlet;
+#X text 142 178 this uses pdp_conv \, pdp_add and pdp_affine to produce
+an emboss effect using the convolution mask (-1 0 0 \; 0 0 0 \; 0 0
+1) the right inlet sets the chroma offset.;
+#X msg 218 60 vmask 0 0 1;
+#X msg 108 60 vmask -1 0 0;
+#X msg 108 128 chanmask 1;
+#X connect 0 0 2 0;
+#X connect 0 0 5 0;
+#X connect 2 0 3 0;
+#X connect 3 0 6 0;
+#X connect 4 0 8 0;
+#X connect 4 0 9 0;
+#X connect 5 0 3 1;
+#X connect 6 0 1 0;
+#X connect 7 0 6 2;
+#X connect 8 0 2 0;
+#X connect 8 0 13 0;
+#X connect 9 0 5 0;
+#X connect 9 0 12 0;
+#X connect 10 0 6 2;
+#X connect 12 0 5 0;
+#X connect 13 0 2 0;
+#X connect 13 0 14 0;
+#X connect 14 0 6 0;
+#X connect 14 0 7 0;
diff --git a/abstractions/pdp_conv_smooth.pd b/abstractions/pdp_conv_smooth.pd
new file mode 100644
index 0000000..e37320e
--- /dev/null
+++ b/abstractions/pdp_conv_smooth.pd
@@ -0,0 +1,14 @@
+#N canvas 490 446 522 199 10;
+#X obj 29 17 inlet;
+#X obj 29 156 outlet;
+#X obj 29 97 pdp_conv;
+#X obj 95 13 loadbang;
+#X obj 292 12 inlet;
+#X msg 95 36 mask 0.33 0.33 0.33;
+#X text 107 108 pdp_conv_smooth is an averaging convolution filter.
+second inlet sets number of passes.;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 5 0;
+#X connect 4 0 2 1;
+#X connect 5 0 2 0;
diff --git a/abstractions/pdp_conv_sobel_edge.pd b/abstractions/pdp_conv_sobel_edge.pd
new file mode 100644
index 0000000..6bbb7db
--- /dev/null
+++ b/abstractions/pdp_conv_sobel_edge.pd
@@ -0,0 +1,21 @@
+#N canvas 222 642 607 202 10;
+#X obj 15 35 pdp_conv_sobel_hor;
+#X obj 149 34 pdp_conv_sobel_ver;
+#X obj 15 114 pdp_add;
+#X obj 15 74 pdp_mul;
+#X obj 149 71 pdp_mul;
+#X text 123 105 this uses the horizontal and vertical sobel directional
+masks squared as an edge detector.;
+#X obj 14 -6 inlet;
+#X obj 15 151 outlet;
+#X obj 15 15 pdp_trigger p p;
+#X connect 0 0 3 0;
+#X connect 0 0 3 1;
+#X connect 1 0 4 0;
+#X connect 1 0 4 1;
+#X connect 2 0 7 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 1;
+#X connect 6 0 8 0;
+#X connect 8 0 0 0;
+#X connect 8 1 1 0;
diff --git a/abstractions/pdp_conv_sobel_hor.pd b/abstractions/pdp_conv_sobel_hor.pd
new file mode 100644
index 0000000..599034e
--- /dev/null
+++ b/abstractions/pdp_conv_sobel_hor.pd
@@ -0,0 +1,15 @@
+#N canvas 222 642 591 202 10;
+#X obj 29 55 inlet;
+#X obj 29 132 outlet;
+#X obj 29 93 pdp_conv;
+#X obj 108 9 loadbang;
+#X msg 108 37 vmask 0.5 1 0.5;
+#X msg 108 60 hmask -1 0 1;
+#X text 108 101 this uses pdp_conv to produce the vertical sobel edge
+detector with convolution mask (-.5 0 0.5 \; -1 0 1 \; -0.5 0 .5);
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
diff --git a/abstractions/pdp_conv_sobel_ver.pd b/abstractions/pdp_conv_sobel_ver.pd
new file mode 100644
index 0000000..5ff2edd
--- /dev/null
+++ b/abstractions/pdp_conv_sobel_ver.pd
@@ -0,0 +1,16 @@
+#N canvas 222 642 591 202 10;
+#X obj 29 55 inlet;
+#X obj 29 131 outlet;
+#X obj 29 93 pdp_conv;
+#X obj 108 9 loadbang;
+#X msg 108 37 hmask 0.5 1 0.5;
+#X msg 108 60 vmask 1 0 -1;
+#X text 108 101 this uses pdp_conv to produce the horizontal sobel
+edge detector with convolution mask (-.5 -1 -0.5 \; 0 0 0 \; 0.5 1
+.5);
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
diff --git a/abstractions/pdp_diff.pd b/abstractions/pdp_diff.pd
new file mode 100644
index 0000000..a3ad5f4
--- /dev/null
+++ b/abstractions/pdp_diff.pd
@@ -0,0 +1,14 @@
+#N canvas 550 527 517 215 10;
+#X obj 62 132 pdp_sub;
+#X obj 62 104 pdp_reg;
+#X obj 62 72 pdp_trigger bang pdp;
+#X obj 62 38 inlet;
+#X obj 62 163 outlet;
+#X text 161 17 compute the difference between current;
+#X text 161 33 and previous frame;
+#X connect 0 0 4 0;
+#X connect 1 0 0 1;
+#X connect 2 0 1 0;
+#X connect 2 1 1 1;
+#X connect 2 1 0 0;
+#X connect 3 0 2 0;
diff --git a/abstractions/pdp_dither.pd b/abstractions/pdp_dither.pd
new file mode 100644
index 0000000..c579cc8
--- /dev/null
+++ b/abstractions/pdp_dither.pd
@@ -0,0 +1,30 @@
+#N canvas 563 412 450 378 10;
+#X obj 209 213 pdp_abs;
+#X obj 209 144 pdp_noise;
+#X obj 57 249 pdp_sub;
+#X obj 209 172 pdp_grey;
+#X obj 57 148 pdp_grey;
+#X obj 57 88 inlet;
+#X msg 209 114 type grey;
+#X obj 57 204 pdp_contrast \$1;
+#X obj 57 308 outlet;
+#X obj 57 117 pdp_t p b;
+#X obj 157 87 inlet;
+#X obj 209 86 loadbang;
+#X text 25 8 a dither effect;
+#X text 26 45 returns a grey image (image/grey/*);
+#X obj 57 277 pdp_sign;
+#X text 26 23 right inlet is contrast;
+#X connect 0 0 2 1;
+#X connect 1 0 3 0;
+#X connect 2 0 14 0;
+#X connect 3 0 0 0;
+#X connect 4 0 7 0;
+#X connect 5 0 9 0;
+#X connect 6 0 1 0;
+#X connect 7 0 2 0;
+#X connect 9 0 4 0;
+#X connect 9 1 1 0;
+#X connect 10 0 7 1;
+#X connect 11 0 6 0;
+#X connect 14 0 8 0;
diff --git a/abstractions/pdp_gain3.pd b/abstractions/pdp_gain3.pd
new file mode 100644
index 0000000..76ed097
--- /dev/null
+++ b/abstractions/pdp_gain3.pd
@@ -0,0 +1,27 @@
+#N canvas 576 356 409 204 10;
+#X obj 107 82 pdp_gain;
+#X obj 107 115 pdp_gain;
+#X obj 107 146 pdp_gain;
+#X obj 107 50 inlet;
+#X obj 184 49 inlet;
+#X obj 250 49 inlet;
+#X obj 309 48 inlet;
+#X obj 107 178 outlet;
+#X obj 19 22 loadbang;
+#X msg 19 50 chanmask 1;
+#X msg 19 84 chanmask 2;
+#X msg 19 117 chanmask 4;
+#X text 113 14 set gain independently for 3 channels;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 1;
+#X connect 5 0 1 1;
+#X connect 6 0 2 1;
+#X connect 8 0 9 0;
+#X connect 9 0 0 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 10 0 11 0;
+#X connect 11 0 2 0;
diff --git a/abstractions/pdp_gradient.pd b/abstractions/pdp_gradient.pd
new file mode 100644
index 0000000..8867c69
--- /dev/null
+++ b/abstractions/pdp_gradient.pd
@@ -0,0 +1,58 @@
+#N canvas 465 0 719 454 10;
+#X obj 49 19 inlet;
+#X obj 216 399 outlet;
+#X obj 216 235 pdp_gain;
+#X obj 216 286 pdp_gain;
+#X obj 216 340 pdp_gain;
+#X msg 361 217 chanmask 1;
+#X msg 361 268 chanmask 2;
+#X obj 361 178 loadbang;
+#X obj 99 267 unpack 0 0 0;
+#X msg 361 322 chanmask 4;
+#X obj 216 146 pdp_grey2mask;
+#X obj 5 198 unpack 0 0 0;
+#X obj 267 207 r \$0-ch1;
+#X obj 267 260 r \$0-ch2;
+#X obj 267 312 r \$0-ch3;
+#X obj 5 328 s \$0-ch1;
+#X obj 127 328 s \$0-ch3;
+#X obj 66 328 s \$0-ch2;
+#X obj 5 229 pdp_ut_rgb2ycrcb;
+#X msg 111 46 rgb 1 0.5 0;
+#X msg 111 74 ycrcb 1 0.5 0;
+#X text 230 46 set a red/green/blue gradient;
+#X text 140 16 a gradient abstraction based on gain and grey2mask;
+#X obj 49 118 route rgb ycrcb;
+#X text 308 391 hint: replace pdp_gain by pdp_cheby to get nonlinear
+gradients.;
+#X text 229 76 set a luma/chroma_red/chroma_blue gradient;
+#X text 322 146 this copies luma channel to chroma channels;
+#X connect 0 0 23 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 5 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 6 0 9 0;
+#X connect 7 0 5 0;
+#X connect 7 0 19 0;
+#X connect 8 0 15 0;
+#X connect 8 1 17 0;
+#X connect 8 2 16 0;
+#X connect 9 0 4 0;
+#X connect 10 0 2 0;
+#X connect 11 0 18 0;
+#X connect 11 1 18 1;
+#X connect 11 2 18 2;
+#X connect 12 0 2 1;
+#X connect 13 0 3 1;
+#X connect 14 0 4 1;
+#X connect 18 0 15 0;
+#X connect 18 1 17 0;
+#X connect 18 2 16 0;
+#X connect 19 0 23 0;
+#X connect 20 0 23 0;
+#X connect 23 0 11 0;
+#X connect 23 1 8 0;
+#X connect 23 2 10 0;
diff --git a/abstractions/pdp_grey.pd b/abstractions/pdp_grey.pd
new file mode 100644
index 0000000..fb1fa20
--- /dev/null
+++ b/abstractions/pdp_grey.pd
@@ -0,0 +1,7 @@
+#N canvas 608 510 395 122 10;
+#X obj 39 23 inlet;
+#X obj 39 51 pdp_convert image/grey/*;
+#X obj 39 79 outlet;
+#X text 101 21 backwards compatibility abstraction;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
diff --git a/abstractions/pdp_invert.pd b/abstractions/pdp_invert.pd
new file mode 100644
index 0000000..517de18
--- /dev/null
+++ b/abstractions/pdp_invert.pd
@@ -0,0 +1,18 @@
+#N canvas 487 324 440 275 10;
+#X obj 34 51 inlet;
+#X obj 34 236 outlet;
+#X obj 34 173 pdp_gain;
+#X obj 34 100 pdp_cheby 1;
+#X obj 153 24 loadbang;
+#X msg 141 146 chanmask 6;
+#X msg 153 58 chanmask 1 \, coef 0 1 \, coef 1 -1;
+#X msg 141 120 -1;
+#X connect 0 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 6 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 2 1;
+#X connect 7 0 5 0;
diff --git a/abstractions/pdp_m_inverse.pd b/abstractions/pdp_m_inverse.pd
new file mode 100644
index 0000000..e942e8a
--- /dev/null
+++ b/abstractions/pdp_m_inverse.pd
@@ -0,0 +1,11 @@
+#N canvas 805 557 415 150 10;
+#X obj 21 49 pdp_m_LU;
+#X obj 21 24 inlet;
+#X obj 21 103 outlet;
+#X text 150 31 computes a matrix inverse using the;
+#X text 149 48 LU decomposition (PA = LU);
+#X text 148 84 (uses double precision processing);
+#X obj 21 77 pdp_m_LU_inverse;
+#X connect 0 0 6 0;
+#X connect 1 0 0 0;
+#X connect 6 0 2 0;
diff --git a/abstractions/pdp_motion_blur.pd b/abstractions/pdp_motion_blur.pd
new file mode 100644
index 0000000..cc3b8c9
--- /dev/null
+++ b/abstractions/pdp_motion_blur.pd
@@ -0,0 +1,14 @@
+#N canvas 119 483 508 168 10;
+#X obj 29 17 inlet;
+#X obj 29 124 outlet;
+#X obj 29 99 pdp_bqt;
+#X obj 87 18 inlet;
+#X obj 87 42 pdp_ut_logmap_comp 0.005 0.4;
+#X msg 87 68 lpf \$1 0.25;
+#X text 97 108 pdp_motion_blur uses pdp_bqt (time biquad filter) configured
+as a lowpass filter to produce a motion blur effect.;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
diff --git a/abstractions/pdp_motion_fade.pd b/abstractions/pdp_motion_fade.pd
new file mode 100644
index 0000000..fa61735
--- /dev/null
+++ b/abstractions/pdp_motion_fade.pd
@@ -0,0 +1,19 @@
+#N canvas 58 0 508 168 10;
+#X obj 29 17 inlet;
+#X obj 29 124 outlet;
+#X obj 29 99 pdp_bqt;
+#X obj 87 18 inlet;
+#X text 94 102 pdp_motion_fade uses pdp_bqt (time biquad filter) configured
+as an highpass filter to produce a motion triggered fade-out effect.
+;
+#X obj 340 -1 loadbang;
+#X obj 340 24 f \$1;
+#X obj 87 42 pdp_ut_logmap_comp 0.01 0.4;
+#X msg 87 68 hpf \$1 0.25;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 7 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 2 0;
diff --git a/abstractions/pdp_motion_phase.pd b/abstractions/pdp_motion_phase.pd
new file mode 100644
index 0000000..2bded3d
--- /dev/null
+++ b/abstractions/pdp_motion_phase.pd
@@ -0,0 +1,14 @@
+#N canvas 58 0 508 168 10;
+#X obj 29 17 inlet;
+#X obj 29 124 outlet;
+#X obj 29 99 pdp_bqt;
+#X obj 87 18 inlet;
+#X text 94 102 pdp_motion_blur uses pdp_bqt (time biquad filter) configured
+as an allpass filter to produce a motion phase shift effect.;
+#X obj 87 42 pdp_ut_logmap_comp 0.01 0.4;
+#X msg 87 68 apf \$1 0.25;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 2 0;
diff --git a/abstractions/pdp_offset.pd b/abstractions/pdp_offset.pd
new file mode 100644
index 0000000..da8a8a4
--- /dev/null
+++ b/abstractions/pdp_offset.pd
@@ -0,0 +1,17 @@
+#N canvas 515 434 450 300 10;
+#X obj 48 69 inlet;
+#X obj 48 243 outlet;
+#X obj 48 191 pdp_cheby;
+#X msg 173 93 coef 0 \$1;
+#X obj 103 69 loadbang;
+#X obj 173 68 inlet;
+#X obj 103 111 float \$1;
+#X text 45 21 add an offset to an image;
+#X msg 103 138 reset \, coef 1 1 \, coef 0 \$1;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 6 0;
+#X connect 5 0 3 0;
+#X connect 6 0 8 0;
+#X connect 8 0 2 0;
diff --git a/abstractions/pdp_phase.pd b/abstractions/pdp_phase.pd
new file mode 100644
index 0000000..c615d2e
--- /dev/null
+++ b/abstractions/pdp_phase.pd
@@ -0,0 +1,70 @@
+#N canvas 304 524 746 291 10;
+#X obj 25 21 inlet;
+#X obj 25 249 outlet;
+#X obj 25 209 pdp_bq;
+#X obj 42 144 pdp_ut_addscaleclip -1 -0.5 0.05 0.48;
+#X obj 42 44 inlet;
+#X msg 118 109 0;
+#X obj 178 22 loadbang;
+#X msg 304 191 lr 1;
+#X msg 344 191 rl 0;
+#X msg 42 176 apf \$1 0.15;
+#X obj 287 22 inlet;
+#X msg 384 191 lr 0;
+#X msg 422 191 rl 1;
+#X msg 539 191 bt 1;
+#X msg 579 191 tb 0;
+#X msg 619 191 bt 0;
+#X msg 672 191 tb 1;
+#X obj 287 86 select 0;
+#X msg 227 191 lr 0;
+#X msg 265 191 rl 0;
+#X obj 522 19 inlet;
+#X obj 522 84 select 0;
+#X obj 338 114 moses 0;
+#X obj 573 114 moses 0;
+#X msg 241 53 1;
+#X msg 463 191 tb 0;
+#X msg 501 191 bt 0;
+#X text 99 235 this uses pdp_bq as an allpass filter to produce a phase
+shift effect. 2nd inlet sets amount. 3rd and 4th inlets set directions.
+;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 5 0;
+#X connect 6 0 7 0;
+#X connect 6 0 8 0;
+#X connect 6 0 24 0;
+#X connect 7 0 2 0;
+#X connect 8 0 2 0;
+#X connect 9 0 2 0;
+#X connect 10 0 17 0;
+#X connect 11 0 2 0;
+#X connect 12 0 2 0;
+#X connect 13 0 2 0;
+#X connect 14 0 2 0;
+#X connect 16 0 2 0;
+#X connect 17 0 18 0;
+#X connect 17 0 19 0;
+#X connect 17 1 22 0;
+#X connect 18 0 2 0;
+#X connect 19 0 2 0;
+#X connect 20 0 21 0;
+#X connect 21 0 25 0;
+#X connect 21 0 26 0;
+#X connect 21 1 23 0;
+#X connect 22 0 8 0;
+#X connect 22 0 7 0;
+#X connect 22 1 12 0;
+#X connect 22 1 11 0;
+#X connect 23 0 14 0;
+#X connect 23 0 13 0;
+#X connect 23 1 16 0;
+#X connect 23 1 15 0;
+#X connect 24 0 17 0;
+#X connect 24 0 21 0;
+#X connect 25 0 2 0;
+#X connect 26 0 2 0;
diff --git a/abstractions/pdp_phase_hor.pd b/abstractions/pdp_phase_hor.pd
new file mode 100644
index 0000000..8dcac9d
--- /dev/null
+++ b/abstractions/pdp_phase_hor.pd
@@ -0,0 +1,41 @@
+#N canvas 304 524 534 291 10;
+#X obj 25 21 inlet;
+#X obj 25 249 outlet;
+#X obj 25 209 pdp_bq;
+#X obj 42 144 pdp_ut_addscaleclip -1 -0.5 0.05 0.48;
+#X obj 42 44 inlet;
+#X msg 89 44 0;
+#X obj 89 18 loadbang;
+#X msg 42 176 apf \$1 0.15;
+#X obj 338 114 moses 0;
+#X text 99 235 this uses pdp_bq as an allpass filter to produce a phase
+shift effect in the horizontal direction. 2nd inlet sets direction
+and amount. range is from -1 to 1;
+#X obj 42 93 abs;
+#X msg 304 191 lr 0;
+#X msg 344 191 rl 1;
+#X msg 384 191 lr 1;
+#X msg 422 191 rl 0;
+#X msg 89 93 ver 0;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 7 0;
+#X connect 4 0 10 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 5 0 8 0;
+#X connect 5 0 15 0;
+#X connect 6 0 5 0;
+#X connect 6 0 11 0;
+#X connect 6 0 12 0;
+#X connect 7 0 2 0;
+#X connect 8 0 12 0;
+#X connect 8 0 11 0;
+#X connect 8 1 14 0;
+#X connect 8 1 13 0;
+#X connect 10 0 3 0;
+#X connect 11 0 2 0;
+#X connect 12 0 2 0;
+#X connect 13 0 2 0;
+#X connect 14 0 2 0;
+#X connect 15 0 2 0;
diff --git a/abstractions/pdp_phase_ver.pd b/abstractions/pdp_phase_ver.pd
new file mode 100644
index 0000000..7af57df
--- /dev/null
+++ b/abstractions/pdp_phase_ver.pd
@@ -0,0 +1,41 @@
+#N canvas 304 524 518 291 10;
+#X obj 25 21 inlet;
+#X obj 25 249 outlet;
+#X obj 25 209 pdp_bq;
+#X obj 42 144 pdp_ut_addscaleclip -1 -0.5 0.05 0.48;
+#X obj 42 44 inlet;
+#X msg 89 44 0;
+#X obj 89 18 loadbang;
+#X obj 338 114 moses 0;
+#X obj 42 93 abs;
+#X msg 42 176 apf \$1 0.15;
+#X msg 89 93 hor 0;
+#X msg 304 191 tb 1;
+#X msg 344 191 bt 0;
+#X msg 384 191 tb 0;
+#X msg 422 191 bt 1;
+#X text 99 235 this uses pdp_bq as an allpass filter to produce a phase
+shift effect in the vertical direction. 2nd inlet sets direction and
+amount. range is from -1 to 1;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 4 0 7 0;
+#X connect 5 0 8 0;
+#X connect 5 0 7 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 0;
+#X connect 6 0 11 0;
+#X connect 6 0 12 0;
+#X connect 7 0 12 0;
+#X connect 7 0 11 0;
+#X connect 7 1 14 0;
+#X connect 7 1 13 0;
+#X connect 8 0 3 0;
+#X connect 9 0 2 0;
+#X connect 10 0 2 0;
+#X connect 11 0 2 0;
+#X connect 12 0 2 0;
+#X connect 13 0 2 0;
+#X connect 14 0 2 0;
diff --git a/abstractions/pdp_png_to.pd b/abstractions/pdp_png_to.pd
new file mode 100644
index 0000000..b6a9bcb
--- /dev/null
+++ b/abstractions/pdp_png_to.pd
@@ -0,0 +1,21 @@
+#N canvas 0 0 450 300 10;
+#X obj 37 50 inlet;
+#X obj 102 262 outlet;
+#X obj 102 209 pdp_convert \$1;
+#X obj 102 180 pdp_reg;
+#X text 34 15 load a png file and convert to a packet type specified
+by the creation argument. default = bitmap/*/*;
+#X obj 102 121 symbol;
+#X msg 102 149 load_png \$1 \, bang;
+#X obj 37 81 route bang;
+#X msg 37 208 bang;
+#X obj 102 236 pdp_reg;
+#X connect 0 0 7 0;
+#X connect 2 0 9 0;
+#X connect 3 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 7 0 8 0;
+#X connect 7 1 5 0;
+#X connect 8 0 9 0;
+#X connect 9 0 1 0;
diff --git a/abstractions/pdp_pps.pd b/abstractions/pdp_pps.pd
new file mode 100644
index 0000000..8abb1dc
--- /dev/null
+++ b/abstractions/pdp_pps.pd
@@ -0,0 +1,18 @@
+#N canvas 115 450 614 279 10;
+#X obj 41 53 pdp_trigger;
+#X obj 113 90 timer;
+#X obj 113 187 /;
+#X obj 113 125 t b f;
+#X msg 113 155 1000;
+#X obj 41 21 inlet;
+#X obj 113 219 outlet;
+#X text 151 36 pdp_pps uses pdp_trigger to measure the number of packets
+per second. you can use this as a performance monitor.;
+#X connect 0 1 1 1;
+#X connect 0 1 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 3 1 2 1;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
diff --git a/abstractions/pdp_qt_control.pd b/abstractions/pdp_qt_control.pd
new file mode 100644
index 0000000..7bb2de8
--- /dev/null
+++ b/abstractions/pdp_qt_control.pd
@@ -0,0 +1,147 @@
+#N canvas 287 151 577 553 10;
+#X obj 390 48 inlet;
+#X text 315 10 nb of frames;
+#X text 313 23 connect pdp_qt's 3rd outlet here;
+#X obj 390 99 s \$0-frames;
+#X obj 8 9 inlet;
+#X msg 150 186 pp;
+#X msg 53 85 set l;
+#X msg 104 87 set pp;
+#X msg 160 87 set r;
+#N canvas 821 623 335 233 randplay 0;
+#X obj 82 122 random;
+#X obj 111 96 r \$0-frames;
+#X msg 73 81 bang;
+#X obj 69 39 inlet;
+#X obj 82 153 outlet;
+#X text 154 24 random frame playback;
+#X connect 0 0 4 0;
+#X connect 1 0 0 1;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X restore 377 288 pd randplay;
+#N canvas 418 263 365 227 loopplay 0;
+#X obj 63 79 f 0;
+#X obj 63 101 + 1;
+#X obj 63 147 mod;
+#X obj 70 121 r \$0-frames;
+#X msg 62 59 bang;
+#X obj 62 30 inlet;
+#X obj 63 182 outlet;
+#X text 166 33 normal looped playback;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 1;
+#X connect 2 0 6 0;
+#X connect 3 0 2 1;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X restore 59 284 pd loopplay;
+#X obj 4 35 route bang;
+#N canvas 253 244 365 227 rloopplay 0;
+#X obj 63 79 f 0;
+#X obj 63 147 mod;
+#X obj 96 129 r \$0-frames;
+#X msg 62 59 bang;
+#X obj 62 30 inlet;
+#X obj 63 182 outlet;
+#X obj 63 101 + 1;
+#X obj 133 79 r \$0-frames;
+#X obj 132 102 - 1;
+#X text 166 33 reverse looped playback;
+#X connect 0 0 6 0;
+#X connect 1 0 0 1;
+#X connect 1 0 5 0;
+#X connect 2 0 1 1;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 6 0 1 0;
+#X connect 7 0 8 0;
+#X connect 8 0 6 1;
+#X restore 152 284 pd rloopplay;
+#X msg 215 87 set rl;
+#N canvas 0 0 450 300 addjitter 0;
+#X obj 150 65 inlet;
+#X obj 177 244 outlet;
+#X obj 259 66 inlet;
+#X obj 259 90 abs;
+#X obj 225 173 r \$0-frames;
+#X obj 186 201 mod;
+#X obj 259 113 + 1;
+#X obj 211 139 random 1;
+#X text 32 26 add jitter. sort of. something like the nervous effect.
+;
+#X obj 160 115 t f b;
+#X obj 185 169 +;
+#X connect 0 0 9 0;
+#X connect 2 0 3 0;
+#X connect 3 0 6 0;
+#X connect 4 0 5 1;
+#X connect 5 0 1 0;
+#X connect 6 0 7 1;
+#X connect 7 0 10 1;
+#X connect 9 0 10 0;
+#X connect 9 1 7 0;
+#X connect 10 0 5 0;
+#X restore 148 395 pd addjitter;
+#X obj 150 426 outlet;
+#X obj 53 60 route loop pingpong random rloop nervous;
+#X obj 95 419 print;
+#N canvas 751 514 434 327 pingpongplay 1;
+#X obj 117 73 r \$0-frames;
+#X msg 62 59 bang;
+#X obj 62 30 inlet;
+#X obj 56 243 outlet;
+#X text 120 13 pingpong (palindrome) looped playback;
+#X obj 118 121 * 2;
+#X obj 55 191 -;
+#X obj 55 213 abs;
+#X obj 63 79 f 0;
+#X floatatom 113 203 5 0 0 0 - - -;
+#X obj 58 108 + 1;
+#X obj 62 141 mod;
+#X obj 117 98 - 1;
+#X connect 0 0 12 0;
+#X connect 1 0 8 0;
+#X connect 2 0 1 0;
+#X connect 5 0 11 1;
+#X connect 6 0 7 0;
+#X connect 7 0 3 0;
+#X connect 7 0 9 0;
+#X connect 8 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 6 0;
+#X connect 11 0 8 1;
+#X connect 12 0 5 0;
+#X connect 12 0 6 1;
+#X restore 249 284 pd pingpongplay;
+#X obj 150 217 route l rl pp r;
+#X text 60 12 left input: metro and control;
+#X text 49 465 loop modes: loop (normal) \, rloop (reverse loop) \,
+pingpong (palindrome) \, random. send a nervous <amount> message to
+add some random jitter.;
+#X obj 390 75 abs;
+#X connect 0 0 22 0;
+#X connect 4 0 11 0;
+#X connect 5 0 19 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 8 0 5 0;
+#X connect 9 0 14 0;
+#X connect 10 0 14 0;
+#X connect 11 0 5 0;
+#X connect 11 1 16 0;
+#X connect 12 0 14 0;
+#X connect 13 0 5 0;
+#X connect 14 0 15 0;
+#X connect 16 0 6 0;
+#X connect 16 1 7 0;
+#X connect 16 2 8 0;
+#X connect 16 3 13 0;
+#X connect 16 4 14 1;
+#X connect 18 0 14 0;
+#X connect 19 0 10 0;
+#X connect 19 1 12 0;
+#X connect 19 2 18 0;
+#X connect 19 3 9 0;
+#X connect 22 0 3 0;
diff --git a/abstractions/pdp_qtloop2~.pd b/abstractions/pdp_qtloop2~.pd
new file mode 100644
index 0000000..237f60c
--- /dev/null
+++ b/abstractions/pdp_qtloop2~.pd
@@ -0,0 +1,190 @@
+#N canvas 526 20 677 778 10;
+#X obj 82 83 inlet;
+#X obj 255 82 inlet;
+#X obj 103 506 pdp_loop;
+#X obj 154 702 outlet;
+#X obj 18 473 r \$0-loopin;
+#X obj 24 145 s \$0-filename;
+#X text 60 59 bang or hot frame;
+#X text 142 727 packet outlet;
+#X msg 132 137 bang;
+#X obj 82 111 route open bang;
+#X obj 103 554 pdp_convert image/YCrCb/*;
+#X obj 294 214 s \$0-playaudioframe;
+#X obj 294 237 outlet;
+#X obj 132 375 mod;
+#X obj 178 345 r \$0-nbframes;
+#X obj 418 363 outlet;
+#X obj 495 137 outlet~;
+#X obj 581 133 outlet~;
+#N canvas 98 558 711 881 more_logic 0;
+#X obj 215 518 pdp_qt;
+#X obj 246 772 symbol \$0-L;
+#X obj 340 773 symbol \$0-R;
+#X msg 246 797 dump \$1 0;
+#X msg 340 797 dump \$1 1;
+#X msg 140 473 open \$1;
+#X obj 21 367 symbol;
+#X obj 216 729 t f b;
+#X obj 232 490 r \$0-qtin;
+#X obj 340 833 s \$0-qtin;
+#X obj 245 318 s \$0-loopin;
+#X obj 21 338 r \$0-filename;
+#X obj 215 692 s \$0-loopin;
+#X text 337 227 new movie loaded \, nb of frames received here;
+#X text 268 730 dump audio;
+#X text 374 288 set loop size;
+#X obj 215 463 until;
+#X text 262 465 dump frames;
+#X obj 215 258 t f f;
+#X msg 245 289 size \$1 \, record;
+#X text 374 303 start recording;
+#X obj 199 435 f 0;
+#X obj 252 551 s \$0-nbframes;
+#X obj 215 227 r \$0-nbframes;
+#X msg 21 494 DONE;
+#X obj 21 671 print pdp_qtloop~;
+#X obj 215 661 pdp_convert bitmap/yv12/*;
+#X obj 215 348 t f f;
+#X obj 233 601 pack 0 0;
+#X obj 21 393 t b b b s;
+#X msg 233 627 decoding frame \$1 of \$2;
+#X obj 233 576 + 1;
+#X text 407 661 images are stored in 12bpp;
+#X obj 217 173 outlet~;
+#X obj 340 172 outlet~;
+#X obj 217 106 * 1920;
+#X obj 217 41 r \$0-playaudioframe;
+#X text 215 18 restart audio playback from frame #;
+#X text 277 106 samplerate / framerate;
+#X obj 32 32 table \$0-L;
+#X obj 32 56 table \$0-R;
+#N canvas 367 318 450 300 fracframemodulo 0;
+#X obj 93 43 inlet;
+#X obj 93 274 outlet;
+#X obj 93 97 /;
+#X obj 109 67 r \$0-nbframes;
+#X obj 123 147 int;
+#X obj 93 122 t f f;
+#X obj 93 179 -;
+#X obj 109 220 r \$0-nbframes;
+#X obj 93 248 *;
+#X connect 0 0 2 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 1;
+#X connect 4 0 6 1;
+#X connect 5 0 6 0;
+#X connect 5 1 4 0;
+#X connect 6 0 8 0;
+#X connect 7 0 8 1;
+#X connect 8 0 1 0;
+#X restore 217 68 pd fracframemodulo;
+#X obj 216 144 tabreadmix~ \$0-L;
+#X obj 340 143 tabreadmix~ \$0-R;
+#X obj 518 73 inlet;
+#X connect 0 0 26 0;
+#X connect 0 1 31 0;
+#X connect 0 2 22 0;
+#X connect 1 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 9 0;
+#X connect 4 0 9 0;
+#X connect 5 0 0 0;
+#X connect 6 0 29 0;
+#X connect 7 1 1 0;
+#X connect 7 1 2 0;
+#X connect 8 0 0 0;
+#X connect 11 0 6 0;
+#X connect 16 0 0 0;
+#X connect 18 0 27 0;
+#X connect 18 1 19 0;
+#X connect 19 0 10 0;
+#X connect 21 0 16 0;
+#X connect 23 0 18 0;
+#X connect 24 0 25 0;
+#X connect 26 0 12 0;
+#X connect 27 0 21 1;
+#X connect 27 0 28 1;
+#X connect 28 0 30 0;
+#X connect 29 0 24 0;
+#X connect 29 1 7 0;
+#X connect 29 2 21 0;
+#X connect 29 3 5 0;
+#X connect 30 0 25 0;
+#X connect 31 0 28 0;
+#X connect 35 0 42 0;
+#X connect 35 0 43 0;
+#X connect 36 0 41 0;
+#X connect 41 0 35 0;
+#X connect 42 0 33 0;
+#X connect 43 0 34 0;
+#X connect 44 0 43 1;
+#X connect 44 0 42 1;
+#X restore 495 104 pd more_logic;
+#X obj 132 170 f;
+#X obj 132 287 t f f;
+#X text 240 61 cold frame;
+#X obj 162 375 mod;
+#X obj 162 319 + 1;
+#X obj 118 613 pdp_route;
+#X obj 154 661 pdp_mix;
+#X text 273 257 frame nb outlet;
+#X msg 176 461 0;
+#X msg 208 461 1;
+#X obj 176 488 f;
+#X text 215 408 get current and next frame from pdp_loop;
+#X obj 132 219 int;
+#X obj 206 267 -;
+#X obj 132 196 t f f f;
+#X obj 132 249 t f f;
+#X text 277 317 crossfade fraction;
+#X obj 206 317 s \$0-frac;
+#X obj 198 631 r \$0-frac;
+#X obj 206 292 * -1;
+#X obj 103 408 t f b;
+#X obj 162 408 t f b;
+#X text 397 385 nb frames outlet;
+#X text 249 19 like pdp_qtloop~ but uses tabreadmix~ from creb;
+#X obj 497 77 inlet;
+#X text 479 57 grain size;
+#X connect 0 0 9 0;
+#X connect 1 0 19 1;
+#X connect 2 0 10 0;
+#X connect 4 0 2 0;
+#X connect 8 0 19 0;
+#X connect 9 0 5 0;
+#X connect 9 1 8 0;
+#X connect 9 2 19 0;
+#X connect 10 0 24 0;
+#X connect 13 0 39 0;
+#X connect 14 0 13 1;
+#X connect 14 0 22 1;
+#X connect 14 0 15 0;
+#X connect 18 0 16 0;
+#X connect 18 1 17 0;
+#X connect 19 0 33 0;
+#X connect 20 0 13 0;
+#X connect 20 1 23 0;
+#X connect 22 0 40 0;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 24 1 25 1;
+#X connect 25 0 3 0;
+#X connect 27 0 29 0;
+#X connect 28 0 29 0;
+#X connect 29 0 24 1;
+#X connect 31 0 34 0;
+#X connect 32 0 38 0;
+#X connect 33 0 31 0;
+#X connect 33 1 32 1;
+#X connect 33 2 12 0;
+#X connect 33 2 11 0;
+#X connect 34 0 20 0;
+#X connect 34 1 32 0;
+#X connect 37 0 25 2;
+#X connect 38 0 36 0;
+#X connect 39 0 2 0;
+#X connect 39 1 27 0;
+#X connect 40 0 2 0;
+#X connect 40 1 28 0;
+#X connect 43 0 18 0;
diff --git a/abstractions/pdp_qtloop~.pd b/abstractions/pdp_qtloop~.pd
new file mode 100644
index 0000000..bb2074e
--- /dev/null
+++ b/abstractions/pdp_qtloop~.pd
@@ -0,0 +1,183 @@
+#N canvas 526 20 677 778 10;
+#X obj 82 83 inlet;
+#X obj 255 82 inlet;
+#X obj 103 506 pdp_loop;
+#X obj 154 702 outlet;
+#X obj 18 473 r \$0-loopin;
+#X obj 24 145 s \$0-filename;
+#X text 60 59 bang or hot frame;
+#X text 142 727 packet outlet;
+#X msg 132 137 bang;
+#X obj 82 111 route open bang;
+#X obj 103 554 pdp_convert image/YCrCb/*;
+#X obj 294 214 s \$0-playaudioframe;
+#X obj 294 237 outlet;
+#X obj 132 375 mod;
+#X obj 178 345 r \$0-nbframes;
+#X obj 418 363 outlet;
+#X obj 495 137 outlet~;
+#X obj 581 133 outlet~;
+#N canvas 98 558 711 881 more_logic 0;
+#X obj 215 518 pdp_qt;
+#X obj 246 772 symbol \$0-L;
+#X obj 340 773 symbol \$0-R;
+#X msg 246 797 dump \$1 0;
+#X msg 340 797 dump \$1 1;
+#X msg 140 473 open \$1;
+#X obj 21 367 symbol;
+#X obj 216 729 t f b;
+#X obj 232 490 r \$0-qtin;
+#X obj 340 833 s \$0-qtin;
+#X obj 245 318 s \$0-loopin;
+#X obj 21 338 r \$0-filename;
+#X obj 215 692 s \$0-loopin;
+#X text 337 227 new movie loaded \, nb of frames received here;
+#X text 268 730 dump audio;
+#X text 374 288 set loop size;
+#X obj 215 463 until;
+#X text 262 465 dump frames;
+#X obj 215 258 t f f;
+#X msg 245 289 size \$1 \, record;
+#X text 374 303 start recording;
+#X obj 199 435 f 0;
+#X obj 252 551 s \$0-nbframes;
+#X obj 215 227 r \$0-nbframes;
+#X msg 21 494 DONE;
+#X obj 21 671 print pdp_qtloop~;
+#X obj 215 661 pdp_convert bitmap/yv12/*;
+#X obj 215 348 t f f;
+#X obj 233 601 pack 0 0;
+#X obj 21 393 t b b b s;
+#X msg 233 627 decoding frame \$1 of \$2;
+#X obj 233 576 + 1;
+#X text 407 661 images are stored in 12bpp;
+#X obj 217 173 outlet~;
+#X obj 340 172 outlet~;
+#X obj 217 106 * 1920;
+#X obj 217 41 r \$0-playaudioframe;
+#X text 215 18 restart audio playback from frame #;
+#X text 277 106 samplerate / framerate;
+#X obj 32 32 table \$0-L;
+#X obj 32 56 table \$0-R;
+#N canvas 367 318 450 300 fracframemodulo 0;
+#X obj 93 43 inlet;
+#X obj 93 274 outlet;
+#X obj 93 97 /;
+#X obj 109 67 r \$0-nbframes;
+#X obj 123 147 int;
+#X obj 93 122 t f f;
+#X obj 93 179 -;
+#X obj 109 220 r \$0-nbframes;
+#X obj 93 248 *;
+#X connect 0 0 2 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 1;
+#X connect 4 0 6 1;
+#X connect 5 0 6 0;
+#X connect 5 1 4 0;
+#X connect 6 0 8 0;
+#X connect 7 0 8 1;
+#X connect 8 0 1 0;
+#X restore 217 68 pd fracframemodulo;
+#X obj 216 144 tabplay~ \$0-L;
+#X obj 340 143 tabplay~ \$0-R;
+#X connect 0 0 26 0;
+#X connect 0 1 31 0;
+#X connect 0 2 22 0;
+#X connect 1 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 9 0;
+#X connect 4 0 9 0;
+#X connect 5 0 0 0;
+#X connect 6 0 29 0;
+#X connect 7 1 1 0;
+#X connect 7 1 2 0;
+#X connect 8 0 0 0;
+#X connect 11 0 6 0;
+#X connect 16 0 0 0;
+#X connect 18 0 27 0;
+#X connect 18 1 19 0;
+#X connect 19 0 10 0;
+#X connect 21 0 16 0;
+#X connect 23 0 18 0;
+#X connect 24 0 25 0;
+#X connect 26 0 12 0;
+#X connect 27 0 21 1;
+#X connect 27 0 28 1;
+#X connect 28 0 30 0;
+#X connect 29 0 24 0;
+#X connect 29 1 7 0;
+#X connect 29 2 21 0;
+#X connect 29 3 5 0;
+#X connect 30 0 25 0;
+#X connect 31 0 28 0;
+#X connect 35 0 42 0;
+#X connect 35 0 43 0;
+#X connect 36 0 41 0;
+#X connect 41 0 35 0;
+#X connect 42 0 33 0;
+#X connect 43 0 34 0;
+#X restore 495 104 pd more_logic;
+#X obj 132 170 f;
+#X obj 132 287 t f f;
+#X text 240 61 cold frame;
+#X obj 162 375 mod;
+#X obj 162 319 + 1;
+#X obj 118 613 pdp_route;
+#X obj 154 661 pdp_mix;
+#X text 273 257 frame nb outlet;
+#X msg 176 461 0;
+#X msg 208 461 1;
+#X obj 176 488 f;
+#X text 215 408 get current and next frame from pdp_loop;
+#X obj 132 219 int;
+#X obj 206 267 -;
+#X obj 132 196 t f f f;
+#X obj 132 249 t f f;
+#X text 277 317 crossfade fraction;
+#X obj 206 317 s \$0-frac;
+#X obj 198 631 r \$0-frac;
+#X obj 206 292 * -1;
+#X obj 103 408 t f b;
+#X obj 162 408 t f b;
+#X text 397 385 nb frames outlet;
+#X connect 0 0 9 0;
+#X connect 1 0 19 1;
+#X connect 2 0 10 0;
+#X connect 4 0 2 0;
+#X connect 8 0 19 0;
+#X connect 9 0 5 0;
+#X connect 9 1 8 0;
+#X connect 9 2 19 0;
+#X connect 10 0 24 0;
+#X connect 13 0 39 0;
+#X connect 14 0 13 1;
+#X connect 14 0 22 1;
+#X connect 14 0 15 0;
+#X connect 18 0 16 0;
+#X connect 18 1 17 0;
+#X connect 19 0 33 0;
+#X connect 20 0 13 0;
+#X connect 20 1 23 0;
+#X connect 22 0 40 0;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 24 1 25 1;
+#X connect 25 0 3 0;
+#X connect 27 0 29 0;
+#X connect 28 0 29 0;
+#X connect 29 0 24 1;
+#X connect 31 0 34 0;
+#X connect 32 0 38 0;
+#X connect 33 0 31 0;
+#X connect 33 1 32 1;
+#X connect 33 2 12 0;
+#X connect 33 2 11 0;
+#X connect 34 0 20 0;
+#X connect 34 1 32 0;
+#X connect 37 0 25 2;
+#X connect 38 0 36 0;
+#X connect 39 0 2 0;
+#X connect 39 1 27 0;
+#X connect 40 0 2 0;
+#X connect 40 1 28 0;
diff --git a/abstractions/pdp_saturation.pd b/abstractions/pdp_saturation.pd
new file mode 100644
index 0000000..44f5a86
--- /dev/null
+++ b/abstractions/pdp_saturation.pd
@@ -0,0 +1,18 @@
+#N canvas 322 388 509 326 10;
+#X obj 39 105 inlet;
+#X obj 270 103 inlet;
+#X obj 39 255 outlet;
+#X obj 85 105 loadbang;
+#X text 32 14 adjust colour saturation by applying a gain to the chroma
+channels.;
+#X text 31 47 this only works for image/YCrCb/* packets and 3 channel
+image/multi/* packets containing luma and chroma channels.;
+#X obj 39 192 pdp_gain;
+#X msg 85 155 chanmask 6 \, gain \$1;
+#X obj 85 131 f \$1;
+#X connect 0 0 6 0;
+#X connect 1 0 6 1;
+#X connect 3 0 8 0;
+#X connect 6 0 2 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
diff --git a/abstractions/pdp_save_png_sequence.pd b/abstractions/pdp_save_png_sequence.pd
new file mode 100644
index 0000000..786df47
--- /dev/null
+++ b/abstractions/pdp_save_png_sequence.pd
@@ -0,0 +1,28 @@
+#N canvas 654 482 490 382 10;
+#X obj 54 65 inlet;
+#X obj 119 362 pdp_reg;
+#X obj 119 130 pdp_t b p;
+#X obj 119 186 + 1;
+#X obj 54 93 route bang;
+#X obj 119 251 makefilename /tmp/frame%d.png;
+#X obj 119 215 moses \$1;
+#X obj 140 279 print;
+#X msg 119 305 save_png \$1;
+#X msg 54 126 0;
+#X text 146 10 save a png sequence in the /tmp directory;
+#X text 146 25 creation argument is the number of frames;
+#X obj 119 160 f \$1;
+#X text 146 40 send a bang to start writing;
+#X connect 0 0 4 0;
+#X connect 2 0 12 0;
+#X connect 2 1 1 0;
+#X connect 3 0 6 0;
+#X connect 3 0 12 1;
+#X connect 4 0 9 0;
+#X connect 4 1 2 0;
+#X connect 5 0 7 0;
+#X connect 5 0 8 0;
+#X connect 6 0 5 0;
+#X connect 8 0 1 0;
+#X connect 9 0 12 1;
+#X connect 12 0 3 0;
diff --git a/abstractions/pdp_sub.pd b/abstractions/pdp_sub.pd
new file mode 100644
index 0000000..b4abe36
--- /dev/null
+++ b/abstractions/pdp_sub.pd
@@ -0,0 +1,8 @@
+#N canvas 577 543 450 300 10;
+#X obj 48 49 inlet;
+#X obj 118 47 inlet;
+#X obj 47 161 outlet;
+#X obj 48 104 pdp_mix2 1 -1;
+#X connect 0 0 3 0;
+#X connect 1 0 3 1;
+#X connect 3 0 2 0;
diff --git a/abstractions/pdp_tag.pd b/abstractions/pdp_tag.pd
new file mode 100644
index 0000000..d1884f6
--- /dev/null
+++ b/abstractions/pdp_tag.pd
@@ -0,0 +1,19 @@
+#N canvas 700 231 450 300 10;
+#X obj 56 25 inlet;
+#X obj 55 191 outlet;
+#X msg 162 174 \$1 \$2 \$3 \$4;
+#X text 148 31 tag a pdp message (for routing);
+#X obj 0 110 symbol \$1;
+#X obj 56 68 unpack s s 0;
+#X obj 55 139 pack s s s 0;
+#X obj 39 91 t b s;
+#X obj 55 165 route list;
+#X connect 0 0 5 0;
+#X connect 4 0 6 0;
+#X connect 5 0 7 0;
+#X connect 5 1 6 2;
+#X connect 5 2 6 3;
+#X connect 6 0 8 0;
+#X connect 7 0 4 0;
+#X connect 7 1 6 1;
+#X connect 8 0 1 0;
diff --git a/abstractions/pdp_xv_keycursor.pd b/abstractions/pdp_xv_keycursor.pd
new file mode 100644
index 0000000..a10a708
--- /dev/null
+++ b/abstractions/pdp_xv_keycursor.pd
@@ -0,0 +1,77 @@
+#N canvas 135 108 708 682 10;
+#X obj 19 103 print;
+#X obj 19 67 pdp_xv;
+#X obj 111 168 route keypress;
+#X obj 367 215 table \$0-x;
+#X obj 87 394 tabwrite \$0-x;
+#X obj 396 335 tabread \$0-x;
+#X obj 486 335 tabread \$0-y;
+#X obj 409 383 pack s 0 0;
+#X obj 183 392 tabwrite \$0-y;
+#X obj 77 260 route motion;
+#X obj 88 367 unpack 0 0;
+#X obj 444 215 table \$0-y;
+#X obj 87 339 spigot;
+#X msg 157 311 0;
+#X msg 125 312 1;
+#X obj 157 288 route keyrelease;
+#X msg 385 360 movecursor;
+#X msg 409 412 \$1 \$2 \$3;
+#X obj 18 468 outlet;
+#X obj 17 128 t a a;
+#X obj 403 277 t b f f;
+#X obj 88 426 outlet;
+#X obj 152 423 outlet;
+#X obj 267 428 outlet;
+#X obj 239 231 t f f;
+#X obj 409 438 s \$0-control;
+#X obj 19 40 r \$0-control;
+#X obj 20 16 inlet;
+#X text 182 53 a keyboard/mouse controller using pdp_xv;
+#X text 180 76 hold a key while moving the mouse to update the x/y
+controller value. hint: turn off keyboard autoropeat using "xset r
+off" in a terminal window.;
+#X text 252 454 scan code;
+#X text 82 450 x coord;
+#X text 151 449 y coord;
+#X text 9 494 plain events;
+#X obj 450 119 inlet;
+#X obj 450 143 unpack 0 0 0;
+#X obj 382 175 tabwrite \$0-x;
+#X obj 480 175 tabwrite \$0-y;
+#X connect 1 0 0 0;
+#X connect 1 0 19 0;
+#X connect 2 0 24 0;
+#X connect 2 1 9 0;
+#X connect 5 0 7 1;
+#X connect 6 0 7 2;
+#X connect 7 0 17 0;
+#X connect 9 0 12 0;
+#X connect 9 1 15 0;
+#X connect 10 0 4 0;
+#X connect 10 0 21 0;
+#X connect 10 1 8 0;
+#X connect 10 1 22 0;
+#X connect 12 0 10 0;
+#X connect 13 0 12 1;
+#X connect 14 0 12 1;
+#X connect 15 0 13 0;
+#X connect 16 0 7 0;
+#X connect 17 0 25 0;
+#X connect 19 0 18 0;
+#X connect 19 1 2 0;
+#X connect 20 0 16 0;
+#X connect 20 1 5 0;
+#X connect 20 2 6 0;
+#X connect 24 0 4 1;
+#X connect 24 0 8 1;
+#X connect 24 0 23 0;
+#X connect 24 0 14 0;
+#X connect 24 1 20 0;
+#X connect 26 0 1 0;
+#X connect 27 0 1 0;
+#X connect 34 0 35 0;
+#X connect 35 0 36 0;
+#X connect 35 1 37 0;
+#X connect 35 2 37 1;
+#X connect 35 2 36 1;
diff --git a/abstractions/rgb2ycrcb.pd b/abstractions/rgb2ycrcb.pd
new file mode 100644
index 0000000..acb517f
--- /dev/null
+++ b/abstractions/rgb2ycrcb.pd
@@ -0,0 +1,7 @@
+#N canvas 318 162 450 300 10;
+#X obj 94 76 inlet;
+#X obj 144 76 inlet;
+#X obj 195 76 inlet;
+#X text 94 53 red;
+#X text 143 52 green;
+#X text 197 53 blue;