aboutsummaryrefslogtreecommitdiff
path: root/externals/gridflow/pd_help
diff options
context:
space:
mode:
Diffstat (limited to 'externals/gridflow/pd_help')
-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
40 files changed, 1492 insertions, 0 deletions
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;