aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--externals/gridflow/pd_abstractions/#apply_colormap_channelwise.pd12
-rw-r--r--externals/gridflow/pd_abstractions/#camera.pd149
-rw-r--r--externals/gridflow/pd_abstractions/#camera_control.pd129
-rw-r--r--externals/gridflow/pd_abstractions/#centre_of_gravity.pd113
-rw-r--r--externals/gridflow/pd_abstractions/#centroid.pd80
-rw-r--r--externals/gridflow/pd_abstractions/#checkers.pd18
-rw-r--r--externals/gridflow/pd_abstractions/#clip.pd20
-rw-r--r--externals/gridflow/pd_abstractions/#color.pd68
-rw-r--r--externals/gridflow/pd_abstractions/#contrast.pd20
-rw-r--r--externals/gridflow/pd_abstractions/#fade.pd37
-rw-r--r--externals/gridflow/pd_abstractions/#fade_lin.pd29
-rw-r--r--externals/gridflow/pd_abstractions/#greyscale_to_rgb.pd8
-rw-r--r--externals/gridflow/pd_abstractions/#hueshift.pd31
-rw-r--r--externals/gridflow/pd_abstractions/#motion_detection.pd64
-rw-r--r--externals/gridflow/pd_abstractions/#mouse.pd93
-rw-r--r--externals/gridflow/pd_abstractions/#posterize.pd15
-rw-r--r--externals/gridflow/pd_abstractions/#ravel.pd15
-rw-r--r--externals/gridflow/pd_abstractions/#remap_image.pd21
-rw-r--r--externals/gridflow/pd_abstractions/#rgb_to_greyscale.pd10
-rw-r--r--externals/gridflow/pd_abstractions/#rgb_to_yuv.pd10
-rw-r--r--externals/gridflow/pd_abstractions/#solarize.pd14
-rw-r--r--externals/gridflow/pd_abstractions/#spread.pd22
-rw-r--r--externals/gridflow/pd_abstractions/#text_to_image.pd41
-rw-r--r--externals/gridflow/pd_abstractions/#yuv_to_rgb.pd10
-rw-r--r--externals/gridflow/pd_abstractions/@complex_sq.pd8
-rw-r--r--externals/gridflow/pd_abstractions/count.pd44
-rw-r--r--externals/gridflow/pd_abstractions/pingpong.pd27
-rw-r--r--externals/gridflow/pd_examples/binary_operations.pd73
-rw-r--r--externals/gridflow/pd_examples/blob.pd106
-rw-r--r--externals/gridflow/pd_examples/cellular_1d.pd164
-rw-r--r--externals/gridflow/pd_examples/color_correction.pd154
-rw-r--r--externals/gridflow/pd_examples/color_detect.pd218
-rw-r--r--externals/gridflow/pd_examples/convolve.pd94
-rw-r--r--externals/gridflow/pd_examples/cross_fade.pd73
-rw-r--r--externals/gridflow/pd_examples/drag_rectangle.pd110
-rw-r--r--externals/gridflow/pd_examples/eclipse.pd80
-rw-r--r--externals/gridflow/pd_examples/epicycloid.pd125
-rw-r--r--externals/gridflow/pd_examples/feedback_fractal.pd147
-rw-r--r--externals/gridflow/pd_examples/fire.pd180
-rw-r--r--externals/gridflow/pd_examples/game_of_life.pd67
-rw-r--r--externals/gridflow/pd_examples/goop.pd138
-rw-r--r--externals/gridflow/pd_examples/hello-world.pd38
-rw-r--r--externals/gridflow/pd_examples/image_stats.pd62
-rw-r--r--externals/gridflow/pd_examples/linear_transform.pd123
-rw-r--r--externals/gridflow/pd_examples/motion_detect.pd44
-rw-r--r--externals/gridflow/pd_examples/nervous_video.pd154
-rw-r--r--externals/gridflow/pd_examples/photo_pianoroll.pd159
-rw-r--r--externals/gridflow/pd_examples/plot.pd73
-rw-r--r--externals/gridflow/pd_examples/polygon.pd113
-rw-r--r--externals/gridflow/pd_examples/ripple.pd190
-rw-r--r--externals/gridflow/pd_examples/sand.pd417
-rw-r--r--externals/gridflow/pd_examples/saturation.pd81
-rw-r--r--externals/gridflow/pd_examples/scratch_video.pd124
-rw-r--r--externals/gridflow/pd_examples/spectrogram.pd109
-rw-r--r--externals/gridflow/pd_examples/threshold.pd81
-rw-r--r--externals/gridflow/pd_examples/transform.pd61
-rw-r--r--externals/gridflow/pd_examples/videodev_effects.pd303
-rw-r--r--externals/gridflow/pd_examples/waves.pd339
-rw-r--r--externals/gridflow/pd_help/@!.pd65
-rw-r--r--externals/gridflow/pd_help/@.pd115
-rw-r--r--externals/gridflow/pd_help/@apply_colormap_channelwise.pd29
-rw-r--r--externals/gridflow/pd_help/@cast.pd46
-rw-r--r--externals/gridflow/pd_help/@checkers.pd13
-rw-r--r--externals/gridflow/pd_help/@complex_sq.pd27
-rw-r--r--externals/gridflow/pd_help/@convolve.pd40
-rw-r--r--externals/gridflow/pd_help/@downscale_by.pd26
-rw-r--r--externals/gridflow/pd_help/@draw_polygon.pd36
-rw-r--r--externals/gridflow/pd_help/@finished.pd15
-rw-r--r--externals/gridflow/pd_help/@fold.pd39
-rw-r--r--externals/gridflow/pd_help/@foldinnerouter.pd94
-rw-r--r--externals/gridflow/pd_help/@for.pd16
-rw-r--r--externals/gridflow/pd_help/@global.pd9
-rw-r--r--externals/gridflow/pd_help/@grade.pd20
-rw-r--r--externals/gridflow/pd_help/@greyscale_to_rgb.pd21
-rw-r--r--externals/gridflow/pd_help/@importexport.pd51
-rw-r--r--externals/gridflow/pd_help/@inner2.pd17
-rw-r--r--externals/gridflow/pd_help/@inout.pd63
-rw-r--r--externals/gridflow/pd_help/@join.pd42
-rw-r--r--externals/gridflow/pd_help/@layer.pd46
-rw-r--r--externals/gridflow/pd_help/@perspective.pd29
-rw-r--r--externals/gridflow/pd_help/@posterize.pd36
-rw-r--r--externals/gridflow/pd_help/@print.pd28
-rw-r--r--externals/gridflow/pd_help/@ravel.pd31
-rw-r--r--externals/gridflow/pd_help/@redim.pd21
-rw-r--r--externals/gridflow/pd_help/@rgb_to_greyscale.pd19
-rw-r--r--externals/gridflow/pd_help/@scale_by.pd30
-rw-r--r--externals/gridflow/pd_help/@scale_to.pd34
-rw-r--r--externals/gridflow/pd_help/@scan.pd26
-rw-r--r--externals/gridflow/pd_help/@solarize.pd25
-rw-r--r--externals/gridflow/pd_help/@spread.pd64
-rw-r--r--externals/gridflow/pd_help/@store.pd48
-rw-r--r--externals/gridflow/pd_help/@twothreefour.pd70
-rw-r--r--externals/gridflow/pd_help/help_count.pd15
-rw-r--r--externals/gridflow/pd_help/help_fade.pd19
-rw-r--r--externals/gridflow/pd_help/help_motion_detect.pd76
-rw-r--r--externals/gridflow/pd_help/help_mouse.pd55
-rw-r--r--externals/gridflow/pd_help/printargs.pd10
-rw-r--r--externals/gridflow/pd_help/rubyprint.pd26
98 files changed, 6800 insertions, 0 deletions
diff --git a/externals/gridflow/pd_abstractions/#apply_colormap_channelwise.pd b/externals/gridflow/pd_abstractions/#apply_colormap_channelwise.pd
new file mode 100644
index 00000000..2402036a
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#apply_colormap_channelwise.pd
@@ -0,0 +1,12 @@
+#N canvas 0 0 450 300 10;
+#X obj 17 17 inlet;
+#X obj 17 37 #outer & ( -1 0 );
+#X obj 17 57 # + ( 3 2 # 0 0 0 1 0 2 );
+#X obj 17 77 #store;
+#X obj 17 97 outlet;
+#X obj 67 17 inlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 3 1;
diff --git a/externals/gridflow/pd_abstractions/#camera.pd b/externals/gridflow/pd_abstractions/#camera.pd
new file mode 100644
index 00000000..71780ad0
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#camera.pd
@@ -0,0 +1,149 @@
+#N canvas 192 66 485 362 10;
+#X obj 132 83 hradio 18 1 0 4 \$0-channel \$0-channel _0__1__2__3_
+0 14 0 8 -241291 -258699 -1 1;
+#X obj 299 31 hsl 128 15 0 65535 0 0 \$0-brightness \$0-brightness
+brightness 8 8 0 8 -260818 -1 -1 10250 1;
+#X obj 299 71 hsl 128 15 0 65535 0 0 \$0-hue \$0-hue hue 8 8 0 8 -260818
+-1 -1 6600 1;
+#X obj 299 11 hsl 128 15 0 65535 0 0 \$0-contrast \$0-contrast contrast
+8 8 0 8 -260818 -1 -1 8800 1;
+#X obj 299 91 hsl 128 15 0 65635 0 0 \$0-whiteness \$0-whiteness whiteness
+8 8 0 8 -260818 -1 -1 0 1;
+#N canvas 256 168 546 412 camera 0;
+#X obj 20 387 outlet;
+#X obj 11 9 inlet;
+#X msg 160 126 contrast \$1;
+#X msg 160 186 whiteness \$1;
+#X msg 160 106 brightness \$1;
+#X msg 160 227 channel \$1;
+#X obj 270 106 r \$0-brightness;
+#X obj 270 126 r \$0-contrast;
+#X obj 270 186 r \$0-whiteness;
+#X obj 153 276 r \$0-size;
+#X obj 270 226 r \$0-channel;
+#X obj 270 166 r \$0-hue;
+#X msg 160 166 hue \$1;
+#X msg 160 146 colour \$1;
+#X obj 270 146 r \$0-colour;
+#X obj 23 198 t a;
+#X msg 319 382 open videodev \$1 \, get;
+#X obj 318 363 rubysprintf /dev/video%d;
+#X msg 160 206 frequency \$1;
+#X obj 270 206 r \$0-frequency;
+#X obj 318 344 r \$0-device;
+#X obj 153 346 #export_list;
+#X msg 153 295 list \$1;
+#X msg 154 365 size \$1 \$2;
+#X obj 153 314 #store ( 4 2 # 120 160 240 320 480 640 120 180 240 360
+480 720 );
+#X obj 12 98 rubysprintf %d-%s;
+#X obj 11 117 pack s f;
+#X obj 12 77 t a a;
+#X msg 68 77 \$3;
+#X msg 11 136 \; \$1 \$2;
+#X obj 11 56 messageprepend \$0;
+#X msg 160 247 tuner \$1;
+#X obj 270 246 r \$0-tuner;
+#X connect 1 0 30 0;
+#X connect 2 0 15 0;
+#X connect 3 0 15 0;
+#X connect 4 0 15 0;
+#X connect 5 0 15 0;
+#X connect 6 0 4 0;
+#X connect 7 0 2 0;
+#X connect 8 0 3 0;
+#X connect 9 0 22 0;
+#X connect 10 0 5 0;
+#X connect 11 0 12 0;
+#X connect 12 0 15 0;
+#X connect 13 0 15 0;
+#X connect 14 0 13 0;
+#X connect 15 0 0 0;
+#X connect 16 0 0 0;
+#X connect 17 0 16 0;
+#X connect 18 0 15 0;
+#X connect 19 0 18 0;
+#X connect 20 0 17 0;
+#X connect 21 0 23 0;
+#X connect 22 0 24 0;
+#X connect 23 0 0 0;
+#X connect 24 0 21 0;
+#X connect 25 0 26 0;
+#X connect 26 0 29 0;
+#X connect 27 0 25 0;
+#X connect 27 1 28 0;
+#X connect 28 0 26 1;
+#X connect 30 0 27 0;
+#X connect 31 0 15 0;
+#X connect 32 0 31 0;
+#X restore 49 115 pd camera;
+#X msg 317 236 colorspace YUV420P;
+#X obj 66 177 #yuv_to_rgb;
+#X obj 299 51 hsl 128 15 0 65535 0 0 \$0-colour \$0-colour colour 8
+8 0 8 -260818 -1 -1 12700 1;
+#X obj 133 21 vradio 15 1 0 3 \$0-size \$0-size empty 0 -6 0 8 -241291
+-258699 -1 1;
+#X text 151 21 120 \, 160;
+#X text 151 37 240 \, 320;
+#X text 151 52 480 \, 640;
+#X text 131 6 select size;
+#X text 132 68 select channel;
+#X obj 240 12 nbx 5 14 0 65535 0 0 \$0-contrast \$0-contrast empty
+0 -6 0 10 -260818 -1 -1 45410 256;
+#X obj 240 32 nbx 5 14 0 65535 0 0 \$0-brightness \$0-brightness empty
+0 -6 0 10 -260818 -1 -1 52892 256;
+#X obj 240 52 nbx 5 14 0 65535 0 0 \$0-colour \$0-colour empty 0 -6
+0 10 -260818 -1 -1 65535 256;
+#X obj 240 72 nbx 5 14 0 65535 0 0 \$0-hue \$0-hue empty 0 -6 0 10
+-260818 -1 -1 34058 256;
+#X obj 240 92 nbx 5 14 0 65535 0 0 \$0-whiteness \$0-whiteness empty
+0 -6 0 10 -260818 -1 -1 0 256;
+#X text 17 6 Select a camera;
+#X msg 317 156 transfer mmap;
+#X msg 317 196 transfer read;
+#X msg 317 216 colorspace RGB24;
+#X text 316 140 Special options:;
+#X obj 22 115 #in;
+#X obj 22 245 outlet image;
+#X obj 21 33 hradio 18 1 0 4 \$0-device \$0-device _0__1__2__3_ 0 -4
+0 8 -241291 -258699 -1 0;
+#X obj 22 148 shunt 2;
+#X obj 141 206 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -258699
+-1 0;
+#X text 161 221 YUV->RGB;
+#X text 161 205 no conversion;
+#X obj 23 96 inlet;
+#X obj 66 198 # min 255;
+#X obj 66 217 # max 0;
+#X msg 317 176 transfer mmap 4;
+#X obj 132 117 hradio 18 1 0 4 \$0-tuner \$0-tuner _0__1__2__3_ 0 14
+0 8 -241291 -258699 -1 0;
+#X text 132 102 select tuner;
+#X obj 299 121 hsl 128 15 0 65635 0 0 \$0-frequency \$0-frequency frequency
+8 8 0 8 -62784 -44926 -44926 0 1;
+#X obj 240 122 nbx 5 14 0 65535 0 0 \$0-frequency \$0-frequency empty
+0 -6 0 10 -62784 -44926 -44926 0 256;
+#X obj 21 271 \$0;
+#X obj 47 272 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 305 257 s \$0-o;
+#X msg 21 290 \; \$1-device 0 \; \$1-size 1 \; \$1-channel 1;
+#X obj 62 95 r \$0-o;
+#X connect 5 0 25 0;
+#X connect 6 0 42 0;
+#X connect 7 0 33 0;
+#X connect 21 0 42 0;
+#X connect 22 0 42 0;
+#X connect 23 0 42 0;
+#X connect 25 0 28 0;
+#X connect 25 1 5 0;
+#X connect 28 0 26 0;
+#X connect 28 1 7 0;
+#X connect 29 0 28 1;
+#X connect 32 0 25 0;
+#X connect 33 0 34 0;
+#X connect 34 0 26 0;
+#X connect 35 0 42 0;
+#X connect 40 0 43 0;
+#X connect 41 0 40 0;
+#X connect 44 0 25 0;
diff --git a/externals/gridflow/pd_abstractions/#camera_control.pd b/externals/gridflow/pd_abstractions/#camera_control.pd
new file mode 100644
index 00000000..c759fd23
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#camera_control.pd
@@ -0,0 +1,129 @@
+#N canvas 287 295 576 286 10;
+#X obj 50 265 outlet;
+#X obj 239 124 hradio 18 1 0 4 \$0-channel \$0-channel _0__1__2__3_
+0 -4 0 8 -241291 -258699 -1 0;
+#X obj 413 63 hsl 128 15 0 65535 0 0 \$0-brightness \$0-brightness
+brightness 8 8 0 8 -260818 -1 -1 0 1;
+#X obj 413 103 hsl 128 15 0 65535 0 0 \$0-hue \$0-hue hue 8 8 0 8 -260818
+-1 -1 0 1;
+#X obj 413 43 hsl 128 15 0 65535 0 0 \$0-contrast \$0-contrast contrast
+8 8 0 8 -260818 -1 -1 0 1;
+#X obj 413 123 hsl 128 15 0 65635 0 0 \$0-whiteness \$0-whiteness whiteness
+8 8 0 8 -260818 -1 -1 0 1;
+#X text 119 245 <-- open to access more camera controls;
+#N canvas 170 20 420 404 camera 0;
+#X obj 9 362 outlet;
+#X obj 9 8 inlet;
+#X msg 66 153 contrast \$1;
+#X msg 66 213 whiteness \$1;
+#X msg 66 133 brightness \$1;
+#X msg 171 383 size 120 160;
+#X msg 190 363 size 240 320;
+#X msg 209 343 size 480 640;
+#X msg 72 277 channel \$1;
+#X obj 176 133 r \$0-brightness;
+#X obj 176 153 r \$0-contrast;
+#X obj 176 213 r \$0-whiteness;
+#X obj 171 299 r \$0-size;
+#X obj 182 277 r \$0-channel;
+#X obj 176 193 r \$0-hue;
+#X msg 66 193 hue \$1;
+#X msg 66 173 colour \$1;
+#X obj 176 173 r \$0-colour;
+#X obj 171 319 sel 0 1 2;
+#X obj 67 55 s \$0-brightness;
+#X obj 77 75 s \$0-contrast;
+#X obj 197 55 s \$0-colour;
+#X obj 207 75 s \$0-hue;
+#X obj 217 95 s \$0-whiteness;
+#X obj 32 245 t a;
+#X obj 9 35 route symbol brightness contrast colour hue whiteness;
+#X msg 9 109 open videodev \$1 \, get;
+#X connect 1 0 25 0;
+#X connect 2 0 24 0;
+#X connect 3 0 24 0;
+#X connect 4 0 24 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 4 0;
+#X connect 10 0 2 0;
+#X connect 11 0 3 0;
+#X connect 12 0 18 0;
+#X connect 13 0 8 0;
+#X connect 14 0 15 0;
+#X connect 15 0 24 0;
+#X connect 16 0 24 0;
+#X connect 17 0 16 0;
+#X connect 18 0 5 0;
+#X connect 18 1 6 0;
+#X connect 18 2 7 0;
+#X connect 24 0 0 0;
+#X connect 25 0 26 0;
+#X connect 25 1 19 0;
+#X connect 25 2 20 0;
+#X connect 25 3 21 0;
+#X connect 25 4 22 0;
+#X connect 25 5 23 0;
+#X connect 25 6 0 0;
+#X connect 26 0 0 0;
+#X restore 50 245 pd camera;
+#X msg 83 196 colorspace YUV420P;
+#X text 218 196 <-- click here if your webcam uses this colorspace
+;
+#X obj 103 222 #yuv_to_rgb;
+#X text 185 222 <-- add this after [#in] to translate the colorspaces
+;
+#X obj 413 83 hsl 128 15 0 65535 0 0 \$0-colour \$0-colour colour 8
+8 0 8 -260818 -1 -1 0 1;
+#X text 98 266 plug this to #in;
+#X obj 241 53 vradio 15 1 0 3 \$0-size \$0-size empty 0 -6 0 8 -241291
+-258699 -1 0;
+#X text 259 53 120 \, 160;
+#X text 259 69 240 \, 320;
+#X text 259 84 480 \, 640;
+#X text 239 38 select size;
+#X text 239 101 select channel;
+#X obj 10 245 inlet;
+#X obj 354 44 nbx 5 14 0 65535 0 0 \$0-contrast \$0-contrast empty
+0 -6 0 10 -260818 -1 -1 0 256;
+#X obj 354 64 nbx 5 14 0 65535 0 0 \$0-brightness \$0-brightness empty
+0 -6 0 10 -260818 -1 -1 0 256;
+#X obj 354 84 nbx 5 14 0 65535 0 0 \$0-colour \$0-colour empty 0 -6
+0 10 -260818 -1 -1 0 256;
+#X obj 354 104 nbx 5 14 0 65535 0 0 \$0-hue \$0-hue empty 0 -6 0 10
+-260818 -1 -1 0 256;
+#X obj 354 124 nbx 5 14 0 65535 0 0 \$0-whiteness \$0-whiteness empty
+0 -6 0 10 -260818 -1 -1 0 256;
+#X msg 50 28 symbol /dev/video0;
+#X msg 50 48 symbol /dev/video1;
+#X msg 50 68 symbol /dev/video2;
+#X msg 50 88 symbol /dev/video3;
+#X text 17 6 Select a camera;
+#X obj 31 28 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X obj 31 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X obj 31 68 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X obj 31 88 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X msg 81 133 transfer mmap;
+#X msg 81 153 transfer read;
+#X msg 83 176 colorspace RGB24;
+#X text 70 115 Special options:;
+#X connect 7 0 0 0;
+#X connect 8 0 7 0;
+#X connect 20 0 7 0;
+#X connect 26 0 7 0;
+#X connect 27 0 7 0;
+#X connect 28 0 7 0;
+#X connect 29 0 7 0;
+#X connect 31 0 26 0;
+#X connect 32 0 27 0;
+#X connect 33 0 28 0;
+#X connect 34 0 29 0;
+#X connect 35 0 7 0;
+#X connect 36 0 7 0;
+#X connect 37 0 7 0;
diff --git a/externals/gridflow/pd_abstractions/#centre_of_gravity.pd b/externals/gridflow/pd_abstractions/#centre_of_gravity.pd
new file mode 100644
index 00000000..543b409d
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#centre_of_gravity.pd
@@ -0,0 +1,113 @@
+#N canvas 311 42 543 559 10;
+#X obj 166 26 inlet;
+#X obj 51 106 #rgb_to_greyscale;
+#X obj 51 162 #fold +;
+#X obj 51 188 # >> 8;
+#N canvas 0 0 450 300 gravity 0;
+#X obj 77 20 inlet;
+#X obj 75 276 outlet;
+#X obj 77 54 t a a;
+#X obj 41 90 #finished;
+#X obj 125 79 #dim;
+#X obj 126 105 #fold +;
+#X obj 68 140 #for 0 0 1;
+#X obj 172 190 #fold +;
+#X obj 72 179 # *;
+#X obj 72 199 #fold +;
+#X obj 72 249 # /;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 2 1 7 0;
+#X connect 2 1 8 1;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 6 0 8 0;
+#X connect 7 0 10 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X restore 36 221 pd gravity;
+#X obj 50 244 #export;
+#X obj 84 277 #two;
+#X obj 85 301 #export_list;
+#X obj 86 367 # ==;
+#X obj 51 132 #fold +;
+#X obj 85 344 #for ( 0 0 ) ( 288 352 ) ( 1 1 );
+#X obj 264 253 #finished;
+#X obj 86 388 #fold |;
+#X obj 194 319 inlet;
+#X obj 98 441 #finished;
+#X obj 98 469 #store;
+#X obj 110 499 #outer * ( 255 -255 -255 );
+#X obj 112 520 # +;
+#X obj 112 540 # min 255;
+#X obj 112 560 # max 0;
+#X obj 112 586 outlet;
+#X obj 122 162 #fold +;
+#X obj 122 189 # >> 8;
+#N canvas 0 0 450 300 gravity 0;
+#X obj 77 20 inlet;
+#X obj 75 276 outlet;
+#X obj 77 54 t a a;
+#X obj 41 90 #finished;
+#X obj 125 79 #dim;
+#X obj 126 105 #fold +;
+#X obj 68 140 #for 0 0 1;
+#X obj 172 190 #fold +;
+#X obj 72 179 # *;
+#X obj 72 199 #fold +;
+#X obj 72 249 # /;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 2 1 7 0;
+#X connect 2 1 8 1;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 6 0 8 0;
+#X connect 7 0 10 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X restore 134 219 pd gravity;
+#X obj 141 242 #export;
+#X obj 9 352 print list;
+#X obj 91 414 fork;
+#X obj 166 51 fork;
+#X obj 9 332 outlet;
+#X obj 122 134 #transpose;
+#X connect 0 0 27 0;
+#X connect 1 0 9 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 7 0 28 0;
+#X connect 8 0 12 0;
+#X connect 9 0 2 0;
+#X connect 9 0 29 0;
+#X connect 10 0 8 0;
+#X connect 11 0 10 0;
+#X connect 12 0 26 0;
+#X connect 13 0 10 1;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 21 0 22 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 24 0 6 1;
+#X connect 26 0 14 0;
+#X connect 26 1 15 1;
+#X connect 27 0 11 0;
+#X connect 27 0 1 0;
+#X connect 27 1 17 1;
+#X connect 29 0 21 0;
diff --git a/externals/gridflow/pd_abstractions/#centroid.pd b/externals/gridflow/pd_abstractions/#centroid.pd
new file mode 100644
index 00000000..646b828a
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#centroid.pd
@@ -0,0 +1,80 @@
+#N canvas 494 135 339 225 10;
+#X obj -63 82 #fold +;
+#X obj -63 101 # >> 8;
+#N canvas 0 0 450 300 gravity 0;
+#X obj 77 20 inlet;
+#X obj 75 276 outlet;
+#X obj 77 54 t a a;
+#X obj 41 90 #finished;
+#X obj 125 79 #dim;
+#X obj 126 105 #fold +;
+#X obj 68 140 #for 0 0 1;
+#X obj 172 190 #fold +;
+#X obj 72 179 # *;
+#X obj 72 199 #fold +;
+#X obj 72 249 # /;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 2 1 7 0;
+#X connect 2 1 8 1;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 6 0 8 0;
+#X connect 7 0 10 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X restore -63 120 pd gravity;
+#X obj -63 139 #export;
+#X obj -63 25 #fold +;
+#X obj 30 83 #fold +;
+#X obj 30 102 # >> 8;
+#N canvas 0 0 450 300 gravity 0;
+#X obj 77 20 inlet;
+#X obj 75 276 outlet;
+#X obj 77 54 t a a;
+#X obj 41 90 #finished;
+#X obj 125 79 #dim;
+#X obj 126 105 #fold +;
+#X obj 68 140 #for 0 0 1;
+#X obj 172 190 #fold +;
+#X obj 72 179 # *;
+#X obj 72 199 #fold +;
+#X obj 72 249 # /;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 2 1 7 0;
+#X connect 2 1 8 1;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 6 0 8 0;
+#X connect 7 0 10 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X restore 30 121 pd gravity;
+#X obj 30 140 #export;
+#X obj 30 63 #transpose;
+#X obj -63 44 t a a;
+#X obj -63 178 #pack 2;
+#X obj -63 197 outlet position;
+#X obj -63 6 inlet greyscale_image;
+#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 10 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 11 1;
+#X connect 9 0 5 0;
+#X connect 10 0 0 0;
+#X connect 10 1 9 0;
+#X connect 11 0 12 0;
+#X connect 13 0 4 0;
+#X coords 0 0 5.43251e-06 7.95071e-06 100 40 0;
diff --git a/externals/gridflow/pd_abstractions/#checkers.pd b/externals/gridflow/pd_abstractions/#checkers.pd
new file mode 100644
index 00000000..24ca52eb
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#checkers.pd
@@ -0,0 +1,18 @@
+#N canvas 0 0 450 300 10;
+#X obj 18 14 inlet;
+#X obj 18 34 # >> 3;
+#X obj 18 54 # & 1;
+#X obj 18 74 #fold ^;
+#X obj 18 94 # inv+;
+#X obj 18 114 # & 63;
+#X obj 18 134 # + 128;
+#X obj 18 154 #outer ignore ( 0 0 0 );
+#X obj 18 174 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
diff --git a/externals/gridflow/pd_abstractions/#clip.pd b/externals/gridflow/pd_abstractions/#clip.pd
new file mode 100644
index 00000000..c96553c0
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#clip.pd
@@ -0,0 +1,20 @@
+#N canvas 531 259 450 300 10;
+#X obj 87 22 inlet;
+#X obj 87 206 outlet;
+#X obj 87 94 # min \$1;
+#X obj 87 143 # max \$2;
+#X obj 196 38 inlet;
+#X obj 249 108 inlet;
+#X msg 132 59 255;
+#X obj 132 39 loadbang;
+#X obj 184 106 loadbang;
+#X msg 184 126 0;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 1;
+#X connect 5 0 3 1;
+#X connect 6 0 2 1;
+#X connect 7 0 6 0;
+#X connect 8 0 9 0;
+#X connect 9 0 3 1;
diff --git a/externals/gridflow/pd_abstractions/#color.pd b/externals/gridflow/pd_abstractions/#color.pd
new file mode 100644
index 00000000..bd97d09b
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#color.pd
@@ -0,0 +1,68 @@
+#N canvas 648 305 209 58 10;
+#X floatatom 3 29 5 0 0 0 - - -;
+#X obj 75 28 hsl 128 15 0 255 0 0 empty empty empty -2 -6 0 8 -225271
+-24198 -1 0 1;
+#X obj 75 43 hsl 128 15 0 255 0 0 empty empty empty -2 -6 0 8 -228992
+-62784 -1 0 1;
+#X floatatom 3 44 5 0 0 0 - - -;
+#X obj 75 13 hsl 128 15 0 255 0 0 empty empty empty -2 -6 0 8 -261689
+-258699 -1 0 1;
+#X floatatom 3 14 5 0 0 0 - - -;
+#X obj 3 76 #pack 3;
+#X obj 209 36 #export_list;
+#X obj 210 55 unpack 0 0 0;
+#X obj 208 17 inlet rgb_color;
+#X obj 56 75 outlet rgb_color;
+#X obj 43 12 int;
+#X obj 43 27 int;
+#X obj 43 42 int;
+#X obj 196 2 cnv 10 60 10 empty \$0-cnv empty 20 12 0 14 -262144 -262144
+0;
+#X obj 125 192 s \$0-cnv;
+#X msg 125 172 color \$1;
+#X obj 4 154 #export;
+#X obj 3 133 # ^ -1;
+#X obj 3 114 #fold |;
+#X obj 3 95 # << ( 16 8 0 );
+#X obj 194 75 loadbang;
+#X msg 194 151 range \$1 \$2;
+#X obj 194 132 #export_list;
+#X obj 194 94 listmake \$1 \$2;
+#X obj 194 113 # || ( 0 255 );
+#X obj 59 134 loadbang;
+#X obj 88 154 - \$3;
+#X msg 59 154 1;
+#X obj 3 180 spigot;
+#X connect 0 0 6 1;
+#X connect 1 0 12 0;
+#X connect 2 0 13 0;
+#X connect 3 0 6 2;
+#X connect 4 0 11 0;
+#X connect 5 0 6 0;
+#X connect 6 0 10 0;
+#X connect 6 0 20 0;
+#X connect 7 0 8 0;
+#X connect 8 0 4 0;
+#X connect 8 1 1 0;
+#X connect 8 2 2 0;
+#X connect 9 0 7 0;
+#X connect 11 0 5 0;
+#X connect 12 0 0 0;
+#X connect 13 0 3 0;
+#X connect 16 0 15 0;
+#X connect 17 0 29 0;
+#X connect 18 0 17 0;
+#X connect 19 0 18 0;
+#X connect 20 0 19 0;
+#X connect 21 0 24 0;
+#X connect 22 0 2 0;
+#X connect 22 0 1 0;
+#X connect 22 0 4 0;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 25 0 23 0;
+#X connect 26 0 28 0;
+#X connect 27 0 29 1;
+#X connect 28 0 27 0;
+#X connect 29 0 16 0;
+#X coords 0 0 1 1 120 56 1;
diff --git a/externals/gridflow/pd_abstractions/#contrast.pd b/externals/gridflow/pd_abstractions/#contrast.pd
new file mode 100644
index 00000000..13549341
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#contrast.pd
@@ -0,0 +1,20 @@
+#N canvas 0 0 450 300 10;
+#X obj 14 14 inlet;
+#X obj 14 34 # inv+ 255;
+#X obj 14 54 # *>>8;
+#X obj 14 74 # inv+ 255;
+#X obj 14 94 # *>>8;
+#X obj 14 114 # min 255;
+#X obj 14 134 # max 0;
+#X obj 14 154 outlet;
+#X obj 54 14 inlet;
+#X obj 94 14 inlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 8 0 2 1;
+#X connect 9 0 4 1;
diff --git a/externals/gridflow/pd_abstractions/#fade.pd b/externals/gridflow/pd_abstractions/#fade.pd
new file mode 100644
index 00000000..ade53918
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#fade.pd
@@ -0,0 +1,37 @@
+#N canvas 398 352 418 256 10;
+#X obj 21 65 inlet;
+#X obj 21 233 outlet;
+#X obj 21 85 # +;
+#X obj 78 199 # *;
+#X obj 190 108 float \$1;
+#X obj 190 88 loadbang;
+#X obj 156 64 inlet;
+#X text 20 7 new = (x-1)/x of old input + 1/x of new input;
+#X obj 173 180 # - 1;
+#X text 198 65 select fade rate;
+#X text 61 65 input;
+#X text 70 236 output;
+#X obj 21 106 # +;
+#X obj 127 169 # / 2;
+#X obj 156 86 t a;
+#X text 19 21 now rounds to closest;
+#X obj 21 127 # *>>8;
+#X obj 70 128 # inv* 256;
+#X obj 21 213 t a a;
+#X text 19 34 also faster (uses *>>8 instead of /);
+#X connect 0 0 2 0;
+#X connect 2 0 12 0;
+#X connect 3 0 2 1;
+#X connect 4 0 14 0;
+#X connect 5 0 4 0;
+#X connect 6 0 14 0;
+#X connect 8 0 3 1;
+#X connect 12 0 16 0;
+#X connect 13 0 12 1;
+#X connect 14 0 13 0;
+#X connect 14 0 8 0;
+#X connect 14 0 17 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 1;
+#X connect 18 0 1 0;
+#X connect 18 1 3 0;
diff --git a/externals/gridflow/pd_abstractions/#fade_lin.pd b/externals/gridflow/pd_abstractions/#fade_lin.pd
new file mode 100644
index 00000000..22054260
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#fade_lin.pd
@@ -0,0 +1,29 @@
+#N canvas 614 446 450 300 10;
+#X obj 68 16 inlet;
+#X obj 92 146 outlet;
+#X obj 95 61 # -;
+#X obj 155 16 inlet;
+#X obj 65 123 # +;
+#X obj 95 124 t a;
+#X obj 155 36 f \$1;
+#X obj 140 101 # inv+ 0;
+#X obj 296 38 loadbang;
+#X obj 78 101 # max -1;
+#X obj 78 81 # min 1;
+#X obj 195 16 inlet;
+#X obj 195 37 f \$2;
+#X connect 0 0 2 0;
+#X connect 2 0 10 0;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 4 1;
+#X connect 5 0 1 0;
+#X connect 5 0 2 1;
+#X connect 6 0 10 1;
+#X connect 7 0 9 1;
+#X connect 8 0 6 0;
+#X connect 8 0 12 0;
+#X connect 9 0 4 0;
+#X connect 10 0 9 0;
+#X connect 11 0 12 0;
+#X connect 12 0 7 0;
diff --git a/externals/gridflow/pd_abstractions/#greyscale_to_rgb.pd b/externals/gridflow/pd_abstractions/#greyscale_to_rgb.pd
new file mode 100644
index 00000000..612bcb14
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#greyscale_to_rgb.pd
@@ -0,0 +1,8 @@
+#N canvas 550 233 335 174 10;
+#X obj 10 10 inlet;
+#X obj 10 70 outlet;
+#X obj 10 30 #fold put;
+#X obj 10 50 #outer ignore ( 0 0 0 );
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
diff --git a/externals/gridflow/pd_abstractions/#hueshift.pd b/externals/gridflow/pd_abstractions/#hueshift.pd
new file mode 100644
index 00000000..028801ea
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#hueshift.pd
@@ -0,0 +1,31 @@
+#N canvas 581 130 450 278 10;
+#X obj 13 105 inlet;
+#X obj 13 162 outlet;
+#X obj 59 48 #rgb_to_yuv;
+#X obj 59 124 #yuv_to_rgb;
+#X obj 59 67 # - 128;
+#X obj 59 105 # + 128;
+#X obj 171 10 inlet;
+#X obj 59 86 #rotate \, axis 1 2 3;
+#X obj 59 7 loadbang;
+#X obj 171 29 t b f;
+#X obj 212 29 \$1;
+#X obj 212 10 loadbang;
+#X obj 13 124 #inner;
+#X msg 59 29 3 3 # 256 0 0 0;
+#X obj 13 143 # >> 8;
+#X connect 0 0 12 0;
+#X connect 2 0 4 0;
+#X connect 3 0 12 1;
+#X connect 4 0 7 0;
+#X connect 5 0 3 0;
+#X connect 6 0 9 0;
+#X connect 7 0 5 0;
+#X connect 8 0 13 0;
+#X connect 9 0 13 0;
+#X connect 9 1 7 1;
+#X connect 10 0 9 0;
+#X connect 11 0 10 0;
+#X connect 12 0 14 0;
+#X connect 13 0 2 0;
+#X connect 14 0 1 0;
diff --git a/externals/gridflow/pd_abstractions/#motion_detection.pd b/externals/gridflow/pd_abstractions/#motion_detection.pd
new file mode 100644
index 00000000..2867cd2c
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#motion_detection.pd
@@ -0,0 +1,64 @@
+#N canvas 70 26 572 517 10;
+#X msg 152 39 1;
+#X msg 152 63 0;
+#X text 188 37 <-- take a snapshot;
+#X text 190 64 <-- compare incoming images;
+#X obj 61 153 t a a;
+#X obj 62 206 # -;
+#X obj 62 366 # min 255;
+#X obj 62 341 # max 0;
+#X obj 62 295 # abs-;
+#X obj 102 178 spigot;
+#X obj 86 109 inlet;
+#X obj 63 491 outlet;
+#X obj 301 445 #fold +;
+#X obj 317 467 #fold +;
+#X obj 331 490 #fold +;
+#X obj 337 516 #export;
+#X obj 371 542 route int;
+#X obj 385 564 / 10000;
+#X msg 289 257 1;
+#X msg 302 286 0;
+#X obj 252 401 spigot;
+#X text 325 255 <-- output values;
+#X obj 91 411 # -;
+#X obj 150 406 r noise;
+#X obj 64 453 # max 0;
+#X obj 310 348 r displaced;
+#X text 339 281 <-- save your cpu some work and turn it off;
+#X obj 486 592 s displaced_numb;
+#X obj 163 121 r snapshot;
+#X obj 134 242 r emboss;
+#X obj 134 295 # + 128;
+#X obj 62 230 # << 2;
+#X obj 62 267 shunt 2;
+#X connect 0 0 9 1;
+#X connect 1 0 9 1;
+#X connect 4 0 9 0;
+#X connect 4 1 5 0;
+#X connect 5 0 31 0;
+#X connect 6 0 20 0;
+#X connect 6 0 22 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 5 1;
+#X connect 10 0 4 0;
+#X connect 12 0 13 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X connect 17 0 27 0;
+#X connect 18 0 20 1;
+#X connect 19 0 20 1;
+#X connect 20 0 12 0;
+#X connect 22 0 24 0;
+#X connect 23 0 22 1;
+#X connect 24 0 11 0;
+#X connect 25 0 20 1;
+#X connect 28 0 9 1;
+#X connect 29 0 32 1;
+#X connect 30 0 7 0;
+#X connect 31 0 32 0;
+#X connect 32 0 8 0;
+#X connect 32 1 30 0;
diff --git a/externals/gridflow/pd_abstractions/#mouse.pd b/externals/gridflow/pd_abstractions/#mouse.pd
new file mode 100644
index 00000000..7e87688e
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#mouse.pd
@@ -0,0 +1,93 @@
+#N canvas 313 211 690 428 10;
+#X obj 23 103 listsublist 0 2;
+#X obj 48 64 fork;
+#X obj 126 181 fork;
+#X text 153 149 is button pressed?;
+#X obj 129 209 -;
+#X obj 125 150 > 0;
+#X obj 183 86 listelement 2;
+#X obj 120 377 outlet;
+#X text 161 183 1=click \, 0=nochange \, -1=unclick;
+#X text 157 36 list (y \, x \, buttons);
+#X obj 49 8 inlet;
+#X obj 48 34 route position;
+#X text 93 8 compatible with output of [#out window];
+#X obj 142 246 inv+ 1;
+#X obj 98 397 outlet;
+#X obj 142 356 outlet;
+#X text 431 330 three toggle-compatible outputs;
+#X text 432 346 and one +1/0/-1 for the wheel;
+#X text 147 397 click;
+#X text 193 357 unclick;
+#X obj 468 60 listelement 2;
+#X obj 430 301 outlet;
+#X obj 480 301 outlet;
+#X obj 530 301 outlet;
+#X obj 580 301 outlet;
+#X obj 430 273 change;
+#X obj 108 63 fork;
+#X obj 468 86 #outer >> ( 8 9 10 11 12 );
+#X obj 469 115 # & 1;
+#X obj 469 173 unpack 0 0 0 0 0;
+#X obj 549 241 inv+;
+#X obj 480 274 change;
+#X obj 530 275 change;
+#X obj 580 276 change;
+#X obj 469 145 #export_list;
+#X obj 163 335 outlet;
+#X text 172 378 drag;
+#X text 214 337 move;
+#X obj 163 275 inv+ 1;
+#X obj 389 16 inlet;
+#X text 433 9 list of 3 toggles;
+#X text 434 23 which buttons should be active;
+#X obj 347 81 # << ( 8 9 10 );
+#X obj 345 107 #fold +;
+#X obj 345 131 #export;
+#X obj 125 126 &;
+#X text 151 126 check only wanted buttons;
+#X obj 305 33 loadbang;
+#X msg 305 57 1 1 1;
+#X obj 98 269 shunt 3;
+#X obj 120 302 shunt 2;
+#X connect 0 0 49 0;
+#X connect 1 0 0 0;
+#X connect 1 1 6 0;
+#X connect 2 0 4 1;
+#X connect 2 1 4 0;
+#X connect 2 1 38 0;
+#X connect 4 0 13 0;
+#X connect 5 0 2 0;
+#X connect 6 0 45 0;
+#X connect 10 0 11 0;
+#X connect 11 0 26 0;
+#X connect 13 0 49 1;
+#X connect 20 0 27 0;
+#X connect 25 0 21 0;
+#X connect 26 0 1 0;
+#X connect 26 1 20 0;
+#X connect 27 0 28 0;
+#X connect 28 0 34 0;
+#X connect 29 0 25 0;
+#X connect 29 1 31 0;
+#X connect 29 2 32 0;
+#X connect 29 3 30 0;
+#X connect 29 4 30 1;
+#X connect 30 0 33 0;
+#X connect 31 0 22 0;
+#X connect 32 0 23 0;
+#X connect 33 0 24 0;
+#X connect 34 0 29 0;
+#X connect 38 0 50 1;
+#X connect 39 0 42 0;
+#X connect 42 0 43 0;
+#X connect 43 0 44 0;
+#X connect 44 0 45 1;
+#X connect 45 0 5 0;
+#X connect 47 0 48 0;
+#X connect 48 0 42 0;
+#X connect 49 0 14 0;
+#X connect 49 1 50 0;
+#X connect 49 2 15 0;
+#X connect 50 0 7 0;
+#X connect 50 1 35 0;
diff --git a/externals/gridflow/pd_abstractions/#posterize.pd b/externals/gridflow/pd_abstractions/#posterize.pd
new file mode 100644
index 00000000..5e763eac
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#posterize.pd
@@ -0,0 +1,15 @@
+#N canvas 0 0 450 300 10;
+#X obj 13 11 inlet;
+#X obj 13 31 # *>>8;
+#X obj 13 51 # * 255;
+#X obj 13 71 # /;
+#X obj 92 31 # - 1;
+#X obj 13 91 outlet;
+#X obj 92 11 inlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 1;
+#X connect 6 0 4 0;
+#X connect 6 0 1 1;
diff --git a/externals/gridflow/pd_abstractions/#ravel.pd b/externals/gridflow/pd_abstractions/#ravel.pd
new file mode 100644
index 00000000..bf17742f
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#ravel.pd
@@ -0,0 +1,15 @@
+#N canvas 0 0 450 300 10;
+#X obj 14 15 inlet;
+#X obj 44 65 #dim;
+#X obj 44 85 #fold * \, seed 1;
+#X obj 44 105 #redim ( 1 );
+#X obj 14 125 #redim ( 42 );
+#X obj 14 35 t a a;
+#X obj 14 145 outlet;
+#X connect 0 0 5 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 1;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 5 1 1 0;
diff --git a/externals/gridflow/pd_abstractions/#remap_image.pd b/externals/gridflow/pd_abstractions/#remap_image.pd
new file mode 100644
index 00000000..d56eae88
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#remap_image.pd
@@ -0,0 +1,21 @@
+#N canvas 0 0 450 300 10;
+#X obj 18 13 inlet;
+#X obj 168 163 inlet;
+#X obj 18 160 #store;
+#X obj 113 90 #dim;
+#X obj 18 33 t a a;
+#X obj 18 110 #finished;
+#X obj 18 130 #for ( 0 0 ) ( 0 0 ) ( 1 1 );
+#X obj 18 191 outlet;
+#X obj 113 110 #inner ( 3 2 # 1 0 0 );
+#X obj 68 191 outlet;
+#X connect 0 0 4 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 0;
+#X connect 3 0 8 0;
+#X connect 4 0 5 0;
+#X connect 4 1 3 0;
+#X connect 4 1 2 1;
+#X connect 5 0 6 0;
+#X connect 6 0 9 0;
+#X connect 8 0 6 1;
diff --git a/externals/gridflow/pd_abstractions/#rgb_to_greyscale.pd b/externals/gridflow/pd_abstractions/#rgb_to_greyscale.pd
new file mode 100644
index 00000000..24c5c0d9
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#rgb_to_greyscale.pd
@@ -0,0 +1,10 @@
+#N canvas 550 233 335 174 10;
+#X obj 10 10 inlet;
+#X obj 10 30 # * ( 77 151 28 );
+#X obj 10 50 #fold +;
+#X obj 10 70 #outer >> ( 8 );
+#X obj 10 90 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
diff --git a/externals/gridflow/pd_abstractions/#rgb_to_yuv.pd b/externals/gridflow/pd_abstractions/#rgb_to_yuv.pd
new file mode 100644
index 00000000..c144dda0
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#rgb_to_yuv.pd
@@ -0,0 +1,10 @@
+#N canvas 550 233 438 174 10;
+#X obj 10 10 inlet;
+#X obj 10 90 outlet;
+#X obj 10 70 # + ( 0 128 128 );
+#X obj 10 50 # >> 8;
+#X obj 10 30 #inner ( 3 3 # 76 -44 128 150 -85 -108 29 128 -21 );
+#X connect 0 0 4 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
diff --git a/externals/gridflow/pd_abstractions/#solarize.pd b/externals/gridflow/pd_abstractions/#solarize.pd
new file mode 100644
index 00000000..62cf7b75
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#solarize.pd
@@ -0,0 +1,14 @@
+#N canvas 0 0 450 300 10;
+#X obj 15 14 inlet;
+#X obj 15 34 # & 255;
+#X obj 15 54 # << 1;
+#X obj 15 74 # inv+ 255;
+#X obj 15 114 # inv+ 255;
+#X obj 15 134 outlet;
+#X obj 15 94 # abs-;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 6 0 4 0;
diff --git a/externals/gridflow/pd_abstractions/#spread.pd b/externals/gridflow/pd_abstractions/#spread.pd
new file mode 100644
index 00000000..b86ed96e
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#spread.pd
@@ -0,0 +1,22 @@
+#N canvas 0 0 450 300 10;
+#X obj 17 12 inlet;
+#X obj 17 52 # & 0;
+#X obj 17 72 # + 5;
+#X obj 17 92 #! rand;
+#X obj 17 112 # - 2;
+#X obj 137 162 # +;
+#X obj 124 68 # >> 1;
+#X obj 17 32 t a a;
+#X obj 137 182 outlet;
+#X obj 124 32 inlet;
+#X connect 0 0 7 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 8 0;
+#X connect 6 0 4 1;
+#X connect 7 0 1 0;
+#X connect 7 1 5 1;
+#X connect 9 0 6 0;
+#X connect 9 0 2 1;
diff --git a/externals/gridflow/pd_abstractions/#text_to_image.pd b/externals/gridflow/pd_abstractions/#text_to_image.pd
new file mode 100644
index 00000000..f9d57480
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#text_to_image.pd
@@ -0,0 +1,41 @@
+#N canvas 305 189 450 300 10;
+#X obj 16 14 inlet text;
+#X obj 16 265 outlet image;
+#X obj 291 132 inlet font;
+#X obj 16 155 #store;
+#X obj 203 38 inlet colors;
+#X text 203 2 0: background;
+#X text 203 18 1: foreground;
+#X obj 203 66 t a;
+#X obj 16 174 #store;
+#X obj 229 66 loadbang;
+#X text 67 157 font;
+#X text 68 174 palette;
+#X obj 16 33 #outer ignore ( 0 );
+#X obj 16 212 t a a;
+#X obj 16 238 #redim ( );
+#X obj 154 161 #dim;
+#X obj 154 180 #unpack 4;
+#X obj 174 200 *;
+#X obj 16 193 #transpose 0 1;
+#X obj 154 228 pack 0 0 0;
+#X msg 229 85 2 3 # 0 0 0 255 255 255;
+#X connect 0 0 12 0;
+#X connect 2 0 3 1;
+#X connect 3 0 8 0;
+#X connect 4 0 7 0;
+#X connect 8 0 18 0;
+#X connect 9 0 20 0;
+#X connect 12 0 3 0;
+#X connect 13 0 14 0;
+#X connect 13 1 15 0;
+#X connect 14 0 1 0;
+#X connect 15 0 16 0;
+#X connect 16 0 19 0;
+#X connect 16 1 17 0;
+#X connect 16 2 17 1;
+#X connect 16 3 19 2;
+#X connect 17 0 19 1;
+#X connect 18 0 13 0;
+#X connect 19 0 14 1;
+#X connect 20 0 8 1;
diff --git a/externals/gridflow/pd_abstractions/#yuv_to_rgb.pd b/externals/gridflow/pd_abstractions/#yuv_to_rgb.pd
new file mode 100644
index 00000000..4856a10f
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/#yuv_to_rgb.pd
@@ -0,0 +1,10 @@
+#N canvas 550 233 438 174 10;
+#X obj 10 10 inlet;
+#X obj 10 90 outlet;
+#X obj 10 30 # - ( 0 128 128 );
+#X obj 10 70 # >> 8;
+#X obj 10 50 #inner ( 3 3 # 256 256 256 0 -88 454 358 -183 0 );
+#X connect 0 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 1 0;
+#X connect 4 0 3 0;
diff --git a/externals/gridflow/pd_abstractions/@complex_sq.pd b/externals/gridflow/pd_abstractions/@complex_sq.pd
new file mode 100644
index 00000000..9b05de81
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/@complex_sq.pd
@@ -0,0 +1,8 @@
+#N canvas 0 0 303 155 10;
+#X obj 17 15 inlet;
+#X obj 17 75 outlet;
+#X obj 17 35 #inner ( 2 2 2 # 0 2 1 -1 1 0 1 1 );
+#X obj 17 55 #fold * \, seed 1;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
diff --git a/externals/gridflow/pd_abstractions/count.pd b/externals/gridflow/pd_abstractions/count.pd
new file mode 100644
index 00000000..087bd40d
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/count.pd
@@ -0,0 +1,44 @@
+#N canvas 448 36 450 300 10;
+#X obj 131 81 + 1;
+#X obj 132 37 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 190 82 5 0 0 0 - - -;
+#X msg 131 61 1;
+#X obj 204 168 select 1;
+#X obj 191 195 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 70 39 inlet;
+#X obj 131 150 outlet;
+#X obj 239 80 inlet;
+#X obj 190 106 == \$2;
+#X floatatom 131 132 5 0 0 0 - - -;
+#X obj 191 218 outlet;
+#X obj 131 106 - 1;
+#X floatatom 191 130 5 0 0 0 - - -;
+#X obj 203 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 293 49 print;
+#X obj 222 63 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 192 38 float \$1;
+#X text 231 9 <-- bang this to reset;
+#X obj 219 -11 inlet;
+#X connect 0 0 2 0;
+#X connect 0 0 12 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 1;
+#X connect 2 0 9 0;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 4 0 17 0;
+#X connect 5 0 11 0;
+#X connect 6 0 1 0;
+#X connect 8 0 9 1;
+#X connect 9 0 13 0;
+#X connect 10 0 7 0;
+#X connect 12 0 10 0;
+#X connect 13 0 4 0;
+#X connect 14 0 17 0;
+#X connect 16 0 2 0;
+#X connect 17 0 2 0;
+#X connect 19 0 14 0;
diff --git a/externals/gridflow/pd_abstractions/pingpong.pd b/externals/gridflow/pd_abstractions/pingpong.pd
new file mode 100644
index 00000000..406c9d16
--- /dev/null
+++ b/externals/gridflow/pd_abstractions/pingpong.pd
@@ -0,0 +1,27 @@
+#N canvas 0 0 450 270 10;
+#X text 50 11 counter;
+#X obj 67 40 inlet;
+#X obj 67 83 %;
+#X obj 67 103 -;
+#X obj 164 49 inlet;
+#X text 163 32 maxvalue;
+#X obj 83 62 * 2;
+#X obj 67 124 abs;
+#X obj 67 185 outlet;
+#X text 123 184 values from 0 to maxvalue;
+#X obj 67 145 -;
+#X obj 67 165 * -1;
+#X obj 164 70 float \$1;
+#X obj 206 49 loadbang;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 7 0;
+#X connect 4 0 12 0;
+#X connect 6 0 2 1;
+#X connect 7 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 8 0;
+#X connect 12 0 6 0;
+#X connect 12 0 10 1;
+#X connect 12 0 3 1;
+#X connect 13 0 12 0;
diff --git a/externals/gridflow/pd_examples/binary_operations.pd b/externals/gridflow/pd_examples/binary_operations.pd
new file mode 100644
index 00000000..cf4df98a
--- /dev/null
+++ b/externals/gridflow/pd_examples/binary_operations.pd
@@ -0,0 +1,73 @@
+#N canvas 401 211 734 490 10;
+#X text 163 212 posterize;
+#X obj 99 187 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 143 187 hsl 59 15 2 8 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 65 103 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 87 361 # ^;
+#X obj 135 336 hsl 137 15 0 255 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 99 237 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X text 124 144 negative;
+#X obj 39 121 #in;
+#X text 146 361 munchies (XOR effect) in the colour domain;
+#X obj 39 187 shunt 2;
+#X obj 39 338 shunt 2;
+#X text 157 297 color wrapping;
+#X obj 88 261 # %;
+#X obj 98 338 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 87 164 # inv+ 255;
+#X obj 99 142 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 65 54 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 89 304 # /;
+#X obj 39 142 shunt 2;
+#X obj 39 423 #out window;
+#X obj 88 283 # * 255;
+#X obj 166 265 hsl 137 15 0 255 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 39 237 shunt 2;
+#X text 88 105 image loader;
+#X msg 65 121 open r001.jpg \, bang;
+#X obj 65 78 metro 33.3667;
+#X obj 87 212 #posterize;
+#X obj 8 456 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 16 463 GridFlow 0.8.0;
+#X obj 8 5 cnv 15 720 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 11 5 binary_operations.pd;
+#X text 222 143 <-- try various combinations of checkboxes and settings.
+then click on the image loader to see the result.;
+#X text 11 19 Copyright Mathieu Bouchard;
+#X connect 1 0 10 1;
+#X connect 2 0 27 1;
+#X connect 3 0 25 0;
+#X connect 4 0 20 0;
+#X connect 5 0 4 1;
+#X connect 6 0 23 1;
+#X connect 8 0 19 0;
+#X connect 10 0 23 0;
+#X connect 10 1 27 0;
+#X connect 11 0 20 0;
+#X connect 11 1 4 0;
+#X connect 13 0 21 0;
+#X connect 14 0 11 1;
+#X connect 15 0 10 0;
+#X connect 16 0 19 1;
+#X connect 17 0 26 0;
+#X connect 18 0 11 0;
+#X connect 19 0 10 0;
+#X connect 19 1 15 0;
+#X connect 21 0 18 0;
+#X connect 22 0 18 1;
+#X connect 22 0 13 1;
+#X connect 23 0 11 0;
+#X connect 23 1 13 0;
+#X connect 25 0 8 0;
+#X connect 26 0 3 0;
+#X connect 27 0 23 0;
diff --git a/externals/gridflow/pd_examples/blob.pd b/externals/gridflow/pd_examples/blob.pd
new file mode 100644
index 00000000..48f5251a
--- /dev/null
+++ b/externals/gridflow/pd_examples/blob.pd
@@ -0,0 +1,106 @@
+#N canvas 19 81 792 565 10;
+#X floatatom 405 212 5 0 0 0 - - -;
+#X obj 347 172 r move;
+#X obj 56 95 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 56 128 240 320 3 # 0;
+#X msg 461 357 300;
+#X obj 398 342 # * 300;
+#X obj 311 436 # cos*;
+#X msg 460 319 1600;
+#X msg 513 249 25;
+#X obj 373 212 +;
+#X msg 513 268 100;
+#X obj 504 192 hsl 128 15 100 2600 0 1 empty empty empty -2 -6 0 8
+-260818 -1 -1 2297 1;
+#X text 364 435 make circular orbit of variable radius;
+#X floatatom 502 211 5 0 0 0 - - -;
+#X msg 461 338 800;
+#X text 294 325 frequency of the orbit;
+#X text 500 177 increment;
+#X msg 373 192 1;
+#X obj 64 58 s move;
+#X obj 311 394 #outer + ( 0 9000 );
+#X obj 73 94 loadbang;
+#X obj 19 0 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X obj 78 351 #out window;
+#X obj 246 126 # +;
+#X obj 438 299 # + 50;
+#X text 401 197 counter;
+#X obj 19 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 311 458 # + ( 120 160 );
+#X obj 19 309 #store;
+#X text 65 113 blank image to start with;
+#X text 272 127 translate the square;
+#X text 546 247 make a wavy radius (50-100) \; the 1100 is its frequency
+\; tune it for fun and profit.;
+#X obj 19 58 t b b;
+#X obj 368 232 t a a a;
+#X msg 246 74 4 2 # -1 -1 -1 1 1 1 1 -1;
+#X obj 19 22 metro 1.367;
+#X obj 8 491 cnv 15 780 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 16 498 GridFlow 0.8.0;
+#X obj 8 -38 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 21 -38 Blob.pd;
+#X msg 514 287 10;
+#X obj 437 257 # * 1000;
+#X obj 101 215 #color;
+#X obj 101 171 loadbang;
+#X text 452 383 duplicate the angle \; make the 2nd 90 degrees apart
+(required for a circle \; else it'll be an oval or a line);
+#X obj 78 309 #draw_polygon + (3 # );
+#X text 21 -25 Copyright 2002 Mathieu Bouchard and Alexandre Castonguay
+;
+#X text 245 58 a 2x2 square's coordinates;
+#X text 288 103 scale factor;
+#X obj 246 102 # * 8;
+#X obj 78 330 #solarize;
+#X text 400 -1 This is the classic "Shadebob" effect of the demoscene
+;
+#X msg 101 193 12 24 36;
+#X text 6 284 superimpose the light of many squares;
+#X obj 438 278 # cos* 100;
+#X connect 0 0 9 1;
+#X connect 1 0 17 0;
+#X connect 2 0 3 0;
+#X connect 3 0 28 1;
+#X connect 4 0 5 1;
+#X connect 5 0 19 0;
+#X connect 6 0 27 0;
+#X connect 7 0 5 1;
+#X connect 8 0 54 1;
+#X connect 9 0 0 0;
+#X connect 9 0 33 0;
+#X connect 10 0 54 1;
+#X connect 11 0 13 0;
+#X connect 13 0 41 1;
+#X connect 14 0 5 1;
+#X connect 17 0 9 0;
+#X connect 19 0 6 0;
+#X connect 20 0 2 0;
+#X connect 21 0 35 0;
+#X connect 23 0 45 2;
+#X connect 24 0 6 1;
+#X connect 26 0 32 0;
+#X connect 27 0 23 1;
+#X connect 28 0 45 0;
+#X connect 32 0 28 0;
+#X connect 32 1 18 0;
+#X connect 33 0 34 0;
+#X connect 33 1 5 0;
+#X connect 33 2 41 0;
+#X connect 34 0 49 0;
+#X connect 35 0 26 0;
+#X connect 40 0 54 1;
+#X connect 41 0 54 0;
+#X connect 42 0 45 1;
+#X connect 43 0 52 0;
+#X connect 45 0 28 1;
+#X connect 45 0 50 0;
+#X connect 49 0 23 0;
+#X connect 50 0 22 0;
+#X connect 52 0 42 0;
+#X connect 54 0 24 0;
diff --git a/externals/gridflow/pd_examples/cellular_1d.pd b/externals/gridflow/pd_examples/cellular_1d.pd
new file mode 100644
index 00000000..eb1c6c30
--- /dev/null
+++ b/externals/gridflow/pd_examples/cellular_1d.pd
@@ -0,0 +1,164 @@
+#N canvas 337 53 804 634 10;
+#X obj 43 68 loadbang;
+#X obj 93 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 108 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 1
+1;
+#X obj 123 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 1
+1;
+#X obj 138 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 153 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 1
+1;
+#X obj 168 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 183 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 1
+1;
+#X obj 198 382 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 124 498 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 86 256;
+#X obj -5 188 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 17 332 1 256 # 1;
+#X msg 43 102 1 256 # 2;
+#X obj 17 -2 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X obj 418 199 loadbang;
+#X msg 418 219 1 256 # 0;
+#X text 131 482 characteristic number;
+#X obj 428 11 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 4 256;
+#X msg 467 69 \$1 256;
+#X msg 352 82 set \$1;
+#X text 104 124 randomizer;
+#X text 91 361 specify behaviour here;
+#X text 24 254 compute new state;
+#X text 315 237 make scrollie;
+#X text 367 270 convert bit matrix to rgb image;
+#X text 313 250 (window height = 128);
+#X obj 202 38 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 151 337 loadbang;
+#X text 47 84 click here to restart;
+#X obj 99 200 t a a;
+#X obj 17 26 metro 33.3667;
+#X obj 416 115 t a a;
+#X obj 472 359 loadbang;
+#X obj 389 495 unpack 0 0 0;
+#X obj 564 494 unpack 0 0 0;
+#X msg 389 394 3 # 0;
+#X msg 565 395 3 # 255;
+#X text 442 392 background;
+#X text 629 395 foreground;
+#X obj 17 292 t a a;
+#X obj 43 124 # rand;
+#X obj 17 234 #store;
+#X obj 17 312 #finished;
+#X obj 17 352 # <<;
+#X obj 17 372 # &;
+#X obj 17 392 # != 0;
+#X obj 123 406 #pack 8;
+#X obj 124 445 #fold +;
+#X obj 124 466 #export;
+#X obj 202 56 #for 0 256 1;
+#X obj 202 76 # == 128;
+#X obj 202 96 #redim ( 1 256 );
+#X obj 416 96 #import ( 1 256 );
+#X obj 416 135 #finished;
+#X obj 352 157 #for 1 128 1;
+#X obj 352 177 #outer ignore ( 0 );
+#X obj 352 197 #store;
+#X obj 352 218 @join 0;
+#X obj 351 287 #outer ignore ( 0 );
+#X obj 351 308 #store;
+#X obj 398 308 #redim ( 2 3 );
+#X obj 389 414 #color;
+#X obj 565 414 #color;
+#X obj 389 475 #export_list;
+#X obj 565 475 #export_list;
+#X obj 492 526 #pack 6;
+#X obj 17 272 #convolve (1 3 # 1 2 4);
+#X obj 124 426 # << (0 1 2 3 4 5 6 7);
+#X obj -4 550 cnv 15 780 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 4 557 GridFlow 0.8.0;
+#X obj -7 -50 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 351 330 #out window;
+#X text -3 -35 Copyright 2002 Mathieu Bouchard;
+#X text -3 -49 Cellular_1d;
+#X obj 428 34 max 1;
+#X text 495 9 <-- number of new lines per frame;
+#X text 221 37 <-- make single dot;
+#X connect 0 0 12 0;
+#X connect 1 0 46 0;
+#X connect 2 0 46 1;
+#X connect 3 0 46 2;
+#X connect 4 0 46 3;
+#X connect 5 0 46 4;
+#X connect 6 0 46 5;
+#X connect 7 0 46 6;
+#X connect 8 0 46 7;
+#X connect 9 0 44 1;
+#X connect 10 0 41 0;
+#X connect 11 0 43 0;
+#X connect 12 0 40 0;
+#X connect 13 0 30 0;
+#X connect 14 0 15 0;
+#X connect 15 0 56 1;
+#X connect 17 0 74 0;
+#X connect 18 0 52 1;
+#X connect 19 0 54 0;
+#X connect 26 0 49 0;
+#X connect 27 0 2 0;
+#X connect 27 0 3 0;
+#X connect 27 0 7 0;
+#X connect 27 0 5 0;
+#X connect 29 0 41 1;
+#X connect 29 1 52 0;
+#X connect 30 0 41 0;
+#X connect 31 0 53 0;
+#X connect 31 1 57 1;
+#X connect 32 0 35 0;
+#X connect 32 0 36 0;
+#X connect 33 0 65 0;
+#X connect 33 1 65 1;
+#X connect 33 2 65 2;
+#X connect 34 0 65 3;
+#X connect 34 1 65 4;
+#X connect 34 2 65 5;
+#X connect 35 0 61 0;
+#X connect 36 0 62 0;
+#X connect 39 0 42 0;
+#X connect 39 1 43 1;
+#X connect 40 0 29 0;
+#X connect 41 0 66 0;
+#X connect 42 0 11 0;
+#X connect 43 0 44 0;
+#X connect 44 0 45 0;
+#X connect 45 0 29 0;
+#X connect 46 0 67 0;
+#X connect 47 0 48 0;
+#X connect 48 0 9 0;
+#X connect 49 0 50 0;
+#X connect 50 0 51 0;
+#X connect 51 0 29 0;
+#X connect 52 0 31 0;
+#X connect 53 0 54 0;
+#X connect 54 0 55 0;
+#X connect 55 0 56 0;
+#X connect 56 0 57 0;
+#X connect 57 0 56 1;
+#X connect 57 0 58 0;
+#X connect 58 0 59 0;
+#X connect 59 0 71 0;
+#X connect 60 0 59 1;
+#X connect 61 0 63 0;
+#X connect 62 0 64 0;
+#X connect 63 0 33 0;
+#X connect 64 0 34 0;
+#X connect 65 0 60 0;
+#X connect 66 0 39 0;
+#X connect 67 0 47 0;
+#X connect 74 0 19 0;
+#X connect 74 0 18 0;
diff --git a/externals/gridflow/pd_examples/color_correction.pd b/externals/gridflow/pd_examples/color_correction.pd
new file mode 100644
index 00000000..2a153d20
--- /dev/null
+++ b/externals/gridflow/pd_examples/color_correction.pd
@@ -0,0 +1,154 @@
+#N canvas 455 129 676 546 10;
+#X text 360 96 sigma (extremes);
+#X obj 134 433 #out window;
+#X text 361 171 linear (contrast);
+#X obj 134 364 shunt 2;
+#N canvas 1 96 188 188 color 0;
+#X obj 55 134 # inv+;
+#X obj 55 90 # inv+ 255;
+#X obj 127 89 inlet;
+#X obj 55 177 outlet 0;
+#X obj 55 43 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 55 22 inlet;
+#X obj 55 112 #outer <;
+#X obj 55 155 # & 255;
+#X obj 55 67 #for 0 256 1;
+#X connect 0 0 7 0;
+#X connect 1 0 6 0;
+#X connect 2 0 6 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 7 0 3 0;
+#X connect 8 0 1 0;
+#X restore 184 386 pd color correction graph generator;
+#X obj 19 295 #in;
+#X text 360 244 constant (brightness);
+#N canvas 604 262 237 400 color-correction 0;
+#X obj 23 214 # + 128;
+#X obj 23 194 # /;
+#X obj 23 112 # *;
+#X obj 23 291 # +;
+#X obj 77 112 # max 32;
+#X obj 23 317 # max 0;
+#X obj 77 151 # tanh* 512;
+#X obj 23 340 # min 255;
+#X obj 23 64 # gamma;
+#X obj 77 131 # << 5;
+#X obj 23 93 # - 128;
+#X obj 23 172 # tanh* 65535;
+#X obj 23 132 # >> 2;
+#X text 89 327 trim;
+#X obj 95 242 inlet linear;
+#X obj 114 264 inlet constant;
+#X obj 23 243 # *>>8;
+#X obj 77 93 inlet sigma;
+#X obj 34 38 inlet gamma;
+#X obj 23 12 inlet image;
+#X obj 23 369 outlet image;
+#X connect 0 0 16 0;
+#X connect 1 0 0 0;
+#X connect 2 0 12 0;
+#X connect 3 0 5 0;
+#X connect 4 0 2 1;
+#X connect 4 0 9 0;
+#X connect 5 0 7 0;
+#X connect 6 0 1 1;
+#X connect 7 0 20 0;
+#X connect 8 0 10 0;
+#X connect 9 0 6 0;
+#X connect 10 0 2 0;
+#X connect 11 0 1 0;
+#X connect 12 0 11 0;
+#X connect 14 0 16 1;
+#X connect 15 0 3 1;
+#X connect 16 0 3 0;
+#X connect 17 0 4 0;
+#X connect 18 0 8 1;
+#X connect 19 0 8 0;
+#X restore 176 274 pd color-correction;
+#X obj 134 386 #store;
+#X obj 29 5 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 29 50 #for 0 256 1;
+#X msg 19 274 open teapot.png \, bang;
+#X obj 164 298 #finished;
+#X obj 29 27 metro 33.3667;
+#X obj 19 254 loadbang;
+#X obj 256 52 vradio 15 1 0 3 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 277 53 regular;
+#X text 276 68 solarize;
+#X text 277 82 solarize 2;
+#X obj 29 91 shunt 3;
+#X obj 29 163 t a;
+#X obj 122 146 # sin* 255;
+#X obj 123 127 # / 255;
+#X obj 123 108 # * 18000;
+#X obj 190 351 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 209 351 see picture;
+#X text 209 366 see graph;
+#X obj 8 231 spigot;
+#X obj 57 232 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X text 13 214 enable stream;
+#X text 361 20 gamma (midtones);
+#X msg 254 143 3 # 256;
+#X obj 253 123 loadbang;
+#X msg 237 171 3 # 0;
+#X obj 8 320 #camera;
+#X obj 362 37 #color 0 1024 1;
+#X obj 362 112 #color 0 1024 1;
+#X obj 362 186 #color 0 1024 1;
+#X obj 362 258 #color -256 256 1;
+#X obj 51 114 #solarize;
+#X obj 134 411 #apply_colormap_channelwise;
+#X obj 2 -38 cnv 15 720 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 15 -25 Copyright 2002 Mathieu Bouchard;
+#X obj 2 477 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 10 484 GridFlow 0.8.0;
+#X text 15 -38 color_correction.pd;
+#X obj 29 71 #outer + (0 0 0);
+#X connect 3 0 8 0;
+#X connect 3 1 4 0;
+#X connect 4 0 1 0;
+#X connect 5 0 8 1;
+#X connect 7 0 12 0;
+#X connect 7 0 4 1;
+#X connect 7 0 40 1;
+#X connect 8 0 40 0;
+#X connect 9 0 13 0;
+#X connect 10 0 46 0;
+#X connect 11 0 5 0;
+#X connect 12 0 3 0;
+#X connect 13 0 10 0;
+#X connect 13 0 27 0;
+#X connect 14 0 11 0;
+#X connect 15 0 19 1;
+#X connect 19 0 20 0;
+#X connect 19 1 39 0;
+#X connect 19 2 23 0;
+#X connect 20 0 7 0;
+#X connect 21 0 20 0;
+#X connect 22 0 21 0;
+#X connect 23 0 22 0;
+#X connect 24 0 3 1;
+#X connect 27 0 34 0;
+#X connect 28 0 27 1;
+#X connect 31 0 35 0;
+#X connect 31 0 36 0;
+#X connect 31 0 37 0;
+#X connect 32 0 31 0;
+#X connect 32 0 33 0;
+#X connect 33 0 38 0;
+#X connect 34 0 8 1;
+#X connect 35 0 7 1;
+#X connect 36 0 7 2;
+#X connect 37 0 7 3;
+#X connect 38 0 7 4;
+#X connect 39 0 20 0;
+#X connect 40 0 1 0;
+#X connect 46 0 19 0;
diff --git a/externals/gridflow/pd_examples/color_detect.pd b/externals/gridflow/pd_examples/color_detect.pd
new file mode 100644
index 00000000..91610cdb
--- /dev/null
+++ b/externals/gridflow/pd_examples/color_detect.pd
@@ -0,0 +1,218 @@
+#N canvas 562 75 668 715 10;
+#X obj 14 262 # > 0;
+#X obj 68 284 # + 128;
+#X obj 383 135 hsl 222 15 0 442 0 0 empty empty tolerance 8 8 0 8 -260818
+-1 -1 10300 1;
+#X obj 224 530 #out window;
+#X obj 68 262 # tanh* 127;
+#X obj 86 2 #store;
+#X obj 277 177 tgl 15 1 empty empty empty 0 -6 0 8 -261689 -258699
+-1 1 1;
+#X obj 31 -64 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 14 179 # inv+;
+#X obj 14 284 # << 8;
+#X obj 14 160 #fold +;
+#X obj 315 360 loadbang;
+#X obj 298 398 #checkers;
+#X obj 224 468 # +;
+#X obj 224 445 # *;
+#X obj 297 446 # *;
+#X obj 224 489 # >> 8;
+#X obj 297 424 # inv+ 256;
+#X obj 271 490 # min 255;
+#X obj 298 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 380 76 #color;
+#X obj 72 22 s image;
+#X obj 240 426 r image;
+#X text 374 46 select a point in the color cube \; and a radius of
+accepted similarity.;
+#X obj 277 196 #pack 3;
+#X obj 299 177 tgl 15 1 empty empty empty 0 -6 0 8 -225271 -24198 -1
+1 1;
+#X obj 321 177 tgl 15 1 empty empty empty 0 -6 0 8 -228992 -62784 -1
+1 1;
+#X text 271 161 enable selection on:;
+#X text 339 178 all three = select sphere in color cube \; pick two
+= select circle in a color square \; pick one = select range in one
+channel;
+#X text 377 360 make background;
+#X obj 57 217 # inv+;
+#X obj 295 229 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -66577
+-1 0;
+#X text 314 228 erase nonselected;
+#X text 314 245 erase selected;
+#X obj 295 269 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -66577
+-1 1;
+#X text 317 268 strict;
+#X text 316 284 fuzzy;
+#X obj 296 325 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -66577
+-1 0;
+#X text 318 324 see filtered image on checkers;
+#X text 318 339 see opacity mask;
+#X obj 224 406 t a a;
+#N canvas 414 518 450 216 color 0;
+#X obj 25 3 inlet bang;
+#X obj 26 182 outlet image;
+#X obj 26 144 # min 255;
+#X obj 26 163 # max 0;
+#X obj 178 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 25 25 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 178 88 #outer + ( 0 0 9000 );
+#X obj 48 24 t b b;
+#X obj 26 81 #outer * ( 1 0 0 );
+#X obj 26 105 # +;
+#X obj 178 132 # + ( 0 128 128 );
+#X obj 178 48 #for 0 320 1;
+#X obj 179 67 # * 113;
+#X obj 26 62 #outer + ( 320 # 0 );
+#X obj 26 43 #for -120 360 2;
+#X obj 178 155 #redim ( 240 320 3 );
+#X obj 178 109 # cos* ( 0 128 128 );
+#X obj 26 124 #yuv_to_rgb;
+#X connect 0 0 7 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 11 0;
+#X connect 5 0 14 0;
+#X connect 6 0 16 0;
+#X connect 7 0 5 0;
+#X connect 7 1 4 0;
+#X connect 8 0 9 0;
+#X connect 9 0 17 0;
+#X connect 10 0 15 0;
+#X connect 11 0 12 0;
+#X connect 12 0 6 0;
+#X connect 13 0 8 0;
+#X connect 14 0 13 0;
+#X connect 15 0 9 1;
+#X connect 16 0 10 0;
+#X connect 17 0 2 0;
+#X restore 133 21 pd color panorama;
+#X obj 133 2 loadbang;
+#X obj 210 -53 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -66577
+-1 1;
+#X text 229 -54 on video;
+#X text 229 -38 on color panorama;
+#X floatatom 336 136 5 0 0 0 - - -;
+#X obj 76 240 # *>>8 256;
+#X obj 338 302 hsl 129 15 4 4096 1 1 empty empty empty -2 -6 0 8 -260818
+-1 -1 7000 1;
+#X floatatom 295 302 5 0 0 0 - - -;
+#X obj 58 87 #rgb_to_yuv;
+#X obj 90 55 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 107 55 RGB;
+#X text 107 70 YUV;
+#X text 141 55 warning: in YUV mode \,;
+#X text 140 81 green slider = U chroma;
+#X text 147 94 blue slider = V chroma;
+#X text 154 68 red slider = Y luma;
+#X obj 31 -39 metro 33.3667;
+#X obj 31 22 t a a;
+#X obj 31 1 #camera;
+#X obj 332 446 spigot;
+#X obj 379 447 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X text 398 448 recurrent layering;
+#X obj 224 511 t a;
+#X obj 14 141 # &;
+#X obj 40 141 # inv+;
+#X obj 36 397 # >> 6;
+#X obj 14 198 shunt 2;
+#X obj 14 241 shunt 2;
+#X obj 14 55 shunt 2;
+#X obj 14 306 shunt 2;
+#X obj 68 308 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X text 87 302 sort-of feather;
+#X obj 224 385 shunt 2;
+#X text 87 317 (8x8 square blur on mask);
+#X obj 31 -18 shunt 2;
+#X obj 36 377 # + 32;
+#X obj -2 561 cnv 15 740 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 6 568 GridFlow 0.8.0;
+#X obj 1 -118 cnv 15 740 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 14 -118 color_detect.pd;
+#X text 13 -105 Copyright 2001-2004 Mathieu Bouchard;
+#X obj 14 122 # sq-;
+#X obj 61 179 # sq-;
+#X obj 36 337 #convolve (8 1 # 1);
+#X obj 36 357 #convolve (1 8 # 1);
+#X obj 14 457 #outer ignore (3 # 0);
+#X obj 298 379 #for (0 0) (240 320) (1 1);
+#X connect 0 0 9 0;
+#X connect 1 0 71 0;
+#X connect 2 0 46 0;
+#X connect 4 0 1 0;
+#X connect 5 0 59 0;
+#X connect 6 0 24 0;
+#X connect 7 0 58 0;
+#X connect 8 0 68 0;
+#X connect 9 0 71 0;
+#X connect 10 0 8 0;
+#X connect 11 0 19 0;
+#X connect 12 0 15 1;
+#X connect 13 0 16 0;
+#X connect 14 0 13 0;
+#X connect 15 0 13 1;
+#X connect 16 0 64 0;
+#X connect 17 0 15 0;
+#X connect 18 0 64 0;
+#X connect 19 0 88 0;
+#X connect 20 0 83 1;
+#X connect 22 0 14 1;
+#X connect 24 0 66 0;
+#X connect 25 0 24 1;
+#X connect 26 0 24 2;
+#X connect 30 0 69 0;
+#X connect 31 0 68 1;
+#X connect 34 0 69 1;
+#X connect 37 0 74 1;
+#X connect 40 0 14 0;
+#X connect 40 1 17 0;
+#X connect 41 0 5 1;
+#X connect 42 0 41 0;
+#X connect 43 0 76 1;
+#X connect 46 0 84 0;
+#X connect 47 0 4 0;
+#X connect 48 0 49 0;
+#X connect 49 0 47 1;
+#X connect 50 0 83 0;
+#X connect 51 0 70 1;
+#X connect 58 0 76 0;
+#X connect 59 0 70 0;
+#X connect 59 1 21 0;
+#X connect 60 0 59 0;
+#X connect 61 0 15 1;
+#X connect 62 0 61 1;
+#X connect 64 0 3 0;
+#X connect 64 0 61 0;
+#X connect 65 0 10 0;
+#X connect 66 0 65 1;
+#X connect 67 0 87 0;
+#X connect 68 0 69 0;
+#X connect 68 1 30 0;
+#X connect 69 0 0 0;
+#X connect 69 1 47 0;
+#X connect 70 0 83 0;
+#X connect 70 1 50 0;
+#X connect 71 0 87 0;
+#X connect 71 1 85 0;
+#X connect 72 0 71 1;
+#X connect 74 0 40 0;
+#X connect 74 1 18 0;
+#X connect 76 0 60 0;
+#X connect 76 1 5 0;
+#X connect 77 0 67 0;
+#X connect 83 0 65 0;
+#X connect 84 0 8 1;
+#X connect 85 0 86 0;
+#X connect 86 0 77 0;
+#X connect 87 0 74 0;
+#X connect 88 0 12 0;
diff --git a/externals/gridflow/pd_examples/convolve.pd b/externals/gridflow/pd_examples/convolve.pd
new file mode 100644
index 00000000..19a08510
--- /dev/null
+++ b/externals/gridflow/pd_examples/convolve.pd
@@ -0,0 +1,94 @@
+#N canvas 17 90 652 511 10;
+#X msg 382 117 3 3 # 0 4 0 4 9 -4 0 -4 0;
+#X obj 20 29 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 386 63 3 3 # 4 0 0 0 1 0 0 0 4;
+#X obj 20 130 #store;
+#X obj 116 218 # / 9;
+#X msg 381 37 3 3 # 1 1 1 1 1 1 1 1 1;
+#X obj 76 131 #out window;
+#X msg 399 180 1 3 # 0 9 -9;
+#X obj 58 85 #in;
+#X msg 387 90 3 3 # 2 2 2 2 -7 2 2 2 2;
+#X obj 20 -24 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 116 286 @! abs;
+#X obj 116 352 # max 0;
+#X text 331 -15 step 1: select one of those six grids;
+#X obj 116 331 # min 255;
+#X obj 58 45 loadbang;
+#X obj 20 2 metro 33.3667;
+#X obj 58 107 t a;
+#X obj 116 197 #convolve \, seed 4;
+#X obj 332 5 loadbang;
+#X text -7 149 feedback loop;
+#X obj 116 244 shunt 2;
+#X obj 171 246 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X msg 253 227 0;
+#X obj 163 307 # + 128;
+#X msg 253 251 1;
+#X obj 331 307 display;
+#X obj 48 233 fps;
+#X obj 40 277 print;
+#X obj -15 391 cnv 15 780 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 398 GridFlow 0.8.0;
+#X text -7 398 GridFlow 0.8.0;
+#X obj -13 -85 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 0 -72 Copyright 2002 Mathieu Bouchard;
+#X text 0 -85 convolve.pd;
+#X msg 399 159 1 3 # 0 2 -2;
+#X msg 399 212 3 3 # 0 -1 0 -1 4 -1 0 -1 0;
+#X msg 397 235 3 3 # -1 -1 -1 -1 8 -1 -1 -1 -1;
+#X text 506 192 Laplacian masks;
+#X msg 396 280 3 3 # 0 -1 0 -1 13 -1 0 -1 0;
+#X text 542 261 Sharpen;
+#X text 507 17 Blurs;
+#X obj 163 265 # << 4;
+#X text 416 140 Edge detection;
+#X msg 58 65 open babbage.jpg \, bang;
+#X connect 0 0 23 0;
+#X connect 0 0 18 1;
+#X connect 0 0 26 0;
+#X connect 1 0 3 0;
+#X connect 2 0 23 0;
+#X connect 2 0 18 1;
+#X connect 3 0 18 0;
+#X connect 4 0 21 0;
+#X connect 5 0 23 0;
+#X connect 5 0 18 1;
+#X connect 6 0 27 0;
+#X connect 7 0 18 1;
+#X connect 7 0 25 0;
+#X connect 8 0 17 0;
+#X connect 9 0 23 0;
+#X connect 9 0 18 1;
+#X connect 10 0 16 0;
+#X connect 11 0 14 0;
+#X connect 12 0 17 0;
+#X connect 14 0 12 0;
+#X connect 15 0 44 0;
+#X connect 16 0 1 0;
+#X connect 17 0 3 1;
+#X connect 17 0 6 0;
+#X connect 18 0 4 0;
+#X connect 19 0 5 0;
+#X connect 21 0 11 0;
+#X connect 21 1 42 0;
+#X connect 22 0 21 1;
+#X connect 23 0 22 0;
+#X connect 24 0 14 0;
+#X connect 25 0 22 0;
+#X connect 27 0 28 0;
+#X connect 35 0 23 0;
+#X connect 35 0 18 1;
+#X connect 36 0 18 1;
+#X connect 36 0 25 0;
+#X connect 37 0 25 0;
+#X connect 37 0 18 1;
+#X connect 39 0 23 0;
+#X connect 39 0 18 1;
+#X connect 42 0 24 0;
+#X connect 44 0 8 0;
diff --git a/externals/gridflow/pd_examples/cross_fade.pd b/externals/gridflow/pd_examples/cross_fade.pd
new file mode 100644
index 00000000..f7af6195
--- /dev/null
+++ b/externals/gridflow/pd_examples/cross_fade.pd
@@ -0,0 +1,73 @@
+#N canvas 401 101 681 500 10;
+#X obj 33 191 # *>>8;
+#X text 60 235 first picture plus a fraction of the difference;
+#X obj 33 233 # +;
+#X obj 33 170 #store;
+#X obj 264 103 # inv+;
+#X obj 88 254 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X text 152 324 note: the #layer/#join objects can make the crossfade
+process simpler but it's still not faster.;
+#X obj 50 -30 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X msg 309 72 open r001.jpg \, cast int16 \, bang;
+#X obj 283 72 #in;
+#X obj 33 149 #finished;
+#X text 109 257 click to clip out-of-range colours;
+#X text 82 190 multiply by a N/256 fraction;
+#X obj 81 295 # max 0;
+#X obj 264 51 #in;
+#X obj 81 274 # min 255;
+#X obj 33 326 #out window;
+#X obj 33 109 #cast int16;
+#X text 81 170 keep the difference between both pictures;
+#X msg 290 51 open b001.jpg \, cast int16 \, bang;
+#X obj 290 31 t b b;
+#X obj 330 31 loadbang;
+#X obj 33 253 shunt 2;
+#X obj 50 -5 metro 33.3667;
+#X obj 50 15 float;
+#X obj 62 44 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 0 256;
+#X obj 94 14 + 4;
+#X obj 50 65 pingpong 256;
+#X obj 61 87 hsl 129 15 0 256 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 33 128 t a a;
+#X text 153 362 also #draw_image/#join is a possibility;
+#X obj 0 -77 cnv 15 680 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 14 -64 Copyright 2002 Mathieu Bouchard;
+#X text 14 -80 cross_fade.pd;
+#X obj 0 391 cnv 15 680 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 8 399 GridFlow 0.8.0;
+#X connect 0 0 2 0;
+#X connect 2 0 22 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 1;
+#X connect 5 0 22 1;
+#X connect 7 0 23 0;
+#X connect 8 0 9 0;
+#X connect 9 0 4 1;
+#X connect 10 0 3 0;
+#X connect 13 0 16 0;
+#X connect 14 0 4 0;
+#X connect 14 0 2 1;
+#X connect 15 0 13 0;
+#X connect 17 0 29 0;
+#X connect 19 0 14 0;
+#X connect 20 0 19 0;
+#X connect 20 1 8 0;
+#X connect 21 0 20 0;
+#X connect 22 0 16 0;
+#X connect 22 1 15 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 24 0 26 0;
+#X connect 24 0 27 0;
+#X connect 26 0 24 1;
+#X connect 27 0 28 0;
+#X connect 27 0 17 0;
+#X connect 29 0 10 0;
+#X connect 29 1 0 1;
diff --git a/externals/gridflow/pd_examples/drag_rectangle.pd b/externals/gridflow/pd_examples/drag_rectangle.pd
new file mode 100644
index 00000000..3453c9a8
--- /dev/null
+++ b/externals/gridflow/pd_examples/drag_rectangle.pd
@@ -0,0 +1,110 @@
+#N canvas 702 123 647 484 10;
+#X obj 231 -7 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 231 117 #out window;
+#X obj 21 144 hsl 128 15 0 319 0 0 h_end_o h_end_i empty -2 -8 1 10
+-262144 -1 -1 12700 1;
+#X obj 21 -4 hsl 128 15 0 319 0 0 h_start_o h_start_i empty 0 8 1 10
+-262144 -66577 -258699 0 0;
+#X obj 3 13 vsl 15 128 239 0 0 0 v_start_o v_start_i empty 0 -8 1 10
+-262144 -1 -1 12647 1;
+#X obj 151 13 vsl 15 128 239 0 0 0 v_end_o v_end_i empty 0 -8 1 10
+-262144 -1 -1 425 1;
+#N canvas 504 374 452 302 make_rectangle 0;
+#X obj 27 16 inlet;
+#X text 25 -3 image;
+#X obj 93 17 inlet;
+#X text 92 0 start pos;
+#X obj 172 18 inlet;
+#X text 172 1 end pos;
+#X obj 27 244 outlet;
+#X text 27 264 image;
+#X obj 93 37 unpack 0 0;
+#X obj 173 37 unpack 0 0;
+#X obj 126 61 #pack 4;
+#X obj 125 81 #export_list;
+#X msg 95 135 4 2 # \$1 \$2 \$1 \$4 \$3 \$4 \$3 \$2;
+#X obj 27 177 #draw_polygon >> ( 1 1 1 );
+#X connect 0 0 13 0;
+#X connect 2 0 8 0;
+#X connect 4 0 9 0;
+#X connect 8 0 10 0;
+#X connect 8 1 10 1;
+#X connect 9 0 10 2;
+#X connect 9 1 10 3;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 2;
+#X connect 13 0 6 0;
+#X restore 231 97 pd make_rectangle;
+#X obj 231 43 metro 33.3667;
+#X text -22 -5 start;
+#X text 155 144 end;
+#X obj 328 23 loadbang;
+#X obj 231 72 #store;
+#X obj 393 25 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 315 117 #mouse \, ...;
+#X obj 260 266 listelement 0;
+#X obj 367 190 listelement 1;
+#X obj 260 225 listelement 0;
+#X obj 368 149 listelement 1;
+#X obj 368 170 s h_start_i;
+#X obj 367 211 s h_end_i;
+#X obj 260 287 s v_end_i;
+#X obj 260 246 s v_start_i;
+#X obj 378 65 loadbang;
+#X msg 378 85 0 0;
+#X obj 328 161 t a;
+#X obj 64 330 #out window;
+#X obj 47 267 #for ( 0 0 ) ( 0 0 ) ( 1 1 );
+#X obj 112 221 t b a;
+#X obj 64 294 #store;
+#X msg 48 243 set ( \$1 \$2 );
+#X obj 327 43 #in b001.jpg;
+#X text 30 35 drag the mouse;
+#X text 56 20 step 2:;
+#X text 39 51 inside the;
+#X text 37 66 first window;
+#X text 218 -25 step 1: turn on;
+#X text 69 312 cropping (to 2nd window);
+#X obj -41 373 cnv 15 640 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -33 380 GridFlow 0.8.0;
+#X text -33 380 GridFlow 0.8.0;
+#X obj -40 -77 cnv 15 640 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -27 -64 Copyright 2002 Mathieu Bouchard;
+#X text -27 -77 drag_rectangle.pd;
+#X connect 0 0 7 0;
+#X connect 1 0 13 0;
+#X connect 6 0 1 0;
+#X connect 7 0 11 0;
+#X connect 10 0 30 0;
+#X connect 11 0 6 0;
+#X connect 12 0 30 0;
+#X connect 13 0 6 1;
+#X connect 13 0 16 0;
+#X connect 13 0 17 0;
+#X connect 13 0 29 0;
+#X connect 13 0 24 0;
+#X connect 13 1 24 0;
+#X connect 13 2 24 0;
+#X connect 13 2 27 0;
+#X connect 14 0 20 0;
+#X connect 15 0 19 0;
+#X connect 16 0 21 0;
+#X connect 17 0 18 0;
+#X connect 22 0 23 0;
+#X connect 23 0 6 1;
+#X connect 23 0 6 2;
+#X connect 24 0 14 0;
+#X connect 24 0 15 0;
+#X connect 24 0 6 2;
+#X connect 26 0 28 0;
+#X connect 27 0 26 0;
+#X connect 27 1 26 1;
+#X connect 28 0 25 0;
+#X connect 29 0 26 0;
+#X connect 30 0 11 1;
+#X connect 30 0 28 1;
diff --git a/externals/gridflow/pd_examples/eclipse.pd b/externals/gridflow/pd_examples/eclipse.pd
new file mode 100644
index 00000000..65ef9ef3
--- /dev/null
+++ b/externals/gridflow/pd_examples/eclipse.pd
@@ -0,0 +1,80 @@
+#N canvas 623 182 635 533 10;
+#X floatatom 292 323 5 0 0 0 - - -;
+#X msg 244 303 24;
+#X obj 61 -35 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 244 281 loadbang;
+#X msg 292 303 32;
+#X floatatom 244 323 5 0 0 0 - - -;
+#X obj 38 17 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 61 -6 metro 33.3667;
+#X text 239 258 size of subimages;
+#X obj 61 111 t a a a;
+#X obj 61 166 t a a;
+#X text 224 54 gain on colour blue;
+#X obj 61 17 #camera;
+#X obj 61 73 #scale_by 2;
+#X obj 141 97 #dim;
+#X obj 141 117 #inner (3 2 # 1 0 0 1 0 0);
+#X obj 61 147 #finished;
+#X obj 61 211 # /;
+#X obj 61 234 # *;
+#X obj 58 265 #store;
+#X obj 70 311 # *;
+#X obj 70 334 # >> 7;
+#X obj 70 356 # min 255;
+#X obj 70 378 #out window;
+#X obj 244 343 #pack 2;
+#X obj 141 242 # /;
+#X obj 107 265 #store;
+#X obj 107 242 # *;
+#X obj 61 186 #for (0 0) (240 320) (1 1);
+#X obj 107 208 #for (0 0) (240 320) (1 1);
+#X obj 61 54 # *>>8 (256 256 384);
+#X obj 1 418 cnv 15 640 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 9 425 GridFlow 0.8.0;
+#X text 9 425 GridFlow 0.8.0;
+#X obj 3 -85 cnv 15 640 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 16 -72 Copyright 2002 Mathieu Bouchard;
+#X text 121 17 <-- open this;
+#X text 16 -85 eclipse.pd;
+#X connect 0 0 24 1;
+#X connect 1 0 5 0;
+#X connect 2 0 7 0;
+#X connect 3 0 4 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 5 0 24 0;
+#X connect 6 0 12 0;
+#X connect 7 0 12 0;
+#X connect 9 0 16 0;
+#X connect 9 1 14 0;
+#X connect 9 1 19 1;
+#X connect 9 1 26 1;
+#X connect 10 0 28 0;
+#X connect 10 1 29 0;
+#X connect 12 0 30 0;
+#X connect 13 0 9 0;
+#X connect 14 0 15 0;
+#X connect 15 0 25 0;
+#X connect 15 0 28 1;
+#X connect 15 0 29 1;
+#X connect 16 0 10 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 22 0 23 0;
+#X connect 24 0 17 1;
+#X connect 24 0 18 1;
+#X connect 24 0 25 1;
+#X connect 25 0 27 1;
+#X connect 26 0 20 1;
+#X connect 27 0 26 0;
+#X connect 28 0 17 0;
+#X connect 29 0 27 0;
+#X connect 30 0 13 0;
diff --git a/externals/gridflow/pd_examples/epicycloid.pd b/externals/gridflow/pd_examples/epicycloid.pd
new file mode 100644
index 00000000..c1589de9
--- /dev/null
+++ b/externals/gridflow/pd_examples/epicycloid.pd
@@ -0,0 +1,125 @@
+#N canvas 443 76 1178 736 10;
+#X text 18 93 epicycloid;
+#X text 18 116 x(t) = (R+r) cos(t) - p*cos((R+r)t/r);
+#X text 18 140 y(t) = (R+r) sin(t) - p*sin((R+r)t/r);
+#X obj 38 383 #draw_polygon put 1;
+#X obj 287 438 #import ( 4 2 );
+#X obj 38 406 #out window;
+#X obj -22 -22 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 327 375 pack f f f f;
+#X msg 327 404 \$2 \$1 \$4 \$1 \$4 \$3 \$2 \$3;
+#X text 334 350 x;
+#X text 394 352 y;
+#X text 421 354 y+1;
+#X text 357 352 x+1;
+#X floatatom 327 327 5 0 0 0 - - -;
+#X obj 369 325 + 1;
+#X floatatom 405 327 5 0 0 0 - - -;
+#X obj 447 324 + 1;
+#X obj 332 297 t f f;
+#X obj 417 297 t f f;
+#X obj 0 50 s met;
+#X obj 286 350 r met;
+#X obj 468 97 hsl 128 15 5 100 0 1 empty empty empty -2 -6 0 8 -24198
+-1 -1 5500 1;
+#X obj 585 148 hsl 128 15 -100 100 0 1 empty empty empty -2 -6 0 8
+-44926 -1 -1 4000 1;
+#X obj 732 173 hsl 128 15 -150 150 0 1 empty empty empty -2 -6 0 8
+-258699 -1 -1 3200 1;
+#X text 439 52 t = valeur en angles de 0 a 360;
+#X obj 465 153 t f f;
+#X obj 582 180 t f f;
+#X obj 729 193 t f f;
+#X obj 333 127 * 6.28319;
+#X obj 333 106 / 360;
+#X floatatom 333 88 5 0 0 0 - - -;
+#X obj 333 152 t f f;
+#X obj -22 355 #store;
+#X obj 15 205 loadbang;
+#X obj 420 250 expr ($f2+$f3)*sin($f1) - $f4*sin(($f2+$f3)*$f1/$f3)
+;
+#X obj 333 212 expr ($f2+$f3)*cos($f1) - $f4*cos(($f2+$f3)*$f1/$f3)
+;
+#X obj 333 65 + 1;
+#X msg 333 41 1;
+#X floatatom 375 65 5 0 0 0 - - -;
+#X msg 375 16 0;
+#X text 406 19 reset count;
+#X text 129 231 reset image;
+#X text 540 126 r = Rayon du deuxieme cercle -100 a 100;
+#X obj 420 275 + 150;
+#X obj 333 272 + 150;
+#X floatatom 477 123 5 0 0 0 - - -;
+#X floatatom 633 173 5 0 0 0 - - -;
+#X floatatom 779 196 5 0 0 0 - - -;
+#X obj -22 7 metro 1;
+#X obj 33 -21 hsl 128 15 0 15 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X text 440 78 R = Rayon du premier cercle 5 a 100;
+#X obj -38 525 cnv 15 900 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -29 532 GridFlow 0.8.0;
+#X text -29 532 GridFlow 0.8.0;
+#X obj -35 -85 cnv 15 940 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 102 317 #color;
+#X obj 102 268 loadbang;
+#X msg 102 292 230 224 0;
+#X msg 15 232 300 300 3 # 0;
+#X text -22 -72 Copyright 2004 Alexandre Castonguay;
+#X text -22 -85 epicycloid.pd;
+#X text 80 204 start with a blank \, black image;
+#X text 727 158 deuxieme cercle - 150 a 150;
+#X text 727 143 p = distance du centre du;
+#X connect 3 0 5 0;
+#X connect 3 0 32 1;
+#X connect 4 0 3 2;
+#X connect 6 0 48 0;
+#X connect 7 0 8 0;
+#X connect 8 0 4 0;
+#X connect 13 0 7 0;
+#X connect 14 0 7 2;
+#X connect 15 0 7 1;
+#X connect 16 0 7 3;
+#X connect 17 0 13 0;
+#X connect 17 1 14 0;
+#X connect 18 0 15 0;
+#X connect 18 1 16 0;
+#X connect 20 0 7 0;
+#X connect 21 0 25 0;
+#X connect 21 0 45 0;
+#X connect 22 0 26 0;
+#X connect 22 0 46 0;
+#X connect 23 0 27 0;
+#X connect 23 0 47 0;
+#X connect 25 0 35 1;
+#X connect 25 1 34 1;
+#X connect 26 0 35 2;
+#X connect 26 1 34 2;
+#X connect 27 0 35 3;
+#X connect 27 1 34 3;
+#X connect 28 0 31 0;
+#X connect 29 0 28 0;
+#X connect 30 0 29 0;
+#X connect 31 0 35 0;
+#X connect 31 1 34 0;
+#X connect 32 0 3 0;
+#X connect 33 0 58 0;
+#X connect 34 0 43 0;
+#X connect 35 0 44 0;
+#X connect 36 0 38 0;
+#X connect 36 0 30 0;
+#X connect 37 0 36 0;
+#X connect 38 0 36 1;
+#X connect 39 0 38 0;
+#X connect 43 0 18 0;
+#X connect 44 0 17 0;
+#X connect 48 0 19 0;
+#X connect 48 0 32 0;
+#X connect 48 0 37 0;
+#X connect 49 0 48 1;
+#X connect 55 0 3 1;
+#X connect 56 0 57 0;
+#X connect 57 0 55 0;
+#X connect 58 0 32 1;
diff --git a/externals/gridflow/pd_examples/feedback_fractal.pd b/externals/gridflow/pd_examples/feedback_fractal.pd
new file mode 100644
index 00000000..2d012a78
--- /dev/null
+++ b/externals/gridflow/pd_examples/feedback_fractal.pd
@@ -0,0 +1,147 @@
+#N canvas 609 30 779 549 10;
+#N canvas 0 0 450 300 experimental 0;
+#X obj 32 212 outlet 0;
+#X obj 39 81 @for ( 0 0 ) ( 256 256 ) ( 1 1 );
+#X obj 39 55 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 207 64 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 206 87 @for ( 0 0 ) ( 256 256 ) ( 1 1 );
+#X obj 206 109 @ >> ( 4 6 );
+#X obj 39 104 @ << ( 4 2 );
+#X obj 198 140 @inner & ^ 1 ( 2 2 # 85 170 170 85 );
+#X obj 39 126 @ +;
+#X obj 39 33 inlet;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 8 1;
+#X connect 6 0 8 0;
+#X connect 8 0 0 0;
+#X connect 9 0 2 0;
+#X restore 462 229 pd experimental features;
+#X text 527 134 Choose Julia Mapping or Rotation;
+#X obj 31 -34 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 414 67 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 190 59 apply transform (with feedback);
+#X floatatom 454 281 5 0 0 0 - - -;
+#X floatatom 451 323 5 0 0 0 - - -;
+#X msg 84 319 cast uint8 \, bang;
+#X text 530 281 zoom;
+#X text 531 324 move x;
+#X msg 501 324 -45;
+#X msg 501 281 128;
+#X obj 170 60 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 450 92 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 505 133 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X floatatom 451 303 5 0 0 0 - - -;
+#X text 531 303 move y;
+#X msg 501 303 193;
+#X obj 31 -7 metro 33.3667;
+#X obj 450 131 shunt 2;
+#X obj 84 297 loadbang;
+#X obj 414 45 t b b;
+#X obj 414 21 loadbang;
+#X obj 31 276 t a;
+#X obj 202 99 loadbang;
+#X obj 212 119 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 200 266 t a;
+#X obj 31 21 t b b;
+#X obj 73 22 float;
+#X obj 73 41 + 1;
+#X obj 84 61 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 24 256;
+#X obj 508 257 t b;
+#X text 230 120 reset transform;
+#X obj 99 41 mod 60;
+#X obj 73 81 sel 59;
+#X obj 31 113 #store;
+#X obj 31 189 # << 7;
+#X obj 31 223 #fade 10;
+#X obj 31 252 # >> 7;
+#X obj 31 335 #store;
+#X obj 84 340 #in teapot.png;
+#X obj 31 364 #out window;
+#X obj 414 391 # -;
+#X obj 438 367 # - 128;
+#X obj 438 345 #two;
+#X obj 414 303 # /;
+#X obj 414 229 #store;
+#X obj 450 110 #for ( -128 -128 ) ( 128 128 ) ( 1 1 );
+#X obj 446 154 @complex_sq;
+#X obj 461 175 #inner (2 2 # 120 30 -30 120);
+#X obj -13 -87 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj -15 431 cnv 15 780 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 438 GridFlow 0.8.0;
+#X text -7 438 GridFlow 0.8.0;
+#X text 0 -87 feedback_fractal.pd;
+#X text 0 -74 Copyright 2001 Mathieu Bouchard;
+#X obj 212 138 #for (0 0) (256 256) (1 1);
+#X obj 210 210 #convolve (2 2 # 1);
+#X obj 209 232 # >> 2;
+#X obj 200 181 #store;
+#X obj 200 159 #store;
+#X connect 0 0 46 1;
+#X connect 2 0 18 0;
+#X connect 3 0 46 0;
+#X connect 5 0 45 1;
+#X connect 7 0 40 0;
+#X connect 10 0 6 0;
+#X connect 11 0 17 0;
+#X connect 11 0 5 0;
+#X connect 12 0 60 0;
+#X connect 13 0 47 0;
+#X connect 14 0 19 1;
+#X connect 17 0 15 0;
+#X connect 18 0 27 0;
+#X connect 19 0 48 0;
+#X connect 19 1 49 0;
+#X connect 20 0 7 0;
+#X connect 21 0 3 0;
+#X connect 21 1 13 0;
+#X connect 21 1 31 0;
+#X connect 22 0 21 0;
+#X connect 23 0 39 0;
+#X connect 24 0 56 0;
+#X connect 25 0 56 0;
+#X connect 26 0 35 1;
+#X connect 26 0 59 1;
+#X connect 27 0 35 0;
+#X connect 27 1 28 0;
+#X connect 28 0 29 0;
+#X connect 29 0 30 0;
+#X connect 29 0 33 0;
+#X connect 29 0 34 0;
+#X connect 31 0 11 0;
+#X connect 31 0 17 0;
+#X connect 31 0 10 0;
+#X connect 33 0 28 1;
+#X connect 34 0 12 0;
+#X connect 35 0 36 0;
+#X connect 36 0 37 0;
+#X connect 37 0 38 0;
+#X connect 38 0 23 0;
+#X connect 39 0 41 0;
+#X connect 40 0 39 1;
+#X connect 42 0 60 1;
+#X connect 43 0 42 1;
+#X connect 45 0 42 0;
+#X connect 46 0 45 0;
+#X connect 47 0 19 0;
+#X connect 48 0 46 1;
+#X connect 49 0 46 1;
+#X connect 56 0 35 1;
+#X connect 56 0 59 1;
+#X connect 57 0 58 0;
+#X connect 58 0 26 0;
+#X connect 59 0 26 0;
+#X connect 60 0 59 0;
diff --git a/externals/gridflow/pd_examples/fire.pd b/externals/gridflow/pd_examples/fire.pd
new file mode 100644
index 00000000..2a88a3a0
--- /dev/null
+++ b/externals/gridflow/pd_examples/fire.pd
@@ -0,0 +1,180 @@
+#N canvas 399 42 621 522 10;
+#X obj 347 171 loadbang;
+#X text 229 287 palette generator;
+#X obj 103 329 fps detailed;
+#X obj 250 325 #for 0 256 1;
+#X obj 23 180 #store;
+#X obj 250 347 #outer gamma;
+#X obj 103 351 print;
+#X msg 60 130 \$1 \$2 # 0;
+#X obj 71 217 #outer ignore ( 0 );
+#X obj 250 304 #finished;
+#X obj 23 -25 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 204 -21 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 40 71 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 318 304 fork;
+#X text 262 2 height width;
+#X obj 103 307 #out window;
+#X text 101 269 applying palette;
+#X obj 103 287 #store;
+#N canvas 268 454 450 300 circle 0;
+#X obj 47 177 #fold +;
+#X obj 47 244 # << 7;
+#X obj 47 199 # >> 6;
+#X obj 47 157 @! sq;
+#X obj 47 222 # == 10;
+#X obj 47 15 inlet size;
+#X obj 47 267 outlet matrix;
+#X obj 47 126 #for ( 0 0 ) ( 0 0 ) ( 1 1 );
+#X obj 47 34 # / 2;
+#X obj 47 77 t a a;
+#X obj 47 54 #export_list;
+#X obj 47 101 # inv+;
+#X connect 0 0 2 0;
+#X connect 1 0 6 0;
+#X connect 2 0 4 0;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 8 0;
+#X connect 7 0 3 0;
+#X connect 8 0 10 0;
+#X connect 9 0 11 0;
+#X connect 9 1 7 1;
+#X connect 10 0 9 0;
+#X connect 11 0 7 0;
+#X restore 247 84 pd circle generator;
+#N canvas 498 387 361 260 baseline 0;
+#X obj 18 123 #fold +;
+#X obj 127 149 - 4;
+#X obj 18 56 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 18 101 # & ( -1 0 );
+#X obj 18 146 # ==;
+#X obj 127 130 listelement 0;
+#X text 93 10 line generator;
+#X obj 18 166 # << 7;
+#X obj 18 79 #for ( 0 0 ) ( 0 0 ) ( 1 1 );
+#X obj 127 110 #export_list;
+#X obj 18 9 inlet size;
+#X obj 18 187 outlet matrix;
+#X obj 18 33 fork;
+#X text 154 151 four pixels from bottom;
+#X connect 0 0 4 0;
+#X connect 1 0 4 1;
+#X connect 2 0 8 0;
+#X connect 3 0 0 0;
+#X connect 4 0 7 0;
+#X connect 5 0 1 0;
+#X connect 7 0 11 0;
+#X connect 8 0 3 0;
+#X connect 9 0 5 0;
+#X connect 10 0 12 0;
+#X connect 12 0 2 0;
+#X connect 12 1 9 0;
+#X connect 12 1 8 1;
+#X restore 204 117 pd baseline generator;
+#X text 78 236 (height \, width \, 1) grid = grey image;
+#X text 49 113 make blank image;
+#X text 30 163 feedback loop;
+#X text 78 200 (height \, width) grid = matrix;
+#X obj 204 63 shunt 2;
+#X obj 258 64 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 347 213 #color 0 800 1;
+#X msg 347 191 600 200 75;
+#X obj 224 -22 loadbang;
+#N canvas 645 360 400 289 fire 1;
+#X obj 174 180 #store;
+#X obj 61 196 #export_list;
+#X obj 6 65 # >> 2;
+#X obj 6 26 fork;
+#X obj 6 45 #convolve ( 3 3 # 1 0 0 0 1 0 1 1 1 );
+#X obj 6 235 # & 255;
+#X obj 174 115 listmake;
+#X obj 6 103 # / 80;
+#X msg 174 138 \$1 1 # 256;
+#X obj 174 97 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 174 78 route grid;
+#X obj 60 155 inlet;
+#X obj 274 146 # + 32;
+#X obj 60 177 #dim;
+#X obj 6 214 # +;
+#X obj 6 258 outlet 0;
+#X msg 274 101 256 \$2 # 64;
+#X obj 6 84 # *;
+#X obj 6 7 inlet image;
+#X obj 274 79 inlet size;
+#X text 102 8 this fire algorithm;
+#X text 101 22 was designed by matju in 1994;
+#X text 264 167 makes a cache of;
+#X text 264 180 random numbers;
+#X obj 174 159 # rand;
+#X obj 274 123 # rand;
+#X connect 0 0 17 1;
+#X connect 1 0 6 1;
+#X connect 2 0 17 0;
+#X connect 3 0 4 0;
+#X connect 3 1 10 0;
+#X connect 4 0 2 0;
+#X connect 5 0 15 0;
+#X connect 6 0 8 0;
+#X connect 7 0 14 0;
+#X connect 8 0 24 0;
+#X connect 9 0 6 0;
+#X connect 10 0 9 0;
+#X connect 11 0 14 1;
+#X connect 11 0 13 0;
+#X connect 12 0 0 1;
+#X connect 13 0 1 0;
+#X connect 14 0 5 0;
+#X connect 16 0 25 0;
+#X connect 17 0 7 0;
+#X connect 18 0 3 0;
+#X connect 19 0 16 0;
+#X connect 24 0 0 0;
+#X connect 25 0 12 0;
+#X restore 71 180 pd fire generator;
+#X text 183 46 note: reset the size if you change the generator;
+#X msg 204 2 80 256;
+#X obj 23 -2 metro 33.3667;
+#X obj -15 -84 cnv 15 620 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -5 -84 fire.pd;
+#X text -5 -71 Copyright 2001 Mathieu Bouchard;
+#X obj -15 403 cnv 15 620 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 411 GridFlow 0.8.0;
+#X text -7 411 GridFlow 0.8.0;
+#X connect 0 0 27 0;
+#X connect 2 0 6 0;
+#X connect 3 0 5 0;
+#X connect 4 0 29 0;
+#X connect 5 0 17 1;
+#X connect 7 0 4 1;
+#X connect 8 0 17 0;
+#X connect 9 0 3 0;
+#X connect 10 0 32 0;
+#X connect 11 0 31 0;
+#X connect 12 0 4 0;
+#X connect 13 0 9 0;
+#X connect 13 1 5 1;
+#X connect 15 0 2 0;
+#X connect 17 0 15 0;
+#X connect 18 0 29 1;
+#X connect 19 0 29 1;
+#X connect 24 0 19 0;
+#X connect 24 1 18 0;
+#X connect 25 0 24 1;
+#X connect 26 0 13 0;
+#X connect 27 0 26 0;
+#X connect 28 0 31 0;
+#X connect 29 0 8 0;
+#X connect 29 0 4 1;
+#X connect 31 0 7 0;
+#X connect 31 0 29 2;
+#X connect 31 0 24 0;
+#X connect 32 0 4 0;
diff --git a/externals/gridflow/pd_examples/game_of_life.pd b/externals/gridflow/pd_examples/game_of_life.pd
new file mode 100644
index 00000000..c35187a9
--- /dev/null
+++ b/externals/gridflow/pd_examples/game_of_life.pd
@@ -0,0 +1,67 @@
+#N canvas 400 83 719 454 10;
+#X text 41 -19 click here;
+#X obj 23 -17 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 31 251 #out window;
+#X text 48 92 this is the feedback loop;
+#X obj 123 0 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 141 -1 for 0 10 1;
+#X obj 263 53 loadbang;
+#X obj 141 73 #store;
+#X obj 141 19 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 31 291 print;
+#X obj 31 271 fps detailed;
+#X obj 31 113 fork;
+#X text 159 19 next;
+#N canvas 0 0 450 210 game 0;
+#X obj 28 64 inlet matrix;
+#X obj 28 141 outlet matrix;
+#X text 18 14 this part at the left defines the rule of the game (this
+is my own rewriting of the rules. it is equivalent to the original
+but faster to compute.);
+#X obj 28 83 # << (b # 1);
+#X obj 28 103 #convolve (3 3 b # 0 0 0 0 1) \, op >> \, seed (b # -5)
+;
+#X obj 28 122 # < (b # 3);
+#X connect 0 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
+#X restore 31 72 pd game of life;
+#X text 260 20 init with a random map;
+#X text 262 35 10% white dots;
+#X text 33 179 convert this 1-bit matrix to standard RGB \; 1 becomes
+-1 becomes 255 \, but 0 stays 0;
+#X obj 23 15 metro 5;
+#X obj -15 339 cnv 15 780 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 346 GridFlow 0.8.0;
+#X text -7 346 GridFlow 0.8.0;
+#X obj -13 -85 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 0 -85 game_of_life.pd;
+#X text 0 -72 Copyright 2001 Mathieu Bouchard;
+#X obj 263 97 # rand (b #);
+#X obj 263 119 # == (b # 0);
+#X msg 263 75 240 320 b # 10;
+#X obj 31 209 # inv+ (b # 0);
+#X obj 31 230 #outer ignore (3 b #);
+#X connect 1 0 17 0;
+#X connect 2 0 10 0;
+#X connect 4 0 5 0;
+#X connect 5 0 8 0;
+#X connect 6 0 26 0;
+#X connect 7 0 13 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X connect 11 0 27 0;
+#X connect 11 1 7 1;
+#X connect 13 0 11 0;
+#X connect 17 0 7 0;
+#X connect 24 0 25 0;
+#X connect 25 0 11 0;
+#X connect 26 0 24 0;
+#X connect 27 0 28 0;
+#X connect 28 0 2 0;
diff --git a/externals/gridflow/pd_examples/goop.pd b/externals/gridflow/pd_examples/goop.pd
new file mode 100644
index 00000000..8f96d2c4
--- /dev/null
+++ b/externals/gridflow/pd_examples/goop.pd
@@ -0,0 +1,138 @@
+#N canvas 481 120 730 701 10;
+#X obj 91 -43 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 91 8 #camera;
+#X obj 38 113 t a a;
+#X msg 96 114 240 320 3 #;
+#X obj 95 92 loadbang;
+#N canvas 286 95 450 300 analysis 0;
+#X obj 46 17 inlet;
+#X obj 49 236 outlet;
+#X obj 64 67 spigot;
+#X obj 46 44 t a a;
+#X obj 114 68 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 114 15 inlet;
+#X obj 49 86 # -;
+#X obj 49 129 # - 30;
+#X obj 49 154 # max 0;
+#X obj 49 182 # * 20;
+#X obj 49 211 # min 256;
+#X obj 49 108 @! abs;
+#X connect 0 0 3 0;
+#X connect 2 0 6 1;
+#X connect 3 0 2 0;
+#X connect 3 1 6 0;
+#X connect 4 0 2 1;
+#X connect 5 0 4 0;
+#X connect 6 0 11 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 11 0 7 0;
+#X restore 192 94 pd analysis;
+#X obj 275 94 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 123 433 r cam;
+#X obj 113 67 s cam;
+#X obj 91 33 t a a b;
+#X obj 340 65 loadbang;
+#X msg 307 66 1;
+#X obj 417 85 loadbang;
+#X msg 306 88 0;
+#X obj 150 484 loadbang;
+#X msg 150 504 set_geometry 0 0 480 640 \, hidecursor;
+#X obj 338 89 delay 5000;
+#X obj 91 -17 metro 33.3667;
+#X obj -15 -84 cnv 15 640 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj -17 582 cnv 15 640 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -6 592 GridFlow 0.8.0;
+#X text 157 9 <-- open this and set your camera up;
+#X obj 38 92 #store;
+#X obj 71 143 # put 63;
+#X obj 71 164 # rand;
+#X obj 38 184 # +;
+#X obj 161 144 # *>>8;
+#X obj 192 121 # inv+ 256;
+#X obj 38 211 #convolve (1 5 # 1);
+#X obj 39 233 #convolve (5 1 # 1);
+#X obj 39 306 # max -128;
+#X obj 39 325 # min 127;
+#X obj 39 344 # + 128;
+#X obj 39 365 #inner (3 3 # 3 0 1 1 3 0 0 1 3);
+#X obj 39 387 # >> 2;
+#X obj 113 383 # inv+ 255;
+#X obj 39 407 # *>>8;
+#X obj 39 431 # +;
+#X obj 70 431 # *>>8;
+#X obj 39 457 #clip;
+#X obj 337 209 #rgb_to_greyscale;
+#X obj 337 235 # +;
+#X obj 337 256 #convolve (1 3 # 1);
+#X obj 337 278 #convolve (3 1 # 1);
+#X obj 337 324 # min 255;
+#X obj 337 345 #greyscale_to_rgb;
+#X obj 116 547 #out window;
+#X text 1 -85 goop.pd;
+#X obj 39 478 #scale_by 2;
+#X obj 71 185 # - 31;
+#X obj 337 301 # *>>8 27;
+#X obj 39 287 # *>>8 25;
+#X text 1 -71 Copyright 2004 Mathieu Bouchard;
+#X obj 39 261 # + 5;
+#X connect 0 0 17 0;
+#X connect 1 0 9 0;
+#X connect 2 0 25 0;
+#X connect 2 1 23 0;
+#X connect 3 0 22 1;
+#X connect 4 0 3 0;
+#X connect 5 0 27 0;
+#X connect 5 0 40 0;
+#X connect 6 0 5 1;
+#X connect 7 0 38 0;
+#X connect 9 0 5 0;
+#X connect 9 1 8 0;
+#X connect 9 2 22 0;
+#X connect 10 0 11 0;
+#X connect 11 0 6 0;
+#X connect 12 0 16 0;
+#X connect 13 0 6 0;
+#X connect 14 0 15 0;
+#X connect 15 0 46 0;
+#X connect 16 0 13 0;
+#X connect 17 0 1 0;
+#X connect 22 0 2 0;
+#X connect 23 0 24 0;
+#X connect 24 0 49 0;
+#X connect 25 0 28 0;
+#X connect 26 0 22 1;
+#X connect 27 0 26 1;
+#X connect 28 0 29 0;
+#X connect 29 0 53 0;
+#X connect 30 0 31 0;
+#X connect 31 0 26 0;
+#X connect 31 0 32 0;
+#X connect 32 0 33 0;
+#X connect 33 0 34 0;
+#X connect 34 0 36 0;
+#X connect 35 0 36 1;
+#X connect 36 0 37 0;
+#X connect 37 0 39 0;
+#X connect 38 0 37 1;
+#X connect 39 0 48 0;
+#X connect 40 0 41 0;
+#X connect 41 0 42 0;
+#X connect 42 0 43 0;
+#X connect 43 0 50 0;
+#X connect 44 0 41 1;
+#X connect 44 0 45 0;
+#X connect 45 0 35 0;
+#X connect 45 0 38 1;
+#X connect 48 0 46 0;
+#X connect 49 0 25 1;
+#X connect 50 0 44 0;
+#X connect 51 0 30 0;
+#X connect 53 0 51 0;
diff --git a/externals/gridflow/pd_examples/hello-world.pd b/externals/gridflow/pd_examples/hello-world.pd
new file mode 100644
index 00000000..fb101d24
--- /dev/null
+++ b/externals/gridflow/pd_examples/hello-world.pd
@@ -0,0 +1,38 @@
+#N canvas 604 118 501 445 10;
+#X obj 46 67 # / 320;
+#X obj 46 187 # * 255;
+#X obj 46 153 # != 0;
+#X obj 46 -12 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 46 280 #out window;
+#X obj 46 99 # inv+ 7;
+#X obj 46 15 #for 0 320 1;
+#X obj 46 48 # * 7;
+#X obj 46 -34 loadbang;
+#X text 66 -12 make one line:;
+#X text 54 31 numbers 0 to 319;
+#X text 55 84 numbers 0 to 6 repeated 45 or 46 times;
+#X text 56 116 numbers 7 down to 1 ...;
+#X text 53 172 3*1-bit rgb image line;
+#X text 83 206 3*8-bit rgb image line;
+#X text 53 234 repeat line 240 times;
+#X obj -13 -85 cnv 15 500 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 0 -86 hello-world.pd;
+#X obj 46 134 #outer & (2 4 1);
+#X obj 46 252 #redim (240 320 3);
+#X obj -14 319 cnv 15 500 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 325 GridFlow 0.8.0;
+#X text -7 325 GridFlow 0.8.0;
+#X text 0 -72 Copyright 2001 Mathieu Bouchard;
+#X connect 0 0 5 0;
+#X connect 1 0 19 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 5 0 18 0;
+#X connect 6 0 7 0;
+#X connect 7 0 0 0;
+#X connect 8 0 3 0;
+#X connect 18 0 2 0;
+#X connect 19 0 4 0;
diff --git a/externals/gridflow/pd_examples/image_stats.pd b/externals/gridflow/pd_examples/image_stats.pd
new file mode 100644
index 00000000..9f9c753a
--- /dev/null
+++ b/externals/gridflow/pd_examples/image_stats.pd
@@ -0,0 +1,62 @@
+#N canvas 391 151 716 416 10;
+#X obj 257 173 print total_value;
+#X obj 523 151 #dim;
+#X obj 22 187 #export_list;
+#X obj 328 150 print number_of_values;
+#X obj 523 200 print number_of_dimensions;
+#X obj 523 173 #export;
+#X obj 185 91 #fold +;
+#X obj 281 201 /;
+#X obj 185 135 #fold +;
+#X obj 22 215 print total_pixel;
+#X obj 185 57 fork;
+#X obj 245 28 #in;
+#X obj 328 106 #fold * \, seed 1;
+#X obj 480 112 print dimensions;
+#X obj 281 228 print average_value;
+#X obj 186 157 #export;
+#X obj 185 113 #fold +;
+#X obj 480 90 #export_list;
+#X obj 480 68 #dim;
+#X obj 328 84 #dim;
+#X obj 328 128 #export;
+#X msg 271 -35 open bluemarble.jpg \, bang;
+#X msg 271 -15 open teapot.png \, bang;
+#X msg 271 5 open r001.jpg \, bang;
+#X obj -15 304 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 311 GridFlow 0.8.0;
+#X text -7 311 GridFlow 0.8.0;
+#X obj -13 -85 cnv 15 720 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -5 -72 Copyright 2001 Mathieu Bouchard;
+#X text -5 -86 image_stats.pd;
+#X obj 22 131 #fold + \, seed (3 #);
+#X obj 22 92 #fold + \, seed (3 #);
+#X text 460 -36 <-- click on one of these;
+#X connect 1 0 5 0;
+#X connect 2 0 9 0;
+#X connect 5 0 4 0;
+#X connect 6 0 16 0;
+#X connect 7 0 14 0;
+#X connect 8 0 15 0;
+#X connect 10 0 6 0;
+#X connect 10 0 31 0;
+#X connect 10 1 19 0;
+#X connect 11 0 10 0;
+#X connect 11 0 18 0;
+#X connect 12 0 20 0;
+#X connect 15 0 0 0;
+#X connect 15 0 7 0;
+#X connect 16 0 8 0;
+#X connect 17 0 13 0;
+#X connect 18 0 17 0;
+#X connect 18 0 1 0;
+#X connect 19 0 12 0;
+#X connect 20 0 3 0;
+#X connect 20 0 7 1;
+#X connect 21 0 11 0;
+#X connect 22 0 11 0;
+#X connect 23 0 11 0;
+#X connect 30 0 2 0;
+#X connect 31 0 30 0;
diff --git a/externals/gridflow/pd_examples/linear_transform.pd b/externals/gridflow/pd_examples/linear_transform.pd
new file mode 100644
index 00000000..b5e87d8d
--- /dev/null
+++ b/externals/gridflow/pd_examples/linear_transform.pd
@@ -0,0 +1,123 @@
+#N canvas 454 137 685 580 10;
+#X text 455 -6 click here to go in manual mode;
+#X floatatom 138 224 5 0 0 0 - - -;
+#X obj 7 289 # >> 11;
+#X obj 7 62 #store;
+#X obj 194 204 hsl 128 15 -4096 4096 0 0 empty empty empty -2 -6 0
+8 -260818 -1 -1 0 1;
+#X obj 545 123 * 3;
+#X obj 418 376 # sin*;
+#X obj 194 223 hsl 128 15 -4096 4096 0 0 empty empty empty -2 -6 0
+8 -260818 -1 -1 0 1;
+#X floatatom 138 170 5 0 0 0 - - -;
+#X msg 448 137 10000;
+#X obj 7 -26 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X obj 194 166 hsl 128 15 -4096 4096 0 0 empty empty empty -2 -6 0
+8 -260818 -1 -1 0 1;
+#X obj 94 40 loadbang;
+#X obj 82 266 #redim ( 2 2 );
+#X text 191 147 linear transform;
+#X obj 7 310 # + 128;
+#X floatatom 138 188 5 0 0 0 - - -;
+#X floatatom 138 206 5 0 0 0 - - -;
+#X obj 194 185 hsl 128 15 -4096 4096 0 0 empty empty empty -2 -6 0
+8 -260818 -1 -1 0 1;
+#X obj 418 175 vsl 15 128 0 35999 0 0 empty empty empty 0 -8 0 8 -260818
+-1 -1 12700 1;
+#X obj 453 174 vsl 15 128 -10000 10000 0 0 empty empty empty 0 -8 0
+8 -260818 -1 -1 7400 1;
+#X obj 427 34 % 36000;
+#X obj 448 116 loadbang;
+#X text 360 146 rotozoomer;
+#X obj 545 143 # sin* 100;
+#X obj 384 -6 shunt 2;
+#X msg 132 342 open teapot.png \, bang;
+#X msg 545 215 set \$1;
+#X obj 132 321 loadbang;
+#X obj 7 363 #store;
+#X obj 7 384 #out window;
+#X obj 453 312 t b f;
+#X obj 439 -5 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 1 1
+;
+#X obj 81 247 #pack 4;
+#X obj 7 35 t b b;
+#X obj 384 33 float;
+#X obj 427 14 + 100;
+#X obj 545 164 # inv* 100000;
+#X obj 545 185 #export;
+#X obj 63 341 #camera;
+#X obj 132 363 #in;
+#X obj 63 321 spigot;
+#X obj 111 322 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 7 268 #inner;
+#X obj 81 144 loadbang;
+#X obj 23 412 fps detailed;
+#X obj 23 435 print;
+#X obj 7 8 metro 5;
+#X obj -18 -85 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 1 -72 Copyright 2002 Mathieu Bouchard;
+#X text 1 -85 convolve.pd;
+#X obj -18 -85 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 1 -85 linear_transform.pd;
+#X obj 94 61 #for (-128 -128) (128 128) (1 1);
+#X obj 418 355 #outer + (9000 18000 0 9000);
+#X text 1 -72 Copyright 2001 Mathieu Bouchard;
+#X obj -18 464 cnv 15 780 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -10 471 GridFlow 0.8.0;
+#X text -10 471 GridFlow 0.8.0;
+#X connect 1 0 33 3;
+#X connect 2 0 15 0;
+#X connect 3 0 43 0;
+#X connect 4 0 17 0;
+#X connect 5 0 24 0;
+#X connect 6 0 13 0;
+#X connect 7 0 1 0;
+#X connect 8 0 33 0;
+#X connect 9 0 20 0;
+#X connect 10 0 47 0;
+#X connect 11 0 8 0;
+#X connect 12 0 53 0;
+#X connect 13 0 43 1;
+#X connect 15 0 29 0;
+#X connect 16 0 33 1;
+#X connect 17 0 33 2;
+#X connect 18 0 16 0;
+#X connect 19 0 54 0;
+#X connect 20 0 31 0;
+#X connect 21 0 35 1;
+#X connect 22 0 9 0;
+#X connect 24 0 37 0;
+#X connect 25 0 35 0;
+#X connect 26 0 40 0;
+#X connect 27 0 20 0;
+#X connect 28 0 26 0;
+#X connect 29 0 30 0;
+#X connect 30 0 45 0;
+#X connect 31 0 19 0;
+#X connect 31 1 6 1;
+#X connect 32 0 25 1;
+#X connect 33 0 13 0;
+#X connect 34 0 3 0;
+#X connect 34 1 25 0;
+#X connect 34 1 41 0;
+#X connect 35 0 36 0;
+#X connect 35 0 19 0;
+#X connect 35 0 5 0;
+#X connect 36 0 21 0;
+#X connect 37 0 38 0;
+#X connect 38 0 27 0;
+#X connect 38 0 31 0;
+#X connect 39 0 29 1;
+#X connect 40 0 29 1;
+#X connect 41 0 39 0;
+#X connect 42 0 41 1;
+#X connect 43 0 2 0;
+#X connect 44 0 33 0;
+#X connect 45 0 46 0;
+#X connect 47 0 34 0;
+#X connect 53 0 3 1;
+#X connect 54 0 6 0;
diff --git a/externals/gridflow/pd_examples/motion_detect.pd b/externals/gridflow/pd_examples/motion_detect.pd
new file mode 100644
index 00000000..c0d00178
--- /dev/null
+++ b/externals/gridflow/pd_examples/motion_detect.pd
@@ -0,0 +1,44 @@
+#N canvas 564 180 494 470 10;
+#X obj 32 -33 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 37 193 #downscale_by ( 15 20 ) smoothly;
+#X obj 37 219 #scale_by ( 32 32 );
+#X obj 37 251 #out window;
+#X obj 32 42 t a a;
+#X obj 37 68 # -;
+#X obj 37 91 @! abs;
+#X obj 37 114 # * 8;
+#X obj 37 140 # - 64;
+#X obj 61 291 fps detailed;
+#X obj 61 311 print;
+#X obj 32 -6 metro 33.3667;
+#X obj 32 18 #camera;
+#X obj 37 165 #clip;
+#X obj -15 353 cnv 15 500 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 360 GridFlow 0.8.0;
+#X text -7 360 GridFlow 0.8.0;
+#X obj -13 -85 cnv 15 500 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -5 -85 motion_detect.pd;
+#X text -6 -72 Copyright 2001 Mathieu Bouchard;
+#X obj 181 253 display;
+#X text 127 79 This patch demonstrates the basis of motion detection.
+The substraction of two subsequent frames after [t a a]. It then downscales
+and rescales the image \, breaking it down into larger regions that
+can be monitored for changes.;
+#X connect 0 0 11 0;
+#X connect 1 0 2 0;
+#X connect 1 0 20 0;
+#X connect 2 0 3 0;
+#X connect 3 0 9 0;
+#X connect 4 0 5 1;
+#X connect 4 1 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 13 0;
+#X connect 9 0 10 0;
+#X connect 11 0 12 0;
+#X connect 12 0 4 0;
+#X connect 13 0 1 0;
diff --git a/externals/gridflow/pd_examples/nervous_video.pd b/externals/gridflow/pd_examples/nervous_video.pd
new file mode 100644
index 00000000..1f20094e
--- /dev/null
+++ b/externals/gridflow/pd_examples/nervous_video.pd
@@ -0,0 +1,154 @@
+#N canvas 446 102 590 659 10;
+#X obj 33 30 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 123 298 450 300 counter 0;
+#X obj 131 70 + 1;
+#X obj 131 23 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 170 70 5 0 0 0 - - -;
+#X msg 131 47 1;
+#X floatatom 170 114 5 0 0 0 - - -;
+#X obj 132 157 select 1;
+#X msg 170 44 0;
+#X obj 132 178 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 70 25 inlet;
+#X obj 132 195 outlet;
+#X obj 220 65 inlet;
+#X obj 298 106 outlet;
+#X obj 170 95 >= 32;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 1;
+#X connect 2 0 11 0;
+#X connect 2 0 12 0;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 0 7 0;
+#X connect 6 0 2 0;
+#X connect 7 0 9 0;
+#X connect 8 0 1 0;
+#X connect 10 0 12 1;
+#X connect 12 0 4 0;
+#X restore 241 137 pd counter;
+#X obj 24 252 / 10;
+#X floatatom 24 290 5 0 0 0 - - -;
+#X obj 24 -26 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X floatatom 25 504 5 0 0 0 - - -;
+#X obj 24 484 fps;
+#X obj 24 2 metro 33.3667;
+#X msg 24 314 list \$1;
+#X msg 225 315 reassign \, 32 240 320 3 #;
+#X msg 225 295 reassign \, 32 120 160 3 #;
+#X msg 225 335 reassign \, 32 480 640 3 #;
+#X msg 316 94 32;
+#X obj 24 233 random 320;
+#X obj 24 461 #out window;
+#X floatatom 316 114 5 0 0 0 - - -;
+#X obj 347 94 loadbang;
+#X text 358 113 maximum value is 32;
+#X text 359 126 (see below);
+#X obj 24 120 float;
+#X text 203 277 the buffer size decides the maximum loop length;
+#X obj 24 189 shunt 4;
+#X obj 24 213 bang;
+#X obj 24 271 int;
+#X obj 145 163 vradio 15 1 0 4 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 166 163 caffeine twitch;
+#X text 166 178 ethanol lag;
+#X obj 131 233 * 2;
+#X obj 160 234 * -1;
+#X text 166 209 back flash acid;
+#X text 165 193 acid flash back;
+#X obj 255 369 vradio 15 1 0 4 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 273 366 plain;
+#X text 274 399 hilitemotion;
+#X text 273 415 embossmotion;
+#X obj 80 402 @! abs;
+#X text 133 -3 This patch was created by Alexandre Castonguay \,;
+#X text 133 10 as a clone of Edo Tannenbaum's "nervous video" effect
+\, http://effectv.sourceforge.net;
+#X text 133 38 Later modified by Mathieu to add more effects;
+#X obj 80 381 # -;
+#X obj 81 421 # << 2;
+#X obj 102 233 + 1;
+#X obj 135 382 # -;
+#X obj 136 401 # + 128;
+#X obj 136 421 # max 0;
+#X obj 80 441 # min 255;
+#X obj 24 358 shunt 4;
+#X obj 119 353 shunt 4;
+#X text 273 384 mix 50%;
+#X obj 34 421 # >> 1;
+#X obj 38 388 # +;
+#X obj 89 101 #camera;
+#X obj 24 53 t b b b;
+#X obj -16 536 cnv 15 700 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 543 GridFlow 0.8.0;
+#X text -7 543 GridFlow 0.8.0;
+#X obj -17 -85 cnv 15 700 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -6 -86 nervous_video.pd;
+#X text -7 -74 Copyright 2002 Alexandre Castonguay \, Mathieu Bouchard
+;
+#X text 146 101 <-- open this;
+#X obj 24 333 #store (32 240 320 3 #);
+#X msg 316 165 put_at ( \$1 0 0 0 );
+#X connect 0 0 52 0;
+#X connect 1 1 61 0;
+#X connect 1 1 19 1;
+#X connect 2 0 23 0;
+#X connect 3 0 8 0;
+#X connect 4 0 7 0;
+#X connect 6 0 5 0;
+#X connect 7 0 52 0;
+#X connect 8 0 60 0;
+#X connect 9 0 60 1;
+#X connect 10 0 60 1;
+#X connect 11 0 60 1;
+#X connect 12 0 15 0;
+#X connect 13 0 2 0;
+#X connect 14 0 6 0;
+#X connect 15 0 1 1;
+#X connect 16 0 12 0;
+#X connect 19 0 21 0;
+#X connect 21 0 22 0;
+#X connect 21 1 41 0;
+#X connect 21 2 27 0;
+#X connect 21 3 28 0;
+#X connect 22 0 13 0;
+#X connect 23 0 3 0;
+#X connect 24 0 21 1;
+#X connect 27 0 8 0;
+#X connect 28 0 8 0;
+#X connect 31 0 47 1;
+#X connect 31 0 46 1;
+#X connect 35 0 40 0;
+#X connect 39 0 35 0;
+#X connect 40 0 45 0;
+#X connect 41 0 8 0;
+#X connect 42 0 43 0;
+#X connect 43 0 44 0;
+#X connect 44 0 45 0;
+#X connect 45 0 14 0;
+#X connect 46 0 14 0;
+#X connect 46 1 50 0;
+#X connect 46 2 39 0;
+#X connect 46 3 42 0;
+#X connect 47 1 50 1;
+#X connect 47 2 39 1;
+#X connect 47 3 42 1;
+#X connect 49 0 14 0;
+#X connect 50 0 49 0;
+#X connect 51 0 47 0;
+#X connect 51 0 60 1;
+#X connect 52 0 19 0;
+#X connect 52 1 51 0;
+#X connect 52 2 1 0;
+#X connect 60 0 46 0;
+#X connect 61 0 60 1;
diff --git a/externals/gridflow/pd_examples/photo_pianoroll.pd b/externals/gridflow/pd_examples/photo_pianoroll.pd
new file mode 100644
index 00000000..b97e2008
--- /dev/null
+++ b/externals/gridflow/pd_examples/photo_pianoroll.pd
@@ -0,0 +1,159 @@
+#N canvas 476 141 695 640 10;
+#X obj 146 24 #in lada.jpg;
+#X obj 58 479 #out window;
+#X obj 28 -9 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 58 93 #store;
+#X obj 164 3 loadbang;
+#X text 268 -34 How to play a car;
+#X obj 146 4 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 406 488 dac~;
+#X obj 333 54 +;
+#X msg 333 33 1;
+#X obj 361 54 % 365;
+#N canvas 0 0 450 300 fft 0;
+#X obj 23 68 rifft~;
+#X obj 23 88 outlet~;
+#X obj 359 16 block~ 1024;
+#X obj 23 48 tabreceive~ array2;
+#X connect 0 0 1 0;
+#X connect 3 0 0 0;
+#X restore 405 448 pd fft;
+#X obj 7 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1
+;
+#X obj 28 40 t b b;
+#X msg 284 418 4 2 # 0 0 0 502 1 502 1 0;
+#X obj 284 437 # +;
+#X obj 58 418 t a b;
+#X msg 311 437 \$1 0;
+#X obj 58 439 #greyscale_to_rgb;
+#X obj 477 135 #store;
+#X obj 476 214 #export_list;
+#X obj 517 234 s array1;
+#X obj 477 174 #cast float32;
+#X obj 186 126 # inv+ 255;
+#X obj 146 64 # min 255;
+#X obj 146 45 # * 3;
+#X msg 477 113 1 1 # \$1;
+#X obj 444 14 table array1 502;
+#X obj 477 234 t b a;
+#X obj 350 437 r row;
+#X obj 361 76 s row;
+#X obj 478 285 t f f;
+#X obj 480 392 tabwrite array2;
+#X obj 479 326 exp;
+#X obj 137 221 #mouse \, ...;
+#X obj 272 242 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 224 243 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 165 374 #draw_polygon put;
+#X msg 272 259 1 # 255;
+#X msg 223 261 1 # 0;
+#X obj 169 350 spigot;
+#X obj 280 292 t a a;
+#X obj 294 374 # +;
+#X obj 146 139 t a;
+#X msg 280 314 4 2 # 0 0 0 1 1 1 1 0;
+#X obj 280 336 # *;
+#X obj 357 333 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262131 -1 -1 20 256;
+#X msg 185 182 365 502 1 # 255;
+#X text 296 182 clear;
+#X obj 480 373 tabread4 array1;
+#X obj 477 265 for 0 64 1;
+#X obj 477 154 #fade 5;
+#X obj 444 35 table array2 1024;
+#X obj 406 468 lop~ 1000;
+#X obj 479 305 / 20;
+#X obj 480 346 * 22;
+#X obj 28 19 metro 46.44;
+#X obj 357 350 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262131 -1 -1 1 256;
+#X obj 325 373 #pack 2;
+#X obj 475 194 # / ( float32 # 4000 );
+#X obj 186 155 #convolve ( 1 7 # 1 1 2 8 2 1 1 );
+#X obj 514 90 # >> 4;
+#X obj 146 84 #convolve ( 2 2 # 1 );
+#X obj 146 103 # >> 2;
+#X obj 58 459 #draw_polygon put (3 # 255 0 0);
+#X obj -18 524 cnv 15 700 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -10 531 GridFlow 0.8.0;
+#X text -10 531 GridFlow 0.8.0;
+#X obj -18 -85 cnv 15 700 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -3 -86 photo_pianoroll.pd;
+#X text -5 -72 Copyright 2004 Mathieu Bouchard;
+#X connect 0 0 25 0;
+#X connect 1 0 34 0;
+#X connect 2 0 56 0;
+#X connect 3 0 16 0;
+#X connect 3 0 40 0;
+#X connect 4 0 0 0;
+#X connect 6 0 0 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 0;
+#X connect 10 0 8 1;
+#X connect 10 0 30 0;
+#X connect 10 0 26 0;
+#X connect 11 0 53 0;
+#X connect 12 0 13 0;
+#X connect 13 0 9 0;
+#X connect 13 1 3 0;
+#X connect 14 0 15 0;
+#X connect 15 0 64 2;
+#X connect 16 0 18 0;
+#X connect 16 1 14 0;
+#X connect 17 0 15 1;
+#X connect 18 0 64 0;
+#X connect 19 0 51 0;
+#X connect 20 0 28 0;
+#X connect 22 0 59 0;
+#X connect 23 0 60 0;
+#X connect 24 0 62 0;
+#X connect 25 0 24 0;
+#X connect 26 0 19 0;
+#X connect 28 0 50 0;
+#X connect 28 1 21 0;
+#X connect 29 0 17 0;
+#X connect 31 0 54 0;
+#X connect 31 1 32 1;
+#X connect 33 0 55 0;
+#X connect 34 0 41 0;
+#X connect 34 1 41 0;
+#X connect 34 4 36 0;
+#X connect 34 4 40 1;
+#X connect 34 6 35 0;
+#X connect 34 6 40 1;
+#X connect 35 0 38 0;
+#X connect 36 0 39 0;
+#X connect 37 0 43 0;
+#X connect 38 0 37 1;
+#X connect 39 0 37 1;
+#X connect 40 0 37 0;
+#X connect 41 0 44 0;
+#X connect 41 1 42 1;
+#X connect 42 0 37 2;
+#X connect 43 0 3 1;
+#X connect 43 0 23 0;
+#X connect 44 0 45 0;
+#X connect 45 0 42 0;
+#X connect 46 0 58 0;
+#X connect 47 0 43 0;
+#X connect 49 0 32 0;
+#X connect 50 0 31 0;
+#X connect 51 0 22 0;
+#X connect 53 0 7 0;
+#X connect 53 0 7 1;
+#X connect 54 0 33 0;
+#X connect 55 0 49 0;
+#X connect 56 0 13 0;
+#X connect 57 0 58 1;
+#X connect 58 0 45 1;
+#X connect 59 0 20 0;
+#X connect 60 0 61 0;
+#X connect 61 0 19 1;
+#X connect 62 0 63 0;
+#X connect 63 0 43 0;
+#X connect 64 0 1 0;
diff --git a/externals/gridflow/pd_examples/plot.pd b/externals/gridflow/pd_examples/plot.pd
new file mode 100644
index 00000000..dad9db76
--- /dev/null
+++ b/externals/gridflow/pd_examples/plot.pd
@@ -0,0 +1,73 @@
+#N canvas 211 415 621 272 10;
+#N canvas 803 450 420 235 plot-a-function 0;
+#X obj 8 61 # inv+ 640;
+#X obj 8 40 #for 0 640 1;
+#X obj 105 59 outlet;
+#X obj 33 175 #outer <;
+#X obj 105 80 inlet;
+#X text 209 199 to rgb;
+#X text 97 176 make graph \, twotone channelless;
+#X obj 35 232 outlet;
+#X obj 105 34 #for 0 640 1;
+#X obj 105 10 inlet;
+#X obj 92 132 #finished;
+#X obj 105 103 t a a;
+#X obj 33 200 #outer * (255 255 255);
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 3 0 12 0;
+#X connect 4 0 11 0;
+#X connect 8 0 2 0;
+#X connect 9 0 8 0;
+#X connect 10 0 1 0;
+#X connect 11 0 10 0;
+#X connect 11 1 3 1;
+#X connect 12 0 7 0;
+#X restore 57 47 pd plot-a-function ( tm );
+#X obj 257 81 # + 320;
+#X obj 57 72 #out window;
+#X obj 256 -3 # - 320;
+#X obj 256 53 # tanh* 343;
+#X obj 256 25 # * 30;
+#X obj 33 15 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj -16 -85 cnv 15 620 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj -15 152 cnv 15 620 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 159 GridFlow 0.8.0;
+#X text -7 159 GridFlow 0.8.0;
+#X text -3 -86 plot.pd;
+#X obj 57 -10 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 57 14 metro 100;
+#X obj 360 -3 hsl 128 15 0 500 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 3600 1;
+#X floatatom 314 -2 5 0 0 0 - - -;
+#X obj 358 25 hsl 128 15 0 500 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 1300 1;
+#X floatatom 311 26 5 0 0 0 - - -;
+#X obj 390 54 hsl 128 15 0 500 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 6700 1;
+#X floatatom 343 54 5 0 0 0 - - -;
+#X obj 361 82 hsl 128 15 0 500 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 5600 1;
+#X floatatom 314 82 5 0 0 0 - - -;
+#X text -3 -72 Copyright 2003 Mathieu Bouchard;
+#X connect 0 0 2 0;
+#X connect 0 1 3 0;
+#X connect 1 0 0 1;
+#X connect 3 0 5 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 12 0 13 0;
+#X connect 13 0 0 0;
+#X connect 14 0 15 0;
+#X connect 15 0 3 1;
+#X connect 16 0 17 0;
+#X connect 17 0 5 1;
+#X connect 18 0 19 0;
+#X connect 19 0 4 1;
+#X connect 20 0 21 0;
+#X connect 21 0 1 1;
diff --git a/externals/gridflow/pd_examples/polygon.pd b/externals/gridflow/pd_examples/polygon.pd
new file mode 100644
index 00000000..d43a14f8
--- /dev/null
+++ b/externals/gridflow/pd_examples/polygon.pd
@@ -0,0 +1,113 @@
+#N canvas 242 170 497 560 10;
+#X obj 30 250 #draw_polygon +;
+#X obj 127 3 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 187 80 +;
+#X obj 30 214 #store;
+#X obj 220 102 * 5000;
+#X obj 165 -27 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X msg 187 61 1;
+#X obj 30 394 #out window;
+#X obj 391 7 vsl 15 137 0 36000 0 1 empty empty empty -2 -6 0 8 -260818
+-1 -1 3400 1;
+#N canvas 0 0 415 291 create 0;
+#X msg 82 66 0 \$1;
+#X obj 5 131 #outer + ( 0 9000 );
+#X obj 5 153 # +;
+#X obj 5 197 # + ( 120 160 );
+#X obj 5 175 # cos* 116;
+#X obj 5 109 # * 14400;
+#X obj 5 87 #for 0 5 1;
+#X obj 34 153 inlet rotation_angle;
+#X obj 5 10 inlet bang;
+#X obj 5 219 outlet polygon;
+#X obj 82 44 inlet tilt_factor;
+#X text 81 27 default: 9000 \, for flatness;
+#X connect 0 0 1 1;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 9 0;
+#X connect 4 0 3 0;
+#X connect 5 0 1 0;
+#X connect 6 0 5 0;
+#X connect 7 0 2 1;
+#X connect 8 0 6 0;
+#X connect 10 0 0 0;
+#X restore 289 149 pd create star;
+#N canvas 0 0 450 300 color 0;
+#X obj 18 141 outlet 0;
+#X obj 18 95 # sin* 128;
+#X obj 18 117 # + 128;
+#X obj 18 37 # * 1146;
+#X obj 18 13 inlet;
+#X obj 18 60 #outer + ( 0 12000 24000 );
+#X text 139 52 each channel is a sine wave \; the three are offset
+from each other 120 degrees. it is almost like turning around in the
+color wheel except we don't support the HSV color model for now.;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 5 0 1 0;
+#X restore 80 129 pd color generator;
+#X obj 165 1 metro 33.3667;
+#X obj 165 34 t b b b;
+#X obj 30 71 t b;
+#X floatatom 392 151 6 0 0 0 - - -;
+#X obj 89 194 loadbang;
+#X obj 215 81 % 36000;
+#X obj 46 272 shunt 2;
+#X obj 115 274 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X text 133 273 blur;
+#X msg 89 214 240 320 3 b # 0;
+#X obj 80 167 #cast b;
+#X obj 80 148 # >> 7;
+#X obj 74 357 #solarize;
+#X obj 30 317 shunt 2;
+#X obj 93 318 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 131 301 # >> (b # 2);
+#X obj 131 321 #convolve (1 3 b # 1 2 1) \, seed (b # 0);
+#X obj -15 442 cnv 15 580 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 450 GridFlow 0.8.0;
+#X text -7 450 GridFlow 0.8.0;
+#X obj -13 -85 cnv 15 580 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 0 -72 Copyright 2002 Mathieu Bouchard;
+#X text 0 -86 polygon.pd;
+#X connect 0 0 17 0;
+#X connect 0 0 24 0;
+#X connect 1 0 12 0;
+#X connect 2 0 16 0;
+#X connect 3 0 0 0;
+#X connect 4 0 9 1;
+#X connect 5 0 11 0;
+#X connect 6 0 2 0;
+#X connect 8 0 14 0;
+#X connect 9 0 0 2;
+#X connect 10 0 22 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 6 0;
+#X connect 12 2 9 0;
+#X connect 13 0 3 0;
+#X connect 14 0 9 2;
+#X connect 15 0 20 0;
+#X connect 16 0 2 1;
+#X connect 16 0 10 0;
+#X connect 16 0 4 0;
+#X connect 17 0 3 1;
+#X connect 17 1 26 0;
+#X connect 18 0 17 1;
+#X connect 20 0 3 1;
+#X connect 21 0 0 1;
+#X connect 22 0 21 0;
+#X connect 23 0 7 0;
+#X connect 24 0 7 0;
+#X connect 24 1 23 0;
+#X connect 25 0 24 1;
+#X connect 26 0 27 0;
+#X connect 27 0 3 1;
diff --git a/externals/gridflow/pd_examples/ripple.pd b/externals/gridflow/pd_examples/ripple.pd
new file mode 100644
index 00000000..634122d0
--- /dev/null
+++ b/externals/gridflow/pd_examples/ripple.pd
@@ -0,0 +1,190 @@
+#N canvas 103 42 683 618 10;
+#X obj 78 419 #out window;
+#X obj 47 173 #outer ignore ( 0 0 );
+#X obj 78 105 +;
+#X obj 47 326 # +;
+#X obj 283 170 #outer + ( 0 9000 );
+#X obj 47 370 shunt 2;
+#X obj 283 189 # sin* 256;
+#N canvas 609 247 325 236 distance 0;
+#X text 16 15 bang;
+#X obj 18 58 #for ( -128 -128 ) ( 128 128 ) ( 1 1 );
+#X text 15 167 distances to middle;
+#X obj 18 125 @! sqrt;
+#X obj 18 36 inlet;
+#X obj 18 103 #fold +;
+#X obj 18 81 # ** 2;
+#X text 89 101 pythagoras' theorem;
+#X obj 18 149 outlet;
+#X connect 1 0 6 0;
+#X connect 3 0 8 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 5 0;
+#X restore 164 41 pd distance map;
+#X obj 78 440 fps detailed;
+#X obj 283 130 loadbang;
+#X obj 47 42 fork;
+#X obj 168 278 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X msg 78 86 1;
+#X obj 47 105 # -;
+#X obj 47 62 #store;
+#N canvas 659 552 420 225 apply 0;
+#X obj 60 48 #fold +;
+#X obj 12 190 outlet 0;
+#X obj 60 16 inlet;
+#X obj 12 124 # +;
+#X obj 12 167 # max 0;
+#X obj 12 146 # min 255;
+#X obj 12 16 inlet;
+#X obj 58 101 #outer *>>8;
+#X obj 130 69 inlet;
+#X obj 60 73 # << 2;
+#X connect 0 0 9 0;
+#X connect 2 0 0 0;
+#X connect 3 0 5 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 3 1;
+#X connect 8 0 7 1;
+#X connect 9 0 7 0;
+#X restore 78 400 pd apply shading;
+#X obj 47 -27 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 47 348 #store;
+#X obj 47 25 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 48 281 #finished;
+#X obj 164 329 #for ( 0 0 ) ( 256 256 ) ( 1 1 );
+#X obj 164 130 # + 10;
+#X text 187 278 shading on/off;
+#X obj 47 240 shunt 2;
+#X floatatom 106 108 5 0 0 0 - - -;
+#X obj 47 195 # *>>8;
+#X obj 164 310 loadbang;
+#X obj 164 21 loadbang;
+#X obj 47 303 #store;
+#X obj 78 462 print;
+#X obj 164 149 # inv* 10000;
+#N canvas 588 233 480 480 angle 0;
+#X obj 71 163 #outer atan;
+#X obj 71 55 #finished;
+#X text 70 210 angles to centre;
+#X text 168 63 bang;
+#X obj 167 82 inlet;
+#X obj 168 106 #for -128 128 1;
+#X obj 71 78 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 72 188 outlet 0;
+#X obj 71 107 #for -128 128 1;
+#X connect 0 0 7 0;
+#X connect 1 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 0 1;
+#X connect 5 0 1 0;
+#X connect 6 0 8 0;
+#X connect 8 0 0 0;
+#X restore 283 151 pd angle map;
+#X obj 47 151 # *>>8;
+#X obj 46 218 # *>>8;
+#X obj 259 235 hsl 128 15 -256 256 0 1 empty empty empty -2 -6 0 8
+-260818 -1 -1 12600 1;
+#X obj 259 252 hsl 128 15 -256 256 0 1 empty empty empty -2 -6 0 8
+-260818 -1 -1 3200 1;
+#N canvas 715 537 387 220 compute 0;
+#X obj 8 113 #store;
+#X obj 55 113 # sin* 64;
+#X obj 55 71 #for 0 1024 1;
+#X obj 55 50 loadbang;
+#X obj 55 92 # * 900;
+#X obj 125 51 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 8 135 outlet;
+#X text 75 151 This is somewhat like [# sin];
+#X text 75 166 but much faster (lookup table);
+#X obj 8 11 inlet;
+#X obj 8 30 #outer ignore (0);
+#X connect 0 0 6 0;
+#X connect 1 0 0 1;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 5 0 2 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 0;
+#X restore 47 128 pd compute sine;
+#X text 232 358 background image;
+#X obj 165 375 #in teapot.png;
+#X obj 165 356 loadbang;
+#X obj 48 261 t a a;
+#X text 215 219 intensity of wave;
+#X obj 47 4 metro 33.3667;
+#X text 246 5 waves.pd is more interesting;
+#X text 225 -9 this is a quite boring wave generator;
+#X text 95 61 table for distance map;
+#X floatatom 216 237 5 0 0 0 - - -;
+#X floatatom 216 253 5 0 0 0 - - -;
+#X obj 157 239 #pack 2;
+#X obj -13 -85 cnv 15 680 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 0 -72 Copyright 2002 Mathieu Bouchard;
+#X text 0 -85 ripple.pd;
+#X obj -15 501 cnv 15 680 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 508 GridFlow 0.8.0;
+#X text -7 508 GridFlow 0.8.0;
+#X obj 246 410 #color;
+#X text 430 407 color of ripple shading;
+#X connect 0 0 8 0;
+#X connect 1 0 25 0;
+#X connect 2 0 24 0;
+#X connect 2 0 13 1;
+#X connect 3 0 17 0;
+#X connect 4 0 6 0;
+#X connect 5 0 15 0;
+#X connect 5 1 0 0;
+#X connect 6 0 25 1;
+#X connect 7 0 21 0;
+#X connect 7 0 14 1;
+#X connect 8 0 29 0;
+#X connect 9 0 31 0;
+#X connect 10 0 14 0;
+#X connect 10 1 12 0;
+#X connect 11 0 23 1;
+#X connect 11 0 5 1;
+#X connect 12 0 2 0;
+#X connect 13 0 36 0;
+#X connect 14 0 13 0;
+#X connect 15 0 0 0;
+#X connect 16 0 42 0;
+#X connect 17 0 5 0;
+#X connect 18 0 10 0;
+#X connect 19 0 28 0;
+#X connect 20 0 3 1;
+#X connect 21 0 30 0;
+#X connect 23 0 15 1;
+#X connect 23 0 40 0;
+#X connect 23 1 3 0;
+#X connect 24 0 2 1;
+#X connect 25 0 33 0;
+#X connect 26 0 20 0;
+#X connect 27 0 7 0;
+#X connect 28 0 3 0;
+#X connect 30 0 32 1;
+#X connect 31 0 4 0;
+#X connect 32 0 1 0;
+#X connect 33 0 23 0;
+#X connect 34 0 46 0;
+#X connect 35 0 47 0;
+#X connect 36 0 32 0;
+#X connect 38 0 17 1;
+#X connect 39 0 38 0;
+#X connect 40 0 19 0;
+#X connect 40 1 28 1;
+#X connect 42 0 18 0;
+#X connect 46 0 48 0;
+#X connect 47 0 48 1;
+#X connect 48 0 33 1;
+#X connect 55 0 15 2;
diff --git a/externals/gridflow/pd_examples/sand.pd b/externals/gridflow/pd_examples/sand.pd
new file mode 100644
index 00000000..42a0ed93
--- /dev/null
+++ b/externals/gridflow/pd_examples/sand.pd
@@ -0,0 +1,417 @@
+#N canvas 524 30 680 685 10;
+#X text 317 199 disable falling;
+#X obj 6 392 # min 255;
+#X obj 3 167 fork;
+#X obj 295 402 # != 0;
+#X obj 356 446 #fold +;
+#X obj 99 518 s position;
+#X obj 192 -31 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 295 465 #export;
+#X obj 192 68 #store;
+#X obj 247 133 shunt 2;
+#N canvas 25 226 369 359 mouse 0;
+#X text 143 214 is there a click?;
+#X obj 44 114 != 0;
+#X text 112 256 coordinates;
+#X obj 19 8 inlet;
+#X text 56 9 #out's outlet 0;
+#X obj 44 93 >> 8;
+#X obj 65 237 listsublist 0 2;
+#X obj 16 31 route position;
+#X obj 94 214 outlet;
+#X obj 65 257 outlet;
+#X obj 16 214 shunt 2;
+#X obj 44 72 listelement 2;
+#X obj 16 51 t a a;
+#X connect 1 0 8 0;
+#X connect 1 0 10 1;
+#X connect 3 0 7 0;
+#X connect 5 0 1 0;
+#X connect 6 0 9 0;
+#X connect 7 0 12 0;
+#X connect 10 1 6 0;
+#X connect 11 0 5 0;
+#X connect 12 0 10 0;
+#X connect 12 1 11 0;
+#X restore 398 151 pd mouse click/drag;
+#X obj 358 152 # / 2;
+#X obj 295 423 #ravel;
+#X msg 11 142 100 100;
+#X obj 6 415 # max;
+#X obj 247 198 shunt 2;
+#X obj 26 187 s size;
+#X obj 295 444 #fold +;
+#X obj 454 112 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 356 404 @! abs;
+#X obj 432 412 #export;
+#X obj 432 370 #ravel;
+#X obj 288 260 shunt 2;
+#X obj 301 199 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 356 467 #export;
+#X obj 398 111 shunt 2;
+#X obj 6 348 #greyscale_to_rgb;
+#X obj 399 132 r position;
+#N canvas 504 75 496 430 falling 0;
+#X obj 42 147 # +;
+#X text 228 286 vertical falling;
+#X obj 70 327 # / 3;
+#X obj 138 25 inlet;
+#X text 179 25 Dim[rows \, columns \, {height}];
+#X obj 43 281 #store;
+#X obj 43 260 #finished;
+#X obj 69 168 # / 3;
+#X obj 70 306 # / 3;
+#X obj 42 168 # +;
+#X obj 43 306 # +;
+#X text 105 366 Dim[rows \, columns \, {height}];
+#X text 197 129 horizontal falling;
+#X obj 69 147 # / 3;
+#X obj 43 327 # +;
+#X obj 42 123 #store;
+#X obj 52 365 outlet;
+#X obj 42 104 #finished;
+#X obj 138 58 t a a;
+#X obj 133 218 t a a;
+#X obj 110 147 #convolve ( 1 2 # 1 1 0 ) \, fold inv+;
+#X obj 110 168 #convolve ( 1 3 # 1 1 0 ) \, fold inv+;
+#X obj 111 306 #convolve ( 2 1 # 1 1 ) \, fold inv+;
+#X obj 111 327 #convolve ( 3 1 # 1 1 0 ) \, fold inv+;
+#X connect 0 0 9 0;
+#X connect 2 0 14 1;
+#X connect 3 0 18 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 0;
+#X connect 7 0 9 1;
+#X connect 8 0 10 1;
+#X connect 9 0 19 0;
+#X connect 10 0 14 0;
+#X connect 13 0 0 1;
+#X connect 14 0 16 0;
+#X connect 15 0 0 0;
+#X connect 17 0 15 0;
+#X connect 18 0 17 0;
+#X connect 18 1 15 1;
+#X connect 18 1 20 0;
+#X connect 18 1 21 0;
+#X connect 19 0 6 0;
+#X connect 19 1 5 1;
+#X connect 19 1 22 0;
+#X connect 19 1 23 0;
+#X connect 20 0 13 0;
+#X connect 21 0 7 0;
+#X connect 22 0 8 0;
+#X connect 23 0 2 0;
+#X restore 247 218 pd falling sand;
+#X obj 6 465 #scale_by 2;
+#X obj 8 287 shunt 3;
+#X obj 6 540 print;
+#X obj 136 26 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X text 253 -8 auto;
+#N canvas 292 75 480 513 falling 0;
+#X obj 105 177 # div 5;
+#X text 292 85 horizontal falling;
+#X obj 42 118 #store;
+#X obj 153 58 fork;
+#X obj 171 230 fork;
+#X obj 46 392 outlet;
+#X obj 42 147 # +;
+#X obj 46 307 # +;
+#X obj 46 281 #store;
+#X obj 42 91 #finished;
+#X obj 42 176 # +;
+#X obj 48 260 #finished;
+#X text 88 17 Dim[rows \, columns \, {height}];
+#X text 293 262 vertical falling;
+#X obj 106 336 # div 5;
+#X obj 102 148 # div 5;
+#X obj 46 336 # +;
+#X obj 103 307 # div 5;
+#X text 101 392 Dim[rows \, columns \, {height}];
+#X obj 47 17 inlet;
+#X obj 162 149 #convolve (1 2 # 1 1) \, fold inv+ \, seed -3;
+#X obj 166 177 #convolve (1 3 # 1 1 0) \, fold inv+ \, seed -3;
+#X obj 170 305 #convolve (2 1 # 1 1) \, fold inv+ \, seed -3;
+#X obj 171 335 #convolve (3 1 # 1 1 0) \, fold inv+ \, seed -3;
+#X connect 0 0 10 1;
+#X connect 2 0 6 0;
+#X connect 3 0 9 0;
+#X connect 3 1 2 1;
+#X connect 3 1 20 0;
+#X connect 3 1 21 0;
+#X connect 4 0 11 0;
+#X connect 4 1 8 1;
+#X connect 4 1 22 0;
+#X connect 4 1 23 0;
+#X connect 6 0 10 0;
+#X connect 7 0 16 0;
+#X connect 8 0 7 0;
+#X connect 9 0 2 0;
+#X connect 10 0 4 0;
+#X connect 11 0 8 0;
+#X connect 14 0 16 1;
+#X connect 15 0 6 1;
+#X connect 16 0 5 0;
+#X connect 17 0 7 1;
+#X connect 19 0 3 0;
+#X connect 20 0 15 0;
+#X connect 21 0 0 0;
+#X connect 22 0 17 0;
+#X connect 23 0 14 0;
+#X restore 292 238 pd falling sand ( 2 );
+#N canvas 525 58 536 584 finger 0;
+#X obj 192 7 inlet;
+#X obj 36 78 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 63 267 # / 20;
+#X obj 74 327 # *;
+#X obj 12 436 #store;
+#X obj 14 18 inlet;
+#X obj 73 309 #redim ( 64 64 1 );
+#X obj 279 51 loadbang;
+#X obj 13 38 fork;
+#X obj 63 247 #fold +;
+#X text 22 159 "dig" the sphere into the sand;
+#X text 240 104 compute a halfsphere;
+#X obj 192 29 # - 32;
+#X obj 63 225 #ravel;
+#N canvas 1 58 415 284 make 0;
+#X obj 28 129 #fold +;
+#X obj 28 66 # -;
+#X obj 28 108 @! sq;
+#X obj 28 45 #for ( -32 -32 ) ( 32 32 ) ( 1 1 );
+#X obj 28 171 outlet;
+#X obj 28 87 # << 2;
+#X obj 28 150 @! sqrt;
+#X text 63 21 bang;
+#X obj 27 20 inlet;
+#X text 98 92 make distance map;
+#X connect 0 0 6 0;
+#X connect 1 0 5 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 5 0 2 0;
+#X connect 6 0 4 0;
+#X connect 8 0 3 0;
+#X restore 259 74 pd make distance map with center 32;
+#X obj 12 480 outlet;
+#X obj 260 53 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 83 293 find out how high the compensation torus should be;
+#X obj 73 349 # div 256;
+#X obj 36 58 route grid;
+#X obj 12 417 #finished;
+#X obj 13 206 t a a;
+#N canvas 669 471 315 202 halfsphere 0;
+#X obj 45 19 inlet distancemap;
+#X obj 45 143 outlet image;
+#X obj 46 102 @! sqrt;
+#X obj 46 122 #outer ignore ( 0 );
+#X obj 46 62 # inv+ 200;
+#X text 121 63 16 * radius^2;
+#X obj 46 41 @! sq;
+#X obj 46 82 # max 0;
+#X connect 0 0 6 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 7 0;
+#X connect 6 0 4 0;
+#X connect 7 0 2 0;
+#X restore 126 120 pd halfsphere;
+#X obj 13 141 #draw_image - ( 1 1 1 # ) ( 0 0 );
+#X obj 12 457 #draw_image - ( 1 1 1 # ) ( 0 0 );
+#N canvas 0 0 323 279 torus 0;
+#X obj 59 26 inlet;
+#X obj 56 185 outlet;
+#X obj 57 97 # inv+ 200;
+#X obj 57 76 @! sq;
+#X text 102 54 toroidal radius;
+#X obj 57 162 #outer ignore ( 0 );
+#X obj 56 120 # max 0;
+#X text 138 99 16*radius^2;
+#X obj 57 141 @! sqrt;
+#X obj 57 56 # - 20;
+#X connect 0 0 9 0;
+#X connect 2 0 6 0;
+#X connect 3 0 2 0;
+#X connect 5 0 1 0;
+#X connect 6 0 8 0;
+#X connect 8 0 5 0;
+#X connect 9 0 3 0;
+#X restore 296 346 pd torus;
+#X text 65 475 put extra sand as a ring around the hole;
+#X connect 0 0 12 0;
+#X connect 1 0 16 0;
+#X connect 2 0 6 0;
+#X connect 3 0 18 0;
+#X connect 4 0 24 0;
+#X connect 5 0 8 0;
+#X connect 6 0 3 0;
+#X connect 7 0 14 0;
+#X connect 8 0 23 0;
+#X connect 8 1 19 0;
+#X connect 9 0 2 0;
+#X connect 12 0 23 2;
+#X connect 12 0 24 2;
+#X connect 13 0 9 0;
+#X connect 14 0 22 0;
+#X connect 14 0 25 0;
+#X connect 16 0 14 0;
+#X connect 18 0 24 1;
+#X connect 19 0 1 0;
+#X connect 20 0 4 0;
+#X connect 21 0 20 0;
+#X connect 21 1 13 0;
+#X connect 21 1 4 1;
+#X connect 22 0 23 1;
+#X connect 23 0 21 0;
+#X connect 24 0 15 0;
+#X connect 25 0 3 1;
+#X restore 290 152 pd finger;
+#X obj 342 376 # -;
+#X obj 356 425 #ravel;
+#X msg 3 118 240 320;
+#X obj 432 391 #fold +;
+#X obj 6 328 # + 128;
+#X obj 148 476 #greyscale_to_rgb;
+#X obj 303 134 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X text 362 263 enable stats;
+#X text 292 529 checking for conservation of amounts of sand;
+#X msg 3 212 \$1 \$2 1 # 0;
+#X text 33 159 set size / reset;
+#N canvas 56 229 441 265 lighting 0;
+#X obj 27 209 outlet;
+#X obj 27 180 # +;
+#X obj 17 9 inlet;
+#X obj 99 142 #convolve ( 2 1 # 1 1 ) \, op inv+;
+#X obj 100 65 #convolve ( 1 2 # 1 1 ) \, op inv+;
+#X obj 103 39 r size;
+#X obj 27 39 #redim ( );
+#X obj 27 79 #finished;
+#X obj 27 120 #store;
+#X obj 25 149 # + 128;
+#X obj 27 59 t a a;
+#X text 163 47 colourize the horizontal differences;
+#X text 113 123 colourize the vertical differences;
+#X obj 100 86 #outer & ( -1 0 0 );
+#X obj 99 164 #outer & ( -1 -1 0 );
+#X connect 1 0 0 0;
+#X connect 2 0 6 0;
+#X connect 3 0 14 0;
+#X connect 4 0 13 0;
+#X connect 5 0 6 1;
+#X connect 6 0 10 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 1 0;
+#X connect 10 0 7 0;
+#X connect 10 1 4 0;
+#X connect 10 1 3 0;
+#X connect 13 0 8 1;
+#X connect 14 0 1 1;
+#X restore 151 355 pd lighting;
+#X obj 6 518 fps detailed;
+#X obj 344 262 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X text 152 26 step;
+#X obj 71 253 vradio 15 1 0 3 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X obj 6 486 #out window;
+#X obj 295 508 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 0 256;
+#X obj 356 508 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 0 256;
+#X obj 432 508 nbx 8 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 0 256;
+#X text 90 268 differential;
+#X text 89 253 heightmap;
+#X text 89 284 topographic;
+#X obj 152 68 t a a;
+#X obj 247 260 t a a;
+#X obj 149 457 # * 255;
+#X obj 150 437 # >= 6;
+#X obj 150 416 # & 7;
+#X obj 2 97 loadbang;
+#X text 470 112 disable finger;
+#X obj 332 354 t a a;
+#X obj 6 309 # << 2;
+#X obj 151 334 # << 4;
+#X obj 192 -8 metro 20;
+#X obj -15 569 cnv 15 680 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 576 GridFlow 0.8.0;
+#X text -7 576 GridFlow 0.8.0;
+#X obj -13 -85 cnv 15 680 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 0 -72 Copyright 2002 Mathieu Bouchard;
+#X text 0 -85 sand.pd;
+#X connect 1 0 14 0;
+#X connect 2 0 45 0;
+#X connect 2 1 16 0;
+#X connect 3 0 12 0;
+#X connect 4 0 24 0;
+#X connect 6 0 69 0;
+#X connect 7 0 53 0;
+#X connect 8 0 9 0;
+#X connect 9 0 15 0;
+#X connect 9 1 35 0;
+#X connect 10 0 11 0;
+#X connect 10 1 25 0;
+#X connect 11 0 35 1;
+#X connect 12 0 17 0;
+#X connect 13 0 2 0;
+#X connect 14 0 29 0;
+#X connect 15 0 28 0;
+#X connect 15 1 60 0;
+#X connect 17 0 7 0;
+#X connect 18 0 25 1;
+#X connect 19 0 37 0;
+#X connect 20 0 55 0;
+#X connect 21 0 39 0;
+#X connect 22 1 21 0;
+#X connect 22 1 66 0;
+#X connect 23 0 15 1;
+#X connect 24 0 54 0;
+#X connect 25 0 9 1;
+#X connect 26 0 1 0;
+#X connect 27 0 10 0;
+#X connect 28 0 60 0;
+#X connect 29 0 52 0;
+#X connect 30 0 67 0;
+#X connect 30 1 68 0;
+#X connect 30 2 63 0;
+#X connect 32 0 8 0;
+#X connect 34 0 60 0;
+#X connect 35 0 15 0;
+#X connect 36 0 19 0;
+#X connect 36 0 3 0;
+#X connect 37 0 4 0;
+#X connect 38 0 2 0;
+#X connect 39 0 20 0;
+#X connect 40 0 26 0;
+#X connect 41 0 29 0;
+#X connect 42 0 9 1;
+#X connect 45 0 59 0;
+#X connect 47 0 1 0;
+#X connect 48 0 31 0;
+#X connect 49 0 22 1;
+#X connect 51 0 30 1;
+#X connect 52 0 48 0;
+#X connect 52 0 5 0;
+#X connect 59 0 30 0;
+#X connect 59 1 8 1;
+#X connect 60 0 59 0;
+#X connect 60 1 22 0;
+#X connect 61 0 41 0;
+#X connect 62 0 61 0;
+#X connect 63 0 62 0;
+#X connect 64 0 38 0;
+#X connect 66 0 36 1;
+#X connect 66 1 36 0;
+#X connect 67 0 40 0;
+#X connect 68 0 47 0;
+#X connect 69 0 8 0;
diff --git a/externals/gridflow/pd_examples/saturation.pd b/externals/gridflow/pd_examples/saturation.pd
new file mode 100644
index 00000000..d6cbda6c
--- /dev/null
+++ b/externals/gridflow/pd_examples/saturation.pd
@@ -0,0 +1,81 @@
+#N canvas 904 61 449 319 10;
+#X obj 11 117 print;
+#X obj 11 77 #out window;
+#X text 342 55 OR;
+#X text 238 30 global saturation;
+#N canvas 0 0 441 339 #saturation 0;
+#X obj 63 88 # inv+ 255;
+#X obj 14 219 # +;
+#X obj 37 47 #rgb_to_greyscale;
+#X obj 14 239 # >> 8;
+#X obj 162 146 loadbang;
+#X obj 14 158 #finished;
+#X text 68 266 keep values inside visible range;
+#X obj 14 199 # *;
+#X obj 14 178 #store;
+#X obj 37 88 # *;
+#X msg 133 146 0;
+#X obj 8 9 inlet image;
+#X obj 14 293 outlet image;
+#X obj 107 126 inlet saturation;
+#X text 230 130 0 = grey \; 256 = identity;
+#X text 40 222 mix the original picture with its greyed version;
+#X obj 37 107 t a a;
+#X obj 8 28 t a a;
+#X obj 37 67 #greyscale_to_rgb;
+#X obj 107 146 t a;
+#X obj 14 265 #clip;
+#X connect 0 0 9 1;
+#X connect 1 0 3 0;
+#X connect 2 0 18 0;
+#X connect 3 0 20 0;
+#X connect 4 0 10 0;
+#X connect 5 0 8 0;
+#X connect 7 0 1 0;
+#X connect 8 0 7 0;
+#X connect 9 0 16 0;
+#X connect 10 0 19 0;
+#X connect 11 0 17 0;
+#X connect 13 0 19 0;
+#X connect 16 0 5 0;
+#X connect 16 1 1 1;
+#X connect 17 0 8 1;
+#X connect 17 1 2 0;
+#X connect 18 0 9 0;
+#X connect 19 0 7 1;
+#X connect 19 0 0 0;
+#X connect 20 0 12 0;
+#X restore 11 53 pd #saturation;
+#X obj 11 98 fps detailed;
+#X text 203 68 per-channel saturation;
+#X msg 194 25 0;
+#X obj 194 4 loadbang;
+#X obj 197 46 hsl 137 15 -256 512 0 0 empty empty empty -2 -6 0 8 -260818
+-128992 -1 4533 1;
+#X floatatom 155 47 5 0 0 0 - - -;
+#X obj 11 -26 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 11 3 metro 33.3667;
+#X obj 11 30 #in teapot.png;
+#X obj 147 95 #color -256 512 1;
+#X msg 147 69 3 # \$1;
+#X obj -16 -85 cnv 15 450 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -3 -72 Copyright 2002 Mathieu Bouchard;
+#X obj -15 203 cnv 15 450 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 210 GridFlow 0.8.0;
+#X text -7 210 GridFlow 0.8.0;
+#X text -3 -85 saturation.pd;
+#X connect 1 0 5 0;
+#X connect 4 0 1 0;
+#X connect 5 0 0 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 9 0 15 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 4 0;
+#X connect 14 0 4 1;
+#X connect 15 0 14 0;
diff --git a/externals/gridflow/pd_examples/scratch_video.pd b/externals/gridflow/pd_examples/scratch_video.pd
new file mode 100644
index 00000000..c322b745
--- /dev/null
+++ b/externals/gridflow/pd_examples/scratch_video.pd
@@ -0,0 +1,124 @@
+#N canvas 622 70 580 592 10;
+#X obj 109 21 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 109 329 listelement 1;
+#X floatatom 109 352 5 0 0 0 - - -;
+#X floatatom 132 244 5 0 0 0 - - -;
+#X obj 109 305 route position;
+#X obj 109 221 #in;
+#X msg 142 167 open /home/alx/Documents/images/videos/bus_1.mov;
+#X obj 112 391 hsl 128 15 1 320 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 3145 1;
+#X obj -13 -85 cnv 15 580 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj -16 472 cnv 15 580 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 16 476 GridFlow 0.8.0;
+#X text 16 476 GridFlow 0.8.0;
+#X text 0 -85 traveling.pd;
+#X text 0 -72 Copyright 2003 Alexandre Castonguay;
+#X text -1 -34 Use the mouse position to scratch the video \, a touchscreen
+works well.;
+#N canvas 0 0 450 300 decide_framerate 0;
+#X obj 6 56 - 160;
+#X floatatom 6 80 5 0 0 0 - - -;
+#X obj 55 122 hsl 128 15 20 150 0 0 empty empty empty -2 -6 0 8 -24198
+-1 -1 5862 1;
+#X obj 6 99 abs;
+#X floatatom 6 142 5 0 0 0 - - -;
+#X obj 6 121 / 3;
+#X floatatom 6 226 5 0 0 0 - - -;
+#X obj 6 184 abs;
+#X obj 6 162 - 64;
+#X obj 6 205 + 5;
+#X obj -25 21 inlet;
+#X obj 34 263 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 3 0 2 0;
+#X connect 3 0 5 0;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 11 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 6 0;
+#X connect 10 0 0 0;
+#X restore 257 390 pd decide_framerate;
+#X obj 257 414 s framerate;
+#X obj 181 31 r framerate;
+#X obj 109 279 #out window;
+#X text 176 242 <-- frame number;
+#X text 213 328 <-- get x values;
+#X text 142 184 load your own until we get a bundled video for the
+docs;
+#X text 142 197 this one is 320 x 240;
+#N canvas 0 0 450 300 frame_count 1;
+#X msg 103 112 1;
+#X floatatom 103 168 5 0 0 0 - - -;
+#X obj 153 153 float \$1;
+#X obj 103 86 shunt 2;
+#X msg 173 69 1;
+#X msg 173 46 0;
+#X obj 103 140 + 1;
+#X msg 147 112 -1;
+#X msg 208 109 0;
+#X obj 46 -34 inlet;
+#X obj 231 68 inlet;
+#X obj 113 212 outlet;
+#X floatatom 147 -41 5 0 0 0 - - -;
+#X obj 147 -19 > 160;
+#X floatatom 147 8 5 0 0 0 - - -;
+#X text 192 -20 <-- is the direction left or right on a width of 320
+pixels;
+#X text 242 109 <-- reset;
+#X obj 147 -64 r position;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 1 0 11 0;
+#X connect 2 0 6 1;
+#X connect 3 0 0 0;
+#X connect 3 1 7 0;
+#X connect 4 0 3 1;
+#X connect 5 0 3 1;
+#X connect 6 0 1 0;
+#X connect 7 0 6 0;
+#X connect 8 0 1 0;
+#X connect 9 0 3 0;
+#X connect 10 0 8 0;
+#X connect 12 0 13 0;
+#X connect 13 0 14 0;
+#X connect 14 0 3 1;
+#X connect 17 0 12 0;
+#X restore 109 113 pd frame_count;
+#X obj 202 86 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X text 226 85 <-- reset;
+#X obj 13 391 s position;
+#X msg 314 230 loop 1;
+#X obj 206 266 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 224 62 r loopit;
+#X obj 236 264 print loopit;
+#X obj 109 56 metro 100.33;
+#X obj 71 175 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 0 0 31 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 0;
+#X connect 2 0 15 0;
+#X connect 2 0 26 0;
+#X connect 4 0 1 0;
+#X connect 5 0 18 0;
+#X connect 5 1 3 0;
+#X connect 5 1 28 0;
+#X connect 6 0 5 0;
+#X connect 15 0 16 0;
+#X connect 17 0 31 1;
+#X connect 18 0 4 0;
+#X connect 23 0 5 0;
+#X connect 24 0 23 1;
+#X connect 27 0 5 0;
+#X connect 28 0 30 0;
+#X connect 31 0 23 0;
+#X connect 32 0 5 0;
diff --git a/externals/gridflow/pd_examples/spectrogram.pd b/externals/gridflow/pd_examples/spectrogram.pd
new file mode 100644
index 00000000..ff9f55e7
--- /dev/null
+++ b/externals/gridflow/pd_examples/spectrogram.pd
@@ -0,0 +1,109 @@
+#N canvas 695 85 580 565 10;
+#X msg 143 149 reset;
+#X obj 27 -34 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 316 -15 adc~;
+#X obj 28 110 tabread4 array1;
+#X obj 7 10 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 351 -14 table array1 1024;
+#X obj 290 138 loadbang;
+#X obj 270 140 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 0 0 306 167 analysis 0;
+#X obj 24 -205 inlet~;
+#X obj 26 -135 tabsend~ array1;
+#X obj 24 -184 rfft~;
+#X obj 25 -157 expr~ sqrt($v1*$v1+$v2*$v2)/64;
+#X obj 148 -198 block~ 1024;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 3 1;
+#X connect 3 0 1 0;
+#X restore 317 8 pd analysis;
+#X obj 30 210 demux 2;
+#X obj 373 186 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -1
+-1 1;
+#X obj 242 226 loadbang;
+#X obj 219 225 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 27 34 for 0 320 1;
+#X obj 29 129 * 2000;
+#X text 392 187 black stripes;
+#X text 391 200 graph;
+#X obj 28 77 / 2;
+#X text 77 129 <-- adding some extra gain;
+#X obj 88 88 exp;
+#X obj 28 55 demux 2;
+#X obj 173 46 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 195 46 linear;
+#X text 193 60 logarithmic;
+#X obj 89 67 / 51;
+#X obj 31 331 #fade;
+#X obj 123 332 loadbang;
+#X msg 72 331 16 4 1;
+#X obj 27 -9 metro 23.22;
+#X text 115 26 = 1000*1024/44100;
+#X obj 29 149 #import ( 320 );
+#X obj 29 169 # *>>8;
+#X obj 30 190 #fade 2;
+#X obj 30 249 # inv+ 255;
+#X obj 105 222 #outer <;
+#X obj 105 241 # * 255;
+#X obj 105 261 #transpose;
+#X obj 30 287 #redim (120 320 1);
+#X obj 31 309 #greyscale_to_rgb;
+#X obj 31 353 #clip;
+#X obj 31 375 #scale_by 2;
+#X obj 31 404 #out window;
+#X obj -15 449 cnv 15 580 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 456 GridFlow 0.8.0;
+#X text -7 456 GridFlow 0.8.0;
+#X obj -15 -85 cnv 15 580 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -2 -72 Copyright 2002 Mathieu Bouchard;
+#X text -2 -85 spectrogram.pd;
+#X obj 219 245 #for 120 0 -1;
+#X obj 270 161 #for 0 320 1;
+#X obj 270 184 # + 10;
+#X connect 0 0 30 0;
+#X connect 1 0 28 0;
+#X connect 2 0 8 0;
+#X connect 2 1 8 0;
+#X connect 3 0 14 0;
+#X connect 4 0 13 0;
+#X connect 6 0 7 0;
+#X connect 7 0 49 0;
+#X connect 9 0 33 0;
+#X connect 9 1 34 0;
+#X connect 10 0 9 1;
+#X connect 11 0 12 0;
+#X connect 12 0 48 0;
+#X connect 13 0 20 0;
+#X connect 14 0 30 0;
+#X connect 17 0 3 0;
+#X connect 19 0 3 0;
+#X connect 20 0 17 0;
+#X connect 20 1 24 0;
+#X connect 21 0 20 1;
+#X connect 24 0 19 0;
+#X connect 25 0 39 0;
+#X connect 26 0 27 0;
+#X connect 27 0 25 1;
+#X connect 28 0 13 0;
+#X connect 30 0 31 0;
+#X connect 31 0 32 0;
+#X connect 32 0 9 0;
+#X connect 33 0 37 0;
+#X connect 34 0 35 0;
+#X connect 35 0 36 0;
+#X connect 36 0 37 0;
+#X connect 37 0 38 0;
+#X connect 38 0 25 0;
+#X connect 39 0 40 0;
+#X connect 40 0 41 0;
+#X connect 48 0 34 1;
+#X connect 49 0 50 0;
+#X connect 50 0 31 1;
diff --git a/externals/gridflow/pd_examples/threshold.pd b/externals/gridflow/pd_examples/threshold.pd
new file mode 100644
index 00000000..4a609930
--- /dev/null
+++ b/externals/gridflow/pd_examples/threshold.pd
@@ -0,0 +1,81 @@
+#N canvas 720 79 579 617 10;
+#X obj 40 121 @ -;
+#X obj 40 144 @ max 0;
+#X obj 40 167 @ ||;
+#X obj 40 190 @ +;
+#X obj 99 143 inv+ 0;
+#X obj 40 -33 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 95 56 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X floatatom 251 270 5 0 0 0 - - -;
+#X obj 251 137 vsl 15 128 0 256 0 0 empty empty empty 0 -8 0 8 -260818
+-1 -1 0 1;
+#X obj 40 55 shunt 2;
+#X obj 40 448 @out window;
+#X text 6 100 simple per-channel threshold;
+#X text 316 102 bluescreen luma threshold;
+#X text 381 255 here we have a mask;
+#X text 361 267 (alpha as separate image);
+#X obj 327 356 @join 2;
+#X text 386 295 make a RGBA image;
+#X obj 310 137 t b a a;
+#X text 218 398 = medium blue;
+#X obj 297 290 t a a;
+#X obj 131 449 fps;
+#X floatatom 161 451 5 0 0 0 - - -;
+#X obj 40 9 metro 100;
+#X msg 70 397 240 320 3 # 0 0 170;
+#X text 386 333 won't be necessary;
+#X text 319 117 with alpha channel;
+#X text 13 368 you could also load a picture;
+#X text 13 380 instead of using uniform blue;
+#X text 58 -31 1000/100 = 10 fps (max) (adjustable);
+#X text 281 22 see also color_detect.pd;
+#X obj 40 33 #camera;
+#X obj -13 -86 cnv 15 580 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 0 -73 Copyright 2002 Mathieu Bouchard;
+#X obj -15 499 cnv 15 580 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text -7 506 GridFlow 0.8.0;
+#X text -7 506 GridFlow 0.8.0;
+#X text 0 -86 threshold.pd;
+#X obj 290 335 #store;
+#X obj 290 314 #finished;
+#X obj 354 204 # * 255;
+#X obj 354 181 # >=;
+#X obj 354 162 #rgb_to_greyscale;
+#X text 384 320 this silly #finished;
+#X text 388 347 in GridFlow 1;
+#X obj 70 425 #draw_image put \, alpha 1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 10 0;
+#X connect 4 0 2 1;
+#X connect 5 0 22 0;
+#X connect 6 0 9 1;
+#X connect 7 0 0 1;
+#X connect 7 0 4 0;
+#X connect 7 0 3 1;
+#X connect 7 0 40 1;
+#X connect 8 0 7 0;
+#X connect 9 0 0 0;
+#X connect 9 1 17 0;
+#X connect 10 0 20 0;
+#X connect 17 0 23 0;
+#X connect 17 1 19 0;
+#X connect 17 2 41 0;
+#X connect 19 0 38 0;
+#X connect 19 1 37 1;
+#X connect 20 0 21 0;
+#X connect 22 0 30 0;
+#X connect 23 0 44 0;
+#X connect 30 0 9 0;
+#X connect 37 0 15 0;
+#X connect 38 0 37 0;
+#X connect 39 0 15 1;
+#X connect 40 0 39 0;
+#X connect 41 0 40 0;
+#X connect 44 0 10 0;
diff --git a/externals/gridflow/pd_examples/transform.pd b/externals/gridflow/pd_examples/transform.pd
new file mode 100644
index 00000000..a4d5b653
--- /dev/null
+++ b/externals/gridflow/pd_examples/transform.pd
@@ -0,0 +1,61 @@
+#N canvas 726 225 674 481 10;
+#X obj 146 296 #remap_image;
+#X obj 146 381 #out window;
+#X obj 125 94 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 294 376 # -;
+#X obj 294 202 t a a a;
+#X obj 380 273 # % 2;
+#X obj 380 297 # * -2;
+#X obj 380 318 # + 1;
+#X obj 316 342 # *;
+#X obj 425 245 # / 2;
+#X obj 428 184 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -261681
+-1 -1 12700 1;
+#X obj 316 301 # -;
+#X obj 425 207 t f;
+#X obj 316 262 # %;
+#X obj 380 248 # /;
+#X obj 186 214 #camera;
+#X obj 125 120 metro 10;
+#X obj 8 442 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 16 449 GridFlow 0.8.0;
+#X obj 374 449 #reverse;
+#X text 293 450 see also :;
+#X obj 1 -2 cnv 15 720 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 4 -2 Transform.pd;
+#X obj 95 215 #in r001.jpg;
+#X obj 125 155 shunt;
+#X obj 176 155 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 68 32 By Mathieu Bouchard \, based on Clifford Smith's 'Transform'
+effect that is part of Fukuchi Kentaro's EffecTV : http://effectv.sourceforge.net
+;
+#X text 199 153 <-- choose from a still image or camera input;
+#X connect 0 0 1 0;
+#X connect 0 1 4 0;
+#X connect 2 0 16 0;
+#X connect 3 0 0 1;
+#X connect 4 0 3 0;
+#X connect 4 1 13 0;
+#X connect 4 2 14 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 3 1;
+#X connect 9 0 11 1;
+#X connect 10 0 12 0;
+#X connect 11 0 8 0;
+#X connect 12 0 9 0;
+#X connect 12 0 13 1;
+#X connect 12 0 14 1;
+#X connect 13 0 11 0;
+#X connect 14 0 5 0;
+#X connect 15 0 0 0;
+#X connect 16 0 24 0;
+#X connect 23 0 0 0;
+#X connect 24 0 23 0;
+#X connect 24 1 15 0;
+#X connect 25 0 24 1;
diff --git a/externals/gridflow/pd_examples/videodev_effects.pd b/externals/gridflow/pd_examples/videodev_effects.pd
new file mode 100644
index 00000000..b11f026f
--- /dev/null
+++ b/externals/gridflow/pd_examples/videodev_effects.pd
@@ -0,0 +1,303 @@
+#N canvas 106 79 569 546 10;
+#X obj 86 397 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 72 149 # max 0;
+#N canvas 52 305 399 248 motion 0;
+#X obj 60 49 inlet;
+#X obj 60 72 # +;
+#X obj 60 158 outlet;
+#X msg 108 51 0;
+#X obj 60 142 fork;
+#X text 164 114 divide by 32 \, 16 \, 4;
+#X text 4 1 we do like #fade but faster (because of >>);
+#X text 4 15 feedback factors are 1/32 for red \, 1/16 for green \,
+1/8 for blue.;
+#X obj 60 114 # >> ( 5 4 2 );
+#X obj 175 85 # * ( 31 15 3 );
+#X connect 0 0 1 0;
+#X connect 1 0 8 0;
+#X connect 3 0 1 1;
+#X connect 4 0 2 0;
+#X connect 4 1 9 0;
+#X connect 8 0 4 0;
+#X connect 9 0 1 1;
+#X restore 130 218 pd motion fade;
+#X obj 28 263 shunt 2;
+#X obj 72 69 #downscale_by 2 smoothly;
+#X obj 28 398 shunt 2;
+#X obj 82 265 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 87 88 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 8 7 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1;
+#X obj 316 261 fork;
+#X obj 28 48 shunt 2;
+#X msg 286 243 256;
+#X obj 28 474 #out window;
+#X obj 84 49 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 28 515 print;
+#X obj 285 284 #for 0 256 1;
+#X floatatom 316 242 5 0 0 0 - - -;
+#N canvas 67 462 236 230 detect 0;
+#X obj 66 59 # * ( -1 -1 2 );
+#X obj 66 171 # max 0;
+#X obj 66 31 inlet;
+#X obj 66 222 #outer ignore ( 0 0 0 );
+#X obj 66 197 # min 255;
+#X obj 66 249 outlet;
+#X obj 65 82 #fold + \, seed -20;
+#X connect 0 0 6 0;
+#X connect 1 0 4 0;
+#X connect 2 0 0 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 6 0 1 0;
+#X restore 437 236 pd detect blue;
+#X obj 72 285 #outer ignore ( 0 );
+#X obj 103 131 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 5700 1;
+#X obj 28 189 shunt 2;
+#X obj 170 335 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 28 335 shunt 2;
+#X obj 28 495 fps detailed;
+#X obj 286 223 loadbang;
+#X obj 87 335 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 72 307 #store;
+#N canvas 81 205 480 500 sort 0;
+#X obj 10 305 # * ( 1 0 );
+#X obj 180 260 # * 255;
+#X obj 194 331 #outer ignore ( 0 0 0 );
+#X obj 10 345 # >> 0;
+#X obj 43 432 outlet;
+#X obj 181 53 inlet;
+#X obj 225 191 # / 2;
+#X obj 10 285 #for ( 0 0 ) ( 288 352 ) ( 1 1 );
+#X obj 10 325 # +;
+#X obj 44 9 inlet;
+#X obj 242 150 # - 1;
+#X obj 121 382 # +;
+#X obj 180 238 # < 176;
+#X obj 10 369 #store;
+#X obj 97 31 #grade;
+#X obj 121 404 # >> 1;
+#X obj 283 269 # / 351;
+#X obj 97 53 shunt 2;
+#X obj 145 77 #grade;
+#X obj 112 210 #outer & ( 0 -1 );
+#X obj 121 127 inlet;
+#X text 271 128 extract width;
+#X obj 10 266 #finished;
+#X obj 283 247 # * 255;
+#X obj 96 9 #fold +;
+#X obj 97 153 shunt 4;
+#X obj 107 359 shunt 4;
+#X msg 235 126 \$2;
+#X obj 204 77 #dim;
+#X obj 44 37 t a a;
+#X msg 186 127 \$1 \$2;
+#X obj 204 97 #export_list;
+#X connect 0 0 8 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 13 0;
+#X connect 5 0 17 1;
+#X connect 6 0 12 1;
+#X connect 7 0 0 0;
+#X connect 8 0 3 0;
+#X connect 9 0 29 0;
+#X connect 10 0 16 1;
+#X connect 11 0 15 0;
+#X connect 12 0 1 0;
+#X connect 13 0 26 0;
+#X connect 14 0 17 0;
+#X connect 15 0 4 0;
+#X connect 16 0 2 0;
+#X connect 17 0 25 0;
+#X connect 17 1 18 0;
+#X connect 18 0 25 0;
+#X connect 19 0 8 1;
+#X connect 20 0 25 1;
+#X connect 20 0 26 1;
+#X connect 22 0 7 0;
+#X connect 23 0 16 0;
+#X connect 24 0 14 0;
+#X connect 25 0 22 0;
+#X connect 25 0 19 0;
+#X connect 25 1 22 0;
+#X connect 25 1 19 0;
+#X connect 25 2 12 0;
+#X connect 25 3 23 0;
+#X connect 26 0 4 0;
+#X connect 26 1 11 0;
+#X connect 27 0 6 0;
+#X connect 27 0 10 0;
+#X connect 28 0 31 0;
+#X connect 29 0 24 0;
+#X connect 29 1 13 1;
+#X connect 29 1 28 0;
+#X connect 29 1 11 1;
+#X connect 30 0 7 1;
+#X connect 31 0 27 0;
+#X connect 31 0 30 0;
+#X restore 87 355 pd sort me out;
+#X obj 285 304 # gamma;
+#X obj 72 129 # -;
+#X obj 82 191 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 74 238 enable gamma correction;
+#X obj 285 266 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 372 198 399 273 motion 0;
+#X obj 15 113 # << 2;
+#X obj 15 162 @! abs;
+#X obj 15 9 inlet;
+#X obj 18 80 # -;
+#X obj 70 174 # + 128;
+#X obj 15 245 outlet;
+#X obj 15 204 # min 255;
+#X obj 15 224 # max 0;
+#X obj 70 155 # << 2;
+#X obj 15 35 t a a;
+#X obj 15 134 shunt 2;
+#X obj 70 133 inlet render;
+#X obj 155 54 inlet type;
+#X obj 15 54 shunt 2;
+#X connect 0 0 10 0;
+#X connect 1 0 6 0;
+#X connect 2 0 9 0;
+#X connect 3 0 0 0;
+#X connect 4 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 8 0 4 0;
+#X connect 9 0 13 0;
+#X connect 9 1 3 0;
+#X connect 10 0 1 0;
+#X connect 10 1 8 0;
+#X connect 11 0 10 1;
+#X connect 12 0 13 1;
+#X connect 13 0 3 1;
+#X restore 72 109 pd motion detection;
+#X obj 105 335 hradio 15 1 0 4 empty empty empty 0 -6 0 8 -262144 -1
+-1 0;
+#X text 126 149 noise reduction (on find-edges only);
+#N canvas 67 462 236 230 detect 0;
+#X obj 66 171 # max 0;
+#X obj 66 31 inlet;
+#X obj 66 222 #outer ignore ( 0 0 0 );
+#X obj 66 197 # min 255;
+#X obj 66 249 outlet;
+#X obj 65 82 #fold + \, seed -20;
+#X obj 66 59 # * ( 2 -1 -1 );
+#X connect 0 0 3 0;
+#X connect 1 0 6 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X restore 437 217 pd detect red;
+#X obj 27 8 metro 33.3667;
+#X obj 28 69 t a a;
+#X text 101 49 Smaller Picture;
+#X obj 28 89 shunt 2;
+#X obj 211 96 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1
+-1 0;
+#X obj 163 427 #centroid;
+#X obj 163 448 #export_list;
+#X floatatom 165 487 5 0 0 0 - - -;
+#X obj 164 467 unpack 0 0;
+#X floatatom 229 487 5 0 0 0 - - -;
+#N canvas 639 147 477 267 crosshair 0;
+#X obj 12 224 outlet;
+#X obj 12 9 inlet;
+#X obj 95 169 # + ( 120 160 );
+#X msg 21 125 12 2 # \$1 \$2 \$1 \$3 \$2 \$3 \$2 \$4 \$3 \$4 \$3 \$3
+\$4 \$3 \$4 \$2 \$3 \$2 \$3 \$1 \$2 \$1 \$2 \$2;
+#X msg 54 95 -32 -1 1 32;
+#X obj 12 205 #draw_polygon + ( 0 170 0 );
+#X obj 175 37 #fade 8;
+#X obj 175 18 inlet;
+#X obj 170 60 #finished;
+#X connect 1 0 5 0;
+#X connect 2 0 5 2;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 5 0 0 0;
+#X connect 6 0 2 1;
+#X connect 6 0 8 0;
+#X connect 7 0 6 0;
+#X connect 8 0 4 0;
+#X restore 72 428 pd crosshair;
+#X msg 128 8 open dc1394;
+#X msg 217 9 open mpeg file images/movies/washington_zoom_in.mpeg;
+#X msg 217 29 open xine images/movies/washington_zoom_in.mpeg;
+#X obj 28 27 #camera;
+#X obj 186 30 #in;
+#X obj 104 192 #fade;
+#X msg 145 194 32 16 4;
+#X obj 28 450 t a;
+#X text 231 110 emboss;
+#X text 230 96 hilite;
+#X text 110 397 designed to work with "hilite" above;
+#X obj 281 96 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1
+-1 0;
+#X text 300 96 motion;
+#X text 301 110 presence;
+#X connect 0 0 5 1;
+#X connect 1 0 20 0;
+#X connect 2 0 3 0;
+#X connect 3 0 22 0;
+#X connect 3 1 18 0;
+#X connect 4 0 38 0;
+#X connect 5 0 55 0;
+#X connect 5 1 42 0;
+#X connect 5 1 47 0;
+#X connect 6 0 3 1;
+#X connect 7 0 40 1;
+#X connect 8 0 37 0;
+#X connect 9 0 32 0;
+#X connect 9 1 28 1;
+#X connect 10 0 38 0;
+#X connect 10 1 4 0;
+#X connect 11 0 16 0;
+#X connect 12 0 23 0;
+#X connect 13 0 10 1;
+#X connect 15 0 28 0;
+#X connect 16 0 9 0;
+#X connect 18 0 26 0;
+#X connect 19 0 29 1;
+#X connect 20 0 3 0;
+#X connect 20 1 2 0;
+#X connect 21 0 27 2;
+#X connect 22 0 5 0;
+#X connect 22 1 27 0;
+#X connect 23 0 14 0;
+#X connect 24 0 11 0;
+#X connect 25 0 22 1;
+#X connect 26 0 22 0;
+#X connect 27 0 5 0;
+#X connect 28 0 26 1;
+#X connect 29 0 1 0;
+#X connect 30 0 20 1;
+#X connect 32 0 15 0;
+#X connect 33 0 29 0;
+#X connect 34 0 27 1;
+#X connect 37 0 51 0;
+#X connect 38 0 40 0;
+#X connect 40 0 20 0;
+#X connect 40 1 33 0;
+#X connect 41 0 33 1;
+#X connect 42 0 43 0;
+#X connect 42 0 47 1;
+#X connect 43 0 45 0;
+#X connect 45 0 44 0;
+#X connect 45 1 46 0;
+#X connect 47 0 55 0;
+#X connect 51 0 10 0;
+#X connect 53 0 3 0;
+#X connect 54 0 53 1;
+#X connect 55 0 12 0;
+#X connect 59 0 33 2;
diff --git a/externals/gridflow/pd_examples/waves.pd b/externals/gridflow/pd_examples/waves.pd
new file mode 100644
index 00000000..c9706ca4
--- /dev/null
+++ b/externals/gridflow/pd_examples/waves.pd
@@ -0,0 +1,339 @@
+#N canvas 366 97 753 590 10;
+#X obj 265 207 #greyscale_to_rgb;
+#X obj 251 350 # min 255;
+#X obj 271 5 loadbang;
+#X obj 211 25 fork;
+#X obj 251 389 #out x11;
+#X obj 313 409 print;
+#N canvas 23 304 369 368 mouse 0;
+#X text 109 189 coordinates;
+#X obj 56 189 outlet;
+#X obj 57 164 listsublist 0 2;
+#X obj 8 141 shunt 2;
+#X text 56 9 #out's outlet 0;
+#X obj 100 142 outlet;
+#X obj 41 94 >> 8;
+#X obj 41 115 != 0;
+#X obj 16 31 route position;
+#X text 154 143 is there a click?;
+#X obj 19 8 inlet;
+#X obj 16 55 fork;
+#X obj 41 73 listelement 2;
+#X connect 2 0 1 0;
+#X connect 3 1 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 7 0 3 1;
+#X connect 8 0 11 0;
+#X connect 10 0 8 0;
+#X connect 11 0 3 0;
+#X connect 11 1 12 0;
+#X connect 12 0 6 0;
+#X restore 251 428 pd mouse click/drag;
+#X obj 12 39 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 1 1
+;
+#N canvas 637 335 419 287 lighting 0;
+#X obj 56 243 outlet;
+#X obj 17 9 inlet;
+#X obj 86 138 #outer & ( -1 0 0 );
+#X text 91 100 produce red/cyan from horiz differences;
+#X text 64 160 produce white/black from vertical differences;
+#X obj 56 199 #outer & ( -1 -1 0 );
+#X obj 56 222 # +;
+#X obj 108 10 #dim;
+#X obj 140 10 #export_list;
+#X obj 56 29 #redim ( );
+#X obj 56 9 t a a;
+#X obj 56 49 t a a;
+#X msg 141 30 \$1 \$2;
+#X obj 86 117 #convolve ( 1 2 # ) \, op ignore \, fold inv+;
+#X obj 56 177 #convolve ( 2 1 # ) \, op ignore \, fold inv+;
+#X connect 1 0 10 0;
+#X connect 2 0 6 1;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 8 0;
+#X connect 8 0 12 0;
+#X connect 9 0 11 0;
+#X connect 10 0 9 0;
+#X connect 10 1 7 0;
+#X connect 11 0 14 0;
+#X connect 11 1 13 0;
+#X connect 12 0 9 1;
+#X connect 13 0 2 0;
+#X connect 14 0 5 0;
+#X restore 216 242 pd lighting;
+#X obj 251 447 # / 2;
+#X msg 138 46 \$1 \$2 1 # 0;
+#N canvas 137 251 392 303 finger 0;
+#X obj 149 39 #redim ( 4 2 );
+#X obj 71 16 inlet;
+#X obj 149 20 inlet;
+#X obj 71 217 outlet;
+#X obj 149 158 # +;
+#X obj 177 157 # *;
+#X msg 177 137 0 0 0 1 1 1 1 0;
+#X obj 193 79 inlet size;
+#X text 291 137 square or rect;
+#X obj 177 112 #finished;
+#X obj 70 195 #draw_polygon put ( 1000 );
+#X connect 0 0 4 0;
+#X connect 1 0 10 0;
+#X connect 2 0 0 0;
+#X connect 4 0 10 2;
+#X connect 5 0 4 1;
+#X connect 6 0 5 0;
+#X connect 7 0 9 0;
+#X connect 7 0 5 1;
+#X connect 9 0 6 0;
+#X connect 10 0 3 0;
+#X restore 292 519 pd finger;
+#X obj 245 25 s size;
+#X obj 251 370 #scale_by 2;
+#X obj 80 142 #store;
+#X obj 312 389 fps detailed;
+#N canvas 53 323 453 223 wave 0;
+#X obj 26 20 inlet;
+#X obj 28 182 outlet;
+#X text 70 137 time differential;
+#X text 81 50 space differential: (d/dx)^2 + (d/dy)^2;
+#X text 71 8 Recurrence equation for propagation of oscillations;
+#X obj 28 137 # -;
+#X obj 54 102 # >> 4;
+#X obj 28 158 # *>>8 242;
+#X text 105 159 amortizing by ~5.5%;
+#X obj 24 46 t a a;
+#X obj 54 81 #convolve ( 3 3 # 1 4 1 4 0 4 ) \, seed 8;
+#X connect 0 0 9 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 7 0 1 0;
+#X connect 9 0 5 1;
+#X connect 9 1 10 0;
+#X connect 10 0 6 0;
+#X restore 80 203 pd wave equation;
+#X obj 249 515 t a;
+#X obj 117 122 t a;
+#X obj 251 330 # max 0;
+#X obj 265 188 # >> 1;
+#X obj 31 63 s metro;
+#X msg 211 5 240 320;
+#X text 441 19 Copyright (c) 2003 \, 2004 by Mathieu Bouchard;
+#X text 481 72 (Best complemented with a touchscreen);
+#X text 441 2 waves.pd;
+#X obj 376 141 vradio 15 1 0 3 empty empty empty 0 -6 0 8 -262144 -258699
+-1 2;
+#X text 395 155 height greys;
+#X obj 298 103 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -258699
+-1 0;
+#X text 317 102 plain;
+#X text 318 118 line-art;
+#X text 315 46 smooth;
+#X obj 296 46 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -258699
+-1 0;
+#X text 316 60 raw;
+#X obj 443 379 hradio 18 1 1 4 empty empty _1__2__3__4_ 0 -4 0 8 -262144
+-258699 -1 1;
+#X text 441 354 scale by...;
+#X obj 443 400 + 1;
+#X obj 664 129 loadbang;
+#X obj 557 331 #in;
+#X obj 584 305 #camera_control;
+#X obj 558 284 spigot;
+#X obj 605 285 tgl 15 0 empty empty empty 18 8 0 8 -241291 -1 -62784
+1 1;
+#X obj 558 264 r metro;
+#N canvas 242 284 365 231 line-art 0;
+#X obj 32 123 # << 8;
+#X obj 32 37 inlet;
+#X obj 32 145 outlet;
+#X text 146 31 double-thresholding;
+#X text 146 114 else becomes 0;
+#X obj 32 82 # min 1;
+#X obj 32 103 # max -1;
+#X obj 32 60 # / 3;
+#X text 146 85 < -3 becomes -256;
+#X text 146 100 > +3 becomes +256;
+#X connect 0 0 2 0;
+#X connect 1 0 7 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 5 0;
+#X restore 283 142 pd line-art;
+#X text 560 214 Background colour;
+#X text 625 285 enable video;
+#X msg 584 325 open r001.jpg \, bang;
+#X text 394 141 four-colour emboss;
+#X obj 142 402 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 1
+1;
+#X obj 88 377 r metro;
+#X obj 88 441 @! rand;
+#X msg 87 421 240 320;
+#X text 160 399 rain;
+#X text 558 3 bundled with GridFlow 0.7.7;
+#X obj 240 100 # >> 2;
+#X text 378 36 Originally made for Alexandre Castonguay's "DIGITALE"
+;
+#X text 495 53 But suitable for a lot more uses :-);
+#X msg 599 129 3 # 128;
+#X obj 557 154 #color;
+#X obj 239 121 shunt 2;
+#X obj 239 59 shunt 2;
+#X obj 403 486 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262131 -1 -1 2 256;
+#X obj 403 503 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262131 -1 -1 2 256;
+#X obj 359 519 #pack 2;
+#X obj 216 291 # +;
+#X obj 332 302 #store;
+#X obj 421 236 shunt 2;
+#X obj 477 232 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -258699
+-1 0;
+#X text 495 230 plain;
+#X text 495 248 refraction;
+#X obj 216 263 t a;
+#N canvas 203 363 443 300 heightmap2indexmap 0;
+#X obj 48 279 outlet;
+#X obj 9 8 inlet;
+#X obj 48 159 # +;
+#X obj 100 9 #dim;
+#X obj 132 9 #export_list;
+#X obj 48 28 #redim ( );
+#X obj 48 8 t a a;
+#X obj 48 48 t a a;
+#X msg 133 29 \$1 \$2;
+#X obj 78 92 #outer & ( -1 0 );
+#X obj 48 137 #outer & ( 0 -1 );
+#X obj 48 251 # +;
+#X obj 73 251 #for ( 0 0 ) ( 240 320 ) ( 1 1 );
+#X obj 116 229 loadbang;
+#X obj 84 229 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 48 182 # >> 1;
+#X obj 48 115 #convolve ( 2 1 # ) \, op ignore \, fold inv+;
+#X obj 78 71 #convolve ( 1 2 # ) \, op ignore \, fold inv+;
+#X connect 1 0 6 0;
+#X connect 2 0 15 0;
+#X connect 3 0 4 0;
+#X connect 4 0 8 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 6 1 3 0;
+#X connect 7 0 16 0;
+#X connect 7 1 17 0;
+#X connect 8 0 5 1;
+#X connect 9 0 2 1;
+#X connect 10 0 2 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 1;
+#X connect 13 0 12 0;
+#X connect 14 0 12 0;
+#X connect 15 0 11 0;
+#X connect 16 0 10 0;
+#X connect 17 0 9 0;
+#X restore 332 281 pd heightmap2indexmap;
+#X obj 11 63 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X obj 332 228 spigot;
+#X text 397 170 no reflection;
+#X obj 239 167 shunt 3;
+#X obj 239 145 t a;
+#X obj 313 188 # put 0;
+#X obj 255 491 shunt 2;
+#X obj 325 493 shunt 2;
+#X obj 87 401 shunt 2;
+#X obj 31 39 metro 33.3667;
+#X obj 80 171 shunt 2;
+#X text 154 173 freeze time;
+#X obj 137 173 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 131 100 r feedback;
+#X obj 229 543 s feedback;
+#X obj 124 264 t a;
+#X obj 239 80 #convolve ( 2 2 # ) \, op ignore;
+#X obj 571 403 #yuv_to_rgb;
+#X text 500 501 pas de reflection \, + yuv;
+#X connect 0 0 70 0;
+#X connect 1 0 13 0;
+#X connect 2 0 22 0;
+#X connect 3 0 10 0;
+#X connect 3 1 12 0;
+#X connect 4 0 15 0;
+#X connect 4 0 6 0;
+#X connect 6 0 9 0;
+#X connect 6 1 79 0;
+#X connect 7 0 81 0;
+#X connect 8 0 70 0;
+#X connect 9 0 11 1;
+#X connect 10 0 18 0;
+#X connect 11 0 17 0;
+#X connect 13 0 4 0;
+#X connect 14 0 82 0;
+#X connect 15 0 5 0;
+#X connect 16 0 87 0;
+#X connect 17 0 86 0;
+#X connect 18 0 14 1;
+#X connect 18 0 60 0;
+#X connect 19 0 1 0;
+#X connect 20 0 0 0;
+#X connect 22 0 3 0;
+#X connect 26 0 75 1;
+#X connect 28 0 59 1;
+#X connect 32 0 60 1;
+#X connect 34 0 36 0;
+#X connect 36 0 9 1;
+#X connect 36 0 13 1;
+#X connect 37 0 57 0;
+#X connect 38 0 89 0;
+#X connect 39 0 38 0;
+#X connect 40 0 38 0;
+#X connect 41 0 40 1;
+#X connect 42 0 40 0;
+#X connect 43 0 76 0;
+#X connect 46 0 38 0;
+#X connect 48 0 78 1;
+#X connect 48 0 79 1;
+#X connect 48 0 80 1;
+#X connect 49 0 80 0;
+#X connect 50 0 11 1;
+#X connect 51 0 50 0;
+#X connect 54 0 59 0;
+#X connect 57 0 58 0;
+#X connect 58 0 66 0;
+#X connect 59 0 76 0;
+#X connect 59 1 43 0;
+#X connect 60 0 88 0;
+#X connect 60 1 59 0;
+#X connect 61 0 63 0;
+#X connect 62 0 63 1;
+#X connect 63 0 11 2;
+#X connect 64 0 19 0;
+#X connect 65 0 64 1;
+#X connect 66 0 64 1;
+#X connect 66 1 65 1;
+#X connect 67 0 66 1;
+#X connect 67 0 73 1;
+#X connect 70 0 64 0;
+#X connect 71 0 65 0;
+#X connect 72 0 21 0;
+#X connect 72 0 14 0;
+#X connect 73 0 71 0;
+#X connect 75 0 8 0;
+#X connect 75 1 20 0;
+#X connect 75 2 77 0;
+#X connect 76 0 75 0;
+#X connect 76 0 73 0;
+#X connect 77 0 0 0;
+#X connect 78 0 17 0;
+#X connect 78 1 11 0;
+#X connect 79 0 78 1;
+#X connect 80 1 51 0;
+#X connect 81 0 14 0;
+#X connect 81 0 21 0;
+#X connect 82 0 16 0;
+#X connect 82 1 87 0;
+#X connect 84 0 82 1;
+#X connect 85 0 18 0;
+#X connect 87 0 78 0;
+#X connect 88 0 54 0;
+#X connect 89 0 77 1;
diff --git a/externals/gridflow/pd_help/@!.pd b/externals/gridflow/pd_help/@!.pd
new file mode 100644
index 00000000..c52fe904
--- /dev/null
+++ b/externals/gridflow/pd_help/@!.pd
@@ -0,0 +1,65 @@
+#N canvas 301 131 593 440 10;
+#X obj 18 145 @! abs;
+#X obj 18 178 @export;
+#X obj 133 177 @export;
+#X obj 133 144 @! rand;
+#X obj 249 178 @export;
+#X obj 249 145 @! sqrt;
+#X floatatom 18 94 5 0 0 0 - - -;
+#X obj 364 144 @! sq;
+#X obj 364 178 @export;
+#X text 19 325 inlet: grid | outlet: grid;
+#X text 15 241 absolute value;
+#X text 363 241 A * A;
+#X text 14 14 the one-input operators: @! abs \, @! rand \, @! sqrt
+\, @! sq;
+#X obj 18 111 @import ( 1 );
+#X floatatom 133 94 5 0 0 0 - - -;
+#X obj 133 111 @import ( 1 );
+#X floatatom 249 95 5 0 0 0 - - -;
+#X obj 249 112 @import ( 1 );
+#X floatatom 364 95 5 0 0 0 - - -;
+#X obj 364 112 @import ( 1 );
+#X text 132 242 random non-;
+#X text 133 257 negative number;
+#X text 133 273 below A;
+#X text 246 325 A refers to the left inlet;
+#X text 250 257 of A rounded;
+#X text 249 242 sqare root;
+#X text 250 273 downwards;
+#X obj 115 94 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 18 197 route int;
+#X obj 133 196 route int;
+#X obj 249 197 route int;
+#X obj 364 197 route int;
+#X floatatom 18 217 5 0 0 0 - - -;
+#X floatatom 133 216 5 0 0 0 - - -;
+#X floatatom 249 217 5 0 0 0 - - -;
+#X floatatom 364 217 5 0 0 0 - - -;
+#X obj 94 376 @ +;
+#X text 19 371 see also:;
+#X text 514 13 gridflow;
+#X text 38 37 computes one of the four basic one-input operators;
+#X text 36 51 on each value of a grid;
+#X connect 0 0 1 0;
+#X connect 1 0 28 0;
+#X connect 2 0 29 0;
+#X connect 3 0 2 0;
+#X connect 4 0 30 0;
+#X connect 5 0 4 0;
+#X connect 6 0 13 0;
+#X connect 7 0 8 0;
+#X connect 8 0 31 0;
+#X connect 13 0 0 0;
+#X connect 14 0 15 0;
+#X connect 15 0 3 0;
+#X connect 16 0 17 0;
+#X connect 17 0 5 0;
+#X connect 18 0 19 0;
+#X connect 19 0 7 0;
+#X connect 27 0 14 0;
+#X connect 28 0 32 0;
+#X connect 29 0 33 0;
+#X connect 30 0 34 0;
+#X connect 31 0 35 0;
diff --git a/externals/gridflow/pd_help/@.pd b/externals/gridflow/pd_help/@.pd
new file mode 100644
index 00000000..8c891d2d
--- /dev/null
+++ b/externals/gridflow/pd_help/@.pd
@@ -0,0 +1,115 @@
+#N canvas 662 216 748 501 10;
+#X obj 19 157 @ +;
+#X obj 210 158 @ -;
+#X text 50 161 A + B;
+#X text 241 162 A - B;
+#X obj 402 158 @ inv+;
+#X text 458 161 B - A;
+#X obj 19 273 @ *;
+#X text 50 276 A * B;
+#X text 240 272 A / B;
+#X text 240 283 rounded towards zero;
+#X obj 210 274 @ /;
+#X obj 402 272 @ inv*;
+#X text 455 279 rounded towards zero;
+#X text 457 269 B / A;
+#X obj 20 390 @ %;
+#X obj 211 391 @ swap%;
+#X obj 403 392 @ rem;
+#X text 50 393 A % B \, modulo;
+#X text 270 395 B % A \, modulo;
+#X text 452 394 A % B \, remainder;
+#X floatatom 509 52 5 0 0 0 - - -;
+#X obj 509 76 @import ( 1 );
+#X floatatom 621 52 5 0 0 0 - - -;
+#X obj 621 76 @import ( 1 );
+#X obj 19 130 r l;
+#X obj 44 130 r r;
+#X obj 210 131 r l;
+#X obj 235 131 r r;
+#X obj 402 131 r l;
+#X obj 427 131 r r;
+#X obj 19 246 r l;
+#X obj 44 246 r r;
+#X obj 210 247 r l;
+#X obj 235 247 r r;
+#X obj 402 244 r l;
+#X obj 427 244 r r;
+#X obj 20 361 r l;
+#X obj 45 361 r r;
+#X obj 211 362 r l;
+#X obj 236 362 r r;
+#X obj 403 363 r l;
+#X obj 428 363 r r;
+#X obj 509 96 s l;
+#X obj 621 97 s r;
+#X floatatom 19 204 5 0 0 0 - - -;
+#X obj 19 185 @export_list;
+#X floatatom 210 204 5 0 0 0 - - -;
+#X obj 210 185 @export_list;
+#X floatatom 402 204 5 0 0 0 - - -;
+#X obj 402 185 @export_list;
+#X text 14 14 the two-input operators: *whoa \, there's a lot of them*
+;
+#X floatatom 19 320 5 0 0 0 - - -;
+#X obj 19 301 @export_list;
+#X floatatom 210 320 5 0 0 0 - - -;
+#X obj 210 301 @export_list;
+#X floatatom 402 320 5 0 0 0 - - -;
+#X obj 402 301 @export_list;
+#X floatatom 20 440 5 0 0 0 - - -;
+#X obj 20 421 @export_list;
+#X floatatom 211 440 5 0 0 0 - - -;
+#X obj 211 421 @export_list;
+#X floatatom 403 440 5 0 0 0 - - -;
+#X obj 403 421 @export_list;
+#X text 18 472 see also:;
+#X obj 99 476 @! abs;
+#X text 684 13 gridflow;
+#X text 14 80 angles are in hundredth of degrees \, so a full circle
+(two pi radians) is 36000 you can convert from radians to our angles
+by multiplying by 18000/pi.;
+#X text 14 54 for all of these \, A refers to the left inlet and B
+to the value on the right.;
+#X text 15 27 Consult doc/architecture.html to see all the 40 of them.
+;
+#X connect 0 0 45 0;
+#X connect 1 0 47 0;
+#X connect 4 0 49 0;
+#X connect 6 0 52 0;
+#X connect 10 0 54 0;
+#X connect 11 0 56 0;
+#X connect 14 0 58 0;
+#X connect 15 0 60 0;
+#X connect 16 0 62 0;
+#X connect 20 0 21 0;
+#X connect 21 0 42 0;
+#X connect 22 0 23 0;
+#X connect 23 0 43 0;
+#X connect 24 0 0 0;
+#X connect 25 0 0 1;
+#X connect 26 0 1 0;
+#X connect 27 0 1 1;
+#X connect 28 0 4 0;
+#X connect 29 0 4 1;
+#X connect 30 0 6 0;
+#X connect 31 0 6 1;
+#X connect 32 0 10 0;
+#X connect 33 0 10 1;
+#X connect 34 0 11 0;
+#X connect 35 0 11 1;
+#X connect 36 0 14 0;
+#X connect 37 0 14 1;
+#X connect 38 0 15 0;
+#X connect 39 0 15 1;
+#X connect 40 0 16 0;
+#X connect 41 0 16 1;
+#X connect 45 0 44 0;
+#X connect 47 0 46 0;
+#X connect 49 0 48 0;
+#X connect 52 0 51 0;
+#X connect 54 0 53 0;
+#X connect 56 0 55 0;
+#X connect 58 0 57 0;
+#X connect 60 0 59 0;
+#X connect 62 0 61 0;
diff --git a/externals/gridflow/pd_help/@apply_colormap_channelwise.pd b/externals/gridflow/pd_help/@apply_colormap_channelwise.pd
new file mode 100644
index 00000000..7f4cbbbf
--- /dev/null
+++ b/externals/gridflow/pd_help/@apply_colormap_channelwise.pd
@@ -0,0 +1,29 @@
+#N canvas 119 122 762 396 10;
+#X obj 19 118 @in;
+#X obj 19 239 @apply_colormap_channelwise;
+#X text 14 17 @apply_colormap_channelweb;
+#X obj 203 190 @import ( 256 3 );
+#X obj 203 168 random 255;
+#X msg 203 128 768;
+#X obj 203 148 until;
+#X text 305 108 colormap is a grid dim (2) (intensity channels);
+#X text 679 13 gridflow;
+#X msg 52 86 open bluemarble.jpg;
+#X obj 19 366 @out window;
+#X text 304 54 this object is useful for color correction. for each
+pixel it takes it apart \, looks up each part separately in the colormap
+and constructs a new pixel from that.;
+#X obj 19 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 19 59 fork;
+#X connect 0 0 1 0;
+#X connect 1 0 10 0;
+#X connect 3 0 1 1;
+#X connect 4 0 3 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 9 0 0 0;
+#X connect 12 0 13 0;
+#X connect 13 0 0 0;
+#X connect 13 0 5 0;
+#X connect 13 1 9 0;
diff --git a/externals/gridflow/pd_help/@cast.pd b/externals/gridflow/pd_help/@cast.pd
new file mode 100644
index 00000000..92543dee
--- /dev/null
+++ b/externals/gridflow/pd_help/@cast.pd
@@ -0,0 +1,46 @@
+#N canvas 435 101 684 379 10;
+#X text 14 15 @cast;
+#X text 143 14 returns a grid of the same dimensions containing all
+the same values after type conversion. note that while casting to a
+smaller type \, overflowing values will be truncated.;
+#X text 626 13 gridflow;
+#X text 142 58 numbertypes are: uint8 \, int16 \, int32 \, int64 \,
+float32 \, float64. see doc/architecture.html for more info.;
+#X obj 126 90 nbx 8 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 3.1416 256;
+#X obj 115 136 @pack 4 float32;
+#X obj 78 185 @store;
+#X obj 78 136 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 14 136 print it:;
+#X obj 136 234 @print;
+#X obj 78 205 t a a a a;
+#X obj 78 354 @print;
+#X obj 97 314 @print;
+#X obj 116 254 @cast uint8;
+#X obj 116 274 @print;
+#X obj 97 294 @cast int32;
+#X obj 78 334 @cast float64;
+#X obj 216 90 nbx 8 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 42 256;
+#X obj 126 110 nbx 8 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 2004 256;
+#X obj 216 110 nbx 8 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 1e+10 256;
+#X obj 118 158 @redim ( 2 2 );
+#X text 182 295 normally the default;
+#X connect 4 0 5 0;
+#X connect 5 0 20 0;
+#X connect 6 0 10 0;
+#X connect 7 0 6 0;
+#X connect 10 0 16 0;
+#X connect 10 1 15 0;
+#X connect 10 2 13 0;
+#X connect 10 3 9 0;
+#X connect 13 0 14 0;
+#X connect 15 0 12 0;
+#X connect 16 0 11 0;
+#X connect 17 0 5 1;
+#X connect 18 0 5 2;
+#X connect 19 0 5 3;
+#X connect 20 0 6 1;
diff --git a/externals/gridflow/pd_help/@checkers.pd b/externals/gridflow/pd_help/@checkers.pd
new file mode 100644
index 00000000..a8de669e
--- /dev/null
+++ b/externals/gridflow/pd_help/@checkers.pd
@@ -0,0 +1,13 @@
+#N canvas 431 74 440 355 10;
+#X obj 20 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 20 164 @checkers;
+#X obj 20 81 @for ( 0 0 ) ( 128 128 ) ( 1 1 );
+#X text 16 7 @checkers;
+#X text 216 297 see also;
+#X obj 283 301 @draw_polygon;
+#X text 354 7 gridflow;
+#X obj 20 309 @out window;
+#X connect 0 0 2 0;
+#X connect 1 0 7 0;
+#X connect 2 0 1 0;
diff --git a/externals/gridflow/pd_help/@complex_sq.pd b/externals/gridflow/pd_help/@complex_sq.pd
new file mode 100644
index 00000000..9adacae8
--- /dev/null
+++ b/externals/gridflow/pd_help/@complex_sq.pd
@@ -0,0 +1,27 @@
+#N canvas 301 131 637 303 10;
+#X text 14 14 @comlex_sq;
+#X obj 21 159 @complex_sq;
+#X text 96 15 this object computes the square of complex numbers. if
+seeing imaginary as Y and real as X \, then this operation squares
+the distance of a point from origin and doubles the angle between it
+and the +X half-axis clockwise. :);
+#X floatatom 21 108 5 0 0 0 - - -;
+#X obj 21 188 @export_list;
+#X floatatom 21 238 5 0 0 0 - - -;
+#X obj 21 128 @two;
+#X floatatom 64 108 5 0 0 0 - - -;
+#X obj 114 235 @print;
+#X obj 21 209 unpack;
+#X floatatom 58 238 5 0 0 0 - - -;
+#X text 572 13 gridflow;
+#X text 21 275 see also:;
+#X obj 94 279 @ +;
+#X obj 127 279 @! abs;
+#X connect 1 0 4 0;
+#X connect 1 0 8 0;
+#X connect 3 0 6 0;
+#X connect 4 0 9 0;
+#X connect 6 0 1 0;
+#X connect 7 0 6 1;
+#X connect 9 0 5 0;
+#X connect 9 1 10 0;
diff --git a/externals/gridflow/pd_help/@convolve.pd b/externals/gridflow/pd_help/@convolve.pd
new file mode 100644
index 00000000..31c77936
--- /dev/null
+++ b/externals/gridflow/pd_help/@convolve.pd
@@ -0,0 +1,40 @@
+#N canvas 923 183 662 404 10;
+#X obj 19 37 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X text 14 15 @convolve blurs \, sharpens \, finds edges \, emboss
+& more ...;
+#X obj 19 108 @in;
+#X obj 19 133 @convolve ^ + 0;
+#X msg 212 76 1 1 1 1 1 1 1 1 1;
+#X obj 212 96 @redim ( 3 3 );
+#X text 569 17 gridflow;
+#X text 18 363 see also:;
+#X obj 234 367 @solarize;
+#X obj 303 367 @layer;
+#X obj 158 367 @posterize;
+#X obj 89 367 @contrast;
+#X obj 212 57 loadbang;
+#X msg 42 85 open bluemarble.jpg;
+#X text 216 187 splits the incoming grid into dim(rest...) parts \,
+for each of those parts at (xy \, x). a rectangle of such parts \,
+centered around (y \, x) is combined with the convolution grid like
+a [@] of operation op_para. then each such result is folded like [@
+fold] of operation op_fold and specified base. the results are assembled
+into a grid that is sent to the outlet. near the borders of the grid
+\, coordinates wrap around. this means the whole grid has to be received
+before production of the next grid starts. this is the convolution
+grid and it gets stored in the object. rows2 and columns2 must be odd
+numbers.;
+#X text 145 130 here ^ is the parallel operator \, fold is indicated
+by + and 0 is its base.;
+#X obj 19 62 fork;
+#X obj 19 309 @out window;
+#X connect 0 0 16 0;
+#X connect 2 0 3 0;
+#X connect 3 0 17 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 1;
+#X connect 12 0 4 0;
+#X connect 13 0 2 0;
+#X connect 16 0 2 0;
+#X connect 16 1 13 0;
diff --git a/externals/gridflow/pd_help/@downscale_by.pd b/externals/gridflow/pd_help/@downscale_by.pd
new file mode 100644
index 00000000..bf2356cc
--- /dev/null
+++ b/externals/gridflow/pd_help/@downscale_by.pd
@@ -0,0 +1,26 @@
+#N canvas 614 643 463 368 10;
+#X obj 144 82 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 113 101 @in;
+#X obj 20 72 metro 10;
+#X obj 20 49 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 1 1
+;
+#X text 301 313 see also:;
+#X obj 377 312 @scale_to;
+#X obj 200 133 @import ( 1 );
+#X floatatom 200 113 5 0 0 0 - - -;
+#X obj 377 333 @scale_by;
+#X text 14 15 @downscale_by;
+#X text 384 17 gridflow;
+#X obj 113 157 @downscale_by;
+#X obj 113 310 @out window;
+#X msg 114 56 open bluemarble.jpg;
+#X connect 0 0 1 0;
+#X connect 1 0 11 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 6 0 11 1;
+#X connect 7 0 6 0;
+#X connect 11 0 12 0;
+#X connect 13 0 1 0;
+#X connect 13 0 0 0;
diff --git a/externals/gridflow/pd_help/@draw_polygon.pd b/externals/gridflow/pd_help/@draw_polygon.pd
new file mode 100644
index 00000000..b4325a02
--- /dev/null
+++ b/externals/gridflow/pd_help/@draw_polygon.pd
@@ -0,0 +1,36 @@
+#N canvas 386 391 634 338 10;
+#X obj 22 27 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X floatatom 58 142 5 0 255 0 - - -;
+#X obj 84 179 @three;
+#X floatatom 101 142 5 0 255 0 - - -;
+#X floatatom 144 142 5 0 255 0 - - -;
+#X obj 195 158 until;
+#X obj 195 177 random 128;
+#X text 16 7 @draw_polygon;
+#X text 362 6 gridflow;
+#X obj 20 237 @draw_polygon put 1;
+#X obj 20 48 fork;
+#X obj 51 48 fork;
+#X obj 20 106 @in;
+#X obj 196 196 @import ( 4 2 );
+#X msg 195 139 4;
+#X obj 20 309 @out window;
+#X msg 47 81 open r001.jpg;
+#X text 158 80 1 <-- open image;
+#X connect 0 0 10 0;
+#X connect 1 0 2 0;
+#X connect 2 0 9 1;
+#X connect 3 0 2 1;
+#X connect 4 0 2 2;
+#X connect 5 0 6 0;
+#X connect 6 0 13 0;
+#X connect 9 0 15 0;
+#X connect 10 0 12 0;
+#X connect 10 1 11 0;
+#X connect 11 0 2 0;
+#X connect 11 1 14 0;
+#X connect 12 0 9 0;
+#X connect 13 0 9 2;
+#X connect 14 0 5 0;
+#X connect 16 0 12 0;
diff --git a/externals/gridflow/pd_help/@finished.pd b/externals/gridflow/pd_help/@finished.pd
new file mode 100644
index 00000000..b91ee5a7
--- /dev/null
+++ b/externals/gridflow/pd_help/@finished.pd
@@ -0,0 +1,15 @@
+#N canvas 551 311 442 238 10;
+#X text 21 22 @finished;
+#X text 22 53 a bang is emitted every time a grid transmission ends
+;
+#X obj 24 146 @finished;
+#X obj 24 175 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 24 118 @two;
+#X floatatom 24 80 5 0 0 0 - - -;
+#X floatatom 47 98 5 0 0 0 - - -;
+#X text 371 15 gridflow;
+#X connect 2 0 3 0;
+#X connect 4 0 2 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 1;
diff --git a/externals/gridflow/pd_help/@fold.pd b/externals/gridflow/pd_help/@fold.pd
new file mode 100644
index 00000000..dee0f54a
--- /dev/null
+++ b/externals/gridflow/pd_help/@fold.pd
@@ -0,0 +1,39 @@
+#N canvas 306 222 526 344 10;
+#X obj 18 103 @in;
+#X obj 18 280 print value;
+#X obj 18 137 @fold + 0;
+#X obj 18 160 @fold + 0;
+#X obj 18 184 @fold + 0;
+#X text 114 133 treats the grid as a grid of one- dimensional grids
+such that the same operation (here addition) will be performed on all
+its elements together with the base value. the results are combined
+back. each @fold operation removes a dimension. syntax: @fold <two-input
+operation> <starting value>;
+#X text 19 8 @fold;
+#X text 451 11 gridflow;
+#X obj 85 313 @inner2;
+#X text 14 309 see also:;
+#X obj 141 313 @join;
+#X obj 183 313 @perspective;
+#X msg 41 70 open bluemarble.jpg;
+#X obj 18 246 @export_list;
+#X msg 237 66 open b001.jpg;
+#X obj 18 49 fork;
+#X obj 9 29 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1
+;
+#X obj 214 41 fork;
+#X obj 199 21 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 13 0;
+#X connect 12 0 0 0;
+#X connect 13 0 1 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 15 1 12 0;
+#X connect 16 0 15 0;
+#X connect 17 0 0 0;
+#X connect 17 1 14 0;
+#X connect 18 0 17 0;
diff --git a/externals/gridflow/pd_help/@foldinnerouter.pd b/externals/gridflow/pd_help/@foldinnerouter.pd
new file mode 100644
index 00000000..46f2dc6d
--- /dev/null
+++ b/externals/gridflow/pd_help/@foldinnerouter.pd
@@ -0,0 +1,94 @@
+#N canvas 63 0 747 645 10;
+#X obj 18 34 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 18 233 @export;
+#X obj 18 96 @in;
+#X text 18 10 @fold \, @inner \, @outer;
+#X obj 18 264 print value;
+#X obj 18 137 @fold + 0;
+#X obj 18 160 @fold + 0;
+#X obj 18 184 @fold + 0;
+#X text 114 133 treats the grid as a grid of one- dimensional grids
+such that the same operation (here addition) will be performed on all
+its elements together with the base value. the results are combined
+back. each @fold operation removes a dimension. syntax: @fold <two-input
+operation> <starting value>;
+#X obj 19 309 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 171 402 @ * 128;
+#X obj 19 400 spigot;
+#X obj 100 400 spigot;
+#X obj 67 400 == 0;
+#X obj 67 309 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 1 1
+;
+#X obj 19 432 @outer +;
+#X obj 100 431 @outer ^;
+#X obj 100 451 @ * 2;
+#X text 171 448 @outer does the same two-input operation between every
+possible pair of the left-side grid and the right side grid. @inner
+treats both input grids like @fold does \, then does a @outer on the
+other dimensions \, such that every two-input operation is like a @fold.
+this is a very powerful operation that can be used to do rotations
+\, rgb->yuv \, color conversions \, etc.;
+#X text 88 310 select pattern;
+#X text 17 566 combine channelless picture with gamma factors (r \,
+g \, b);
+#X obj 19 379 @import ( 128 );
+#X obj 19 359 until;
+#X msg 19 338 128;
+#X obj 60 359 float 1;
+#X obj 115 359 + 1;
+#X obj 19 525 @outer gamma;
+#X obj 171 360 until;
+#X obj 212 360 float 1;
+#X obj 267 360 + 1;
+#X msg 171 339 4;
+#X obj 171 381 @import ( 3 );
+#X text 665 16 gridflow;
+#X text 19 598 see also:;
+#X obj 87 603 @scan;
+#X obj 129 603 @join;
+#X obj 171 603 @finished;
+#X obj 241 603 @cast;
+#X obj 283 603 @ravel;
+#X obj 331 603 @grade;
+#X obj 380 603 @perspective;
+#X msg 41 76 open bluemarble.jpg;
+#X obj 18 55 fork;
+#X obj 19 547 @out window;
+#X connect 0 0 42 0;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 9 0 23 0;
+#X connect 9 0 30 0;
+#X connect 10 0 26 1;
+#X connect 11 0 15 0;
+#X connect 11 0 15 1;
+#X connect 12 0 16 0;
+#X connect 12 0 16 1;
+#X connect 13 0 12 1;
+#X connect 14 0 11 1;
+#X connect 14 0 13 0;
+#X connect 15 0 26 0;
+#X connect 16 0 17 0;
+#X connect 17 0 26 0;
+#X connect 21 0 11 0;
+#X connect 21 0 12 0;
+#X connect 22 0 24 0;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 24 0 21 0;
+#X connect 25 0 24 1;
+#X connect 26 0 43 0;
+#X connect 27 0 28 0;
+#X connect 28 0 29 0;
+#X connect 28 0 31 0;
+#X connect 29 0 28 1;
+#X connect 30 0 27 0;
+#X connect 31 0 10 0;
+#X connect 41 0 2 0;
+#X connect 42 0 2 0;
+#X connect 42 1 41 0;
diff --git a/externals/gridflow/pd_help/@for.pd b/externals/gridflow/pd_help/@for.pd
new file mode 100644
index 00000000..9a9e1666
--- /dev/null
+++ b/externals/gridflow/pd_help/@for.pd
@@ -0,0 +1,16 @@
+#N canvas 923 183 569 289 10;
+#X text 14 15 @for;
+#X obj 20 136 @for 0 320 1;
+#X floatatom 20 73 5 0 0 0 - - -;
+#X floatatom 59 94 5 0 0 0 - - -;
+#X floatatom 99 116 5 0 0 0 - - -;
+#X text 137 141 works like a for object \, plugged to an @import tuned
+for a dim(size) where size is the number of values produced by a bang
+to that for. syntax: @for <from> <to> <step> outlet: grid dim(size)
+where size = floor(to-from+1)/step;
+#X obj 20 199 @print;
+#X text 490 16 gridflow;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 1;
+#X connect 4 0 1 2;
diff --git a/externals/gridflow/pd_help/@global.pd b/externals/gridflow/pd_help/@global.pd
new file mode 100644
index 00000000..3031ff5f
--- /dev/null
+++ b/externals/gridflow/pd_help/@global.pd
@@ -0,0 +1,9 @@
+#N canvas 923 183 400 205 10;
+#X text 21 22 @global;
+#X text 22 53 dummy object for controlling the profiler;
+#X obj 24 146 @global;
+#X msg 48 95 profiler_reset;
+#X msg 59 115 profiler_dump;
+#X text 321 18 gridflow;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
diff --git a/externals/gridflow/pd_help/@grade.pd b/externals/gridflow/pd_help/@grade.pd
new file mode 100644
index 00000000..e7873d77
--- /dev/null
+++ b/externals/gridflow/pd_help/@grade.pd
@@ -0,0 +1,20 @@
+#N canvas 435 101 649 221 10;
+#X text 143 15 splits a dim[a... \, b] grid into dim[b] vectors that
+each contain numbers from 0 to b-1 indicating the ordering of the values.
+the result is a dim[a... \, b] grid.;
+#X text 14 15 @grade;
+#X obj 19 139 @grade;
+#X floatatom 19 74 5 0 0 0 - - -;
+#X floatatom 60 74 5 0 0 0 - - -;
+#X obj 19 168 @print;
+#X obj 19 106 @four;
+#X floatatom 101 74 5 0 0 0 - - -;
+#X floatatom 142 74 5 0 0 0 - - -;
+#X text 585 14 gridflow;
+#X text 146 175 (behaves unstable in 0.7.0);
+#X connect 2 0 5 0;
+#X connect 3 0 6 0;
+#X connect 4 0 6 1;
+#X connect 6 0 2 0;
+#X connect 7 0 6 2;
+#X connect 8 0 6 3;
diff --git a/externals/gridflow/pd_help/@greyscale_to_rgb.pd b/externals/gridflow/pd_help/@greyscale_to_rgb.pd
new file mode 100644
index 00000000..106126b1
--- /dev/null
+++ b/externals/gridflow/pd_help/@greyscale_to_rgb.pd
@@ -0,0 +1,21 @@
+#N canvas 119 122 433 374 10;
+#X obj 15 33 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 19 105 @in;
+#X obj 19 141 @rgb_to_greyscale;
+#X obj 19 161 s xx;
+#X obj 19 185 r xx;
+#X obj 19 205 @greyscale_to_rgb;
+#X text 24 5 @greyscale_to_rgb;
+#X text 353 13 gridflow;
+#X msg 42 78 open bluemarble.jpg;
+#X obj 19 55 fork;
+#X obj 19 263 @out window;
+#X connect 0 0 9 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 0;
+#X connect 5 0 10 0;
+#X connect 8 0 1 0;
+#X connect 9 0 1 0;
+#X connect 9 1 8 0;
diff --git a/externals/gridflow/pd_help/@importexport.pd b/externals/gridflow/pd_help/@importexport.pd
new file mode 100644
index 00000000..454d7149
--- /dev/null
+++ b/externals/gridflow/pd_help/@importexport.pd
@@ -0,0 +1,51 @@
+#N canvas 119 230 748 467 10;
+#X msg 75 125 reset;
+#X obj 33 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X msg 33 111 200;
+#X text 125 129 abort output of grid \, if any;
+#X text 14 9 @import \, @export \, @export_list converts integers to
+grids and back;
+#X obj 41 239 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 33 283 @dim;
+#X obj 322 335 @export_list;
+#X obj 322 366 print export_list;
+#X obj 33 335 @export;
+#X obj 33 366 print export;
+#X obj 33 176 @out 240 320;
+#X obj 33 260 @in;
+#X text 70 285 gets the size of the picture;
+#X text 87 334 accepts grids and sends integers;
+#X text 416 328 accepts grids and sends lists of integers;
+#X obj 33 88 until;
+#X msg 33 67 230400;
+#X obj 33 157 @import ( 240 320 3 );
+#X text 188 158 syntax: @import ( <int colums> <int rows> <int dimension>
+);
+#X text 32 418 see also:;
+#X obj 162 421 @two;
+#X obj 196 421 @three;
+#X obj 244 421 @four;
+#X text 671 16 gridflow;
+#X obj 101 421 @in;
+#X obj 128 421 @out;
+#X obj 33 301 s size;
+#X obj 33 319 r size;
+#X obj 322 315 r size;
+#X msg 33 216 open jpeg file 1.jpg;
+#X connect 0 0 18 0;
+#X connect 1 0 17 0;
+#X connect 2 0 18 0;
+#X connect 5 0 12 0;
+#X connect 6 0 27 0;
+#X connect 7 0 8 0;
+#X connect 9 0 10 0;
+#X connect 12 0 6 0;
+#X connect 16 0 2 0;
+#X connect 17 0 16 0;
+#X connect 18 0 11 0;
+#X connect 28 0 9 0;
+#X connect 29 0 7 0;
+#X connect 30 0 12 0;
+#X connect 30 0 5 0;
diff --git a/externals/gridflow/pd_help/@inner2.pd b/externals/gridflow/pd_help/@inner2.pd
new file mode 100644
index 00000000..34cb3ad1
--- /dev/null
+++ b/externals/gridflow/pd_help/@inner2.pd
@@ -0,0 +1,17 @@
+#N canvas 63 0 748 632 10;
+#X obj 18 49 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 18 125 @in;
+#X text 14 15 @inner;
+#X obj 18 169 @inner2 * + 0;
+#X text 660 16 gridflow;
+#X text 178 172 this has yet to be done!;
+#X obj 18 307 @out window;
+#X msg 41 95 open bluemarble.jpg;
+#X obj 18 70 fork;
+#X connect 0 0 8 0;
+#X connect 1 0 3 0;
+#X connect 3 0 6 0;
+#X connect 7 0 1 0;
+#X connect 8 0 1 0;
+#X connect 8 1 7 0;
diff --git a/externals/gridflow/pd_help/@inout.pd b/externals/gridflow/pd_help/@inout.pd
new file mode 100644
index 00000000..fdf1e8b0
--- /dev/null
+++ b/externals/gridflow/pd_help/@inout.pd
@@ -0,0 +1,63 @@
+#N canvas 281 197 649 652 10;
+#X obj 35 213 @in;
+#X msg 52 283 option timelog \$1;
+#X obj 52 263 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 0 1
+;
+#X text 274 307 upload a grid;
+#X text 261 80 upload a grid;
+#X text 194 108 open default display for screenshot;
+#X msg 73 134 open videodev /dev/video0;
+#X text 260 136 open a video device;
+#X msg 75 332 open x11 here;
+#X msg 87 356 open x11 local 10;
+#X text 182 285 show/hide timing statistics;
+#X text 178 334 connect to default display;
+#X text 218 358 connect to display #10 on this machine;
+#X msg 100 380 open x11 remote.host.bla.net 0;
+#X text 324 382 connect to remote machine on display #0;
+#X text 290 161 open mpeg video stream;
+#X obj 35 441 @out;
+#X text 14 15 @in \, @out communicating grids (pictures) to/from devices
+\, sockets \, files;
+#X text 272 155 *;
+#X text 36 558 * path is where you started pd from. usually $home.
+;
+#X text 308 188 open an image file;
+#X msg 114 450 close;
+#X text 577 15 gridflow;
+#X text 37 590 see also:;
+#X obj 108 595 @import ( 1 );
+#X obj 205 595 @export;
+#X obj 260 595 @export_list;
+#X obj 350 595 @export_symbol;
+#X obj 454 595 @two;
+#X obj 488 595 @three;
+#X obj 536 595 @four;
+#X msg 90 161 open lsd.mpeg;
+#X msg 55 107 open x11 here;
+#X msg 35 80 open host.bla.net 7777;
+#X msg 113 404 open img/bla.jpg;
+#X text 300 405 open single file in jpg format;
+#X msg 108 186 open ./img/bla.jpg;
+#X text 35 481 incoming file is sent through the opened device/socket/file.
+in single file formats subsequent pictures overwrite the preceeding
+one. there are many more options. for more information see the reference
+manual in the "formats" and "objects for input/output" sections.;
+#X msg 65 307 open x.test.at 7777;
+#X msg 125 426 open window;
+#X text 228 426 opens a window x11 \, quartz or sdl;
+#X connect 0 0 16 0;
+#X connect 1 0 16 0;
+#X connect 2 0 1 0;
+#X connect 6 0 0 0;
+#X connect 8 0 16 0;
+#X connect 9 0 16 0;
+#X connect 13 0 16 0;
+#X connect 21 0 16 0;
+#X connect 31 0 0 0;
+#X connect 32 0 0 0;
+#X connect 33 0 0 0;
+#X connect 34 0 16 0;
+#X connect 36 0 0 0;
+#X connect 38 0 16 0;
+#X connect 39 0 16 0;
diff --git a/externals/gridflow/pd_help/@join.pd b/externals/gridflow/pd_help/@join.pd
new file mode 100644
index 00000000..3a8f3cdc
--- /dev/null
+++ b/externals/gridflow/pd_help/@join.pd
@@ -0,0 +1,42 @@
+#N canvas 297 501 659 362 10;
+#X obj 18 32 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 18 96 @in;
+#X obj 211 30 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 211 96 @in;
+#X obj 237 96 @rgb_to_greyscale;
+#X obj 18 161 @join 2;
+#X text 16 8 @join;
+#X text 204 238 the left grid and right grid must have the same number
+of elements in all dimensions except the one specified \, which will
+be the sum of the two corresponding;
+#X obj 18 208 @perspective;
+#X text 563 10 gridflow;
+#X text 17 306 see also:;
+#X obj 86 310 @fold +;
+#X obj 142 310 @scan +;
+#X obj 18 269 @out window;
+#X text 205 170 creation argument is the number of the dimensions by
+which the join will occur. for n-dimensional grids \, the dimensions
+are numbered from 0 to n-1. in addition \, negative numbers from -n
+to -1 may be used \, to which n will be added.;
+#X msg 41 73 open r001.jpg;
+#X msg 234 69 open b001.jpg;
+#X obj 18 53 fork;
+#X obj 211 48 fork;
+#X text 244 29 1 <--;
+#X text 45 31 2 <--;
+#X connect 0 0 17 0;
+#X connect 1 0 5 0;
+#X connect 2 0 18 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 1;
+#X connect 5 0 8 0;
+#X connect 8 0 13 0;
+#X connect 15 0 1 0;
+#X connect 16 0 3 0;
+#X connect 17 0 1 0;
+#X connect 17 1 15 0;
+#X connect 18 0 3 0;
+#X connect 18 1 16 0;
diff --git a/externals/gridflow/pd_help/@layer.pd b/externals/gridflow/pd_help/@layer.pd
new file mode 100644
index 00000000..98a68acd
--- /dev/null
+++ b/externals/gridflow/pd_help/@layer.pd
@@ -0,0 +1,46 @@
+#N canvas 297 501 656 323 10;
+#X obj 18 29 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 18 96 @in;
+#X obj 211 28 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 211 96 @in;
+#X obj 237 96 @rgb_to_greyscale;
+#X text 14 5 @layer;
+#X obj 18 208 @layer;
+#X obj 18 161 @join -1;
+#X obj 406 29 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 406 96 @in;
+#X text 208 121 opacity channel file;
+#X text 51 95 foreground file;
+#X text 438 96 background file;
+#X text 579 14 gridflow;
+#X obj 18 269 @out window;
+#X text 206 209 a picture that has an opacity level will be used as
+foreground vs a picture that has no opacity channel. the output is
+a picture that has no opacity channel;
+#X msg 41 72 open r001.jpg;
+#X msg 234 69 open b001.jpg;
+#X msg 429 71 open g001.jpg;
+#X obj 18 50 fork;
+#X obj 211 47 fork;
+#X obj 406 50 fork;
+#X connect 0 0 19 0;
+#X connect 1 0 7 0;
+#X connect 2 0 20 0;
+#X connect 3 0 4 0;
+#X connect 4 0 7 1;
+#X connect 6 0 14 0;
+#X connect 7 0 6 0;
+#X connect 8 0 21 0;
+#X connect 9 0 6 1;
+#X connect 16 0 1 0;
+#X connect 17 0 3 0;
+#X connect 18 0 9 0;
+#X connect 19 0 1 0;
+#X connect 19 1 16 0;
+#X connect 20 0 3 0;
+#X connect 20 1 17 0;
+#X connect 21 0 9 0;
+#X connect 21 1 18 0;
diff --git a/externals/gridflow/pd_help/@perspective.pd b/externals/gridflow/pd_help/@perspective.pd
new file mode 100644
index 00000000..db145d54
--- /dev/null
+++ b/externals/gridflow/pd_help/@perspective.pd
@@ -0,0 +1,29 @@
+#N canvas 280 56 664 282 10;
+#X text 403 215 see also:;
+#X obj 477 214 @redim;
+#X obj 259 173 @perspective;
+#X obj 20 147 @three;
+#X obj 530 214 @ravel;
+#X obj 20 125 random 10;
+#X obj 87 125 random 10;
+#X obj 155 125 random 10;
+#X obj 20 86 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 587 12 gridflow;
+#X text 14 15 @perspective;
+#X obj 20 210 @print;
+#X obj 259 210 @print;
+#X text 143 15 transforms a dim[a... \, b] grid into a dim[a... \,
+b-1] grid. there is a projection plane perpendicular to the last axis
+and whose position is given by the creation argument. each vector's
+length is adjusted so that it lies onto that plane. then the last dimension
+of each vector is dropped;
+#X connect 2 0 12 0;
+#X connect 3 0 2 0;
+#X connect 3 0 11 0;
+#X connect 5 0 3 0;
+#X connect 6 0 3 1;
+#X connect 7 0 3 2;
+#X connect 8 0 5 0;
+#X connect 8 0 6 0;
+#X connect 8 0 7 0;
diff --git a/externals/gridflow/pd_help/@posterize.pd b/externals/gridflow/pd_help/@posterize.pd
new file mode 100644
index 00000000..e10e42ba
--- /dev/null
+++ b/externals/gridflow/pd_help/@posterize.pd
@@ -0,0 +1,36 @@
+#N canvas 432 100 640 338 10;
+#X obj 20 32 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 20 100 @in;
+#X obj 19 174 @posterize;
+#X text 16 7 @posterize;
+#X floatatom 84 131 5 2 255 0 - - -;
+#X obj 84 147 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 19 127 @store;
+#X text 132 131 2 - 255;
+#X text 157 157 number of possible levels per channel. the levels are
+equally spaced \, with the lowest at 0 and the highest at 255 the minimum
+number of levels is 2 and the default value is also 2;
+#X text 572 6 gridflow;
+#X text 210 300 see also:;
+#X obj 281 304 @convolve;
+#X obj 419 304 @solarize;
+#X obj 488 304 @layer;
+#X obj 350 304 @contrast;
+#X obj 20 59 fork;
+#X msg 43 79 open bluemarble.jpg;
+#X obj 19 303 @out window;
+#X text 98 7 reduces the number of possible intensities in an image:
+it rounds the color values. the effect is mostly apparent with a low
+number of levels;
+#X connect 0 0 15 0;
+#X connect 1 0 6 1;
+#X connect 2 0 17 0;
+#X connect 4 0 2 1;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 2 0;
+#X connect 15 0 1 0;
+#X connect 15 1 16 0;
+#X connect 16 0 1 0;
diff --git a/externals/gridflow/pd_help/@print.pd b/externals/gridflow/pd_help/@print.pd
new file mode 100644
index 00000000..1537faab
--- /dev/null
+++ b/externals/gridflow/pd_help/@print.pd
@@ -0,0 +1,28 @@
+#N canvas 435 101 688 277 10;
+#X text 191 203 see also:;
+#X obj 297 208 @export;
+#X obj 352 208 @export_list;
+#X obj 442 208 rubyprint;
+#X obj 19 123 @three;
+#X floatatom 19 73 5 0 0 0 - - -;
+#X floatatom 37 52 5 0 0 0 - - -;
+#X floatatom 56 73 5 0 0 0 - - -;
+#X obj 19 197 @print;
+#X text 14 15 @print;
+#X text 143 15 prints grids dimensions or all the grid data if there
+are 2 dimensions or less.;
+#X obj 112 123 @import ( 3 3 3 );
+#X obj 113 73 until;
+#X msg 113 53 27;
+#X obj 112 93 random 27;
+#X text 619 13 gridflow;
+#X obj 262 208 @dim;
+#X obj 512 208 printargs;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 1;
+#X connect 7 0 4 2;
+#X connect 11 0 8 0;
+#X connect 12 0 14 0;
+#X connect 13 0 12 0;
+#X connect 14 0 11 0;
diff --git a/externals/gridflow/pd_help/@ravel.pd b/externals/gridflow/pd_help/@ravel.pd
new file mode 100644
index 00000000..65bcad40
--- /dev/null
+++ b/externals/gridflow/pd_help/@ravel.pd
@@ -0,0 +1,31 @@
+#N canvas 435 101 660 279 10;
+#X text 14 15 @ravel;
+#X text 143 15 like @redim but always produces a 1-D grid with the
+same total number of elements.;
+#X obj 20 102 @in;
+#X obj 20 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 20 168 @dim;
+#X obj 20 190 @export_list;
+#X obj 20 211 print before;
+#X obj 140 129 @ravel;
+#X obj 259 170 @dim;
+#X obj 259 192 @export_list;
+#X obj 259 213 print after;
+#X text 403 215 see also:;
+#X obj 567 214 @perspective;
+#X text 575 14 gridflow;
+#X obj 477 214 @redim ( 1 );
+#X msg 43 81 open bluemarble.jpg;
+#X obj 20 60 fork;
+#X connect 2 0 4 0;
+#X connect 2 0 7 0;
+#X connect 3 0 16 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 15 0 2 0;
+#X connect 16 0 2 0;
+#X connect 16 1 15 0;
diff --git a/externals/gridflow/pd_help/@redim.pd b/externals/gridflow/pd_help/@redim.pd
new file mode 100644
index 00000000..69e47169
--- /dev/null
+++ b/externals/gridflow/pd_help/@redim.pd
@@ -0,0 +1,21 @@
+#N canvas 435 101 633 282 10;
+#X text 15 8 @redim;
+#X text 114 14 rearrange a grid's values according to new dimensions
+;
+#X obj 25 99 @in;
+#X obj 25 32 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 25 132 @redim ( 120 120 3 );
+#X text 287 192 see also:;
+#X obj 367 195 @ravel;
+#X obj 418 195 @perspective;
+#X text 551 13 gridflow;
+#X msg 48 77 open bluemarble.jpg;
+#X obj 25 55 fork;
+#X obj 25 187 @out window;
+#X connect 2 0 4 0;
+#X connect 3 0 10 0;
+#X connect 4 0 11 0;
+#X connect 9 0 2 0;
+#X connect 10 0 2 0;
+#X connect 10 1 9 0;
diff --git a/externals/gridflow/pd_help/@rgb_to_greyscale.pd b/externals/gridflow/pd_help/@rgb_to_greyscale.pd
new file mode 100644
index 00000000..c905d183
--- /dev/null
+++ b/externals/gridflow/pd_help/@rgb_to_greyscale.pd
@@ -0,0 +1,19 @@
+#N canvas 119 122 514 375 10;
+#X obj 19 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 19 100 @in;
+#X obj 19 132 @rgb_to_greyscale;
+#X text 14 15 @rgb_to_greyscale;
+#X obj 19 152 s xx;
+#X obj 18 215 r xx;
+#X obj 18 235 @greyscale_to_rgb;
+#X text 444 11 gridflow;
+#X obj 18 329 @out window;
+#X msg 44 72 open r001.jpg;
+#X connect 0 0 9 0;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 5 0 6 0;
+#X connect 6 0 8 0;
+#X connect 9 0 1 0;
diff --git a/externals/gridflow/pd_help/@scale_by.pd b/externals/gridflow/pd_help/@scale_by.pd
new file mode 100644
index 00000000..fa73b249
--- /dev/null
+++ b/externals/gridflow/pd_help/@scale_by.pd
@@ -0,0 +1,30 @@
+#N canvas 614 643 589 398 10;
+#X obj 113 29 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 113 101 @in;
+#X obj 20 72 metro 10;
+#X obj 20 49 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 1 1
+;
+#X text 26 359 see also:;
+#X text 14 15 @scale_by;
+#X obj 102 358 @scale_to;
+#X obj 113 157 @scale_by;
+#X floatatom 172 116 5 0 0 0 - - -;
+#X text 518 16 gridflow;
+#X obj 172 358 @downscale_by;
+#X obj 172 136 @import ( 1 );
+#X text 157 198 identical to scale_to with arguments that are exactly
+twice that of the incoming grid. it's several times faster.;
+#X obj 113 275 @out window;
+#X msg 136 71 open bluemarble.jpg;
+#X obj 113 50 fork;
+#X connect 0 0 15 0;
+#X connect 1 0 7 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 7 0 13 0;
+#X connect 8 0 11 0;
+#X connect 11 0 7 1;
+#X connect 14 0 1 0;
+#X connect 15 0 1 0;
+#X connect 15 1 14 0;
diff --git a/externals/gridflow/pd_help/@scale_to.pd b/externals/gridflow/pd_help/@scale_to.pd
new file mode 100644
index 00000000..432e223f
--- /dev/null
+++ b/externals/gridflow/pd_help/@scale_to.pd
@@ -0,0 +1,34 @@
+#N canvas 497 180 649 321 10;
+#X obj 113 26 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 113 101 @in;
+#X text 14 15 @scale_to;
+#X obj 20 49 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 1 1
+;
+#X obj 269 157 @two;
+#X obj 310 43 vsl 15 128 0 640 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 3300 1;
+#X obj 333 43 vsl 15 128 0 480 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 6300 1;
+#X obj 352 285 @scale_by;
+#X text 281 281 see also:;
+#X text 190 182 though not pointed out in the manual \, the initial
+arguments seem to be mandatory.;
+#X text 578 11 gridflow;
+#X obj 423 285 @downscale_by;
+#X obj 20 72 metro 100;
+#X obj 113 262 @out window;
+#X msg 135 74 open b001.jpg;
+#X obj 113 51 fork;
+#X obj 113 157 @scale_to ( 133 133 );
+#X connect 0 0 15 0;
+#X connect 1 0 16 0;
+#X connect 3 0 12 0;
+#X connect 4 0 16 1;
+#X connect 5 0 4 0;
+#X connect 6 0 4 1;
+#X connect 12 0 1 0;
+#X connect 14 0 1 0;
+#X connect 15 0 1 0;
+#X connect 15 1 14 0;
+#X connect 16 0 13 0;
diff --git a/externals/gridflow/pd_help/@scan.pd b/externals/gridflow/pd_help/@scan.pd
new file mode 100644
index 00000000..64f62f95
--- /dev/null
+++ b/externals/gridflow/pd_help/@scan.pd
@@ -0,0 +1,26 @@
+#N canvas 140 0 421 309 10;
+#X text 14 15 @scan;
+#X text 69 15 computes subtotals;
+#X obj 17 127 @scan +;
+#X obj 17 96 @three;
+#X floatatom 17 56 5 0 0 0 - - -;
+#X floatatom 62 56 5 0 0 0 - - -;
+#X floatatom 109 56 5 0 0 0 - - -;
+#X floatatom 17 225 5 0 0 0 - - -;
+#X obj 17 186 unpack f f f;
+#X floatatom 56 225 5 0 0 0 - - -;
+#X floatatom 96 225 5 0 0 0 - - -;
+#X obj 17 164 @export_list;
+#X text 73 129 second inlet seems to be dead;
+#X text 340 14 gridflow;
+#X text 14 266 see also:;
+#X obj 83 270 @fold +;
+#X connect 2 0 11 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 1;
+#X connect 6 0 3 2;
+#X connect 8 0 7 0;
+#X connect 8 1 9 0;
+#X connect 8 2 10 0;
+#X connect 11 0 8 0;
diff --git a/externals/gridflow/pd_help/@solarize.pd b/externals/gridflow/pd_help/@solarize.pd
new file mode 100644
index 00000000..60c48b25
--- /dev/null
+++ b/externals/gridflow/pd_help/@solarize.pd
@@ -0,0 +1,25 @@
+#N canvas 432 100 613 339 10;
+#X obj 20 59 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 20 138 @in;
+#X text 16 7 @solarize;
+#X obj 20 174 @solarize;
+#X text 98 7 makes medium intensities brightest. formerly brightest
+colors become darkest \, formerly darkest stays darkest. this filter
+is linear. it's like a 200% contrast \, except that overflows are mirrored
+instead of clipped or wrapped.;
+#X text 545 5 gridflow;
+#X text 202 305 see also:;
+#X obj 273 309 @convolve;
+#X obj 487 309 @layer;
+#X obj 342 309 @contrast;
+#X obj 411 309 @posterize;
+#X obj 20 222 @out window;
+#X msg 43 112 open bluemarble.jpg;
+#X obj 20 83 fork;
+#X connect 0 0 13 0;
+#X connect 1 0 3 0;
+#X connect 3 0 11 0;
+#X connect 12 0 1 0;
+#X connect 13 0 1 0;
+#X connect 13 1 12 0;
diff --git a/externals/gridflow/pd_help/@spread.pd b/externals/gridflow/pd_help/@spread.pd
new file mode 100644
index 00000000..c3c39895
--- /dev/null
+++ b/externals/gridflow/pd_help/@spread.pd
@@ -0,0 +1,64 @@
+#N canvas 265 540 787 472 10;
+#X text 14 15 @spread;
+#X text 129 15 makes noise;
+#X obj 232 159 @in;
+#X obj 232 58 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 232 207 spigot;
+#X obj 278 207 == 0;
+#X obj 275 140 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 0
+1;
+#X obj 310 207 spigot;
+#X obj 310 291 @ min 255;
+#X obj 310 270 @spread 1;
+#X obj 310 312 @ min 0;
+#X floatatom 368 241 5 0 0 0 - - -;
+#X obj 195 269 @store;
+#X obj 20 197 @spread 1;
+#X floatatom 78 163 5 0 0 0 - - -;
+#X obj 20 88 until;
+#X obj 20 51 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X msg 20 69 65536;
+#X obj 61 88 float;
+#X obj 101 88 + 1;
+#X obj 20 129 @import ( 256 256 2 );
+#X text 368 314 we limit here \, because the values might go out of
+range;
+#X text 702 13 gridflow;
+#X obj 195 393 @out window;
+#X obj 310 395 @out window;
+#X msg 255 112 open r001.jpg;
+#X obj 232 87 fork;
+#X obj 149 73 metro 50;
+#X obj 149 51 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 300 141 switch displays \, use this to get an image into the
+@store;
+#X connect 2 0 4 0;
+#X connect 2 0 7 0;
+#X connect 3 0 26 0;
+#X connect 4 0 12 1;
+#X connect 5 0 7 1;
+#X connect 6 0 4 1;
+#X connect 6 0 5 0;
+#X connect 7 0 9 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 0;
+#X connect 10 0 24 0;
+#X connect 11 0 9 1;
+#X connect 12 0 23 0;
+#X connect 13 0 12 0;
+#X connect 14 0 13 1;
+#X connect 15 0 18 0;
+#X connect 16 0 17 0;
+#X connect 17 0 15 0;
+#X connect 18 0 19 0;
+#X connect 18 0 20 0;
+#X connect 19 0 18 1;
+#X connect 20 0 13 0;
+#X connect 25 0 2 0;
+#X connect 26 0 2 0;
+#X connect 26 1 25 0;
+#X connect 27 0 2 0;
+#X connect 28 0 27 0;
diff --git a/externals/gridflow/pd_help/@store.pd b/externals/gridflow/pd_help/@store.pd
new file mode 100644
index 00000000..68dd5a14
--- /dev/null
+++ b/externals/gridflow/pd_help/@store.pd
@@ -0,0 +1,48 @@
+#N canvas 519 121 541 394 10;
+#X text 14 15 @store;
+#X obj 18 118 @two;
+#X floatatom 18 86 5 0 0 0 - - -;
+#X floatatom 63 86 5 0 0 0 - - -;
+#X text 92 15 stores a single grid and can recall parts of it.;
+#X obj 111 136 @export_list;
+#X floatatom 111 184 5 0 0 0 - - -;
+#X obj 73 221 @redim ( 1 2 );
+#X obj 73 266 @store;
+#X obj 73 307 @export_list;
+#X obj 294 119 @in;
+#X obj 294 45 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 73 326 unpack f f f;
+#X floatatom 73 351 5 0 0 0 - - -;
+#X text 56 352 R:;
+#X floatatom 134 351 5 0 0 0 - - -;
+#X floatatom 194 351 5 0 0 0 - - -;
+#X text 117 352 G:;
+#X text 178 352 B:;
+#X text 130 262 this example allows you to select a single pixel from
+the loaded picture and view its rgb value.;
+#X obj 111 155 unpack;
+#X floatatom 164 185 5 0 0 0 - - -;
+#X text 92 185 X:;
+#X text 149 186 Y:;
+#X text 478 14 gridflow;
+#X msg 317 92 open r001.jpg;
+#X obj 294 70 fork;
+#X connect 1 0 5 0;
+#X connect 1 0 7 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 1;
+#X connect 5 0 20 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 12 0;
+#X connect 10 0 8 1;
+#X connect 11 0 26 0;
+#X connect 12 0 13 0;
+#X connect 12 1 15 0;
+#X connect 12 2 16 0;
+#X connect 20 0 6 0;
+#X connect 20 1 21 0;
+#X connect 25 0 10 0;
+#X connect 26 0 10 0;
+#X connect 26 1 25 0;
diff --git a/externals/gridflow/pd_help/@twothreefour.pd b/externals/gridflow/pd_help/@twothreefour.pd
new file mode 100644
index 00000000..fa57a796
--- /dev/null
+++ b/externals/gridflow/pd_help/@twothreefour.pd
@@ -0,0 +1,70 @@
+#N canvas 573 90 733 417 10;
+#X text 14 15 @two \, @three \, @four;
+#X text 173 16 hold 2 \, 3 or 4 values \, defaulting to all zeroes.
+each time one is changed (by sending an integer in that inlet) \, a
+dim(n) grid is sent through the inlet.;
+#X floatatom 20 95 5 0 0 0 - - -;
+#X floatatom 62 95 5 0 0 0 - - -;
+#X obj 20 129 @two;
+#X floatatom 113 95 5 0 0 0 - - -;
+#X floatatom 155 95 5 0 0 0 - - -;
+#X obj 113 129 @three;
+#X floatatom 197 95 5 0 0 0 - - -;
+#X floatatom 249 96 5 0 0 0 - - -;
+#X floatatom 291 96 5 0 0 0 - - -;
+#X floatatom 333 96 5 0 0 0 - - -;
+#X obj 249 130 @four;
+#X floatatom 376 96 5 0 0 0 - - -;
+#X obj 22 294 @export_list;
+#X obj 20 152 s _2;
+#X obj 113 152 s _3;
+#X obj 249 152 s _4;
+#X obj 22 272 r _2;
+#X obj 55 272 r _3;
+#X obj 88 272 r _4;
+#X floatatom 22 346 5 0 0 0 - - -;
+#X obj 165 295 @fold +;
+#X obj 165 273 r _2;
+#X obj 198 273 r _3;
+#X obj 231 273 r _4;
+#X obj 165 315 @export;
+#X obj 165 336 print sum;
+#X obj 309 273 r _2;
+#X obj 342 273 r _3;
+#X obj 375 273 r _4;
+#X obj 309 296 @export;
+#X obj 309 317 print;
+#X text 19 381 see also:;
+#X obj 149 385 @import ( 1 );
+#X obj 279 385 @export;
+#X obj 334 385 @export_list;
+#X obj 424 385 @export_symbol;
+#X text 658 16 gridflow;
+#X obj 245 385 @dim;
+#X obj 88 385 @in;
+#X obj 115 385 @for;
+#X connect 2 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 15 0;
+#X connect 5 0 7 0;
+#X connect 6 0 7 1;
+#X connect 7 0 16 0;
+#X connect 8 0 7 2;
+#X connect 9 0 12 0;
+#X connect 10 0 12 1;
+#X connect 11 0 12 2;
+#X connect 12 0 17 0;
+#X connect 13 0 12 3;
+#X connect 14 0 21 0;
+#X connect 18 0 14 0;
+#X connect 19 0 14 0;
+#X connect 20 0 14 0;
+#X connect 22 0 26 0;
+#X connect 23 0 22 0;
+#X connect 24 0 22 0;
+#X connect 25 0 22 0;
+#X connect 26 0 27 0;
+#X connect 28 0 31 0;
+#X connect 29 0 31 0;
+#X connect 30 0 31 0;
+#X connect 31 0 32 0;
diff --git a/externals/gridflow/pd_help/help_count.pd b/externals/gridflow/pd_help/help_count.pd
new file mode 100644
index 00000000..9d812919
--- /dev/null
+++ b/externals/gridflow/pd_help/help_count.pd
@@ -0,0 +1,15 @@
+#N canvas 85 117 336 239 10;
+#X obj 65 80 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 65 144 5 0 0 0 - - -;
+#X obj 130 143 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 130 79 42;
+#X obj 65 110 count 0 10;
+#X text 158 78 count limit;
+#X text 26 19 simple counter from a to b in increments of '1'. The
+arguments sets the range.;
+#X connect 0 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 1 0;
+#X connect 4 1 2 0;
diff --git a/externals/gridflow/pd_help/help_fade.pd b/externals/gridflow/pd_help/help_fade.pd
new file mode 100644
index 00000000..e96fb054
--- /dev/null
+++ b/externals/gridflow/pd_help/help_fade.pd
@@ -0,0 +1,19 @@
+#N canvas 68 40 747 435 10;
+#X obj 197 148 @in;
+#X obj 215 114 @camera_control;
+#X obj 95 87 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 197 190 @fade 10;
+#X text 268 184 the creation argument is the number of frames the fade
+occurs over;
+#X obj 251 161 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 122 86 metro 50;
+#X obj 197 240 @out window;
+#X text 514 13 gridflow;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X connect 5 0 3 1;
+#X connect 6 0 0 0;
diff --git a/externals/gridflow/pd_help/help_motion_detect.pd b/externals/gridflow/pd_help/help_motion_detect.pd
new file mode 100644
index 00000000..95e8123a
--- /dev/null
+++ b/externals/gridflow/pd_help/help_motion_detect.pd
@@ -0,0 +1,76 @@
+#N canvas 126 0 350 447 10;
+#X obj 37 24 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 71 539 fps detailed;
+#X obj 71 559 print;
+#X obj 82 254 @motion_detection;
+#X floatatom 261 298 5 0 0 0 - displaced_numb -;
+#X obj 112 79 @camera_control;
+#X obj 71 116 @in;
+#X obj 261 272 tgl 15 0 displaced empty empty 0 0 128 4 -233017 -62784
+-233017 0 1;
+#X text 283 271 <-- toggle displaced pixels on/off;
+#X text 229 78 <-- select and initialise the type of camera first;
+#X obj 264 246 hsl 128 15 0 30 0 0 noise empty noise_reduction 10 6
+128 12 -233017 -1 -62784 0 0;
+#X text 312 299 <-- total number of displaced pixels (divided by 100000)
+;
+#X obj 261 220 tgl 15 0 snapshot empty empty 0 0 128 4 -233017 -258699
+-260818 0 1;
+#X text 284 219 <-- compare incoming images/ take a snapshot;
+#X obj 82 358 @centroid;
+#X obj 37 45 metro 50;
+#X obj 71 143 fork;
+#X obj 71 231 demux 2;
+#X obj 71 333 demux 2;
+#X obj 71 441 demux 2;
+#X obj 115 210 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 115 313 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 115 421 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 71 518 @out window;
+#N canvas 0 0 450 300 pixelate 0;
+#X obj 55 92 @downscale_by ( 15 20 ) smoothly;
+#X obj 55 118 @scale_by ( 32 32 );
+#X obj 42 40 inlet;
+#X obj 39 168 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 0;
+#X restore 82 464 pd pixelate;
+#N canvas 0 0 450 300 get_image_size 0;
+#X obj 39 70 @dim;
+#X obj 39 116 @export_list;
+#X obj 39 139 s size;
+#X obj 39 92 @inner * + 0 ( 3 2 # 1 0 0 1 0 0 );
+#X obj 30 28 inlet;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X restore 94 169 pd get_image_size;
+#X text 226 169 <-- necessary for centroid;
+#X text 208 357 <-- finds the centre of the displaced pixels;
+#X text 169 463 <-- make the image into 15 x 20 squares;
+#X connect 0 0 15 0;
+#X connect 1 0 2 0;
+#X connect 3 0 18 0;
+#X connect 5 0 6 0;
+#X connect 6 0 16 0;
+#X connect 14 0 19 0;
+#X connect 15 0 6 0;
+#X connect 16 0 17 0;
+#X connect 16 1 25 0;
+#X connect 17 0 18 0;
+#X connect 17 1 3 0;
+#X connect 18 0 19 0;
+#X connect 18 1 14 0;
+#X connect 19 0 23 0;
+#X connect 19 1 24 0;
+#X connect 20 0 17 1;
+#X connect 21 0 18 1;
+#X connect 22 0 19 1;
+#X connect 23 0 1 0;
+#X connect 24 0 23 0;
diff --git a/externals/gridflow/pd_help/help_mouse.pd b/externals/gridflow/pd_help/help_mouse.pd
new file mode 100644
index 00000000..3b5dc0a5
--- /dev/null
+++ b/externals/gridflow/pd_help/help_mouse.pd
@@ -0,0 +1,55 @@
+#N canvas 215 0 510 490 10;
+#X msg 147 123 option setcursor 32;
+#X text 49 22 How to get the mouse coordinates and hide / change the
+cursor?;
+#X msg 128 100 option hidecursor;
+#X text 273 98 <-- removes the cursor;
+#X text 307 120 <-- accepts 0 - 63;
+#X obj 206 168 print xy_clicked;
+#X obj 110 165 @out window;
+#X obj 207 214 print xy_unclicked;
+#X obj 107 341 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 127 341 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 147 341 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X floatatom 178 359 5 0 0 0 - - -;
+#X obj 178 333 +;
+#X obj 210 333 t a;
+#X obj 207 238 print xy_moved;
+#X obj 206 190 print xy_dragged;
+#X obj 110 267 @mouse \, ...;
+#X obj 380 376 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 400 376 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 420 376 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 380 402 @three;
+#X obj 380 431 @export_list;
+#X obj 440 352 loadbang;
+#X text 281 332 select buttons to be considered in click/drag/unclick
+;
+#X connect 0 0 6 0;
+#X connect 2 0 6 0;
+#X connect 6 0 16 0;
+#X connect 12 0 13 0;
+#X connect 12 0 11 0;
+#X connect 13 0 12 1;
+#X connect 16 0 5 0;
+#X connect 16 1 15 0;
+#X connect 16 2 7 0;
+#X connect 16 3 14 0;
+#X connect 16 4 8 0;
+#X connect 16 5 9 0;
+#X connect 16 6 10 0;
+#X connect 16 7 12 0;
+#X connect 17 0 20 0;
+#X connect 18 0 20 1;
+#X connect 19 0 20 2;
+#X connect 20 0 21 0;
+#X connect 21 0 16 1;
+#X connect 22 0 17 0;
+#X connect 22 0 18 0;
+#X connect 22 0 19 0;
diff --git a/externals/gridflow/pd_help/printargs.pd b/externals/gridflow/pd_help/printargs.pd
new file mode 100644
index 00000000..39ada19e
--- /dev/null
+++ b/externals/gridflow/pd_help/printargs.pd
@@ -0,0 +1,10 @@
+#N canvas 435 101 688 277 10;
+#X text 191 203 see also:;
+#X obj 297 208 @export;
+#X text 619 13 gridflow;
+#X obj 262 208 @dim;
+#X obj 352 208 @print;
+#X text 14 15 printargs;
+#X text 144 14 prints everything;
+#X obj 401 208 rubyprint;
+#X obj 17 101 printargs lallala;
diff --git a/externals/gridflow/pd_help/rubyprint.pd b/externals/gridflow/pd_help/rubyprint.pd
new file mode 100644
index 00000000..2cdc5e56
--- /dev/null
+++ b/externals/gridflow/pd_help/rubyprint.pd
@@ -0,0 +1,26 @@
+#N canvas 435 101 688 277 10;
+#X text 191 203 see also:;
+#X obj 297 208 @export;
+#X obj 19 123 @three;
+#X floatatom 19 73 5 0 0 0 - - -;
+#X floatatom 37 52 5 0 0 0 - - -;
+#X floatatom 56 73 5 0 0 0 - - -;
+#X obj 112 123 @import ( 3 3 3 );
+#X obj 113 73 until;
+#X msg 113 53 27;
+#X obj 112 93 random 27;
+#X text 619 13 gridflow;
+#X obj 262 208 @dim;
+#X obj 401 208 printargs;
+#X text 14 15 rubyprint;
+#X obj 352 208 @print;
+#X obj 19 197 rubyprint;
+#X text 144 15 prints the message to the console;
+#X connect 2 0 15 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 1;
+#X connect 5 0 2 2;
+#X connect 6 0 15 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 6 0;