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_cheby3o.pd22
-rw-r--r--abstractions/pdp_contrast.pd41
-rw-r--r--abstractions/pdp_conv_sobel_edge.pd8
-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_m_inverse.pd11
-rw-r--r--abstractions/pdp_motion_fade.pd19
-rw-r--r--abstractions/pdp_offset.pd17
-rw-r--r--abstractions/pdp_png_to.pd21
-rw-r--r--abstractions/pdp_qtloop~.pd183
-rw-r--r--abstractions/pdp_saturation.pd31
-rw-r--r--abstractions/pdp_save_png_sequence.pd28
-rw-r--r--abstractions/pdp_tag.pd19
-rw-r--r--abstractions/rgb2ycrcb.pd7
19 files changed, 570 insertions, 16 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_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..83e8cce
--- /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 170 195 - 1;
+#X obj 170 167 * 2;
+#X text 10 -1 contrast enhancement (works on YCrCb and greyscale);
+#X obj 170 100 moses 0.49;
+#X msg 235 123 0.49;
+#X obj 262 83 / 2;
+#X msg 87 101 chanmask 1;
+#X obj 170 46 loadbang;
+#X obj 170 75 f \$1;
+#X obj 42 47 inlet;
+#X obj 262 45 inlet;
+#X obj 42 285 outlet;
+#X text 11 13 i.e. to process the output of pdp_agc;
+#X obj 170 141 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 7 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_sobel_edge.pd b/abstractions/pdp_conv_sobel_edge.pd
index ccf0c38..6bbb7db 100644
--- a/abstractions/pdp_conv_sobel_edge.pd
+++ b/abstractions/pdp_conv_sobel_edge.pd
@@ -6,8 +6,9 @@
#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 15 9 inlet;
+#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;
@@ -15,5 +16,6 @@ masks squared as an edge detector.;
#X connect 2 0 7 0;
#X connect 3 0 2 0;
#X connect 4 0 2 1;
-#X connect 6 0 0 0;
-#X connect 6 0 1 0;
+#X connect 6 0 8 0;
+#X connect 8 0 0 0;
+#X connect 8 1 1 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_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_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_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_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_qtloop~.pd b/abstractions/pdp_qtloop~.pd
new file mode 100644
index 0000000..300e586
--- /dev/null
+++ b/abstractions/pdp_qtloop~.pd
@@ -0,0 +1,183 @@
+#N canvas 273 0 555 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 333 706 outlet~;
+#X obj 419 702 outlet~;
+#N canvas 34 6 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 318 173 outlet~;
+#X obj 217 144 tabplay~ \$0-L;
+#X obj 318 144 tabplay~ \$0-R;
+#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 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 33 0;
+#X connect 36 0 34 0;
+#X connect 37 0 35 0;
+#X connect 37 0 36 0;
+#X connect 38 0 43 0;
+#X connect 43 0 37 0;
+#X restore 333 673 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
index f96f79d..44f5a86 100644
--- a/abstractions/pdp_saturation.pd
+++ b/abstractions/pdp_saturation.pd
@@ -1,13 +1,18 @@
-#N canvas 247 212 237 275 10;
-#X obj 44 52 inlet;
-#X obj 139 53 inlet;
-#X obj 44 202 outlet;
-#X obj 44 139 pdp_gain;
-#X msg 101 103 u \$1;
-#X msg 139 103 v \$1;
-#X connect 0 0 3 0;
-#X connect 1 0 4 0;
-#X connect 1 0 5 0;
-#X connect 3 0 2 0;
-#X connect 4 0 3 0;
-#X connect 5 0 3 0;
+#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_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/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;