aboutsummaryrefslogtreecommitdiff
path: root/externals/gridflow/doc
diff options
context:
space:
mode:
authorN.N. <matju@users.sourceforge.net>2009-10-18 20:01:19 +0000
committerN.N. <matju@users.sourceforge.net>2009-10-18 20:01:19 +0000
commitccddec68116fc6403858ebfa13d4a7b1aa3d5278 (patch)
tree6b90e41b15bbf2440afa76d53cc436debf5b5c5b /externals/gridflow/doc
parenta1fb215b39535805aa19608185d5e52c0f524b42 (diff)
hi gridflow 0.9.5
svn path=/trunk/; revision=12611
Diffstat (limited to 'externals/gridflow/doc')
-rw-r--r--externals/gridflow/doc/Makefile7
-rw-r--r--externals/gridflow/doc/architecture.html65
-rw-r--r--externals/gridflow/doc/flow_classes/#-help.pd22
-rw-r--r--externals/gridflow/doc/flow_classes/#apply_colormap_channelwise-help.pd61
-rw-r--r--externals/gridflow/doc/flow_classes/#background_model-help.pd43
-rw-r--r--externals/gridflow/doc/flow_classes/#border-help.pd57
-rw-r--r--externals/gridflow/doc/flow_classes/#camera-help.pd53
-rw-r--r--externals/gridflow/doc/flow_classes/#cast-help.pd74
-rw-r--r--externals/gridflow/doc/flow_classes/#checkers-help.pd38
-rw-r--r--externals/gridflow/doc/flow_classes/#clip-help.pd78
-rw-r--r--externals/gridflow/doc/flow_classes/#color-help.pd84
-rw-r--r--externals/gridflow/doc/flow_classes/#contrast-help.pd76
-rw-r--r--externals/gridflow/doc/flow_classes/#convolve-help.pd73
-rw-r--r--externals/gridflow/doc/flow_classes/#dim-help.pd52
-rw-r--r--externals/gridflow/doc/flow_classes/#downscale_by-help.pd61
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_image-help.pd55
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_points-help.pd22
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_polygon-help.pd83
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_slider-help.pd53
-rw-r--r--externals/gridflow/doc/flow_classes/#extract_diagonal-help.pd23
-rw-r--r--externals/gridflow/doc/flow_classes/#fade-help.pd71
-rw-r--r--externals/gridflow/doc/flow_classes/#fastblur-help.pd69
-rw-r--r--externals/gridflow/doc/flow_classes/#fft-help.pd43
-rw-r--r--externals/gridflow/doc/flow_classes/#finished-help.pd15
-rw-r--r--externals/gridflow/doc/flow_classes/#fold-help.pd78
-rw-r--r--externals/gridflow/doc/flow_classes/#for-help.pd96
-rw-r--r--externals/gridflow/doc/flow_classes/#from_pix-help.pd116
-rw-r--r--externals/gridflow/doc/flow_classes/#grade-help.pd20
-rw-r--r--externals/gridflow/doc/flow_classes/#greyscale_to_rgb-help.pd15
-rw-r--r--externals/gridflow/doc/flow_classes/#import-help.pd87
-rw-r--r--externals/gridflow/doc/flow_classes/#in-help.pd226
-rw-r--r--externals/gridflow/doc/flow_classes/#layer-help.pd28
-rw-r--r--externals/gridflow/doc/flow_classes/#line_to_polygon-help.pd12
-rw-r--r--externals/gridflow/doc/flow_classes/#make_cross-help.pd26
-rw-r--r--externals/gridflow/doc/flow_classes/#moment-help.pd131
-rw-r--r--externals/gridflow/doc/flow_classes/#moment_polar-help.pd11
-rw-r--r--externals/gridflow/doc/flow_classes/#motion_detection-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/#mouse-help.pd55
-rw-r--r--externals/gridflow/doc/flow_classes/#numop-help.pd365
-rw-r--r--externals/gridflow/doc/flow_classes/#out-help.pd159
-rw-r--r--externals/gridflow/doc/flow_classes/#outer-help.pd70
-rw-r--r--externals/gridflow/doc/flow_classes/#pack-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/#pack_and_#unpack-help.pd85
-rw-r--r--externals/gridflow/doc/flow_classes/#perspective-help.pd26
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_comparator-help.pd69
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_each_edge-help.pd12
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_radial_map-help.pd42
-rw-r--r--externals/gridflow/doc/flow_classes/#posterize-help.pd36
-rw-r--r--externals/gridflow/doc/flow_classes/#print-help.pd81
-rw-r--r--externals/gridflow/doc/flow_classes/#ravel-help.pd31
-rw-r--r--externals/gridflow/doc/flow_classes/#record-help.pd68
-rw-r--r--externals/gridflow/doc/flow_classes/#redim-help.pd65
-rw-r--r--externals/gridflow/doc/flow_classes/#remap_image-help.pd70
-rw-r--r--externals/gridflow/doc/flow_classes/#reverse-help.pd46
-rw-r--r--externals/gridflow/doc/flow_classes/#rgb_to_greyscale-help.pd40
-rw-r--r--externals/gridflow/doc/flow_classes/#rgb_to_yuv-help.pd42
-rw-r--r--externals/gridflow/doc/flow_classes/#rgb_to_yuv_and_#yuv_to_rgb-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/#rotate-help.pd64
-rw-r--r--externals/gridflow/doc/flow_classes/#saturation-help.pd60
-rw-r--r--externals/gridflow/doc/flow_classes/#scale_by-help.pd59
-rw-r--r--externals/gridflow/doc/flow_classes/#scale_to-help.pd78
-rw-r--r--externals/gridflow/doc/flow_classes/#scan-help.pd24
-rw-r--r--externals/gridflow/doc/flow_classes/#seq_fold-help.pd19
-rw-r--r--externals/gridflow/doc/flow_classes/#slice-help.pd18
-rw-r--r--externals/gridflow/doc/flow_classes/#solarize-help.pd25
-rw-r--r--externals/gridflow/doc/flow_classes/#sort-help.pd25
-rw-r--r--externals/gridflow/doc/flow_classes/#spread-help.pd57
-rw-r--r--externals/gridflow/doc/flow_classes/#store-help.pd85
-rw-r--r--externals/gridflow/doc/flow_classes/#t-help.pd75
-rw-r--r--externals/gridflow/doc/flow_classes/#to_float-help.pd39
-rw-r--r--externals/gridflow/doc/flow_classes/#to_list-help.pd42
-rw-r--r--externals/gridflow/doc/flow_classes/#to_pix-help.pd126
-rw-r--r--externals/gridflow/doc/flow_classes/#to_symbol-help.pd46
-rw-r--r--externals/gridflow/doc/flow_classes/#unpack-#pack-help.pd45
-rw-r--r--externals/gridflow/doc/flow_classes/#unpack-help.pd40
-rw-r--r--externals/gridflow/doc/flow_classes/0x40complex_sq-help.pd28
-rw-r--r--externals/gridflow/doc/flow_classes/0x40join-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/args-demo.pd28
-rw-r--r--externals/gridflow/doc/flow_classes/args-help.pd51
-rw-r--r--externals/gridflow/doc/flow_classes/ascii-help.pd30
-rw-r--r--externals/gridflow/doc/flow_classes/condition-help.pd16
-rw-r--r--externals/gridflow/doc/flow_classes/count-help.pd15
-rw-r--r--externals/gridflow/doc/flow_classes/cv.KMeans-help.pd21
-rw-r--r--externals/gridflow/doc/flow_classes/cv.Kalman-help.pd25
-rw-r--r--externals/gridflow/doc/flow_classes/cv.numop-help.pd45
-rw-r--r--externals/gridflow/doc/flow_classes/display-help.pd30
-rw-r--r--externals/gridflow/doc/flow_classes/exec-help.pd40
-rw-r--r--externals/gridflow/doc/flow_classes/for-help.pd9
-rw-r--r--externals/gridflow/doc/flow_classes/gf.oneshot-help.pd51
-rw-r--r--externals/gridflow/doc/flow_classes/gridflow-help.pd11
-rw-r--r--externals/gridflow/doc/flow_classes/hpgl_font_render-help.pd156
-rw-r--r--externals/gridflow/doc/flow_classes/inv0x2a-help.pd96
-rw-r--r--externals/gridflow/doc/flow_classes/inv0x2b-help.pd96
-rw-r--r--externals/gridflow/doc/flow_classes/listappend-help.pd58
-rw-r--r--externals/gridflow/doc/flow_classes/listelement-help.pd52
-rw-r--r--externals/gridflow/doc/flow_classes/listflatten-help.pd46
-rw-r--r--externals/gridflow/doc/flow_classes/listlength-help.pd52
-rw-r--r--externals/gridflow/doc/flow_classes/listprepend-help.pd59
-rw-r--r--externals/gridflow/doc/flow_classes/listsublist-help.pd64
-rw-r--r--externals/gridflow/doc/flow_classes/ls-help.pd21
-rw-r--r--externals/gridflow/doc/flow_classes/mysql-help.pd22
-rw-r--r--externals/gridflow/doc/flow_classes/parallel_port-help.pd78
-rw-r--r--externals/gridflow/doc/flow_classes/plotter_control-help.pd64
-rw-r--r--externals/gridflow/doc/flow_classes/plotter_parser-help.pd96
-rw-r--r--externals/gridflow/doc/flow_classes/renamefile-help.pd9
-rw-r--r--externals/gridflow/doc/flow_classes/route2-help.pd21
-rw-r--r--externals/gridflow/doc/flow_classes/seq_fold-help.pd13
-rw-r--r--externals/gridflow/doc/flow_classes/shunt-help.pd58
-rw-r--r--externals/gridflow/doc/flow_classes/unix_time-help.pd29
-rw-r--r--externals/gridflow/doc/format.html511
-rw-r--r--externals/gridflow/doc/format.xml714
-rw-r--r--externals/gridflow/doc/gridflow.css18
-rw-r--r--externals/gridflow/doc/images/crop_icons12
-rw-r--r--externals/gridflow/doc/images/header1.pngbin0 -> 13279 bytes
-rw-r--r--externals/gridflow/doc/images/header1.xcfbin0 -> 59365 bytes
-rw-r--r--externals/gridflow/doc/images/header2.pngbin0 -> 1096 bytes
-rw-r--r--externals/gridflow/doc/images/header3.pngbin0 -> 1831 bytes
-rw-r--r--externals/gridflow/doc/index.html73
-rw-r--r--externals/gridflow/doc/index.pd303
-rw-r--r--externals/gridflow/doc/install.html133
-rw-r--r--externals/gridflow/doc/introduction.html105
-rw-r--r--externals/gridflow/doc/license.html70
-rw-r--r--externals/gridflow/doc/locale/english.tcl191
-rw-r--r--externals/gridflow/doc/make_index.tcl29
-rw-r--r--externals/gridflow/doc/moulinette.tcl215
-rw-r--r--externals/gridflow/doc/numop.pd327
-rw-r--r--externals/gridflow/doc/numtype.pd56
-rw-r--r--externals/gridflow/doc/reference.html1114
-rw-r--r--externals/gridflow/doc/reference.xml1329
-rw-r--r--externals/gridflow/doc/tutorials/gf_sampling_quantization.pd57
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_grid_1.pd25
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_grid_2.pd64
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_grid_3.pd30
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_1.pd65
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_2.pd63
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_3.pd84
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_4.pd49
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_5.pd52
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_6.pd66
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_7.pd36
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_8.pd61
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_image_9.pd65
-rw-r--r--externals/gridflow/doc/tutorials/gf_tutorial_intro.pd86
-rw-r--r--externals/gridflow/doc/tutorials/grid-intro.pd10
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-1.pd71
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-2.pd73
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-3.pd70
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-4.pd87
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-5.pd108
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-6.pd92
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-7.pd106
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-8.pd89
-rw-r--r--externals/gridflow/doc/tutorials/pure-data-9.pd43
153 files changed, 12831 insertions, 0 deletions
diff --git a/externals/gridflow/doc/Makefile b/externals/gridflow/doc/Makefile
new file mode 100644
index 00000000..865d34e7
--- /dev/null
+++ b/externals/gridflow/doc/Makefile
@@ -0,0 +1,7 @@
+all:: index.pd numop.pd numtype.pd
+
+index.pd: make_index.tcl locale/english.tcl
+ tclsh make_index.tcl > index.pd
+
+numop.pd numtype.pd: moulinette.tcl
+ tclsh moulinette.tcl
diff --git a/externals/gridflow/doc/architecture.html b/externals/gridflow/doc/architecture.html
new file mode 100644
index 00000000..daa8b3ea
--- /dev/null
+++ b/externals/gridflow/doc/architecture.html
@@ -0,0 +1,65 @@
+Grid Literals
+ In every grid-accepting inlet, a list may be sent instead; if
+ it consists only of integers, it will be converted to a
+ one-dimensional grid. Else it may contain a single "#" sign and
+ integers on both sides of it, where the ones to the left of it are
+ fed as arguments to an imaginary [#redim] object and the one to the
+ right of it are fed through that [#redim].
+ In every grid-accepting inlet, an integer or float may also be sent;
+ it will be converted to a zero-dimensional grid (a scalar).
+
+Grid Protocol
+ a grid has an associated number type that defines what are the possible values for its elements
+ (and how much space it takes). the default is int32.
+ a single-dimensional grid of 3 elements (a triplet) is called dim(3). a
+ three-dimensional grid of 240 rows of 320 columns of triplets is called
+ dim(240,320,3).
+ There is a sequence in which elements of a Grid are stored and
+ transmitted. Dimension 0 is called "first" and dimension N-1 is
+ called "last". They are called so because if you select a
+ position in the first dimension of a grid, the selected part is of the same
+ shape minus the first dimension; so in dim(240,320,3) if you select
+ row 51 (or whichever valid row number), you get a dim(320,3). if you select
+ a subpart two more times you get to a single number.
+ At each such level, elements are sent/stored in their numeric order,
+ and are numbered using natural numbers starting at 0. This ordering usually
+ does not matter, but sometimes it does. Most notably, [#import], [#export] and [#redim] care about it.
+ On the other hand, order of dimensions usually does matter; this is
+ what distinguishes rows from columns and channels, for example.
+ Most objects care about the distinction.
+ A grid with only 1 element in a given dimension is different from one
+ lacking that dimension; it won't have the same meaning. You can use this
+ property to your advantage sometimes.
+ Zero-dimensional grids exist. They are called dim(). They can only contain
+ a single number.
+Picture Protocol
+ This section is useful if you want to know what a picture is in terms of a grid.
+ A picture is a three-dimensional Grid: 0:rows 1:columns 2:channels
+
+Channels for the RGB color model are: 0:red 1:green 2:blue
+ Because Grids are made of 32-bit integers, a three-channel picture uses
+ 96 bpp (bits per pixel), and have to be downscaled to 24 bpp (or 16 bpp)
+ for display. That huge amount of slack is there because when you create
+ your own effects you often have intermediate results that need to be of
+ higher precision than a normal picture. Especially, results of multiplications
+ are big and should not overflow before you divide them back to normal;
+ and similarly, you can have negative values all over, as long as you take
+ care of them before they get to the display.
+ In the final conversion, high bits are just ignored. This means: black is
+ 0, maximum is 255, and values wrap like with % 256. If you want to
+ clip them, you may use [# max 0] and [# min 255] objects.
+
+The following are called VecOps because each operation happens between more than just two numbers.
+A first kind of VecOp are those that arise when a pair of numbers (A0,A1) is considered as a single number A0+A1*sqrt(-1).
+If you need complex numbers but don't know yet how they work, learn them using a math tutorial and then those VecOps will begin to seem familiar.
+All the complex number operators are only for floats.
+TODO: fill the last two columns of this table.
+
+Synchronisation
+
+In GridFlow you cannot send two grids in different inlets at the
+same time. You have to use [#finished] together with (possibly) [fork] and [#store],
+which can be cumbersome. If you don't do this, the result is undefined
+behaviour (or crash!).
+There are two exceptions: [#store] and # allow right-inlet grids to be buffered if an operation is occuring on left inlet. This
+should make many programs simpler.
diff --git a/externals/gridflow/doc/flow_classes/#-help.pd b/externals/gridflow/doc/flow_classes/#-help.pd
new file mode 100644
index 00000000..3227d0b3
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#-help.pd
@@ -0,0 +1,22 @@
+#N canvas 0 26 645 571 10;
+#X obj 139 174 #color;
+#X obj 314 174 #color;
+#X text 245 135 select values below;
+#X text 138 155 A;
+#X text 313 155 B;
+#X obj 139 240 # +;
+#X obj 178 274 #color;
+#X obj 140 380 display;
+#X obj 139 274 t a a;
+#X text 152 342 warning: #color clips value to the 0..255 range;
+#X text 152 357 so use this [display] to view the true numbers;
+#X text 14 31 click on this object to select a numop to try out:;
+#X text 15 14 # applies a simple Numeric Operator (numop).;
+#X text 531 23 GridFlow 0.9.4;
+#X obj 74 50 doc/numop;
+#X connect 0 0 5 0;
+#X connect 1 0 5 1;
+#X connect 5 0 8 0;
+#X connect 8 0 7 0;
+#X connect 8 1 6 0;
+#X connect 14 0 5 0;
diff --git a/externals/gridflow/doc/flow_classes/#apply_colormap_channelwise-help.pd b/externals/gridflow/doc/flow_classes/#apply_colormap_channelwise-help.pd
new file mode 100644
index 00000000..20149dbf
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#apply_colormap_channelwise-help.pd
@@ -0,0 +1,61 @@
+#N canvas 92 0 503 594 10;
+#X obj 25 173 #in;
+#X obj 25 272 #out window;
+#X obj 24 251 cnv 15 190 16 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 0 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 11 1 #apply_colormap_channelwise;
+#X obj 0 467 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 301 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 324 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 5 325 Inlet_0;
+#X text 202 303 Inlets (2);
+#X text 211 469 Outlets (1);
+#X obj 0 547 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 394 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 488 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 489 Inlet_0;
+#X text 5 395 Inlet_1;
+#X text 3 350 GRID;
+#X text 2 422 GRID;
+#X text 5 512 GRID;
+#X text 68 513 Outputs the modified data as a grid.;
+#X text 12 27 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 text 7 574 None;
+#X text 65 422 Colormap is a grid dim (2) (intensity channels);
+#X text 66 351 Accepts a grid that will be modified by the colormap
+;
+#X text 205 548 Arguments (0);
+#X obj 213 115 #for 0 256 1;
+#X obj 213 185 #outer gamma;
+#X msg 25 147 load bluemarble.jpg;
+#X obj 25 128 t b b;
+#X obj 289 141 #color 0 1024 1;
+#X msg 354 89 1024 512 256;
+#X obj 354 70 loadbang;
+#X obj 25 250 #apply_colormap_channelwise;
+#X obj 25 99 metro 100;
+#X obj 25 82 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X text 357 124 vary this:;
+#X text 390 1 GridFlow 0.9.0;
+#X connect 0 0 32 0;
+#X connect 25 0 26 0;
+#X connect 26 0 32 1;
+#X connect 27 0 0 0;
+#X connect 28 0 27 0;
+#X connect 28 1 25 0;
+#X connect 29 0 26 1;
+#X connect 30 0 29 0;
+#X connect 31 0 30 0;
+#X connect 32 0 1 0;
+#X connect 33 0 28 0;
+#X connect 34 0 33 0;
diff --git a/externals/gridflow/doc/flow_classes/#background_model-help.pd b/externals/gridflow/doc/flow_classes/#background_model-help.pd
new file mode 100644
index 00000000..4ad9296b
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#background_model-help.pd
@@ -0,0 +1,43 @@
+#N canvas 328 52 499 470 10;
+#X obj 58 54 #camera;
+#X obj 58 0 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1 ;
+#X obj 194 112 tgl 15 0 empty empty binaryFlag 0 -6 0 8 -24198 -1 -1
+1 1;
+#X obj 126 93 tgl 15 0 empty empty addBackground 0 -6 0 8 -24198 -1
+-1 0 1;
+#X obj 266 102 hsl 128 15 0 700 0 0 empty empty outputThreshold -2
+-6 0 8 -260818 -1 -1 7100 1;
+#X obj 31 28 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 58 333 #greyscale_to_rgb;
+#X text 72 265 Arguments : size of buffer \, columns \, rows \, channel
+;
+#X text 70 283 <-- output is a greyscale image;
+#X obj 58 358 #out window \, title backgroundModel;
+#X obj 58 384 fps detailed;
+#X obj 58 405 print;
+#X obj 160 230 #out window \, title variance;
+#X obj 263 184 #out window \, title Mean;
+#X obj 160 186 # << 2;
+#X obj 160 208 #clip;
+#X floatatom 280 125 5 0 0 0 - - -;
+#X obj 58 308 #clip;
+#X obj 58 24 metro 33.33;
+#X obj 58 158 #background_model 20 120 160 3;
+#X connect 0 0 19 0;
+#X connect 1 0 18 0;
+#X connect 2 0 19 2;
+#X connect 3 0 19 1;
+#X connect 4 0 16 0;
+#X connect 4 0 19 3;
+#X connect 5 0 0 0;
+#X connect 6 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 14 0 15 0;
+#X connect 15 0 12 0;
+#X connect 17 0 6 0;
+#X connect 18 0 0 0;
+#X connect 19 0 17 0;
+#X connect 19 1 14 0;
+#X connect 19 2 13 0;
diff --git a/externals/gridflow/doc/flow_classes/#border-help.pd b/externals/gridflow/doc/flow_classes/#border-help.pd
new file mode 100644
index 00000000..3733b67e
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#border-help.pd
@@ -0,0 +1,57 @@
+#N canvas 597 51 505 631 10;
+#X obj 20 104 #in;
+#X obj 20 167 #out window;
+#X obj 2 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 389 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 203 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 226 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 216 391 Outlets (1);
+#X obj 2 486 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 211 485 Arguments (1);
+#X obj 2 279 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 410 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 3 227 Inlet 0;
+#X text 3 280 Inlet 1;
+#X text 3 411 Outlet 0;
+#X obj 19 137 cnv 15 185 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 16 0 #border;
+#X text 18 251 GRID;
+#X text 222 204 Inlets (3);
+#X obj 2 331 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 3 332 Inlet 2;
+#X text 15 28 Creates a black border around an image.;
+#X text 19 307 LIST;
+#X text 21 363 LIST;
+#X text 65 306 A list of three values in parentheses overides the argument.
+;
+#X text 65 362 A list of three values in parentheses overides the argument.
+;
+#X text 65 254 Receives an image.;
+#X msg 20 62 load working.jpg;
+#X text 16 513 GRID(3);
+#X text 16 533 GRID(3);
+#X text 77 513 top padding and left padding. defaults to (1 1 0).;
+#X text 77 533 bottom and right padding. defaults to (1 1 0).;
+#X obj 20 137 #border (5 10 0) (15 20 0);
+#X text 209 118 5 at the top;
+#X text 208 132 10 at the left;
+#X text 208 146 15 at the bottom;
+#X text 208 159 20 at the right;
+#X text 75 554 both arguments must have 3 elements. The third element
+is reserved for future use.;
+#X text 16 438 GRID;
+#X text 67 438 The original image surrounded by zero padding \, which
+usually means black pixels.;
+#X text 399 1 GridFlow 0.9.4;
+#X connect 0 0 31 0;
+#X connect 26 0 0 0;
+#X connect 31 0 1 0;
diff --git a/externals/gridflow/doc/flow_classes/#camera-help.pd b/externals/gridflow/doc/flow_classes/#camera-help.pd
new file mode 100644
index 00000000..3981fea9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#camera-help.pd
@@ -0,0 +1,53 @@
+#N canvas 824 67 506 613 10;
+#X obj 50 216 #out window;
+#X obj 24 79 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 50 79 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 50 242 fps detailed;
+#X obj 50 272 print;
+#X obj 50 105 metro 20;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 14 27 Is an abstraction that provides a preset for bttv cards
+as well as discrete controls of other cameras.;
+#X obj 1 446 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 363 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 386 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 387 Inlet_0;
+#X text 203 447 Outlets (1);
+#X obj 1 532 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 467 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 203 365 Inlets (1);
+#X text 0 468 Outlet_0;
+#X text 13 414 BANG;
+#X text 205 531 Arguments (0);
+#X text 73 493 Returns a grid from the video capture device for every
+bang.;
+#X text 13 493 GRID;
+#X obj 50 189 #scale_by;
+#X text 395 1 GridFlow 0.9.0;
+#X text 20 300 * for webcams \, please note that you need to have the
+pwc module loaded. The driver from http://www.saillard.org worked for
+the quickcam pro 4000;
+#X text 115 145 <-- open the abstraction and configure for your camera
+before sending it a bang.;
+#X obj 51 147 cnv 15 50 15 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 50 146 #camera;
+#X obj 11 0 #camera;
+#X text 13 563 INT;
+#X text 73 562 Corresponds to the video for linux device on you system
+(0-8);
+#X connect 0 0 3 0;
+#X connect 1 0 26 0;
+#X connect 2 0 5 0;
+#X connect 3 0 4 0;
+#X connect 5 0 26 0;
+#X connect 21 0 0 0;
+#X connect 26 0 21 0;
diff --git a/externals/gridflow/doc/flow_classes/#cast-help.pd b/externals/gridflow/doc/flow_classes/#cast-help.pd
new file mode 100644
index 00000000..069e0dd1
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#cast-help.pd
@@ -0,0 +1,74 @@
+#N canvas 30 36 505 533 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 339 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 241 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 264 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 265 Inlet_0;
+#X text 203 340 Outlets (1);
+#X obj 1 443 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 205 442 Arguments (1);
+#X obj 1 360 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 14 219 #print;
+#X obj 14 199 cnv 15 93 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 14 199 #cast float64;
+#X obj 269 218 #print;
+#X obj 126 218 #print;
+#X obj 269 198 cnv 15 79 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 269 198 #cast uint8;
+#X obj 126 198 cnv 15 79 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 126 198 #cast int32;
+#X text 203 243 Inlets (1);
+#X text 16 295 GRID;
+#X floatatom 14 181 5 0 0 0 - - -;
+#X msg 126 177 9.8764 9 -32 0.3;
+#X obj 269 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 306 79 nbx 8 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 2.1416 256;
+#X obj 356 96 nbx 8 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 45 256;
+#X obj 306 154 #redim ( 2 2 );
+#X obj 269 177 #store;
+#X obj 306 133 #pack 3 float32;
+#X obj 14 161 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X text 73 472 Number types are: uint8 \, int16 \, int32 \, int64 \,
+float32 \, float64. see doc/architecture.html for more info.;
+#X obj 126 157 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X text 12 26 Changes an entity of one data type into another. Returns
+a grid of the same dimensions containing all the same values after
+type conversion. While casting to a smaller type \, overflowing values
+will be truncated.;
+#X text 75 388 Returns a grid of the same dimensions containing all
+the same values after type conversion.;
+#X obj 406 113 nbx 8 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-262144 -1 -1 45 256;
+#X text 0 361 Outlet_0;
+#X obj 11 0 #cast i;
+#X text 395 1 GridFlow 0.9.0;
+#X text 74 295 Any grid;
+#X text 16 389 GRID;
+#X connect 11 0 9 0;
+#X connect 15 0 12 0;
+#X connect 17 0 13 0;
+#X connect 20 0 11 0;
+#X connect 21 0 17 0;
+#X connect 22 0 26 0;
+#X connect 23 0 27 0;
+#X connect 24 0 27 1;
+#X connect 25 0 26 1;
+#X connect 26 0 15 0;
+#X connect 27 0 25 0;
+#X connect 28 0 20 0;
+#X connect 30 0 21 0;
+#X connect 33 0 27 2;
diff --git a/externals/gridflow/doc/flow_classes/#checkers-help.pd b/externals/gridflow/doc/flow_classes/#checkers-help.pd
new file mode 100644
index 00000000..3a32fc50
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#checkers-help.pd
@@ -0,0 +1,38 @@
+#N canvas 40 127 504 404 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 259 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 168 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 191 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 261 Outlets (1);
+#X obj 1 349 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 280 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 192 Inlet 0;
+#X text 2 281 Outlet 0;
+#X obj 10 0 #checkers;
+#X obj 156 63 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 156 85 #for (0 0) (128 128) (1 1);
+#X obj 156 132 #out window \, title checkers;
+#X text 221 169 Inlets (1);
+#X text 11 222 GRID;
+#X text 69 224 Receives a grid: [#for (0 0) (height width) (1 1)];
+#X obj 155 108 cnv 15 66 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 156 108 #checkers;
+#X text 9 310 GRID;
+#X text 74 308 Results in a checkered pattern of 50% / 75% greys in
+8 X 8 squares.;
+#X text 225 351 Arguments;
+#X text 10 375 NONE;
+#X text 12 22 Displays a grid with a pattern of checkered squares.
+;
+#X connect 11 0 12 0;
+#X connect 12 0 18 0;
+#X connect 18 0 13 0;
diff --git a/externals/gridflow/doc/flow_classes/#clip-help.pd b/externals/gridflow/doc/flow_classes/#clip-help.pd
new file mode 100644
index 00000000..32c16d10
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#clip-help.pd
@@ -0,0 +1,78 @@
+#N canvas 673 158 506 685 10;
+#X obj 51 163 #in;
+#X obj 51 189 # + 42;
+#X floatatom 88 166 5 0 0 0 - - -;
+#X obj 51 270 #out window;
+#X obj 51 114 t b b;
+#X obj 51 90 metro 100;
+#X obj 51 68 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X floatatom 127 211 5 0 0 0 - - -;
+#X floatatom 87 211 5 0 0 0 - - -;
+#X text 6 25 The [#clip] object is used with numops in order to set
+a lower and upper range to pixel values. This allows you to avoid over
+saturating the colours of your grid.;
+#X obj 3 1 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 133 165 <-- vary this number;
+#X msg 81 138 open working.jpg;
+#X obj 2 300 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 326 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 382 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 50 235 cnv 15 78 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 64 349 Grid values are clipped to the high and low values stored
+in the object;
+#X text 2 409 INTEGER;
+#X text 5 328 Inlet 0;
+#X text 5 384 Inlet 1;
+#X text 204 302 Inlets (3);
+#X obj 3 439 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 441 Inlet 2;
+#X text 3 469 INTEGER;
+#X obj 1 570 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 203 572 Arguments (2);
+#X text 1 599 [#clip] accepts two integers as creation arguments that
+initialize the first values to be stored in the object. The first integer
+corresponds to the inlet 1 \, the second to inlet 2;
+#X obj 1 497 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 203 499 Outlets (1);
+#X obj 2 520 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 522 Outlet 0;
+#X text 3 350 GRID;
+#X text 4 543 GRID;
+#X text 63 543 Outputs the modified grid;
+#X obj 0 657 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 1 658 SEE ALSO:;
+#X obj 85 657 # min;
+#X obj 132 657 # max;
+#X obj 180 657 clip;
+#X text 227 656 #numop-help.pd;
+#X text 344 656 gf_tutorial_image_6.pd;
+#X text 402 2 GridFlow 0.9.0;
+#X obj 51 236 #clip 0 255;
+#X obj 3 0 #clip;
+#X text 139 231 <--if no creation argument is given the default range
+is 0-255.;
+#X text 69 408 An integer can be used to vary the minimum value of
+the range.;
+#X text 67 466 An integer can be used to vary the maximum value of
+the range.;
+#X connect 0 0 1 0;
+#X connect 1 0 43 0;
+#X connect 2 0 1 1;
+#X connect 4 0 0 0;
+#X connect 4 1 12 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 43 2;
+#X connect 8 0 43 1;
+#X connect 12 0 0 0;
+#X connect 43 0 3 0;
diff --git a/externals/gridflow/doc/flow_classes/#color-help.pd b/externals/gridflow/doc/flow_classes/#color-help.pd
new file mode 100644
index 00000000..71fb0404
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#color-help.pd
@@ -0,0 +1,84 @@
+#N canvas 526 103 502 591 10;
+#X obj 4 1 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 126 114 #color;
+#X text 5 0 [#color];
+#X obj 3 187 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 215 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 216 Inlet 0;
+#X obj 3 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 426 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 427 Outlet 0;
+#X obj 3 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 426 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 427 Outlet 0;
+#X obj 3 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 426 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 427 Outlet 0;
+#X obj 3 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 214 400 Outlets (1);
+#X obj 3 426 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 427 Outlet 0;
+#X text 308 126 <-- vary these;
+#X text 223 188 Inlets (1);
+#X text 3 243 GRID;
+#X text 3 285 MESSAGE;
+#X text 3 457 GRID;
+#X text 63 457 [#color] produces a three dimensional grid of RBG values
+;
+#X text 10 27 The [#color] object contains a triple slider for RGB
+value selection on each channel.;
+#X text 67 283 a message containing a list of three values between
+0 and 255 will asign each value to the corresponding position on each
+channel.;
+#X obj 2 487 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 487 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 487 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 487 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 214 400 Outlets (1);
+#X text 198 68 <-- click here;
+#X msg 126 68 255 0 204;
+#X text 69 243 [#color] accepts three dimensional grids and allows
+for colour value (RGB) changes on each channel;
+#X text 401 2 GridFlow 0.9.0;
+#X text 216 489 Arguments (3);
+#X text 5 510 LIST;
+#X text 62 510 lower bound \, upper bound \, 0 = (default) color preview
+\, 1 = absence of preview.;
+#X msg 317 79 delegate steady 0;
+#X text 67 325 "delegate" sends to the sliders that are part of [#color].
+ie. followed by a value between 0 and 255 will cause all the colour
+values on each channel to go to the value corresponding to that position.
+;
+#X obj 2 567 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 567 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 567 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 567 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 8 568 see also :;
+#X text 91 568 [hsl];
+#X connect 36 0 1 0;
+#X connect 42 0 1 0;
diff --git a/externals/gridflow/doc/flow_classes/#contrast-help.pd b/externals/gridflow/doc/flow_classes/#contrast-help.pd
new file mode 100644
index 00000000..6787cf74
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#contrast-help.pd
@@ -0,0 +1,76 @@
+#N canvas 0 29 503 602 10;
+#X obj 2 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 11 0 #contrast;
+#X obj 58 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 78 138 metro 100;
+#X obj 78 117 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 203 136 hsl 128 15 0 256 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 352 137 hsl 128 15 0 256 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X floatatom 200 156 5 0 0 0 - - -;
+#X floatatom 349 159 5 0 0 0 - - -;
+#X msg 40 67 open bluemarble.jpg;
+#X obj 171 216 #out window;
+#X obj 40 164 #in;
+#X text 14 24 Adjusts the intensity of an image.;
+#X obj 1 566 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 260 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 283 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 568 Outlets (1);
+#X obj 1 665 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 353 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 587 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 284 Inlet 0;
+#X text 2 354 Inlet 1;
+#X text 2 588 Outlet 0;
+#X text 221 261 Inlets (3);
+#X obj 171 191 cnv 15 65 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 171 191 #contrast;
+#X obj 0 464 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 1 465 Inlet 2;
+#X text 26 316 GRID;
+#X text 79 317 Receives a grid.;
+#X text 4 388 INTEGER;
+#X text 5 494 INTEGER;
+#X text 72 495 This value corresponds to the master contrast \, it
+varies the amount of incoming white. The default value is 256 and it
+has no effect.;
+#X text 75 389 This value corresponds to the secondary contrast (inverse
+whiteness) \, it varies the amount of incoming black into the image.
+The default value is 256 and it has no effect.;
+#X text 24 616 GRID;
+#X text 75 617 The resulting grid is output.;
+#X text 210 664 Arguments;
+#X obj 2 723 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 95 721 #convolve;
+#X obj 165 721 #posterize;
+#X obj 242 721 #solarize;
+#X obj 312 721 #layer;
+#X text 14 721 see also:;
+#X text 24 693 NONE;
+#X text 399 1 GridFlow 0.9.4;
+#X text 347 120 contrast about black;
+#X text 197 120 contrast about white;
+#X connect 2 0 11 0;
+#X connect 3 0 11 0;
+#X connect 4 0 3 0;
+#X connect 5 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 25 1;
+#X connect 8 0 25 2;
+#X connect 9 0 11 0;
+#X connect 11 0 25 0;
+#X connect 25 0 10 0;
diff --git a/externals/gridflow/doc/flow_classes/#convolve-help.pd b/externals/gridflow/doc/flow_classes/#convolve-help.pd
new file mode 100644
index 00000000..31cec7f1
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#convolve-help.pd
@@ -0,0 +1,73 @@
+#N canvas 412 35 508 791 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 607 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 296 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 319 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 609 Outlets (1);
+#X obj 1 688 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 687 Arguments (1);
+#X obj 0 484 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 628 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 320 Inlet 0;
+#X text 1 485 Inlet 1;
+#X text 221 297 Inlets (2);
+#X text 2 629 Outlet 0;
+#X obj 10 0 #convolve;
+#X obj 16 87 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X msg 228 135 1 1 1 1 1 1 1 1 1;
+#X obj 228 113 loadbang;
+#X text 27 718 here ^ is the parallel operator \, fold is indicated
+by + and 0 is its base.;
+#X obj 16 112 fork;
+#X obj 228 157 #redim (3 3);
+#X obj 16 158 #in;
+#X obj 16 241 #out window;
+#X obj 0 757 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 55 756 see also:;
+#X obj 126 760 #contrast;
+#X obj 195 760 #posterize;
+#X obj 271 760 #solarize;
+#X obj 340 760 #layer;
+#X obj 16 183 cnv 15 219 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 16 183 #convolve \, op ^ \, fold + \, seed 0;
+#X text 14 27 [#convolve] is used to perform various transformations
+on images such as blurring \, sharpening \, finding edges \, embossing
+\, cellular automata and many others.;
+#X text 29 346 GRID;
+#X text 28 660 GRID;
+#X text 23 512 GRID;
+#X text 70 514 This is the convolution grid and it gets stored in the
+other object. If rows2 and/or columns 2 are odd numbers \, then the
+centre of convolution is the middle of the convolution grid. If they
+are even numbers \, then the chosen centre will be slightly more to
+the left and/or to the top \, because the actual middle is between
+celle of the grid.;
+#X text 73 347 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.;
+#X msg 39 135 open scissors.jpg;
+#X text 398 1 GridFlow 0.9.0;
+#X connect 14 0 18 0;
+#X connect 15 0 19 0;
+#X connect 16 0 15 0;
+#X connect 18 0 20 0;
+#X connect 18 1 36 0;
+#X connect 19 0 29 1;
+#X connect 20 0 29 0;
+#X connect 29 0 21 0;
+#X connect 36 0 20 0;
diff --git a/externals/gridflow/doc/flow_classes/#dim-help.pd b/externals/gridflow/doc/flow_classes/#dim-help.pd
new file mode 100644
index 00000000..e79ef2b7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#dim-help.pd
@@ -0,0 +1,52 @@
+#N canvas 224 30 508 484 10;
+#X obj 4 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 291 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 214 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 237 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 238 Inlet_0;
+#X text 215 293 Outlets (1);
+#X obj 4 412 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 312 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 313 Inlet_0;
+#X obj 16 0 #dim;
+#X obj 29 87 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 22 178 print number_of_dimensions;
+#X obj 22 106 #in;
+#X obj 22 130 cnv 15 30 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 22 130 #dim;
+#X obj 22 154 #export;
+#X msg 22 66 open working.jpg;
+#X text 207 216 Inlets (1);
+#X text 8 270 GRID;
+#X text 397 3 GridFlow 0.8.4;
+#X text 8 349 INTEGER;
+#X text 208 411 Arguments (none);
+#X text 15 37 Outputs grid dimensions (columns \, row \, channels).
+;
+#X obj 3 458 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 166 459 rubyprint;
+#X obj 236 459 printargs;
+#X obj 117 459 #print;
+#X obj 306 459 #export;
+#X obj 362 459 #export_list;
+#X text 25 460 see also:;
+#X text 70 270 Receives a grid \, ignores its content.;
+#X text 70 347 The received grid is output as a one dimensional grid
+representing grid dimensions. For example \, a grid sized like dim(240
+\, 320 \, 4) [#dim] will return a grid like dim(3) whose values are
+240 \, 320 \, 4;
+#X connect 10 0 12 0;
+#X connect 12 0 14 0;
+#X connect 14 0 15 0;
+#X connect 15 0 11 0;
+#X connect 16 0 12 0;
+#X connect 16 0 10 0;
diff --git a/externals/gridflow/doc/flow_classes/#downscale_by-help.pd b/externals/gridflow/doc/flow_classes/#downscale_by-help.pd
new file mode 100644
index 00000000..13252374
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#downscale_by-help.pd
@@ -0,0 +1,61 @@
+#N canvas 0 0 501 613 10;
+#X obj 181 115 metro 10;
+#X obj 181 96 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X floatatom 251 130 5 0 0 0 - - -;
+#X obj 165 144 #in;
+#X msg 165 70 open bluemarble.jpg \, bang;
+#X floatatom 295 143 5 0 0 0 - - -;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 461 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 258 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 281 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 463 Outlets (1);
+#X obj 1 539 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 538 Arguments (1);
+#X obj 1 342 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 482 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 282 Inlet 0;
+#X text 2 343 Inlet 1;
+#X text 221 259 Inlets (2);
+#X text 2 483 Outlet 0;
+#X obj 10 0 #dowscale_by;
+#X obj 251 162 #pack 2;
+#X obj 165 186 cnv 15 93 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 165 186 #downscale_by;
+#X obj 165 212 #out window;
+#X text 29 309 GRID;
+#X text 9 372 INTEGER;
+#X text 9 24 Scales down a picture by a specified amount.;
+#X text 79 311 Receives a grid.;
+#X obj 1 614 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 104 616 see also:;
+#X obj 180 615 #scale_to;
+#X obj 251 615 #scale_by;
+#X text 81 371 The value defines the scale factor. A pack object allows
+you to vary the horizontal and vertical values idenpendently. Inlet
+0 of [#pack] varies the image on a vertical axis \, inlet 1 of [#pack]
+varies the image on a horizontal axis.;
+#X text 26 512 GRID;
+#X text 82 512 Outputs the resulting grid.;
+#X text 10 571 INTEGER;
+#X text 78 572 The value downscales the image according to the specified
+value.;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 2 0 21 0;
+#X connect 3 0 23 0;
+#X connect 4 0 3 0;
+#X connect 5 0 21 1;
+#X connect 21 0 23 1;
+#X connect 23 0 24 0;
diff --git a/externals/gridflow/doc/flow_classes/#draw_image-help.pd b/externals/gridflow/doc/flow_classes/#draw_image-help.pd
new file mode 100644
index 00000000..962e5e78
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_image-help.pd
@@ -0,0 +1,55 @@
+#N canvas 397 178 451 368 10;
+#X text 362 6 gridflow;
+#X obj 60 127 #in;
+#X obj 23 161 #store;
+#X obj 23 26 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 1 1
+;
+#X obj 23 54 metro 40;
+#X obj 23 237 #draw_image *>>8;
+#X obj 23 263 #out window \, title #draw_image-help;
+#X obj 60 79 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X text 16 7 #draw_image;
+#X obj 76 189 #in;
+#X obj 76 149 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X text 82 81 2 <-- open background image;
+#X text 99 151 1 <-- open foreground image;
+#X obj 275 218 #dim;
+#X obj 275 237 #export_list;
+#X obj 275 256 unpack f f;
+#X obj 281 275 pack f f;
+#X obj 281 294 # / 2;
+#X obj 256 294 # -;
+#X obj 23 287 #mouse;
+#X text 47 28 3 <-- activate rendering;
+#X msg 76 170 load g001.jpg;
+#X msg 60 100 load r001.jpg;
+#X msg 163 237 0 0;
+#X obj 163 218 loadbang;
+#X text 23 331 Move mouse cursor to change layer position;
+#X connect 1 0 2 1;
+#X connect 2 0 5 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 19 0;
+#X connect 7 0 22 0;
+#X connect 9 0 5 1;
+#X connect 9 0 13 0;
+#X connect 10 0 21 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 15 1 16 1;
+#X connect 16 0 17 0;
+#X connect 17 0 18 1;
+#X connect 18 0 5 2;
+#X connect 19 0 18 0;
+#X connect 19 1 18 0;
+#X connect 19 2 18 0;
+#X connect 19 3 18 0;
+#X connect 21 0 9 0;
+#X connect 22 0 1 0;
+#X connect 23 0 5 2;
+#X connect 24 0 23 0;
diff --git a/externals/gridflow/doc/flow_classes/#draw_points-help.pd b/externals/gridflow/doc/flow_classes/#draw_points-help.pd
new file mode 100644
index 00000000..279fdf14
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_points-help.pd
@@ -0,0 +1,22 @@
+#N canvas 678 62 450 574 10;
+#X msg 21 103 240 320 3 #;
+#X obj 236 95 #outer + (0 9000);
+#X obj 236 114 # cos* 100;
+#X obj 236 133 # + 120;
+#X obj 236 57 #for 0 12 1;
+#X obj 236 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 236 76 # * 3000;
+#X obj 237 223 display;
+#X obj 21 123 #draw_points put (255 255 0);
+#X obj 21 143 #out window;
+#X text 26 17 [#draw_points] is not yet ready for use.;
+#X connect 0 0 8 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 7 0;
+#X connect 3 0 8 2;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 6 0 1 0;
+#X connect 8 0 9 0;
diff --git a/externals/gridflow/doc/flow_classes/#draw_polygon-help.pd b/externals/gridflow/doc/flow_classes/#draw_polygon-help.pd
new file mode 100644
index 00000000..3cdf6a5f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_polygon-help.pd
@@ -0,0 +1,83 @@
+#N canvas 586 235 634 404 10;
+#X text 16 7 #draw_polygon;
+#X obj 20 349 #out window;
+#X obj 383 128 #color;
+#X obj 383 72 loadbang;
+#X obj 272 107 # rand;
+#X obj 20 256 #clip;
+#X obj 385 199 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -241291
+-1 -1 0;
+#X text 402 200 fill;
+#X msg 385 265 draw \$1;
+#X obj 385 291 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -241291
+-1 -1 0;
+#X text 403 291 none;
+#X msg 385 357 omit \$1;
+#X text 403 306 last;
+#X text 403 320 odd;
+#X obj 385 338 listread none last odd;
+#X obj 20 237 #draw_polygon + 1;
+#X obj 20 37 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1
+;
+#X obj 43 169 #checkers;
+#X obj 43 150 #for (0 0) (240 320) (1 1);
+#X obj 272 50 f;
+#X obj 297 50 + 1;
+#X obj 272 69 sel 0;
+#X obj 235 126 #store;
+#X obj 20 75 t b b b;
+#X msg 383 109 40 80 100;
+#X text 483 13 gridflow 0.9.4;
+#X obj 50 104 loadbang;
+#X obj 322 50 % 30;
+#X obj 235 164 #fade_lin 4 4;
+#X obj 20 56 metro 33.3667;
+#X obj 385 246 listread fill line point;
+#X text 402 214 line;
+#X text 402 228 point;
+#X msg 272 88 8 2 # 240 320;
+#X msg 459 110 3 # 255;
+#X msg 115 169 240 320 3 #;
+#X obj 6 188 #store;
+#X obj 27 151 bng 15 250 50 0 empty empty empty 17 7 0 10 -241291 -1
+-1;
+#X obj 20 287 shunt;
+#X obj 57 288 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 50 306 #fade (16 4 1);
+#X connect 2 0 15 1;
+#X connect 3 0 34 0;
+#X connect 4 0 22 1;
+#X connect 5 0 38 0;
+#X connect 6 0 30 0;
+#X connect 8 0 15 0;
+#X connect 9 0 14 0;
+#X connect 11 0 15 0;
+#X connect 14 0 11 0;
+#X connect 15 0 5 0;
+#X connect 16 0 29 0;
+#X connect 17 0 36 1;
+#X connect 18 0 17 0;
+#X connect 19 0 20 0;
+#X connect 19 0 21 0;
+#X connect 20 0 27 0;
+#X connect 21 0 33 0;
+#X connect 22 0 28 0;
+#X connect 23 0 36 0;
+#X connect 23 1 22 0;
+#X connect 23 2 19 0;
+#X connect 24 0 2 0;
+#X connect 26 0 35 0;
+#X connect 27 0 19 1;
+#X connect 28 0 15 2;
+#X connect 29 0 23 0;
+#X connect 30 0 8 0;
+#X connect 33 0 4 0;
+#X connect 34 0 2 0;
+#X connect 35 0 36 1;
+#X connect 36 0 15 0;
+#X connect 37 0 18 0;
+#X connect 38 0 1 0;
+#X connect 38 1 40 0;
+#X connect 39 0 38 1;
+#X connect 40 0 1 0;
diff --git a/externals/gridflow/doc/flow_classes/#draw_slider-help.pd b/externals/gridflow/doc/flow_classes/#draw_slider-help.pd
new file mode 100644
index 00000000..998110c6
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_slider-help.pd
@@ -0,0 +1,53 @@
+#N canvas 516 122 624 690 10;
+#X obj 108 87 metro 100;
+#X obj 108 55 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 1 1
+;
+#X obj 108 262 #out window;
+#X obj 3 1 cnv 15 620 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 402 2 GridFlow 0.9.0;
+#X obj 2 300 cnv 15 620 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 326 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 382 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 64 349 Grid values are clipped to the high and low values stored
+in the object;
+#X text 2 409 INTEGER;
+#X text 5 328 Inlet 0;
+#X text 5 384 Inlet 1;
+#X text 204 302 Inlets (3);
+#X obj 3 439 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 441 Inlet 2;
+#X text 3 469 INTEGER;
+#X obj 1 497 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 203 499 Outlets (1);
+#X obj 2 520 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 522 Outlet 0;
+#X text 3 350 GRID;
+#X text 4 543 GRID;
+#X text 63 543 Outputs the modified grid;
+#X text 69 408 An integer can be used to vary the minimum value of
+the range.;
+#X text 67 466 An integer can be used to vary the maximum value of
+the range.;
+#X obj 108 116 #in scissors.jpg;
+#X obj 298 149 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -241291
+-1 -1 12700 1;
+#X text 6 25 Draws a vu metre-like rectangle on an image.;
+#X text 438 148 <-- value to be displayed;
+#X msg 206 195 255 200 150;
+#X text 289 195 <-- colour;
+#X obj 3 0 #draw_vumetre;
+#X obj 108 224 #draw_slider put (0 255 0) (255 0 255) (40 40 80 200)
+0 127;
+#X connect 0 0 25 0;
+#X connect 1 0 0 0;
+#X connect 25 0 32 0;
+#X connect 26 0 32 2;
+#X connect 29 0 32 1;
+#X connect 32 0 2 0;
diff --git a/externals/gridflow/doc/flow_classes/#extract_diagonal-help.pd b/externals/gridflow/doc/flow_classes/#extract_diagonal-help.pd
new file mode 100644
index 00000000..b6a3e9e7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#extract_diagonal-help.pd
@@ -0,0 +1,23 @@
+#N canvas 0 0 450 471 10;
+#X obj 63 72 cv/#SVD;
+#X obj 80 94 display;
+#X obj 64 164 display;
+#X msg 63 53 2 2 f # 30 40 50 60;
+#X text 63 33 numbers coming from the equation of an ellipse;
+#X text 111 75 eigenvectors show the direction of axes of the ellipse
+;
+#X text 74 145 eigenvalues show the square of the length of the axes
+;
+#X obj 33 223 #extract_diagonal;
+#X obj 46 247 display;
+#X text 140 222 just keep the diagonal of the matrix;
+#X obj 34 314 display;
+#X text 109 294 just the radiuses;
+#X obj 33 294 # sqrt (f #);
+#X connect 0 0 2 0;
+#X connect 0 0 7 0;
+#X connect 0 1 1 0;
+#X connect 3 0 0 0;
+#X connect 7 0 8 0;
+#X connect 7 0 12 0;
+#X connect 12 0 10 0;
diff --git a/externals/gridflow/doc/flow_classes/#fade-help.pd b/externals/gridflow/doc/flow_classes/#fade-help.pd
new file mode 100644
index 00000000..8aefa013
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fade-help.pd
@@ -0,0 +1,71 @@
+#N canvas 68 0 507 631 10;
+#X obj 4 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 526 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 327 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 350 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 9 351 Inlet_0;
+#X text 206 329 Inlets (2);
+#X text 215 528 Outlets (1);
+#X obj 3 425 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 549 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 9 550 Inlet_0;
+#X text 8 426 Inlet_1;
+#X obj 14 0 #fade;
+#X obj 253 276 #out window;
+#X msg 140 155 open b001.jpg;
+#X obj 131 111 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 131 183 #in;
+#X obj 131 130 t b b;
+#X obj 227 205 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X floatatom 296 231 5 0 0 0 - - -;
+#X obj 131 89 metro 500;
+#X obj 131 70 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 253 113 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 253 185 #in;
+#X obj 253 132 t b b;
+#X msg 262 157 open r001.jpg;
+#X obj 253 91 metro 500;
+#X obj 253 72 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 9 25 Crossfade between two images.;
+#X obj 253 250 cnv 15 37 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 253 250 #fade;
+#X text 11 385 GRID;
+#X text 69 383 Accepts two grids that are blended into each other over
+time.;
+#X text 8 457 INTEGER;
+#X text 73 456 An integer in the rightmost inlet will indicate the
+amount of one image being blended with the other. (ex: Integer 5 will
+take 20% (one fifth) of the first image and blend it with 80% of the
+next image.;
+#X text 76 587 Outputs the fading images.;
+#X text 13 584 GRID;
+#X text 399 1 GridFlow 0.8.4;
+#X connect 13 0 15 0;
+#X connect 14 0 16 0;
+#X connect 15 0 29 0;
+#X connect 16 0 15 0;
+#X connect 16 1 13 0;
+#X connect 17 0 29 0;
+#X connect 18 0 29 1;
+#X connect 19 0 14 0;
+#X connect 20 0 19 0;
+#X connect 21 0 23 0;
+#X connect 22 0 29 0;
+#X connect 23 0 22 0;
+#X connect 23 1 24 0;
+#X connect 24 0 22 0;
+#X connect 25 0 21 0;
+#X connect 26 0 25 0;
+#X connect 29 0 12 0;
diff --git a/externals/gridflow/doc/flow_classes/#fastblur-help.pd b/externals/gridflow/doc/flow_classes/#fastblur-help.pd
new file mode 100644
index 00000000..458d82ed
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fastblur-help.pd
@@ -0,0 +1,69 @@
+#N canvas 310 131 669 377 10;
+#N canvas 0 0 450 300 test 0;
+#X obj 264 137 # +;
+#X obj 23 58 #for (0 0) (5 5) (1 1);
+#X obj 23 96 #fold & \, seed 1;
+#X obj 23 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 23 115 #convolve (3 3 # 1 2 3 4 5 6 7 8 9) \, wrap 0 \, anti
+0;
+#X obj 22 77 # == 2;
+#X obj 23 134 #print;
+#X obj 264 156 #print;
+#X connect 0 0 7 0;
+#X connect 1 0 5 0;
+#X connect 2 0 0 0;
+#X connect 2 0 4 0;
+#X connect 3 0 1 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X restore 453 27 pd test convolve attr;
+#X obj 20 53 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X obj 38 54 metro 33.3667;
+#X obj 100 92 loadbang;
+#X obj 84 93 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 38 109 #store;
+#X obj 38 289 #out window;
+#X obj 39 329 display;
+#X obj 38 308 fps detailed;
+#X obj 84 109 #in teapot.png;
+#X obj 298 55 f;
+#X obj 324 55 + 1;
+#X obj 149 300 #pack;
+#X obj 38 84 t b b;
+#X obj 38 130 #fastblur;
+#X obj 305 95 expr 1+100*pow(sin($f1/25) \, 4);
+#X obj 294 75 expr 1+100*pow(sin($f1/20) \, 4);
+#X obj 150 166 vsl 15 128 1 128 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 170 166 vsl 15 128 1 128 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 298 36 spigot;
+#X obj 344 37 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 38 269 #gamma 700;
+#X text 363 37 AUTO;
+#X connect 1 0 2 0;
+#X connect 2 0 13 0;
+#X connect 3 0 9 0;
+#X connect 4 0 9 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 8 0 7 0;
+#X connect 9 0 5 1;
+#X connect 10 0 11 0;
+#X connect 10 0 15 0;
+#X connect 10 0 16 0;
+#X connect 11 0 10 1;
+#X connect 12 0 14 1;
+#X connect 13 0 5 0;
+#X connect 13 1 19 0;
+#X connect 14 0 21 0;
+#X connect 15 0 18 0;
+#X connect 16 0 17 0;
+#X connect 17 0 12 0;
+#X connect 18 0 12 1;
+#X connect 19 0 10 0;
+#X connect 20 0 19 1;
+#X connect 21 0 6 0;
diff --git a/externals/gridflow/doc/flow_classes/#fft-help.pd b/externals/gridflow/doc/flow_classes/#fft-help.pd
new file mode 100644
index 00000000..10a7f1d5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fft-help.pd
@@ -0,0 +1,43 @@
+#N canvas 653 283 450 341 10;
+#X obj 13 94 #cast f;
+#X obj 13 186 #cast i;
+#X obj 13 36 #in teapot.png;
+#X obj 32 14 loadbang;
+#X obj 13 15 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 13 56 t a a;
+#X obj 13 262 @join 1;
+#X obj 13 148 #fft;
+#X msg 23 126 help;
+#X msg 63 126 skip \$1;
+#X obj 64 113 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 52 56 s orig;
+#X obj 66 262 r orig;
+#X obj 13 281 #out window;
+#X obj 13 224 # + 128;
+#X obj 13 243 #clip;
+#X obj 13 75 #outer * (1 0);
+#X obj 13 205 #inner (1 0);
+#X text 89 205 convert complex to real (kicking dummy imaginary);
+#X text 100 75 convert real to complex (introducing dummy imaginary=0)
+;
+#X obj 13 167 # / (f # 16);
+#X connect 0 0 7 0;
+#X connect 1 0 17 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 16 0;
+#X connect 5 1 11 0;
+#X connect 6 0 13 0;
+#X connect 7 0 20 0;
+#X connect 8 0 7 0;
+#X connect 9 0 7 0;
+#X connect 10 0 9 0;
+#X connect 12 0 6 1;
+#X connect 14 0 15 0;
+#X connect 15 0 6 0;
+#X connect 16 0 0 0;
+#X connect 17 0 14 0;
+#X connect 20 0 1 0;
diff --git a/externals/gridflow/doc/flow_classes/#finished-help.pd b/externals/gridflow/doc/flow_classes/#finished-help.pd
new file mode 100644
index 00000000..f28771ac
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#finished-help.pd
@@ -0,0 +1,15 @@
+#N canvas 551 311 442 238 10;
+#X text 22 53 a bang is emitted every time a grid transmission ends
+;
+#X obj 24 175 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X floatatom 24 80 5 0 0 0 - - -;
+#X floatatom 47 98 5 0 0 0 - - -;
+#X text 371 15 gridflow;
+#X obj 24 146 #finished;
+#X obj 24 117 #pack;
+#X text 21 22 #finished;
+#X connect 2 0 6 0;
+#X connect 3 0 6 1;
+#X connect 5 0 1 0;
+#X connect 6 0 5 0;
diff --git a/externals/gridflow/doc/flow_classes/#fold-help.pd b/externals/gridflow/doc/flow_classes/#fold-help.pd
new file mode 100644
index 00000000..f11f9d82
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fold-help.pd
@@ -0,0 +1,78 @@
+#N canvas 310 0 507 682 10;
+#X obj 1 1 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 419 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 328 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 351 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 204 421 Outlets (1);
+#X obj 4 503 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 440 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 464 GRID;
+#X text 393 2 GridFlow 0.8.4;
+#X text 8 352 Inlet 0;
+#X obj 4 532 cnv 15 80 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 8 533 Argument 0;
+#X obj 27 219 cnv 15 52 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 9 441 Outlet 0;
+#X obj 11 2 #fold +;
+#X obj 98 184 display;
+#X obj 29 252 display;
+#X text 26 38 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 205 330 Inlets (1);
+#X obj 143 249 #export;
+#X obj 143 274 print values;
+#X text 4 378 GRID;
+#X text 6 651 some other forms:;
+#X obj 140 652 #fold *;
+#X text 200 504 Arguments ();
+#X obj 17 625 #fold + \, seed 0;
+#X obj 4 583 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 200 584 Attribute ();
+#X obj 211 652 #fold ^;
+#X obj 284 652 #fold &;
+#X obj 355 652 #fold |;
+#N canvas 0 0 450 300 more 0;
+#X obj 29 137 cnv 15 148 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 98 82 display;
+#X obj 28 48 #import (2 2 2);
+#X obj 29 170 display;
+#X msg 28 27 1 3 1 3 1 3 1 5;
+#X text 154 24 <-- clicking here creates a grid through [#import];
+#X obj 122 170 #export;
+#X obj 122 195 print values;
+#X obj 28 137 #fold + \, seed ( 0 0 );
+#X connect 2 0 1 0;
+#X connect 2 0 8 0;
+#X connect 4 0 2 0;
+#X connect 6 0 7 0;
+#X connect 8 0 3 0;
+#X connect 8 0 6 0;
+#X restore 160 624 pd more info;
+#X text 71 464 Outputs a grid of one less dimension.;
+#X text 69 377 Accepts a grid of a minimum of one dimension.;
+#X msg 28 129 1 3 1 3 1 3 1 3 1 3 1 5;
+#X obj 28 153 #import (2 3 2);
+#X obj 28 219 #fold +;
+#X text 203 129 <-- clicking here creates a grid through [#import]
+;
+#X text 6 556 Numeric Operator;
+#X text 131 555 guiding the application of the fold.;
+#X connect 19 0 20 0;
+#X connect 34 0 35 0;
+#X connect 35 0 15 0;
+#X connect 35 0 36 0;
+#X connect 36 0 16 0;
+#X connect 36 0 19 0;
diff --git a/externals/gridflow/doc/flow_classes/#for-help.pd b/externals/gridflow/doc/flow_classes/#for-help.pd
new file mode 100644
index 00000000..72513fbb
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#for-help.pd
@@ -0,0 +1,96 @@
+#N canvas 694 0 506 928 10;
+#X floatatom 13 227 5 0 0 0 - - -;
+#X floatatom 45 249 5 0 0 0 - - -;
+#X floatatom 78 270 5 0 0 0 - - -;
+#X obj 13 365 #print;
+#X obj 0 2 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 10 659 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 8 415 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 8 438 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 219 661 Outlets (1);
+#X obj 9 757 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 8 512 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 10 680 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 15 704 GRID;
+#X obj 7 3 #for 0 320 1;
+#X obj 33 332 display;
+#X text 210 417 Inlets (3);
+#X text 213 758 Arguments (3);
+#X obj 9 586 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 14 587 Inlet 2;
+#X text 13 514 Inlet 1;
+#X text 13 439 Inlet 0;
+#X obj 9 786 cnv 15 80 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 13 787 Argument 0;
+#X obj 8 852 cnv 15 80 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 8 908 cnv 15 80 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 12 853 Argument 1;
+#X text 12 909 Argument 2;
+#X obj 15 297 cnv 15 70 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 119 270 <-- step value;
+#X text 90 247 <-- upper bound;
+#X text 60 224 <-- lower bound;
+#X obj 13 297 #for 0 8 1;
+#X obj 264 364 #print;
+#X obj 284 334 display;
+#X obj 266 303 cnv 15 70 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X msg 264 228 0 0;
+#X msg 329 276 1 1;
+#X obj 264 303 #for 0 8 1;
+#X msg 296 253 4 4;
+#X text 11 814 INTEGER;
+#X text 11 875 INTEGER;
+#X text 11 935 INTEGER;
+#X text 14 681 Outlet 0;
+#X text 105 875 Upper bound;
+#X text 106 935 Step value;
+#X text 106 815 Lower bound. As with the other arguments \, they are
+overwritten when another value is given.;
+#X text 11 488 LIST;
+#X text 374 276 <-- step value (1);
+#X text 343 252 <-- upper bound (2);
+#X text 309 227 <-- lower bound (3);
+#X text 26 38 When given scalar bounds \, works like a regular [for]
+object plugged to a [#import] tuned for a Dim(size) where size is the
+number of values produced by a bang to that [for].;
+#X text 26 84 When given vector bounds \, will work like any number
+of [for] objects producing all possible combinations of their values
+in the proper order.;
+#X text 35 193 scalar bounds;
+#X text 303 196 vector bounds;
+#X text 9 465 INTEGER;
+#X text 74 466 Sets the lower bound;
+#X text 11 558 LIST;
+#X text 9 535 INTEGER;
+#X text 74 536 Sets the upper bound;
+#X text 11 634 LIST;
+#X text 9 611 INTEGER;
+#X text 74 612 Sets the step value;
+#X text 76 707 The result of the operation is a single dimension grid
+in the case of scalar values and variable dimensions for vectors.;
+#X text 27 137 Syntax: #for <from> <to> <step> outlet: grid dim(size)
+where size = floor(to-from+1)/step.;
+#X text 391 3 GridFlow 0.9.0;
+#X connect 0 0 31 0;
+#X connect 1 0 31 1;
+#X connect 2 0 31 2;
+#X connect 31 0 14 0;
+#X connect 31 0 3 0;
+#X connect 35 0 37 0;
+#X connect 36 0 37 2;
+#X connect 37 0 33 0;
+#X connect 37 0 32 0;
+#X connect 38 0 37 1;
diff --git a/externals/gridflow/doc/flow_classes/#from_pix-help.pd b/externals/gridflow/doc/flow_classes/#from_pix-help.pd
new file mode 100644
index 00000000..1d817b7a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#from_pix-help.pd
@@ -0,0 +1,116 @@
+#N canvas 751 44 507 754 10;
+#X obj -40 -45 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 357 -44 GridFlow 0.9.3;
+#X obj -41 683 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 683 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 683 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 683 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -35 682 see also :;
+#X obj -41 357 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 385 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -40 386 Inlet 0;
+#X obj -41 485 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 513 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -40 512 Outlet 0;
+#X obj -41 485 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 513 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -40 512 Outlet 0;
+#X obj -41 485 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 513 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -40 512 Outlet 0;
+#X obj -41 485 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 170 485 Outlets (1);
+#X obj -41 513 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -40 512 Outlet 0;
+#X obj -41 485 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 485 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 485 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 170 485 Outlets (1);
+#X obj -42 632 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -42 632 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -42 632 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -42 632 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -41 571 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 102 681 \, game_of_life_gem.pd in the examples folder;
+#X text -33 534 GRID;
+#X text -36 593 gemlist;
+#X text 47 534 Grid with 4 channels;
+#X text 172 631 Arguments (0);
+#X text -37 434 yflip;
+#X text 41 435 With one boolean argument that selects the order in
+which the y dimension of the Grid will be read \, defaults to '1';
+#X text -39 -46 [#import_pix];
+#X text 48 681 [#to_pix];
+#X obj -28 251 #import_pix;
+#X obj -13 176 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X msg -13 195 yflip \$1;
+#X msg -6 217 help;
+#X obj -28 -11 gemhead;
+#X obj -28 147 pix_image;
+#N canvas 0 0 450 300 openpanel 0;
+#X obj 114 62 inlet;
+#X obj 121 254 outlet;
+#X obj 114 125 openpanel;
+#X msg 114 162 set open \$1;
+#X obj 114 199 t b a;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 4 1 1 0;
+#X restore -10 64 pd openpanel;
+#X msg -10 85 open /home/alx/Documents/src/pd-0.40-2/extra/svn_GridFlow/trunk/images/babbage.jpg
+;
+#X obj -10 42 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X msg 341 5 create \, 1;
+#X obj 341 -14 loadbang;
+#X msg 405 6 destroy;
+#X text 12 40 <-- load image;
+#X obj -28 293 #out window \, title imported_pix;
+#X text -13 328 Note : The fps is dependent on the gemwin framerate
+;
+#X obj 341 34 gemwin 30;
+#X text -38 404 gemlist;
+#X text 50 251 <-- imports gemlist into Grids;
+#X text 40 404 Has to be a 'pix' gemlist;
+#X text 175 357 Inlet (1);
+#X text 36 537;
+#X text -38 572 Outlet 1;
+#X text 43 593 Passthrough outlet for gem chain;
+#X connect 41 0 54 0;
+#X connect 42 0 43 0;
+#X connect 43 0 41 0;
+#X connect 44 0 41 0;
+#X connect 45 0 46 0;
+#X connect 46 0 41 0;
+#X connect 47 0 48 0;
+#X connect 48 0 46 0;
+#X connect 49 0 47 0;
+#X connect 50 0 56 0;
+#X connect 51 0 50 0;
+#X connect 52 0 56 0;
diff --git a/externals/gridflow/doc/flow_classes/#grade-help.pd b/externals/gridflow/doc/flow_classes/#grade-help.pd
new file mode 100644
index 00000000..b5972f3b
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#grade-help.pd
@@ -0,0 +1,20 @@
+#N canvas 375 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 floatatom 19 74 5 0 0 0 - - -;
+#X floatatom 60 74 5 0 0 0 - - -;
+#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 obj 19 106 #pack 4;
+#X obj 19 139 #grade;
+#X obj 19 168 #print;
+#X text 14 15 #grade;
+#X connect 1 0 7 0;
+#X connect 2 0 7 1;
+#X connect 3 0 7 2;
+#X connect 4 0 7 3;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
diff --git a/externals/gridflow/doc/flow_classes/#greyscale_to_rgb-help.pd b/externals/gridflow/doc/flow_classes/#greyscale_to_rgb-help.pd
new file mode 100644
index 00000000..7f60c43d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#greyscale_to_rgb-help.pd
@@ -0,0 +1,15 @@
+#N canvas 119 122 433 374 10;
+#X obj 19 161 s xx;
+#X obj 19 185 r xx;
+#X text 353 13 gridflow;
+#X obj 19 105 #in;
+#X obj 19 141 #rgb_to_greyscale;
+#X obj 19 205 #greyscale_to_rgb;
+#X obj 19 263 #out window;
+#X msg 19 74 load bluemarble.jpg;
+#X text 24 5 #greyscale_to_rgb;
+#X connect 1 0 5 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 7 0 3 0;
diff --git a/externals/gridflow/doc/flow_classes/#import-help.pd b/externals/gridflow/doc/flow_classes/#import-help.pd
new file mode 100644
index 00000000..9eaba934
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#import-help.pd
@@ -0,0 +1,87 @@
+#N canvas 997 26 505 766 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 602 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 222 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 245 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 604 Outlets (1);
+#X obj 1 700 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 699 Arguments (1);
+#X obj 1 623 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 246 Inlet 0;
+#X text 2 624 Outlet 0;
+#X msg 55 123 reset;
+#X obj 13 59 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X msg 13 123 200;
+#X obj 13 100 until;
+#X msg 13 79 230400;
+#X obj 13 177 #out window;
+#X obj 13 149 cnv 15 129 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 7 728 GRID;
+#X text 74 727 The argument establishes grid dimensions in parentheses
+in the order of columns \, rows and grid dimensions.;
+#X obj 13 149 #import ( 240 320 3 );
+#X text 4 274 INTEGER;
+#X text 5 338 SYMBOL;
+#X text 76 337 Symbols are considered as a list of ascii characters.
+;
+#X text 7 364 LIST;
+#X text 76 363 Like a sequence of ints sent one after another \, except
+in a single message.;
+#X text 7 399 MESSAGE;
+#X text 76 396 "reset" aborts the current grid if there is one.;
+#X text 6 451 GRID;
+#X obj 1 508 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 509 Inlet 1;
+#X text 8 651 GRID;
+#X text 80 651 The grid resulting from the incoming integers and/or
+grids is output from the outlet.;
+#X text 99 24 This object allows you to produce grids from non-grid
+data \, such as integers and lists of integers. This object also reframes/resyncs
+grids so that multiple grids may be joined together \, or single grids
+may be split. That kind of operation is already done implicitly in
+many cases (e.g. sending an integer or list to a grid-receiving inlet)
+but using this object you have greater flexibility on the conversion.
+;
+#X text 77 451 This equivalent to filtering the grid through an [#export]
+object. It is over ten times faster.;
+#X msg 157 125 per_message;
+#X msg 158 147 240 320 3;
+#X text 75 274 Begins a new grid if there is no current grid. puts
+that integer in the current grid. ends the grid if it is full. the
+constructed grid is not stored: it is streamed. the stream is buffered
+\, so the output is in packets of about a thousand numbers.;
+#X text 7 540 MESSAGE;
+#X text 81 539 "per message" : the grid will shape itself according
+to the incoming data. Almost obsolete as sending a list to any grid
+inlet will result in the same except the latter can not be cast to
+other than int32.;
+#X text 7 423 MESSAGE;
+#X text 74 422 "to_ascii \$1" converts ints as decimal in ascii codes
+;
+#X text 215 222 Inlets (2);
+#X obj 294 166 #import;
+#X msg 294 144 to_ascii \$1;
+#X floatatom 294 124 5 0 0 0 - - -;
+#X obj 294 188 #print;
+#X text 398 1 GridFlow 0.9.3;
+#X obj 12 0 #import;
+#X connect 10 0 19 0;
+#X connect 11 0 14 0;
+#X connect 12 0 19 0;
+#X connect 13 0 12 0;
+#X connect 14 0 13 0;
+#X connect 19 0 15 0;
+#X connect 34 0 19 1;
+#X connect 35 0 19 1;
+#X connect 42 0 45 0;
+#X connect 43 0 42 0;
+#X connect 44 0 43 0;
diff --git a/externals/gridflow/doc/flow_classes/#in-help.pd b/externals/gridflow/doc/flow_classes/#in-help.pd
new file mode 100644
index 00000000..f2f9a610
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#in-help.pd
@@ -0,0 +1,226 @@
+#N canvas 172 0 512 689 10;
+#X obj 354 172 #out window;
+#X obj 7 9 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 17 10 #in;
+#X text 13 34 This object imports a grid \, usually an image \, video
+or live stream.;
+#X msg 362 126 open working.jpg;
+#X obj 354 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X text 55 181 <--click here;
+#X obj 8 352 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 13 353 Inlet_0;
+#X text 79 379 A bang sends a grid to [#out]. Since frames from videos
+and live streams are read as a series of individual grids \, successive
+bangs advance through the frames.;
+#X text 77 466 "set" - followed by a number will select the corresponding
+video frame. A bang must be sent to [#in] in order to display the frame.
+;
+#X text 77 512 "close" - Closes the video input device. Only necessary
+when you are using a live capture device.;
+#X text 76 546 "rewind" - Will rewind video to the beginning.;
+#X text 76 600 "loop 0" - turns off the loop option. The video stops
+once it reaches the end.;
+#X text 81 862 Signals the end of a file and when a file is unreadable.
+;
+#X obj 8 789 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 9 790 Outlet_0;
+#X text 82 814 Displays the resulting grid when connected to [#out
+window];
+#X obj 10 839 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 840 Outlet_1;
+#X text 81 892 Displays the frame number of the frame currently being
+viewed. Applies to formats that have frame numbers \, i.e. video.;
+#X obj 7 328 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 201 329 Inlets (1);
+#N canvas 82 93 663 454 quicktime 0;
+#X text 9 9 The following messages can be used to set parameters for
+video (.mov) files.;
+#X text 128 283 different versions of LibQuickTime may include support
+for different codecs \, and some may also support entirely different
+wrapper formats such as AVI.;
+#X text 129 367 Codecs must be set before first frame is written.;
+#X text 128 330 QuickTime library for Macintosh: Apple QuickTime (some
+codecs/features may not be available).;
+#X obj 9 272 cnv 15 24 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X msg 38 230 codec jpg;
+#X msg 23 116 framerate 33;
+#X msg 33 203 colorspace rgb;
+#X msg 18 78 size 400 600;
+#X obj 10 272 #in;
+#X text 145 117 Number of frames per second.;
+#X msg 32 171 parameter jpeg_quality 85;
+#X text 187 147 Determines window size when reading a video file.;
+#X text 129 230 quicktime library for linux accepts LibQuickTime (libquicktime.so).
+codecs currently available are: Raw \, jpeg \, png \, mipa \, yuv2
+\, yuv4.;
+#X text 134 84 Sets height and width. Must be set before setting the
+codec parameters and after setting framerate and codec.;
+#X text 107 230 <--;
+#X text 108 80 <--;
+#X text 119 118 <--;
+#X text 108 80 <--;
+#X text 108 80 <--;
+#X text 162 147 <--;
+#X text 212 173 <--;
+#X text 139 206 <--;
+#X text 237 174 Sets compression quality (100 being the highest quality
+\, but a large file. 75-85 is the standard setting).;
+#X text 163 209 Other colorspaces include rgba \, bgr \, bgra \, yuv
+\, yuva.;
+#X msg 10 54 open example.mov;
+#X msg 28 145 force_size 480 640;
+#X obj 103 427 #record;
+#X text 15 427 see also :;
+#X connect 5 0 9 0;
+#X connect 6 0 9 0;
+#X connect 7 0 9 0;
+#X connect 8 0 9 0;
+#X connect 11 0 9 0;
+#X connect 25 0 9 0;
+#X connect 26 0 9 0;
+#X restore 145 688 pd quicktime file messages;
+#X obj 353 151 cnv 15 25 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 354 151 #in;
+#X obj 15 228 cnv 15 25 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X floatatom 202 195 5 0 0 0 - - -;
+#X msg 202 151 set 2;
+#X msg 202 107 loop 0;
+#X msg 202 129 loop 1;
+#X floatatom 32 285 5 0 0 0 - - -;
+#X msg 202 173 rewind;
+#X obj 41 267 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 16 228 #in;
+#X text 39 98 <--click here;
+#X obj 17 96 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 17 120 metro 33.3;
+#X obj 355 255 cnv 15 101 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 356 234 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 356 280 #out window;
+#X obj 356 255 #in sewing.jpg;
+#X text 378 234 <--click here;
+#X text 77 671 For info about messages specifically for quickTime files
+\, click on:;
+#N canvas 150 0 874 560 more 0;
+#X msg 191 388 open videodev \$1 \, get;
+#X msg 52 147 brightness 1000;
+#X msg 41 124 hue 1000;
+#X msg 26 101 color 1000;
+#X msg 65 171 contrast 1000;
+#X msg 14 78 whiteness 1000;
+#X msg 80 264 channel 2;
+#X msg 80 294 tuner 2;
+#X msg 81 324 norm 2;
+#X msg 81 352 frequency 2;
+#X msg 190 456 transfer mmap 4;
+#X msg 191 356 transfer read;
+#X msg 190 434 colorspace RGB24;
+#X msg 191 411 size 400 600;
+#X obj 14 441 #in;
+#X obj 192 172 #contrast;
+#X text 166 172 or;
+#X text 306 411 Sets height and width of the input.;
+#X text 322 488 In the case of mmap \, the extra numeric argument sets
+the queue length in number of frames \, so you can select an appropriate
+tradeoff between efficiency and latency.;
+#X text 16 12 Grid Settings;
+#X text 322 457 This is the standard and fastest way to receive pictures
+from the camera.;
+#X text 121 99 Message "get brightness" or "get" followed by any of
+the other colour attributes will display its values in the console.
+;
+#X text 375 390 Opens video device.;
+#X text 331 435 Supported values are RGB24 or YUV420P.;
+#X text 14 48 Color Adjustments;
+#X text 144 75 Values from 0 to 65535;
+#X text 283 412 <--;
+#X text 309 435 <--;
+#X text 345 390 <--;
+#X text 300 456 <--;
+#X text 287 357 <--;
+#X text 310 357 Some cameras/drivers only support "transfer read" and
+not mmap.;
+#X text 6 520 see also :;
+#X obj 92 520 #camera;
+#X connect 0 0 14 0;
+#X connect 1 0 14 0;
+#X connect 2 0 14 0;
+#X connect 3 0 14 0;
+#X connect 4 0 14 0;
+#X connect 5 0 14 0;
+#X connect 6 0 14 0;
+#X connect 7 0 14 0;
+#X connect 8 0 14 0;
+#X connect 9 0 14 0;
+#X connect 10 0 14 0;
+#X connect 11 0 14 0;
+#X connect 12 0 14 0;
+#X connect 13 0 14 0;
+#X restore 145 649 pd more info about video devices;
+#X text 77 632 For info about messages specifically for video devices
+\, click on:;
+#X text 8 813 GRID;
+#X text 10 863 BANG;
+#X text 9 890 INTEGER;
+#X text 7 962 FILE NAME;
+#X text 9 381 GRID;
+#X text 9 433 MESSAGE;
+#X text 8 727 INTEGER;
+#X text 169 213 (and turn off the metro);
+#X text 244 195 <-- vary this;
+#X obj 7 765 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 197 766 Outlets (2);
+#X text 197 766 Outlets (2);
+#X obj 8 943 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 195 944 Arguments;
+#X text 352 74 IMAGE FILES:;
+#X text 12 72 VIDEO FILES:;
+#X obj 28 183 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X text 380 106 <-- click here;
+#X text 68 265 <-- sends a bang upon reaching;
+#X text 97 278 the end of the file;
+#X obj 16 305 #out window \, title video;
+#X text 90 962 Including the file name of a grid into the [#in] object
+eliminates the need for an "open" message but limits the action to
+one specified grid.;
+#X text 77 432 "open" - followed by the filename \, sends it as a resource
+to [#out]. For example: "open sewing.jpg".;
+#X text 77 727 Outputs the frame that corresponds to the value. Applies
+to formats that have frame numbers \, i.e. video.;
+#X text 76 566 "loop 1" - Restarts a video each time it reaches the
+end (default setting).;
+#X obj 41 248 route bang;
+#X msg 24 147 open violoncelle.mov;
+#X text 402 10 GridFlow 0.9.1;
+#X connect 4 0 25 0;
+#X connect 5 0 25 0;
+#X connect 25 0 0 0;
+#X connect 27 0 34 0;
+#X connect 28 0 34 0;
+#X connect 29 0 34 0;
+#X connect 30 0 34 0;
+#X connect 32 0 34 0;
+#X connect 34 0 66 0;
+#X connect 34 1 31 0;
+#X connect 34 1 71 0;
+#X connect 36 0 37 0;
+#X connect 37 0 34 0;
+#X connect 39 0 41 0;
+#X connect 41 0 40 0;
+#X connect 62 0 34 0;
+#X connect 71 0 33 0;
+#X connect 72 0 34 0;
diff --git a/externals/gridflow/doc/flow_classes/#layer-help.pd b/externals/gridflow/doc/flow_classes/#layer-help.pd
new file mode 100644
index 00000000..1ba4a977
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#layer-help.pd
@@ -0,0 +1,28 @@
+#N canvas 297 445 656 323 10;
+#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 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 234 69 load b001.jpg;
+#X obj 211 96 #in;
+#X obj 237 96 #rgb_to_greyscale;
+#X obj 406 96 #in;
+#X msg 429 71 load g001.jpg;
+#X msg 41 71 load r001.jpg;
+#X obj 18 96 #in;
+#X obj 18 208 #layer;
+#X obj 18 161 @join -1;
+#X obj 18 269 #out window;
+#X text 14 5 #layer;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 13 1;
+#X connect 8 0 12 1;
+#X connect 9 0 8 0;
+#X connect 10 0 11 0;
+#X connect 11 0 13 0;
+#X connect 12 0 14 0;
+#X connect 13 0 12 0;
diff --git a/externals/gridflow/doc/flow_classes/#line_to_polygon-help.pd b/externals/gridflow/doc/flow_classes/#line_to_polygon-help.pd
new file mode 100644
index 00000000..8eb85df3
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#line_to_polygon-help.pd
@@ -0,0 +1,12 @@
+#N canvas 184 260 450 300 10;
+#X obj 51 156 #draw_polygon put (255 255 255);
+#X obj 51 175 #out window;
+#X msg 51 137 240 320 3 #;
+#X obj 279 165 display;
+#X msg 263 118 2 2 # 10 10 229 309;
+#X obj 263 137 #line_to_polygon 4;
+#X connect 0 0 1 0;
+#X connect 2 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 0 2;
+#X connect 5 0 3 0;
diff --git a/externals/gridflow/doc/flow_classes/#make_cross-help.pd b/externals/gridflow/doc/flow_classes/#make_cross-help.pd
new file mode 100644
index 00000000..31fa2c4c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#make_cross-help.pd
@@ -0,0 +1,26 @@
+#N canvas 444 135 450 300 10;
+#X obj 45 27 tgl 15 0 empty empty empty 17 7 0 10 -204786 -1 -1 0 1
+;
+#X obj 44 48 metro 100;
+#X obj 47 128 #out window;
+#X obj 43 100 #draw_polygon put (255 0 0);
+#X obj 198 74 #make_cross 120;
+#X msg 197 46 240 320;
+#X obj 195 21 loadbang;
+#X msg 284 49 150;
+#X obj 257 29 t b b;
+#X obj 257 7 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 43 71 #camera 0;
+#X text 314 47 change cross size;
+#X connect 0 0 1 0;
+#X connect 1 0 10 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 2;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 4 1;
+#X connect 8 0 5 0;
+#X connect 8 1 7 0;
+#X connect 9 0 8 0;
+#X connect 10 0 3 0;
diff --git a/externals/gridflow/doc/flow_classes/#moment-help.pd b/externals/gridflow/doc/flow_classes/#moment-help.pd
new file mode 100644
index 00000000..0fbe0306
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#moment-help.pd
@@ -0,0 +1,131 @@
+#N canvas 576 46 644 643 10;
+#X obj 19 24 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X msg 234 28 4 2 # 1 1 1 -1 -1 -1 -1 1;
+#X obj 111 208 display;
+#X obj 43 238 display;
+#X obj 234 66 #rotate;
+#X obj 288 56 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 -1831 256;
+#X obj 288 72 * 100;
+#X obj 18 587 #out window;
+#X obj 67 161 #t;
+#X obj 110 187 #moment;
+#X msg 41 85 240 320 1 #;
+#X obj 41 104 #draw_polygon put (1 # 255);
+#X obj 426 103 #pack;
+#X obj 234 85 # +;
+#X obj 456 87 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 -45 256;
+#X obj 426 71 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 12 256;
+#X obj 426 52 #pack;
+#X obj 456 36 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 32 256;
+#X obj 426 20 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 49 256;
+#X obj 234 47 # *;
+#X obj 245 123 # inv+;
+#X obj 245 104 # +;
+#X obj 426 154 #pack;
+#X obj 456 138 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 149 256;
+#X obj 426 122 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 128 256;
+#X obj 41 123 #draw_polygon put (1 # 255);
+#X text 162 550 red filter;
+#X text 121 85 draw rectangles;
+#X text 238 11 rectangle polygon;
+#X obj 42 186 #moment 2;
+#X obj 269 172 #moment_polar;
+#X obj 356 192 display;
+#X obj 270 212 display;
+#X obj 5 61 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X text 141 309 this is a fudge factor.;
+#X obj 18 606 fps;
+#X floatatom 18 625 5 0 0 0 - - -;
+#X text 143 321 depending on what you want to do \,;
+#X text 140 333 you set it to 2 \, 3 \, 4 \, whatever.;
+#X obj 402 364 #outer + (9000 0);
+#X obj 523 429 #transpose;
+#X obj 20 60 t b b b;
+#X obj 402 540 # + (120 160);
+#X obj 63 340 cv.SVD;
+#X obj 63 302 #cast f;
+#X obj 63 399 #inner \, seed (f #);
+#X obj 402 402 #cast f;
+#X obj 402 459 #inner \, seed (f #);
+#X obj 402 507 #cast i;
+#X obj 63 378 #swap;
+#X obj 402 326 #for 0 160 1;
+#X obj 63 359 # sqrt (f #);
+#X obj 63 321 # * (f # 3);
+#X obj 402 479 # / (f # 1000);
+#X obj 402 383 # cos* 1000;
+#X obj 402 345 # * 225;
+#X obj 18 549 #inner (1 3 # 1 0 0);
+#X obj 18 568 #draw_polygon + (0 255 255) (2 2 #);
+#X obj 19 41 metro 20;
+#X obj 18 144 #t;
+#X connect 0 0 58 0;
+#X connect 1 0 19 0;
+#X connect 4 0 13 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 1;
+#X connect 7 0 35 0;
+#X connect 8 0 29 0;
+#X connect 8 1 9 0;
+#X connect 9 0 2 0;
+#X connect 9 0 29 1;
+#X connect 9 0 42 1;
+#X connect 10 0 11 0;
+#X connect 11 0 25 0;
+#X connect 12 0 13 1;
+#X connect 13 0 21 0;
+#X connect 13 0 20 0;
+#X connect 14 0 12 1;
+#X connect 15 0 12 0;
+#X connect 16 0 19 1;
+#X connect 17 0 16 1;
+#X connect 18 0 16 0;
+#X connect 19 0 4 0;
+#X connect 20 0 25 2;
+#X connect 21 0 11 2;
+#X connect 22 0 21 1;
+#X connect 22 0 20 1;
+#X connect 23 0 22 1;
+#X connect 24 0 22 0;
+#X connect 25 0 59 0;
+#X connect 29 0 3 0;
+#X connect 29 0 30 0;
+#X connect 29 0 44 0;
+#X connect 30 0 32 0;
+#X connect 30 1 31 0;
+#X connect 33 0 41 0;
+#X connect 35 0 36 0;
+#X connect 39 0 54 0;
+#X connect 40 0 47 1;
+#X connect 41 0 50 0;
+#X connect 41 1 10 0;
+#X connect 41 2 1 0;
+#X connect 42 0 57 2;
+#X connect 43 0 51 0;
+#X connect 43 1 49 1;
+#X connect 44 0 52 0;
+#X connect 45 0 40 0;
+#X connect 46 0 47 0;
+#X connect 47 0 53 0;
+#X connect 48 0 42 0;
+#X connect 49 0 45 0;
+#X connect 49 1 45 1;
+#X connect 50 0 55 0;
+#X connect 51 0 49 0;
+#X connect 52 0 43 0;
+#X connect 53 0 48 0;
+#X connect 54 0 46 0;
+#X connect 55 0 39 0;
+#X connect 56 0 57 0;
+#X connect 57 0 7 0;
+#X connect 58 0 41 0;
+#X connect 59 0 56 0;
+#X connect 59 1 8 0;
diff --git a/externals/gridflow/doc/flow_classes/#moment_polar-help.pd b/externals/gridflow/doc/flow_classes/#moment_polar-help.pd
new file mode 100644
index 00000000..ea9ba995
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#moment_polar-help.pd
@@ -0,0 +1,11 @@
+#N canvas 387 219 527 300 10;
+#X obj 37 167 #moment-help;
+#X obj 40 30 #moment_polar;
+#X text 48 50 inlet 0: covariance matrix \, from [#moment 2] or compatible.
+;
+#X text 112 65 must be a 2x2 symmetric matrix.;
+#X text 48 92 outlet 0: angle (only makes sense with a 2x2 matrix)
+as int;
+#X text 48 112 outlet 1: radiuses (from biggest to smallest) as float
+grid;
+#X text 30 151 please open this other help patch for a demo:;
diff --git a/externals/gridflow/doc/flow_classes/#motion_detection-help.pd b/externals/gridflow/doc/flow_classes/#motion_detection-help.pd
new file mode 100644
index 00000000..15658a8b
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#motion_detection-help.pd
@@ -0,0 +1,44 @@
+#N canvas 1267 0 485 405 10;
+#X obj 47 40 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X obj 47 342 print;
+#X obj 47 319 fps detailed;
+#X obj 47 68 metro 33.3667;
+#X obj 47 92 #camera;
+#X obj 96 159 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 115 159 motion;
+#X text 116 173 presence;
+#X obj 0 1 cnv 15 620 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 13 14 Copyright 2002 Mathieu Bouchard;
+#X floatatom 223 264 7 0 0 0 - - -;
+#X obj 47 295 #out window;
+#X obj 209 195 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 74 130 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X text 208 129 reduce the noise in the image;
+#X obj 156 264 nbx 5 14 -1e+37 1e+37 0 0 empty empty y -10 4 0 10 -24198
+-1 -1 138 256;
+#X obj 85 264 nbx 5 14 -1e+37 1e+37 0 0 empty empty x -10 4 0 10 -24198
+-1 -1 116 256;
+#X text 13 0 help_motion_detection.pd;
+#X obj 47 210 #motion_detection;
+#X text 279 263 total amount of change;
+#X text 227 195 scary militaristic crosshair;
+#X obj 177 169 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X text 195 169 fade;
+#X connect 0 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 18 0;
+#X connect 5 0 18 2;
+#X connect 11 0 2 0;
+#X connect 12 0 18 4;
+#X connect 13 0 18 1;
+#X connect 18 0 11 0;
+#X connect 18 1 16 0;
+#X connect 18 2 15 0;
+#X connect 18 3 10 0;
+#X connect 21 0 18 3;
diff --git a/externals/gridflow/doc/flow_classes/#mouse-help.pd b/externals/gridflow/doc/flow_classes/#mouse-help.pd
new file mode 100644
index 00000000..a0a57bad
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#mouse-help.pd
@@ -0,0 +1,55 @@
+#N canvas 215 0 776 547 10;
+#X msg 147 123 setcursor 32;
+#X text 49 22 How to get the mouse coordinates and hide / change the
+cursor?;
+#X msg 128 100 hidecursor;
+#X text 273 98 <-- removes the cursor;
+#X text 307 120 <-- accepts 0 - 63;
+#X obj 206 168 print xy_clicked;
+#X obj 207 214 print xy_unclicked;
+#X obj 107 341 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 127 341 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 147 341 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+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 380 376 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 400 376 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 420 376 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#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 obj 110 165 #out window;
+#X obj 110 267 #mouse \, ...;
+#X obj 380 402 #pack 3;
+#X connect 0 0 21 0;
+#X connect 2 0 21 0;
+#X connect 11 0 12 0;
+#X connect 11 0 10 0;
+#X connect 12 0 11 1;
+#X connect 15 0 23 0;
+#X connect 16 0 23 1;
+#X connect 17 0 23 2;
+#X connect 18 0 22 1;
+#X connect 19 0 15 0;
+#X connect 19 0 16 0;
+#X connect 19 0 17 0;
+#X connect 21 0 22 0;
+#X connect 22 0 5 0;
+#X connect 22 1 14 0;
+#X connect 22 2 6 0;
+#X connect 22 3 13 0;
+#X connect 22 4 7 0;
+#X connect 22 5 8 0;
+#X connect 22 6 9 0;
+#X connect 22 7 11 0;
+#X connect 23 0 18 0;
diff --git a/externals/gridflow/doc/flow_classes/#numop-help.pd b/externals/gridflow/doc/flow_classes/#numop-help.pd
new file mode 100644
index 00000000..6c5caec0
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#numop-help.pd
@@ -0,0 +1,365 @@
+#N canvas 106 82 735 448 10;
+#X obj 278 136 cnv 15 450 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 410 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X obj 8 8 cnv 15 720 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 278 222 cnv 15 450 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 267 46 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 270 45 Arguments:;
+#X obj 268 292 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 271 292 Outlets:;
+#X obj 8 46 cnv 15 250 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 11 46 Usage:;
+#X obj 8 67 cnv 15 250 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 104 cnv 15 250 300 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 266 355 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 269 355 More Info:;
+#X text 281 136 0: (Leftmost);
+#X text 281 222 1: (Rightmost);
+#X text 12 8 SUMMARY:;
+#X text 73 8 Transforms a grid by applying mathematical operations
+in order to generate effects on a pixel by pixel basis.;
+#X obj 109 76 # +;
+#X floatatom 31 234 5 0 0 0 - - -;
+#X obj 42 288 display;
+#X obj 15 149 #color;
+#X msg 15 116 255 0 0;
+#X obj 15 331 #color;
+#X text 281 74 One - see: inlet 1: (Rightmost);
+#X obj 267 101 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 270 101 Inlets: (Read left to right \, inlet "0" being the
+leftmost);
+#X text 283 313 One - outputs the transformed grid.;
+#X text 16 417 GridFlow 0.8.0;
+#X obj 15 258 # +;
+#X text 292 242 Integer - Accepts integers that modify the incoming
+grid.;
+#N canvas 15 0 912 644 numop 1;
+#X text 76 366 A + B;
+#X text 77 510 A * B;
+#X text 73 571 rounded towards zero;
+#X text 14 73 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 13 44 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 text 902 31 GridFlow 0.8.0;
+#X obj 479 70 #color;
+#X obj 684 72 #color;
+#X msg 15 366 op +;
+#X msg 15 507 op *;
+#X obj 15 385 s op;
+#X obj 423 155 r op;
+#X obj 15 526 s op;
+#X obj 15 436 s op;
+#X text 77 421 A - B;
+#X msg 15 417 op -;
+#X obj 15 761 s op;
+#X msg 15 742 op %;
+#X text 69 743 A % B;
+#X obj 15 575 s op;
+#X msg 15 556 op /;
+#X text 79 557 A / B;
+#X obj 14 809 s op;
+#X text 83 790 B % A;
+#X text 15 14 Numeric Operators: *whoa \, there's a lot of them;
+#X obj 16 482 s op;
+#X msg 16 463 op inv+;
+#X text 79 464 B -A;
+#X obj 15 623 s op;
+#X text 79 605 A / B;
+#X msg 15 604 op div;
+#X text 75 621 rounded downwards;
+#X obj 15 668 s op;
+#X msg 15 649 op inv*;
+#X text 80 650 B / A;
+#X text 77 665 rounded towards 0;
+#X obj 15 712 s op;
+#X text 76 714 rounded downwards;
+#X text 101 695 B / A;
+#X text 68 760 modulo (goes with div);
+#X text 65 809 modulo (goes with div);
+#X msg 14 790 op swap%;
+#X obj 15 286 s op;
+#X obj 15 334 s op;
+#X msg 15 267 op ignore;
+#X text 90 268 A;
+#X msg 15 315 op put;
+#X text 76 315 B;
+#X msg 15 693 op swapdiv;
+#X obj 237 286 s op;
+#X msg 237 267 op rem;
+#X text 315 263 A % B;
+#X obj 236 338 s op;
+#X text 330 319 B % A;
+#X text 314 278 remainder;
+#X text 314 293 (goes with /);
+#X msg 236 319 op swaprem;
+#X text 327 333 remainder;
+#X text 326 348 (goes with /);
+#X obj 236 388 s op;
+#X obj 236 435 s op;
+#X msg 236 369 op gcd;
+#X msg 236 416 op lcm;
+#X text 298 373 greatest common divisor;
+#X text 298 420 least common multiple;
+#X obj 235 481 s op;
+#X text 299 464 A or B \, bitwise;
+#X msg 235 462 op;
+#X obj 235 525 s op;
+#X text 299 508 A xor B \, bitwise;
+#X msg 235 506 op ^;
+#X obj 235 578 s op;
+#X msg 235 559 op &;
+#X text 300 561 A and B \, bitwise;
+#X obj 235 623 s op;
+#X msg 235 604 op <<;
+#X text 300 606 A * (2**(B % 32);
+#X text 299 621 left-shifthing;
+#X obj 235 669 s op;
+#X msg 235 649 op >>;
+#X text 299 666 right-shifthing;
+#X text 300 652 A / (2**(B % 32);
+#X obj 218 463 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X obj 235 714 s op;
+#X msg 235 695 op;
+#X obj 218 695 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X text 299 697 if A is zero then;
+#X text 300 711 B else A;
+#X obj 235 758 s op;
+#X text 299 741 if A is zero then;
+#X msg 235 739 op &&;
+#X text 300 755 zero else B;
+#X obj 236 807 s op;
+#X msg 236 788 op min;
+#X text 300 789 the lowest value;
+#X text 301 804 in A \, B;
+#X obj 500 287 s op;
+#X msg 500 267 op max;
+#X text 556 284 in A \, B;
+#X text 557 268 the highest value;
+#X obj 500 333 s op;
+#X msg 500 313 op cmp;
+#X text 551 310 -1 when A<B;
+#X text 558 338 1 when A>B;
+#X text 558 324 0 when A=B;
+#X obj 500 386 s op;
+#X msg 500 366 op ==;
+#X text 557 367 is A equal to B ?;
+#X text 556 385 1 = true \, 0 = false;
+#X obj 500 433 s op;
+#X msg 500 413 op !=;
+#X text 557 414 is A not equal to B ?;
+#X obj 500 477 s op;
+#X msg 500 456 op >;
+#X text 557 457 is A greater than B ?;
+#X obj 500 523 s op;
+#X msg 500 502 op <=;
+#X text 557 503 is A not greater than B ?;
+#X obj 500 572 s op;
+#X msg 500 551 op <;
+#X text 557 552 is A less than B ?;
+#X obj 500 618 s op;
+#X msg 500 597 op >=;
+#X text 557 598 is A not less than B ?;
+#X obj 500 666 s op;
+#X msg 500 645 op sin*;
+#X text 559 646 B * sin(A);
+#X obj 500 713 s op;
+#X msg 500 691 op cos*;
+#X text 560 693 B * cos(A);
+#X obj 500 758 s op;
+#X msg 500 736 op atan;
+#X text 560 737 arctan(A/B);
+#X obj 499 805 s op;
+#X msg 499 783 op tan*;
+#X text 559 784 tanh(A);
+#X obj 738 288 s op;
+#X msg 738 268 op log*;
+#X text 795 269 B*log(A);
+#X text 794 286 in base e;
+#X obj 738 334 s op;
+#X msg 738 314 op gamma;
+#X text 809 314 floor(pow(a/256.0 \, 256.0/b)*256.0);
+#X obj 737 385 s op;
+#X msg 737 366 op **;
+#X text 799 368 A**B;
+#X text 799 385 A raised to power B;
+#X obj 737 431 s op;
+#X msg 737 412 op abs-;
+#X text 799 412 absolute value of (A-B);
+#X obj 737 478 s op;
+#X msg 737 459 op rand;
+#X text 800 473 number below A;
+#X text 799 458 randomly produces a non-negative;
+#X obj 737 524 s op;
+#X msg 737 505 op sqrt;
+#X text 799 504 square root of A;
+#X text 800 519 rounded downwards;
+#X obj 737 566 s op;
+#X msg 737 547 op sq-;
+#X text 800 546 (A-B) times (A-B);
+#X obj 740 614 s op;
+#X obj 723 595 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X msg 740 595 op clip+;
+#X text 808 595 A+B but output is clipped;
+#X obj 740 660 s op;
+#X obj 723 641 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X msg 740 641 op clip-;
+#X text 808 641 A-B but output is clipped;
+#X obj 740 706 s op;
+#X obj 740 750 s op;
+#X text 808 687 (A+B)/2;
+#X msg 740 687 op avg;
+#X msg 740 731 op hypot;
+#X text 808 731 square root of (A*A+B*B);
+#X obj 740 792 s op;
+#X obj 723 773 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X msg 740 773 op erf;
+#X text 807 773 integral of e^(-x*x)dx;
+#N canvas 8 30 615 351 all_operators 0;
+#X obj 174 99 # -;
+#X obj 522 97 # swap%;
+#X obj 186 177 # abs-;
+#X obj 238 177 # rand;
+#X obj 342 177 # sq-;
+#X obj 290 177 # sqrt;
+#X obj 144 99 # +;
+#X obj 492 97 # %;
+#X obj 260 99 # *;
+#X obj 289 99 # /;
+#X obj 206 99 # inv+;
+#X obj 321 99 # div;
+#X obj 367 98 # inv*;
+#X obj 420 98 # swapdiv;
+#X obj 35 99 # ignore;
+#X obj 100 100 # put;
+#X obj 35 125 # rem;
+#X obj 78 125 # swaprem;
+#X obj 149 125 # gcd;
+#X obj 191 125 # lcm;
+#X obj 234 125 # |;
+#X obj 234 125 # |;
+#X obj 263 125 # ^;
+#X obj 293 125 # &;
+#X obj 322 125 # <<;
+#X obj 358 125 # >>;
+#X obj 394 125 # ||;
+#X obj 431 125 # &&;
+#X obj 467 125 # min;
+#X obj 35 151 # max;
+#X obj 79 151 # cmp;
+#X obj 124 151 # ==;
+#X obj 162 151 # !=;
+#X obj 199 151 # >;
+#X obj 234 151 # <=;
+#X obj 274 151 # <;
+#X obj 304 152 # >=;
+#X obj 341 152 # sin*;
+#X obj 391 152 # cos*;
+#X obj 442 152 # atan;
+#X obj 493 152 # tanh*;
+#X obj 35 177 # log*;
+#X obj 87 177 # gamma;
+#X obj 148 177 # **;
+#X obj 388 177 # avg;
+#X obj 433 177 # hypot;
+#X restore 15 174 pd all_operators;
+#X text 585 31 select values below;
+#X text 14 233 select an operator below;
+#X text 478 51 A;
+#X text 683 53 B;
+#X obj 479 182 # +;
+#X obj 257 196 #color;
+#X obj 297 162 #reverse;
+#X obj 443 215 display;
+#X obj 656 197 #unpack 3;
+#X floatatom 605 244 5 0 0 0 - - -;
+#X obj 642 150 t a a;
+#X obj 597 191 display;
+#X connect 7 0 185 0;
+#X connect 7 0 187 0;
+#X connect 7 0 191 0;
+#X connect 8 0 185 1;
+#X connect 9 0 11 0;
+#X connect 10 0 13 0;
+#X connect 12 0 185 0;
+#X connect 16 0 14 0;
+#X connect 18 0 17 0;
+#X connect 21 0 20 0;
+#X connect 27 0 26 0;
+#X connect 31 0 29 0;
+#X connect 34 0 33 0;
+#X connect 42 0 23 0;
+#X connect 45 0 43 0;
+#X connect 47 0 44 0;
+#X connect 49 0 37 0;
+#X connect 51 0 50 0;
+#X connect 57 0 53 0;
+#X connect 62 0 60 0;
+#X connect 63 0 61 0;
+#X connect 68 0 66 0;
+#X connect 71 0 69 0;
+#X connect 73 0 72 0;
+#X connect 76 0 75 0;
+#X connect 80 0 79 0;
+#X connect 85 0 84 0;
+#X connect 91 0 89 0;
+#X connect 94 0 93 0;
+#X connect 98 0 97 0;
+#X connect 102 0 101 0;
+#X connect 107 0 106 0;
+#X connect 111 0 110 0;
+#X connect 114 0 113 0;
+#X connect 117 0 116 0;
+#X connect 120 0 119 0;
+#X connect 123 0 122 0;
+#X connect 126 0 125 0;
+#X connect 129 0 128 0;
+#X connect 132 0 131 0;
+#X connect 135 0 134 0;
+#X connect 138 0 137 0;
+#X connect 142 0 141 0;
+#X connect 145 0 144 0;
+#X connect 149 0 148 0;
+#X connect 152 0 151 0;
+#X connect 156 0 155 0;
+#X connect 160 0 159 0;
+#X connect 164 0 162 0;
+#X connect 168 0 166 0;
+#X connect 173 0 170 0;
+#X connect 174 0 171 0;
+#X connect 178 0 176 0;
+#X connect 187 0 186 0;
+#X connect 187 0 188 0;
+#X connect 189 0 190 0;
+#X connect 191 0 192 0;
+#X connect 191 1 189 0;
+#X restore 265 380 pd numop;
+#X text 290 157 Grid - Accepts a grid to be modified by an operator
+consistent with the right inlet value (list of operators in [pd numop]).
+In this example [# +] is used.;
+#X text 72 234 <-- change this value to modify the operation.;
+#X text 193 154 <--modify color with sliders.;
+#X connect 19 0 29 1;
+#X connect 21 0 29 0;
+#X connect 22 0 21 0;
+#X connect 29 0 20 0;
+#X connect 29 0 23 0;
diff --git a/externals/gridflow/doc/flow_classes/#out-help.pd b/externals/gridflow/doc/flow_classes/#out-help.pd
new file mode 100644
index 00000000..13fb52d4
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#out-help.pd
@@ -0,0 +1,159 @@
+#N canvas 512 0 624 877 10;
+#X obj 4 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 13 296 cnv 15 185 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 6 677 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 372 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 395 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 678 Outlets (1);
+#X obj 6 766 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 765 Arguments (1);
+#X obj 6 698 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 13 1 #out;
+#X obj 15 326 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 10 71 Displaying a grid:;
+#X text 342 73 Saving a grid:;
+#X text 6 456 MESSAGE;
+#X text 8 424 GRID;
+#X text 7 493 MESSAGE;
+#X text 8 569 MESSAGE;
+#X text 75 569 "rewind" rewinds to the beginning of a video file. Will
+overwrite previous data.;
+#X text 79 606 "timelog 1" will display (in the console) the current
+time and the time since the last frame. Message "timelog 0" will hide
+this information. The default is "timelog 0".;
+#X text 8 603 MESSAGE;
+#X text 206 374 Inlets (1);
+#X text 31 794 window [#out window] opens a window in which the grid
+will be displayed.;
+#X text 7 732 BANG;
+#X msg 45 150 open working.jpg;
+#X obj 15 100 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 15 221 #in;
+#X msg 66 229 open window;
+#X msg 65 252 close;
+#X text 75 493 "close" closes the file and hides the display \, must
+be accompanied by message "open window" to reopen the display.;
+#X text 9 396 Inlet 0;
+#X text 7 700 Outlet 0;
+#X text 75 732 A bang notifies when a complete grid has been received.
+;
+#N canvas 140 137 570 631 More 0;
+#X obj 35 266 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 0 1
+;
+#X text 203 143 open default display for screenshot;
+#X msg 82 197 open videodev /dev/video0;
+#X text 277 196 open a video device;
+#X msg 187 388 open x11 here;
+#X msg 158 337 open x11 local 10;
+#X text 116 287 show/hide timing statistics;
+#X text 298 390 connect to default display;
+#X text 297 338 connect to display #10 on this machine;
+#X msg 65 313 open x11 remote.host.bla.net 0;
+#X text 297 315 connect to remote machine on display #0;
+#X text 202 114 open an image file;
+#X msg 242 437 close;
+#X msg 83 142 open x11 here;
+#X msg 200 413 open window;
+#X text 299 413 opens a window x11 \, quartz or sdl;
+#X msg 35 288 timelog \$1;
+#X text 37 502 An incoming file is sent through the opened device/socket/file.
+In single file format \, a subsequent picture 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 obj 23 223 cnv 15 23 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 23 223 #in;
+#X obj 23 480 cnv 15 30 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 5 13 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 14 14 #out;
+#X obj 23 480 #out;
+#X msg 53 114 open sewing.jpg;
+#X obj 23 72 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 23 93 t b b;
+#X msg 83 170 open lsd.mov;
+#X text 203 169 open a quicktime video;
+#X obj 97 74 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 165 363 open save_here.jpg;
+#X text 298 362 select file to write to in jpg format;
+#X text 39 579 Message "open" followed by the format of the specific
+grid opens a grid (usually an image) to then be displayed or saved
+by [#out].;
+#X text 14 36 #out communicating grids (images) to/from devices \,
+sockets \, files;
+#X connect 0 0 16 0;
+#X connect 2 0 19 0;
+#X connect 4 0 23 0;
+#X connect 5 0 23 0;
+#X connect 9 0 23 0;
+#X connect 12 0 23 0;
+#X connect 13 0 19 0;
+#X connect 14 0 23 0;
+#X connect 16 0 23 0;
+#X connect 19 0 23 0;
+#X connect 24 0 19 0;
+#X connect 25 0 26 0;
+#X connect 26 0 19 0;
+#X connect 26 1 24 0;
+#X connect 27 0 19 0;
+#X connect 29 0 19 0;
+#X connect 30 0 23 0;
+#X restore 140 334 pd More info about this object;
+#X text 77 426 Receives a grid.;
+#X text 398 0 GridFlow 0.9.0;
+#X text 12 32 Displays or saves an incoming grid (usually an image
+or a video).;
+#X obj 15 296 #out window \, title example;
+#X msg 207 145 open sewing.jpg;
+#X obj 15 126 t b b;
+#X obj 177 121 t b b;
+#X obj 177 97 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 96 846 #record;
+#X msg 366 228 open somefile.jpg;
+#X text 9 845 see also :;
+#X text 73 451 "open filename.format" (ex: "open somefile.jpg") sets
+the filename to write to.;
+#X msg 381 144 open sewing.jpg;
+#X obj 351 120 t b b;
+#X obj 351 96 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 351 190 #in;
+#X obj 351 267 cnv 15 30 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 351 266 #out;
+#X msg 127 262 hidecursor;
+#X text 205 261 <-- linux only;
+#X text 7 533 MESSAGE;
+#X text 75 533 "hidecursor" (linux only) hides the mouse cursor.;
+#X connect 23 0 25 0;
+#X connect 24 0 38 0;
+#X connect 25 0 36 0;
+#X connect 26 0 36 0;
+#X connect 27 0 36 0;
+#X connect 36 0 10 0;
+#X connect 37 0 25 0;
+#X connect 38 0 25 0;
+#X connect 38 1 23 0;
+#X connect 39 0 25 0;
+#X connect 39 1 37 0;
+#X connect 40 0 39 0;
+#X connect 42 0 50 0;
+#X connect 45 0 48 0;
+#X connect 46 0 48 0;
+#X connect 46 1 45 0;
+#X connect 47 0 46 0;
+#X connect 48 0 50 0;
+#X connect 51 0 36 0;
diff --git a/externals/gridflow/doc/flow_classes/#outer-help.pd b/externals/gridflow/doc/flow_classes/#outer-help.pd
new file mode 100644
index 00000000..72361cdd
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#outer-help.pd
@@ -0,0 +1,70 @@
+#N canvas 23 44 613 383 10;
+#X obj 19 39 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 19 130 spigot;
+#X obj 100 130 spigot;
+#X obj 67 130 == 0;
+#X obj 67 39 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 0 1
+;
+#X text 171 178 @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 40 select pattern;
+#X text 17 296 combine channelless picture with gamma factors (r \,
+g \, b);
+#X obj 19 89 until;
+#X msg 19 68 128;
+#X obj 60 89 float 1;
+#X obj 115 89 + 1;
+#X obj 171 90 until;
+#X obj 212 90 float 1;
+#X obj 267 90 + 1;
+#X msg 171 69 4;
+#X text 665 16 gridflow;
+#X text 8 328 see also:;
+#X obj 19 277 @out window;
+#X text 18 10 #outer;
+#X obj 129 333 @join;
+#X obj 171 333 #finished;
+#X obj 76 333 #scan +;
+#X obj 241 333 #cast;
+#X obj 283 333 #ravel;
+#X obj 331 333 #grade;
+#X obj 380 333 #perspective;
+#X obj 171 111 #import (3);
+#X obj 171 132 # * 128;
+#X obj 19 109 #import (128);
+#X obj 19 162 #outer +;
+#X obj 100 161 #outer ^;
+#X obj 100 181 # * 2;
+#X obj 19 255 #outer gamma;
+#X connect 0 0 9 0;
+#X connect 0 0 15 0;
+#X connect 1 0 30 0;
+#X connect 1 0 30 1;
+#X connect 2 0 31 0;
+#X connect 2 0 31 1;
+#X connect 3 0 2 1;
+#X connect 4 0 1 1;
+#X connect 4 0 3 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 0;
+#X connect 10 0 11 0;
+#X connect 10 0 29 0;
+#X connect 11 0 10 1;
+#X connect 12 0 13 0;
+#X connect 13 0 14 0;
+#X connect 13 0 27 0;
+#X connect 14 0 13 1;
+#X connect 15 0 12 0;
+#X connect 27 0 28 0;
+#X connect 28 0 33 1;
+#X connect 29 0 1 0;
+#X connect 29 0 2 0;
+#X connect 30 0 33 0;
+#X connect 31 0 32 0;
+#X connect 32 0 33 0;
+#X connect 33 0 18 0;
diff --git a/externals/gridflow/doc/flow_classes/#pack-help.pd b/externals/gridflow/doc/flow_classes/#pack-help.pd
new file mode 100644
index 00000000..c11d22d0
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#pack-help.pd
@@ -0,0 +1,44 @@
+#N canvas 379 12 503 503 10;
+#X obj 2 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 340 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 260 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 283 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 203 342 Outlets (1);
+#X obj 2 429 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 361 cnv 15 65 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 12 1 #pack;
+#X obj 23 178 #color;
+#X floatatom 85 77 5 0 0 0 - - -;
+#X floatatom 107 96 5 0 0 0 - - -;
+#X floatatom 129 115 5 0 0 0 - - -;
+#X text 14 28 Creates a one dimentional grid (Dim(N) vector) from individual
+integers.;
+#X text 6 459 INTEGER;
+#X text 73 459 An integer defines the number of inlets and the amount
+of grid dimensions.;
+#X text 204 262 Inlets (n);
+#X text 4 316 INTEGER;
+#X text 10 395 GRID;
+#X obj 263 180 display;
+#X text 162 90 <--click and drag to place numbers in the grid.;
+#X obj 85 135 cnv 15 51 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 85 135 #pack 3;
+#X text 76 315 Accepts integers.;
+#X text 72 392 Outputs values from each individual inlet into a grid.
+;
+#X text 5 284 Inlet All;
+#X text 6 362 Outlet 0;
+#X text 204 430 Arguments;
+#X text 395 1 GridFlow 0.9.0;
+#X connect 9 0 21 0;
+#X connect 10 0 21 1;
+#X connect 11 0 21 2;
+#X connect 21 0 8 0;
+#X connect 21 0 18 0;
diff --git a/externals/gridflow/doc/flow_classes/#pack_and_#unpack-help.pd b/externals/gridflow/doc/flow_classes/#pack_and_#unpack-help.pd
new file mode 100644
index 00000000..87fa2694
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#pack_and_#unpack-help.pd
@@ -0,0 +1,85 @@
+#N canvas 109 540 736 659 10;
+#X obj 268 124 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X obj 278 148 cnv 15 450 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 641 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X obj 7 5 cnv 15 720 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 268 43 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 271 43 Arguments:;
+#X obj 268 267 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 271 267 Outlets:;
+#X obj 8 43 cnv 15 250 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 11 43 Usage:;
+#X obj 8 63 cnv 15 250 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 100 cnv 15 250 200 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 271 124 Inlets: (Read left to right \, inlet "0" being the
+leftmost);
+#X obj 80 71 #pack;
+#X text 11 5 SUMMARY:;
+#X text 76 5 Creates a one dimentional grid (Dim(N) vector) from individual
+integers.;
+#X obj 30 222 #color;
+#X floatatom 30 114 5 0 0 0 - - -;
+#X floatatom 52 142 5 0 0 0 - - -;
+#X floatatom 74 170 5 0 0 0 - - -;
+#X obj 30 196 #pack 3;
+#X text 283 63 One - [integer] defines the number of inlets and the
+amount of grid dimensions.;
+#X text 289 175 Integer - accepts multiple integers as defined by the
+argument and creates a vector.;
+#X text 283 287 One - outputs values from each individual inlet.;
+#X obj 270 483 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X obj 281 503 cnv 15 450 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 7 335 cnv 15 720 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 268 373 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 271 373 Arguments:;
+#X obj 268 595 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 271 595 Outlets:;
+#X obj 8 373 cnv 15 250 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 11 373 Usage:;
+#X obj 8 393 cnv 15 250 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 430 cnv 15 250 200 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 273 482 Inlets: (Read left to right \, inlet "0" being the
+leftmost);
+#X text 11 335 SUMMARY:;
+#X obj 79 400 #unpack;
+#X obj 30 518 #unpack 3;
+#X obj 30 451 #color;
+#X floatatom 30 601 5 0 0 0 - - -;
+#X floatatom 59 574 5 0 0 0 - - -;
+#X floatatom 88 549 5 0 0 0 - - -;
+#X text 283 393 One - [integer] defines the number of outlets and the
+amount of grid dimensions.;
+#X text 281 148 All:;
+#X text 283 503 All:;
+#X text 284 529 Grid - receives grids and outputs integers.;
+#X text 289 218 Grid - receives grids and outputs integers.;
+#X text 77 335 Outputs individual integers corresponding to the vector
+dimensions (number of elements in a grid).;
+#X text 284 615 All - outputs the vector dimensions as individual integers.
+;
+#X text 17 648 GridFlow 0.8.0;
+#X connect 17 0 20 0;
+#X connect 18 0 20 1;
+#X connect 19 0 20 2;
+#X connect 20 0 16 0;
+#X connect 38 0 40 0;
+#X connect 38 1 41 0;
+#X connect 38 2 42 0;
+#X connect 39 0 38 0;
diff --git a/externals/gridflow/doc/flow_classes/#perspective-help.pd b/externals/gridflow/doc/flow_classes/#perspective-help.pd
new file mode 100644
index 00000000..eef22c09
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#perspective-help.pd
@@ -0,0 +1,26 @@
+#N canvas 280 56 664 282 10;
+#X text 413 215 see also:;
+#X text 597 12 gridflow;
+#X text 24 15 @perspective;
+#X text 153 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 obj 30 147 #pack 3;
+#X floatatom 75 102 5 0 0 0 - - -;
+#X obj 77 120 max 1;
+#X floatatom 12 115 5 0 0 0 - - -;
+#X floatatom 52 77 5 0 0 0 - - -;
+#X obj 30 210 #print;
+#X obj 269 210 #print;
+#X obj 269 173 #perspective;
+#X obj 487 214 #redim;
+#X obj 540 214 #ravel;
+#X connect 4 0 9 0;
+#X connect 4 0 11 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 2;
+#X connect 7 0 4 0;
+#X connect 8 0 4 1;
+#X connect 11 0 10 0;
diff --git a/externals/gridflow/doc/flow_classes/#polygon_comparator-help.pd b/externals/gridflow/doc/flow_classes/#polygon_comparator-help.pd
new file mode 100644
index 00000000..cdb35df8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_comparator-help.pd
@@ -0,0 +1,69 @@
+#N canvas 271 133 749 424 10;
+#X obj 422 218 #outer + (0 9000);
+#X text 430 162 make regular triangle;
+#X obj 422 316 #rotate;
+#X obj 374 142 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 475 316 * 100;
+#X floatatom 475 300 5 0 0 0 - - -;
+#X obj 392 161 t b b;
+#X obj 422 335 #polygon_comparator;
+#X obj 373 161 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 422 275 #t;
+#X obj 393 142 metro 1000;
+#X text 32 364 BUG: first try doesn't work;
+#X text 69 375 please bang twice;
+#X msg 556 206 4 2 # 1 1 1 -1 -1 -1 -1 1;
+#X obj 597 252 display;
+#X obj 422 199 # * 12000;
+#X obj 422 180 #for 0 3 1;
+#X obj 556 226 # * (100 100);
+#X obj 422 256 # + (0 0);
+#X obj 422 237 # cos* (100 100);
+#X obj 382 367 #fold min;
+#X obj 462 367 #fold max;
+#X obj 382 386 #export;
+#X obj 462 386 #export;
+#X obj 557 185 loadbang;
+#X obj 382 405 nbx 8 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 9
+-262144 -1 -1 0 256;
+#X obj 462 405 nbx 8 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 9
+-262144 -1 -1 0 256;
+#X text 11 66 inlet 1: a 2-D polygon as N by 2 grid;
+#X text 11 16 inlet 0: a 2-D polygon as N by 2 grid;
+#X text 74 30 or method "precision" for setting the size of the output
+grid.;
+#X text 73 80 in which the peak represents the amount of similarity
+between the two polygons \, and the position of the peak represents
+the optimal rotation for maximum overlapping of the polygons. The rotation
+origin is assumed to be the centroid (#moment 1);
+#X text 25 348 NOTE: requires [#fft];
+#X text 8 179 Comparisons are supposed to be invariant to the following
+transformation:;
+#X text 33 213 translations \, e.g. [# +];
+#X text 33 231 rotations \, e.g. [#rotate];
+#X text 33 249 scalar scalings \, e.g. [# *] with only one value.;
+#X connect 0 0 19 0;
+#X connect 2 0 7 0;
+#X connect 3 0 10 0;
+#X connect 4 0 2 1;
+#X connect 5 0 4 0;
+#X connect 6 1 16 0;
+#X connect 7 0 20 0;
+#X connect 7 0 21 0;
+#X connect 8 0 6 0;
+#X connect 9 0 2 0;
+#X connect 10 0 6 0;
+#X connect 13 0 17 0;
+#X connect 15 0 0 0;
+#X connect 16 0 15 0;
+#X connect 17 0 14 0;
+#X connect 17 0 7 1;
+#X connect 18 0 9 0;
+#X connect 19 0 18 0;
+#X connect 20 0 22 0;
+#X connect 21 0 23 0;
+#X connect 22 0 25 0;
+#X connect 23 0 26 0;
+#X connect 24 0 13 0;
diff --git a/externals/gridflow/doc/flow_classes/#polygon_each_edge-help.pd b/externals/gridflow/doc/flow_classes/#polygon_each_edge-help.pd
new file mode 100644
index 00000000..4765fe7f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_each_edge-help.pd
@@ -0,0 +1,12 @@
+#N canvas 502 236 450 158 10;
+#X text 220 35 very small square;
+#X text 174 68 enumerate edges;
+#X obj 41 109 #print;
+#X text 52 88 each edge is a vertex pair;
+#X text 221 22 example polygon:;
+#X obj 60 40 # +;
+#X msg 44 10 4 2 # 0 0 1 1 1 1 1 0;
+#X obj 41 66 #polygon_each_edge;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 7 0 2 0;
diff --git a/externals/gridflow/doc/flow_classes/#polygon_radial_map-help.pd b/externals/gridflow/doc/flow_classes/#polygon_radial_map-help.pd
new file mode 100644
index 00000000..03303fc2
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_radial_map-help.pd
@@ -0,0 +1,42 @@
+#N canvas 412 64 630 462 10;
+#X obj 274 276 #polygon_radial_map;
+#X text 70 40 makes a 1-D panoramic (polar) rendering of a polygon.
+;
+#X text 69 57 if you want to make standardized (translation-independent)
+renderings of polygons \, first substract [#polygon_moment] (or a variant
+thereof) from the polygon.;
+#X obj 274 371 #outer * (255 255 255);
+#X obj 274 390 #out window;
+#X obj 24 193 t b a;
+#X obj 24 240 #draw_polygon put (255 224 200);
+#X msg 24 221 240 320 3 # 0 60 90;
+#X obj 274 333 #for 128 0 -1;
+#X obj 24 259 #out window;
+#X obj 274 140 #t;
+#X obj 304 141 #polygon_moment;
+#X obj 323 162 display;
+#X obj 274 166 # -;
+#X obj 288 188 display;
+#X msg 24 116 4 2 # 30 30 30 250 120 200 170 90;
+#X obj 274 295 t a a;
+#X obj 274 314 #finished;
+#X obj 274 352 #outer <;
+#X connect 0 0 16 0;
+#X connect 3 0 4 0;
+#X connect 5 0 7 0;
+#X connect 5 1 6 2;
+#X connect 6 0 9 0;
+#X connect 7 0 6 0;
+#X connect 8 0 18 0;
+#X connect 10 0 13 0;
+#X connect 10 1 11 0;
+#X connect 11 0 12 0;
+#X connect 11 0 13 1;
+#X connect 13 0 0 0;
+#X connect 13 0 14 0;
+#X connect 15 0 5 0;
+#X connect 15 0 10 0;
+#X connect 16 0 17 0;
+#X connect 16 1 18 1;
+#X connect 17 0 8 0;
+#X connect 18 0 3 0;
diff --git a/externals/gridflow/doc/flow_classes/#posterize-help.pd b/externals/gridflow/doc/flow_classes/#posterize-help.pd
new file mode 100644
index 00000000..94f0f23c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#posterize-help.pd
@@ -0,0 +1,36 @@
+#N canvas 384 100 640 338 10;
+#X obj 20 32 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#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 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 20 59 fork;
+#X msg 43 79 open bluemarble.jpg;
+#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 obj 20 100 #in;
+#X obj 19 127 #store;
+#X obj 19 175 #posterize;
+#X obj 19 303 #out window;
+#X obj 281 304 #convolve;
+#X obj 350 304 #contrast;
+#X obj 419 304 #solarize;
+#X obj 488 304 #layer;
+#X text 16 7 #posterize;
+#X connect 0 0 7 0;
+#X connect 1 0 2 0;
+#X connect 1 0 12 1;
+#X connect 2 0 11 0;
+#X connect 7 0 10 0;
+#X connect 7 1 8 0;
+#X connect 8 0 10 0;
+#X connect 10 0 11 1;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
diff --git a/externals/gridflow/doc/flow_classes/#print-help.pd b/externals/gridflow/doc/flow_classes/#print-help.pd
new file mode 100644
index 00000000..e7143e19
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#print-help.pd
@@ -0,0 +1,81 @@
+#N canvas 408 30 536 638 10;
+#X text 15 32 Displays the dimensions of a grid in the console. If
+the grid has less than two dimensions it will display all grid data.
+;
+#X floatatom 213 105 5 0 0 0 - - -;
+#X floatatom 235 126 5 0 0 0 - - -;
+#X floatatom 257 146 5 0 0 0 - - -;
+#X obj 71 116 #in;
+#X obj 100 158 #import (3 3 3);
+#X msg 100 110 3 3 3 # 27;
+#X obj 100 134 # rand;
+#X obj 0 3 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 70 267 cnv 15 100 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 2 431 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 302 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 325 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 326 Inlet_0;
+#X text 203 433 Outlets (1);
+#X obj 2 452 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 351 GRID;
+#X msg 71 88 load sewing.jpg;
+#X obj 17 4 #print;
+#X text 8 483 GRID;
+#X obj 71 267 #print paprika;
+#X obj 4 640 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 520 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 206 521 Arguments (1);
+#X text 70 555 Adds a number as a prefix before the element printed
+in the console.;
+#X text 11 598 SYMBOL;
+#X text 68 597 Adds a symbol (text) as a prefix before the printed
+element in the console.;
+#X text 7 453 Outlet_0;
+#X text 67 352 Incoming grid.;
+#X text 203 304 Inlets (1);
+#X text 63 483 Outputs the dimensions of a grid and the grid data to
+the console.;
+#X text 7 640 see also:;
+#X obj 82 641 #dim;
+#X obj 116 641 #export;
+#X obj 171 641 #export_list;
+#X obj 262 641 print;
+#X text 11 556 FLOAT;
+#X text 122 375 select between base 2 \, 8 \, 10 \, 16;
+#X text 9 389 maxrows INTEGER;
+#X text 8 375 base INTEGER;
+#X text 122 389 stop printing after that number of rows;
+#X text 9 402 trunc INTEGER;
+#X text 123 403 stop printing after that number of characters on the
+same line;
+#X text 398 4 GridFlow 0.9.1;
+#X obj 213 165 #pack 3;
+#X msg 368 188 base 2;
+#X msg 368 208 base 8;
+#X msg 368 228 base 10;
+#X msg 368 248 base 16;
+#X msg 370 159 maxrows 10;
+#X msg 370 136 trunc 20;
+#X connect 1 0 44 0;
+#X connect 2 0 44 1;
+#X connect 3 0 44 2;
+#X connect 4 0 20 0;
+#X connect 5 0 20 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 17 0 4 0;
+#X connect 44 0 20 0;
+#X connect 45 0 20 0;
+#X connect 46 0 20 0;
+#X connect 47 0 20 0;
+#X connect 48 0 20 0;
+#X connect 49 0 20 0;
+#X connect 50 0 20 0;
diff --git a/externals/gridflow/doc/flow_classes/#ravel-help.pd b/externals/gridflow/doc/flow_classes/#ravel-help.pd
new file mode 100644
index 00000000..3d222e3f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#ravel-help.pd
@@ -0,0 +1,31 @@
+#N canvas 364 101 660 279 10;
+#X text 143 15 like @redim but always produces a 1-D grid with the
+same total number of elements.;
+#X obj 20 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 20 211 print before;
+#X obj 259 213 print after;
+#X text 403 215 see also:;
+#X text 575 14 gridflow;
+#X msg 43 81 open bluemarble.jpg;
+#X obj 20 60 fork;
+#X obj 20 102 #in;
+#X obj 20 168 #dim;
+#X obj 20 190 #export_list;
+#X text 14 15 #ravel;
+#X obj 477 214 #redim (1);
+#X obj 567 214 #perspective;
+#X obj 259 192 #export_list;
+#X obj 259 170 #dim;
+#X obj 140 129 #ravel;
+#X connect 1 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 8 0;
+#X connect 7 1 6 0;
+#X connect 8 0 9 0;
+#X connect 8 0 16 0;
+#X connect 9 0 10 0;
+#X connect 10 0 2 0;
+#X connect 14 0 3 0;
+#X connect 15 0 14 0;
+#X connect 16 0 15 0;
diff --git a/externals/gridflow/doc/flow_classes/#record-help.pd b/externals/gridflow/doc/flow_classes/#record-help.pd
new file mode 100644
index 00000000..947adabb
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#record-help.pd
@@ -0,0 +1,68 @@
+#N canvas 507 136 507 659 10;
+#X obj 79 121 #camera;
+#X obj 79 70 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 105 153 #out window;
+#X obj 154 70 hsl 128 15 20 300 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 105 178 fps detailed;
+#X obj 105 202 print;
+#X obj 79 98 metro 100;
+#X obj 93 231 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 123 280 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 108 255 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 3 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 603 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 348 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 371 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 636 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 204 350 Inlets (4);
+#X text 4 397 GRID;
+#X text 76 396 Accepts grids.;
+#X obj 2 428 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 487 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 546 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 455 BANG;
+#X text 4 519 BANG;
+#X text 4 578 BANG;
+#X text 5 373 Inlet 0;
+#X text 5 430 Inlet 1;
+#X text 5 494 Inlet 2;
+#X text 5 553 Inlet 3;
+#X obj 79 309 cnv 15 50 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 79 310 #record;
+#X text 76 519 Starts recording to the file.;
+#X text 76 578 Stops recording.;
+#X text 205 605 Outlets (0);
+#X text 206 637 Arguments (0);
+#X text 76 454 Opens a dialog window in which to type the filename
+to be recorded \, the defualt encoding is quicktime (raw).;
+#X text 22 33 Record a quicktime file with [#out];
+#X text 113 229 <-- 1 select filename;
+#X text 128 254 <-- 2 start recording;
+#X text 143 280 <-- 3 stop recording;
+#X text 142 309 <-- open for more options;
+#X text 39 39 comment;
+#X obj 13 0 #record;
+#X text 394 1 GridFlow 0.9.0;
+#X connect 0 0 2 0;
+#X connect 0 0 29 0;
+#X connect 1 0 6 0;
+#X connect 2 0 4 0;
+#X connect 3 0 6 1;
+#X connect 4 0 5 0;
+#X connect 6 0 0 0;
+#X connect 7 0 29 1;
+#X connect 8 0 29 3;
+#X connect 9 0 29 2;
diff --git a/externals/gridflow/doc/flow_classes/#redim-help.pd b/externals/gridflow/doc/flow_classes/#redim-help.pd
new file mode 100644
index 00000000..2977b174
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#redim-help.pd
@@ -0,0 +1,65 @@
+#N canvas 271 30 511 573 10;
+#X obj 109 154 cnv 15 130 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 6 398 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 210 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 233 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 9 234 Inlet_0;
+#X text 206 212 Inlets (2);
+#X text 215 400 Outlets (1);
+#X obj 5 480 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 221 481 Arguments (1);
+#X obj 5 329 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 419 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 420 Inlet_0;
+#X text 10 330 Inlet_1;
+#X text 7 259 GRID;
+#X text 7 357 GRID;
+#X text 11 443 GRID;
+#X obj 5 552 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 86 37 rearrange a grid's values according to new dimensions
+;
+#X obj 21 36 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X text 834 99 gridflow;
+#X obj 21 59 fork;
+#X obj 21 103 #in;
+#X obj 111 183 #out window;
+#X obj 7 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X msg 44 81 open working.jpg;
+#X text 19 550 see also:;
+#X obj 99 553 #ravel;
+#X obj 149 553 #perspective;
+#X obj 21 184 #out window;
+#X obj 21 127 t a a;
+#X obj 22 0 #redim ( 2 );
+#X obj 111 154 #redim (120 160 3);
+#X text 72 444 Outputs the redimensioned data as a grid.;
+#X text 24 511 Accepts a grid as a creation argument \, here (120 160
+3).;
+#X msg 232 131 240 320 3;
+#X text 65 257 Accepts a grid which elements are serialized. If the
+resulting grid must be larger \, the sequence is repeated as much as
+necessary. It is truncated if it must be smaller. The elements are
+then deserialized to form the resulting grid.;
+#X text 71 357 Accepts grids that is a dimension list.;
+#X text 399 1 GridFlow 0.8.4;
+#X msg 200 101 400 400 3;
+#X connect 18 0 20 0;
+#X connect 20 0 21 0;
+#X connect 20 1 24 0;
+#X connect 21 0 29 0;
+#X connect 24 0 21 0;
+#X connect 29 0 28 0;
+#X connect 29 1 31 0;
+#X connect 31 0 22 0;
+#X connect 34 0 31 1;
+#X connect 38 0 31 1;
diff --git a/externals/gridflow/doc/flow_classes/#remap_image-help.pd b/externals/gridflow/doc/flow_classes/#remap_image-help.pd
new file mode 100644
index 00000000..22c2e453
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#remap_image-help.pd
@@ -0,0 +1,70 @@
+#N canvas 300 38 508 671 10;
+#X obj 3 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 46 229 cnv 15 86 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 4 477 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 327 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 350 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 8 351 Inlet_0;
+#X text 205 329 Inlets (2);
+#X obj 4 611 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 409 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 498 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 8 410 Inlet_1;
+#X obj 10 0 #remap_image;
+#X text 19 26 Transforms a grid by displacing pixels.;
+#X obj 27 154 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 46 179 #in;
+#X floatatom 166 201 5 0 0 0 - - -;
+#X text 7 378 GRID;
+#X obj 150 229 # +;
+#X msg 61 153 open sewing.jpg;
+#X text 211 199 <-- Modify value to see transformation.;
+#X text 54 377 Accepts a grid.;
+#X text 178 152 <-- open image;
+#X text 401 1 GridFlow 0.8.4;
+#X obj 46 281 #out window \, title remapped;
+#X obj 46 97 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 46 120 metro 33.3667;
+#X text 19 45 If you chain indexmap (coordinate) transformations from
+outlet 1 to inlet 1 \, then sending an image in inlet 0 will emit its
+deformation out of outlet 0;
+#X text 8 524 GRID;
+#X text 8 499 Outlet_0;
+#X text 55 523 The deformed grid.;
+#X obj 46 229 #remap_image;
+#X text 204 610 Arguments (0);
+#X text 206 479 Outlets (2);
+#X obj 4 552 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 8 578 GRID;
+#X text 8 553 Outlet_1;
+#X text 197 229 <-- change the numop to change the transformation;
+#X text 6 437 GRID;
+#X text 55 577;
+#X obj 4 646 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 12 645 See also :;
+#X obj 92 645 #rotate;
+#X text 53 436 Receives a grid that is to be used as the transformation
+map;
+#X text 55 578;
+#X text 55 577 The deformed grid that has received the last transformation.
+;
+#X connect 13 0 14 0;
+#X connect 14 0 30 0;
+#X connect 15 0 17 1;
+#X connect 17 0 30 1;
+#X connect 18 0 14 0;
+#X connect 24 0 25 0;
+#X connect 25 0 14 0;
+#X connect 30 0 23 0;
+#X connect 30 1 17 0;
diff --git a/externals/gridflow/doc/flow_classes/#reverse-help.pd b/externals/gridflow/doc/flow_classes/#reverse-help.pd
new file mode 100644
index 00000000..441e9d40
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#reverse-help.pd
@@ -0,0 +1,46 @@
+#N canvas 599 113 566 552 10;
+#X text 428 11 GridFlow 0.8.0;
+#X obj 258 207 #color;
+#X obj 288 391 #color;
+#X obj 259 476 display;
+#X text 15 27 [#reverse];
+#X obj 258 359 t a a;
+#X text 15 57 Swaps the values of incoming grids while preserving the
+number of Dimensions between incoming and outgoing grids.;
+#X obj 22 287 #in;
+#X obj 22 206 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 52 256 open b001.jpg;
+#X obj 22 401 #out window;
+#X obj 87 289 hradio 15 1 0 6 empty empty empty 0 -6 0 8 -260818 -1
+-1 5;
+#X obj 87 307 - 3;
+#X floatatom 87 327 5 0 0 0 - - -;
+#X text 16 107 0 vertical;
+#X text 16 122 1 horizontal;
+#X text 16 135 2 rgb <-> bgr;
+#X text 16 150 -1 \, -2 \, -3 \, swaps the specicied dimensions;
+#X text 16 92 An int argument changes the behavior in this way :;
+#X obj 22 228 t b b;
+#X obj 22 344 #reverse 0;
+#X obj 258 330 #reverse 0;
+#X obj 323 275 hradio 15 1 0 6 empty empty empty 0 -6 0 8 -260818 -1
+-1 0;
+#X obj 323 293 - 3;
+#X floatatom 323 313 5 0 0 0 - - -;
+#X connect 1 0 21 0;
+#X connect 5 0 3 0;
+#X connect 5 1 2 0;
+#X connect 7 0 20 0;
+#X connect 8 0 19 0;
+#X connect 9 0 7 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 20 1;
+#X connect 19 0 7 0;
+#X connect 19 1 9 0;
+#X connect 20 0 10 0;
+#X connect 21 0 5 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 24 0 21 1;
diff --git a/externals/gridflow/doc/flow_classes/#rgb_to_greyscale-help.pd b/externals/gridflow/doc/flow_classes/#rgb_to_greyscale-help.pd
new file mode 100644
index 00000000..f512369a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rgb_to_greyscale-help.pd
@@ -0,0 +1,40 @@
+#N canvas 113 134 502 431 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 299 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 210 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 233 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 301 Outlets (1);
+#X obj 1 320 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 234 Inlet 0;
+#X text 2 321 Outlet 0;
+#X obj 166 183 #out window;
+#X obj 166 112 #in;
+#X obj 14 0 #rgb_to_greyscale;
+#X obj 166 137 cnv 15 121 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 166 137 #rgb_to_greyscale;
+#X obj 174 91 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X msg 166 68 open working.jpg;
+#X obj 166 160 #greyscale_to_rgb;
+#X text 221 211 Inlets (1);
+#X text 7 259 GRID;
+#X text 8 346 GRID;
+#X text 87 260 A color grid at the left inlet is accepted.;
+#X text 15 27 Creates a greyscale image from a color image.;
+#X obj 2 391 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 196 392 Arguments (none);
+#X text 84 349 A grid equivalent to the original one is output in greyscale.
+;
+#X connect 10 0 13 0;
+#X connect 13 0 16 0;
+#X connect 14 0 10 0;
+#X connect 15 0 10 0;
+#X connect 16 0 9 0;
diff --git a/externals/gridflow/doc/flow_classes/#rgb_to_yuv-help.pd b/externals/gridflow/doc/flow_classes/#rgb_to_yuv-help.pd
new file mode 100644
index 00000000..3caf9136
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rgb_to_yuv-help.pd
@@ -0,0 +1,42 @@
+#N canvas 205 69 509 416 10;
+#X obj 4 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 314 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 225 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 248 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 9 249 Inlet_0;
+#X text 208 316 Outlets (1);
+#X obj 6 335 cnv 15 67 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 24 1 #rgb_to_yuv;
+#X obj 324 188 #out window;
+#X obj 273 87 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 255 107 #in;
+#X msg 255 61 open sewing.jpg;
+#X obj 324 150 cnv 15 79 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 324 150 #rgb_to_yuv;
+#X text 206 227 Inlets (1);
+#X text 7 274 Grid;
+#X text 5 152 This displays the image as RGB:;
+#X text 99 190 This displays the image as YUV:;
+#X text 23 26 Converts an RGB color model image to a YUV color model
+image.;
+#X text 8 365 Grid;
+#X text 10 336 Outlet_0;
+#X text 80 367 Displays an image in YUV format.;
+#X text 79 276 Receives an image in RGB format.;
+#X obj 226 152 #out window;
+#X text 396 1 GridFlow 0.8.4;
+#X obj 7 390 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 206 391 Arguments (none);
+#X connect 9 0 10 0;
+#X connect 10 0 13 0;
+#X connect 10 0 23 0;
+#X connect 11 0 10 0;
+#X connect 13 0 8 0;
diff --git a/externals/gridflow/doc/flow_classes/#rgb_to_yuv_and_#yuv_to_rgb-help.pd b/externals/gridflow/doc/flow_classes/#rgb_to_yuv_and_#yuv_to_rgb-help.pd
new file mode 100644
index 00000000..8be0a8c3
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rgb_to_yuv_and_#yuv_to_rgb-help.pd
@@ -0,0 +1,44 @@
+#N canvas 98 384 737 338 10;
+#X obj 267 25 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X obj 279 77 cnv 15 450 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 306 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X obj 8 5 cnv 15 720 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 266 192 cnv 15 460 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 269 191 Outlets:;
+#X obj 8 25 cnv 15 250 15 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 11 25 Usage:;
+#X obj 8 45 cnv 15 250 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 81 cnv 15 250 220 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 270 25 Inlets: (Read left to right \, inlet "0" being the leftmost)
+;
+#X text 282 77 0: (Leftmost);
+#X text 12 5 SUMMARY:;
+#X obj 42 51 #rgb_to_yuv;
+#X obj 15 117 #for (0 0) (256 256) (1 1);
+#X obj 15 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 15 220 #clip;
+#X obj 15 143 #inner (2 3 # 0 1 0 0 0 1);
+#X obj 15 194 #yuv_to_rgb;
+#X obj 15 168 # + (200 0 0);
+#X obj 16 261 #peephole;
+#X text 289 99 Grid - Receives a grid in RGB or YUV format.;
+#X text 16 313 GridFlow 0.8.0;
+#X obj 135 51 #yuv_to_rgb;
+#X text 72 5 converts RGB colourspace to YUV colourspace or YUV to
+RGB.;
+#X text 291 224 One - outputs the converted grid.;
+#X connect 14 0 17 0;
+#X connect 15 0 14 0;
+#X connect 16 0 20 0;
+#X connect 17 0 19 0;
+#X connect 18 0 16 0;
+#X connect 19 0 18 0;
diff --git a/externals/gridflow/doc/flow_classes/#rotate-help.pd b/externals/gridflow/doc/flow_classes/#rotate-help.pd
new file mode 100644
index 00000000..de4f6c0b
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rotate-help.pd
@@ -0,0 +1,64 @@
+#N canvas 350 51 503 521 10;
+#X obj 181 122 cnv 15 51 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 1 345 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 168 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 191 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 347 Outlets (1);
+#X obj 1 426 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 425 Arguments (1);
+#X obj 0 263 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 366 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 192 Inlet 0;
+#X text 1 264 Inlet 1;
+#X text 221 169 Inlets (2);
+#X text 2 367 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 10 1 #rotate;
+#X text 393 1 GridFlow 0.8.4;
+#X obj 180 121 #rotate;
+#X text 11 454 INT;
+#X text 8 218 GRID;
+#X text 11 290 INT;
+#X text 4 26 The [#rotate] performs rotations on indexmaps and polygons
+and such objects.;
+#X obj 163 83 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 80 98 #in;
+#X obj 227 99 hsl 40 15 0 35999 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 2800 1;
+#X text 11 390 GRID;
+#X text 60 455 [#rotate] accepts an integer number (0 to 35999) as
+a creation argument which initializes the first angle of rotation.
+;
+#X obj 80 121 #remap_image;
+#X obj 80 142 #out window \, title #rotate;
+#X obj 9 57 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 1 1;
+#X obj 9 76 metro 100;
+#X text 65 392 Outputs the result of the rotation and needs to be sent
+to a [#remap_image] to be visualized.;
+#X text 57 217 The Grid passed in inlet 0 will be the grid on which
+the rotation will be performed.;
+#X text 57 289 An integer from 0 to 35999 (36000 is the same as 0)
+passed in inlet 1 will determine the angle of rotation for the object
+to be rotated.;
+#X floatatom 243 123 7 0 0 0 - - -;
+#X msg 80 57 open b001.jpg;
+#X connect 17 0 27 1;
+#X connect 22 0 23 0;
+#X connect 23 0 27 0;
+#X connect 24 0 17 1;
+#X connect 24 0 34 0;
+#X connect 27 0 28 0;
+#X connect 27 1 17 0;
+#X connect 29 0 30 0;
+#X connect 30 0 23 0;
+#X connect 35 0 23 0;
diff --git a/externals/gridflow/doc/flow_classes/#saturation-help.pd b/externals/gridflow/doc/flow_classes/#saturation-help.pd
new file mode 100644
index 00000000..3d92609b
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#saturation-help.pd
@@ -0,0 +1,60 @@
+#N canvas 115 0 502 637 10;
+#X obj 27 157 print;
+#X obj 27 117 #out window;
+#X text 293 68 OR;
+#X text 275 30 global saturation;
+#X obj 27 138 fps detailed;
+#X text 240 87 per-channel saturation;
+#X msg 231 25 0;
+#X obj 231 4 loadbang;
+#X obj 234 46 hsl 137 15 -256 512 0 0 empty empty empty -2 -6 0 8 -260818
+-128992 -1 5700 1;
+#X floatatom 192 47 5 0 0 0 - - -;
+#X obj 27 -45 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 27 -11 metro 33.3667;
+#X msg 184 88 3 # \$1;
+#X obj 27 24 #in babbage.jpg;
+#X obj 184 114 #color -256 512 1;
+#X obj 1 -99 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 395 -98 GridFlow 0.9.0;
+#X obj 1 394 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 263 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 286 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 287 Inlet_0;
+#X obj 1 474 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 415 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 0 416 Outlet_0;
+#X text 13 441 GRID;
+#X text 13 505 INT;
+#X text 203 265 Inlets (2);
+#X text 13 314 GRID;
+#X text 13 364 GRID;
+#X text 72 312 Accepts original image;
+#X obj 11 -99 #saturation;
+#X text 72 363 Modifying grid;
+#X obj 1 340 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 341 Inlet_1;
+#X text 203 395 Outlet (1);
+#X obj 27 93 #saturation -128;
+#X text 73 504 Saturation value \, can be negative.;
+#X text 205 473 Arguments (1);
+#X connect 1 0 4 0;
+#X connect 4 0 0 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 0;
+#X connect 8 0 9 0;
+#X connect 8 0 12 0;
+#X connect 10 0 11 0;
+#X connect 11 0 13 0;
+#X connect 12 0 14 0;
+#X connect 13 0 35 0;
+#X connect 14 0 35 1;
+#X connect 35 0 1 0;
diff --git a/externals/gridflow/doc/flow_classes/#scale_by-help.pd b/externals/gridflow/doc/flow_classes/#scale_by-help.pd
new file mode 100644
index 00000000..3c44cdda
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#scale_by-help.pd
@@ -0,0 +1,59 @@
+#N canvas 670 77 508 615 10;
+#X obj 89 182 cnv 15 80 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 1 413 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 255 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 278 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 418 Outlets (1);
+#X obj 1 493 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 496 Arguments (1);
+#X obj 1 348 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 434 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 278 Inlet 0;
+#X text 2 352 Inlet 1;
+#X text 221 257 Inlets (2);
+#X text 2 438 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 11 82 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
+#X obj 11 102 metro 100;
+#X obj 89 149 #in;
+#X text 210 496 Arguments (1);
+#X obj 2 562 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 217 565 See Also;
+#X obj 10 589 #scale_to;
+#X obj 80 589 #downscale_by;
+#X text 7 302 GRID;
+#X text 3 463 GRID;
+#X text 64 463 Outputs the resulting scaled image.;
+#X obj 89 227 #out window \, title #scale_by;
+#X msg 89 85 open bluemarble.jpg \, bang;
+#X obj 9 1 #scale_by;
+#X text 396 1 GridFlow 0.9.0;
+#X obj 89 183 #scale_by 2;
+#X text 7 28 The [#scale_by] scales the image received by the row and
+column factors passed. A single value applies the scaling uniformly
+on the row and columns.;
+#X msg 227 129 2 # 2 1;
+#X msg 230 152 2 # 2 3;
+#X floatatom 181 131 5 0 0 0 - - -;
+#X text 3 525 INT;
+#X text 4 376 INT;
+#X text 61 375 Scaling factor.;
+#X text 64 524 The scaling factor (defaults to 2).;
+#X text 62 303 The Grid on which the scale_to will be performed.;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 29 0;
+#X connect 26 0 16 0;
+#X connect 29 0 25 0;
+#X connect 31 0 29 1;
+#X connect 32 0 29 1;
+#X connect 33 0 29 1;
diff --git a/externals/gridflow/doc/flow_classes/#scale_to-help.pd b/externals/gridflow/doc/flow_classes/#scale_to-help.pd
new file mode 100644
index 00000000..34038065
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#scale_to-help.pd
@@ -0,0 +1,78 @@
+#N canvas 122 0 504 602 10;
+#X obj 90 170 cnv 15 135 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 1 394 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 236 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 259 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 399 Outlets (1);
+#X obj 1 474 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 477 Arguments (1);
+#X obj 1 329 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 415 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 259 Inlet 0;
+#X text 2 333 Inlet 1;
+#X text 221 238 Inlets (2);
+#X text 2 419 Outlet 0;
+#X obj 1 1 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 11 75 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 11 94 metro 100;
+#X obj 89 171 #scale_to (133 133);
+#X obj 89 133 #in;
+#X obj 284 159 #pack;
+#X obj 325 138 hsl 128 8 0 640 0 0 empty empty empty 0 -8 0 8 -260818
+-1 -1 0 1;
+#X obj 325 148 hsl 128 8 0 640 0 0 empty empty empty 0 -8 0 8 -260818
+-1 -1 0 1;
+#X obj 9 1 #scale_to;
+#X obj 89 208 #out window \, title #scale_to;
+#X text 210 477 Arguments (1);
+#X obj 2 543 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 217 546 See Also;
+#X obj 80 570 #downscale_by;
+#X msg 89 73 open scissors.jpg \, bang;
+#X obj 300 183 #print;
+#X msg 284 75 2 # 500 500;
+#X obj 412 97 #print;
+#X text 7 283 GRID;
+#X msg 284 94 2 # 100 500;
+#X msg 285 115 2 # 500 100;
+#X text 460 133 height;
+#X text 460 145 width;
+#X text 62 357 A height width value pair in pixels.;
+#X text 3 444 GRID;
+#X text 64 444 Outputs the resulting scaled image.;
+#X text 3 506 INT INT;
+#X text 65 504 A (height width) pair of integers indicating the size
+to scale to image to. This initial argument is required.;
+#X text 62 284 The Grid passed at inlet 0 will be the image on which
+the scale_to will be performed.;
+#X text 284 58 2 grid size values y=500 x=500;
+#X obj 7 570 #scale_by;
+#X text 395 2 GridFlow 0.9.0;
+#X text 9 22 The [#scale_to] scales the image received to the x and
+y values passed. Initial creation arguments are mandatory (0 0) otherwise.
+;
+#X text 3 358 INT INT;
+#X connect 14 0 15 0;
+#X connect 15 0 17 0;
+#X connect 16 0 22 0;
+#X connect 17 0 16 0;
+#X connect 18 0 16 1;
+#X connect 18 0 28 0;
+#X connect 19 0 18 0;
+#X connect 20 0 18 1;
+#X connect 27 0 17 0;
+#X connect 29 0 16 1;
+#X connect 29 0 30 0;
+#X connect 32 0 16 1;
+#X connect 32 0 30 0;
+#X connect 33 0 16 1;
+#X connect 33 0 30 0;
diff --git a/externals/gridflow/doc/flow_classes/#scan-help.pd b/externals/gridflow/doc/flow_classes/#scan-help.pd
new file mode 100644
index 00000000..08e9e468
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#scan-help.pd
@@ -0,0 +1,24 @@
+#N canvas 140 0 421 309 10;
+#X text 69 15 computes subtotals;
+#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 floatatom 56 225 5 0 0 0 - - -;
+#X floatatom 96 225 5 0 0 0 - - -;
+#X text 73 129 second inlet seems to be dead;
+#X text 340 14 gridflow;
+#X text 14 266 see also:;
+#X text 14 15 #scan;
+#X obj 17 96 #pack 3;
+#X obj 17 127 #scan +;
+#X obj 17 186 #unpack 3;
+#X obj 83 270 #fold +;
+#X connect 1 0 11 0;
+#X connect 2 0 11 1;
+#X connect 3 0 11 2;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 4 0;
+#X connect 13 1 5 0;
+#X connect 13 2 6 0;
diff --git a/externals/gridflow/doc/flow_classes/#seq_fold-help.pd b/externals/gridflow/doc/flow_classes/#seq_fold-help.pd
new file mode 100644
index 00000000..b0645f5e
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#seq_fold-help.pd
@@ -0,0 +1,19 @@
+#N canvas 679 317 400 300 10;
+#X obj 125 93 route end;
+#X obj 126 222 display;
+#X obj 125 166 #seq_fold;
+#X obj 154 190 # +;
+#X msg 125 65 2 1 \, 3 2 \, 5 3 \, 7 4 \, end;
+#X msg 228 135 0 0;
+#X obj 228 116 loadbang;
+#X obj 92 253 #print AAA;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 2 0 7 0;
+#X connect 2 1 3 0;
+#X connect 2 2 3 1;
+#X connect 3 0 2 3;
+#X connect 4 0 0 0;
+#X connect 5 0 2 2;
+#X connect 6 0 5 0;
diff --git a/externals/gridflow/doc/flow_classes/#slice-help.pd b/externals/gridflow/doc/flow_classes/#slice-help.pd
new file mode 100644
index 00000000..c7c76227
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#slice-help.pd
@@ -0,0 +1,18 @@
+#N canvas 366 229 551 300 10;
+#X obj 38 150 display;
+#X text 36 173 should print subgrid: 3 5 8 13 21;
+#X msg 37 105 0 1 1 2 3 5 8 13 21 34 55 89;
+#X obj 37 130 #slice 4 9;
+#X obj 256 69 #slice (1 1) (3 3);
+#X obj 257 90 display;
+#X obj 256 50 #redim (4 4);
+#X obj 256 31 #for 0 16 1;
+#X obj 256 14 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 259 137 should print subgrid: 2 2 # 5 6 9 10;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 6 0 4 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
diff --git a/externals/gridflow/doc/flow_classes/#solarize-help.pd b/externals/gridflow/doc/flow_classes/#solarize-help.pd
new file mode 100644
index 00000000..f35f8ad3
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#solarize-help.pd
@@ -0,0 +1,25 @@
+#N canvas 411 100 613 339 10;
+#X obj 20 59 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#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 msg 43 112 open bluemarble.jpg;
+#X obj 20 83 fork;
+#X obj 20 174 #solarize;
+#X obj 20 222 #out window;
+#X obj 20 138 #in;
+#X obj 273 309 #convolve;
+#X obj 342 309 #contrast;
+#X obj 411 309 #posterize;
+#X obj 487 309 #layer;
+#X text 16 7 #solarize;
+#X connect 0 0 5 0;
+#X connect 4 0 8 0;
+#X connect 5 0 8 0;
+#X connect 5 1 4 0;
+#X connect 6 0 7 0;
+#X connect 8 0 6 0;
diff --git a/externals/gridflow/doc/flow_classes/#sort-help.pd b/externals/gridflow/doc/flow_classes/#sort-help.pd
new file mode 100644
index 00000000..0702cc07
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#sort-help.pd
@@ -0,0 +1,25 @@
+#N canvas 484 136 450 300 10;
+#X obj 28 210 #sort;
+#X msg 28 5 0 1 1 2 3 5 8 13 21 34 55 89;
+#X msg 28 62 12 # 666;
+#X obj 28 81 # rand;
+#X obj 28 138 #store;
+#X obj 28 100 #grade;
+#X obj 28 24 t a a;
+#X obj 28 43 #finished;
+#X obj 58 164 display;
+#X obj 28 119 #outer + (0);
+#X text 151 100 shuffle;
+#X obj 58 234 display;
+#X text 140 212 unshuffle;
+#X connect 0 0 11 0;
+#X connect 1 0 6 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 4 0 0 0;
+#X connect 4 0 8 0;
+#X connect 5 0 9 0;
+#X connect 6 0 7 0;
+#X connect 6 1 4 1;
+#X connect 7 0 2 0;
+#X connect 9 0 4 0;
diff --git a/externals/gridflow/doc/flow_classes/#spread-help.pd b/externals/gridflow/doc/flow_classes/#spread-help.pd
new file mode 100644
index 00000000..d0fa1ac8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#spread-help.pd
@@ -0,0 +1,57 @@
+#N canvas 237 296 787 472 10;
+#X text 129 15 makes noise;
+#X obj 232 58 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 275 140 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 1
+1;
+#X floatatom 368 241 5 0 0 0 - - -;
+#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 text 368 314 we limit here \, because the values might go out of
+range;
+#X text 702 13 gridflow;
+#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 1 1
+;
+#X text 300 141 switch displays \, use this to get an image into the
+@store;
+#X obj 20 129 #import (256 256 2);
+#X obj 20 197 #spread 1;
+#X obj 195 269 #store;
+#X obj 195 393 #out window;
+#X obj 310 393 #out window;
+#X obj 310 291 #clip;
+#X obj 310 270 #spread 1;
+#X obj 232 159 #in;
+#X text 14 15 #spread;
+#X obj 249 247 shunt;
+#X connect 1 0 13 0;
+#X connect 2 0 26 1;
+#X connect 3 0 23 1;
+#X connect 4 0 18 1;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 8 0 9 0;
+#X connect 8 0 17 0;
+#X connect 9 0 8 1;
+#X connect 12 0 24 0;
+#X connect 13 0 24 0;
+#X connect 13 1 12 0;
+#X connect 14 0 24 0;
+#X connect 15 0 14 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 22 0 21 0;
+#X connect 23 0 22 0;
+#X connect 24 0 26 0;
+#X connect 26 0 19 1;
+#X connect 26 1 23 0;
diff --git a/externals/gridflow/doc/flow_classes/#store-help.pd b/externals/gridflow/doc/flow_classes/#store-help.pd
new file mode 100644
index 00000000..279c7c8d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#store-help.pd
@@ -0,0 +1,85 @@
+#N canvas 691 44 533 625 10;
+#X obj 1 464 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 9 305 BANG;
+#X obj 1 223 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 246 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 466 Outlets (1);
+#X obj 1 545 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 346 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 485 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 247 Inlet 0;
+#X text 2 347 Inlet 1;
+#X text 252 225 Inlets (2);
+#X text 2 486 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 9 1 #store;
+#X floatatom 132 89 5 0 0 0 - - -;
+#X floatatom 177 89 5 0 0 0 - - -;
+#X floatatom 20 160 5 0 0 0 - - -;
+#X floatatom 132 200 5 0 0 0 - - -;
+#X text 115 201 R:;
+#X floatatom 193 200 5 0 0 0 - - -;
+#X floatatom 253 200 5 0 0 0 - - -;
+#X text 176 201 G:;
+#X text 237 201 B:;
+#X floatatom 73 161 5 0 0 0 - - -;
+#X text 1 161 X:;
+#X text 58 162 Y:;
+#X obj 132 107 #pack;
+#X obj 296 134 #in;
+#X msg 296 115 load r001.jpg;
+#X obj 20 131 #unpack;
+#X obj 132 175 #unpack 3;
+#X text 393 1 GridFlow 0.8.4;
+#X text 210 544 Arguments (0);
+#X obj 134 150 cnv 15 43 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 134 150 #store;
+#X text 60 304 A bang at the left inlet will force [#store] to send
+its value to the outlet.;
+#X text 7 272 GRID;
+#X text 129 54 this example allows you to select a single pixel from
+the loaded picture and view its rgb value.;
+#X text 8 24 The [#store] stores exactly one grid \, using the right
+inlet. You fetch it back \, or selected subparts using the left inlet.
+;
+#X text 10 571 GRID;
+#X text 60 573 [#store] accepts a grid as a creation argument which
+initializes the first value to be stored.;
+#X obj 296 181 display;
+#X obj 86 94 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 296 161 display;
+#X text 59 271 Accepts a grid.;
+#X text 7 371 GRID;
+#X text 60 371 Accepts a grid or a subpart of it.;
+#X text 62 401 Reassign;
+#X text 63 423 put_at;
+#X text 131 410 To be clarified;
+#X text 12 509 GRID;
+#X text 59 509 Outputs the grid as requested.;
+#X obj 296 96 loadbang;
+#X connect 15 0 27 0;
+#X connect 16 0 27 1;
+#X connect 27 0 30 0;
+#X connect 27 0 35 0;
+#X connect 27 0 44 0;
+#X connect 28 0 35 1;
+#X connect 29 0 28 0;
+#X connect 30 0 17 0;
+#X connect 30 1 24 0;
+#X connect 31 0 18 0;
+#X connect 31 1 20 0;
+#X connect 31 2 21 0;
+#X connect 35 0 31 0;
+#X connect 35 0 42 0;
+#X connect 43 0 35 0;
+#X connect 53 0 29 0;
diff --git a/externals/gridflow/doc/flow_classes/#t-help.pd b/externals/gridflow/doc/flow_classes/#t-help.pd
new file mode 100644
index 00000000..b8b7e471
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#t-help.pd
@@ -0,0 +1,75 @@
+#N canvas 78 0 516 656 10;
+#X obj 1 380 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 263 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 286 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 529 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 401 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 287 Inlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 9 1 #t;
+#X text 42 2 trigger;
+#X text 7 313 GRID;
+#X text 2 402 Outlet 0;
+#X obj 10 134 #in teapot.png;
+#X obj 10 161 t a a;
+#X obj 40 181 #convolve (1 3 # -1 2 -1);
+#X obj 267 181 #convolve (1 3 # -1 2 -1);
+#X obj 10 112 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 237 161 #t;
+#X obj 237 205 # *>>8;
+#X obj 10 205 # *>>8;
+#X text 257 112 Works;
+#X text 8 64 In some situations \, a grid hasn't finished entering
+the right-hand side \, when an object begins receiving on the left-hand
+side. in those cases you should use #t.;
+#X obj 237 113 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 10 234 #out window \, title doesnt_work;
+#X obj 237 233 #out window \, title works;
+#X text 8 25 The [#t] trigger object sequences grid operations in a
+right-to-left order. It outputs its input from right to left.;
+#X text 28 112 Doesn't work (all black);
+#X text 393 1 GridFlow 0.8.4;
+#X obj 237 134 #in teapot.png;
+#X text 11 425 GRID;
+#X text 13 517;
+#X text 215 382 Outlets (2);
+#X text 221 264 Inlets (1);
+#X text 210 528 Arguments (0);
+#X obj 2 576 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 14 564;
+#X text 217 577 See also;
+#X text 103 603;
+#X obj 9 605 trigger;
+#X text 59 426 The same grid received in inlet 0 is first sent to the
+outlet 0;
+#X obj 2 459 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 12 483 GRID;
+#X text 3 460 Outlet 1;
+#X text 60 484 The same grid received in inlet 0 is sent to the outlet
+1 after it was sent to outlet 0;
+#X text 59 313 The Grid passed in inlet 0 will be first sent to the
+right most outlet and then to the second from the right (the left outlet
+in this case).;
+#X connect 12 0 13 0;
+#X connect 13 0 19 0;
+#X connect 13 1 14 0;
+#X connect 14 0 19 1;
+#X connect 15 0 18 1;
+#X connect 16 0 12 0;
+#X connect 17 0 18 0;
+#X connect 17 1 15 0;
+#X connect 18 0 24 0;
+#X connect 19 0 23 0;
+#X connect 22 0 28 0;
+#X connect 28 0 17 0;
diff --git a/externals/gridflow/doc/flow_classes/#to_float-help.pd b/externals/gridflow/doc/flow_classes/#to_float-help.pd
new file mode 100644
index 00000000..b82cc30f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_float-help.pd
@@ -0,0 +1,39 @@
+#N canvas 585 129 502 472 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 352 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 247 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 270 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 214 354 Outlets (1);
+#X obj 0 450 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 373 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 1 271 Inlet 0;
+#X text 1 374 Outlet 0;
+#X text 214 247 Inlets (1);
+#X obj 15 188 cnv 15 55 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 5 298 GRID;
+#X obj 15 100 #import ( 2 2 2 );
+#X obj 51 133 display;
+#X msg 15 73 1 2 3 4 5 6 7 8;
+#X text 209 449 Arguments (0);
+#X text 59 298 Accepts a grid that will be transformed into its elements.
+;
+#X text 138 73 <-- create the grid here;
+#X obj 2 0 #to_float;
+#X text 397 2 GridFlow 0.9.0;
+#X text 4 401 FLOAT;
+#X text 79 401 The grid is transformed into a sequence of floats.;
+#X obj 15 188 #to_float;
+#X text 12 27 Produces sequences of floats from grid data. Useful for
+the integration into the rest of PureData.;
+#X obj 15 216 print converted_grid;
+#X connect 12 0 13 0;
+#X connect 12 0 22 0;
+#X connect 14 0 12 0;
+#X connect 22 0 24 0;
diff --git a/externals/gridflow/doc/flow_classes/#to_list-help.pd b/externals/gridflow/doc/flow_classes/#to_list-help.pd
new file mode 100644
index 00000000..3ee2f872
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_list-help.pd
@@ -0,0 +1,42 @@
+#N canvas 544 108 502 472 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 352 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 247 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 270 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 214 354 Outlets (1);
+#X obj 0 450 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 373 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 1 271 Inlet 0;
+#X text 1 374 Outlet 0;
+#X text 214 247 Inlets (1);
+#X obj 15 160 cnv 15 52 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 5 298 GRID;
+#X obj 14 91 #import ( 2 2 2 );
+#X obj 50 115 display;
+#X msg 14 64 1 2 3 4 5 6 7 8;
+#X text 209 449 Arguments (0);
+#X obj 161 217 display;
+#X text 59 298 Accepts a grid that will be transformed into a list.
+;
+#X text 3 401 LIST;
+#X text 57 401 The grid is transformed into a single message containing
+a sequence of integers.;
+#X text 12 27 Produces a list from grid data. Useful for the integration
+into the rest of PureData.;
+#X text 130 63 <-- create the grid here;
+#X obj 2 0 #to_list;
+#X text 397 1 GridFlow 0.9.0;
+#X obj 14 161 #to_list;
+#X obj 14 216 print converted_grid;
+#X connect 12 0 13 0;
+#X connect 12 0 24 0;
+#X connect 14 0 12 0;
+#X connect 24 0 16 0;
+#X connect 24 0 25 0;
diff --git a/externals/gridflow/doc/flow_classes/#to_pix-help.pd b/externals/gridflow/doc/flow_classes/#to_pix-help.pd
new file mode 100644
index 00000000..00a1c979
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_pix-help.pd
@@ -0,0 +1,126 @@
+#N canvas 921 79 511 752 10;
+#X msg 325 61 create \, 1;
+#X obj 325 42 loadbang;
+#X obj -26 1 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -25 0 [#to_pix];
+#X obj 90 162 #in;
+#X msg 117 139 open violoncelle.mov;
+#X obj 90 72 tgl 15 0 empty empty empty 17 7 0 10 -4034 -1 -1 1 1;
+#X obj 5 52 gemhead;
+#X obj 5 291 pix_texture;
+#X text 371 2 GridFlow 0.9.3;
+#X obj -27 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -21 721 see also :;
+#X text 62 720 [#import_pix];
+#X obj -27 403 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -25 431 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -24 432 Inlet 0;
+#X text 193 404 Inlets (1);
+#X obj -27 578 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 606 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -26 607 Outlet 0;
+#X obj -27 578 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 606 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -26 607 Outlet 0;
+#X obj -27 578 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 606 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -26 607 Outlet 0;
+#X obj -27 578 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 184 580 Outlets (1);
+#X obj -27 606 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -26 607 Outlet 0;
+#X obj -27 578 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 578 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -27 578 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 184 580 Outlets (1);
+#X obj -28 669 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -28 669 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -28 669 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -28 669 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X msg 389 62 destroy;
+#X obj 90 93 metro 30;
+#X obj 325 93 gemwin 30;
+#X obj 117 117 loadbang;
+#X text 110 69 <-- start playing the video;
+#X text 0 353 Note : you can get some timebased 'moiree' effects if
+the arguments to the [gemwin] and the [metro] are not synched;
+#X text 190 188 <-- only temporarily necessary;
+#X obj -25 521 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text -24 522 Inlet 1;
+#X text 77 253 <-- imports gridflow grids into GEM;
+#X text 141 720 \, game_of_life_gem.pd in the examples folder;
+#X text -25 541 GRID;
+#X obj 5 253 #to_pix;
+#X text -24 624 gemlist;
+#X text -24 451 gem_state;
+#X text 56 540 Grid with 4 channels;
+#X text 51 625 Modified gemstate so that the pix is equal to the Grid
+of inlet 1;
+#X text 53 451 Something coming from [gemhead];
+#X msg 17 217 yflip \$1;
+#X obj 17 197 tgl 15 0 empty empty empty 17 7 0 10 -257985 -1 -1 1
+1;
+#X text 186 670 Arguments (0);
+#X text -23 480 yflip;
+#X text 55 481 With one boolean argument that selects the order in
+which the y dimension of the Grid will be read \, defaults to '1';
+#N canvas 0 22 458 308 channel_test 0;
+#X obj 130 221 #rgb_to_rgba;
+#X obj 131 103 #dim;
+#X obj 103 173 shunt;
+#X obj 131 126 #unpack 3;
+#X obj 104 29 inlet;
+#X obj 104 56 t a a;
+#X obj 103 265 outlet;
+#X obj 131 150 == 3;
+#X connect 0 0 6 0;
+#X connect 1 0 3 0;
+#X connect 2 0 6 0;
+#X connect 2 1 0 0;
+#X connect 3 2 7 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 5 1 1 0;
+#X connect 7 0 2 1;
+#X restore 90 190 pd channel_test;
+#X obj 5 322 rectangle 4 3;
+#X connect 0 0 43 0;
+#X connect 1 0 0 0;
+#X connect 4 0 64 0;
+#X connect 5 0 4 0;
+#X connect 6 0 42 0;
+#X connect 7 0 53 0;
+#X connect 8 0 65 0;
+#X connect 41 0 43 0;
+#X connect 42 0 4 0;
+#X connect 44 0 5 0;
+#X connect 53 0 8 0;
+#X connect 59 0 53 0;
+#X connect 60 0 59 0;
+#X connect 64 0 53 1;
diff --git a/externals/gridflow/doc/flow_classes/#to_symbol-help.pd b/externals/gridflow/doc/flow_classes/#to_symbol-help.pd
new file mode 100644
index 00000000..a03fbbf9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_symbol-help.pd
@@ -0,0 +1,46 @@
+#N canvas 721 295 503 549 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 428 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 323 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 346 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 214 430 Outlets (1);
+#X obj 0 526 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 449 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 1 347 Inlet 0;
+#X text 1 450 Outlet 0;
+#X text 214 323 Inlets (1);
+#X obj 11 233 cnv 15 63 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 5 374 GRID;
+#X obj 46 164 display;
+#X text 209 525 Arguments (0);
+#X obj 174 292 display;
+#X text 3 477 LIST;
+#X symbolatom 353 294 12 0 0 0 - - -;
+#X text 59 374 Accepts a grid that will be transformed into a symbol.
+;
+#X text 57 477 The grid is transformed into a single message containing
+a symbol.;
+#X text 11 32 Produces a symbol from grid data in its input. The values
+are expected to be valid ASCII codes \, but no check will be performed
+for that \, and additionally \, no check will be made that the generated
+symbol only contains characters that can be put in a symbol.;
+#X msg 11 111 72 101 108 108 111 32 87 111 114 108 100 33;
+#X obj 11 138 #import (3 2 2);
+#X text 324 111 <-- create the grid here;
+#X text 397 0 GridFlow 0.9.0;
+#X obj 2 0 #to_symbol;
+#X obj 11 233 #to_symbol;
+#X obj 11 292 print converted_grid;
+#X connect 20 0 21 0;
+#X connect 21 0 12 0;
+#X connect 21 0 25 0;
+#X connect 25 0 14 0;
+#X connect 25 0 16 0;
+#X connect 25 0 26 0;
diff --git a/externals/gridflow/doc/flow_classes/#unpack-#pack-help.pd b/externals/gridflow/doc/flow_classes/#unpack-#pack-help.pd
new file mode 100644
index 00000000..26e31fee
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#unpack-#pack-help.pd
@@ -0,0 +1,45 @@
+#N canvas 245 108 834 542 10;
+#X text 534 23 GridFlow 0.8.0;
+#X obj 572 257 #unpack 3;
+#X floatatom 562 305 5 0 0 0 - - -;
+#X obj 465 190 t a a;
+#X obj 382 301 display;
+#X floatatom 601 305 5 0 0 0 - - -;
+#X floatatom 640 305 5 0 0 0 - - -;
+#X text 1 51 [#unpack];
+#X obj 579 352 #pack 3;
+#X text 0 122 It takes an integer as an argument to specify the number
+of Dimensions the incoming grid has.;
+#X obj 465 76 #color;
+#X obj 565 411 #color;
+#X text 1 84 Accepts grids in its inlet and produces integers via its
+outlet.;
+#X text 10 349 [#pack];
+#X text 10 382 Accepts integers in its inlets and produces a corresponding
+grid via its outlet.;
+#X text 9 421 It takes an integer as an argument to specify the number
+of incoming integers and the corresponding number of Dimensions the
+outgoing grid will have.;
+#X obj 532 332 - 127;
+#X obj 18 190 trigger bang bang;
+#X obj 215 178 metro 100;
+#X obj 138 345 display;
+#X obj 223 272 print blah;
+#X obj 194 316 print blah2;
+#X obj 171 155 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X connect 1 0 2 0;
+#X connect 1 1 5 0;
+#X connect 1 2 6 0;
+#X connect 2 0 16 0;
+#X connect 3 0 4 0;
+#X connect 3 1 1 0;
+#X connect 5 0 8 1;
+#X connect 6 0 8 2;
+#X connect 8 0 11 0;
+#X connect 10 0 3 0;
+#X connect 16 0 8 0;
+#X connect 18 0 19 0;
+#X connect 18 0 20 0;
+#X connect 18 0 21 0;
+#X connect 22 0 18 0;
diff --git a/externals/gridflow/doc/flow_classes/#unpack-help.pd b/externals/gridflow/doc/flow_classes/#unpack-help.pd
new file mode 100644
index 00000000..8d217fd6
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#unpack-help.pd
@@ -0,0 +1,40 @@
+#N canvas 286 66 511 484 10;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 316 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 225 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 248 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 409 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 203 410 Arguments (1);
+#X obj 1 337 cnv 15 79 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 15 446 INTEGER;
+#X text 15 368 INTEGER;
+#X text 17 282 GRID;
+#X obj 11 1 #unpack;
+#X obj 17 61 #color;
+#X floatatom 17 195 5 0 0 0 - - -;
+#X floatatom 46 174 5 0 0 0 - - -;
+#X floatatom 75 152 5 0 0 0 - - -;
+#X text 204 318 Outlets (n);
+#X text 204 227 Inlets (1);
+#X text 91 282 Accepts a grid.;
+#X text 196 84 <--click and drag to view grid values.;
+#X text 12 28 Outputs individual integer values from a grid.;
+#X obj 17 128 cnv 15 65 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 17 128 #unpack 3;
+#X text 87 369 Outputs grid dimensions as individual integers.;
+#X text 397 1 GridFlow 0.8.4;
+#X text 11 250 Inlet 0;
+#X text 5 338 Outlet All;
+#X text 84 445 Defines the number of outlets \, usually corresponds
+to the number of grid dimensions.;
+#X connect 11 0 21 0;
+#X connect 21 0 12 0;
+#X connect 21 1 13 0;
+#X connect 21 2 14 0;
diff --git a/externals/gridflow/doc/flow_classes/0x40complex_sq-help.pd b/externals/gridflow/doc/flow_classes/0x40complex_sq-help.pd
new file mode 100644
index 00000000..d5fac1a2
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/0x40complex_sq-help.pd
@@ -0,0 +1,28 @@
+#N canvas 301 131 637 303 10;
+#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 floatatom 21 238 5 0 0 0 - - -;
+#X floatatom 64 108 5 0 0 0 - - -;
+#X floatatom 58 238 5 0 0 0 - - -;
+#X text 572 13 gridflow;
+#X text 21 275 see also:;
+#X obj 21 128 #pack;
+#X text 138 88 However \, this (old) object is backwards from the rest
+of GridFlow because it puts Imaginary before Real. [#fft] puts the
+Real part first.;
+#X text 14 14 @complex_sq;
+#X obj 114 235 #print;
+#X obj 21 209 #unpack;
+#X obj 94 279 # +;
+#X obj 127 279 # abs-;
+#X connect 0 0 11 0;
+#X connect 0 0 12 0;
+#X connect 2 0 8 0;
+#X connect 4 0 8 1;
+#X connect 8 0 0 0;
+#X connect 12 0 3 0;
+#X connect 12 1 5 0;
diff --git a/externals/gridflow/doc/flow_classes/0x40join-help.pd b/externals/gridflow/doc/flow_classes/0x40join-help.pd
new file mode 100644
index 00000000..6bf7630e
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/0x40join-help.pd
@@ -0,0 +1,44 @@
+#N canvas 677 232 659 362 10;
+#X obj 18 32 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 211 30 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#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 text 563 10 gridflow;
+#X text 17 306 see also:;
+#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 obj 18 242 #clip;
+#X obj 86 310 #fold +;
+#X obj 142 310 #scan +;
+#X obj 18 269 #out window;
+#X obj 18 96 #in;
+#X obj 237 96 #rgb_to_greyscale;
+#X obj 211 96 #in;
+#X obj 18 188 #perspective 128;
+#X text 205 170 creation argument is the index of the dimension 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 connect 0 0 9 0;
+#X connect 1 0 10 0;
+#X connect 2 0 20 0;
+#X connect 7 0 17 0;
+#X connect 8 0 19 0;
+#X connect 9 0 17 0;
+#X connect 9 1 7 0;
+#X connect 10 0 19 0;
+#X connect 10 1 8 0;
+#X connect 13 0 16 0;
+#X connect 17 0 2 0;
+#X connect 18 0 2 1;
+#X connect 19 0 18 0;
+#X connect 20 0 13 0;
diff --git a/externals/gridflow/doc/flow_classes/args-demo.pd b/externals/gridflow/doc/flow_classes/args-demo.pd
new file mode 100644
index 00000000..330bca93
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/args-demo.pd
@@ -0,0 +1,28 @@
+#N canvas 0 0 613 300 10;
+#X obj 152 20 args hello (world a 42) *;
+#X obj 322 39 print args;
+#X obj 152 3 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 18 35 inlet;
+#X obj 18 233 outlet;
+#X obj 18 54 t a;
+#X obj 18 155 route temperature pression etc;
+#X obj 266 85 display;
+#X obj 209 105 display;
+#X text 270 69 rest of arguments (*);
+#X text 17 174 do whatever you want with those args;
+#X obj 223 230 t a;
+#X text 230 211 anything else coming from first inlet or named args
+;
+#X obj 153 125 display;
+#X text 157 106 hello;
+#X text 213 86 world;
+#X connect 0 0 13 0;
+#X connect 0 1 8 0;
+#X connect 0 2 7 0;
+#X connect 0 3 5 0;
+#X connect 0 3 1 0;
+#X connect 2 0 0 0;
+#X connect 3 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 3 11 0;
diff --git a/externals/gridflow/doc/flow_classes/args-help.pd b/externals/gridflow/doc/flow_classes/args-help.pd
new file mode 100644
index 00000000..1c2db31f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/args-help.pd
@@ -0,0 +1,51 @@
+#N canvas 662 31 514 627 10;
+#X obj 2 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 359 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 173 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 196 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 486 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 430 cnv 15 80 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 3 197 Inlet 0;
+#X text 399 1 GridFlow 0.9.5;
+#X obj 16 0 args;
+#X text 354 70 demo default args;
+#X text 354 90 demo rest of args;
+#X text 354 130 demo missing args;
+#X obj 12 89 args-demo pommes poires ananas biscuits-soda;
+#X text 222 204 Inlets (1);
+#X text 18 221 BANG;
+#X text 216 361 Outlets (at least 1);
+#X text 4 431 Outlet last;
+#X text 16 458 MESSAGE;
+#X text 75 458 Any comma-arguments from the parent objectbox;
+#X text 18 386 there is one outlet per argument plus one outlet for
+the comma-messages.;
+#X obj 12 129 args-demo;
+#X obj 12 69 args-demo blah;
+#X obj 12 109 args-demo dorval \, temperature -18 \, pression 99.5
+;
+#X text 354 110 demo comma args;
+#X text 65 221 sends one message per outlet right-to-left except the
+last outlet. if there is a wildcard (*) as the last argument \, any
+extra arguments go there as a list message. Then for any missing arguments
+that have default values \, the default values are sent \, right to
+left. Then for each present argument that is not extra \, that argument
+will be sent on its own outlet. Finally \, each comma-message is parsed
+from the arguments and sent to the last outlet \, which should be connected
+with a [t a] just like the first [inlet].;
+#X text 211 485 Arguments (any number);
+#X text 40 531 SYMBOL;
+#X text 20 512 any number of:;
+#X text 156 530 represent mandatory arguments;
+#X text 40 552 (SYMBOL a ATOM);
+#X text 156 550 represent optional arguments;
+#X text 41 572 *;
+#X text 158 572 represent the rest of arguments;
+#X text 20 590 where the star can only occur once and at the end \,
+and all optionals must follow all mandatories.;
diff --git a/externals/gridflow/doc/flow_classes/ascii-help.pd b/externals/gridflow/doc/flow_classes/ascii-help.pd
new file mode 100644
index 00000000..99ee3cac
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/ascii-help.pd
@@ -0,0 +1,30 @@
+#N canvas 442 305 506 373 10;
+#X obj 39 93 ascii;
+#X floatatom 39 61 5 0 0 0 - - -;
+#X obj 39 124 print;
+#X msg 86 60 42;
+#X obj 1 -2 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 -2 GridFlow 0.9.3;
+#X obj 11 -2 ascii;
+#X obj 1 176 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 199 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 200 Inlet 0;
+#X text 215 176 Inlets (1);
+#X text 5 225 INT;
+#X obj 1 282 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 284 Outlets (1);
+#X obj 1 303 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 304 Outlet 0;
+#X text 8 332 FLOAT;
+#X text 135 94 write integer as decimal in ascii codes;
+#X text 84 225 number to be converted into ascii codes;
+#X text 82 332 a sequence of floats corresponding to the ascii codes
+of the input integer;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 3 0 0 0;
diff --git a/externals/gridflow/doc/flow_classes/condition-help.pd b/externals/gridflow/doc/flow_classes/condition-help.pd
new file mode 100644
index 00000000..a5b0385c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/condition-help.pd
@@ -0,0 +1,16 @@
+#N canvas 78 0 388 273 10;
+#X obj 33 112 condition 0 0 60 90;
+#X floatatom 33 77 5 0 0 0 - - -;
+#X floatatom 161 77 5 0 0 0 - - -;
+#X obj 33 148 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 161 148 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X text 31 16 accepts (X0 \, Y0) (X1 \, Y1);
+#X text 30 194 returns a bang only when the condition changes;
+#X text 30 236 use with;
+#X obj 99 237 #motion_detection;
+#X connect 0 0 3 0;
+#X connect 0 1 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 1;
diff --git a/externals/gridflow/doc/flow_classes/count-help.pd b/externals/gridflow/doc/flow_classes/count-help.pd
new file mode 100644
index 00000000..9d812919
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/count-help.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/doc/flow_classes/cv.KMeans-help.pd b/externals/gridflow/doc/flow_classes/cv.KMeans-help.pd
new file mode 100644
index 00000000..409b73d0
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv.KMeans-help.pd
@@ -0,0 +1,21 @@
+#N canvas 642 52 450 300 10;
+#X obj 60 210 #out window;
+#X obj 60 83 #in babbage.jpg;
+#X obj 60 66 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 60 122 #cast f;
+#X obj 77 64 loadbang;
+#X obj 60 191 #inner (1 3 # 85 51 15);
+#X obj 82 170 #print;
+#X obj 142 113 #out window;
+#X msg 265 106 mode channels;
+#X obj 60 141 cv/#KMeans 8 \, termcrit (8 nil);
+#X connect 1 0 3 0;
+#X connect 1 0 7 0;
+#X connect 2 0 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 1 0;
+#X connect 5 0 0 0;
+#X connect 8 0 9 0;
+#X connect 9 0 5 0;
+#X connect 9 0 6 0;
diff --git a/externals/gridflow/doc/flow_classes/cv.Kalman-help.pd b/externals/gridflow/doc/flow_classes/cv.Kalman-help.pd
new file mode 100644
index 00000000..7dff9602
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv.Kalman-help.pd
@@ -0,0 +1,25 @@
+#N canvas 657 262 450 300 10;
+#X obj 46 59 metro 100;
+#X obj 46 42 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X obj 144 92 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X obj 116 91 f;
+#X obj 141 136 -;
+#X obj 116 158 #pack;
+#X obj 116 110 t f f f;
+#X obj 116 177 #redim (2 1);
+#X obj 47 239 display;
+#X obj 46 213 cv/#Kalman 2 1 1;
+#X text 132 21 This is a help file \, so \, HELP!;
+#X connect 0 0 9 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 1;
+#X connect 3 0 6 0;
+#X connect 4 0 5 1;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 6 1 4 1;
+#X connect 6 2 4 0;
+#X connect 7 0 9 1;
+#X connect 9 0 8 0;
diff --git a/externals/gridflow/doc/flow_classes/cv.numop-help.pd b/externals/gridflow/doc/flow_classes/cv.numop-help.pd
new file mode 100644
index 00000000..9b7c8ac7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv.numop-help.pd
@@ -0,0 +1,45 @@
+#N canvas 1083 158 509 668 10;
+#X obj 4 1 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 401 2 GridFlow 0.9.0;
+#X text 5 0 [opencv];
+#X obj 2 629 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 629 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 629 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 629 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 8 630 see also :;
+#X text 91 629 #numop-help.pd;
+#X obj 22 135 #print;
+#X msg 22 69 2 2 # 0 1 2 3;
+#X obj 22 100 cv/#Add (2 2 # 0 1 2 3);
+#X obj 22 260 #print;
+#X msg 22 194 2 2 # 0 1 2 3;
+#X obj 22 387 #print;
+#X msg 22 321 2 2 # 0 1 2 3;
+#X obj 22 514 #print;
+#X msg 22 448 2 2 # 0 1 2 3;
+#X obj 22 225 cv/#Sub (2 2 # 0 1 2 3);
+#X obj 22 352 cv/#Mul (2 2 # 0 1 2 3);
+#X obj 22 479 cv/#Div (2 2 # 0 1 2 3);
+#X msg 151 448 2 2 # 0 1 42 666;
+#X msg 151 321 2 2 # 0 1 42 666;
+#X msg 151 194 2 2 # 0 1 42 666;
+#X msg 151 69 2 2 # 0 1 42 666;
+#X text 274 479 rounds down;
+#X text 87 0 numeric operators;
+#X connect 10 0 11 0;
+#X connect 11 0 9 0;
+#X connect 13 0 18 0;
+#X connect 15 0 19 0;
+#X connect 17 0 20 0;
+#X connect 18 0 12 0;
+#X connect 19 0 14 0;
+#X connect 20 0 16 0;
+#X connect 21 0 20 1;
+#X connect 22 0 19 1;
+#X connect 23 0 18 1;
+#X connect 24 0 11 1;
diff --git a/externals/gridflow/doc/flow_classes/display-help.pd b/externals/gridflow/doc/flow_classes/display-help.pd
new file mode 100644
index 00000000..3006888a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/display-help.pd
@@ -0,0 +1,30 @@
+#N canvas 414 111 504 403 10;
+#X obj 0 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 339 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 241 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 0 264 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 5 265 Inlet_0;
+#X obj 0 370 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 202 243 Inlets (1);
+#X text 16 312 GRID;
+#X text 17 287 LIST;
+#X text 15 300 INTEGER;
+#X text 394 1 GridFlow 0.8.5;
+#X text 88 278 GUI object equivalent to [print] and [#print]. method
+(any) () Displays the received message in the box \, resizing the box
+so that the message fits exactly.;
+#X obj 90 185 display;
+#X text 5 0 [display];
+#X text 202 340 Outlets (0);
+#X text 204 369 Arguments (0);
+#X msg 319 61 0 1 2 3 5 8 13;
+#X floatatom 319 89 5 0 0 0 - - -;
+#X obj 89 58 #color;
+#X connect 16 0 12 0;
+#X connect 17 0 12 0;
+#X connect 18 0 12 0;
diff --git a/externals/gridflow/doc/flow_classes/exec-help.pd b/externals/gridflow/doc/flow_classes/exec-help.pd
new file mode 100644
index 00000000..4d43e556
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/exec-help.pd
@@ -0,0 +1,40 @@
+#N canvas 628 0 501 450 10;
+#X obj 10 105 cnv 15 30 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 1 273 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 146 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 169 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 324 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 170 Inlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 9 1 exec;
+#X obj 10 105 exec;
+#X obj 13 407 renamefile;
+#X obj 128 407 unix_time;
+#X obj 96 407 ls;
+#X msg 10 77 shell xlogo &;
+#X msg 119 77 shell ftp ac@artengine.ca &;
+#X text 221 147 Inlets (1);
+#X text 398 2 GridFlow 0.8.4;
+#X obj 1 379 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 380 See also;
+#X text 9 25 The [exec] launches a Unix shell program or script. It
+does not return a result \, see the PureData shell after using the
+ftp command.;
+#X text 9 197 SYMBOL;
+#X text 215 275 Outlets (0);
+#X text 15 297 No outlet;
+#X text 210 325 Arguments (0);
+#X text 64 354;
+#X text 14 352 No argument;
+#X text 56 196 Inlet 0 accepts a symbol made of the word "shell" which
+creates a Unix shell and the program or script to be executed in that
+shell like "xlogo &" or "ftp ftpsitename &" \, etc.;
+#X connect 12 0 8 0;
+#X connect 13 0 8 0;
diff --git a/externals/gridflow/doc/flow_classes/for-help.pd b/externals/gridflow/doc/flow_classes/for-help.pd
new file mode 100644
index 00000000..f73c4f00
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/for-help.pd
@@ -0,0 +1,9 @@
+#N canvas 472 284 450 300 10;
+#X obj 41 95 print;
+#X text 41 132 note that 104 should not be included!;
+#X obj 41 53 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 40 115 should print 10 23 36 49 62 75 88 101;
+#X obj 41 71 for 10 114 13;
+#X connect 2 0 4 0;
+#X connect 4 0 0 0;
diff --git a/externals/gridflow/doc/flow_classes/gf.oneshot-help.pd b/externals/gridflow/doc/flow_classes/gf.oneshot-help.pd
new file mode 100644
index 00000000..366cc68c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/gf.oneshot-help.pd
@@ -0,0 +1,51 @@
+#N canvas 161 29 505 543 10;
+#X obj 5 435 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 260 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 283 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 524 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 456 cnv 15 65 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 205 262 Inlets (2);
+#X text 6 284 Inlet 0;
+#X obj 3 352 cnv 15 73 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 353 Inlet 1;
+#X text 5 316 ANY;
+#X text 8 490 ANY;
+#X obj 127 159 cnv 15 72 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 29 34 Like [spigot] \, but turns itself off after each message
+\, so you have to turn it on again to making it pass another message.
+;
+#X text 206 437 Outlets (1);
+#X text 9 457 Outlet;
+#X msg 195 126 1;
+#X obj 171 126 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X msg 127 88 test;
+#X obj 127 219 print;
+#X floatatom 168 90 5 0 0 0 - - -;
+#X floatatom 171 220 5 0 0 0 - - -;
+#X text 232 126 <-- both will reset the object;
+#X text 5 385 BANG;
+#X text 74 489 Outputs incoming message.;
+#X text 194 525 Arguments (none);
+#X text 77 315 Incoming message can be Grids \, Symbols \, Integers
+\, Lists \, etc.;
+#X text 76 385 Resets the object so that the next mesage will be passed
+through.;
+#X obj 127 159 gf.oneshot;
+#X obj 12 1 gf.oneshot;
+#X text 393 1 GridFlow 0.9.4;
+#X connect 16 0 28 1;
+#X connect 17 0 28 1;
+#X connect 18 0 28 0;
+#X connect 20 0 28 0;
+#X connect 28 0 19 0;
+#X connect 28 0 21 0;
diff --git a/externals/gridflow/doc/flow_classes/gridflow-help.pd b/externals/gridflow/doc/flow_classes/gridflow-help.pd
new file mode 100644
index 00000000..dd0f8fae
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/gridflow-help.pd
@@ -0,0 +1,11 @@
+#N canvas 624 183 400 205 10;
+#X text 22 53 dummy object for controlling the profiler;
+#X msg 48 95 profiler_reset;
+#X msg 59 115 profiler_dump;
+#X text 321 18 gridflow;
+#X obj 24 146 gridflow;
+#X text 21 22 gridflow;
+#X msg 168 95 \; gridflow profiler_reset;
+#X msg 168 115 \; gridflow profiler_dump;
+#X connect 1 0 4 0;
+#X connect 2 0 4 0;
diff --git a/externals/gridflow/doc/flow_classes/hpgl_font_render-help.pd b/externals/gridflow/doc/flow_classes/hpgl_font_render-help.pd
new file mode 100644
index 00000000..72582c05
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/hpgl_font_render-help.pd
@@ -0,0 +1,156 @@
+#N canvas 604 0 618 654 10;
+#X obj 215 33 until;
+#X obj 215 16 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 148 16 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1
+;
+#X msg 222 57 rewind;
+#X obj 321 174 print bogus;
+#X obj 215 245 loadbang;
+#X obj 226 174 print command;
+#X obj 147 235 #store;
+#X obj 229 203 loadbang;
+#X obj 226 155 spigot;
+#X obj 272 156 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 33 591 fps;
+#X obj 306 18 bng 15 250 50 0 empty empty empty 17 7 0 10 -258699 -1
+-1;
+#X obj 148 33 metro 1;
+#X obj 206 442 #pack;
+#X obj 236 426 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 0 256;
+#X obj 206 410 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 0 256;
+#X obj 262 442 #pack;
+#X obj 292 426 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 750 256;
+#X obj 262 410 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 1000 256;
+#X obj 124 262 gf.oneshot;
+#X obj 147 179 t b b;
+#X obj 33 610 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-225271 -1 -1 0 256;
+#X obj 33 252 gf.oneshot;
+#X obj 51 119 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 51 136 t b b;
+#X obj 109 420 #draw_hpgl;
+#X obj 33 572 #out window;
+#X obj 145 136 f;
+#X obj 170 136 + 1;
+#X obj 145 155 sel;
+#X text 362 15 TODO: look for bug in [#in grid] code...;
+#X obj 215 131 plotter_parser;
+#X obj 321 155 spigot;
+#X obj 367 156 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 128 520 # >> 4;
+#X msg 215 264 3 # 255 255 255;
+#X msg 229 222 480 640 3 #;
+#X obj 63 543 #gamma;
+#X obj 109 545 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 350 256;
+#X obj 128 482 #convolve (3 3 # 0 1 0 1 12 1);
+#X msg 369 112 PU 0 0 \, LB world;
+#X obj 128 501 # + 7;
+#X obj 98 520 t a;
+#X obj 137 464 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 158 208 t a a;
+#X msg 232 288 PU 0 10 \, PD 1000 10;
+#X obj 33 524 shunt;
+#X obj 72 525 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 98 463 shunt;
+#X obj 359 480 namecanvas foo;
+#X msg 358 416 \; foo obj 0 0 + \, else obj 0 0 zazou;
+#X msg 206 346 PU 0 0 \, print_from_ascii 116 114 97 98 111 117 108
+105 100 111 110;
+#X msg 358 448 \; foo obj 0 20 ++ \, else obj 0 20 zazou;
+#X msg 203 381 PU 50 550 \, print_from_ascii 97 13 10 108 13 10 108
+13 10 244;
+#X obj 252 526 hpgl_find_bbox;
+#X obj 345 509 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 252 545 #to_list;
+#X msg 219 627 PU \$1 \$2 \, PD \$3 \$2 \$3 \$4 \$1 \$4 \$1 \$2;
+#X obj 355 580 print;
+#X obj 215 79 #in grid lots_of_text.hpgl \, headerless \, type b;
+#X obj 148 52 t b b b b;
+#X obj 199 312 hpgl_font_render images/hershey \, spacing 10 \, scaling
+0.12 \, rowheight 54 \, wrap 666;
+#X obj 170 155 % 16;
+#X connect 0 0 60 0;
+#X connect 1 0 0 0;
+#X connect 2 0 13 0;
+#X connect 3 0 60 0;
+#X connect 5 0 36 0;
+#X connect 7 0 20 0;
+#X connect 8 0 37 0;
+#X connect 9 0 6 0;
+#X connect 10 0 9 1;
+#X connect 11 0 22 0;
+#X connect 12 0 3 0;
+#X connect 12 0 37 0;
+#X connect 13 0 61 0;
+#X connect 14 0 26 3;
+#X connect 15 0 14 1;
+#X connect 16 0 14 0;
+#X connect 17 0 26 4;
+#X connect 18 0 17 1;
+#X connect 19 0 17 0;
+#X connect 20 0 26 0;
+#X connect 21 0 7 0;
+#X connect 21 1 20 1;
+#X connect 21 1 28 0;
+#X connect 23 0 47 0;
+#X connect 24 0 25 0;
+#X connect 25 0 7 0;
+#X connect 25 1 23 1;
+#X connect 26 0 49 0;
+#X connect 26 1 21 0;
+#X connect 27 0 11 0;
+#X connect 28 0 29 0;
+#X connect 28 0 30 0;
+#X connect 29 0 63 0;
+#X connect 30 0 24 0;
+#X connect 32 0 9 0;
+#X connect 32 0 62 0;
+#X connect 32 1 33 0;
+#X connect 33 0 4 0;
+#X connect 34 0 33 1;
+#X connect 35 0 43 0;
+#X connect 36 0 26 1;
+#X connect 37 0 7 1;
+#X connect 38 0 27 0;
+#X connect 39 0 38 1;
+#X connect 40 0 42 0;
+#X connect 41 0 62 0;
+#X connect 42 0 35 0;
+#X connect 43 0 45 0;
+#X connect 44 0 49 1;
+#X connect 45 0 23 0;
+#X connect 45 1 7 1;
+#X connect 46 0 62 0;
+#X connect 47 0 27 0;
+#X connect 47 1 38 0;
+#X connect 48 0 47 1;
+#X connect 49 0 43 0;
+#X connect 49 1 40 0;
+#X connect 52 0 62 0;
+#X connect 54 0 62 0;
+#X connect 55 0 57 0;
+#X connect 56 0 55 1;
+#X connect 57 0 58 0;
+#X connect 60 0 32 0;
+#X connect 60 1 0 1;
+#X connect 60 1 2 0;
+#X connect 60 1 24 0;
+#X connect 61 0 60 0;
+#X connect 61 1 60 0;
+#X connect 61 2 60 0;
+#X connect 61 3 60 0;
+#X connect 62 0 26 2;
+#X connect 62 0 55 0;
+#X connect 63 0 28 1;
diff --git a/externals/gridflow/doc/flow_classes/inv0x2a-help.pd b/externals/gridflow/doc/flow_classes/inv0x2a-help.pd
new file mode 100644
index 00000000..0b4af986
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/inv0x2a-help.pd
@@ -0,0 +1,96 @@
+#N canvas 602 28 510 655 10;
+#X obj 1 438 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 7 329 FLOAT;
+#X obj 1 280 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 303 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 440 Outlets (1);
+#X obj 1 521 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 520 Arguments (1);
+#X obj 1 371 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 459 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 394 FLOAT;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 304 Inlet 0;
+#X text 2 373 Inlet 1;
+#X text 221 281 Inlets (2);
+#X text 2 460 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 2 GridFlow 0.8.4;
+#X obj 219 121 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 219 163 #in;
+#X obj 263 164 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 1
+1;
+#X obj 219 82 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 219 185 shunt 2;
+#X text 369 140 image loader;
+#X msg 219 139 open r001.jpg \, bang;
+#X obj 219 101 metro 33.3667;
+#X obj 219 238 #out window \, title inv+;
+#X text 349 221 Outputs negated image;
+#X text 68 221 Outputs initial image;
+#X obj 338 192 hsl 128 8 1000 65000 0 0 empty empty empty -2 -6 0 8
+-262144 -1 -1 1600 1;
+#X text 10 548 FLOAT;
+#X obj 1 590 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 216 592 See also;
+#X obj 105 616 swap;
+#X obj 105 616 swap;
+#X floatatom 34 102 5 0 0 0 - - -;
+#X floatatom 57 120 5 0 0 0 - - -;
+#X floatatom 34 176 5 0 0 0 - - -;
+#X text 323 78 Another application inv+ as a numerical operator of
+the Grid object;
+#X obj 263 210 cnv 15 80 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 33 144 cnv 15 30 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 11 483 FLOAT;
+#X floatatom 105 104 5 0 0 0 - - -;
+#X floatatom 149 121 5 0 0 0 - - -;
+#X floatatom 105 178 5 0 0 0 - - -;
+#X obj 105 145 cnv 15 50 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 9 0 inv*;
+#X obj 105 145 inv* 10;
+#X obj 34 144 inv*;
+#X text 62 548 [inv*] accepts a single float as a creation argument
+which initializes the first value to perform the operation with.;
+#X obj 12 616 inv+;
+#X obj 52 616 # inv*;
+#X text 8 24 The [inv*] performs an inversion on the data passed to
+it. If you consider inlet 0 as the variable "a" and inlet 1 as variable
+"b" \, [inv*] performs the operation "b/a" on the values passed to
+it.;
+#X text 62 330 A float in inlet 1 is stored as the value "a" to perform
+the "b/a" operation.;
+#X text 62 396 A float in inlet 1 is stored as the value "b" to perform
+the "b/a" operation.;
+#X text 64 485 Outputs the result of the operation "b/a".;
+#X obj 263 209 # inv* 4000;
+#X text 288 163 inversion;
+#X connect 17 0 23 0;
+#X connect 18 0 21 0;
+#X connect 19 0 21 1;
+#X connect 20 0 24 0;
+#X connect 21 0 25 0;
+#X connect 21 1 55 0;
+#X connect 23 0 18 0;
+#X connect 24 0 17 0;
+#X connect 28 0 55 1;
+#X connect 34 0 47 0;
+#X connect 35 0 47 1;
+#X connect 41 0 46 0;
+#X connect 42 0 46 1;
+#X connect 46 0 43 0;
+#X connect 47 0 36 0;
+#X connect 55 0 25 0;
diff --git a/externals/gridflow/doc/flow_classes/inv0x2b-help.pd b/externals/gridflow/doc/flow_classes/inv0x2b-help.pd
new file mode 100644
index 00000000..e0d6bcdc
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/inv0x2b-help.pd
@@ -0,0 +1,96 @@
+#N canvas 698 0 510 655 10;
+#X obj 1 438 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 7 329 FLOAT;
+#X obj 1 280 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 303 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 440 Outlets (1);
+#X obj 1 521 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 520 Arguments (1);
+#X obj 1 371 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 459 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 6 394 FLOAT;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 304 Inlet 0;
+#X text 2 373 Inlet 1;
+#X text 221 281 Inlets (2);
+#X text 2 460 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 2 GridFlow 0.8.4;
+#X obj 219 121 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 288 163 negative;
+#X obj 219 163 #in;
+#X obj 263 164 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 219 82 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 219 185 shunt 2;
+#X text 369 140 image loader;
+#X msg 219 139 open r001.jpg \, bang;
+#X obj 219 101 metro 33.3667;
+#X obj 219 238 #out window \, title inv+;
+#X text 349 221 Outputs negated image;
+#X text 68 221 Outputs initial image;
+#X obj 331 192 hsl 128 8 0 255 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 6000 1;
+#X text 10 548 FLOAT;
+#X text 62 396 A float in inlet 1 is stored as the value "b" to perform
+the "b-a" operation.;
+#X text 62 330 A float in inlet 1 is stored as the value "a" to perform
+the "b-a" operation.;
+#X obj 1 590 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 216 592 See also;
+#X obj 105 616 swap;
+#X obj 105 616 swap;
+#X obj 9 0 inv+;
+#X text 62 548 [inv+] accepts a single float as a creation argument
+which initializes the first value to perform the operation with.;
+#X obj 12 616 inv*;
+#X text 9 24 The [inv+] performs an inversion on the data passed to
+it. If you consider inlet 0 as the variable "a" and inlet 1 as variable
+"b" \, [inv+] performs the operation "b-a" on the values passed to
+it.;
+#X floatatom 34 102 5 0 0 0 - - -;
+#X floatatom 57 119 5 0 0 0 - - -;
+#X floatatom 34 176 5 0 0 0 - - -;
+#X text 323 78 Another application inv+ as a numerical operator of
+the Grid object;
+#X obj 52 616 # inv+;
+#X obj 264 211 cnv 15 72 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 33 144 cnv 15 30 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 34 144 inv+;
+#X obj 263 211 # inv+ 255;
+#X text 11 483 FLOAT;
+#X text 64 485 Outputs the result of the operation "b-a".;
+#X floatatom 105 104 5 0 0 0 - - -;
+#X floatatom 149 121 5 0 0 0 - - -;
+#X floatatom 105 178 5 0 0 0 - - -;
+#X obj 105 145 cnv 15 50 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 105 145 inv+ 10;
+#X connect 17 0 24 0;
+#X connect 19 0 22 0;
+#X connect 20 0 22 1;
+#X connect 21 0 25 0;
+#X connect 22 0 26 0;
+#X connect 22 1 49 0;
+#X connect 24 0 19 0;
+#X connect 25 0 17 0;
+#X connect 29 0 49 1;
+#X connect 41 0 48 0;
+#X connect 42 0 48 1;
+#X connect 48 0 43 0;
+#X connect 49 0 26 0;
+#X connect 52 0 56 0;
+#X connect 53 0 56 1;
+#X connect 56 0 54 0;
diff --git a/externals/gridflow/doc/flow_classes/listappend-help.pd b/externals/gridflow/doc/flow_classes/listappend-help.pd
new file mode 100644
index 00000000..cd77dff7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listappend-help.pd
@@ -0,0 +1,58 @@
+#N canvas 38 23 507 568 10;
+#X obj 1 334 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 235 LIST;
+#X obj 1 185 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 208 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 336 Outlets (1);
+#X obj 2 414 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 355 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 209 Inlet 0;
+#X text 2 356 Outlet 0;
+#X obj -3 -1 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 472 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 219 473 See also;
+#X obj 10 506 listappend;
+#X obj 99 506 listelement;
+#X obj 198 507 listfind;
+#X obj 291 507 listflatten;
+#X obj 11 533 listmake;
+#X obj 99 532 listprepend;
+#X obj 199 533 listreverse;
+#X obj 292 533 listsublist;
+#X msg 80 87 1 3 hello 8 13;
+#X obj 80 131 cnv 15 170 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X msg 248 85 1 12 a b c d e f g h i j k l;
+#X obj 81 155 display;
+#X obj 2 271 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 3 273 Inlet 1;
+#X text 8 380 LIST;
+#X msg 257 106 200 201 202 203 204 205 206;
+#X text 66 235 Accepts a list to be appended to initial list.;
+#X text 9 297 LIST;
+#X text 221 186 Inlets (2);
+#X text 65 381 Outputs the resulting list.;
+#X text 213 413 Arguments (n);
+#X text 7 441 ANY;
+#X text 62 442 This optional argument can contain the initial list
+;
+#X obj 10 0 listappend;
+#X obj 80 132 listappend 1 2 3 4 5 6 7;
+#X text 11 22 The [listappend] combines two lists together. It takes
+the initial list (List1)(passed as an argument or to inlet 1) and appends
+to it the list passed to inlet 0 (List0). [listappend] combines List0
+followed by List1 in a new list.;
+#X text 65 297 Accepts initial list to appended.;
+#X text 392 0 GridFlow 0.9.0;
+#X connect 20 0 36 0;
+#X connect 22 0 36 1;
+#X connect 27 0 36 1;
+#X connect 36 0 23 0;
diff --git a/externals/gridflow/doc/flow_classes/listelement-help.pd b/externals/gridflow/doc/flow_classes/listelement-help.pd
new file mode 100644
index 00000000..e1aa3bf9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listelement-help.pd
@@ -0,0 +1,52 @@
+#N canvas 92 61 509 554 10;
+#X obj 4 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 323 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 176 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 199 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 9 200 Inlet_0;
+#X text 206 178 Inlets (2);
+#X text 215 325 Outlets (1);
+#X obj 6 429 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 212 428 Arguments (1);
+#X obj 5 261 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 344 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 262 Inlet_1;
+#X obj 11 1 listelement;
+#X floatatom 262 142 5 0 0 0 - - -;
+#X floatatom 281 88 5 0 0 0 - - -;
+#X obj 195 140 print;
+#X msg 195 63 1 3 hello 8 13;
+#X obj 195 111 cnv 15 93 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 7 346 Outlet_0;
+#X text 14 231 LIST;
+#X text 10 460 INTEGER;
+#X obj 195 111 listelement 0;
+#X text 78 231 Accepts a list of numbers or symbols.;
+#X text 10 25 Outputs one element from a list as selected by an integer.
+;
+#X text 10 373 INTEGER;
+#X text 11 387 SYMBOL;
+#X text 75 373 The element selected by the index is sent to the outlet
+and can be viewed in the console using the print object or in a number
+box if displaying an integer.;
+#X text 75 460 An integer acts as an index \, it selects the position
+of an element in a list. The selected element is output \, for example:
+integer "0" selects and outputs the first element in a list \, integer
+"1" selects and outputs the second element in a list \, integers "-1"
+selects and outputs the last element in a list.;
+#X text 77 289 Changes the value of the argument i.e. changes the index
+into the list to get a different element.;
+#X text 11 290 INTEGER;
+#X text 396 1 GridFlow 0.9.0;
+#X connect 14 0 21 1;
+#X connect 16 0 21 0;
+#X connect 21 0 13 0;
+#X connect 21 0 15 0;
diff --git a/externals/gridflow/doc/flow_classes/listflatten-help.pd b/externals/gridflow/doc/flow_classes/listflatten-help.pd
new file mode 100644
index 00000000..6db88217
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listflatten-help.pd
@@ -0,0 +1,46 @@
+#N canvas 630 27 508 513 10;
+#X obj 1 302 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 255 LIST;
+#X obj 1 205 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 228 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 304 Outlets (1);
+#X obj 0 382 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 323 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 229 Inlet 0;
+#X text 2 324 Outlet 0;
+#X obj 1 418 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 219 419 See also;
+#X obj 10 452 listappend;
+#X obj 99 452 listelement;
+#X obj 198 453 listfind;
+#X obj 291 453 listflatten;
+#X obj 11 477 listmake;
+#X obj 99 476 listprepend;
+#X obj 199 477 listreverse;
+#X obj 292 477 listsublist;
+#X obj 103 104 cnv 15 79 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 104 137 display;
+#X text 8 348 LIST;
+#X obj -1 -3 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 -2 listflatten;
+#X text 393 -2 GridFlow 0.9.0;
+#X text 221 206 Inlets (1);
+#X obj 103 104 listflatten;
+#X text 212 382 Arguments (0);
+#X text 64 348 Outputs the flattened list.;
+#X msg 88 68 1 (2 (3 4 5) 6 7) 8;
+#X text 25 22 Takes nested lists and places their contents into a single
+list.;
+#X obj 89 171 display;
+#X text 65 255 Accepts a nested list.;
+#X connect 26 0 20 0;
+#X connect 29 0 26 0;
+#X connect 29 0 31 0;
diff --git a/externals/gridflow/doc/flow_classes/listlength-help.pd b/externals/gridflow/doc/flow_classes/listlength-help.pd
new file mode 100644
index 00000000..f5693914
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listlength-help.pd
@@ -0,0 +1,52 @@
+#N canvas 687 0 504 509 10;
+#X obj 1 273 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 218 LIST;
+#X obj 1 168 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 191 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 275 Outlets (1);
+#X obj 2 353 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 294 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 192 Inlet 0;
+#X text 2 295 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 10 0 listlength;
+#X text 398 2 GridFlow 0.8.4;
+#X text 8 26 The [listlength] outputs the number of elements in the
+incoming list.;
+#X text 221 169 Inlets (1);
+#X text 61 320 Outputs the number of elements in the list.;
+#X text 9 380 No argument;
+#X text 211 354 Arguments (0);
+#X text 9 380 No argument;
+#X obj 3 411 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 219 412 See also;
+#X obj 10 445 listappend;
+#X obj 99 445 listelement;
+#X obj 198 446 listfind;
+#X obj 291 446 listflatten;
+#X obj 11 472 listmake;
+#X obj 99 471 listprepend;
+#X obj 199 472 listreverse;
+#X obj 292 472 listsublist;
+#X floatatom 206 142 5 0 0 0 - - -;
+#X obj 139 140 print;
+#X msg 139 63 1 3 hello 8 13;
+#X obj 139 102 cnv 15 73 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 139 102 listlength;
+#X msg 246 78 1 12 a b c d e f g h i j k l;
+#X text 58 218 The length of the list passed to the left inlet will
+be returned in the outlet.;
+#X text 8 319 INT;
+#X connect 31 0 33 0;
+#X connect 33 0 29 0;
+#X connect 33 0 30 0;
+#X connect 34 0 33 0;
diff --git a/externals/gridflow/doc/flow_classes/listprepend-help.pd b/externals/gridflow/doc/flow_classes/listprepend-help.pd
new file mode 100644
index 00000000..d02f9d69
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listprepend-help.pd
@@ -0,0 +1,59 @@
+#N canvas 631 0 507 568 10;
+#X obj 1 334 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 235 LIST;
+#X obj 1 185 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 208 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 336 Outlets (1);
+#X obj 2 414 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 355 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 209 Inlet 0;
+#X text 2 356 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 472 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 219 473 See also;
+#X obj 10 506 listappend;
+#X obj 99 506 listelement;
+#X obj 198 507 listfind;
+#X obj 291 507 listflatten;
+#X obj 11 533 listmake;
+#X obj 99 532 listprepend;
+#X obj 199 533 listreverse;
+#X obj 292 533 listsublist;
+#X msg 80 87 1 3 hello 8 13;
+#X obj 78 131 cnv 15 178 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X msg 248 85 1 12 a b c d e f g h i j k l;
+#X obj 81 155 display;
+#X obj 2 271 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 3 273 Inlet 1;
+#X text 8 380 LIST;
+#X obj 10 0 listprepend;
+#X msg 257 106 200 201 202 203 204 205 206;
+#X obj 80 132 listprepend 1 2 3 4 5 6 7;
+#X text 66 235 Accepts a list to be appended to initial list.;
+#X text 9 297 LIST;
+#X text 64 297 Accepts initial list to be appended to.;
+#X text 221 186 Inlets (2);
+#X text 65 381 Outputs the resulting list.;
+#X text 213 413 Arguments (n);
+#X text 7 441 ANY;
+#X text 62 442 This optional argument can contain the initial list
+;
+#X text 8 25 The [listprepend] combines two lists together. It takes
+the initial list (List1)(passed as an argument or to inlet 1) and appends
+the list passed to inlet 0 (List0). [listprepend] combines List1 followed
+by List0 in a new list.;
+#X text 398 2 GridFlow 0.9.0;
+#X connect 21 0 30 0;
+#X connect 23 0 30 1;
+#X connect 29 0 30 1;
+#X connect 30 0 24 0;
diff --git a/externals/gridflow/doc/flow_classes/listsublist-help.pd b/externals/gridflow/doc/flow_classes/listsublist-help.pd
new file mode 100644
index 00000000..3ad88017
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listsublist-help.pd
@@ -0,0 +1,64 @@
+#N canvas 630 27 508 642 10;
+#X obj 1 433 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 255 LIST;
+#X obj 1 205 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 228 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 215 435 Outlets (1);
+#X obj 2 513 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 454 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 398 1 GridFlow 0.8.4;
+#X text 2 229 Inlet 0;
+#X text 2 455 Outlet 0;
+#X obj 1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 571 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 219 572 See also;
+#X obj 10 605 listappend;
+#X obj 99 605 listelement;
+#X obj 198 606 listfind;
+#X obj 291 606 listflatten;
+#X obj 11 630 listmake;
+#X obj 99 629 listprepend;
+#X obj 199 630 listreverse;
+#X obj 292 630 listsublist;
+#X msg 153 89 1 3 hello 8 13;
+#X obj 153 153 cnv 15 57 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X msg 162 113 1 12 a b c d e f g h i j k l;
+#X obj 154 177 display;
+#X obj 2 283 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 3 285 Inlet 1;
+#X text 3 314 INTEGER;
+#X text 65 255 Accepts a list.;
+#X text 65 314 The index in the list to start the sublist at.;
+#X obj 1 346 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 373 INTEGER;
+#X text 2 348 Inlet 2;
+#X text 66 373 The number of items wanted from the list starting at
+the index specified.;
+#X text 212 513 Arguments (2);
+#X text 8 479 LIST;
+#X text 64 480 Outputs the sublist as specified by the inlets or the
+arguments.;
+#X text 6 538 Integers specifying index and length of the sublist;
+#X text 9 23 The [listsublist] outputs consecutive elements of the
+list \, as selected by index (inlet 1 or arg 1) and length (inlet 2
+or arg 2). A negative index will start from the end of the list (like
+-1 means last element in the list).;
+#X floatatom 204 135 5 0 0 0 - - -;
+#X text 398 2 GridFlow 0.9.0;
+#X text 221 206 Inlets (3);
+#X obj 153 153 listmake;
+#X obj 3 -1 listmake;
+#X connect 21 0 42 0;
+#X connect 23 0 42 0;
+#X connect 39 0 42 1;
+#X connect 42 0 24 0;
diff --git a/externals/gridflow/doc/flow_classes/ls-help.pd b/externals/gridflow/doc/flow_classes/ls-help.pd
new file mode 100644
index 00000000..5bc04c39
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/ls-help.pd
@@ -0,0 +1,21 @@
+#N canvas 293 272 624 295 10;
+#X text 259 22 GridFlow 0.8.0;
+#X text 30 266 see also:;
+#X obj 106 267 renamefile;
+#X obj 189 267 unix_time;
+#X obj 67 130 ls;
+#X obj 67 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 25 186 listlength;
+#X floatatom 25 220 5 0 0 0 - - -;
+#X obj 107 187 display;
+#X obj 265 267 exec;
+#X msg 67 81 symbol /home;
+#X text 157 118 Similar to the Unix command 'ls'. Returns the filenames
+in a directory. May be used with [listlength] to determine the number
+of files in a directory.;
+#X connect 4 0 6 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 7 0;
+#X connect 10 0 4 0;
diff --git a/externals/gridflow/doc/flow_classes/mysql-help.pd b/externals/gridflow/doc/flow_classes/mysql-help.pd
new file mode 100644
index 00000000..0c46ef08
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/mysql-help.pd
@@ -0,0 +1,22 @@
+#N canvas 0 0 558 326 10;
+#X obj 39 218 mysql;
+#X obj 52 278 rubyprint;
+#X msg 66 159 symbol test;
+#X obj 70 252 print mysql;
+#X msg 39 91 connect server_url mysql_user some_password database_name
+;
+#X msg 53 121 query select thing from some_table;
+#X msg 162 143 query select * from some_table order by rand() limit
+1;
+#X msg 60 187 query insert into some_table (something) values (' \$1
+');
+#X text 39 26 http://tmtm.org/en/mysql;
+#X text 37 9 [mysql] requires mysql-ruby from Tomita Masahiro;
+#X text 39 43 no recompiling required \; -);
+#X connect 0 0 1 0;
+#X connect 0 0 3 0;
+#X connect 2 0 7 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
diff --git a/externals/gridflow/doc/flow_classes/parallel_port-help.pd b/externals/gridflow/doc/flow_classes/parallel_port-help.pd
new file mode 100644
index 00000000..d871515d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/parallel_port-help.pd
@@ -0,0 +1,78 @@
+#N canvas 0 27 742 490 10;
+#X floatatom 47 380 5 0 0 0 - - -;
+#X floatatom 121 348 5 0 0 0 - - -;
+#X floatatom 196 323 5 0 0 0 - - -;
+#X obj 47 34 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1
+;
+#X text 420 278 * my system resets the owner of the printer port to
+'root.lp' so I need to issue as root 'chown myuser.lp';
+#X text 421 37 * you will need : a paper clip (or a 'high tech' solid
+core 22-18 awg wire) an led a button;
+#X text 422 238 * consult http://en.wikipedia.org/wiki/Parallel_Port
+for the pinouts + more;
+#X text 425 357 7 6 5 4 3 2 1 0 bit number;
+#X text 425 371 9 8 7 6 5 4 3 2 pin number;
+#X text 424 331 layout of bit to pin numbers;
+#X text 67 33 <-- This will send a 0 or a 1 to the first pin;
+#X text 421 145 2 connect the led between pins 2 (Data0) and 23 (GND)
+;
+#X text 421 87 1 break the paper clip in two and connect pin 11 (Busy)
+to pin 24 (GND) and pin 12 (Paper-Out) to 25 (GND). Those pins are
+normally 1 and grounding them opens the port for messages.;
+#X text 113 228 Will accept values from 0-255;
+#X obj 1 -37 cnv 15 840 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 722 -36 GridFlow 0.9.0;
+#X obj 47 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 69 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 91 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 113 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 136 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 158 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 180 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 203 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 47 229 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-241291 -1 -1 0 256;
+#X obj 47 191 #fold +;
+#X obj 47 210 #export;
+#X obj 47 172 # << (0 1 2 3 4 5 6 7);
+#X obj 47 153 #pack 8 \, \, \, \, \, \, \, \, \, \, \, \, \, \, \,
+\,;
+#X text 206 293 takes the port as argument;
+#X text 93 379 <-- reserved for future use;
+#X text 44 -1 The cheapest digital i/o interface;
+#X text 238 322 <-- parallel port flags;
+#X text 419 188 3 connect a button between pin 10 and 22 (GND);
+#X text 163 348 <-- status (pin 10);
+#X obj 47 293 parallel_port /dev/lp0;
+#X obj 47 63 metro 1;
+#X text 425 402 Flags : PERRORP (active low) \, PSELECD (active high)
+\, POUTPA (active high) \, PACK (active low) \, PBUSY (active high)
+;
+#X obj 11 -37 parallel_port /dev/someport;
+#X connect 3 0 36 0;
+#X connect 16 0 28 0;
+#X connect 17 0 28 1;
+#X connect 18 0 28 2;
+#X connect 19 0 28 3;
+#X connect 20 0 28 4;
+#X connect 21 0 28 5;
+#X connect 22 0 28 6;
+#X connect 23 0 28 7;
+#X connect 24 0 35 0;
+#X connect 25 0 26 0;
+#X connect 26 0 24 0;
+#X connect 27 0 25 0;
+#X connect 28 0 27 0;
+#X connect 35 0 0 0;
+#X connect 35 1 1 0;
+#X connect 35 2 2 0;
+#X connect 36 0 16 0;
diff --git a/externals/gridflow/doc/flow_classes/plotter_control-help.pd b/externals/gridflow/doc/flow_classes/plotter_control-help.pd
new file mode 100644
index 00000000..1381d341
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/plotter_control-help.pd
@@ -0,0 +1,64 @@
+#N canvas 423 134 724 349 10;
+#X text 557 11 GridFlow 0.8.0;
+#X obj 92 99 r foo;
+#X msg 557 173 print_from_ascii $*;
+#X msg 557 52 print hello_world;
+#X msg 284 54 pu;
+#X msg 284 102 pd;
+#X msg 285 205 sp 0;
+#X msg 284 154 pa 120 160;
+#X obj 557 124 unix_time;
+#X obj 557 148 @export_list;
+#X obj 557 104 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 74 255 comport 0 9600;
+#X obj 76 129 plotter_control;
+#X obj 93 158 print hpgl_commands;
+#X obj 557 196 s foo;
+#X text 324 54 pen up;
+#X text 324 102 pen down;
+#X obj 557 74 s foo;
+#X text 368 154 move to absolute position;
+#N canvas 0 0 450 300 draw_a_rectangle 0;
+#X obj 120 196 @export_list;
+#X obj 128 159 @ * ( 110 320 );
+#X msg 31 156 pu \, sp 0;
+#X obj 28 97 fork;
+#X msg 114 222 pd \, pa \$2 \$1;
+#X msg 129 100 sp 5 \, pu \, pa 0 0 \, other si 320 320;
+#X obj 115 252 s foo;
+#X obj 33 71 fork;
+#X obj 30 126 fork;
+#X msg 128 134 0 0 \, 0 1 \, 1 1 \, 1 0 \, 0 0;
+#X obj 31 35 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 6 0;
+#X connect 3 0 8 0;
+#X connect 3 1 9 0;
+#X connect 4 0 6 0;
+#X connect 7 0 3 0;
+#X connect 7 1 5 0;
+#X connect 8 0 2 0;
+#X connect 9 0 1 0;
+#X connect 10 0 7 0;
+#X restore 557 228 pd draw_a_rectangle;
+#X text 76 9 plotter_control;
+#X text 74 280 use the comport object to interface to the plotter;
+#X obj 285 227 s foo;
+#X obj 284 176 s foo;
+#X obj 284 124 s foo;
+#X obj 284 76 s foo;
+#X text 328 207 (0...6) remove/change the pen;
+#X connect 1 0 12 0;
+#X connect 2 0 14 0;
+#X connect 3 0 17 0;
+#X connect 4 0 25 0;
+#X connect 5 0 24 0;
+#X connect 6 0 22 0;
+#X connect 7 0 23 0;
+#X connect 8 0 9 0;
+#X connect 9 0 2 0;
+#X connect 10 0 8 0;
+#X connect 12 0 13 0;
diff --git a/externals/gridflow/doc/flow_classes/plotter_parser-help.pd b/externals/gridflow/doc/flow_classes/plotter_parser-help.pd
new file mode 100644
index 00000000..66d847dd
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/plotter_parser-help.pd
@@ -0,0 +1,96 @@
+#N canvas 565 248 655 441 10;
+#X obj 215 131 plotter_parser;
+#X obj 215 33 until;
+#X obj 215 16 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 148 16 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1
+;
+#X msg 222 57 rewind;
+#X obj 317 129 print bogus;
+#X obj 215 245 loadbang;
+#X obj 226 174 print command;
+#X obj 147 215 #store;
+#X obj 229 203 loadbang;
+#X obj 226 155 spigot;
+#X obj 272 156 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 33 300 fps;
+#X obj 306 18 bng 15 250 50 0 empty empty empty 17 7 0 10 -258699 -1
+-1;
+#X obj 148 33 metro 1;
+#X obj 215 79 #in grid plotter_parser_old.pd.hpgl \, headerless \,
+type b;
+#X obj 346 272 #pack;
+#X obj 376 256 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 0 256;
+#X obj 346 240 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 -1000 256;
+#X obj 346 323 #pack;
+#X obj 376 307 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 10333 256;
+#X obj 346 291 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 7000 256;
+#X obj 148 52 t b b;
+#X obj 124 252 gf.oneshot;
+#X obj 147 196 t b b;
+#X obj 33 319 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-225271 -1 -1 7.67569 256;
+#X obj 33 252 gf.oneshot;
+#X obj 51 119 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 51 136 t b b;
+#X obj 143 285 #draw_hpgl;
+#X obj 33 281 #out window;
+#X obj 145 136 f;
+#X obj 170 136 + 1;
+#X obj 145 155 sel;
+#X msg 229 222 600 800 3 b #;
+#X msg 215 264 3 b # 255 255 255;
+#X obj 170 155 % 8;
+#X connect 0 0 10 0;
+#X connect 0 0 29 2;
+#X connect 0 1 5 0;
+#X connect 1 0 15 0;
+#X connect 2 0 1 0;
+#X connect 3 0 14 0;
+#X connect 4 0 15 0;
+#X connect 6 0 35 0;
+#X connect 8 0 23 0;
+#X connect 8 0 26 0;
+#X connect 9 0 34 0;
+#X connect 10 0 7 0;
+#X connect 11 0 10 1;
+#X connect 12 0 25 0;
+#X connect 13 0 4 0;
+#X connect 13 0 34 0;
+#X connect 14 0 22 0;
+#X connect 15 0 0 0;
+#X connect 15 1 1 1;
+#X connect 15 1 3 0;
+#X connect 15 1 27 0;
+#X connect 16 0 29 3;
+#X connect 17 0 16 1;
+#X connect 18 0 16 0;
+#X connect 19 0 29 4;
+#X connect 20 0 19 1;
+#X connect 21 0 19 0;
+#X connect 22 0 15 0;
+#X connect 22 1 15 0;
+#X connect 23 0 29 0;
+#X connect 24 0 8 0;
+#X connect 24 1 23 1;
+#X connect 24 1 31 0;
+#X connect 26 0 30 0;
+#X connect 27 0 28 0;
+#X connect 28 0 8 0;
+#X connect 28 1 26 1;
+#X connect 29 0 8 1;
+#X connect 29 1 24 0;
+#X connect 30 0 12 0;
+#X connect 31 0 32 0;
+#X connect 31 0 33 0;
+#X connect 32 0 36 0;
+#X connect 33 0 27 0;
+#X connect 34 0 8 1;
+#X connect 35 0 29 1;
+#X connect 36 0 31 1;
diff --git a/externals/gridflow/doc/flow_classes/renamefile-help.pd b/externals/gridflow/doc/flow_classes/renamefile-help.pd
new file mode 100644
index 00000000..70d9937c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/renamefile-help.pd
@@ -0,0 +1,9 @@
+#N canvas 383 288 441 244 10;
+#X obj 50 120 renamefile;
+#X msg 50 76 list current_name new_name;
+#X obj 128 206 ls;
+#X text 42 208 also see :;
+#X text 313 21 GridFlow 0.8.0;
+#X text 45 157 * The path should correspond to the location of the
+file from where pd is started;
+#X connect 1 0 0 0;
diff --git a/externals/gridflow/doc/flow_classes/route2-help.pd b/externals/gridflow/doc/flow_classes/route2-help.pd
new file mode 100644
index 00000000..40f4debf
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/route2-help.pd
@@ -0,0 +1,21 @@
+#N canvas 0 0 450 300 10;
+#X obj 21 140 route2 blah foo bar;
+#X msg 39 39 blah blah blah;
+#X msg 39 62 foo 42;
+#X msg 39 86 bar 3.14159;
+#X obj 150 160 display;
+#X obj 107 180 display;
+#X obj 64 200 display;
+#X obj 22 220 display;
+#X msg 39 114 pas rapport;
+#X text 186 29 just like [route];
+#X text 187 46 but preserves message as-is;
+#X text 325 7 GridFlow 0.8.4;
+#X connect 0 0 7 0;
+#X connect 0 1 6 0;
+#X connect 0 2 5 0;
+#X connect 0 3 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 8 0 0 0;
diff --git a/externals/gridflow/doc/flow_classes/seq_fold-help.pd b/externals/gridflow/doc/flow_classes/seq_fold-help.pd
new file mode 100644
index 00000000..6870ac56
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/seq_fold-help.pd
@@ -0,0 +1,13 @@
+#N canvas 679 317 400 300 10;
+#X obj 125 166 seq_fold;
+#X msg 125 65 2 \, 3 \, 5 \, 7 \, end;
+#X obj 125 93 route end;
+#X obj 150 190 +;
+#X obj 126 239 display;
+#X connect 0 0 4 0;
+#X connect 0 1 3 0;
+#X connect 0 2 3 1;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 2 1 0 1;
+#X connect 3 0 0 3;
diff --git a/externals/gridflow/doc/flow_classes/shunt-help.pd b/externals/gridflow/doc/flow_classes/shunt-help.pd
new file mode 100644
index 00000000..7826ff2e
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/shunt-help.pd
@@ -0,0 +1,58 @@
+#N canvas 76 32 504 500 10;
+#X obj 1 331 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 181 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 204 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 412 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 210 411 Arguments (1);
+#X obj 1 271 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 1 352 cnv 15 60 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 2 205 Inlet 0;
+#X text 2 272 Inlet 1;
+#X text 221 182 Inlets (2);
+#X obj -1 0 cnv 15 500 18 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 10 0 shunt;
+#X obj 165 117 cnv 15 52 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 166 117 shunt 4;
+#X floatatom 121 151 5 0 0 0 - - -;
+#X floatatom 163 151 5 0 0 0 - - -;
+#X floatatom 205 151 5 0 0 0 - - -;
+#X floatatom 247 151 5 0 0 0 - - -;
+#X floatatom 166 85 5 0 0 0 - - -;
+#X obj 210 85 hradio 15 1 0 4 empty empty empty 0 -6 0 8 -260818 -1
+-1 0;
+#X text 272 84 <-- select output here;
+#X text 65 84 vary this -->;
+#X obj 346 119 shunt;
+#X text 63 295 The integer passed to inlet 1 determines which outlet
+is active.;
+#X text 6 229 ANY;
+#X text 61 229 Incoming message can be Grids \, Symbols \, Integers
+\, Lists \, etc.;
+#X text 65 439 [shunt] accepts an integer as a creation argument which
+defines the number of outlets desired. If [shunt] is created without
+an argument \, it will have 2 outlets.;
+#X text 215 333 Outlets (n);
+#X text 2 353 Outlets;
+#X text 10 380 ANY;
+#X text 64 380 Outputs incoming message value according to the selector
+value.;
+#X text 6 295 INTEGER;
+#X text 10 438 INTEGER;
+#X text 7 29 The [shunt] routes any type of data to its active outlet.
+The number of outlets is defined by the argument at creation and the
+active outlet is defined by its right most inlet.;
+#X text 398 2 GridFlow 0.9.0;
+#X connect 13 0 14 0;
+#X connect 13 1 15 0;
+#X connect 13 2 16 0;
+#X connect 13 3 17 0;
+#X connect 18 0 13 0;
+#X connect 19 0 13 1;
diff --git a/externals/gridflow/doc/flow_classes/unix_time-help.pd b/externals/gridflow/doc/flow_classes/unix_time-help.pd
new file mode 100644
index 00000000..d80b4c19
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/unix_time-help.pd
@@ -0,0 +1,29 @@
+#N canvas 134 38 639 312 10;
+#X obj 91 113 unix_time;
+#X obj 91 82 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 8 172 #export_list;
+#X obj 91 40 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 9 246 display;
+#X obj 91 58 metro 500;
+#X text 60 243 <-- Ascii format for the date;
+#X obj 308 221 display;
+#X obj 123 171 display;
+#X obj 307 195 display;
+#X obj 306 170 rubysprintf %04d%02d%02d-%02d%02d%02d;
+#X obj 8 282 cnv 15 720 30 empty empty empty 20 12 0 14 -200249 -66577
+0;
+#X text 16 289 GridFlow 0.8.0;
+#X obj 8 5 cnv 15 720 15 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 9 5 SUMMARY : the unixtime command;
+#X connect 0 0 2 0;
+#X connect 0 1 8 0;
+#X connect 0 2 7 0;
+#X connect 0 2 10 0;
+#X connect 1 0 0 0;
+#X connect 2 0 4 0;
+#X connect 3 0 5 0;
+#X connect 5 0 1 0;
+#X connect 10 0 9 0;
diff --git a/externals/gridflow/doc/format.html b/externals/gridflow/doc/format.html
new file mode 100644
index 00000000..3dd3a830
--- /dev/null
+++ b/externals/gridflow/doc/format.html
@@ -0,0 +1,511 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><!-- $Id: format.html 3732 2008-06-02 14:30:54Z matju $ -->
+
+
+<title>GridFlow 0.9.3 - Reference Manual: Format Classes</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="stylesheet" href="gridflow.css" type="text/css"></head>
+
+
+<body leftmargin="0" topmargin="0" style="background-color: rgb(255, 255, 255);" marginheight="0" marginwidth="0">
+<table width="100%" cellspacing="10"><tr><td>
+<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
+ <td> <img src="images/header1.png" alt="GridFlow" width="384" height="64"></td>
+ <td width="100%"><img src="images/header2.png" alt="GridFlow" width="100%" height="64"></td>
+ <td> <img src="images/header3.png" alt="GridFlow" width="32" height="64"></td>
+</table>
+</td></tr></table>
+<blockquote>
+
+
+<table bgcolor="white" border="0" cellspacing="2" width="100%">
+
+<tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4" height="16">
+
+ <h4>GridFlow 0.9.3 - Reference Manual: Format Classes</h4>
+</td></tr>
+<tr>
+ <td rowspan="2" width="5%">&nbsp;</td>
+ <td height="23" width="15%">&nbsp;</td>
+ <td height="23" width="80%">&nbsp;</td>
+ <td height="23" width="5%">&nbsp;</td>
+</tr>
+<tr><td colspan="2"><div cols="1"><h4><a href="#Objects_for_Input/Output">Objects for Input/Output</a></h4><ul>
+<li><a href="##in">#in
+</a></li>
+<li><a href="##out">#out
+</a></li>
+<li><a href="##peephole">#peephole
+</a></li>
+<li><a href="##mouse">#mouse
+</a></li>
+<li><a href="##camera">#camera
+</a></li>
+</ul>
+<h4><a href="#Picture/Movie_Formats">Picture/Movie Formats</a></h4><ul>
+<li><a href="#format%20ppm%20#in/#out">format ppm #in/#out
+</a></li>
+<li><a href="#format%20targa%20#in/#out">format targa #in/#out
+</a></li>
+<li><a href="#format%20jpeg%20#in/#out">format jpeg #in/#out
+</a></li>
+<li><a href="#format%20png%20#in">format png #in
+</a></li>
+<li><a href="#format%20quicktime%20#in/#out">format quicktime #in/#out
+</a></li>
+<li><a href="#format%20mpeg%20#in">format mpeg #in
+</a></li>
+<li><a href="#format%20grid%20#in/#out">format grid #in/#out
+</a></li>
+</ul>
+<h4><a href="#Acquisition_Devices">Acquisition Devices</a></h4><ul>
+<li><a href="#format%20videodev%20#in">format videodev #in
+</a></li>
+</ul>
+<h4><a href="#Window_Output">Window Output</a></h4><ul>
+<li><a href="#format%20x11%20#in/#out">format x11 #in/#out
+</a></li>
+<li><a href="#format%20quartz%20#out">format quartz #out
+</a></li>
+<li><a href="#format%20sdl%20#out">format sdl #out
+</a></li>
+<li><a href="#format%20aalib%20#out">format aalib #out
+</a></li>
+<li><a href="#format%20window%20#out">format window #out
+</a></li>
+</ul>
+<br><br>
+</div></td></tr> <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><a name="Objects_for_Input/Output"></a><h4>Objects for Input/Output</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#in">#in</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>format<b>, </b>format_specific_part...<b>)</b>
+ If no arguments given, creates an input object for an unspecified
+ format. You then need to use the <kbd><font color="#007777">"open"</font></kbd> command to link
+ a format handler to it.
+ If arguments given, the <kbd><font color="#007777">"open"</font></kbd> command is immediately called
+ with those arguments.
+ Remember that most formats produce Dim[rows,columns,3] grids with
+ 0-255 values. (Most.) <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;open <b>(</b>format<b>, </b>format_specific_part...<b>)</b>
+ This is the command that gives a particular resource
+ to a <kbd><font color="#007777">[#out]</font></kbd> object. This is done through a "format"
+ (there is a list of formats in this manual). The other
+ arguments depend on the chosen format. The format may
+ be a file format or a protocol or a hardware device, etc.
+ The format called "file" is a special shortcut that autodetects the
+ type of file (by name suffix) and picks up the appropriate handler. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;open <b>(</b>filename<b>)</b>
+ This is a shortcut for <kbd><font color="#007777">"open file"</font></kbd> followed by a filename.
+ The filename must contain a dot, else it will be seen as a handler name. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;close <b>(</b><b>)</b>
+ close may be necessary if you operate on <kbd><font color="#007777">"/dev/video"</font></kbd>,
+ which can only be read by one at a time. otherwise it's
+ usually not necessary. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;int <b>(</b>frame_number<b>)</b>
+ selects one picture from a multi-picture format
+ and then does the same as a bang. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;set <b>(</b>frame_number<b>)</b>
+ selects one picture from a multi-picture format,
+ to be displayed by the next bang. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;bang <b>(</b><b>)</b>
+ sends a grid through the outlet. the grid may be the
+ result of reading from a file, acquiring from a device,
+ capturing from the screen etc.
+ this is format-specific. most formats
+ produce grid(rows columns {red green blue}).
+ In formats that read from a file, reading another picture
+ will continue if there are several pictures in the
+ same file, but if the end of file is reached instead,
+ it will rewind and send the first picture again.
+ see section "External Picture Formats". <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;option <b>(</b><i>symbol</i> selector<b>, </b>stuff...<b>)</b>
+ Obsolete. the word "option" is optional now. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;rewind <b>(</b><b>)</b>
+ rewinds to beginning of file if applicable. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;loop <b>(</b><i>bool</i> flag<b>)</b>
+ controls the automatic looping of movies. <br>
+ <br><b>outlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ frame number of frame just sent,
+ for formats that have frame numbers. <br>
+ <br><b>outlet&nbsp;1 </b><b>method</b>&nbsp;bang <b>(</b><b>)</b>
+ tried to read a frame that does not exist
+ (signals end of file) <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#out">#out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>format<b>, </b>format_specific_part...<b>)</b>
+ If no arguments given, creates an output object for an unspecified
+ format. You then need to use the <kbd><font color="#007777">"open"</font></kbd> command to link
+ a format handler to it.
+ If arguments given, the <kbd><font color="#007777">"open"</font></kbd> command is immediately called
+ with those arguments.
+ Remember that most formats expect dim(rows,columns,3) grids with
+ 0-255 values. (Most.) <br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> rows<b>, </b><i>integer</i> columns<b>)</b>
+ This alternate way to create an <kbd><font color="#007777">[#out]</font></kbd> automatically calls <kbd><font color="#007777">"open window"</font></kbd> and <kbd><font color="#007777">"out_size <i>rows columns</i>"</font></kbd>. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;open <b>(</b>format<b>, </b>format_specific_part...<b>)</b>
+ This is the command that gives a particular resource
+ to a <kbd><font color="#007777">[#out]</font></kbd> object. This is done through a "format"
+ (there is a list of formats in this manual). The other
+ arguments depend on the chosen format. The format may
+ be a file format or a protocol or a hardware device, etc. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;open file <b>(</b><b>)</b>
+ The format called "file" is a special shortcut that autodetects the
+ type of file (by name suffix) and picks up the appropriate handler. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;open <b>(</b>filename<b>)</b>
+ This is a shortcut for "open file" followed by a filename.
+ The filename must contain a dot, else it will be seen as a handler name. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ this is format-specific. most formats
+ expect grid(rows columns {red green blue}).
+ In formats that write to a file, sending a 2nd picture
+ overwrites the first.
+ see section "External Picture Formats". <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;close <b>(</b><b>)</b>
+ closes the file. usually not necessary. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;option <b>(</b><i>symbol</i> selector<b>, </b>stuff...<b>)</b>
+ Obsolete. Omit the word "option" now. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;timelog <b>(</b><i>0,1</i> status<b>)</b>
+ when status=1, current time (unix clock) and time since last
+ frame-end are printed in the console. when status=0, it is off.
+ default is 0. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;rewind <b>(</b><b>)</b>
+ rewinds to beginning of file if applicable.
+ will overwrite the previous data. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;bang <b>(</b><b>)</b>
+ sent when a complete grid has been received. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#peephole">#peephole</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ This object class only works with a X11-based version of Pd.
+ (e.g. on Linux, BSD, but not MacOS X). </p> <p>Similar to <kbd><font color="#007777">[#out window]</font></kbd>, except it creates an inset in the patch you put it
+ in, and a scaled version of the picture appears in the inset. It also emits the same messages
+ as <kbd><font color="#007777">[#out window]</font></kbd> and automatically scales cursor position according to the current scale factor.
+ The scale factor is decided automatically. </p> <br><b>method</b>&nbsp;init <b>(</b><i>int</i> height<b>, </b><i>int</i> width<b>)</b> <br>
+ <p>All other methods are as in <kbd><font color="#007777">[#out window]</font></kbd>.</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#mouse">#mouse</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ This will process the "position" messages emitted by <kbd><font color="#007777">[#out]</font></kbd> or <kbd><font color="#007777">[#peephole]</font></kbd> in
+ useful ways. <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ y,x coords of a click <br>
+ <br><b>outlet&nbsp;1 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ y,x coords of a drag (any button is kept pressed) <br>
+ <br><b>outlet&nbsp;2 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ y,x coords of an unclick <br>
+ <br><b>outlet&nbsp;3 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ y,x coords of a move (no button is pressed) <br>
+ <br><b>outlet&nbsp;4 </b><b>method</b>&nbsp;float <b>(</b><b>)</b> button 1 status<br>
+ <br><b>outlet&nbsp;5 </b><b>method</b>&nbsp;float <b>(</b><b>)</b> button 2 status<br>
+ <br><b>outlet&nbsp;6 </b><b>method</b>&nbsp;float <b>(</b><b>)</b> button 3 status<br>
+ <br><b>outlet&nbsp;7 </b><b>method</b>&nbsp;float <b>(</b><b>)</b>
+ wheel difference: -1 = roll up; 1 = roll down. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#camera">#camera</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ Works about like <kbd><font color="#007777">[#in videodev]</font></kbd> except you can right-click-open it to access all of the
+ camera settings visually. <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><a name="Picture/Movie_Formats"></a><h4>Picture/Movie Formats</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format ppm #in/#out">format ppm #in/#out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Subformat P6 only.
+ Max-number can only be 255 (24-bit RGB). </p> <br><b>method</b>&nbsp;open ppm file <b>(</b><i>symbol</i> filename<b>)</b>
+ opens the specified file, taken from the current
+ directory. <br>
+ <br><b>method</b>&nbsp;open ppm gzfile <b>(</b><i>symbol</i> filename<b>)</b>
+ same but for .ppm.gz files <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {r g b})</i> grid<b>)</b>
+ values 0-255 <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format targa #in/#out">format targa #in/#out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Support for RGB-24 (3 channels) and RGBA-32 (4 channels)</p> <br><b>method</b>&nbsp;open targa file <b>(</b><i>symbol</i> filename<b>)</b>
+ opens the specified file, taken from the current
+ directory. <br>
+ <br><b>method</b>&nbsp;open targa gzfile <b>(</b><i>symbol</i> filename<b>)</b>
+ same but for .tga.gz files <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns 3)</i> grid<b>)</b> RGB-24<br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns 4)</i> grid<b>)</b> RGBA-32<br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format jpeg #in/#out">format jpeg #in/#out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Support for RGB non-progressive</p> <br><b>method</b>&nbsp;open jpeg file <b>(</b><i>symbol</i> filename<b>)</b>
+ opens the specified file, taken from the current
+ directory. <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns 3)</i> grid<b>)</b> RGB-24 <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format png #in">format png #in</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Support for RGB non-progressive</p> <br><b>method</b>&nbsp;open png file <b>(</b><i>symbol</i> filename<b>)</b>
+ opens the specified file, taken from the current
+ directory. <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns 1)</i> grid<b>)</b> Y-8 (greyscale)<br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns 2)</i> grid<b>)</b> YA-16 (greyscale and transparency)<br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns 3)</i> grid<b>)</b> RGB-24 (colour)<br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns 4)</i> grid<b>)</b> RGBA-32 (colour and transparency)<br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format quicktime #in/#out">format quicktime #in/#out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Support for .mov files.</p> <p>This format supports frame-seek and frame-tell.</p> <p>Uses the HW-QuickTime library aka QuickTime4Linux
+ (libquicktime.so). There is also a variant on the same library and that project
+ is just called LibQuickTime.</p> <p>Some versions of those libraries may include support for different codecs,
+ and some also may support entirely different wrapper formats such as AVI.</p> <p>On Macintosh, Apple QuickTime is used instead, but several of the following
+ messages may not be available.</p> <br><b>method</b>&nbsp;open quicktime file <b>(</b><i>symbol</i> filename<b>)</b> <br>
+ <br><b>method</b>&nbsp;codec <b>(</b><i>symbol</i> codec<b>)</b>
+ Allowed values are at least: raw, jpeg, png, mjpa, yuv2, yuv4.
+ Some other values may allowed, depending on the version of the library
+ and which codec plugins are installed.
+ Must be set before the first frame is written.
+ only applies to <kbd><font color="#007777">[#out]</font></kbd>. Choosing a codec is important
+ because codecs influence greatly the speed of
+ encoding, the speed of decoding,
+ the size of the written file, and its fidelity to the
+ original content. Note that there exist other Apple-QuickTime
+ codecs that are not supported by HW-QuickTime. <br>
+ <br><b>method</b>&nbsp;parameter <b>(</b><i>symbol</i> key<b>, </b><i>int</i> value<b>)</b>
+ Sets special codec-specific settings.
+ For example: <kbd><font color="#007777">"parameter jpeg_quality 75"</font></kbd> <br>
+ <br><b>method</b>&nbsp;framerate <b>(</b><i>int</i> fps<b>)</b>
+ Sets the framerate of the file.
+ This is not used by GridFlow when reading a file, but other
+ programs usually care. <br>
+ <br><b>method</b>&nbsp;colorspace <b>(</b><i>symbol</i> colorspace<b>)</b>
+ Allowed values are rgb, rgba, bgr, bgra, yuv, yuva.
+ Normally you don't need this. <br>
+ <br><b>method</b>&nbsp;size <b>(</b><i>int</i> height<b>, </b><i>int</i> width<b>)</b>
+ Forces a window size when writing. Usually this has to be used <u>after</u>
+ setting the framerate and codec and <u>before</u> setting the codec-parameters.
+ (Strange. Sorry.) <br>
+ <br><b>method</b>&nbsp;force_size <b>(</b><i>int</i> height<b>, </b><i>int</i> width<b>)</b>
+ forces a window size when reading.
+ this is a workaround for a problem in HW-QuickTime. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format mpeg #in">format mpeg #in</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>support for .mpeg files</p> <p>this format supports frame-seek and frame-tell.</p> <p>Two different libraries are available for dealing with
+ MPEG files. Those have different details, capabilities and quirks.</p> <p>In any case, GridFlow does not support importing audio from
+ those files.</p> <p>If you use the HeroineWarrior library, you may open several
+ mpeg files at once, but not with the GregWard library.</p> <p>Libraries may scream error messages in a rude way.</p> <p>By opposition to PPM and TARGA, this format driver only
+ allows a single MPEG stream per file (you cannot "cat"
+ several MPEG files together). </p> <p>Supports Rewind and Frame Select.</p> <br><b>method</b>&nbsp;open mpeg file <b>(</b><i>symbol</i> filename<b>)</b>
+ opens the specified file, taken from the current
+ directory. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format grid #in/#out">format grid #in/#out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ This is GridFlow's special file format. This is the only I/O
+ format that can hold anything that the <kbd><font color="#007777">[#store]</font></kbd> object can. </p> <p>
+ This is the picture format that would support TCP connections
+ if that feature actually worked. More on this later. </p> <br><b>method</b>&nbsp;open grid file <b>(</b><i>symbol</i> filename<b>)</b>
+ opens the specified file, taken from the current
+ directory. <br>
+ <br><b>method</b>&nbsp;open grid gzfile <b>(</b><i>symbol</i> filename<b>)</b>
+ same but for .grid.gz files <br>
+ <br><b>method</b>&nbsp;open grid tcp <b>(</b><i>symbol</i> hostname<b>, </b><i>integer</i> port<b>)</b>
+ dials an specified hostname/port on the InterNet or
+ compatible network. the TCP protocol is used. <br>
+ <br><b>method</b>&nbsp;open grid tcpserver <b>(</b><i>integer</i> port<b>)</b>
+ waits for a call (and answers) for this port on the
+ local machine via InterNet or compatible network.
+ Answers the call. <br>
+ <br><b>method</b>&nbsp;type int32 <b>(</b><b>)</b>
+ output will be as 32 bit signed integers. <br>
+ <br><b>method</b>&nbsp;type uint8 <b>(</b><b>)</b>
+ output will be as 8 bit unsigned integers. <br>
+ <br><b>method</b>&nbsp;headerful <b>(</b><b>)</b>
+ cancels "headerless" (and back to reading .grid) <br>
+ <br><b>method</b>&nbsp;headerless <b>(</b>dimensions...<b>)</b>
+ instead of reading .grid files with header, will read raw data,
+ faking a .grid header to itself. It will use the hereby specified
+ dimension list, as well as two other settings: <kbd><font color="#007777">type</font></kbd> and <kbd><font color="#007777">endian</font></kbd>. <br>
+ <p>When writing "raw" data, a file may be considered a long string of
+ base 256 digits (called bytes), but different computers have different
+ conventions for dealing with them: <br><b>method</b>&nbsp;endian <b>(</b><b>)</b> </p><ul><li><b>1</b> : big:
+ A number will be written starting with the biggest digit.
+ This is the natural way on the Macintosh, Sun, Amiga, and so on. </li> <li><b>2</b> : little:
+ A number will be written starting with the smallest digit.
+ This is the natural way on the Intel 386/Pentium. </li> <li><b>3</b> : same:
+ A number will be written in whichever way is more natural
+ on this computer. The natural way is slightly faster to handle.
+ This is the default setting. </li> </ul> <br>
+ <p></p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><a name="Acquisition_Devices"></a><h4>Acquisition Devices</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format videodev #in">format videodev #in</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;open <b>(</b>device<b>)</b> <br>
+ <p>Video4Linux-1 devices, RGB-24 only. Variable picture size.</p> <p>We have been testing it using cards of the BT-848 family,
+ such as Miro DC10plus and Hauppauge WinTV, using the <kbd><font color="#007777">bttv.o</font></kbd> linux driver.
+ Also we have been testing using Logitech QuickCam (and similar Labtec hardware),
+ but don't use the <kbd><font color="#007777">qce-ga</font></kbd> driver, which is buggy and obsolete: the <kbd><font color="#007777">qc-usb</font></kbd>
+ works better.</p> <p>Some hardware doesn't support RGB, so you may have to select a YUV colorspace
+ (see below) and then use <kbd><font color="#007777">[#yuv_to_rgb]</font></kbd>. Don't forget to also do <kbd><font color="#007777">[# min 255]</font></kbd> and <kbd><font color="#007777">[# max 0]</font></kbd>. </p> <p>If for some reason there's a bug that causes a driver to produce BGR instead of RGB,
+ so that red and blue are swapped, you can swap them back by filtering through a RGB-BGR
+ converter, such as <kbd><font color="#007777">[#inner * + 0 {3 3 # 0 0 1 0 1 0 1 0 0}]</font></kbd>.</p> <p>color adjustments: <br><b>method</b>&nbsp;brightness <b>(</b><i>0-65535</i> level<b>)</b> <br>
+ <br><b>method</b>&nbsp;hue <b>(</b><i>0-65535</i> level<b>)</b> <br>
+ <br><b>method</b>&nbsp;colour <b>(</b><i>0-65535</i> level<b>)</b> <br>
+ <br><b>method</b>&nbsp;contrast <b>(</b><i>0-65535</i> level<b>)</b> <br>
+ <br><b>method</b>&nbsp;whiteness <b>(</b><i>0-65535</i> level<b>)</b> <br>
+ </p> <br><b>method</b>&nbsp;get <b>(</b><i>symbol</i> attr<b>)</b>
+ gets a specific attribute. a message is sent through right outlet.
+ valid attributes are: brightness, hue, colour, contrast, whiteness. <br>
+ <br><b>method</b>&nbsp;get <b>(</b><b>)</b>
+ gets all attributes. <br>
+ <p>other options: <br><b>method</b>&nbsp;channel <b>(</b><i>integer</i> <b>)</b> <br>
+ <br><b>method</b>&nbsp;tuner <b>(</b><i>integer</i> <b>)</b> <br>
+ <br><b>method</b>&nbsp;norm <b>(</b><i>integer</i> <b>)</b> <br>
+ <br><b>method</b>&nbsp;frequency <b>(</b><i>integer</i> <b>)</b> <br>
+ <br><b>method</b>&nbsp;transfer <b>(</b><i>symbol(read|mmap)</i> <b>, </b><i>integer</i> <b>)</b> </p><ul> <li><b>1</b> : mmap:
+ This is the normal (and fast) way of transferring pictures
+ from the camera. </li> <li><b>2</b> : read:
+ Some cameras/drivers only support this instead of mmap. </li></ul>
+ In case of mmap, the extra numeric argument sets the
+ queue length in number of frames, so you can select an
+ appropriate tradeoff between efficiency and latency. <br>
+ <br><b>method</b>&nbsp;colorspace <b>(</b><i>symbol</i> colorspace<b>)</b>
+ Allowed values are: RGB24, YUV420P.
+ Use this if your driver doesn't support RGB24. <br>
+ <br><b>method</b>&nbsp;size <b>(</b>height<b>, </b>width<b>)</b>
+ sets the input size, especially when using a video digitalizer
+ device. <br>
+ <p></p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><a name="Window_Output"></a><h4>Window Output</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format x11 #in/#out">format x11 #in/#out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>supports 15,16,24,32-bit truecolor displays</p> <p>now also support 8-bit indexed displays, using a private colormap
+ configured as 3:3:2 RGB. When using 8-bit you can specify the
+ "use_stripes" option to use a completely different color scheme
+ involving R,G,B diagonal stripes, a kind of 6:6:6 RGB spread over three
+ pixels.</p> <p>If you are using Windows or MacOS 10: you will have to install
+ a X11 server. This will emulate Unix display on your OS. (note:
+ Unix systems also need a X11 server, but it's built-in and handles
+ the video driver directly). In the case of MacOS 10 and QNX that both
+ use non-X11 display technology on top of a basically Unix OS, the
+ OS comes with a X11 server, but it may be on a "bundled software"
+ CD.</p> <br><b>method</b>&nbsp;open x11 <b>(</b><b>)</b>
+ synonym of "open x11 here". <br>
+ <br><b>method</b>&nbsp;open x11 here <b>(</b><b>)</b>
+ connects to the default X11 server,
+ according to your environment variable "DISPLAY". <br>
+ <br><b>method</b>&nbsp;open x11 local <b>(</b><i>integer</i> display_number<b>)</b>
+ connects to a display server on this machine. <br>
+ <br><b>method</b>&nbsp;open x11 remote <b>(</b><i>symbol</i> host_name<b>, </b><i>integer</i> display_number<b>)</b>
+ connects to a remote X11 display server using TCP.
+ Sorry, IP addresses are not supported.
+ Port number will be 6000 plus the display number, because
+ of the X11 standard. <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {red green blue})</i> grid<b>)</b>
+ resizes the window to the size of the grid;
+ encodes that grid in the display's pixel format;
+ also displays it if autodraw &gt; 0
+ the values must be in range 0-255,
+ or else they will be "wrapped". <br>
+ <p>
+ Destroying the object (or sending "close") should close the window. </p> <p>because of the design of Xlib, or if any of the connections
+ involved crashes, then the whole program has to be terminated.
+ (don't you love xlib). Something similar happens if you close any
+ of the windows yourself, but IIRC this could be fixed.</p> <p>only one window may be used per connection (to simplify matters;
+ this doesn't reduce flexibility).</p> <p>there is an additional argument that may be added to every <kbd><font color="#007777">"open"</font></kbd> message; if you don't put it, a new toplevel window is created.
+ if you put "root" then the screen's wallpaper will be used instead
+ (it may fail to work with some popular window managers). You can also
+ put a window number, e.g. <kbd><font color="#007777">0x28003ff</font></kbd>, you may connect to
+ an existing window; you can find out the number of a window by using
+ a tool like <kbd><font color="#007777">xwininfo</font></kbd>, part of X11 standard tools.</p> <br><b>method</b>&nbsp;out_size <b>(</b><i>integer</i> height<b>, </b><i>integer</i> width<b>)</b>
+ changes the window's size, just like sending a grid
+ dim(height,width,3) would.
+ this affects the size of screen captures too. <br>
+ <br><b>method</b>&nbsp;draw <b>(</b><b>)</b>
+ forces a redraw of the window's contents. <br>
+ <br><b>method</b>&nbsp;autodraw <b>(</b><i>0,1,2</i> level<b>)</b> <ul> <li><b>0</b> : draw() is never automatically invoked</li> <li><b>1</b> : draw() is invoked after each grid is finished</li> <li><b>2</b> : draw() is invoked incrementally after each row is
+ received. (but buffering may cause lines to come in groups
+ anyway)</li> </ul> <br>
+ <br><b>method</b>&nbsp;setcursor <b>(</b><i>0..63</i> cursor<b>)</b>
+ Selects one of the 64 predefined cursors of X11. (Note that if
+ your cursor table has them numbered from 0 to 126 using only even
+ numbers, then those cursor numbers are all doubled compared to
+ the ones GridFlow uses.) <br>
+ <br><b>method</b>&nbsp;hidecursor <b>(</b><b>)</b>
+ This makes the cursor invisible. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;position <b>(</b><i>integer</i> y<b>, </b><i>integer</i> x<b>, </b><i>integer</i> buttons<b>)</b> <p>This is emitted every time the cursor moves inside
+ the window connected to this format handler. This is also
+ emitted when the cursor is dragging from inside to outside
+ the window. This is also emitted when a mouse button is pressed.</p> <p>The y and x coordinates are relative to the upper
+ right corner of the window. Specific button states may be
+ extracted from the button value by applying [&gt;&gt;
+ buttonnumber] and then checking whether the result is odd.
+ Button numbers normally are: </p><ul> <li><b>0</b> : Shift</li> <li><b>1</b> : CapsLock</li> <li><b>2</b> : Control</li> <li><b>3</b> : Alternate</li> <li><b>4</b> : NumLock</li> <li><b>5</b> : ???</li> <li><b>6</b> : Meta</li> <li><b>7</b> : ScrollLock</li> <li><b>8</b> : Left Button</li> <li><b>9</b> : Middle Button</li> <li><b>10</b> : Right Button</li> <li><b>11</b> : Wheel Up</li> <li><b>12</b> : Wheel Down</li> </ul><p></p> <p>NOTE: This message form may become longer in the future, but the already defined parts will stay the same.</p> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;keypress <b>(</b><i>integer</i> y<b>, </b><i>integer</i> x<b>, </b><i>integer</i> buttons<b>, </b><i>symbol</i> keyname<b>)</b> <p>Similar to <kbd><font color="#007777">position</font></kbd> above, but this is emitted when a
+ keyboard key is pressed while this format handler's window
+ is active. Keynames follow the X11 standard, similarly to PureData's [keyname] object.
+ The only exception is that keynames that are digits get prefixed by a capital D so that
+ they don't get mistaken for actual numbers.</p> <p>NOTE: This message form may become longer in the future, but the already defined parts will stay the same.</p> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;keyrelease <b>(</b><i>integer</i> y<b>, </b><i>integer</i> x<b>, </b><i>integer</i> buttons<b>, </b><i>symbol</i> keyname<b>)</b>
+ Same as keypress but when a key gets released instead. <p>NOTE: This message form may become longer in the future, but the already defined parts will stay the same.</p> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format quartz #out">format quartz #out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ The equivalent of format x11 on MacOS 10.x, but with less features (sorry). <br><b>method</b>&nbsp;open <b>(</b><b>)</b>
+ opens a dim(240,320,3) rgb window (default). <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {red green blue})</i> grid<b>)</b>
+ Sends image to screen. Window will be resized to fit the image exactly. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format sdl #out">format sdl #out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;open <b>(</b><b>)</b>
+ Opens a dim(240,320,3) rgb window (default). <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {red green blue})</i> grid<b>)</b>
+ Sends image to screen. Window will be resized to fit the image exactly. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format aalib #out">format aalib #out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;open aalib <b>(</b>driver<b>, </b>args...<b>)</b> <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {white})</i> grid<b>)</b>
+ converts a greyscale image to an ascii image and possibly
+ displays it. note that the image is typically downscaled by
+ a factor of 2 by aalib itself. <br>
+ <br><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {ascii attr})</i> grid<b>)</b>
+ the inverse of "dump". Both together in a loop allow to
+ post-process aalib's buffer before displaying. Goes well
+ with "draw", "autodraw". <br>
+ <br><b>method</b>&nbsp;print <b>(</b><i>int</i> y<b>, </b><i>int</i> x<b>, </b><i>int</i> attr<b>, </b><i>symbol</i> text<b>)</b> <br>
+ <br><b>method</b>&nbsp;autodraw <b>(</b><b>)</b>
+ like X11's autodraw. <br>
+ <br><b>method</b>&nbsp;draw <b>(</b><b>)</b>
+ like X11's draw. <br>
+ <br><b>method</b>&nbsp;dump <b>(</b><b>)</b>
+ produces a Dim[y,x,2] grid whose two channels are
+ ascii character codes and character attributes. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="format window #out">format window #out</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;open window <b>(</b><b>)</b>
+ Equivalent to "open x11", but this can be set by putting a line like
+ this in the config file: <kbd><font color="#007777">GridFlow.formats[:window] = GridFlow.formats[:x11]</font></kbd>
+ (and similarly other aliases can be created too) <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4">
+<p><font size="-1">
+GridFlow 0.9.3 Documentation<br>
+Copyright © 2001-2007 by Mathieu Bouchard
+<a href="mailto:matju@artengine.ca">matju@artengine.ca</a>
+</font></p>
+</td></tr></tbody></table></body></html>
diff --git a/externals/gridflow/doc/format.xml b/externals/gridflow/doc/format.xml
new file mode 100644
index 00000000..78a398e1
--- /dev/null
+++ b/externals/gridflow/doc/format.xml
@@ -0,0 +1,714 @@
+<?xml version="1.0" standalone="no" ?>
+<documentation title="Reference Manual: Format Classes">
+<!-- $Id: format.xml 3559 2008-04-16 20:29:00Z matju $ -->
+<!--
+ GridFlow Reference Manual: Format Handler Reference
+ Copyright (c) 2001,2002,2003,2004,2005 by Mathieu Bouchard
+-->
+
+<section name="Objects for Input/Output">
+ <class name="#in">
+ <method name="init" min="0">
+ <arg name="format"/>
+ <rest name="format_specific_part"/>
+
+ If no arguments given, creates an input object for an unspecified
+ format. You then need to use the <k>"open"</k> command to link
+ a format handler to it.
+
+ If arguments given, the <k>"open"</k> command is immediately called
+ with those arguments.
+
+ Remember that most formats produce Dim[rows,columns,3] grids with
+ 0-255 values. (Most.)
+ </method>
+
+ <inlet id="0">
+ <method name="open" min="1">
+ <arg name="format"/>
+ <rest name="format_specific_part"/>
+ This is the command that gives a particular resource
+ to a <k>[#out]</k> object. This is done through a "format"
+ (there is a list of formats in this manual). The other
+ arguments depend on the chosen format. The format may
+ be a file format or a protocol or a hardware device, etc.
+
+ The format called "file" is a special shortcut that autodetects the
+ type of file (by name suffix) and picks up the appropriate handler.
+ </method>
+ <method name="open">
+ <arg name="filename"/>
+ This is a shortcut for <k>"open file"</k> followed by a filename.
+ The filename must contain a dot, else it will be seen as a handler name.
+ </method>
+ <method name="close">
+ close may be necessary if you operate on <k>"/dev/video"</k>,
+ which can only be read by one at a time. otherwise it's
+ usually not necessary.
+ </method>
+ <method name="int">
+ <arg name="frame_number"/>
+ selects one picture from a multi-picture format
+ and then does the same as a bang.
+ </method>
+ <method name="set">
+ <arg name="frame_number"/>
+ selects one picture from a multi-picture format,
+ to be displayed by the next bang.
+ </method>
+ <method name="bang">
+ sends a grid through the outlet. the grid may be the
+ result of reading from a file, acquiring from a device,
+ capturing from the screen etc.
+
+ this is format-specific. most formats
+ produce grid(rows columns {red green blue}).
+
+ In formats that read from a file, reading another picture
+ will continue if there are several pictures in the
+ same file, but if the end of file is reached instead,
+ it will rewind and send the first picture again.
+
+ see section "External Picture Formats".
+
+ </method>
+ <method name="option">
+ <arg name="selector" type="symbol"/>
+ <rest name="stuff"/>
+ Obsolete. the word "option" is optional now.
+ </method>
+ <method name="rewind">
+ rewinds to beginning of file if applicable.
+ </method>
+ <method name="loop">
+ <arg name="flag" type="bool"/>
+ controls the automatic looping of movies.
+ </method>
+
+ </inlet>
+
+ <outlet id="1">
+ <method name="int">
+ frame number of frame just sent,
+ for formats that have frame numbers.
+ </method>
+
+ <method name="bang">
+ tried to read a frame that does not exist
+ (signals end of file)
+ </method>
+ </outlet>
+ </class>
+ <class name="#out">
+ <method name="init" min="0">
+ <arg name="format"/>
+ <rest name="format_specific_part"/>
+
+ If no arguments given, creates an output object for an unspecified
+ format. You then need to use the <k>"open"</k> command to link
+ a format handler to it.
+
+ If arguments given, the <k>"open"</k> command is immediately called
+ with those arguments.
+
+ Remember that most formats expect dim(rows,columns,3) grids with
+ 0-255 values. (Most.)
+ </method>
+ <method name="init">
+ <arg name="rows" type="integer"/>
+ <arg name="columns" type="integer"/>
+
+ This alternate way to create an <k>[#out]</k> automatically calls
+ <k>"open window"</k> and <k>"out_size <i>rows columns</i>"</k>.
+ </method>
+ <inlet id="0">
+ <method name="open" min="1">
+ <arg name="format"/>
+ <rest name="format_specific_part"/>
+ This is the command that gives a particular resource
+ to a <k>[#out]</k> object. This is done through a "format"
+ (there is a list of formats in this manual). The other
+ arguments depend on the chosen format. The format may
+ be a file format or a protocol or a hardware device, etc.
+ </method>
+ <method name="open file">
+ The format called "file" is a special shortcut that autodetects the
+ type of file (by name suffix) and picks up the appropriate handler.
+ </method>
+ <method name="open">
+ <arg name="filename"/>
+ This is a shortcut for "open file" followed by a filename.
+ The filename must contain a dot, else it will be seen as a handler name.
+ </method>
+ <method name="grid"><arg name="grid" type="grid"/>
+ this is format-specific. most formats
+ expect grid(rows columns {red green blue}).
+
+ In formats that write to a file, sending a 2nd picture
+ overwrites the first.
+
+ see section "External Picture Formats".
+ </method>
+ <method name="close">
+ closes the file. usually not necessary.
+ </method>
+ <method name="option">
+ <arg name="selector" type="symbol"/>
+ <rest name="stuff"/>
+ Obsolete. Omit the word "option" now.
+ </method>
+ <method name="timelog">
+ <arg name="status" type="0,1"/>
+ when status=1, current time (unix clock) and time since last
+ frame-end are printed in the console. when status=0, it is off.
+ default is 0.
+ </method>
+ <method name="rewind">
+ rewinds to beginning of file if applicable.
+ will overwrite the previous data.
+ </method>
+ <method name="autoclose">
+ ...
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="bang">
+ sent when a complete grid has been received.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#peephole">
+ <p>
+ This object class only works with a X11-based version of Pd.
+ (e.g. on Linux, BSD, but not MacOS X).
+ </p>
+ <p>Similar to <k>[#out window]</k>, except it creates an inset in the patch you put it
+ in, and a scaled version of the picture appears in the inset. It also emits the same messages
+ as <k>[#out window]</k> and automatically scales cursor position according to the current scale factor.
+ The scale factor is decided automatically.
+ </p>
+ <method name="init">
+ <arg name="height" type="int"/>
+ <arg name="width" type="int"/>
+ </method>
+ <p>All other methods are as in <k>[#out window]</k>.</p>
+ </class>
+ <class name="#mouse">
+ This will process the "position" messages emitted by <k>[#out]</k> or <k>[#peephole]</k> in
+ useful ways.
+ <outlet id="0"><method name="list">
+ y,x coords of a click
+ </method></outlet>
+ <outlet id="1"><method name="list">
+ y,x coords of a drag (any button is kept pressed)
+ </method></outlet>
+ <outlet id="2"><method name="list">
+ y,x coords of an unclick
+ </method></outlet>
+ <outlet id="3"><method name="list">
+ y,x coords of a move (no button is pressed)
+ </method></outlet>
+ <outlet id="4"><method name="float" type="0,1">button 1 status</method></outlet>
+ <outlet id="5"><method name="float" type="0,1">button 2 status</method></outlet>
+ <outlet id="6"><method name="float" type="0,1">button 3 status</method></outlet>
+ <outlet id="7"><method name="float" type="-1,1">
+ wheel difference: -1 = roll up; 1 = roll down.
+ </method></outlet>
+ </class>
+ <class name="#camera">
+ Works about like <k>[#in videodev]</k> except you can right-click-open it to access all of the
+ camera settings visually.
+ </class>
+</section>
+
+<section name="Picture/Movie Formats">
+
+ <class name="format ppm #in/#out">
+ <p>Subformat P6 only.
+ Max-number can only be 255 (24-bit RGB).
+ </p>
+
+ <method name="open ppm file">
+ <arg name="filename" type="symbol"/>
+ opens the specified file, taken from the current
+ directory.
+ </method>
+
+ <method name="open ppm gzfile">
+ <arg name="filename" type="symbol"/>
+ same but for .ppm.gz files
+ </method>
+
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns {r g b})"/>
+ values 0-255
+ </method>
+ </class>
+
+ <class name="format jpeg #in/#out">
+ <p>Support for RGB non-progressive</p>
+
+ <method name="open jpeg file">
+ <arg name="filename" type="symbol"/>
+ opens the specified file, taken from the current
+ directory.
+ </method>
+
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns 3)"/>RGB-24
+ </method>
+ </class>
+
+ <class name="format png #in">
+ <p>Support for RGB non-progressive</p>
+
+ <method name="open png file">
+ <arg name="filename" type="symbol"/>
+ opens the specified file, taken from the current
+ directory.
+ </method>
+
+ <method name="grid"><arg name="grid" type="grid(rows columns 1)"/>Y-8 (greyscale)</method>
+ <method name="grid"><arg name="grid" type="grid(rows columns 2)"/>YA-16 (greyscale and transparency)</method>
+ <method name="grid"><arg name="grid" type="grid(rows columns 3)"/>RGB-24 (colour)</method>
+ <method name="grid"><arg name="grid" type="grid(rows columns 4)"/>RGBA-32 (colour and transparency)</method>
+ </class>
+
+ <class name="format quicktime #in/#out">
+ <p>Support for .mov files.</p>
+ <p>This format supports frame-seek and frame-tell.</p>
+ <p>Uses the HW-QuickTime library aka QuickTime4Linux
+ (libquicktime.so). There is also a variant on the same library and that project
+ is just called LibQuickTime.</p>
+ <p>Some versions of those libraries may include support for different codecs,
+ and some also may support entirely different wrapper formats such as AVI.</p>
+ <p>On Macintosh, Apple QuickTime is used instead, but several of the following
+ messages may not be available.</p>
+
+ <method name="open quicktime file">
+ <arg name="filename" type="symbol" />
+ </method>
+ <method name="codec">
+ <arg name="codec" type="symbol"/>
+ Allowed values are at least: raw, jpeg, png, mjpa, yuv2, yuv4.
+ Some other values may allowed, depending on the version of the library
+ and which codec plugins are installed.
+ Must be set before the first frame is written.
+ only applies to <k>[#out]</k>. Choosing a codec is important
+ because codecs influence greatly the speed of
+ encoding, the speed of decoding,
+ the size of the written file, and its fidelity to the
+ original content. Note that there exist other Apple-QuickTime
+ codecs that are not supported by HW-QuickTime.
+ </method>
+ <method name="parameter">
+ <arg name="key" type="symbol"/>
+ <arg name="value" type="int"/>
+ Sets special codec-specific settings.
+ For example: <k>"parameter jpeg_quality 75"</k>
+ </method>
+ <method name="framerate">
+ <arg name="fps" type="int"/>
+ Sets the framerate of the file.
+ This is not used by GridFlow when reading a file, but other
+ programs usually care.
+ </method>
+
+ <method name="colorspace">
+ <arg name="colorspace" type="symbol"/>
+ Allowed values are rgb, rgba, bgr, bgra, yuv, yuva.
+ Normally you don't need this.
+ </method>
+ <method name="size">
+ <arg name="height" type="int"/>
+ <arg name="width" type="int"/>
+ Forces a window size when writing. Usually this has to be used <u>after</u>
+ setting the framerate and codec and <u>before</u> setting the codec-parameters.
+ (Strange. Sorry.)
+ </method>
+ <method name="force_size">
+ <arg name="height" type="int"/>
+ <arg name="width" type="int"/>
+ forces a window size when reading.
+ this is a workaround for a problem in HW-QuickTime.
+ </method>
+ </class>
+
+ <class name="format mpeg #in">
+ <p>support for .mpeg files</p>
+ <p>this format supports frame-seek and frame-tell.</p>
+ <p>Two different libraries are available for dealing with
+ MPEG files. Those have different details, capabilities and quirks.</p>
+ <p>In any case, GridFlow does not support importing audio from
+ those files.</p>
+ <p>If you use the HeroineWarrior library, you may open several
+ mpeg files at once, but not with the GregWard library.</p>
+ <p>Libraries may scream error messages in a rude way.</p>
+ <p>By opposition to PPM and TARGA, this format driver only
+ allows a single MPEG stream per file (you cannot "cat"
+ several MPEG files together).
+ </p>
+ <p>Supports Rewind and Frame Select.</p>
+ <method name="open mpeg file">
+ <arg name="filename" type="symbol"/>
+ opens the specified file, taken from the current
+ directory.
+ </method>
+ </class>
+
+ <class name="format grid #in/#out">
+ <p>
+ This is GridFlow's special file format. This is the only I/O
+ format that can hold anything that the <k>[#store]</k> object can.
+ </p>
+ <p>
+ This is the picture format that would support TCP connections
+ if that feature actually worked. More on this later.
+ </p>
+
+ <method name="open grid file">
+ <arg name="filename" type="symbol"/>
+ opens the specified file, taken from the current
+ directory.
+ </method>
+ <method name="open grid gzfile">
+ <arg name="filename" type="symbol"/>
+ same but for .grid.gz files
+ </method>
+ <method name="type int32">
+ output will be as 32 bit signed integers.
+ </method>
+ <method name="type uint8">
+ output will be as 8 bit unsigned integers.
+ </method>
+ <method name="headerful">
+ cancels "headerless" (and back to reading .grid)
+ </method>
+ <method name="headerless">
+ <rest name="dimensions" type="integer"/>
+ instead of reading .grid files with header, will read raw data,
+ faking a .grid header to itself. It will use the hereby specified
+ dimension list, as well as two other settings:
+ <k>type</k> and <k>endian</k>.
+ </method>
+
+ <p>When writing "raw" data, a file may be considered a long string of
+ base 256 digits (called bytes), but different computers have different
+ conventions for dealing with them:
+
+ <method name="endian" type="symbol(big|endian|same)">
+ <list><li>big:
+ A number will be written starting with the biggest digit.
+ This is the natural way on the Macintosh, Sun, Amiga, and so on.
+ </li>
+ <li>little:
+ A number will be written starting with the smallest digit.
+ This is the natural way on the Intel 386/Pentium.
+ </li>
+ <li>same:
+ A number will be written in whichever way is more natural
+ on this computer. The natural way is slightly faster to handle.
+ This is the default setting.
+ </li>
+ </list>
+ </method>
+ </p>
+ </class>
+</section>
+
+<section name="Acquisition Devices">
+ <class name="format videodev #in">
+ <method name="open">
+ <arg name="device"/>
+ </method>
+
+ <p>Video4Linux-1 devices, RGB-24 only. Variable picture size.</p>
+
+ <p>We have been testing it using cards of the BT-848 family,
+ such as Miro DC10plus and Hauppauge WinTV, using the <k>bttv.o</k> linux driver.
+ Also we have been testing using Logitech QuickCam (and similar Labtec hardware),
+ but don't use the <k>qce-ga</k> driver, which is buggy and obsolete: the <k>qc-usb</k>
+ works better.</p>
+
+ <p>Some hardware doesn't support RGB, so you may have to select a YUV colorspace
+ (see below) and then use <k>[#yuv_to_rgb]</k>. Don't forget to also do
+ <k>[# min 255]</k> and <k>[# max 0]</k>.
+ </p>
+
+ <p>If for some reason there's a bug that causes a driver to produce BGR instead of RGB,
+ so that red and blue are swapped, you can swap them back by filtering through a RGB-BGR
+ converter, such as <k>[#inner * + 0 {3 3 # 0 0 1 0 1 0 1 0 0}]</k>.</p>
+
+ <p>color adjustments:
+ <method name="brightness"><arg name="level" type="0-65535"/></method>
+ <method name="hue" ><arg name="level" type="0-65535"/></method>
+ <method name="colour" ><arg name="level" type="0-65535"/></method>
+ <method name="contrast" ><arg name="level" type="0-65535"/></method>
+ <method name="whiteness" ><arg name="level" type="0-65535"/></method>
+ </p>
+ <method name="get">
+ <arg name="attr" type="symbol"/>
+ gets a specific attribute. a message is sent through right outlet.
+ valid attributes are: brightness, hue, colour, contrast, whiteness.
+ </method>
+ <method name="get">
+ gets all attributes.
+ </method>
+
+ <p>other options:
+ <method name="channel" ><arg type="integer"/></method>
+ <method name="tuner" ><arg type="integer"/></method>
+ <method name="norm" ><arg type="integer"/></method>
+ <method name="frequency" ><arg type="integer"/></method>
+ <method name="transfer" >
+ <arg type="symbol(read|mmap)"/>
+ <arg type="integer" default="2"/>
+ <list>
+ <li>mmap:
+ This is the normal (and fast) way of transferring pictures
+ from the camera.
+ </li>
+ <li>read:
+ Some cameras/drivers only support this instead of mmap.
+ </li></list>
+ In case of mmap, the extra numeric argument sets the
+ queue length in number of frames, so you can select an
+ appropriate tradeoff between efficiency and latency.
+ </method>
+
+ <method name="colorspace">
+ <arg name="colorspace" type="symbol"/>
+ Allowed values are: RGB24, YUV420P.
+ Use this if your driver doesn't support RGB24.
+ </method>
+
+ <method name="size">
+ <arg name="height"/>
+ <arg name="width"/>
+ sets the input size, especially when using a video digitalizer
+ device.
+ </method>
+ </p>
+ </class>
+</section>
+
+<section name="Window Output">
+
+ <class name="format x11 #in/#out">
+ <p>supports 15,16,24,32-bit truecolor displays</p>
+
+ <p>now also support 8-bit indexed displays, using a private colormap
+ configured as 3:3:2 RGB. When using 8-bit you can specify the
+ "use_stripes" option to use a completely different color scheme
+ involving R,G,B diagonal stripes, a kind of 6:6:6 RGB spread over three
+ pixels.</p>
+
+ <p>If you are using Windows or MacOS 10: you will have to install
+ a X11 server. This will emulate Unix display on your OS. (note:
+ Unix systems also need a X11 server, but it's built-in and handles
+ the video driver directly). In the case of MacOS 10 and QNX that both
+ use non-X11 display technology on top of a basically Unix OS, the
+ OS comes with a X11 server, but it may be on a "bundled software"
+ CD.</p>
+
+ <method name="open x11">
+ synonym of "open x11 here".
+ </method>
+
+ <method name="open x11 here">
+ connects to the default X11 server,
+ according to your environment variable "DISPLAY".
+ </method>
+
+ <method name="open x11 local">
+ <arg name="display_number" type="integer"/>
+ connects to a display server on this machine.
+ </method>
+
+ <method name="open x11 remote">
+ <arg name="host_name" type="symbol"/>
+ <arg name="display_number" type="integer"/>
+ connects to a remote X11 display server using TCP.
+ Sorry, IP addresses are not supported.
+ Port number will be 6000 plus the display number, because
+ of the X11 standard.
+ </method>
+
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns {red green blue})"/>
+ resizes the window to the size of the grid;
+ encodes that grid in the display's pixel format;
+ also displays it if autodraw &gt; 0
+ the values must be in range 0-255,
+ or else they will be "wrapped".
+ </method>
+
+ <p>
+ Destroying the object (or sending "close") should close the window.
+ </p>
+
+ <p>because of the design of Xlib, or if any of the connections
+ involved crashes, then the whole program has to be terminated.
+ (don't you love xlib). Something similar happens if you close any
+ of the windows yourself, but IIRC this could be fixed.</p>
+
+ <p>only one window may be used per connection (to simplify matters;
+ this doesn't reduce flexibility).</p>
+
+ <p>there is an additional argument that may be added to every
+ <k>"open"</k> message; if you don't put it, a new toplevel window is created.
+ if you put "root" then the screen's wallpaper will be used instead
+ (it may fail to work with some popular window managers). You can also
+ put a window number, e.g. <k>0x28003ff</k>, you may connect to
+ an existing window; you can find out the number of a window by using
+ a tool like <k>xwininfo</k>, part of X11 standard tools.</p>
+
+ <method name="out_size">
+ <arg name="height" type="integer"/>
+ <arg name="width" type="integer"/>
+ changes the window's size, just like sending a grid
+ dim(height,width,3) would.
+
+ this affects the size of screen captures too.
+ </method>
+
+ <method name="setcursor">
+ <arg name="cursor" type="0..63"/>
+ Selects one of the 64 predefined cursors of X11. (Note that if
+ your cursor table has them numbered from 0 to 126 using only even
+ numbers, then those cursor numbers are all doubled compared to
+ the ones GridFlow uses.)
+ </method>
+
+ <method name="hidecursor">
+ This makes the cursor invisible.
+ </method>
+
+ <outlet id="0">
+ <method name="position">
+ <arg name="y" type="integer"/>
+ <arg name="x" type="integer"/>
+ <arg name="buttons" type="integer"/>
+
+ <p>This is emitted every time the cursor moves inside
+ the window connected to this format handler. This is also
+ emitted when the cursor is dragging from inside to outside
+ the window. This is also emitted when a mouse button is pressed.</p>
+
+ <p>The y and x coordinates are relative to the upper
+ right corner of the window. Specific button states may be
+ extracted from the button value by applying [&gt;&gt;
+ buttonnumber] and then checking whether the result is odd.
+ Button numbers normally are:
+ <list start="0">
+ <li>Shift</li>
+ <li>CapsLock</li>
+ <li>Control</li>
+ <li>Alternate</li>
+ <li>NumLock</li>
+ <li>???</li>
+ <li>Meta</li>
+ <li>ScrollLock</li>
+ <li>Left Button</li>
+ <li>Middle Button</li>
+ <li>Right Button</li>
+ <li>Wheel Up</li>
+ <li>Wheel Down</li>
+ </list></p>
+ <p>NOTE: This message form may become longer in the future, but the already defined parts will stay the same.</p>
+ </method>
+ <method name="keypress">
+ <arg name="y" type="integer"/>
+ <arg name="x" type="integer"/>
+ <arg name="buttons" type="integer"/>
+ <arg name="keyname" type="symbol"/>
+ <p>Similar to <k>position</k> above, but this is emitted when a
+ keyboard key is pressed while this format handler's window
+ is active. Keynames follow the X11 standard, similarly to PureData's [keyname] object.
+ The only exception is that keynames that are digits get prefixed by a capital D so that
+ they don't get mistaken for actual numbers.</p>
+ <p>NOTE: This message form may become longer in the future, but the already defined parts will stay the same.</p>
+ </method>
+ <method name="keyrelease">
+ <arg name="y" type="integer"/>
+ <arg name="x" type="integer"/>
+ <arg name="buttons" type="integer"/>
+ <arg name="keyname" type="symbol"/>
+ Same as keypress but when a key gets released instead.
+ <p>NOTE: This message form may become longer in the future, but the already defined parts will stay the same.</p>
+ </method>
+ </outlet>
+ </class>
+
+ <class name="format quartz #out">
+ The equivalent of format x11 on MacOS 10.x, but with less features (sorry).
+ <method name="open">
+ opens a dim(240,320,3) rgb window (default).
+ </method>
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns {red green blue})"/>
+ Sends image to screen. Window will be resized to fit the image exactly.
+ </method>
+ </class>
+
+ <class name="format sdl #out">
+ <method name="open">
+ Opens a dim(240,320,3) rgb window (default).
+ </method>
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns {red green blue})"/>
+ Sends image to screen. Window will be resized to fit the image exactly.
+ </method>
+ </class>
+
+ <class name="format aalib #out">
+ <method name="open aalib">
+ <arg name="driver">
+ Normally "X11" with uppercase X; else consult
+ the AALib manual.
+ </arg>
+ <rest name="args">
+ You can pass "commandline options" of AALib here.
+ </rest>
+ </method>
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns {white})"/>
+ converts a greyscale image to an ascii image and possibly
+ displays it. note that the image is typically downscaled by
+ a factor of 2 by aalib itself.
+ </method>
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns {ascii attr})"/>
+ the inverse of "dump". Both together in a loop allow to
+ post-process aalib's buffer before displaying. Goes well
+ with "draw", "autodraw".
+ </method>
+ <method name="print">
+ <arg name="y" type="int"/>
+ <arg name="x" type="int"/>
+ <arg name="attr" type="int"/>
+ <arg name="text" type="symbol"/>
+ </method>
+ <method name="autodraw">
+ like X11's autodraw.
+ </method>
+ <method name="draw">
+ like X11's draw.
+ </method>
+ <method name="dump">
+ produces a Dim[y,x,2] grid whose two channels are
+ ascii character codes and character attributes.
+ </method>
+ </class>
+
+ <class name="format window #out">
+ <method name="open window">
+ Equivalent to "open x11", but this can be set by putting a line like
+ this in the config file: <k>GridFlow.formats[:window] = GridFlow.formats[:x11]</k>
+ (and similarly other aliases can be created too)
+ </method>
+ </class>
+</section>
+
+</documentation>
diff --git a/externals/gridflow/doc/gridflow.css b/externals/gridflow/doc/gridflow.css
new file mode 100644
index 00000000..4109bedd
--- /dev/null
+++ b/externals/gridflow/doc/gridflow.css
@@ -0,0 +1,18 @@
+P {color:#000000; font-family: Arial, Helvetica, sans-serif; font-size:12px;}
+B {color:#336699;}
+A {color:#003366; font-family: Arial, Helvetica, sans-serif;}
+A:link {color:#003366;}
+A:active {color:#336699;}
+A:visited {color:#336699;}
+BODY {background-color:#FFFFFF;}
+H4 {color:#004060; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
+LI {font-family: Arial, Helvetica, sans-serif;}
+.text {font-family: Arial, Helvetica, sans-serif; font-size:11px; background-color: #FFFFFF; line-spacing: 20}
+. {font-family: Arial, Helvetica, sans-serif;}
+dt {font-weight: bold; color: #006699}
+kbd {color:#000000; font-weight:bold; background:#dddddd}
+ol.foo {color:#ff0000}
+ol.foo li {color:#ffff00}
+.c1 {background:#f0f8ff}
+.c2 {background:#e0f0ff}
+.c3 {background:#cccccc; color:#ff0000} \ No newline at end of file
diff --git a/externals/gridflow/doc/images/crop_icons b/externals/gridflow/doc/images/crop_icons
new file mode 100644
index 00000000..4aa06499
--- /dev/null
+++ b/externals/gridflow/doc/images/crop_icons
@@ -0,0 +1,12 @@
+if [ "z$1" = "zall" ]; then
+ foo="\@*.png format*.png"
+else
+ foo="$1"
+fi
+
+for z in $foo; do \
+ echo $z
+ pngtopnm $z | pnmcrop | pnmtopng -background black -transparent =red -compress 9 > $z.new
+ mv $z.new $z
+done
+
diff --git a/externals/gridflow/doc/images/header1.png b/externals/gridflow/doc/images/header1.png
new file mode 100644
index 00000000..ad7c13c5
--- /dev/null
+++ b/externals/gridflow/doc/images/header1.png
Binary files differ
diff --git a/externals/gridflow/doc/images/header1.xcf b/externals/gridflow/doc/images/header1.xcf
new file mode 100644
index 00000000..d114ef28
--- /dev/null
+++ b/externals/gridflow/doc/images/header1.xcf
Binary files differ
diff --git a/externals/gridflow/doc/images/header2.png b/externals/gridflow/doc/images/header2.png
new file mode 100644
index 00000000..cf303b35
--- /dev/null
+++ b/externals/gridflow/doc/images/header2.png
Binary files differ
diff --git a/externals/gridflow/doc/images/header3.png b/externals/gridflow/doc/images/header3.png
new file mode 100644
index 00000000..8cfcccca
--- /dev/null
+++ b/externals/gridflow/doc/images/header3.png
Binary files differ
diff --git a/externals/gridflow/doc/index.html b/externals/gridflow/doc/index.html
new file mode 100644
index 00000000..a5b1c71c
--- /dev/null
+++ b/externals/gridflow/doc/index.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><title>GridFlow 0.9.3</title>
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="stylesheet" href="gridflow.css" type="text/css">
+</head>
+<body leftmargin="0" topmargin="0" style="background-color: rgb(255, 255, 255);" marginheight="0" marginwidth="0">
+<table width="100%" cellspacing="10"><tr><td>
+<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
+ <td> <img src="images/header1.png" alt="GridFlow" width="384" height="64"></td>
+ <td width="100%"><img src="images/header2.png" alt="GridFlow" width="100%" height="64"></td>
+ <td> <img src="images/header3.png" alt="GridFlow" width="32" height="64"></td>
+</table>
+</td></tr></table>
+<blockquote>
+<p class="text"><b> a multi-dimensional dataflow processing library for PureData, specialized in image and video</b></p>
+
+<table border="0" cellspacing="5" width="100%">
+<tr><td colspan="4" bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="3" height="16"><h4>GridFlow 0.9.3 - documentation index</h4></td></tr>
+<tr><td colspan="2"><ul>
+ <li><a href="license.html">License</a></li>
+ <li><a href="introduction.html">Introduction</a></li>
+ <li><a href="install.html">Installation</a></li>
+ <li><a href="architecture.html">Reference Manual: Architecture and Concepts</a></li>
+ <li><a href="reference.html">Reference Manual: Flow Classes</a></li>
+ <li><a href="format.html">Reference Manual: Format Handlers</a></li>
+</ul></td></tr>
+<tr><td colspan="4" bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><h4>GridFlow On The Net</h4></td></tr>
+<tr><td><ul>
+ <p><a href="http://gridflow.ca/gallery/">Screenshots!</a></p>
+ <p><a href="http://gridflow.ca/svn/trunk/doc/index.html">GridFlow Online Manual (from SVN)</a></p>
+ <p><a href="http://gridflow.ca/svn/trunk/">Browse GridFlow source code online (from SVN)</a></p>
+ <p><a href="http://gridflow.ca/download/">Download GridFlow and related files</a></p>
+ <p>Mailing Lists (Subscription and Archives): <ul>
+ <li><a href="http://lists.artengine.ca/mailman/listinfo/gridflow-dev">
+ <kbd>gridflow-dev</kbd>: GridFlow Contributors</a></li>
+ <li><a href="http://lists.artengine.ca/mailman/listinfo/gridflow-cvs">
+ <kbd>gridflow-cvs</kbd>: GridFlow CVS Reports</a></li>
+ <li><a href="http://lists.artengine.ca/mailman/listinfo/pdmtl">
+ <kbd>pdmtl</kbd>: PureData Montr&eacute;al Users Group</a></li>
+ </ul></p>
+ <p><a href="http://www.puredata.org">PureData Community Site</a></p>
+ <p>Join us in the <kbd>#dataflow</kbd> chatroom at <kbd>irc.freenode.net</kbd> port <kbd>6667</kbd></p>
+</ul></td></tr>
+<tr><td colspan="4" bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><h4>Credits</h4></td></tr>
+<tr><td><blockquote>
+C++ Programming : Mathieu Bouchard<br>
+Pd Programming : Mathieu Bouchard<br>
+Pd Examples : Mathieu Bouchard, Alexandre Castonguay<br>
+MacOS 10 version : Mathieu Bouchard, James Tittle, Adam Lindsay<br>
+</blockquote></td></tr>
+<tr><td colspan="4" bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><h4>Sponsors</h4></td></tr>
+<td><blockquote>
+<p>GridFlow is sponsored by <a href="http://www.artengine.org">Artengine</a></p>
+<p>Development of GridFlow 0.3.0 - 0.5.0 was made possible
+in part by a grant from the <a href="http://www.hrdc-drhc.gc.ca/">HRDC</a>
+to <a href="http://www.artengine.org">Artengine</a><br>Development of GridFlow 0.9.0 was made possible in part by Alexandre Castonguay's
+cooking</p>
+</blockquote></td></tr>
+<tr><td colspan="4" bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td colspan="4"><p><font size="-1">GridFlow 0.9.3 Documentation<br>
+by Mathieu Bouchard <a href="mailto:matju@artengine.ca">matju@artengine.ca</a>
+and<br>
+Alexandre Castonguay <a href="mailto:acastonguay@artengine.ca">acastonguay@artengine.ca</a></font></p>
+</td>
+</tr>
+</table>
+</blockquote>
+</body></html>
diff --git a/externals/gridflow/doc/index.pd b/externals/gridflow/doc/index.pd
new file mode 100644
index 00000000..acd0b9fa
--- /dev/null
+++ b/externals/gridflow/doc/index.pd
@@ -0,0 +1,303 @@
+#N canvas 0 0 640 480 10 ;
+#X obj 157 50 # +;
+#X text 200 50 plain numeric operators on grids: + - * / etc;
+#X obj -11 82 #apply_colormap_channelwise;
+#X text 200 82 apply color correction tables separately on each channel;
+#X obj 59 114 #background_model;
+#X text 200 114 make mask from learning to distinguish background from foreground;
+#X obj 129 146 #border;
+#X text 200 146 add padding on sides of a grid;
+#X obj 129 178 #camera;
+#X text 200 178 control panel for opening cameras;
+#X obj 129 210 #cast i;
+#X text 200 210 convert grid from one number type to another;
+#X obj 115 242 #centroid;
+#X text 200 242 find centroid (weighted average) of the coordinates of a grid;
+#X obj 129 274 #change;
+#X text 200 274 send grid only if different from previous grid;
+#X obj 115 306 #checkers;
+#X text 200 306 make image of chequered background in two tones of grey;
+#X obj 143 338 #clip;
+#X text 200 338 min and max;
+#X obj 24 370 #color;
+#X text 200 370 GUI for selecting a colour;
+#X obj 115 442 #contrast;
+#X text 200 442 adjust contrast in two different ways;
+#X obj 115 474 #convolve;
+#X text 200 474 compute convolution product of a grid (blur and edge-detection);
+#X obj 150 506 #dim;
+#X text 200 506 get the size (dimensions) of a grid;
+#X obj 87 538 #downscale_by;
+#X text 200 538 reduce the size of an image by a whole factor;
+#X obj 101 570 #draw_image;
+#X text 200 570 picture-in-picture;
+#X obj 94 602 #draw_points;
+#X text 200 602 (future use);
+#X obj 87 634 #draw_polygon;
+#X text 200 634 draw polygon in an image;
+#X obj 108 666 #draw_rect;
+#X text 200 666 draw a rectangle in an image;
+#X obj 94 698 #draw_slider;
+#X text 200 698 draw a slider in an image;
+#X obj 87 730 #edit_polygon;
+#X text 200 730 draw a polygon in an image and react to mouse events;
+#X obj 143 762 #fade;
+#X text 200 762 fade in exponential-decay fashion (linear recurrence);
+#X obj 115 794 #fade_lin;
+#X text 200 794 fade in piecewise-linear fashion;
+#X obj 115 826 #fastblur;
+#X text 200 826 speedy shortcut for rectangular blur;
+#X obj 150 858 #fft;
+#X text 200 858 compute forward or inverse one-or-two-dimensional complex FFT of a grid;
+#X obj 115 890 #finished;
+#X text 200 890 bang when grid transmission has ended;
+#X obj 129 922 #fold +;
+#X text 200 922 compute the sum of each row \, product of each row, and other similar operations;
+#X obj 108 954 #for 0 4 1;
+#X text 200 954 make a grid from all numbers or coordinates in a certain range;
+#X obj 115 986 #from_pix;
+#X text 200 986 convert pix (GEM) to grid;
+#X obj 136 1018 #gamma;
+#X text 200 1018 apply gamma correction;
+#X obj 136 1050 #grade;
+#X text 200 1050 make an index of the sorting of a grid;
+#X obj 59 1082 #greyscale_to_rgb;
+#X text 200 1082 convert greyscale to RGB;
+#X obj 136 1114 #hello;
+#X text 200 1114 make 7 colour bars;
+#X obj 115 1146 #hueshift;
+#X text 200 1146 apply hue shift by rotating the color wheel;
+#X obj 129 1178 #import;
+#X text 200 1178 convert float \, list, or symbol ASCII codes, to a grid;
+#X obj 101 1210 #import_pix;
+#X text 200 1210 old name of #from_pix;
+#X obj 157 1242 #in;
+#X text 200 1242 open file or device for reading or download;
+#X obj 136 1274 #inner;
+#X text 200 1274 scalar ("dot") product \, matrix product, tensor contraction, image channel remapping, etc.;
+#X obj 115 1306 #io.aalib;
+#X text 200 1306 open an aalib window;
+#X obj 108 1338 #io.dc1394;
+#X text 200 1338 open a faiawaia "DC" camera (not DV) using a Linux-compatible OS;
+#X obj 122 1370 #io.grid;
+#X text 200 1370 read or write a .grid file (GridFlow storage format);
+#X obj 122 1402 #io.jpeg;
+#X text 200 1402 read or write a .jpeg file;
+#X obj 122 1434 #io.mpeg;
+#X text 200 1434 read a .mpeg video file;
+#X obj 129 1466 #io.png;
+#X text 200 1466 read a .png image file;
+#X obj 129 1498 #io.ppm;
+#X text 200 1498 read or write a .pbm or .pgm or .ppm image file;
+#X obj 87 1530 #io.quicktime;
+#X text 200 1530 read a .mov video file (or perhaps .avi);
+#X obj 129 1562 #io.sdl;
+#X text 200 1562 open a SDL window;
+#X obj 94 1594 #io.videodev;
+#X text 200 1594 open a V4L1 device (Linux interface for video cameras and video digitisers);
+#X obj 129 1626 #io.x11;
+#X text 200 1626 open a X11 window;
+#X obj 115 1658 #labeling;
+#X text 200 1658 tag connected pixels with region numbers in a two-tone single-channel image;
+#X obj 136 1690 #layer;
+#X text 200 1690 layer two same-sized images;
+#X obj 66 1722 #line_to_polygon;
+#X text 200 1722 convert line (as point pair) to polygon (rotated rectangle);
+#X obj 101 1754 #make_cross;
+#X text 200 1754 make cross-shaped polygon;
+#X obj 129 1786 #moment;
+#X text 200 1786 find 1st or 2nd order moment (weighted average or variance) of the coordinates of a grid;
+#X obj 87 1818 #moment_polar;
+#X text 200 1818 convert covariance matrix to the longest and shortest radius of an ellipse and a rotation angle;
+#X obj 59 1850 #motion_detection;
+#X text 200 1850 frame difference with some options;
+#X obj 136 1882 #mouse;
+#X text 200 1882 converts mouse events to reports of clicks \, drags, unclicks, motions, and separate buttons and wheel;
+#X obj 66 1914 #noise_gate_yuvs;
+#X text 200 1914 replaces dark pixels by black pixels in signed YUV images;
+#X obj 150 1946 #out;
+#X text 200 1946 open file or device for writing or upload;
+#X obj 122 1978 #outer +;
+#X text 200 1978 apply numeric operator on all possible combinations of elements of one grid with elements of another;
+#X obj 143 2010 #pack;
+#X text 200 2010 combine floats on separate inlets to make a grid;
+#X obj 94 2042 #perspective;
+#X text 200 2042 divide each point by its depth;
+#X obj 87 2074 #polygon_area;
+#X text 200 2074 find area of a polygon in square pixels;
+#X obj 45 2106 #polygon_comparator;
+#X text 200 2106 find similarity between two polygons independently of rotation \, by radial maps and FFT;
+#X obj 52 2138 #polygon_each_edge;
+#X text 200 2138 convert a polygon to a sequence of overlapping 2-sided polygons representing edges;
+#X obj 73 2170 #polygon_moment;
+#X text 200 2170 find average of all points inside of a polygon;
+#X obj 52 2202 #polygon_perimetre;
+#X text 200 2202 find perimetre of a polygon in pixels (euclidian);
+#X obj 45 2234 #polygon_radial_map;
+#X text 200 2234 find radius of a polygon from a given origin \, sampled at equally spaced angles;
+#X obj 101 2266 #polygonize;
+#X text 200 2266 (future use);
+#X obj 108 2298 #posterize;
+#X text 200 2298 quantise pixel values;
+#X obj 136 2330 #print;
+#X text 200 2330 print to console;
+#X obj 136 2362 #ravel;
+#X text 200 2362 do #redim so that a grid keeps same number of elements but just one dimension;
+#X obj 129 2394 #record;
+#X text 200 2394 wrapper around [#in quicktime];
+#X obj 115 2426 #redim ();
+#X text 200 2426 change the size of a grid by restreaming contents into a new shape;
+#X obj 94 2458 #remap_image;
+#X text 200 2458 apply object chain on pixel positions to make new image from chosen pixels of the input image;
+#X obj 122 2490 #reverse;
+#X text 200 2490 mirror image of a grid along a dimension;
+#X obj 59 2522 #rgb_to_greyscale;
+#X text 200 2522 convert RGB to greyscale;
+#X obj 94 2554 #rgb_to_rgba;
+#X text 200 2554 convert RGB to RGBA (but setting alpha to 0);
+#X obj 101 2586 #rgb_to_yuv;
+#X text 200 2586 convert RGB to unsigned YUV;
+#X obj 94 2618 #rgba_to_rgb;
+#X text 200 2618 convert RGBA to RGB;
+#X obj 129 2650 #rotate;
+#X text 200 2650 rotate points through two axes (or rotate pixels as points in a colorspace);
+#X obj 80 2682 #rotatificator;
+#X text 200 2682 make rotation matrix for any two dimensions chosen from manyou;
+#X obj 101 2714 #saturation;
+#X text 200 2714 multiply chroma by some value;
+#X obj 115 2746 #scale_by;
+#X text 200 2746 reduce the size of an image by a whole factor;
+#X obj 115 2778 #scale_to;
+#X text 200 2778 scale an image from one size to any other size by deleting or duplicating rows and columns;
+#X obj 129 2810 #scan +;
+#X text 200 2810 compute the cumulative sums of each row \, and other similar operations;
+#X obj 115 2842 #seq_fold;
+#X text 200 2842 cascade the use of an object on all elements of an incoming grid message sequence;
+#X obj 136 2874 #slice;
+#X text 200 2874 crop an image using a start point (top left) and end point (bottom right);
+#X obj 115 2906 #solarize;
+#X text 200 2906 like pingpong but on all pixel values of a grid;
+#X obj 143 2938 #sort;
+#X text 200 2938 sort each row of a grid;
+#X obj 129 2970 #spread;
+#X text 200 2970 add noise to each vector (point or pixel);
+#X obj 136 3002 #store;
+#X text 200 3002 store image in RAM \, in-place picture-in-picture, and make lookups in various ways;
+#X obj 143 3034 #swap;
+#X text 200 3034 like [swap] for grids;
+#X obj 157 3066 #t;
+#X text 200 3066 like [t a a] for grids;
+#X obj 80 3098 #text_to_image;
+#X text 200 3098 use a fixed-width font grid to make a tiling of characters as specified by a text string;
+#X obj 115 3130 #to_float;
+#X text 200 3130 convert grid to sequence of floats;
+#X obj 122 3162 #to_list;
+#X text 200 3162 convert grid to list;
+#X obj 101 3194 #to_literal;
+#X text 200 3194 convert grid to grid-literal (list with a # sign);
+#X obj 129 3226 #to_pix;
+#X text 200 3226 convert grid to pix (GEM);
+#X obj 108 3258 #to_symbol;
+#X text 200 3258 convert grid of ASCII codes to symbol;
+#X obj 108 3290 #transpose;
+#X text 200 3290 swap two dimensions out of any \, in a grid;
+#X obj 143 3322 #type;
+#X text 200 3322 get a symbol representing the number type of a grid;
+#X obj 129 3354 #unpack;
+#X text 200 3354 split a grid into floats on separate outlets;
+#X obj 129 3386 #window;
+#X text 200 3386 a [#out window] that can be toggled to appear and disappear;
+#X obj 101 3418 #yuv_to_rgb;
+#X text 200 3418 convert unsigned YUV to RGB;
+#X obj 143 3450 @join;
+#X text 200 3450 join two grids together along any dimension;
+#X obj 150 3482 args;
+#X text 200 3482 pick up the arguments of an abstraction instance \, including nested lists and init-messages;
+#X obj 143 3514 ascii;
+#X text 200 3514 write integer as decimal in ascii codes;
+#X obj 108 3546 ascii_to_f;
+#X text 200 3546 converts a list of ascii codes to a float;
+#X obj 94 3578 class_exists;
+#X text 200 3578 figure out whether a class has been loaded by pd;
+#X obj 115 3610 condition;
+#X text 200 3610 Castonguay rectangle bounds-checking;
+#X obj 143 3642 count;
+#X text 200 3642 Castonguay counter;
+#X obj 136 3674 cv.Add;
+#X text 200 3674 OpenCV addition;
+#X obj 136 3706 cv.Div;
+#X text 200 3706 OpenCV division;
+#X obj 38 3738 cv.HaarDetectObjects;
+#X text 200 3738 OpenCV (future use);
+#X obj 115 3770 cv.Invert;
+#X text 200 3770 OpenCV invert matrix;
+#X obj 115 3802 cv.Kalman;
+#X text 200 3802 OpenCV (future use);
+#X obj 136 3834 cv.Mul;
+#X text 200 3834 OpenCV multiplication;
+#X obj 136 3866 cv.SVD;
+#X text 200 3866 OpenCV singular value decomposition (eigendecomposition);
+#X obj 136 3898 cv.Sub;
+#X text 200 3898 OpenCV subtraction;
+#X obj 129 3930 display;
+#X text 200 3930 print message or grid inside of the patch;
+#X obj 136 3962 expect;
+#X text 200 3962 currently does like list.== (will do more than that in the future);
+#X obj 157 3994 for;
+#X text 200 3994 make sequence of float messages for each number in a range with specified stepping;
+#X obj 129 4026 foreach;
+#X text 200 4026 convert a list to a sequence of atom messages;
+#X obj 157 4058 fps;
+#X text 200 4058 measure frames per second and make statistics;
+#X obj 122 4090 gf.error;
+#X text 200 4090 emit error message from the perspective of the current abstraction instance in its parent patch;
+#X obj 80 4122 gf.io_generate;
+#X text 200 4122 for internal use by #in and #out;
+#X obj 108 4154 gf.oneshot;
+#X text 200 4154 spigot that shuts itself down after each message;
+#X obj 66 4186 gf.suffix_lookup;
+#X text 200 4186 find the objectclass corresponding ;
+#X obj 150 4218 inv*;
+#X text 200 4218 swapped /;
+#X obj 150 4250 inv+;
+#X text 200 4250 swapped -;
+#X obj 129 4282 list.==;
+#X text 200 4282 test two lists of floats and/or symbols for equality;
+#X obj 122 4314 listfind;
+#X text 200 4314 find index of an element in a list;
+#X obj 101 4346 listflatten;
+#X text 200 4346 merge all nested lists together \, depth-first;
+#X obj 122 4378 listread;
+#X text 200 4378 find element at an index in a list;
+#X obj 101 4410 listreverse;
+#X text 200 4410 mirror image of a list;
+#X obj 87 4442 parallel_port;
+#X text 200 4442 send to and receive from a DB25 parallel port;
+#X obj 122 4474 pingpong;
+#X text 200 4474 turns value of a counter into a zigzag between 0 and a given value;
+#X obj 73 4506 plotter_control;
+#X text 200 4506 make HPGL commands;
+#X obj 80 4538 plotter_parser;
+#X text 200 4538 interprets ascii codes as HPGL commands and output them as messages;
+#X obj 143 4570 range;
+#X text 200 4570 multiple moses in cascade;
+#X obj 94 4602 receives \$0-;
+#X text 200 4602 multiple receives with common outlet and other outlet telling the name of intended destination;
+#X obj 136 4634 route2;
+#X text 200 4634 route messages but keep them intact (does not remove selector);
+#X obj 45 4666 send39 \$0-patchname;
+#X text 200 4666 backward-compatibility crutch for dynamic patching in pd 0.39;
+#X obj 122 4698 seq_fold;
+#X text 200 4698 cascade the use of an object on all elements of an incoming message sequence;
+#X obj 143 4730 shunt;
+#X text 200 4730 demultiplexer: send input to separately specified outlet;
+#X obj 108 4762 systemtime;
+#X text 200 4762 time spent by process in kernel mode \, as measured by the OS;
+#X obj 129 4794 tsctime;
+#X text 200 4794 high-resolution real time \, as measured by the CPU;
+#X obj 115 4826 unix_time;
+#X text 200 4826 real time as measured by the OS \, including date;
+#X obj 122 4858 usertime;
+#X text 200 4858 time spent by process in non-kernel mode \, as measured by the OS;
+#X obj 143 4890 var.#;
+#X text 200 4890 like [f] for grids;
diff --git a/externals/gridflow/doc/install.html b/externals/gridflow/doc/install.html
new file mode 100644
index 00000000..fd688cb8
--- /dev/null
+++ b/externals/gridflow/doc/install.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><!-- $Id: install.html 4243 2009-10-18 19:32:20Z matju $ -->
+<title>GridFlow 0.9.3 - Installation</title><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="stylesheet" href="gridflow.css" type="text/css"></head><body leftmargin="0" topmargin="0" bgcolor="#ffffff" marginheight="0" marginwidth="0">
+
+<table width="100%" cellspacing="10"><tr><td>
+<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
+ <td> <img src="images/header1.png" alt="GridFlow" width="384" height="64"></td>
+ <td width="100%"><img src="images/header2.png" alt="GridFlow" width="100%" height="64"></td>
+ <td> <img src="images/header3.png" alt="GridFlow" width="32" height="64"></td>
+</table>
+</td></tr></table>
+<blockquote>
+
+<table bgcolor="white" border="0" cellspacing="2" width="100%">
+<tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td><h4>GridFlow 0.9.3 - Installation</h4>
+<ul>
+<li><h5><a href="#Hardware_and_Software_you_Probably_Need">Hardware and Software you Probably Need</a></h4>
+<li><h5><a href="#Downloading_from_SVN">Downloading from SVN</a></h4>
+<li><h5><a href="#Installation_instructions_%28incl._compilation%29">Installation instructions (incl. compilation)</a></h4>
+<li><h5><a href="#Other_Tips">Other Tips</a></h4>
+</ul>
+</td></tr>
+
+<tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td><h4><a name="Hardware_and_Software_you_Probably_Need">Hardware and Software you Probably Need</a></h4>
+
+<p><b>Computer/Processor:</b> GridFlow is mainly made on PC. This includes AMD K6/K7/K8 (Athlon/Opteron/etc), Intel P2/P3/P4 and other Pentiums, Intel CoreDuo, etc.; the absolute minimum is 386. However, GridFlow has also been seen working on Macintosh (G3/G4/G5), Corel NetWinder, and SPARCstation.</p>
+
+<p><b>Operating System:</b> GridFlow is mainly made on Ubuntu. We have also used Debian, SuSE and Mandrake. We suppose that it would work on FreeBSD, NetBSD or OpenBSD if someone tried. MacOSX support is a bit trickier but it should work on 10.3 (haven't tried lately). It also worked on Solaris when I tried it. Microsoft Windows is not supported, but if you do want to try to add support for that, try CygWin and/or MinGW.</p>
+
+<p><b>Required Software:</b><ul>
+ <li>Ruby 1.8 or 1.9</li>
+ <li>PureData 0.39 or later, or DesireData</li>
+ <li>GNU C++ Compiler (g++) version 3.x or 4.x</li>
+ <li>GNU Make</li>
+ <li>SVN</li>
+ <li>Developer Tools CD dec 2002 (if MacOS 10.2)</li>
+ <li>XCODE (if MacOS 10.3)</li>
+ <li>FINK (if MacOS 10)</li></ul>
+
+<p><b>Multimedia Components (optional):</b><ul>
+ <li>libSDL (Simple Directmedia Layer)</li>
+ <li>libjpeg</li>
+ <li>libpng</li>
+ <li>libmpeg3 (.mpg reader, HeroineWarrior's)</li>
+ <li>libquicktime (.mov reader/writer, Burkhard Plaum's or HeroineWarrior's) </li>
+ <li>libmpeg (.mpg reader, Greg Ward's, old)</li>
+ <li>Apple QuickTime (.mov reader/writer)</li>
+ <li>Ascii Art Library (aalib)</li>
+ <li>PCI video digitizer card (and Video4linux 1 driver)</li>
+ <li>USB camera (and Video4linux 1 driver)</li>
+ <li>FFTW3</li>
+ <li>Apple X11 (<a href="http://www.apple.com/support/downloads/x11formacosx.html">for OSX 10.3</a> or
+ <a href="http://www.apple.com/support/downloads/x11update2006113.html">for OSX 10.4</a>)</li>
+</ul>
+
+<tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td><h4><a name="Downloading_from_SVN">Downloading from SVN</a></h4>
+<p>The SVN has the absolute latest version of GridFlow, but it's not guaranteed to be working, whereas
+the actual releases are more tested.</p>
+<p>However you may have various reasons to use the SVN edition, so here's how:</p>
+<p>Make sure you have the <kbd>svn</kbd> program installed.</p>
+<ul>
+<li><kbd>cd pd/extra</kbd>
+<li><kbd>svn checkout http://gridflow.ca/svn/trunk</kbd>
+<li><kbd>mv trunk gridflow</kbd></ul>
+<p>And the subsequent times, you only do this:<ul>
+<li><kbd>cd pd/extra/gridflow</kbd></p>
+<li><kbd>svn update</kbd></ul></p></td></tr>
+
+<tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td><h4><a name="Installation_instructions_(incl._compilation)">Installation instructions (incl. compilation)</a></h4>
+<ol>
+ <ul><li> Install Ruby.</li>
+ <li>Download GridFlow from the website and uncompress it, or get it from the SVN server.</li>
+ <li>Run <kbd>./configure</kbd> from the <kbd>gridflow</kbd> directory. Make sure it detects all the components
+ you want to use with GridFlow. In MacOS you would normally use FINK to install those extra components: <kbd>ruby libjpeg libjpeg-shlibs libpng-shlibs libpng3 libpng3-shlibs libmpeg libmpeg-shlibs</kbd> </li>
+
+ <li>In Debian (lenny) or Ubuntu (8.04), do <kbd><pre>
+ apt-get install libjpeg62-dev libpng12-dev libmpeg3-dev libquicktime-dev fftw3-dev \
+ libaa1-dev libsdl1.2-dev libnetpbm10-dev libx11-dev libxt-dev g++ \
+ ruby nasm libglib1.2-dev
+ </pre></kbd>
+ At least with Ubuntu you can add those, but haven't tried with Debian yet:<kbd><pre>
+ apt-get install libcv-dev libdc1394-13-dev
+ </pre></kbd></li>
+
+ <li>Note: you may have to set <kbd>CPLUS_INCLUDE_PATH</kbd> and <kbd>C_INCLUDE_PATH</kbd>
+to indicate where to find *.h files, and you
+may have to set both <kbd>LIBRARY_PATH</kbd> and <kbd>LD_LIBRARY_PATH</kbd> to indicate where to find
+*.so or *.a or *.dylib or *.bundle or *.dll or *.lib files.</li>
+ <li>Note: you can do <kbd>./configure --help</kbd> to get a list of supported
+options. You can use them to ignore the presence of troublesome libraries
+and select debugging level. With <kbd>--use-compiler</kbd> you should use a version of <kbd>g++</kbd>, not
+directly a version of <kbd>gcc</kbd>, else you get <kbd>undefined symbol</kbd> problems. Some versions of gcc/g++
+are troublesome.</li>
+ <li>Run <kbd>make</kbd> to produce the executables <kbd>gridflow.so</kbd> and <kbd>gridflow.pd_linux</kbd> or similar</li> <ul>
+ <li>Loading GridFlow:<ul>
+ <li>PureData : With a text editor, modify or create <kbd>~/.pdrc</kbd> and write <kbd>-lib gridflow</kbd>. </li>
+ <li>DesireData : In "Server Preferences", add <kbd>gridflow</kbd> to the list of libraries.</li> </ul>
+Note that on MacOS the dot-files are invisible in the Finder but you do <kbd>cd ~/Desktop; ln -s ../.pdrc "PureData Configuration"</kbd> to make an alias on the Desktop.
+Note also that on Windows the dot-files are even more trouble.</li> </ul></td></tr>
+
+<tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+<tr><td><h4><a name="Other_Tips">Other Tips</a></h4>
+<ul>
+ <li><b>1</b> : you just did a SVN update and now the program does not compile, or
+crashes, or changes didn't go through. <ul>
+ <li>If a new directory is created, you need to do <kbd>cvs update -d</kbd>.
+ Many people just add that option to their configuration of the SVN software.</li>
+ <li>When some kinds of changes have happened, you may have to rerun the <kbd>configure</kbd>
+ program before redoing <kbd>make</kbd>. If you had previously reconfigured with specific options,
+ don't forget to use them again in this case.</li>
+ <li>Maybe matju forgot to upload part of an important change. Tell him.</li> </ul></li>
+ <li>PureData Crashing: <ul>
+ <li>you can start the debugger like <kbd>gdb $(which pd) core.24255</kbd> where the latter part
+ is the name of a RAM dump file. You can enable those dumps using the shell command <kbd>ulimit -c unlimited</kbd>.
+ To avoid dumping, you can also start Pd from within the debugger
+ using <kbd>gdb `which pd`</kbd> then <kbd>run</kbd> then cause the crash.</li>
+ <li>In GDB, after a crash, you can use the <kbd>where</kbd> to find out what Pd was doing at the moment
+ of the crash. If instead Pd is frozen, you can force it to crash using Ctrl+C in the terminal. </li>
+ <li>To quit GDB use the <kbd>quit</kbd> command. (really.)</li> </ul></li> </ul></td></tr>
+
+<tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr><tr><td>
+<p><font size="-1">
+GridFlow 0.9.3 Documentation<br>
+Copyright © 2001-2008 by Mathieu Bouchard
+<a href="mailto:matju@artengine.ca">matju@artengine.ca</a>
+</font></p>
+</td></tr></tbody></table>
+</blockquote></body></html>
diff --git a/externals/gridflow/doc/introduction.html b/externals/gridflow/doc/introduction.html
new file mode 100644
index 00000000..3dcda73f
--- /dev/null
+++ b/externals/gridflow/doc/introduction.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head>
+
+<title>GridFlow 0.9.3 - Introduction</title><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="stylesheet" href="gridflow.css" type="text/css"></head>
+<body leftmargin="0" topmargin="0" bgcolor="#ffffff" marginheight="0" marginwidth="0">
+<table width="100%" cellspacing="10"><tr><td>
+<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
+ <td> <img src="images/header1.png" alt="GridFlow" width="384" height="64"></td>
+ <td width="100%"><img src="images/header2.png" alt="GridFlow" width="100%" height="64"></td>
+ <td> <img src="images/header3.png" alt="GridFlow" width="32" height="64"></td>
+</table>
+</td></tr></table>
+<blockquote>
+
+<br>
+<table border="0" cellspacing="5" width="100%">
+ <tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+
+ <tr><td height="16">
+ <h4>GridFlow 0.9.3 - introduction</h4>
+ </td></tr>
+ <tr>
+ <td width="82%">
+
+ <p> The philosophy that guides PureData is a simple but powerful one:
+ the software must first provide the user with generic tools
+ rather than imposing pre-cooked effects. In other words the user
+ should have total freedom.
+
+ </p><p> GridFlow follows that philosophy: it first defines elementary
+ mathematical operations. Those can in turn be used as simple
+ visual effects or be combined to produce more complex effects.
+
+ </p><p> The strategy followed by most video plugins for PureData and MAX/MSP, is
+ to provide the user first with constructs for manipulating video
+ streams at a fairly high level. The strategy put forward by GridFlow
+ is different.
+
+ </p><p> It can be said that in all those video plugins there are three layers:
+ the first, the low level, is not accessible to non-programmers (and fairly
+ difficult of access even to programmers); the second, mathematical, where
+ one needs not to be a C++ programmer, but still requires a good
+ understanding of how numbers and pixels and colours and geometry work; and
+ a third level that looks more like the software an artist would like to
+ use.
+
+ </p><p> In other video plugins there is a fairly low emphasis on the second
+ layer. In GridFlow that layer is very strong and opens many possibilities.
+ Even though the third layer in GridFlow is not as developed as it could,
+ the second layer may be used to produce third-layer object classes much
+ more quickly.
+
+ </p><p> GridFlow provides a unifying view of multimedia information. Several
+ kinds of data -- raster graphics in any number of channels, coordinate
+ transforms, matrices, vectors -- may all be represented by <b>Grids</b>
+ (also known as multi-dimensional arrays). Grids exist in several ways: they
+ are usually streamed from object to object, but they can also be stored in
+ memory, stored into a file, sent through the network.
+
+ </p><p> In short, GridFlow is a whole new world of possibilities for
+ the multimedia artist and programmer.
+
+ </p><p>- matju</p><br>
+</td></tr>
+
+ <tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+ <tr>
+ <td width="82%">
+
+ <p> Here is an example of how things work in GridFlow. (if you want more
+ information, consult the rest of this manual)
+
+ </p><p> A picture is a three-dimensional Grid:<br>
+ <b>0</b> : rows <br>
+ <b>1</b> : columns <br>
+ <b>2</b> : channels <br>
+
+ </p><p>
+ Pictures come in all sorts of heights and widths. The channels, however,
+ are more limited in number. Usually it's three: Red, Green, Blue.
+
+ </p><p> A coordinate transform, when specified pixel by pixel, may be a
+ three-dimensional Grid in which the two "channels" are Y and X,
+ representing row-and-column positions in a separate picture.
+
+ </p><p> Other shapes of grids could be designed to represent various things;
+ for example, configuration for blur effects. Grids could be useful for
+ things not directly related to raster pictures (e.g. sound recordings).
+ Those are all kinds of things you could actually develop <i>within</i> the
+ PureData / GridFlow framework. You don't need to wait for me.
+</p></td>
+
+ <tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+
+ <tr><td>
+ <p><font size="-1">GridFlow 0.9.3 Documentation<br>
+ by Mathieu Bouchard <a href="mailto:matju@artengine.ca">matju@artengine.ca</a>
+ and<br>
+ Alexandre Castonguay <a href="mailto:acastonguay@artengine.ca">acastonguay@artengine.ca</a></font></p>
+ </td>
+ </tr>
+
+</table>
+</body></html> \ No newline at end of file
diff --git a/externals/gridflow/doc/license.html b/externals/gridflow/doc/license.html
new file mode 100644
index 00000000..4f2ff6cf
--- /dev/null
+++ b/externals/gridflow/doc/license.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><!-- $Id: license.html 3732 2008-06-02 14:30:54Z matju $ --><!--
+ GridFlow Reference Manual: Architecture
+ Copyright (c) 2001,2002,2003,2004 by Mathieu Bouchard
+-->
+
+
+
+<title>GridFlow 0.9.3 - License</title><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="stylesheet" href="gridflow.css" type="text/css"></head>
+<body leftmargin="0" topmargin="0" bgcolor="#ffffff" marginheight="0" marginwidth="0">
+<table width="100%" cellspacing="10"><tr><td>
+<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
+ <td> <img src="images/header1.png" alt="GridFlow" width="384" height="64"></td>
+ <td width="100%"><img src="images/header2.png" alt="GridFlow" width="100%" height="64"></td>
+ <td> <img src="images/header3.png" alt="GridFlow" width="32" height="64"></td>
+</table>
+</td></tr></table>
+<blockquote>
+
+<br>
+<table border="0" cellspacing="5" width="100%">
+ <tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+ <tr><td height="16"><h4>GridFlow 0.9.3 - License</h4>
+ <table><tr>
+ <td width="12%">&nbsp;</td>
+ <td width="76%">
+ <table cellpadding="0" cellspacing="1"><tbody><tr><td bgcolor="black">
+ <table cellpadding="20" cellspacing="1"><tbody><tr><td bgcolor="white">
+ <p>
+ Copyright (c) 2001-2008 by Mathieu Bouchard
+
+ </p><p>
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ </p><p>
+ See file LICENSE for further informations on licensing terms.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ </p><p>
+ You should have received a copy of the GNU General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+ </p></td></tr></table>
+ </td></tr></table>
+ </td>
+ <td width="12%">&nbsp;</td>
+ </tr></table>
+ <br>
+ </td>
+ </tr>
+ <tr><td bgcolor="black"><img src="images/black.png" height="2" width="1"></td></tr>
+
+ <tr><td>
+ <p><font size="-1">GridFlow 0.9.3 Documentation<br>
+ Copyright © 2001-2008 by Mathieu Bouchard <a href="mailto:matju@artengine.ca">matju@artengine.ca</a>
+ </td>
+ </tr>
+
+</tbody></table>
+</blockquote>
+</body></html>
diff --git a/externals/gridflow/doc/locale/english.tcl b/externals/gridflow/doc/locale/english.tcl
new file mode 100644
index 00000000..c69b5b0e
--- /dev/null
+++ b/externals/gridflow/doc/locale/english.tcl
@@ -0,0 +1,191 @@
+# this file will not contain any aliases, just the canonical names
+
+proc say2 {k v} {
+ say [lindex $k 0] $v
+ foreach kk [lrange $k 1 end] {say $k "old name of $k : $v"}
+}
+
+proc say3 {k v} {
+ set kk [regsub ^# $k @]
+ say2 [list k kk] $v
+}
+
+category "Stuff"
+say # "plain numeric operators on grids: + - * / etc"
+say #border "add padding on sides of a grid"
+say #cast "convert grid from one number type to another"
+say #centroid "find centroid (weighted average) of the coordinates of a grid"
+say #convolve "compute convolution product of a grid (blur and edge-detection)"
+say #dim "get the size (dimensions) of a grid"
+say #downscale_by "reduce the size of an image by a whole factor"
+say #draw_image "picture-in-picture"
+say #draw_points "(future use)"
+
+category "Data Conversion"
+say #to_literal "convert grid to grid-literal (list with a # sign)"
+say #to_float "convert grid to sequence of floats"
+say #to_list "convert grid to list"
+say #to_pix "convert grid to pix (GEM)"
+say #to_symbol "convert grid of ASCII codes to symbol"
+
+category "Stuff"
+say #fft "compute forward or inverse one-or-two-dimensional complex FFT of a grid"
+say #finished "bang when grid transmission has ended"
+say #fold "compute the sum of each row, product of each row, and other similar operations"
+say #for "make a grid from all numbers or coordinates in a certain range"
+say #from_pix "convert pix (GEM) to grid"
+say #import_pix "old name of #from_pix"
+say #grade "make an index of the sorting of a grid"
+say #import "convert float, list, or symbol ASCII codes, to a grid"
+say #inner "scalar (\"dot\") product, matrix product, tensor contraction, image channel remapping, etc."
+
+category "Hardware and Files"
+say #camera "control panel for opening cameras"
+say #io.aalib "open an aalib window"
+say #io.dc1394 "open a faiawaia \"DC\" camera (not DV) using a Linux-compatible OS"
+say #io.grid "read or write a .grid file (GridFlow storage format)"
+say #io.jpeg "read or write a .jpeg file"
+say #io.mpeg "read a .mpeg video file"
+say #io.png "read a .png image file"
+say #io.ppm "read or write a .pbm or .pgm or .ppm image file"
+say #io.quicktime "read a .mov video file (or perhaps .avi)"
+say #io.sdl "open a SDL window"
+say #io.videodev "open a V4L1 device (Linux interface for video cameras and video digitisers)"
+say #io.x11 "open a X11 window"
+say parallel_port "send to and receive from a DB25 parallel port"
+say plotter_control "make HPGL commands"
+
+category "Stuff"
+say #labelling "tag connected pixels with region numbers in a two-tone single-channel image"
+say #layer "layer two same-sized images"
+say #moment "find 1st or 2nd order moment (weighted average or variance) of the coordinates of a grid"
+say #noise_gate_yuvs "replaces dark pixels by black pixels in signed YUV images"
+say #outer "apply numeric operator on all possible combinations of elements of one grid with elements of another"
+say #pack "combine floats on separate inlets to make a grid"
+say #perspective "divide each point by its depth"
+say #polygonize "(future use)"
+say #print "print to console"
+say #redim "change the size of a grid by restreaming contents into a new shape"
+say #reverse "mirror image of a grid along a dimension"
+say #rotatificator "make rotation matrix for any two dimensions chosen from manyou"
+say #scale_by "reduce the size of an image by a whole factor"
+say #scan "compute the cumulative sums of each row, and other similar operations"
+say #store "store image in RAM, in-place picture-in-picture, and make lookups in various ways"
+say #transpose "swap two dimensions out of any, in a grid"
+say #type "get a symbol representing the number type of a grid"
+say #unpack "split a grid into floats on separate outlets"
+say @join "join two grids together along any dimension"
+
+category "Lists"
+say foreach "convert a list to a sequence of atom messages"
+say listfind "find index of an element in a list"
+say listread "find element at an index in a list"
+say listflatten "merge all nested lists together, depth-first"
+say listreverse "mirror image of a list"
+
+category "Stuff"
+say args "pick up the arguments of an abstraction instance, including nested lists and init-messages"
+say ascii "write integer as decimal in ascii codes"
+say class_exists "figure out whether a class has been loaded by pd"
+say display "print message or grid inside of the patch"
+say gf.error "emit error message from the perspective of the current abstraction instance in its parent patch"
+say gf.suffix_lookup "find the objectclass corresponding "
+say range "multiple moses in cascade"
+say receives "multiple receives with common outlet and other outlet telling the name of intended destination"
+say route2 "route messages but keep them intact (does not remove selector)"
+say send39 "backward-compatibility crutch for dynamic patching in pd 0.39"
+say shunt "demultiplexer: send input to separately specified outlet"
+say systemtime "time spent by process in kernel mode, as measured by the OS"
+say tsctime "high-resolution real time, as measured by the CPU"
+say unix_time "real time as measured by the OS, including date"
+say usertime "time spent by process in non-kernel mode, as measured by the OS"
+
+category "Stuff"
+say #apply_colormap_channelwise "apply color correction tables separately on each channel"
+say #background_model "make mask from learning to distinguish background from foreground"
+say #change "send grid only if different from previous grid"
+say #checkers "make image of chequered background in two tones of grey"
+say #clip "min and max"
+say #color "GUI for selecting a colour"
+say condition "Castonguay rectangle bounds-checking"
+say #contrast "adjust contrast in two different ways"
+say count "Castonguay counter"
+say #fade_lin "fade in piecewise-linear fashion"
+say #fade "fade in exponential-decay fashion (linear recurrence)"
+say #fastblur "speedy shortcut for rectangular blur"
+say for "make sequence of float messages for each number in a range with specified stepping"
+say fps "measure frames per second and make statistics"
+say #gamma "apply gamma correction"
+say gf.io_generate "for internal use by #in and #out"
+say #hueshift "apply hue shift by rotating the color wheel"
+
+say #in "open file or device for reading or download"
+say #out "open file or device for writing or upload"
+
+say inv* "swapped /"
+say inv+ "swapped -"
+
+say #moment_polar "convert covariance matrix to the longest and shortest radius of an ellipse and a rotation angle"
+say #motion_detection "frame difference with some options"
+say #mouse "converts mouse events to reports of clicks, drags, unclicks, motions, and separate buttons and wheel"
+say gf.oneshot "spigot that shuts itself down after each message"
+say pingpong "turns value of a counter into a zigzag between 0 and a given value"
+
+category "Polygons"
+say #polygon_area "find area of a polygon in square pixels"
+say #polygon_comparator "find similarity between two polygons independently of rotation, by radial maps and FFT"
+say #polygon_each_edge "convert a polygon to a sequence of overlapping 2-sided polygons representing edges"
+say #polygon_moment "find average of all points inside of a polygon"
+say #polygon_perimetre "find perimetre of a polygon in pixels (euclidian)"
+say #polygon_radial_map "find radius of a polygon from a given origin, sampled at equally spaced angles"
+say #line_to_polygon "convert line (as point pair) to polygon (rotated rectangle)"
+say #draw_rect "draw a rectangle in an image"
+say #draw_slider "draw a slider in an image"
+say #edit_polygon "draw a polygon in an image and react to mouse events"
+say #make_cross "make cross-shaped polygon"
+say #draw_polygon "draw polygon in an image"
+
+category "Stuff"
+say #posterize "quantise pixel values"
+say #ravel "do #redim so that a grid keeps same number of elements but just one dimension"
+say #record "wrapper around \[#in quicktime\]"
+say #remap_image "apply object chain on pixel positions to make new image from chosen pixels of the input image"
+say #rotate "rotate points through two axes (or rotate pixels as points in a colorspace)"
+say #saturation "multiply chroma by some value"
+say #scale_to "scale an image from one size to any other size by deleting or duplicating rows and columns"
+say #seq_fold "cascade the use of an object on all elements of an incoming grid message sequence"
+say seq_fold "cascade the use of an object on all elements of an incoming message sequence"
+say #slice "crop an image using a start point (top left) and end point (bottom right)"
+say #solarize "like pingpong but on all pixel values of a grid"
+say #sort "sort each row of a grid"
+say #spread "add noise to each vector (point or pixel)"
+say #swap "like \[swap\] for grids"
+say #text_to_image "use a fixed-width font grid to make a tiling of characters as specified by a text string"
+say #t "like \[t a a\] for grids"
+say var.# "like \[f\] for grids"
+
+category "Colorspace Conversion"
+say #rgb_to_yuv "convert RGB to unsigned YUV"
+say #yuv_to_rgb "convert unsigned YUV to RGB"
+say #rgb_to_rgba "convert RGB to RGBA (but setting alpha to 0)"
+say #rgba_to_rgb "convert RGBA to RGB"
+say #greyscale_to_rgb "convert greyscale to RGB"
+say #rgb_to_greyscale "convert RGB to greyscale"
+
+category "OpenCV"
+say cv.Add "OpenCV addition"
+say cv.Div "OpenCV division"
+say cv.HaarDetectObjects "OpenCV (future use)"
+say cv.Kalman "OpenCV (future use)"
+say cv.Mul "OpenCV multiplication"
+say cv.Sub "OpenCV subtraction"
+say cv.Invert "OpenCV invert matrix"
+say cv.SVD "OpenCV singular value decomposition (eigendecomposition)"
+
+category "Stuff"
+say ascii_to_f "converts a list of ascii codes to a float"
+say plotter_parser "interprets ascii codes as HPGL commands and output them as messages"
+say list.== "test two lists of floats and/or symbols for equality"
+say expect "currently does like list.== (will do more than that in the future)"
+say #hello "make 7 colour bars"
+say #window "a \[#out window\] that can be toggled to appear and disappear"
diff --git a/externals/gridflow/doc/make_index.tcl b/externals/gridflow/doc/make_index.tcl
new file mode 100644
index 00000000..7767b0f4
--- /dev/null
+++ b/externals/gridflow/doc/make_index.tcl
@@ -0,0 +1,29 @@
+proc say {k v} {set ::say($k) $v}
+proc category {k} {}
+source locale/english.tcl
+puts "#N canvas 0 0 640 480 10 ;"
+set y 50
+foreach k [lsort [array names ::say *]] {
+ set v $::say($k)
+ if {$k == "#"} {set k "# +"}
+ if {$k == "#fold"} {set k "#fold +"}
+ if {$k == "#scan"} {set k "#scan +"}
+ if {$k == "#outer"} {set k "#outer +"}
+ if {$k == "#cast"} {set k "#cast i"}
+ if {$k == "#for"} {set k "#for 0 4 1"}
+ if {$k == "#redim"} {set k "#redim ()"}
+ if {$k == "receives"} {set k "receives \$0-"}
+ if {$k == "send39"} {set k "send39 \$0-patchname"}
+ set w [string length $k]
+ regsub "\\$" $k "\\$" k
+ if {$w<3} {set w 3}
+ set w [expr {$w*7+2}]
+ if {$k == "#color"} {set w 156}
+ puts "#X obj [expr 180-$w] $y $k;"
+ regsub "," $v " \\, " v
+ regsub ";" $v " \\; " v
+ regsub "\\$" $v "\\$" v
+ puts "#X text 200 $y $v;"
+ if {$k == "#color"} {incr y 40}
+ incr y 32
+}
diff --git a/externals/gridflow/doc/moulinette.tcl b/externals/gridflow/doc/moulinette.tcl
new file mode 100644
index 00000000..952459b3
--- /dev/null
+++ b/externals/gridflow/doc/moulinette.tcl
@@ -0,0 +1,215 @@
+#!/usr/bin/env tclsh
+
+proc mset {vars list} {uplevel 1 "foreach {$vars} {$list} {break}"}
+proc p {text} {write [list #X text 10 $::y $text]; incr ::y 60}
+proc write {list} {
+ set v [join $list " "]
+ regsub -all "," $v " \\, " v
+ regsub -all ";" $v " \\; " v
+ regsub -all "\\$" $v "\\$" v
+ puts $::fh "$v;"
+}
+set oid 0
+proc obj {args} {write [concat [list #X obj ] $args]; incr ::oid}
+proc msg {args} {write [concat [list #X msg ] $args]; incr ::oid}
+proc text {args} {write [concat [list #X text] $args]; incr ::oid}
+
+set fh [open numop.pd w]
+write [list #N canvas 0 0 1024 768 10]
+set y 0
+set row 0
+set msgboxes {}
+set col1 96
+set col2 512
+set col3 768
+set col4 1024
+set rowsize 32
+
+obj 0 $y cnv 15 $col4 30 empty empty empty 20 12 0 14 20 -66577 0
+text 10 $y op name
+text $col1 $y description
+text $col2 $y "effect on pixels"
+text $col3 $y "effect on coords"
+incr y 32
+
+# onpixels = meaning in pixel context (pictures, palettes)
+# oncoords = meaning in spatial context (indexmaps, polygons)
+
+# for vecops, the two analogy-columns were labelled:
+# meaning in geometric context (indexmaps, polygons, in which each complex number is a point)
+# meaning in spectrum context (FFT) in which each number is a (cosine,sine) pair
+proc op {op desc {extra1 ""} {extra2 ""}} {
+ global y
+ if {$::row&1} {set bg -233280} {set bg -249792}
+ obj 0 $y cnv 15 $::col4 [expr $::rowsize-2] empty empty empty 20 12 0 14 $bg -66577 0
+ lappend ::msgboxes $::oid
+ msg 10 $y op $op
+ text $::col1 $y $desc
+ if {$extra1 != ""} {text $::col2 $y $extra1}
+ if {$extra2 != ""} {text $::col3 $y $extra2}
+ incr ::row
+ incr ::y $::rowsize
+}
+
+proc draw_columns {} {
+ obj [expr $::col1-1] 0 cnv 0 0 $::y empty empty empty -1 12 0 14 0 -66577 0
+ obj [expr $::col2-1] 0 cnv 0 0 $::y empty empty empty -1 12 0 14 0 -66577 0
+ obj [expr $::col3-1] 0 cnv 0 0 $::y empty empty empty -1 12 0 14 0 -66577 0
+}
+
+proc numbertype {op desc {extra1 ""} {extra2 ""}} {op $op $desc $extra1 $extra2}
+
+set sections {}
+proc section {desc} {
+ lappend ::sections [list $::y $desc]
+ incr ::y 20
+}
+
+section {numops}
+op {ignore} { A } {no effect} {no effect}
+op {put} { B } {replace by} {replace by}
+op {+} { A + B } {brightness, crossfade} {move, morph}
+op {-} { A - B } {brightness, motion detection} {move, motion detection}
+op {inv+} { B - A } {negate then contrast} {180 degree rotate then move}
+op {*} { A * B } {contrast} {zoom out}
+op {/} { A / B, rounded towards zero } {contrast} {zoom in}
+op {div} { A / B, rounded downwards } {contrast} {zoom in}
+op {inv*} { B / A, rounded towards zero }
+op {swapdiv} { B / A, rounded downwards }
+op {%} { A % B, modulo (goes with div) } {--} {tile}
+op {swap%} { B % A, modulo (goes with div) }
+op {rem} { A % B, remainder (goes with /) }
+op {swaprem} { B % A, remainder (goes with /) }
+op {gcd} {greatest common divisor}
+op {lcm} {least common multiple}
+op {|} { A or B, bitwise } {bright munchies} {bottomright munchies}
+op {^} { A xor B, bitwise } {symmetric munchies (fractal checkers)} {symmetric munchies (fractal checkers)}
+op {&} { A and B, bitwise } {dark munchies} {topleft munchies}
+op {<<} { A * (2**(B % 32)), which is left-shifting } {like *} {like *}
+op {>>} { A / (2**(B % 32)), which is right-shifting } {like /,div} {like /,div}
+op {||} { if A is zero then B else A }
+op {&&} { if A is zero then zero else B}
+op {min} { the lowest value in A,B } {clipping} {clipping (of individual points)}
+op {max} { the highest value in A,B } {clipping} {clipping (of individual points)}
+op {cmp} { -1 when A&lt;B; 0 when A=B; 1 when A&gt;B. }
+op {==} { is A equal to B ? 1=true, 0=false }
+op {!=} { is A not equal to B ? }
+op {>} { is A greater than B ? }
+op {<=} { is A not greater than B ? }
+op {<} { is A less than B ? }
+op {>=} {is A not less than B ? }
+op {sin*} { B * sin(A) in centidegrees } {--} {waves, rotations}
+op {cos*} { B * cos(A) in centidegrees } {--} {waves, rotations}
+op {atan} { arctan(A/B) in centidegrees } {--} {find angle to origin (part of polar transform)}
+op {tanh*} { B * tanh(A) in centidegrees } {smooth clipping} {smooth clipping (of individual points), neural sigmoid, fuzzy logic}
+op {log*} { B * log(A) (in base e) }
+op {gamma} { floor(pow(a/256.0,256.0/b)*256.0) } {gamma correction}
+op {**} { A**B, that is, A raised to power B } {gamma correction}
+op {abs-} { absolute value of (A-B) }
+op {rand} { randomly produces a non-negative number below A }
+op {sqrt} { square root of A, rounded downwards }
+op {sq-} { (A-B) times (A-B) }
+op {avg} { (A+B)/2 }
+op {hypot} { distance function: square root of (A*A+B*B) }
+op {clip+} { like A+B but overflow causes clipping instead of wrapping around (coming soon) }
+op {clip-} { like A-B but overflow causes clipping instead of wrapping around (coming soon) }
+op {erf*} { integral of e^(-x*x) dx ... (coming soon; what ought to be the scaling factor?) }
+op {weight} { number of "1" bits in an integer}
+op {sin} {sin(A-B) in radians, float only}
+op {cos} {cos(A-B) in radians, float only}
+op {atan2} {atan2(A,B) in radians, float only}
+op {tanh} {tanh(A-B) in radians, float only}
+op {exp} {exp(A-B) in radians, float only}
+op {log} {log(A-B) in radians, float only}
+
+section {vecops for complex numbers}
+op {C.* } {A*B}
+op {C.*conj} {A*conj(B)}
+op {C./ } {A/B}
+op {C./conj} {A/conj(B)}
+op {C.sq- } {(A-B)*(A-B)}
+op {C.abs- } {abs(A-B)}
+op {C.sin } {sin(A-B)}
+op {C.cos } {cos(A-B)}
+op {C.tanh } {tanh(A-B)}
+op {C.exp } {exp(A-B)}
+op {C.log } {log(A-B)}
+
+#section {vecops for other things}
+#op {cart2pol}
+#op {pol2cart}
+
+incr y 10
+set outletid $oid
+obj 10 $y outlet
+incr y 20
+
+foreach msgbox $msgboxes {write [list #X connect $msgbox 0 $outletid 0]}
+
+draw_columns
+
+foreach section $sections {
+ mset {y1 desc} $section
+ obj 0 $y1 cnv 15 $::col4 18 empty empty empty 20 12 0 14 -248881 -66577 0
+ text 10 $y1 $desc
+}
+
+p {
+ note: a centidegree is 0.01 degree. There are 36000 centidegrees in a circle.
+ Some angle operators use centidegrees, while some others use radians. To
+ convert degrees into centidegrees, multiply by 100.
+ To convert degrees into radians, divide by 57.2957 .
+ Thus, to convert centidegrees into radians, divide by 5729.57 .
+}
+
+close $fh
+set fh [open numtype.pd w]
+write [list #N canvas 0 0 1024 768 10]
+set y 0
+set row 0
+set oid 0
+set col1 192
+set col2 384
+set col3 608
+set col4 1024
+set rowsize 64
+
+obj 0 $y cnv 15 $col4 30 empty empty empty 20 12 0 14 20 -66577 0
+text 10 $y op names
+text $col1 $y range
+text $col2 $y precision
+text $col3 $y description
+incr y 32
+
+numbertype {b u8 uint8} {0 to 255} {1} {
+ unsigned 8-bit integer. this is the usual size of numbers taken from files and cameras, and
+ written to files and to windows. (however #in converts to int32 unless otherwise specified.)}
+numbertype {s i16 int16} {-32768 to 32767} {1}
+numbertype {i i32 int32} {-(1<<31) to (1<<31)-1} {1} {
+ signed 32-bit integer. this is used by default throughout GridFlow.
+}
+numbertype {l i64 int64} {-(1<<63) to (1<<63)-1} {1}
+numbertype {f f32 float32} {-(1<<128) to (1<<128)} {23 bits or 0.000012%}
+numbertype {d f64 float64} {-(1<<2048) to (1<<2048)} {52 bits or 0.000000000000022%}
+
+draw_columns
+
+p {High-performance computation requires precise and quite peculiar
+ definitions of numbers and their representation.}
+p {Inside most programs, numbers are written down as strings of
+ bits. A bit is either zero or one. Just like the decimal system
+ uses units, tens, hundreds, the binary system uses units, twos,
+ fours, eights, sixteens, and so on, doubling every time.}
+p {One notation, called integer allows for only integer values to be
+ written (no fractions). when it is unsigned, no negative values may
+ be written. when it is signed, one bit indicates whether the number
+ is positive or negative. Integer storage is usually fixed-size, so you have
+ bounds on the size of numbers, and if a result is too big it "wraps around", truncating the biggest
+ bits.}
+p {Another notation, called floating point (or float) stores numbers using
+ a fixed number of significant digits, and a scale factor that allows for huge numbers
+ and tiny fractions at once. Note that 1/3 has periodic digits, but even 0.1 has periodic digits,
+ in binary coding; so expect some slight roundings; the precision offered should be
+ sufficient for most purposes. Make sure the errors of rounding don't accumulate, though.}
+
+close $fh
diff --git a/externals/gridflow/doc/numop.pd b/externals/gridflow/doc/numop.pd
new file mode 100644
index 00000000..c1d8efbf
--- /dev/null
+++ b/externals/gridflow/doc/numop.pd
@@ -0,0 +1,327 @@
+#N canvas 0 0 1024 768 10;
+#X obj 0 0 cnv 15 1024 30 empty empty empty 20 12 0 14 20 -66577 0;
+#X text 10 0 op name;
+#X text 96 0 description;
+#X text 512 0 effect on pixels;
+#X text 768 0 effect on coords;
+#X obj 0 52 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 52 op ignore;
+#X text 96 52 A ;
+#X text 512 52 no effect;
+#X text 768 52 no effect;
+#X obj 0 84 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 84 op put;
+#X text 96 84 B ;
+#X text 512 84 replace by;
+#X text 768 84 replace by;
+#X obj 0 116 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 116 op +;
+#X text 96 116 A + B ;
+#X text 512 116 brightness \, crossfade;
+#X text 768 116 move \, morph;
+#X obj 0 148 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 148 op -;
+#X text 96 148 A - B ;
+#X text 512 148 brightness \, motion detection;
+#X text 768 148 move \, motion detection;
+#X obj 0 180 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 180 op inv+;
+#X text 96 180 B - A ;
+#X text 512 180 negate then contrast;
+#X text 768 180 180 degree rotate then move;
+#X obj 0 212 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 212 op *;
+#X text 96 212 A * B ;
+#X text 512 212 contrast;
+#X text 768 212 zoom out;
+#X obj 0 244 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 244 op /;
+#X text 96 244 A / B \, rounded towards zero ;
+#X text 512 244 contrast;
+#X text 768 244 zoom in;
+#X obj 0 276 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 276 op div;
+#X text 96 276 A / B \, rounded downwards ;
+#X text 512 276 contrast;
+#X text 768 276 zoom in;
+#X obj 0 308 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 308 op inv*;
+#X text 96 308 B / A \, rounded towards zero ;
+#X obj 0 340 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 340 op swapdiv;
+#X text 96 340 B / A \, rounded downwards ;
+#X obj 0 372 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 372 op %;
+#X text 96 372 A % B \, modulo (goes with div) ;
+#X text 512 372 --;
+#X text 768 372 tile;
+#X obj 0 404 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 404 op swap%;
+#X text 96 404 B % A \, modulo (goes with div) ;
+#X obj 0 436 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 436 op rem;
+#X text 96 436 A % B \, remainder (goes with /) ;
+#X obj 0 468 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 468 op swaprem;
+#X text 96 468 B % A \, remainder (goes with /) ;
+#X obj 0 500 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 500 op gcd;
+#X text 96 500 greatest common divisor;
+#X obj 0 532 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 532 op lcm;
+#X text 96 532 least common multiple;
+#X obj 0 564 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 564 op |;
+#X text 96 564 A or B \, bitwise ;
+#X text 512 564 bright munchies;
+#X text 768 564 bottomright munchies;
+#X obj 0 596 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 596 op ^;
+#X text 96 596 A xor B \, bitwise ;
+#X text 512 596 symmetric munchies (fractal checkers);
+#X text 768 596 symmetric munchies (fractal checkers);
+#X obj 0 628 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 628 op &;
+#X text 96 628 A and B \, bitwise ;
+#X text 512 628 dark munchies;
+#X text 768 628 topleft munchies;
+#X obj 0 660 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 660 op <<;
+#X text 96 660 A * (2**(B % 32)) \, which is left-shifting ;
+#X text 512 660 like *;
+#X text 768 660 like *;
+#X obj 0 692 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 692 op >>;
+#X text 96 692 A / (2**(B % 32)) \, which is right-shifting ;
+#X text 512 692 like / \, div;
+#X text 768 692 like / \, div;
+#X obj 0 724 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 724 op ||;
+#X text 96 724 if A is zero then B else A ;
+#X obj 0 756 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 756 op &&;
+#X text 96 756 if A is zero then zero else B;
+#X obj 0 788 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 788 op min;
+#X text 96 788 the lowest value in A \, B ;
+#X text 512 788 clipping;
+#X text 768 788 clipping (of individual points);
+#X obj 0 820 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 820 op max;
+#X text 96 820 the highest value in A \, B ;
+#X text 512 820 clipping;
+#X text 768 820 clipping (of individual points);
+#X obj 0 852 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 852 op cmp;
+#X text 96 852 -1 when A&lt \; B \; 0 when A=B \; 1 when A&gt \; B. ;
+#X obj 0 884 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 884 op ==;
+#X text 96 884 is A equal to B ? 1=true \, 0=false ;
+#X obj 0 916 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 916 op !=;
+#X text 96 916 is A not equal to B ? ;
+#X obj 0 948 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 948 op >;
+#X text 96 948 is A greater than B ? ;
+#X obj 0 980 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 980 op <=;
+#X text 96 980 is A not greater than B ? ;
+#X obj 0 1012 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1012 op <;
+#X text 96 1012 is A less than B ? ;
+#X obj 0 1044 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1044 op >=;
+#X text 96 1044 is A not less than B ? ;
+#X obj 0 1076 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1076 op sin*;
+#X text 96 1076 B * sin(A) in centidegrees ;
+#X text 512 1076 --;
+#X text 768 1076 waves \, rotations;
+#X obj 0 1108 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1108 op cos*;
+#X text 96 1108 B * cos(A) in centidegrees ;
+#X text 512 1108 --;
+#X text 768 1108 waves \, rotations;
+#X obj 0 1140 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1140 op atan;
+#X text 96 1140 arctan(A/B) in centidegrees ;
+#X text 512 1140 --;
+#X text 768 1140 find angle to origin (part of polar transform);
+#X obj 0 1172 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1172 op tanh*;
+#X text 96 1172 B * tanh(A) in centidegrees ;
+#X text 512 1172 smooth clipping;
+#X text 768 1172 smooth clipping (of individual points) \, neural sigmoid \, fuzzy logic;
+#X obj 0 1204 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1204 op log*;
+#X text 96 1204 B * log(A) (in base e) ;
+#X obj 0 1236 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1236 op gamma;
+#X text 96 1236 floor(pow(a/256.0 \, 256.0/b)*256.0) ;
+#X text 512 1236 gamma correction;
+#X obj 0 1268 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1268 op **;
+#X text 96 1268 A**B \, that is \, A raised to power B ;
+#X text 512 1268 gamma correction;
+#X obj 0 1300 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1300 op abs-;
+#X text 96 1300 absolute value of (A-B) ;
+#X obj 0 1332 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1332 op rand;
+#X text 96 1332 randomly produces a non-negative number below A ;
+#X obj 0 1364 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1364 op sqrt;
+#X text 96 1364 square root of A \, rounded downwards ;
+#X obj 0 1396 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1396 op sq-;
+#X text 96 1396 (A-B) times (A-B) ;
+#X obj 0 1428 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1428 op avg;
+#X text 96 1428 (A+B)/2 ;
+#X obj 0 1460 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1460 op hypot;
+#X text 96 1460 distance function: square root of (A*A+B*B) ;
+#X obj 0 1492 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1492 op clip+;
+#X text 96 1492 like A+B but overflow causes clipping instead of wrapping around (coming soon) ;
+#X obj 0 1524 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1524 op clip-;
+#X text 96 1524 like A-B but overflow causes clipping instead of wrapping around (coming soon) ;
+#X obj 0 1556 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1556 op erf*;
+#X text 96 1556 integral of e^(-x*x) dx ... (coming soon \; what ought to be the scaling factor?) ;
+#X obj 0 1588 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1588 op weight;
+#X text 96 1588 number of "1" bits in an integer;
+#X obj 0 1620 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1620 op sin;
+#X text 96 1620 sin(A-B) in radians \, float only;
+#X obj 0 1652 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1652 op cos;
+#X text 96 1652 cos(A-B) in radians \, float only;
+#X obj 0 1684 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1684 op atan2;
+#X text 96 1684 atan2(A \, B) in radians \, float only;
+#X obj 0 1716 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1716 op tanh;
+#X text 96 1716 tanh(A-B) in radians \, float only;
+#X obj 0 1748 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1748 op exp;
+#X text 96 1748 exp(A-B) in radians \, float only;
+#X obj 0 1780 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1780 op log;
+#X text 96 1780 log(A-B) in radians \, float only;
+#X obj 0 1832 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1832 op C.* ;
+#X text 96 1832 A*B;
+#X obj 0 1864 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1864 op C.*conj;
+#X text 96 1864 A*conj(B);
+#X obj 0 1896 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1896 op C./ ;
+#X text 96 1896 A/B;
+#X obj 0 1928 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1928 op C./conj;
+#X text 96 1928 A/conj(B);
+#X obj 0 1960 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 1960 op C.sq- ;
+#X text 96 1960 (A-B)*(A-B);
+#X obj 0 1992 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 1992 op C.abs- ;
+#X text 96 1992 abs(A-B);
+#X obj 0 2024 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 2024 op C.sin ;
+#X text 96 2024 sin(A-B);
+#X obj 0 2056 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 2056 op C.cos ;
+#X text 96 2056 cos(A-B);
+#X obj 0 2088 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 2088 op C.tanh ;
+#X text 96 2088 tanh(A-B);
+#X obj 0 2120 cnv 15 1024 30 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 2120 op C.exp ;
+#X text 96 2120 exp(A-B);
+#X obj 0 2152 cnv 15 1024 30 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 2152 op C.log ;
+#X text 96 2152 log(A-B);
+#X obj 10 2194 outlet;
+#X connect 6 0 245 0;
+#X connect 11 0 245 0;
+#X connect 16 0 245 0;
+#X connect 21 0 245 0;
+#X connect 26 0 245 0;
+#X connect 31 0 245 0;
+#X connect 36 0 245 0;
+#X connect 41 0 245 0;
+#X connect 46 0 245 0;
+#X connect 49 0 245 0;
+#X connect 52 0 245 0;
+#X connect 57 0 245 0;
+#X connect 60 0 245 0;
+#X connect 63 0 245 0;
+#X connect 66 0 245 0;
+#X connect 69 0 245 0;
+#X connect 72 0 245 0;
+#X connect 77 0 245 0;
+#X connect 82 0 245 0;
+#X connect 87 0 245 0;
+#X connect 92 0 245 0;
+#X connect 97 0 245 0;
+#X connect 100 0 245 0;
+#X connect 103 0 245 0;
+#X connect 108 0 245 0;
+#X connect 113 0 245 0;
+#X connect 116 0 245 0;
+#X connect 119 0 245 0;
+#X connect 122 0 245 0;
+#X connect 125 0 245 0;
+#X connect 128 0 245 0;
+#X connect 131 0 245 0;
+#X connect 134 0 245 0;
+#X connect 139 0 245 0;
+#X connect 144 0 245 0;
+#X connect 149 0 245 0;
+#X connect 154 0 245 0;
+#X connect 157 0 245 0;
+#X connect 161 0 245 0;
+#X connect 165 0 245 0;
+#X connect 168 0 245 0;
+#X connect 171 0 245 0;
+#X connect 174 0 245 0;
+#X connect 177 0 245 0;
+#X connect 180 0 245 0;
+#X connect 183 0 245 0;
+#X connect 186 0 245 0;
+#X connect 189 0 245 0;
+#X connect 192 0 245 0;
+#X connect 195 0 245 0;
+#X connect 198 0 245 0;
+#X connect 201 0 245 0;
+#X connect 204 0 245 0;
+#X connect 207 0 245 0;
+#X connect 210 0 245 0;
+#X connect 213 0 245 0;
+#X connect 216 0 245 0;
+#X connect 219 0 245 0;
+#X connect 222 0 245 0;
+#X connect 225 0 245 0;
+#X connect 228 0 245 0;
+#X connect 231 0 245 0;
+#X connect 234 0 245 0;
+#X connect 237 0 245 0;
+#X connect 240 0 245 0;
+#X connect 243 0 245 0;
+#X obj 95 0 cnv 0 0 2214 empty empty empty -1 12 0 14 0 -66577 0;
+#X obj 511 0 cnv 0 0 2214 empty empty empty -1 12 0 14 0 -66577 0;
+#X obj 767 0 cnv 0 0 2214 empty empty empty -1 12 0 14 0 -66577 0;
+#X obj 0 32 cnv 15 1024 18 empty empty empty 20 12 0 14 -248881 -66577 0;
+#X text 10 32 numops;
+#X obj 0 1812 cnv 15 1024 18 empty empty empty 20 12 0 14 -248881 -66577 0;
+#X text 10 1812 vecops for complex numbers;
+#X text 10 2214
+ note: a centidegree is 0.01 degree. There are 36000 centidegrees in a circle.
+ Some angle operators use centidegrees \, while some others use radians. To
+ convert degrees into centidegrees \, multiply by 100.
+ To convert degrees into radians \, divide by 57.2957 .
+ Thus \, to convert centidegrees into radians \, divide by 5729.57 .
+;
diff --git a/externals/gridflow/doc/numtype.pd b/externals/gridflow/doc/numtype.pd
new file mode 100644
index 00000000..ce1cdc2f
--- /dev/null
+++ b/externals/gridflow/doc/numtype.pd
@@ -0,0 +1,56 @@
+#N canvas 0 0 1024 768 10;
+#X obj 0 0 cnv 15 1024 30 empty empty empty 20 12 0 14 20 -66577 0;
+#X text 10 0 op names;
+#X text 192 0 range;
+#X text 384 0 precision;
+#X text 608 0 description;
+#X obj 0 32 cnv 15 1024 62 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 32 op b u8 uint8;
+#X text 192 32 0 to 255;
+#X text 384 32 1;
+#X text 608 32
+ unsigned 8-bit integer. this is the usual size of numbers taken from files and cameras \, and
+ written to files and to windows. (however #in converts to int32 unless otherwise specified.);
+#X obj 0 96 cnv 15 1024 62 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 96 op s i16 int16;
+#X text 192 96 -32768 to 32767;
+#X text 384 96 1;
+#X obj 0 160 cnv 15 1024 62 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 160 op i i32 int32;
+#X text 192 160 -(1<<31) to (1<<31)-1;
+#X text 384 160 1;
+#X text 608 160
+ signed 32-bit integer. this is used by default throughout GridFlow.
+;
+#X obj 0 224 cnv 15 1024 62 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 224 op l i64 int64;
+#X text 192 224 -(1<<63) to (1<<63)-1;
+#X text 384 224 1;
+#X obj 0 288 cnv 15 1024 62 empty empty empty 20 12 0 14 -249792 -66577 0;
+#X msg 10 288 op f f32 float32;
+#X text 192 288 -(1<<128) to (1<<128);
+#X text 384 288 23 bits or 0.000012%;
+#X obj 0 352 cnv 15 1024 62 empty empty empty 20 12 0 14 -233280 -66577 0;
+#X msg 10 352 op d f64 float64;
+#X text 192 352 -(1<<2048) to (1<<2048);
+#X text 384 352 52 bits or 0.000000000000022%;
+#X obj 191 0 cnv 0 0 416 empty empty empty -1 12 0 14 0 -66577 0;
+#X obj 383 0 cnv 0 0 416 empty empty empty -1 12 0 14 0 -66577 0;
+#X obj 607 0 cnv 0 0 416 empty empty empty -1 12 0 14 0 -66577 0;
+#X text 10 416 High-performance computation requires precise and quite peculiar
+ definitions of numbers and their representation.;
+#X text 10 476 Inside most programs \, numbers are written down as strings of
+ bits. A bit is either zero or one. Just like the decimal system
+ uses units \, tens \, hundreds \, the binary system uses units \, twos \,
+ fours \, eights \, sixteens \, and so on \, doubling every time.;
+#X text 10 536 One notation \, called integer allows for only integer values to be
+ written (no fractions). when it is unsigned \, no negative values may
+ be written. when it is signed \, one bit indicates whether the number
+ is positive or negative. Integer storage is usually fixed-size \, so you have
+ bounds on the size of numbers \, and if a result is too big it "wraps around" \, truncating the biggest
+ bits.;
+#X text 10 596 Another notation \, called floating point (or float) stores numbers using
+ a fixed number of significant digits \, and a scale factor that allows for huge numbers
+ and tiny fractions at once. Note that 1/3 has periodic digits \, but even 0.1 has periodic digits \,
+ in binary coding \; so expect some slight roundings \; the precision offered should be
+ sufficient for most purposes. Make sure the errors of rounding don't accumulate \, though.;
diff --git a/externals/gridflow/doc/reference.html b/externals/gridflow/doc/reference.html
new file mode 100644
index 00000000..82d8bf99
--- /dev/null
+++ b/externals/gridflow/doc/reference.html
@@ -0,0 +1,1114 @@
+<html><head>
+<!-- $Id: reference.html 3731 2008-06-02 14:30:25Z matju $ -->
+<title>GridFlow 0.9.3 - Reference Manual: Flow Classes</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="stylesheet" href="gridflow.css" type="text/css">
+</head>
+<body leftmargin="0" topmargin="0" style="background-color: rgb(255, 255, 255);" marginheight="0" marginwidth="0">
+<table width="100%" cellspacing="10"><tr><td>
+<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
+ <td> <img src="images/header1.png" alt="GridFlow" width="384" height="64"></td>
+ <td width="100%"><img src="images/header2.png" alt="GridFlow" width="100%" height="64"></td>
+ <td> <img src="images/header3.png" alt="GridFlow" width="32" height="64"></td>
+</table>
+</td></tr></table>
+<blockquote>
+
+<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
+
+<table width="100%" bgcolor="white" border="0" cellspacing="2">
+<tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" height="2" width="1"></td></tr>
+
+<tr><td colspan="4" height="16">
+ <h4>GridFlow 0.9.3 - Reference Manual: Flow Classes</h4>
+</td></tr>
+<tr>
+ <td width="5%" rowspan="2">&nbsp;</td>
+ <td width="15%" height="23">&nbsp;</td>
+ <td width="80%" height="23">&nbsp;</td>
+ <td width="5%" height="23">&nbsp;</td>
+</tr>
+<tr><td colspan="2"><div cols="3"><h4><a href="#Objects_for_making_grids_and_breaking_them_down">Objects for making grids and breaking them down</a></h4><ul>
+<li><a href="##import">#import
+</a></li>
+<li><a href="##export">#export
+</a></li>
+<li><a href="##export_list">#export_list
+</a></li>
+<li><a href="##export_symbol">#export_symbol
+</a></li>
+<li><a href="##pack">#pack
+</a></li>
+<li><a href="##color">#color
+</a></li>
+<li><a href="##unpack">#unpack
+</a></li>
+<li><a href="##centroid">#centroid
+</a></li>
+<li><a href="##for">#for
+</a></li>
+</ul>
+<h4><a href="#Objects_for_Computing">Objects for Computing</a></h4><ul>
+<li><a href="##">#
+</a></li>
+<li><a href="#@complex_sq">@complex_sq
+</a></li>
+<li><a href="##fold">#fold
+</a></li>
+<li><a href="##scan">#scan
+</a></li>
+<li><a href="##outer">#outer
+</a></li>
+<li><a href="##inner">#inner
+</a></li>
+<li><a href="#@join">@join
+</a></li>
+<li><a href="##finished">#finished
+</a></li>
+<li><a href="##cast">#cast
+</a></li>
+<li><a href="##ravel">#ravel
+</a></li>
+<li><a href="##grade">#grade
+</a></li>
+<li><a href="##perspective">#perspective
+</a></li>
+<li><a href="##transpose">#transpose
+</a></li>
+<li><a href="##fade">#fade
+</a></li>
+<li><a href="##fade_lin">#fade_lin
+</a></li>
+<li><a href="##reverse">#reverse
+</a></li>
+</ul>
+<h4><a href="#Objects_for_Coordinate_Transforms">Objects for Coordinate Transforms</a></h4><ul>
+<li><a href="##redim">#redim
+</a></li>
+<li><a href="##store">#store
+</a></li>
+<li><a href="##scale_to">#scale_to
+</a></li>
+<li><a href="##scale_by">#scale_by
+</a></li>
+<li><a href="##downscale_by">#downscale_by
+</a></li>
+<li><a href="##spread">#spread
+</a></li>
+<li><a href="##rotate">#rotate
+</a></li>
+<li><a href="##remap_image">#remap_image
+</a></li>
+</ul>
+<h4><a href="#Objects_for_Reporting">Objects for Reporting</a></h4><ul>
+<li><a href="##dim">#dim
+</a></li>
+<li><a href="##type">#type
+</a></li>
+<li><a href="##print">#print
+</a></li>
+<li><a href="#display">display
+</a></li>
+</ul>
+<h4><a href="#Objects_for_Color_Conversion">Objects for Color Conversion</a></h4><ul>
+<li><a href="##apply_colormap_channelwise">#apply_colormap_channelwise
+</a></li>
+<li><a href="##rgb_to_greyscale">#rgb_to_greyscale
+</a></li>
+<li><a href="##greyscale_to_rgb">#greyscale_to_rgb
+</a></li>
+<li><a href="##yuv_to_rgb">#yuv_to_rgb
+</a></li>
+<li><a href="##rgb_to_yuv">#rgb_to_yuv
+</a></li>
+</ul>
+<h4><a href="#Objects_for_Miscellaneous_Picture_Processing">Objects for Miscellaneous Picture Processing</a></h4><ul>
+<li><a href="##convolve">#convolve
+</a></li>
+<li><a href="##contrast">#contrast
+</a></li>
+<li><a href="##posterize">#posterize
+</a></li>
+<li><a href="##solarize">#solarize
+</a></li>
+<li><a href="##checkers">#checkers
+</a></li>
+<li><a href="##layer">#layer
+</a></li>
+<li><a href="##draw_image">#draw_image
+</a></li>
+<li><a href="##draw_polygon">#draw_polygon
+</a></li>
+<li><a href="##text_to_image">#text_to_image
+</a></li>
+<li><a href="##hueshift">#hueshift
+</a></li>
+</ul>
+<h4><a href="#Other_Objects">Other Objects</a></h4><ul>
+<li><a href="#rtmetro">rtmetro
+</a></li>
+<li><a href="#bindpatcher">bindpatcher
+</a></li>
+<li><a href="#pingpong">pingpong
+</a></li>
+<li><a href="##global">#global
+</a></li>
+<li><a href="#fps">fps
+</a></li>
+<li><a href="#unix_time">unix_time
+</a></li>
+<li><a href="#ls">ls
+</a></li>
+<li><a href="#exec">exec
+</a></li>
+<li><a href="#renamefile">renamefile
+</a></li>
+<li><a href="#plotter_control">plotter_control
+</a></li>
+<li><a href="#rubyarray">rubyarray
+</a></li>
+</ul>
+<h4><a href="#jMax_emulation">jMax emulation</a></h4><ul>
+<li><a href="#fork">fork
+</a></li>
+<li><a href="#foreach">foreach
+</a></li>
+<li><a href="#rubysprintf">rubysprintf
+</a></li>
+<li><a href="#listflatten">listflatten
+</a></li>
+<li><a href="#listmake">listmake
+</a></li>
+<li><a href="#listlength">listlength
+</a></li>
+<li><a href="#listelement">listelement
+</a></li>
+<li><a href="#listsublist">listsublist
+</a></li>
+<li><a href="#listprepend">listprepend
+</a></li>
+<li><a href="#listappend">listappend
+</a></li>
+<li><a href="#listreverse">listreverse
+</a></li>
+<li><a href="#oneshot">oneshot
+</a></li>
+<li><a href="#inv+">inv+
+</a></li>
+<li><a href="#inv*">inv*
+</a></li>
+<li><a href="#messageprepend">messageprepend
+</a></li>
+<li><a href="#messageappend">messageappend
+</a></li>
+<li><a href="#shunt">shunt
+</a></li>
+<li><a href="#demux">demux
+</a></li>
+<li><a href="#range">range
+</a></li>
+</ul>
+<br><br>
+</div></td></tr> <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="Objects_for_making_grids_and_breaking_them_down"></a><h4>Objects for making grids and breaking them down</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#import">#import</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>This object allows you to produce grids from non-grid data, such as
+ integers and lists of integers. This object also reframes/resyncs
+ grids so that multiple grids may be joined together, or
+ single grids may be split. That kind of operation is already done implicitly in many
+ cases (e.g. sending an integer or list to a grid-receiving inlet),
+ but using this object you have greater flexibility on the conversion.</p> <br><b>attr</b>&nbsp;shape <b>(</b><b><i>GridShape|symbol(per_message)</i> shape</b><b>)</b> <br><b>attr</b>&nbsp;cast <b>(</b><b><i>NumberType</i> cast</b><b>)</b> <br><b>method</b>&nbsp;init <b>(</b>shape<b>, </b>cast<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ begins a new grid if there is no current grid.
+ puts that integer in the current grid.
+ ends the grid if it is full.
+ the constructed grid is not stored: it is streamed.
+ the stream is buffered, so the output is in packets
+ of about a thousand numbers. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ just like a sequence of ints sent one after another,
+ except in a single message. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;symbol <b>(</b><b>)</b>
+ considered as a list of ascii characters. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;reset <b>(</b><b>)</b>
+ aborts the current grid if there is one. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ this is the equivalent of filtering this grid through
+ an <kbd><font color="#007777">[#export]</font></kbd> object and sending the resulting integers
+ to this <kbd><font color="#007777">[#import]</font></kbd> object, except that it's over
+ 10 times faster. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;per_message <b>(</b><b>)</b>
+ old synonym for "shape per_message" <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ the grid produced from incoming integers and/or grids. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#export">#export</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>this object is the opposite of #import.</p> <br><b>method</b>&nbsp;init <b>(</b><b>)</b>
+ this object is not configurable because there isn't
+ anything that could possibly be configured here. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ transforms this grid into a sequence of integer messages. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ elements of the incoming grid. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#export_list">#export_list</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>this object is another opposite of <kbd><font color="#007777">[#import]</font></kbd>, which puts
+ all of its values in a list.</p> <br><b>method</b>&nbsp;init <b>(</b><b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ transforms this grid into a single message containing
+ a list of integers. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ elements of the incoming grid. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#export_symbol">#export_symbol</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>this object is another opposite of #import, which constructs a symbol
+ from its input. The values are expected to be valid ASCII codes, but no check
+ will be performed for that, and additionally, no check will be made that the generated
+ symbol only contains characters that can be put in a symbol.</p> <br><b>method</b>&nbsp;init <b>(</b><b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ transforms this grid into a single message containing
+ a list of integers. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;symbol <b>(</b><b>)</b> generated symbol<br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#pack">#pack</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Similar to <kbd><font color="#007777">[#join]</font></kbd>, but takes individual integers, and builds a Dim(N) vector out of it. </p> <br><b>attr</b>&nbsp;trigger_by <b>(</b><b><i>TriggerBy</i> trigger_by</b><b>)</b> <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> inputs<b>)</b> <br>
+ <br><b>inlet&nbsp;* </b><b>method</b>&nbsp;int <b>(</b><b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><b>)</b>
+ combination of inputs given in all inlets.
+ this is produced according to the value of the trigger attribute. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#color">#color</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Triple slider for the selection of RGB values.</p> <br><b>method</b>&nbsp;init <b>(</b><i>float</i> min<b>, </b><i>float</i> max<b>, </b><i>0,1</i> hidepreview<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><b>)</b>
+ changes all three values (R,G,B). The grid must
+ be a Dim(3). <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;delegate <b>(</b><b>)</b>
+ sends the rest of the message to each of the three sliders.
+ this relies on the fact that [#color] is implemented using
+ three [hsl] and this might not still work in the far future. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><b>)</b>
+ Produces a Dim(3) grid of RGB values. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#unpack">#unpack</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> outputs<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid(N) <b>(</b><b>)</b>
+ the input vector is split in N parts containing one number each.
+ numbers are sent left-to-right, that is, outlet 0 is triggered first, then outlet 1, etc. <br>
+ <br><b>outlet&nbsp;* </b><b>method</b>&nbsp;int <b>(</b><b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#centroid">#centroid</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid(rows,columns,1) <b>(</b><b>)</b>
+ will compute the centroid of the given grid, which
+ is a weighted average, namely, the average position weighted
+ by the pixel values. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid(2) <b>(</b><b>)</b>
+ result <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#for">#for</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>when given scalar bounds, works like a regular <kbd><font color="#007777">[for]</font></kbd> object plugged
+ to a <kbd><font color="#007777">[#import]</font></kbd> tuned for a Dim(size) where size is the number of values
+ produced by a bang to that <kbd><font color="#007777">[for]</font></kbd>.</p> <p>when given vector bounds, will work like any number of [for] objects
+ producing all possible combinations of their values in the proper order.
+ This replaces the old <kbd><font color="#007777">[#identity_transform]</font></kbd> object.</p> <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> from<b>, </b><i>integer</i> to<b>, </b><i>integer</i> step<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(index)</i> grid<b>)</b>
+ replaces the "from" value and produces output. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(index)</i> grid<b>)</b>
+ replaces the "to" value. <br>
+ <br><b>inlet&nbsp;2 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(index_steps)</i> grid<b>)</b>
+ replaces the "step" value. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(size)</i> grid<b>)</b>
+ where size is floor((to-from+1)/step)
+ [for scalar bounds] <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(*size,dimension)</i> grid<b>)</b>
+ where *size is floor((to-from+1)/step)
+ [for vector bounds] <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="Objects_for_Computing"></a><h4>Objects for Computing</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#">#</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>attr</b>&nbsp;op <b>(</b><b><i>grid</i> op</b><b>)</b> <br><b>attr</b>&nbsp;right_hand <b>(</b><b><i>grid</i> right_hand</b><b>)</b> <p>This object outputs a grid by computing "in parallel" a same
+ operation on each left-hand element with its corresponding right-hand
+ element. </p> <br><b>method</b>&nbsp;init <b>(</b>op<b>, </b>right_hand<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ on each element of this grid, perform the operation
+ together with the corresponding element of inlet 1.
+ in the table of operators (at the top of this document)
+ elements of inlet 0 are called "A" and elements of inlet 1
+ are called "B". the resulting grid is the same size as the
+ one in inlet 0. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ any grid, preferably shaped like the one that will be put
+ in the left inlet, or like a subpart of it (anyway the contents
+ will be redim'ed on-the-fly to fit the grid of inlet-0,
+ but the stored grid will not be modified itself) <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ stores a single int in the right inlet; the same int will
+ be applied in all computations; this is like sending a
+ Dim(1) or Dim() grid with that number in it. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="@complex_sq">@complex_sq</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>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. (fun, eh?) </p> <p>used on an indexmap, this makes each thing appear twice,
+ each apparition spanning half of the original angle.</p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims... {imaginary real})</i> grid<b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims... {imaginary real})</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#fold">#fold</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p><ul> <li><b>1</b> : <kbd><font color="#007777">[#fold +]</font></kbd> computes totals</li> <li><b>2</b> : <kbd><font color="#007777">[#fold inv+]</font></kbd> is an alternated sum (+/-)</li> <li><b>3</b> : <kbd><font color="#007777">[#fold * 1]</font></kbd> can compute the size of a grid using its dimension list</li> <li><b>4</b> : <kbd><font color="#007777">[#fold &amp; 1]</font></kbd> can mean "for all"</li> <li><b>5</b> : <kbd><font color="#007777">[#fold | 0]</font></kbd> can mean "there exists (at least one)"</li> <li><b>6</b> : <kbd><font color="#007777">[#fold ^ 0]</font></kbd> can mean "there exists an odd number of..."</li> <li><b>7</b> : <kbd><font color="#007777">[#fold ^ 1]</font></kbd> can mean "there exists an even number of...".</li> </ul></p> <br><b>method</b>&nbsp;init <b>(</b><i>numop2</i> operator<b>, </b><i>grid</i> seed<b>, </b><i>grid</i> right_hand<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims..., last)</i> grid<b>)</b>
+ replaces every Dim(last) subgrid by the result of a cascade on that subgrid.
+ Doing that
+ with seed value 0 and operation + on grid "2 3 5 7" will compute
+ ((((0+2)+3)+5)+7) find the total "17".
+ produces a Dim(dims) grid. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#scan">#scan</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p><kbd><font color="#007777">[#scan +]</font></kbd> computes subtotals; this can be used, for example,
+ to convert a regular probability distribution into a cumulative one.
+ (or in general, discrete integration) </p> <br><b>method</b>&nbsp;init <b>(</b><i>numop2</i> operator<b>, </b><i>grid</i> seed<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims..., last)</i> grid<b>)</b>
+ replaces every Dim(last) subgrid by all the results of
+ cascading the operator on that subgrid,
+ producing a Dim(dims,last) grid.
+ For example, with base value 0 and operation + on grid "2 3 5
+ 7" will compute 0+2=2, 2+3=5, 5+5=10, 10+7=17, and give the
+ subtotals "2 5 10 17". <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#outer">#outer</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>numop2</i> operator<b>, </b><i>grid</i> value<b>)</b>
+ the operator must be picked from the table of two-input operators.
+ the grid is optional and corresponds to inlet 1. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(anyA...)</i> grid<b>)</b> <br>
+
+ produces a grid of size Dim(anyA..., anyB...), where numbers
+ are the results of the operation on every element of A and
+ every element of B. the resulting array can be very big. Don't
+ try this on two pictures (the result will have 6 dimensions) <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(anyB...)</i> grid<b>)</b> <br>
+
+ stores the specified grid, to be used when inlet 0 is activated. <p>When given a grid of Dim(3) and a grid of Dim(5) <kbd><font color="#007777">[#outer]</font></kbd> will
+ produce a grid of Dim(3,5) with the selected two-input operation
+ applied on each of the possible pairs combinations between numbers
+ from the left grid and the ones from the right. for example :
+ (10,20,30) [#outer +] (1,2,3) will give :
+ ((11,12,13),(21,22,23),(31,32,33)) </p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#inner">#inner</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>think of this one as a special combination of <kbd><font color="#007777">[#outer]</font></kbd>, <kbd><font color="#007777">[#]</font></kbd> and <kbd><font color="#007777">[#fold]</font></kbd>. this is one of the most complex operations. It is very useful
+ for performing linear transforms like rotations, scalings, shearings,
+ and some kinds of color remappings. A linear transform is done by
+ something called matrix multiplication, which happens to be <kbd><font color="#007777">[#inner * +
+ 0]</font></kbd>. <kbd><font color="#007777">[#inner]</font></kbd> also does dot product and other funny operations.</p> <br><b>method</b>&nbsp;init <b>(</b><i>grid</i> right_hand<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(anyA..., lastA)</i> grid<b>)</b>
+ Splits the Dim(anyA...,lastA) left-hand grid into Dim(anyA...)
+ pieces of Dim(lastA) size.
+ Splits the Dim(firstB,anyB...) right-hand grid into
+ Dim(anyB...) pieces of Dim(firstB) size.
+ On every piece pair, does <kbd><font color="#007777">[#]</font></kbd> using the specified
+ op_para operation, followed by a <kbd><font color="#007777">[#fold]</font></kbd> using
+ the specified op_fold operator and base value.
+ creates a Dim(anyA...,anyB...) grid by assembling all
+ the results together.
+ (note: lastA must be equal to firstB.) <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;op <b>(</b><i>numop</i> op<b>)</b>
+ the operation that combines the values from the two grids together.
+ this defaults to "*" (as in the matrix product) <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;fold <b>(</b><i>numop</i> op<b>)</b>
+ the operation that combines the result of the "op" operations together.
+ this defaults to "+" (as in the matrix product) <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ changes the base value to that. <br>
+ <br><b>inlet&nbsp;2 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(anyB..., lastB)</i> grid<b>)</b>
+ changes the right-hand side grid to that. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="@join">@join</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>which_dim<b>)</b>
+ Which_dim is the number of the dimension 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. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ The left grid and right grid must have the same number
+ of elements in all dimensions except the one specified.
+ The result will have the same number of elements in all
+ dimensions except the one specified, which will be the
+ sum of the two corresponding one. <p>For example, joining a RGB picture Dim[y,x,3] and a
+ greyscale picture Dim[y,x,1] on dimension 2 (or -1) could
+ make a RGBA picture Dim[y,x,4] in which the greyscale image
+ becomes the opacity channel. </p> <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#finished">#finished</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> any grid<br>
+
+ a bang is emitted every time a grid transmission ends. <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#cast">#cast</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>numbertype</i> numbertype<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> any grid<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> a grid of the same shape containing all the same
+ values after type conversion. note that while casting to
+ a smaller type, values that are overflowing will be truncated. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#ravel">#ravel</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> any grid<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ like <kbd><font color="#007777">[#redim]</font></kbd> but always produce a 1-D grid
+ with the same total number of elements. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#grade">#grade</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> any grid<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> <p>splits a Dim[A...,B] grid into Dim[B] vectors,
+ producing new 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.</p> <p>for example, connecting a [#grade] to a <kbd><font color="#007777">[#outer ignore {0}]</font></kbd>
+ to a <kbd><font color="#007777">[#store]</font></kbd> object, storing a single vector into <kbd><font color="#007777">[#store]</font></kbd>, and
+ sending the same vector to <kbd><font color="#007777">[#grade]</font></kbd>, will sort the values of the
+ vector. however for higher-dimensional grids, what should go
+ between <kbd><font color="#007777">[#store]</font></kbd> and <kbd><font color="#007777">[#grade]</font></kbd> to achieve the same result would
+ be more complex.</p> <p>you may achieve different kinds of sorting by applying various
+ filters before <kbd><font color="#007777">[#grade]</font></kbd>. the possibilities are unlimited.</p> <p>if you plug <kbd><font color="#007777">[#grade]</font></kbd> directly into another <kbd><font color="#007777">[#grade]</font></kbd>, you will
+ get the inverse arrangement, which allows to take the sorted values
+ and make them unsorted in the original way. note that this is really
+ not the same as just listing the values backwards.</p> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#perspective">#perspective</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> depth<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> any grid<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> <p>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 "depth" parameter. Each vector's
+ length is adjusted so that it lies onto that plane. Then the
+ last dimension of each vector is dropped.</p> <p>useful for converting from 3-D geometry to 2-D geometry. Also
+ useful for converting homogeneous 3-D into regular 3-D, as
+ homogeneous 3-D is really just regular 4-D...(!)</p> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#transpose">#transpose</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> dim1<b>, </b><i>integer</i> dim2<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ swaps the two specified dimensions; dimension numbers are as in <kbd><font color="#007777">[#join]</font></kbd>. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#fade">#fade</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> rate<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ produces on outlet 0 a linear recurrent fading according to the flow of
+ incoming messages. For example, if rate=5, then 20% (one fifth)
+ of each new message will be blended with 80% of the previous output. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#fade_lin">#fade_lin</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>integer</i> maxraise<b>, </b><i>integer</i> maxdrop<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ produces on outlet 0 a piecewise-linear nonrecurrent fading according to the flow of
+ incoming messages. For example, if maxraise=2 and maxdrop=4, then with each
+ new message an output is produced that is at most 2 more or 4 less than the
+ previous output. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#reverse">#reverse</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>whichdim<b>)</b>
+ Whichdim is the number of the dimension by which the reverse 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. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="Objects_for_Coordinate_Transforms"></a><h4>Objects for Coordinate Transforms</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#redim">#redim</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>dim_list</i> dims<b>)</b>
+ a list specifying a grid shape that the numbers
+ will fit into.
+ (same as with <kbd><font color="#007777">[#import]</font></kbd>) <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ the elements of this grid are serialized. if the resulting grid
+ must be larger, the sequence is repeated as much as necessary.
+ if the resulting grid must be smaller, the sequence is truncated.
+ then the elements are deserialized to form the resulting grid. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rank)</i> grid<b>)</b>
+ this grid is a dimension list that replaces the one
+ specified in the constructor.
+ (same as with <kbd><font color="#007777">[#import]</font></kbd>) <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b>
+ redimensioned grid potentially containing repeating data. <br>
+ <p>example: with a 240 320 RGB image, <kbd><font color="#007777">[#redim 120 640 3]</font></kbd> will visually
+ separate the even lines (left) from the odd lines (right). contrary
+ to this, <kbd><font color="#007777">[#redim 640 120 3]</font></kbd> will split every line and put its left half
+ on a even line and the right half on the following odd line. <kbd><font color="#007777">[#redim]</font></kbd>
+ 480 320 3 will repeat the input image twice in the output image. <kbd><font color="#007777">[#redim]</font></kbd> 240 50 3 will only keep the 50 top lines.</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#store">#store</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>A <kbd><font color="#007777">[#store]</font></kbd> object can store exactly one grid, using the right
+ inlet. You fetch it back, or selected subparts thereof, using the left
+ inlet.</p> <br><b>method</b>&nbsp;init <b>(</b><i>grid</i> contents<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;bang <b>(</b><b>)</b>
+ the stored grid is fully sent to the outlet. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims..., indices)</i> grid<b>)</b>
+ in this grid, the last dimension refers to subparts of
+ the stored grid. sending a Dim(200,200,2) on a <kbd><font color="#007777">[#store]</font></kbd>
+ that holds a Dim(240,320,3) will cause the <kbd><font color="#007777">[#store]</font></kbd> to handle
+ the incoming grid as a Dim(200,200) of Dim(2)'s, where each
+ Dim(2) represents a position in a Dim(240,320) of Dim(3)'s.
+ therefore the resulting grid will be a Dim(200,200) of
+ Dim(3) which is a Dim(200,200,3). in practice this example
+ would be used for generating a 200*200 RGB picture from a
+ 200*200 XY map and a 240*320 RGB picture. this object can
+ be logically used in the same way for many purposes
+ including color palettes, tables of probabilities, tables
+ of statistics, whole animations, etc. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ replace the whole grid, or a subpart of it (see other options on inlet 1) <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;reassign <b>(</b><b>)</b> (Future Use):
+ makes it so that sending a grid to inlet 1 detaches the old buffer from [#store]
+ and attaches a new one instead. This is the default. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;put_at <b>(</b>indices...<b>)</b> (Future Use):
+ makes it so that sending a grid to inlet 1 writes into the existing buffer of [#store]. <p>
+ example: suppose you have <kbd><font color="#007777">[#store {10 240 320 3}]</font></kbd>. then "put_at 3"
+ will allow to write a Dim[240,320,3] grid in indices (3,y,x,c) where y,x,c are indices of the incoming grid;
+ in other words, if that's a buffer of 10 RGB frames, you'd be replacing frame #3. Furthermore,
+ it also allows you to write a Dim[n,240,320,3] grid at (3+f,y,x,c) where f,y,x,c are indices of the incoming grid,
+ replacing frame #3, #4, ... up to #3+n-1. Here n is at most 7 because the last frame in the buffer is #9. </p> <p>that way of working extends to other kinds of data you'd put in Grids, in any numbers of dimensions;
+ because, as usual, [#store] wouldn't know the difference. </p> <br>
+
+ grids as stored, as indexed, or as assembled from multiple
+ indexings. <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#scale_to">#scale_to</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>size<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> a 3-channel picture to be scaled.<br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b> a {height width} pair.<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> a scaled 3-channel picture.<br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#scale_by">#scale_by</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>grid dim() or dim(2)</i> factor<b>)</b>
+ factor is optional (default is 2).
+ if it's a single value, then that factor is to be used
+ for both rows and columns. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x channels)</i> grid<b>)</b>
+ duplicates each pixel several times in width and several times in height,
+ where the number of times is determined by the factor described above.
+ twice those of the incoming grid. It is several times faster. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(1 or 2)</i> grid<b>)</b> sets factor<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid((factor*y) (factor*x) channels)</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#downscale_by">#downscale_by</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>+integer</i> factor<b>, </b><i>optional symbol(smoothly)</i> how<b>)</b>
+ factor is optional (default is 2).
+ if it's a single value, then that factor is to be used
+ for both rows and columns. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x channels)</i> grid<b>)</b>
+ Scales down picture by specified amount. (See scale factor above) <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(1 or 2)</i> grid<b>)</b> sets scale factor<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid((factor/y) (factor/x) channels)</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#spread">#spread</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>typically you plug a <kbd><font color="#007777">[#for]</font></kbd> into this object,
+ and you plug this object into the left side of a <kbd><font color="#007777">[#store]</font></kbd>. it will
+ scatter pixels around, giving an "unpolished glass" effect.</p> <p>if you put a picture in it, however, it will add noise. The
+ resulting values may be out of range, so you may need to clip them
+ using min/max.</p> <br><b>method</b>&nbsp;init <b>(</b>factor<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> a coordinate map.<br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b> a spread factor.<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid</i> grid<b>)</b> a coordinate map.<br>
+ <p><kbd><font color="#007777">[#spread]</font></kbd> scatters the pixels in an image. Not all original pixels
+ will appear, and some may get duplicated (triplicated, etc)
+ randomly. Some wrap-around effect will occur close to the edges. </p> <p> Sending an integer to inlet 1 sets the amount of spreading in
+ maximum number of pixels + 1. even values translate the whole image
+ by half a pixel due to rounding.</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#rotate">#rotate</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>performs rotations on indexmaps and polygons and such.</p> <br><b>method</b>&nbsp;init <b>(</b><i>0...35999</i> angle<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(anyA 2)</i> grid<b>)</b> <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b> rotation angle; 0...36000<br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(anyA 2)</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#remap_image">#remap_image</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>if you chain indexmap (coordinate) transformations from outlet 1
+ to inlet 1, then sending an image in inlet 0 will emit its
+ deformation out of outlet 0.</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="Objects_for_Reporting"></a><h4>Objects for Reporting</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#dim">#dim</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Returns list of dimensions as a grid. Given a grid sized like Dim(240,320,4), <kbd><font color="#007777">[#dim]</font></kbd> will return a grid like Dim(3), whose values are 240, 320, 4. </p> <br><b>method</b>&nbsp;init <b>(</b><b>)</b>
+ no arguments. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ ignores any data contained within.
+ sends a grid dim(length of dims) containing dims. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rank)</i> grid<b>)</b>
+ the list of dimensions of the incoming grid. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#type">#type</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>gives a symbol representing the numeric type of the grid received. </p> <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;&lt;numeric type symbol&gt; <b>(</b><b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#print">#print</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(dims...)</i> grid<b>)</b>
+ prints the dimensions of the grid.
+ prints all the grid data if there are 2 dimensions or less. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="display">display</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ GUI object equivalent to [print] and [#print]. <br><b>method</b>&nbsp;(any) <b>(</b><b>)</b>
+ Displays the received message in the box, resizing the box so that the message fits exactly. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="Objects_for_Color_Conversion"></a><h4>Objects for Color Conversion</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#apply_colormap_channelwise">#apply_colormap_channelwise</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>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. You may also color-correct
+ colormaps themselves.</p> <p>Only works for things that have 3 channels.</p> <p>Note: if you just need to apply a palette on an indexed-color
+ picture, you don't need this. Just use #store instead.</p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns channels)</i> grid<b>)</b>
+ picture <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(intensities channels)</i> grid<b>)</b>
+ colormap ("palette") <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns channels)</i> grid<b>)</b>
+ picture <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#rgb_to_greyscale">#rgb_to_greyscale</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {red green blue})</i> grid<b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {white})</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#greyscale_to_rgb">#greyscale_to_rgb</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {white})</i> grid<b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {red green blue})</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#yuv_to_rgb">#yuv_to_rgb</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>note: may change slightly to adapt to actual video standards.</p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {y u v})</i> grid<b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {red green blue})</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#rgb_to_yuv">#rgb_to_yuv</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>note: may change slightly to adapt to actual video standards.</p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {red green blue})</i> grid<b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns {y u v})</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="Objects_for_Miscellaneous_Picture_Processing"></a><h4>Objects for Miscellaneous Picture Processing</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#convolve">#convolve</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>this is the object for blurring, sharpening, finding edges,
+ embossing, cellular automata, and many other uses.</p> <br><b>method</b>&nbsp;init <b>(</b><i>numop2</i> op_para<b>, </b><i>numop2</i> op_fold<b>, </b><i>grid</i> seed<b>, </b><i>grid</i> right_hand<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns rest...)</i> grid<b>)</b>
+ splits the incoming grid into dim(rest...) parts.
+ for each of those parts at (y,x), a rectangle of such
+ parts, centered around (y,x), is combined with the
+ convolution grid like a <kbd><font color="#007777">[#]</font></kbd> of operation op_para. Then
+ each such result is folded like <kbd><font color="#007777">[#fold]</font></kbd> 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. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows2 columns2)</i> grid<b>)</b>
+ this is the convolution grid and it gets stored in
+ the object. if rows2 and/or columns2 are odd numbers,
+ then the centre of convolution is the middle of the convolution
+ grid. if they are even numbers, then the chosen centre will
+ be slightly more to the left and/or to the top, because the
+ actual middle is between cells of the grid. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns rest...)</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#contrast">#contrast</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>iwhiteness<b>, </b>contrast<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns channels)</i> grid<b>)</b>
+ produces a grid like the incoming grid but with
+ different constrast. <br>
+ <p><kbd><font color="#007777">[#contrast]</font></kbd> adjusts the intensity in an image.
+ resulting values outside 0-255 are automatically clipped.</p> <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ this is the secondary contrast (inverse whiteness).
+ it makes the incoming black
+ correspond to a certain fraction between output black and the
+ master contrast value. no effect is 256. default value is 256. <br>
+ <br><b>inlet&nbsp;2 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ this is the master contrast. it makes the incoming white
+ correspond to a certain fraction between output black and output
+ white. no effect is 256. default value is 256. <br>
+ <br><b>outlet&nbsp; </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns channels)</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#posterize">#posterize</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p><kbd><font color="#007777">[#posterize]</font></kbd> 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.</p> <br><b>method</b>&nbsp;init <b>(</b>levels<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns channels)</i> grid<b>)</b>
+ produces a posterized picture from the input picture. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><b>)</b>
+ this is the 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 2. <br>
+ <p>example: simulate the 216-color "web" palette using 6 levels.
+ simulate a 15-bit display using 32 levels.</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#solarize">#solarize</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>makes medium intensities brightest; formerly brightest colours
+ become darkest; formerly darkest stays darkest. This filter is linear:
+ it's like a 200% contrast except that overflows are <i>mirrored</i>
+ instead of clipped or wrapped.</p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns channels)</i> grid<b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(rows columns channels)</i> grid<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#checkers">#checkers</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x {y x})</i> grid<b>)</b>
+ result from a <kbd><font color="#007777">[#for {0 0} {height width} {1 1}]</font></kbd> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x {r g b})</i> grid<b>)</b>
+ checkered pattern of 50%/75% greys
+ in 8x8 squares <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#layer">#layer</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x {r g b a})</i> grid<b>)</b>
+ a picture that has an opacity channel.
+ will be used as foreground. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x {r g b})</i> grid<b>)</b>
+ a picture that has NO opacity channel.
+ will be used as background. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x {r g b})</i> grid<b>)</b>
+ a picture that has NO opacity channel.
+ the opacity channel of the foreground is used as
+ a weighting of how much of either picture is seen
+ in the result. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#draw_image">#draw_image</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>numop2</i> operator<b>, </b><i>grid(y,x,channels)</i> picture<b>, </b><i>grid({y x})</i> position<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x channels)</i> grid<b>)</b>
+ picture onto which another picture will be superimposed. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;tile <b>(</b><i>0 or 1</i> flag<b>)</b>
+ if enabled, inlet 1 picture will be repeated to cover the inlet 0 picture. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;alpha <b>(</b><i>0 or 1</i> flag<b>)</b>
+ if enabled, inlet 1 picture will be combined with inlet 0 picture using
+ the selected operator,
+ and then blended with inlet 0 picture according to transparency of
+ the inlet 1 picture, and then inserted in the result.
+ if disabled, the blending doesn't occur, as the transparency level
+ is considered to be "opaque". note that with alpha enabled,
+ the last channel of inlet 1 picture is considered to represent transparency. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x channels)</i> grid<b>)</b>
+ picture that will be superimposed onto another picture. <br>
+ <br><b>inlet&nbsp;2 </b><b>method</b>&nbsp;grid <b>(</b><i>grid({y x})</i> grid<b>)</b>
+ position of the inlet 0 picture corresponding to top-left corner
+ of inlet 1 picture. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x channels)</i> grid<b>)</b>
+ resulting picture. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#draw_polygon">#draw_polygon</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>numop2</i> operator<b>, </b><i>grid(channels)</i> color<b>, </b><i>grid(vertices,{y x})</i> vertices<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x channels)</i> grid<b>)</b>
+ picture on which the polygon will be superimposed. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(channels)</i> grid<b>)</b>
+ color of each pixel <br>
+ <br><b>inlet&nbsp;2 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(vertices {y x})</i> grid<b>)</b>
+ vertices of the polygon. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;grid <b>(</b><i>grid(y x channels)</i> grid<b>)</b>
+ modified picture.
+ note: starting with 0.7.2, drawing a 1-by-1
+ square really generates a 1-by-1 square, and
+ so on. This is because the right-hand border of a
+ polygon is excluded, whereas it was included
+ before, leading to slightly-wider-than-expected polygons. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#text_to_image">#text_to_image</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>inlet 2 receives a font grid, for example, [#in grid file lucida-typewriter-12.grid.gz]</p> <p>inlet 1 receives a 2 by 3 matrix representing the colours to use (e.g. (2 3 # 0 170 0 255 255 0) means yellow on green)</p> <p>inlet 0 receives a bang, transforming the data into an image suitable for #draw_image.</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#hueshift">#hueshift</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>inlet 1 receives an angle (0..36000)</p> <p>inlet 0 receives a RGB picture that gets hueshifted by a rotation in the colorwheel by the specified angle; it gets sent to outlet 0.</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="Other_Objects"></a><h4>Other Objects</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="rtmetro">rtmetro</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+This class has been removed (0.7.7).<br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="bindpatcher">bindpatcher</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>sets the receive-symbol for the Pd patcher it is in.</p> <p>has no inlets, no outlets.</p> <p>EXPERIMENTAL.</p> <br><b>method</b>&nbsp;init <b>(</b><i>symbol</i> symbol<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="pingpong">pingpong</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ Transforms linear counting (0, 1, 2, 3, 4, ...) into a back-and-forth counting (0, 1, 2, 1, 0, ...)
+ from 0 to a specified upper bound. <br><b>method</b>&nbsp;init <b>(</b><i>int</i> top<b>)</b> <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;float <b>(</b><i>float</i> top<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;float <b>(</b><b>)</b>
+ a value to be transformed.
+ If, for example, top=10, then values 0 thru 10 are left unchanged,
+ values 11 thru 19 are mapped to 9 thru 1 respectively, and 20 thru 30
+ are mapped to 0 thru 10, and so on. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="#global">#global</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ objects of this class do nothing by themselves and are just
+ an access point to features that don't belong to any object in
+ particular. </p> <br><b>method</b>&nbsp;profiler_reset <b>(</b><b>)</b>
+ resets all the time counters. <br>
+ <br><b>method</b>&nbsp;profiler_dump <b>(</b><b>)</b>
+ displays the time counters in decreasing order, with
+ the names of the classes those objects are in. this is
+ an experimental feature. like most statistics,
+ it could be vaguely relied upon if
+ only you knew to which extent it is unreliable. more on this
+ in a future section called "profiling". <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="fps">fps</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>symbol(real|user|system|cpu)</i> clocktype<b>, </b><i>symbol(detailed)</i> detailed<b>)</b> <br>
+ <br><b>method</b>&nbsp;init detailed <b>(</b><b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;bang <b>(</b><b>)</b>
+ Times at which bangs are received are stored until a large
+ enough sample of those is accumulated. Large enough is defined
+ to be whenever the timespan exceeds one second. Then a report
+ is made through the outlet. <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;(else) <b>(</b><b>)</b>
+ messages other than bangs are ignored. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;float <b>(</b><b>)</b>
+ non-detailed mode only.
+ this is the messages-per-second rating. <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;list(float,6) <b>(</b><b>)</b>
+ detailed mode only.
+ this is: messages-per-second, followed by five values of
+ milliseconds-per-message: minimum, median, maximum, average,
+ standard deviation.
+ (the average happens to be simply 1000 divided by the
+ messages-per-second, but it is convenient to have it anyway) <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="unix_time">unix_time</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ This object returns the Unix timestamp. The first
+ outlet does so with ASCII, the second in seconds and the third outlet
+ outputs the fractions of seconds up to 1/100 000 th of a second which is useful for creating
+ filenames. </p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;bang <b>(</b><b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;symbol <b>(</b><b>)</b> <br>
+Outputs the time and date in ASCII format <br><b>outlet&nbsp;1 </b><b>method</b>&nbsp;float <b>(</b><b>)</b> <br>
+Outputs the Unix timestamp in seconds <br><b>outlet&nbsp;2 </b><b>method</b>&nbsp;float <b>(</b><b>)</b> <br>
+Outputs the fractions of a second up to 10 microseconds (?) (actual precision is platform-dependent afaik) <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="ls">ls</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ This object is similar to the Unix list command
+ 'ls'. It returns the names of files in a given
+ directory. May be used with [listlength] to retrieve the number of files.
+ Hidden files are displayed. </p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;symbol <b>(</b><b>)</b>
+ lists all files in a given directory <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;glob <b>(</b><b>)</b>
+ lists all files matching a given pattern.
+ "symbol hello" is like "glob hello/*" <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="exec">exec</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ This object launches a Unix shell program or script. </p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;symbol <b>(</b><b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="renamefile">renamefile</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ This object accepts a list of two elements as arguments.
+ The current file name being the first and the second is the desired change
+ in name. </p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b><b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="plotter_control">plotter_control</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>
+ This object produces HPGL instructions in ASCII form
+ that can be sent to the comport object in order to control an HPGL
+ compatible plotter. </p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;symbol <b>(</b><b>)</b> <br>
+ <br><b>outlet&nbsp;0 </b><b>method</b>&nbsp;symbol <b>(</b><b>)</b> <br>
+Outputs the HPGL commands in ASCII format <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="rubyarray">rubyarray</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>inlet 0 float : sends the specified array entry to outlet 0</p> <p>inlet 1 list: writes that list as an array entry in position last specified by inlet 0.</p> <p>inlet 0 save(symbol filename): writes the array contents to a file of the given filename as a CSV</p> <p>inlet 0 save(symbol filename, symbol format): same thing but using a sprintf string such as %x,%f or whatever</p> <p>inlet 0 load(symbol filename): replace all array contents by the contents of a CSV file</p> <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <tr><td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4"><a name="jMax_emulation"></a><h4>jMax emulation</h4></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td></td><td></td><td><p>those classes emulate jMax functionality,
+ for use within PureData and Ruby.</p></td></tr>
+<tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="fork">fork</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <p>Every incoming message is sent to inlet 1 and then sent to
+ inlet 0 as well. Messages remain completely unaltered. Contrast
+ with PureData's "t a a" objects, which have the same purpose but
+ transform bangs into zeros and such.</p> <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;(any) <b>(</b><b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="foreach">foreach</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b>...<b>)</b>
+ Outputs N messages, one per list element, in order. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="rubysprintf">rubysprintf</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>symbol</i> format<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ Outputs the format string with %-codes replaced
+ by elements of the list formatted as the %-codes say.
+ To get a list of those codes, consult a Ruby manual
+ (Equivalently, Perl, Python, Tcl and C all have equivalents of this,
+ and it's almost always called sprintf, or the % operator, or both) <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listflatten">listflatten</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b>...<b>)</b> <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listmake">listmake</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ Emulation of jMax's [list] (but there cannot be a class named [list] in Pd) <br><b>method</b>&nbsp;init <b>(</b>list...<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;bang <b>(</b><b>)</b> send "list" to outlet 0<br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b><b>)</b> as sending to inlet 1 and then banging; that is, passes thru and remembers.<br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listlength">listlength</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b><b>)</b>
+ outputs the number of elements in the incoming list. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listelement">listelement</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>int</i> index<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b>...<b>)</b>
+ Outputs one element of the list, as selected by "index".
+ Also accepts negative indices (e.g.: -1 means "last"), like Ruby, but unlike jMax. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listsublist">listsublist</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>int</i> index<b>, </b><i>int</i> length<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b>...<b>)</b>
+ Outputs consecutive elements of the list, as selected by "index" and "length".
+ Also accepts negative indices (e.g.: -1 means "last"), like Ruby, but unlike jMax. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listprepend">listprepend</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>list...<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b>...<b>)</b>
+ Outputs the stored list followed by the incoming list, all in one message. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listappend">listappend</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>list...<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b>...<b>)</b>
+ Outputs the incoming list followed by the stored list, all in one message. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="listreverse">listreverse</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;list <b>(</b>...<b>)</b>
+ Outputs the incoming list, from last element to first element. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="oneshot">oneshot</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ Like [spigot], but turns itself off after each message, so you have to turn it on
+ again to making it pass another message. <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="inv+">inv+</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>float</i> b<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;float <b>(</b><i>float</i> a<b>)</b>
+ outputs b-a <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="inv*">inv*</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b><i>float</i> b<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;float <b>(</b><i>float</i> a<b>)</b>
+ outputs b/a <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="messageprepend">messageprepend</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ (This is not in jMax, but is there to help port $* messageboxes) <br><b>method</b>&nbsp;init <b>(</b>list...<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;&lt;any&gt; <b>(</b>...<b>)</b>
+ Like [listprepend], but operates on whole messages, that is, including the selector. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="messageappend">messageappend</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ (This is not in jMax, but is there to help port $* messageboxes) <br><b>method</b>&nbsp;init <b>(</b>list...<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;&lt;any&gt; <b>(</b>...<b>)</b>
+ Like [listappend], but operates on whole messages, that is, including the selector. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="shunt">shunt</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ Compatible with jMax's [demux]. <br><b>method</b>&nbsp;init <b>(</b>n<b>, </b>i<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;&lt;any&gt; <b>(</b>...<b>)</b>
+ Routes a message to the active outlet. <br>
+ <br><b>inlet&nbsp;1 </b><b>method</b>&nbsp;int <b>(</b><i>int</i> i<b>)</b>
+ Selects which outlet is active. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="demux">demux</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+
+ please use shunt instead (name conflict with another Pd external) <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td colspan="4" bgcolor="#ffb080"><b>&nbsp;&nbsp;class </b><a name="range">range</a></td></tr><tr><td></td><td valign="top"><br>
+<br clear="left"><br><br><br clear="left"><br></td><td><br>
+ <br><b>method</b>&nbsp;init <b>(</b>separators...<b>)</b> <br>
+ <br><b>inlet&nbsp;0 </b><b>method</b>&nbsp;float <b>(</b><b>)</b>
+ a value to be sent to one of the outlets. The first outlet is for values
+ smaller than the first argument; else the second outlet is for values smaller
+ than the second argument; and so on; and the last outlet is for values greater
+ or equal to the last argument. <br>
+ <br><b>inlet&nbsp;1..n </b><b>method</b>&nbsp;float <b>(</b><b>)</b>
+ sets the corresponding separator in the separator list. <br>
+ <br></td></tr><tr><td></td><td></td><td> </td></tr>
+<tr><td>&nbsp;</td></tr>
+ <td colspan="4" bgcolor="black">
+<img src="images/black.png" width="1" height="2"></td></tr>
+<tr><td colspan="4">
+<p><font size="-1">
+GridFlow 0.9.3 Documentation<br>
+Copyright &copy; 2001-2006 by Mathieu Bouchard
+<a href="mailto:matju@artengine.ca">matju@artengine.ca</a>
+</font></p>
+</td></tr></table></body></html>
+
+
diff --git a/externals/gridflow/doc/reference.xml b/externals/gridflow/doc/reference.xml
new file mode 100644
index 00000000..339862d4
--- /dev/null
+++ b/externals/gridflow/doc/reference.xml
@@ -0,0 +1,1329 @@
+<?xml version="1.0" standalone="no" ?>
+<!DOCTYPE documentation SYSTEM 'gridflow.dtd'>
+<documentation title="Reference Manual: Flow Classes" indexcols="3">
+<!-- $Id: reference.xml 3897 2008-06-17 20:58:38Z alx1 $ -->
+<!--
+ GridFlow Reference Manual: Class Reference
+ Copyright (c) 2001-2007
+ by Mathieu Bouchard and Alexandre Castonguay
+-->
+
+<section name="Objects for making grids and breaking them down">
+
+ <class name="#to_float,#export">
+ <p>this object is the opposite of #import.</p>
+ <method name="init">
+ this object is not configurable because there isn't
+ anything that could possibly be configured here.
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ transforms this grid into a sequence of integer messages.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="int">
+ elements of the incoming grid.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#to_list,#export_list">
+ <p>this object is another opposite of <k>[#import]</k>, which puts
+ all of its values in a list.</p>
+ <method name="init" />
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ transforms this grid into a single message containing
+ a list of integers.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="list">
+ elements of the incoming grid.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#to_symbol,#export_symbol">
+ <p>this object is another opposite of #import, which constructs a symbol
+ from its input. The values are expected to be valid ASCII codes, but no check
+ will be performed for that, and additionally, no check will be made that the generated
+ symbol only contains characters that can be put in a symbol.</p>
+ <method name="init" />
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ transforms this grid into a single message containing
+ a list of integers.
+ </method>
+ </inlet>
+ <outlet id="0"><method name="symbol">generated symbol</method></outlet>
+ </class>
+
+ <class name="#pack">
+ <p>Similar to <k>[#join]</k>, but takes individual integers, and builds a Dim(N) vector out of it.
+ </p>
+
+ <attr name="trigger_by" type="TriggerBy" default="any">
+ The value "any" (and the only available value for now) causes an output
+ to produced when an integer is received thru any inlet, contrary to most
+ other object classes, that only act upon reception of a value thru inlet 0.
+ </attr>
+
+ <method name="init">
+ <arg name="inputs" type="integer">how many inlets the object should have.</arg>
+ </method>
+ <inlet id="*"><method name="int"/></inlet>
+ <outlet id="0"><method name="grid">
+ combination of inputs given in all inlets.
+ this is produced according to the value of the trigger attribute.
+ </method></outlet>
+ </class>
+
+ <class name="#color">
+ <p>Triple slider for the selection of RGB values.</p>
+ <method name="init">
+ <arg name="min" type="float"></arg>
+ <arg name="max" type="float"></arg>
+ <arg name="hidepreview" type="0,1"></arg>
+ </method>
+ <inlet id="0"><method name="grid">
+ changes all three values (R,G,B). The grid must
+ be a Dim(3).
+ </method>
+ <method name="delegate">
+ sends the rest of the message to each of the three sliders.
+ this relies on the fact that [#color] is implemented using
+ three [hsl] and this might not still work in the far future.
+ </method></inlet>
+ <outlet id="0"><method name="grid">
+ Produces a Dim(3) grid of RGB values.
+ </method></outlet>
+ </class>
+
+ <class name="#unpack">
+ <method name="init">
+ <arg name="outputs" type="integer">
+ how many outlets the object should have.
+ (depending on the version of the software, the number of visible outlets
+ may have been frozen to 4. If it is so, then the value of this argument
+ must not exceed 4; and if it is below 4, then don't use the extraneous outlets.)
+ </arg>
+ </method>
+ <inlet id="0"><method name="grid(N)">
+ the input vector is split in N parts containing one number each.
+ numbers are sent left-to-right, that is, outlet 0 is triggered first, then outlet 1, etc.
+ </method></inlet>
+ <outlet id="*"><method name="int">
+ </method></outlet>
+ </class>
+
+ <class name="#centroid">
+ <method name="init"/>
+ <inlet id="0"><method name="grid(rows,columns,1)">
+ will compute the centroid of the given grid, which
+ is a weighted average, namely, the average position weighted
+ by the pixel values.
+ </method></inlet>
+ <outlet id="0">
+ <method name="grid(2)">
+ result
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#for">
+ <p>when given scalar bounds, works like a regular <k>[for]</k> object plugged
+ to a <k>[#import]</k> tuned for a Dim(size) where size is the number of values
+ produced by a bang to that <k>[for]</k>.</p>
+
+ <p>when given vector bounds, will work like any number of [for] objects
+ producing all possible combinations of their values in the proper order.
+ This replaces the old <k>[#identity_transform]</k> object.</p>
+
+ <method name="init">
+ <arg name="from" type="integer"/>
+ <arg name="to" type="integer"/>
+ <arg name="step" type="integer"/>
+ </method>
+ <inlet id="0"><method name="grid"><arg name="grid" type="grid(index)"/>
+ replaces the "from" value and produces output.
+ </method></inlet>
+ <inlet id="1"><method name="grid"><arg name="grid" type="grid(index)"/>
+ replaces the "to" value.
+ </method></inlet>
+ <inlet id="2"><method name="grid"><arg name="grid" type="grid(index_steps)"/>
+ replaces the "step" value.
+ </method></inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid(size)"/>
+ where size is floor((to-from+1)/step)
+ [for scalar bounds]
+ </method>
+ <method name="grid"><arg name="grid" type="grid(*size,dimension)"/>
+ where *size is floor((to-from+1)/step)
+ [for vector bounds]
+ </method>
+ </outlet>
+ </class>
+</section>
+
+<section name="Objects for Computing">
+ <class name="#">
+ <attr name="op" type="grid"/>
+ <attr name="right_hand" type="grid" default="0">
+
+ </attr>
+
+ <p>This object outputs a grid by computing "in parallel" a same
+ operation on each left-hand element with its corresponding right-hand
+ element.
+ </p>
+
+ <method name="init">
+ <arg name="op" isattr="yes"/>
+ <arg name="right_hand" isattr="yes"/>
+ </method>
+
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ on each element of this grid, perform the operation
+ together with the corresponding element of inlet 1.
+ in the table of operators (at the top of this document)
+ elements of inlet 0 are called "A" and elements of inlet 1
+ are called "B". the resulting grid is the same size as the
+ one in inlet 0.
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ any grid, preferably shaped like the one that will be put
+ in the left inlet, or like a subpart of it (anyway the contents
+ will be redim'ed on-the-fly to fit the grid of inlet-0,
+ but the stored grid will not be modified itself)
+ </method>
+ <method name="int">
+ stores a single int in the right inlet; the same int will
+ be applied in all computations; this is like sending a
+ Dim(1) or Dim() grid with that number in it.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>
+ </method>
+ </outlet>
+
+ </class>
+
+ <class name="@complex_sq">
+ <p>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. (fun, eh?)
+ </p>
+ <p>used on an indexmap, this makes each thing appear twice,
+ each apparition spanning half of the original angle.</p>
+ <inlet id="0"><method name="grid">
+ <arg name="grid" type="grid(dims... {imaginary real})"/>
+ </method></inlet>
+ <outlet id="0"><method name="grid">
+ <arg name="grid" type="grid(dims... {imaginary real})"/>
+ </method></outlet>
+ </class>
+
+ <class name="#fold">
+ <p><list>
+ <li><k>[#fold +]</k> computes totals</li>
+ <li><k>[#fold inv+]</k> is an alternated sum (+/-)</li>
+ <li><k>[#fold * 1]</k> can compute the size of a grid using its dimension list</li>
+ <li><k>[#fold &amp; 1]</k> can mean "for all"</li>
+ <li><k>[#fold | 0]</k> can mean "there exists (at least one)"</li>
+ <li><k>[#fold ^ 0]</k> can mean "there exists an odd number of..."</li>
+ <li><k>[#fold ^ 1]</k> can mean "there exists an even number of...".</li>
+ </list></p>
+
+ <method name="init">
+ <arg name="operator" type="numop2"/>
+ <arg name="seed" type="grid" default="0"/>
+ <arg name="right_hand" type="grid"/>
+ </method>
+
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims..., last)"/>
+ replaces every Dim(last) subgrid by the result of a cascade on that subgrid.
+ Doing that
+ with seed value 0 and operation + on grid "2 3 5 7" will compute
+ ((((0+2)+3)+5)+7) find the total "17".
+ produces a Dim(dims) grid.
+ </method>
+ </inlet>
+ <inlet id="1" attr="seed"/>
+ <outlet id="0"></outlet>
+ </class>
+
+ <class name="#scan">
+ <p><k>[#scan +]</k> computes subtotals; this can be used, for example,
+ to convert a regular probability distribution into a cumulative one.
+ (or in general, discrete integration)
+ </p>
+
+ <method name="init">
+ <arg name="operator" type="numop2"/>
+ <arg name="seed" type="grid" default="0"/>
+ </method>
+
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims..., last)"/>
+
+ replaces every Dim(last) subgrid by all the results of
+ cascading the operator on that subgrid,
+ producing a Dim(dims,last) grid.
+
+ For example, with base value 0 and operation + on grid "2 3 5
+ 7" will compute 0+2=2, 2+3=5, 5+5=10, 10+7=17, and give the
+ subtotals "2 5 10 17".
+
+ </method>
+ </inlet>
+ <inlet id="1" attr="seed"/>
+ <outlet id="0">
+ </outlet>
+
+ </class>
+
+ <class name="#outer">
+ <method name="init">
+ <arg name="operator" type="numop2"/>
+ <arg name="value" type="grid"/>
+ the operator must be picked from the table of two-input operators.
+ the grid is optional and corresponds to inlet 1.
+ </method>
+
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(anyA...)"/></method>
+ produces a grid of size Dim(anyA..., anyB...), where numbers
+ are the results of the operation on every element of A and
+ every element of B. the resulting array can be very big. Don't
+ try this on two pictures (the result will have 6 dimensions)
+ </inlet>
+ <inlet id="1">
+ <method name="grid"><arg name="grid" type="grid(anyB...)"/></method>
+ stores the specified grid, to be used when inlet 0 is activated.
+ </inlet>
+ <outlet id="0">
+ </outlet>
+
+ <p>When given a grid of Dim(3) and a grid of Dim(5) <k>[#outer]</k> will
+ produce a grid of Dim(3,5) with the selected two-input operation
+ applied on each of the possible pairs combinations between numbers
+ from the left grid and the ones from the right. for example :
+ (10,20,30) [#outer +] (1,2,3) will give :
+ ((11,12,13),(21,22,23),(31,32,33)) </p>
+
+ </class>
+
+ <class name="#inner">
+ <p>think of this one as a special combination of <k>[#outer]</k>, <k>[#]</k> and
+ <k>[#fold]</k>. this is one of the most complex operations. It is very useful
+ for performing linear transforms like rotations, scalings, shearings,
+ and some kinds of color remappings. A linear transform is done by
+ something called matrix multiplication, which happens to be <k>[#inner * +
+ 0]</k>. <k>[#inner]</k> also does dot product and other funny operations.</p>
+
+ <method name="init">
+ <arg name="right_hand" type="grid"/>
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(anyA..., lastA)"/>
+
+ Splits the Dim(anyA...,lastA) left-hand grid into Dim(anyA...)
+ pieces of Dim(lastA) size.
+
+ Splits the Dim(firstB,anyB...) right-hand grid into
+ Dim(anyB...) pieces of Dim(firstB) size.
+
+ On every piece pair, does <k>[#]</k> using the specified
+ op_para operation, followed by a <k>[#fold]</k> using
+ the specified op_fold operator and base value.
+
+ creates a Dim(anyA...,anyB...) grid by assembling all
+ the results together.
+
+ (note: lastA must be equal to firstB.)
+ </method>
+ <method name="op"><arg name="op" type="numop"/>
+ the operation that combines the values from the two grids together.
+ this defaults to "*" (as in the matrix product)
+ </method>
+ <method name="fold"><arg name="op" type="numop"/>
+ the operation that combines the result of the "op" operations together.
+ this defaults to "+" (as in the matrix product)
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="int">
+ changes the base value to that.
+ </method>
+ </inlet>
+ <inlet id="2">
+ <method name="grid"><arg name="grid" type="grid(anyB..., lastB)"/>
+ changes the right-hand side grid to that.
+ </method>
+ </inlet>
+ <outlet id="0">
+ </outlet>
+ </class>
+
+ <class name="@join">
+ <method name="init">
+ <arg name="which_dim"/>
+ Which_dim is the number of the dimension 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.
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>
+ The left grid and right grid must have the same number
+ of elements in all dimensions except the one specified.
+ The result will have the same number of elements in all
+ dimensions except the one specified, which will be the
+ sum of the two corresponding one.
+
+ <p>For example, joining a RGB picture Dim[y,x,3] and a
+ greyscale picture Dim[y,x,1] on dimension 2 (or -1) could
+ make a RGBA picture Dim[y,x,4] in which the greyscale image
+ becomes the opacity channel.
+ </p>
+ </method>
+ </inlet>
+ <inlet id="1"><method name="grid"><arg name="grid" type="grid"/></method></inlet>
+ <outlet id="0">
+ </outlet>
+ </class>
+
+ <class name="#finished">
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>any grid</method>
+ </inlet>
+ <outlet id="0">
+ a bang is emitted every time a grid transmission ends.
+ </outlet>
+ </class>
+
+ <class name="#cast">
+ <method name="init">
+ <arg name="numbertype" type="numbertype"/>
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>any grid</method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>a grid of the same shape containing all the same
+ values after type conversion. note that while casting to
+ a smaller type, values that are overflowing will be truncated.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#ravel">
+ <inlet id="0"><method name="grid"><arg name="grid" type="grid"/>any grid</method></inlet>
+ <outlet id="0"><method name="grid"><arg name="grid" type="grid"/>
+ like <k>[#redim]</k> but always produce a 1-D grid
+ with the same total number of elements.
+ </method></outlet>
+ </class>
+
+ <class name="#grade">
+ <inlet id="0"><method name="grid"><arg name="grid" type="grid"/>any grid</method></inlet>
+ <outlet id="0"><method name="grid"><arg name="grid" type="grid"/>
+ <p>splits a Dim[A...,B] grid into Dim[B] vectors,
+ producing new 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.</p>
+ <p>for example, connecting a [#grade] to a <k>[#outer ignore {0}]</k>
+ to a <k>[#store]</k> object, storing a single vector into <k>[#store]</k>, and
+ sending the same vector to <k>[#grade]</k>, will sort the values of the
+ vector. however for higher-dimensional grids, what should go
+ between <k>[#store]</k> and <k>[#grade]</k> to achieve the same result would
+ be more complex.</p>
+ <p>you may achieve different kinds of sorting by applying various
+ filters before <k>[#grade]</k>. the possibilities are unlimited.</p>
+ <p>if you plug <k>[#grade]</k> directly into another <k>[#grade]</k>, you will
+ get the inverse arrangement, which allows to take the sorted values
+ and make them unsorted in the original way. note that this is really
+ not the same as just listing the values backwards.</p>
+ </method></outlet>
+ </class>
+
+ <class name="#perspective">
+ <method name="init">
+ <arg name="depth" type="integer"/>
+ </method>
+ <inlet id="0"><method name="grid"><arg name="grid" type="grid"/>any grid</method></inlet>
+ <outlet id="0"><method name="grid"><arg name="grid" type="grid"/>
+ <p>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 "depth" parameter. Each vector's
+ length is adjusted so that it lies onto that plane. Then the
+ last dimension of each vector is dropped.</p>
+
+ <p>useful for converting from 3-D geometry to 2-D geometry. Also
+ useful for converting homogeneous 3-D into regular 3-D, as
+ homogeneous 3-D is really just regular 4-D...(!)</p>
+ </method></outlet>
+ </class>
+
+ <class name="#transpose">
+ <method name="init">
+ <arg name="dim1" type="integer"/>
+ <arg name="dim2" type="integer"/>
+ </method>
+ <inlet id="0"><method name="grid"><arg name="grid" type="grid"/>
+ swaps the two specified dimensions; dimension numbers are as in <k>[#join]</k>.
+ </method></inlet>
+ </class>
+
+ <class name="#fade">
+ <method name="init">
+ <arg name="rate" type="integer"/>
+ </method>
+ <inlet id="0"><method name="grid"><arg name="grid" type="grid"/>
+ produces on outlet 0 a linear recurrent fading according to the flow of
+ incoming messages. For example, if rate=5, then 20% (one fifth)
+ of each new message will be blended with 80% of the previous output.
+ </method></inlet>
+ </class>
+
+ <class name="#fade_lin">
+ <method name="init">
+ <arg name="maxraise" type="integer"/>
+ <arg name="maxdrop" type="integer"/>
+ </method>
+ <inlet id="0"><method name="grid"><arg name="grid" type="grid"/>
+ produces on outlet 0 a piecewise-linear nonrecurrent fading according to the flow of
+ incoming messages. For example, if maxraise=2 and maxdrop=4, then with each
+ new message an output is produced that is at most 2 more or 4 less than the
+ previous output.
+ </method></inlet>
+ </class>
+
+ <class name="#reverse">
+ <method name="init">
+ <arg name="whichdim"/>
+ Whichdim is the number of the dimension by which the reverse 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.
+ </method>
+ </class>
+</section>
+
+<section name="Objects for Coordinate Transforms">
+ <class name="#redim">
+ <method name="init">
+ <arg name="dims" type="dim_list"/>
+ a list specifying a grid shape that the numbers
+ will fit into.
+ (same as with <k>[#import]</k>)
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ the elements of this grid are serialized. if the resulting grid
+ must be larger, the sequence is repeated as much as necessary.
+ if the resulting grid must be smaller, the sequence is truncated.
+ then the elements are deserialized to form the resulting grid.
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="grid"><arg name="grid" type="grid(rank)"/>
+ this grid is a dimension list that replaces the one
+ specified in the constructor.
+ (same as with <k>[#import]</k>)
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>
+ redimensioned grid potentially containing repeating data.
+ </method>
+ </outlet>
+
+ <p>example: with a 240 320 RGB image, <k>[#redim 120 640 3]</k> will visually
+ separate the even lines (left) from the odd lines (right). contrary
+ to this, <k>[#redim 640 120 3]</k> will split every line and put its left half
+ on a even line and the right half on the following odd line. <k>[#redim]</k>
+ 480 320 3 will repeat the input image twice in the output image.
+ <k>[#redim]</k> 240 50 3 will only keep the 50 top lines.</p>
+
+ </class>
+ <class name="#store">
+ <p>A <k>[#store]</k> object can store exactly one grid, using the right
+ inlet. You fetch it back, or selected subparts thereof, using the left
+ inlet.</p>
+
+ <method name="init">
+ <arg name="contents" type="grid"/>
+ </method>
+
+ <inlet id="0">
+ <method name="bang">
+ the stored grid is fully sent to the outlet.
+ </method>
+ <method name="grid"><arg name="grid" type="grid(dims..., indices)"/>
+ in this grid, the last dimension refers to subparts of
+ the stored grid. sending a Dim(200,200,2) on a <k>[#store]</k>
+ that holds a Dim(240,320,3) will cause the <k>[#store]</k> to handle
+ the incoming grid as a Dim(200,200) of Dim(2)'s, where each
+ Dim(2) represents a position in a Dim(240,320) of Dim(3)'s.
+ therefore the resulting grid will be a Dim(200,200) of
+ Dim(3) which is a Dim(200,200,3). in practice this example
+ would be used for generating a 200*200 RGB picture from a
+ 200*200 XY map and a 240*320 RGB picture. this object can
+ be logically used in the same way for many purposes
+ including color palettes, tables of probabilities, tables
+ of statistics, whole animations, etc.
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ replace the whole grid, or a subpart of it (see other options on inlet 1)
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="reassign">(Future Use):
+ makes it so that sending a grid to inlet 1 detaches the old buffer from [#store]
+ and attaches a new one instead. This is the default.
+ </method>
+ <method name="put_at"><rest name="indices"/>(Future Use):
+ makes it so that sending a grid to inlet 1 writes into the existing buffer of [#store].
+ <p>
+ example: suppose you have <k>[#store {10 240 320 3}]</k>. then "put_at 3"
+ will allow to write a Dim[240,320,3] grid in indices (3,y,x,c) where y,x,c are indices of the incoming grid;
+ in other words, if that's a buffer of 10 RGB frames, you'd be replacing frame #3. Furthermore,
+ it also allows you to write a Dim[n,240,320,3] grid at (3+f,y,x,c) where f,y,x,c are indices of the incoming grid,
+ replacing frame #3, #4, ... up to #3+n-1. Here n is at most 7 because the last frame in the buffer is #9.
+ </p>
+ <p>that way of working extends to other kinds of data you'd put in Grids, in any numbers of dimensions;
+ because, as usual, [#store] wouldn't know the difference.
+ </p>
+ </method>
+ </inlet>
+ <outlet id="0">
+ grids as stored, as indexed, or as assembled from multiple
+ indexings.
+ </outlet>
+ </class>
+
+ <class name="#scale_to">
+ <method name="init">
+ <arg name="size">{height width} pair.</arg>
+ </method>
+
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>a 3-channel picture to be scaled.</method>
+ </inlet>
+ <inlet id="1">
+ <method name="int">a {height width} pair.</method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>a scaled 3-channel picture.</method>
+ </outlet>
+ </class>
+
+ <class name="#scale_by">
+ <method name="init">
+ <arg name="factor" type="grid dim() or dim(2)"/>
+ factor is optional (default is 2).
+ if it's a single value, then that factor is to be used
+ for both rows and columns.
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(y x channels)"/>
+ duplicates each pixel several times in width and several times in height,
+ where the number of times is determined by the factor described above.
+ twice those of the incoming grid. It is several times faster.
+ </method>
+ </inlet>
+ <inlet id="1"><method name="grid"><arg name="grid" type="grid(1 or 2)"/>sets factor</method></inlet>
+ <outlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid((factor*y) (factor*x) channels)"/>
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#downscale_by">
+ <method name="init">
+ <arg name="factor" type="+integer"/>
+ <arg name="how" type="optional symbol(smoothly)"/>
+ factor is optional (default is 2).
+ if it's a single value, then that factor is to be used
+ for both rows and columns.
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(y x channels)"/>
+ Scales down picture by specified amount. (See scale factor above)
+ </method>
+ </inlet>
+ <inlet id="1"><method name="grid">
+ <arg name="grid" type="grid(1 or 2)"/>sets scale factor</method></inlet>
+ <outlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid((factor/y) (factor/x) channels)"/>
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#spread">
+ <p>typically you plug a <k>[#for]</k> into this object,
+ and you plug this object into the left side of a <k>[#store]</k>. it will
+ scatter pixels around, giving an "unpolished glass" effect.</p>
+
+ <p>if you put a picture in it, however, it will add noise. The
+ resulting values may be out of range, so you may need to clip them
+ using min/max.</p>
+
+ <method name="init">
+ <arg name="factor">same as inlet 1</arg>
+ </method>
+
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>a coordinate map.</method>
+ </inlet>
+ <inlet id="1">
+ <method name="int">a spread factor.</method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid"/>a coordinate map.</method>
+ </outlet>
+
+
+ <p><k>[#spread]</k> scatters the pixels in an image. Not all original pixels
+ will appear, and some may get duplicated (triplicated, etc)
+ randomly. Some wrap-around effect will occur close to the edges.
+ </p>
+
+ <p> Sending an integer to inlet 1 sets the amount of spreading in
+ maximum number of pixels + 1. even values translate the whole image
+ by half a pixel due to rounding.</p>
+
+ </class>
+
+ <class name="#rotate">
+ <p>performs rotations on indexmaps and polygons and such.</p>
+
+ <method name="init">
+ <arg name="angle" type="0...35999"/>
+ </method>
+ <inlet id="0"><method name="grid">
+ <arg name="grid" type="grid(anyA 2)"/></method></inlet>
+ <inlet id="1"><method name="int">rotation angle; 0...36000</method>
+ </inlet>
+ <outlet id="0"><method name="grid">
+ <arg name="grid" type="grid(anyA 2)"/>
+ </method></outlet>
+ </class>
+
+ <class name="#remap_image">
+ <p>if you chain indexmap (coordinate) transformations from outlet 1
+ to inlet 1, then sending an image in inlet 0 will emit its
+ deformation out of outlet 0.</p>
+
+ <inlet id="0"/>
+ <inlet id="1"/>
+ <outlet id="0"/>
+ <outlet id="1"/>
+ </class>
+</section>
+
+<section name="Objects for Reporting">
+ <class name="#dim">
+ <p>Returns list of dimensions as a grid. Given a grid sized like Dim(240,320,4),
+ <k>[#dim]</k> will return a grid like Dim(3), whose values are 240, 320, 4. </p>
+
+ <method name="init">
+ no arguments.
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(dims...)"/>
+ ignores any data contained within.
+ sends a grid dim(length of dims) containing dims.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid(rank)"/>
+ the list of dimensions of the incoming grid.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#type">
+ <p>gives a symbol representing the numeric type of the grid received.
+ </p>
+ <outlet id="0"><method name="&lt;numeric type symbol&gt;"/></outlet>
+ </class>
+
+ <class name="display">
+ GUI object equivalent to [print] and [#print].
+ <method name="(any)">
+ Displays the received message in the box, resizing the box so that the message fits exactly.
+ </method>
+ </class>
+</section>
+
+<section name="Objects for Color Conversion">
+ <class name="#apply_colormap_channelwise">
+ <p>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. You may also color-correct
+ colormaps themselves.</p>
+
+ <p>Only works for things that have 3 channels.</p>
+
+ <p>Note: if you just need to apply a palette on an indexed-color
+ picture, you don't need this. Just use #store instead.</p>
+
+ <inlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns channels)"/>
+ picture
+ </method></inlet>
+ <inlet id="1">
+ <method name="grid">
+ <arg name="grid" type="grid(intensities channels)"/>
+ colormap ("palette")
+ </method></inlet>
+ <outlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns channels)"/>
+ picture
+ </method></outlet>
+ </class>
+
+ <class name="#rgb_to_greyscale">
+ <inlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {red green blue})"/>
+ </method></inlet>
+ <outlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {white})"/></method>
+ </outlet>
+ </class>
+
+ <class name="#greyscale_to_rgb">
+ <inlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {white})"/></method>
+ </inlet>
+ <outlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {red green blue})"/>
+ </method></outlet>
+ </class>
+
+ <class name="#yuv_to_rgb">
+ <p>note: may change slightly to adapt to actual video standards.</p>
+ <inlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {y u v})"/></method>
+ </inlet>
+ <outlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {red green blue})"/>
+ </method></outlet>
+ </class>
+
+ <class name="#rgb_to_yuv">
+ <p>note: may change slightly to adapt to actual video standards.</p>
+ <inlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {red green blue})"/></method>
+ </inlet>
+ <outlet id="0"><method name="grid">
+ <arg name="grid" type="grid(rows columns {y u v})"/>
+ </method></outlet>
+ </class>
+</section>
+
+<section name="Objects for Miscellaneous Picture Processing">
+ <class name="#convolve">
+ <p>this is the object for blurring, sharpening, finding edges,
+ embossing, cellular automata, and many other uses.</p>
+<!--NYI
+ <attr name="seed">
+
+ </attr>
+-->
+ <method name="init">
+ <arg name="op_para" type="numop2"/>
+ <arg name="op_fold" type="numop2"/>
+ <arg name="seed" type="grid"/>
+ <arg name="right_hand" type="grid" default="none"/>
+ </method>
+ <inlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns rest...)"/>
+ splits the incoming grid into dim(rest...) parts.
+ for each of those parts at (y,x), a rectangle of such
+ parts, centered around (y,x), is combined with the
+ convolution grid like a <k>[#]</k> of operation op_para. Then
+ each such result is folded like <k>[#fold]</k> 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.
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="grid">
+ <arg name="grid" type="grid(rows2 columns2)"/>
+ this is the convolution grid and it gets stored in
+ the object. if rows2 and/or columns2 are odd numbers,
+ then the centre of convolution is the middle of the convolution
+ grid. if they are even numbers, then the chosen centre will
+ be slightly more to the left and/or to the top, because the
+ actual middle is between cells of the grid.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns rest...)"/>
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#contrast">
+ <method name="init">
+ <arg name="iwhiteness" default="256">same as inlet 1.</arg>
+ <arg name="contrast" default="256">same as inlet 2.</arg>
+ </method>
+
+ <inlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns channels)"/>
+ produces a grid like the incoming grid but with
+ different constrast.
+ </method>
+ <p><k>[#contrast]</k> adjusts the intensity in an image.
+ resulting values outside 0-255 are automatically clipped.</p>
+ </inlet>
+ <inlet id="1">
+ <method name="int">
+ this is the secondary contrast (inverse whiteness).
+ it makes the incoming black
+ correspond to a certain fraction between output black and the
+ master contrast value. no effect is 256. default value is 256.
+ </method>
+ </inlet>
+ <inlet id="2">
+ <method name="int">
+ this is the master contrast. it makes the incoming white
+ correspond to a certain fraction between output black and output
+ white. no effect is 256. default value is 256.
+ </method>
+ </inlet>
+ <outlet>
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns channels)"/>
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#posterize">
+ <p><k>[#posterize]</k> 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.</p>
+
+ <method name="init">
+ <arg name="levels">same as inlet 1</arg>
+ </method>
+
+ <inlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns channels)"/>
+ produces a posterized picture from the input picture.
+ </method>
+ </inlet>
+
+ <inlet id="1">
+ <method name="int">
+ this is the 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 2.
+ </method>
+ </inlet>
+
+ <outlet id="0">
+ </outlet>
+
+ <p>example: simulate the 216-color "web" palette using 6 levels.
+ simulate a 15-bit display using 32 levels.</p>
+ </class>
+
+ <class name="#solarize">
+ <p>makes medium intensities brightest; formerly brightest colours
+ become darkest; formerly darkest stays darkest. This filter is linear:
+ it's like a 200% contrast except that overflows are <i>mirrored</i>
+ instead of clipped or wrapped.</p>
+ <inlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns channels)"/></method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(rows columns channels)"/></method>
+ </outlet>
+ </class>
+
+ <class name="#checkers">
+ <inlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(y x {y x})"/>
+ result from a <k>[#for {0 0} {height width} {1 1}]</k>
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(y x {r g b})"/>
+ checkered pattern of 50%/75% greys
+ in 8x8 squares
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#layer">
+ <inlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(y x {r g b a})"/>
+ a picture that has an opacity channel.
+ will be used as foreground.
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="grid">
+ <arg name="grid" type="grid(y x {r g b})"/>
+ a picture that has NO opacity channel.
+ will be used as background.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(y x {r g b})"/>
+ a picture that has NO opacity channel.
+ the opacity channel of the foreground is used as
+ a weighting of how much of either picture is seen
+ in the result.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#draw_image">
+ <method name="init">
+ <arg name="operator" type="numop2">
+ Normally you would use the "put" operator here;
+ but abnormally I recommend + and ^ for psychedelic effects.
+ </arg>
+ <arg name="picture" type="grid(y,x,channels)"/>
+ <arg name="position" type="grid({y x})"/>
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(y x channels)"/>
+ picture onto which another picture will be superimposed.
+ </method>
+ <method name="tile"><arg name="flag" type="0 or 1"/>
+ if enabled, inlet 1 picture will be repeated to cover the inlet 0 picture.
+ </method>
+ <method name="alpha"><arg name="flag" type="0 or 1"/>
+ if enabled, inlet 1 picture will be combined with inlet 0 picture using
+ the selected operator,
+ and then blended with inlet 0 picture according to transparency of
+ the inlet 1 picture, and then inserted in the result.
+ if disabled, the blending doesn't occur, as the transparency level
+ is considered to be "opaque". note that with alpha enabled,
+ the last channel of inlet 1 picture is considered to represent transparency.
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="grid"><arg name="grid" type="grid(y x channels)"/>
+ picture that will be superimposed onto another picture.
+ </method>
+ </inlet>
+ <inlet id="2">
+ <method name="grid"><arg name="grid" type="grid({y x})"/>
+ position of the inlet 0 picture corresponding to top-left corner
+ of inlet 1 picture.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid"><arg name="grid" type="grid(y x channels)"/>
+ resulting picture.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#draw_polygon">
+ <method name="init">
+ <arg name="operator" type="numop2">
+ Normally you would use the "put" operator here;
+ but abnormally I recommend + and ^ for psychedelic effects.
+ </arg>
+ <arg name="color" type="grid(channels)"/>
+ <arg name="vertices" type="grid(vertices,{y x})"/>
+ </method>
+ <inlet id="0">
+ <method name="grid"><arg name="grid" type="grid(y x channels)"/>
+ picture on which the polygon will be superimposed.
+ </method>
+ </inlet>
+ <inlet id="1">
+ <method name="grid"><arg name="grid" type="grid(channels)"/>
+ color of each pixel
+ </method>
+ </inlet>
+ <inlet id="2">
+ <method name="grid"><arg name="grid" type="grid(vertices {y x})"/>
+ vertices of the polygon.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="grid">
+ <arg name="grid" type="grid(y x channels)"/>
+ modified picture.
+ note: starting with 0.7.2, drawing a 1-by-1
+ square really generates a 1-by-1 square, and
+ so on. This is because the right-hand border of a
+ polygon is excluded, whereas it was included
+ before, leading to slightly-wider-than-expected polygons.
+ </method>
+ </outlet>
+ </class>
+
+ <class name="#text_to_image">
+ <p>inlet 2 receives a font grid, for example, [#in grid file lucida-typewriter-12.grid.gz]</p>
+ <p>inlet 1 receives a 2 by 3 matrix representing the colours to use (e.g. (2 3 # 0 170 0 255 255 0) means yellow on green)</p>
+ <p>inlet 0 receives a bang, transforming the data into an image suitable for #draw_image.</p>
+ </class>
+ <class name="#hueshift">
+ <p>inlet 1 receives an angle (0..36000)</p>
+ <p>inlet 0 receives a RGB picture that gets hueshifted by a rotation in the colorwheel by the specified angle; it gets sent to outlet 0.</p>
+ </class>
+</section>
+
+<section name="Other Objects">
+ <class name="pingpong">
+ Transforms linear counting (0, 1, 2, 3, 4, ...) into a back-and-forth counting (0, 1, 2, 1, 0, ...)
+ from 0 to a specified upper bound.
+ <method name="init">
+ <arg name="top" type="int"/>
+ </method>
+ <inlet id="1">
+ <method name="float"><arg name="top" type="float"/></method>
+ </inlet>
+ <inlet id="0">
+ <method name="float">
+ a value to be transformed.
+ If, for example, top=10, then values 0 thru 10 are left unchanged,
+ values 11 thru 19 are mapped to 9 thru 1 respectively, and 20 thru 30
+ are mapped to 0 thru 10, and so on.
+ </method>
+ </inlet>
+ </class>
+ <class name="fps">
+ <method name="init">
+ <arg name="clocktype" type="symbol(real|user|system|cpu)">
+ which clock to use. "real" uses wallclock time. "user" uses
+ the amount of time spent in the process. "system" uses the
+ amount of time spent in the kernel on behalf of the process.
+ "cpu" uses the Pentium clock, which is like a more precise
+ version of "real" if you have a Pentium.
+ </arg>
+ <arg name="detailed" type="symbol(detailed)">optional</arg>
+ </method>
+ <method name="init detailed">
+ </method>
+ <inlet id="0">
+ <method name="bang">
+ Times at which bangs are received are stored until a large
+ enough sample of those is accumulated. Large enough is defined
+ to be whenever the timespan exceeds one second. Then a report
+ is made through the outlet.
+ </method>
+ <method name="(else)">
+ messages other than bangs are ignored.
+ </method>
+ </inlet>
+ <outlet id="0">
+ <method name="float">
+ non-detailed mode only.
+ this is the messages-per-second rating.
+ </method>
+ <method name="list(float,6)">
+ detailed mode only.
+ this is: messages-per-second, followed by five values of
+ milliseconds-per-message: minimum, median, maximum, average,
+ standard deviation.
+ (the average happens to be simply 1000 divided by the
+ messages-per-second, but it is convenient to have it anyway)
+ </method>
+ </outlet>
+ </class>
+ <class name="unix_time">
+ <p>
+ This object returns the Unix timestamp. The first
+ outlet does so with ASCII, the second in seconds and the third outlet
+ outputs the fractions of seconds up to 1/100 000 th of a second which is useful for creating
+ filenames.
+ </p>
+ <inlet id="0"><method name="bang"/></inlet>
+ <outlet id="0"><method name="symbol"/>Outputs the time and date in ASCII format</outlet>
+ <outlet id="1"><method name="float"/>Outputs the Unix timestamp in seconds</outlet>
+ <outlet id="2"><method name="float"/>Outputs the fractions of a second up to 10 microseconds (?) (actual precision is platform-dependent afaik)</outlet>
+ </class>
+ <class name="plotter_control">
+ <p>
+ This object produces HPGL instructions in ASCII form
+ that can be sent to the comport object in order to control an HPGL
+ compatible plotter.
+ </p>
+ <inlet id="0"><method name="symbol"/></inlet>
+ <outlet id="0"><method name="symbol"/>Outputs the HPGL commands in ASCII format</outlet>
+ </class>
+</section>
+
+<section name="jMax emulation">
+ <p>those classes emulate jMax functionality, for use within PureData.</p>
+
+ <class name="fork">
+ <p>Every incoming message is sent to inlet 1 and then sent to
+ inlet 0 as well. Messages remain completely unaltered. Contrast
+ with PureData's "t a a" objects, which have the same purpose but
+ transform bangs into zeros and such.</p>
+
+ <inlet id="0"><method name="(any)"/></inlet>
+ <outlet id="0"/>
+ <outlet id="1"/>
+ </class>
+ <class name="foreach">
+ <inlet id="0"><method name="list"><rest/>
+ Outputs N messages, one per list element, in order.
+ </method></inlet>
+ </class>
+ <class name="listflatten">
+ <inlet id="0"><method name="list"><rest/>
+ </method></inlet>
+ </class>
+ <class name="listlength">
+ <inlet id="0"><method name="list">
+ outputs the number of elements in the incoming list.
+ </method></inlet>
+ </class>
+ <class name="listelement">
+ <method name="init">
+ <arg name="index" type="int" isattr="yes"/>
+ </method>
+ <inlet id="0"><method name="list"><rest/>
+ Outputs one element of the list, as selected by "index".
+ Also accepts negative indices (e.g.: -1 means "last"), unlike jMax.
+ </method></inlet>
+ <inlet id="1" attr="index"/>
+ </class>
+ <class name="listsublist">
+ <method name="init">
+ <arg name="index" type="int" isattr="yes"/>
+ <arg name="length" type="int" isattr="yes"/>
+ </method>
+ <inlet id="0"><method name="list"><rest/>
+ Outputs consecutive elements of the list, as selected by "index" and "length".
+ Also accepts negative indices (e.g.: -1 means "last"), but unlike jMax.
+ </method></inlet>
+ <inlet id="1" attr="index"/>
+ <inlet id="2" attr="length"/>
+ </class>
+ <class name="listprepend">
+ <method name="init">
+ <rest name="list" isattr="yes"/>
+ </method>
+ <inlet id="0"><method name="list"><rest/>
+ Outputs the stored list followed by the incoming list, all in one message.
+ </method></inlet>
+ <inlet id="1" attr="list"/>
+ </class>
+ <class name="listappend">
+ <method name="init">
+ <rest name="list" isattr="yes"/>
+ </method>
+ <inlet id="0"><method name="list"><rest/>
+ Outputs the incoming list followed by the stored list, all in one message.
+ </method></inlet>
+ <inlet id="1" attr="list"/>
+ </class>
+ <class name="listreverse">
+ <inlet id="0"><method name="list"><rest/>
+ Outputs the incoming list, from last element to first element.
+ </method></inlet>
+ </class>
+ <class name="oneshot">
+ Like [spigot], but turns itself off after each message, so you have to turn it on
+ again to making it pass another message.
+ </class>
+ <class name="inv+">
+ <method name="init">
+ <arg name="b" type="float" isattr="yes"/>
+ </method>
+ <inlet id="0"><method name="float"><arg name="a" type="float"/>
+ outputs b-a
+ </method></inlet>
+ <inlet id="1" attr="b"/>
+ </class>
+ <class name="inv*">
+ <method name="init">
+ <arg name="b" type="float" isattr="yes"/>
+ </method>
+ <inlet id="0"><method name="float"><arg name="a" type="float"/>
+ outputs b/a
+ </method></inlet>
+ <inlet id="1" attr="b"/>
+ </class>
+ <class name="messageprepend">
+ (This is not in jMax, but is there to help port $* messageboxes)
+ <method name="init"><rest name="list" isattr="yes"/></method>
+ <inlet id="0"><method name="&lt;any&gt;"><rest/>
+ Like [listprepend], but operates on whole messages, that is, including the selector.
+ </method></inlet>
+ <inlet id="1" attr="list"/>
+ </class>
+ <class name="messageappend">
+ (This is not in jMax, but is there to help port $* messageboxes)
+ <method name="init"><rest name="list" isattr="yes"/></method>
+ <inlet id="0"><method name="&lt;any&gt;"><rest/>
+ Like [listappend], but operates on whole messages, that is, including the selector.
+ </method>
+ </inlet>
+ <inlet id="1" attr="list"/>
+ </class>
+ <class name="shunt">
+ Compatible with jMax's [demux].
+ <method name="init">
+ <arg name="n">number of outlets</arg>
+ <arg name="i" default="0">initial selected outlet</arg>
+ </method>
+ <inlet id="0"><method name="&lt;any&gt;"><rest/>
+ Routes a message to the active outlet.
+ </method></inlet>
+ <inlet id="1"><method name="int"><arg name="i" type="int"/>
+ Selects which outlet is active.
+ </method></inlet>
+ </class>
+ <class name="demux">
+ please use shunt instead (name conflict with another Pd external)
+ </class>
+ <class name="range">
+ <method name="init">
+ <rest name="separators" type="float"></rest>
+ </method>
+ <inlet id="0"><method name="float">
+ a value to be sent to one of the outlets. The first outlet is for values
+ smaller than the first argument; else the second outlet is for values smaller
+ than the second argument; and so on; and the last outlet is for values greater
+ or equal to the last argument.
+ </method></inlet>
+ <inlet id="1..n"><method name="float">
+ sets the corresponding separator in the separator list.
+ </method></inlet>
+ </class>
+</section>
+</documentation>
diff --git a/externals/gridflow/doc/tutorials/gf_sampling_quantization.pd b/externals/gridflow/doc/tutorials/gf_sampling_quantization.pd
new file mode 100644
index 00000000..4f60217d
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_sampling_quantization.pd
@@ -0,0 +1,57 @@
+#N canvas 740 0 704 805 10;
+#X obj 2 5 cnv 15 650 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 -30 cnv 15 700 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 0 741 cnv 15 700 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 14 746 GridFlow 0.9.1;
+#X text 7 -23 Principles of new media;
+#X text 218 152 <-- reduces the size of the image;
+#X text 5 3 1.1 sampling;
+#X obj 4 314 cnv 15 650 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 7 313 1.2 quantization;
+#X text 330 85 <-- change the resampling factor (1 to 8);
+#X obj 55 80 #in;
+#X obj 55 32 tgl 15 0 empty empty empty 17 7 0 10 -4034 -1 -1 1 1;
+#X obj 75 259 #out window \, title sampling;
+#X obj 55 204 #scale_by;
+#X obj 202 86 hradio 15 1 0 8 empty empty empty 0 -8 0 10 -257985 -1
+-1 0;
+#X obj 202 108 + 1;
+#X obj 202 130 t a a;
+#X text 218 152 <-- reduces the size of the image;
+#X msg 123 55 open babbage.jpg;
+#X obj 55 419 #out window \, title quantization;
+#X text 230 53 <-- open image first;
+#X floatatom 124 365 5 0 0 0 - - -;
+#X obj 24 449 #downscale_by 32 smoothly;
+#X obj 25 518 display;
+#X obj 34 470 #out window \, title really_small_window;
+#X text 133 385 <-- reduces the number of possible pixel values;
+#X text 121 201 <-- increases the image size by the same factor \,
+letting us see the loss of information from the original image;
+#X obj 55 152 #downscale_by \, smoothly;
+#X obj 127 343 hsl 128 15 2 16 0 0 empty empty empty -2 -8 0 10 -257985
+-1 -1 3300 1;
+#X obj 55 54 metro 100;
+#X obj 55 385 #posterize 2;
+#X text 262 342 <-- number of tones per channel;
+#X connect 10 0 27 0;
+#X connect 11 0 29 0;
+#X connect 13 0 12 0;
+#X connect 13 0 30 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 27 1;
+#X connect 16 1 13 1;
+#X connect 18 0 10 0;
+#X connect 21 0 30 1;
+#X connect 22 0 23 0;
+#X connect 22 0 24 0;
+#X connect 27 0 13 0;
+#X connect 28 0 21 0;
+#X connect 29 0 10 0;
+#X connect 30 0 19 0;
+#X connect 30 0 22 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_grid_1.pd b/externals/gridflow/doc/tutorials/gf_tutorial_grid_1.pd
new file mode 100644
index 00000000..e86ff88f
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_grid_1.pd
@@ -0,0 +1,25 @@
+#N canvas 363 183 701 242 10;
+#X obj 2 5 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 -30 cnv 15 700 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 5 5 1.1 What is a grid?;
+#X text 7 -23 1 Introduction to Grids;
+#X obj 0 178 cnv 15 700 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 523 56 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 537 119 #out window;
+#X obj 537 88 #in david.jpg;
+#X text 14 183 GridFlow 0.9.0;
+#X text 5 28 A grid is composed of rows and columns that contain numeric
+data. GridFlow usually interprets images as three-dimensional grids
+with rows (height) and columns (width). Each channel is a single colour
+\, usually red \, green and blue (RGB). The channels make up the colour
+information of an image. Videos are also interpreted as grids since
+each frame is a still image.;
+#X text 5 125 GridFlow objects that accept or produce grids are identified
+by the number sign "#" (a mini grid). From now on \, the term "grid"
+is used to identify an image or video.;
+#X connect 5 0 7 0;
+#X connect 7 0 6 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_grid_2.pd b/externals/gridflow/doc/tutorials/gf_tutorial_grid_2.pd
new file mode 100644
index 00000000..59aecb1a
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_grid_2.pd
@@ -0,0 +1,64 @@
+#N canvas 376 138 1022 422 10;
+#X obj 1 14 cnv 15 460 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 4 14 1.2 How to create a grid.;
+#X obj 1 14 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 5 14 1.2 Creating a grid using the [#import] object.;
+#X text 5 40 GridFlow can create a grid from a list of numbers. The
+[#import] object permits you to set the desired amount of rows and
+columns. A message box must be connected to tell the grid which numbers
+to display.;
+#X text 6 109 Steps to create a grid:;
+#X text 7 134 1 - Create a list of numbers using a message box (the
+numbers must be seperated by a space). The list can have as many numbers
+as you want but only the amount defined by [#import] will be displayed.
+As you click on the message box the numbers will appear in the grid.
+Note how the numbers are positioned in the grid from left to right
+and from the top to the bottom.;
+#X text 7 229 2 - Create the [#import] object and indicate the parameters
+you want as grid dimensions. By indicating 3 3 in brackets following
+[#import] \, you are creating a grid that has 3 rows and 3 columns.
+A 3 by 3 grid will displays 9 numbers.;
+#X text 8 291 3 - Connect the objects to a [display] object or a [print]
+object to see the resulting grid. You can alter your grid without actually
+seeing the image.;
+#X obj 1 -30 cnv 15 1020 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 1 -30 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 6 -23 1 Introduction to Grids;
+#X obj 1 356 cnv 15 1020 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 479 285 display;
+#X msg 547 154 reset;
+#X obj 476 15 cnv 15 545 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 476 15 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 673 50 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 478 223 cnv 15 92 15 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 478 222 #import (3 3);
+#X msg 478 51 1 2 3 4 5 6 7 8 9;
+#X msg 535 99 1 2 3 4;
+#X text 483 15 1.2 Patch example.;
+#X text 610 155 <-- resets the grid to only display the numbers from
+the list;
+#X obj 652 217 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 610 97 <-- click here three times to see how [#import] only
+outputs a grid once it recieves the number of values associated with
+its dimensions;
+#X text 590 217 <-- step 2: click here to create a grid that has 3
+rows and 3 columns (try changing these numbers to alter the dimensions
+of the grid).;
+#X text 592 287 <-- the display object outputs results.;
+#X text 611 50 <-- step 1: click here to view the numbers from the
+list in a grid.;
+#X text 9 363 GridFlow 0.9.0;
+#X connect 14 0 19 0;
+#X connect 19 0 13 0;
+#X connect 20 0 19 0;
+#X connect 21 0 19 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_grid_3.pd b/externals/gridflow/doc/tutorials/gf_tutorial_grid_3.pd
new file mode 100644
index 00000000..4e5e5778
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_grid_3.pd
@@ -0,0 +1,30 @@
+#N canvas 106 132 652 402 10;
+#X obj 7 11 cnv 15 640 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 10 11 1.2 How to create a grid.;
+#X obj 7 11 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 11 11 1.3 Creating a grid using the [# + 0] object.;
+#X obj 7 -29 cnv 15 640 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 12 -22 1 Introduction to Grids;
+#X obj 279 117 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 216 255 <-- the display object outputs results.;
+#X text 217 116 <-- step 1: click on either message box to view the
+numbers from the list in a grid.;
+#X text 9 36 The [# + 0] object works like [#import] but allows you
+to put your grid parameters and values into one message box instead
+of having to insert them into the object box.;
+#X obj 5 337 cnv 15 640 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X msg 16 113 3 3 # 6 1 3 6 3 324 6 3 4;
+#X msg 37 159 3 3 # 1 0 0 0;
+#X obj 17 254 display;
+#X obj 16 204 cnv 15 37 15 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 16 203 # + 0;
+#X text 14 345 GridFlow 0.8.4;
+#X connect 11 0 15 0;
+#X connect 12 0 15 0;
+#X connect 15 0 13 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_1.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_1.pd
new file mode 100644
index 00000000..1c0fa483
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_1.pd
@@ -0,0 +1,65 @@
+#N canvas 523 65 902 461 10;
+#X obj 4 323 cnv 15 900 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 5 -67 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 5 -106 cnv 15 900 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 5 -106 cnv 15 780 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 12 -99 2 Introduction to Images;
+#X obj 450 -67 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 453 -67 1.2 How to create a grid.;
+#X obj 450 -67 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 112 167 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 621 48 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 621 100 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 557 99 <-- step #2 : click here to update the image;
+#X text 556 47 <-- step #1 : click here to load the image;
+#X text 8 169 step 3: Add a;
+#X text 7 136 step 2: Create [#in] object;
+#X text 8 202 step 4: Create a [#out window];
+#X text 6 98 step 1:;
+#X obj 450 264 cnv 15 25 15 empty empty empty 20 12 0 14 -260818 -66577
+0;
+#X text 449 264 Tip:;
+#X text 485 263 Remember \, as with the rest of PD \, you can obtain
+information regarding specific objects by right-clicking on it. Try
+this for [#in].;
+#X text 6 250 GridFlow accepts several image formats including .jpg
+\, .png \, .tiff.;
+#X text 449 213 The [#out window] object must be deleted in order to
+close the display window the image is in.;
+#X text 8 -46 The following steps outline the items that you need to
+open a grid. Whether it be an image or a video you want to open theses
+four steps are necessary.;
+#X text 8 2 In order for GridFlow to recognize your media files by
+file name you have to put them in the "images" folder (located within
+the GridFlow directory). Another way to locate an image is to specify
+the path to where it is saved on your hard drive in the message box.
+;
+#X text 452 -46 To view the image you must initialize the patch. Click
+on the message box \, and then on the bang (this must be done in the
+run mode). The image will appear in a display window \, off to the
+side of the patch. Sometimes the display window opens behind the patch
+\, try moving the patch if the display seems to be missing.;
+#X text 459 -66 2.1 Patch Example;
+#X text 8 -68 2.1 Opening an Image;
+#X obj 450 140 cnv 15 22 15 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 450 180 #out window;
+#X msg 450 48 open b001.jpg;
+#X obj 534 99 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 450 139 #in;
+#X text 62 113 extension you want to open;
+#X text 63 99 Create message box [open< with the file name and;
+#X text 11 329 GridFlow 0.9.0;
+#X connect 29 0 31 0;
+#X connect 30 0 31 0;
+#X connect 31 0 28 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_2.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_2.pd
new file mode 100644
index 00000000..affb33b7
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_2.pd
@@ -0,0 +1,63 @@
+#N canvas 257 0 660 624 10;
+#X obj 3 -37 cnv 15 653 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 3 -72 cnv 15 653 30 empty empty empty 20 12 0 14 -233017 -355
+0;
+#X obj 3 517 cnv 15 653 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 268 271 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 152 134 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 88 133 <-- step #2 : start the metro;
+#X obj 203 363 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 246 465 cnv 15 20 15 empty empty empty 20 12 0 14 -260818 -66577
+0;
+#X text 111 159 the metro refreshes the display window so you don't
+have to reload the grid every time it's altered.;
+#X text 204 271 <-- step #1 : load the image;
+#X text 245 464 Tip: try replacing this number box with a slider.;
+#X text 139 363 <-- step #3 : change the grid's vertical parameters
+;
+#X obj 247 405 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 15 -38 2.2 Resizing an image;
+#X text 10 82 [# pack] lets you resize grids by altering the vertical
+and horizontal parameters.;
+#X text 10 34 If you want to make your image four times its size \,
+you would have to insert a 4 into the object \; [#scale_by 4].;
+#X text 9 -10 [#scale_by] resizes grids by multiplying its parameters
+(width and height). To resize an image proportionatly a specific scaling
+size must be identified within the object.;
+#X text 183 405 <-- step #4 : change the grid's horizontal parameters
+;
+#X text 17 -67 2 Introduction to Images;
+#X obj 16 177 metro 10;
+#X obj 16 135 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X floatatom 74 368 5 1 4 0 - - -;
+#X obj 16 482 #out window;
+#X obj 53 295 #in;
+#X msg 53 272 load bluemarble.jpg;
+#X obj 74 431 #pack 2;
+#X obj 16 319 #store;
+#X obj 16 319 #store;
+#X obj 53 249 loadbang;
+#X obj 17 458 cnv 15 63 15 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 16 457 #scale_by;
+#X floatatom 118 406 5 0 0 0 - - -;
+#X text 11 524 GridFlow 0.8.4;
+#X connect 19 0 26 0;
+#X connect 19 0 27 0;
+#X connect 20 0 19 0;
+#X connect 21 0 25 0;
+#X connect 23 0 26 1;
+#X connect 23 0 27 1;
+#X connect 24 0 23 0;
+#X connect 25 0 30 1;
+#X connect 27 0 30 0;
+#X connect 28 0 24 0;
+#X connect 30 0 22 0;
+#X connect 31 0 25 1;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_3.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_3.pd
new file mode 100644
index 00000000..03d8c056
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_3.pd
@@ -0,0 +1,84 @@
+#N canvas 0 87 993 482 10;
+#X obj 6 38 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 6 3 cnv 15 1000 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 5 149 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 530 134 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 484 163 #in;
+#X obj 484 191 cnv 15 42 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 8 180 In this section we will introduce some very basic functions
+of the numeric operator \, one of the most common methods used for
+image transformation.;
+#X text 7 69 GridFlow performs high level grid processing \; in other
+words its main function is the manipulation of images and video. There
+are several ways to modify images in GridFlow \, some are very basic
+while others are more advanced.;
+#X text 9 234 Numeric Operators (numop): transform grids by applying
+a mathematical operation to each pixel value.;
+#X obj 6 455 cnv 15 1000 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 18 37 2.3 Image Manipulation;
+#X text 17 148 Image Manipulation Using Numeric Operators;
+#X text 8 277 To transform a grid the numop must first be given an
+argument. That argument will be applied to every pixel in the grid.
+The following three examples show some ways to give the numop an argument.
+;
+#X obj 460 38 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 465 62 Altering a grid by placing an argument directly into
+the numop object.;
+#X obj 560 343 cnv 15 42 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 561 382 display;
+#X msg 483 278 1 2 3 4 5 6 7 8 9;
+#X obj 483 307 #import (3 3);
+#X obj 484 382 display;
+#X obj 10 38 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 22 37 2.3 Image Manipulation;
+#X obj 10 38 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 22 37 2.3 Image Manipulation;
+#X obj 672 103 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 11 352 cnv 15 20 15 empty empty empty 20 12 0 14 -260818 -66577
+0;
+#X text 422 361 --->;
+#X text 608 103 <-- step #1 : click here to load the image;
+#X obj 672 133 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 624 189 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 608 133 <-- step #2 : click here to view the image;
+#X text 658 201 the value (42);
+#X text 560 188 <-- step #3 : try altering the argument by changing
+;
+#X obj 691 276 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 691 342 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 627 276 <-- step #1 : click here to load the grid;
+#X text 20 8 2 Introduction to Images;
+#X text 472 37 2.3 Patch Example 1;
+#X text 9 352 Tip: To understand how pixels are affected by the numop
+test out this numeric grid patch. Each grid value that is output is
+multiplied by 42;
+#X obj 484 220 #out window;
+#X obj 484 191 # * 42;
+#X text 727 360 by changing the value (42);
+#X text 628 342 <-- step #2 : try altering the argument;
+#X obj 560 343 # * 42;
+#X text 14 463 GridFlow 0.8.4;
+#X msg 484 106 open working.jpg;
+#X connect 3 0 4 0;
+#X connect 4 0 40 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 18 0 43 0;
+#X connect 40 0 39 0;
+#X connect 43 0 16 0;
+#X connect 45 0 4 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_4.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_4.pd
new file mode 100644
index 00000000..ca6eae3f
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_4.pd
@@ -0,0 +1,49 @@
+#N canvas 240 75 554 435 10;
+#X obj 23 -109 #in;
+#X obj 95 -59 cnv 15 25 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 95 -84 cnv 15 25 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 96 -34 cnv 15 25 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X msg 95 -59 67;
+#X msg 95 -84 2;
+#X msg 96 -34 199;
+#X text 146 -153 <--;
+#X text 145 -82 <--;
+#X text 145 -59 <--;
+#X text 145 -37 <--;
+#X obj 58 -148 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 4 -299 cnv 15 550 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 -334 cnv 15 550 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 5 69 cnv 15 550 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 18 -329 2 Introduction to Images;
+#X text 15 -301 2.3 Patch Example 2;
+#X text 12 -269 Altering a grid by sending numop an argument using
+a message box. This method allows you to send the numop several different
+arguments.;
+#X obj 209 -206 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 210 -152 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 145 -206 <-- step #2 : click here to load the image;
+#X text 174 -153 Step #3: click on the bang to see the updated image
+;
+#X obj 215 -59 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 179 -59 step #1 : click on one of the arguments;
+#X text 14 77 GridFlow 0.8.4;
+#X obj 23 33 #out window;
+#X msg 23 -206 open working.jpg;
+#X obj 23 -35 # * 1;
+#X connect 0 0 27 0;
+#X connect 4 0 27 1;
+#X connect 5 0 27 1;
+#X connect 6 0 27 1;
+#X connect 11 0 0 0;
+#X connect 26 0 0 0;
+#X connect 27 0 25 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_5.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_5.pd
new file mode 100644
index 00000000..a0226c88
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_5.pd
@@ -0,0 +1,52 @@
+#N canvas 559 20 560 533 10;
+#X obj 2 37 cnv 15 550 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 2 cnv 15 550 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 2 501 cnv 15 550 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 16 7 2 Introduction to Images;
+#X text 14 36 2.3 Patch Example 3;
+#X text 2 58 Altering a grid using numop with slider and metro. This
+combination allows you to scroll through values and modify a grid in
+real time.;
+#X obj 19 338 cnv 15 38 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 225 207 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 280 294 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 314 306 the slider;
+#X obj 223 122 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 224 162 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 21 252 #in;
+#X obj 54 295 hsl 128 15 0 255 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 53 228 metro 33.3;
+#X obj 53 206 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X floatatom 72 326 5 0 0 0 - - -;
+#X obj 50 165 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 21 398 #out window;
+#X msg 21 121 open scissors.jpg;
+#X obj 21 338 # + 0;
+#X text 159 122 <-- step #1 : click here to load the image;
+#X text 161 206 <-- step #2 : start the metro;
+#X text 160 162 <-- step #2 : click here to view the image;
+#X text 223 184 or;
+#X text 216 294 <-- step #3 : try altering the argument by using;
+#X text 11 509 GridFlow 0.9.0;
+#X text 4 443 These examples use the [# +] numop. There are several
+numeric operators \; they can be found in the numeric operator help
+patch (right click on the [# + 0] and select help to view them).;
+#X connect 12 0 20 0;
+#X connect 13 0 16 0;
+#X connect 13 0 20 1;
+#X connect 14 0 12 0;
+#X connect 15 0 14 0;
+#X connect 17 0 12 0;
+#X connect 19 0 12 0;
+#X connect 20 0 18 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_6.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_6.pd
new file mode 100644
index 00000000..e595e5b1
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_6.pd
@@ -0,0 +1,66 @@
+#N canvas 130 10 767 676 10;
+#X obj 7 -69 cnv 15 760 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 425 cnv 15 760 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 4 -220 cnv 15 760 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 18 -215 2 Introduction to Images;
+#X obj 5 -183 cnv 15 760 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 12 -155 When an image is represented as a grid every pixel
+value will vary between 0 and 255 Colour wrapping occurs when the result
+of an operation on the pixel value is higher than 255 Values above
+255 are counted from 0 For example: if a pixel has a red value of 240
+and 20 is added to it \, you get 5 instead of displaying 260 (240 +
+20 - 255 = 5).;
+#X text 17 -184 2.4 Colour Wrapping;
+#X text 15 -69 2.4 [#clip];
+#X text 11 -44 The [#clip] object is used with numops in order to set
+a lower and upper range to pixel values. This allows you to avoid over
+saturating the colours of your grid.;
+#X obj 163 83 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 19 254 cnv 15 38 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 53 161 hsl 128 15 0 255 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X obj 20 56 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 50 353 #clip;
+#X obj 20 78 metro 33.3;
+#X obj 75 185 #color;
+#X obj 20 385 #out window;
+#X obj 20 314 shunt;
+#X obj 50 288 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 3 107 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X text 296 211 channel at a time;
+#X text 268 196 <-- use colour specific sliders to add values to one
+;
+#X obj 147 288 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 179 288 click here to redirect the flow of data using the [shunt]
+object and see the effect of [#clip];
+#X text 100 83 <-- step #1 : start the metro;
+#X text 199 160 <-- use slider to add values to all channels at once
+;
+#X text 9 432 GridFlow 0.8.4;
+#X obj 20 136 #store;
+#X obj 66 136 #in sewing.jpg;
+#X obj 20 254 # + 0;
+#X obj 66 117 loadbang;
+#X text 84 288 <-- step #2 :;
+#X connect 11 0 29 1;
+#X connect 12 0 14 0;
+#X connect 13 0 16 0;
+#X connect 14 0 27 0;
+#X connect 15 0 29 1;
+#X connect 17 0 16 0;
+#X connect 17 1 13 0;
+#X connect 18 0 17 1;
+#X connect 19 0 27 0;
+#X connect 27 0 29 0;
+#X connect 28 0 27 1;
+#X connect 29 0 17 0;
+#X connect 30 0 28 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_7.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_7.pd
new file mode 100644
index 00000000..d7704291
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_7.pd
@@ -0,0 +1,36 @@
+#N canvas 79 206 438 353 10;
+#X obj 2 -37 cnv 15 430 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 2 -72 cnv 15 430 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 3 244 cnv 15 430 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 4 -15 To convert an image to greyscale use [#rgb_to_greyscale].
+It converts a colour information into a black to white gradient.;
+#X obj 12 207 cnv 15 25 15 empty empty empty 20 12 0 14 -260818 -66577
+0;
+#X text 11 207 Tip:;
+#X text 48 201 If you have trouble opening this image refer back to
+previous tutorials.;
+#X text 16 -67 2 Introduction to Images;
+#X text 16 -37 2.5 Greyscale;
+#X obj 14 125 cnv 15 110 16 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 15 71 #in;
+#X obj 27 51 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X msg 15 27 open working.jpg;
+#X text 11 252 GridFlow 0.9.0;
+#X obj 15 124 #rgb_to_greyscale;
+#X obj 15 145 #greyscale_to_rgb;
+#X obj 15 172 #out window \, title greyscale;
+#X obj 157 91 #out window \, title original;
+#X obj 15 94 t a a;
+#X text 124 144 [#out window] still only accepts rgb images;
+#X connect 10 0 18 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 18 0 14 0;
+#X connect 18 1 17 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_8.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_8.pd
new file mode 100644
index 00000000..1697e73b
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_8.pd
@@ -0,0 +1,61 @@
+#N canvas 29 52 836 433 10;
+#X obj 3 347 cnv 15 830 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 4 -18 cnv 15 830 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 4 -52 cnv 15 830 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 11 -46 2 Introduction to Images;
+#X text 10 -18 2.6 Remap Image;
+#X obj 261 229 cnv 15 25 15 empty empty empty 20 12 0 14 -260818 -66577
+0;
+#X text 260 229 Tip:;
+#X text 290 228 This is a numeric operator. Right click on it for more
+information or go back to the tutorial about the numeric operator.
+;
+#X obj 272 77 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 321 188 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 355 200 number box to transform image;
+#X obj 21 267 cnv 15 85 15 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 20 77 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 20 166 #in;
+#X obj 20 104 t b b;
+#X obj 99 290 #print;
+#X obj 191 128 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X floatatom 210 189 5 0 0 0 - - -;
+#X obj 180 152 #for (0 0) (240 320) (1 1);
+#X obj 180 102 metro 100;
+#X obj 180 77 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 20 266 #remap_image;
+#X obj 180 227 # / 1;
+#X obj 20 315 #out window;
+#X text 231 228 <--;
+#X text 11 354 GridFlow 0.8.4;
+#X msg 50 135 open working.jpg;
+#X obj 110 77 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 12 7 Each numeric operator applies unique effects to a grid.
+The standard effect changes when numop is used in combination with
+the [#remap_image] object.;
+#X text 46 75 <-- step #1;
+#X text 207 77 <-- step #2 : start the metro;
+#X text 258 188 <-- step #3 : click and drag cursor over;
+#X connect 12 0 14 0;
+#X connect 13 0 21 0;
+#X connect 14 0 13 0;
+#X connect 14 1 26 0;
+#X connect 16 0 18 0;
+#X connect 17 0 22 1;
+#X connect 18 0 22 0;
+#X connect 19 0 18 0;
+#X connect 20 0 19 0;
+#X connect 21 0 23 0;
+#X connect 21 1 15 0;
+#X connect 22 0 21 1;
+#X connect 26 0 13 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_image_9.pd b/externals/gridflow/doc/tutorials/gf_tutorial_image_9.pd
new file mode 100644
index 00000000..b7684734
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_image_9.pd
@@ -0,0 +1,65 @@
+#N canvas 157 13 867 556 10;
+#X obj -14 522 cnv 15 862 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj -14 34 cnv 15 865 15 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj -14 -1 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text -9 5 2 Introduction to Images;
+#X text -9 33 2.6 [#convolve];
+#X obj 147 258 #store;
+#X obj 147 362 # / 9;
+#X msg 297 372 3 3 # 1 1 1 1 1 1 1 1 1;
+#X obj -5 353 #out window;
+#X obj -5 160 #in;
+#X obj 147 177 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj -5 119 loadbang;
+#X obj 147 206 metro 33.3667;
+#X obj -5 218 t a;
+#X obj 147 335 #convolve \, seed 4;
+#X obj 297 339 loadbang;
+#X obj 297 445 display;
+#X obj 147 411 #clip;
+#X obj 529 390 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 228 141 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X obj 229 175 cnv 15 15 15 empty empty empty 20 12 0 14 -259603 -66577
+0;
+#X text 164 140 <-- step #1 : load image;
+#X text 166 175 <-- step #3 : start metro;
+#X obj 297 316 cnv 15 110 15 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X text 331 316 Blurs;
+#X text 562 389 apply effect by selecting a message box;
+#X text 202 253 <-- The [#store] object stores the last grid that [#convolve]
+was applied to. Everytime time the metro bangs \, [#convolve] is applied
+to the grid retained in this object \, therefore applying effect on
+top of effect.;
+#X text 465 390 <-- step #2 :;
+#X text -8 529 GridFlow 0.9.0;
+#X text -18 502 ((Source convolve.pd : Copyright Mathieu Bouchard 2002)
+;
+#X msg 296 415 3 3 # 4 0 -1 3 1 0 0 0 4;
+#X text -9 55 [#convolve] allows you to apply preset effects such as
+blur \, edge sharpen and emboss onto a grid. In this example you can
+create two different kinds of "blurs" on an image.;
+#X msg -5 140 load working.jpg;
+#X obj 147 387 # abs-;
+#X connect 5 0 14 0;
+#X connect 6 0 33 0;
+#X connect 7 0 14 1;
+#X connect 9 0 13 0;
+#X connect 10 0 12 0;
+#X connect 11 0 32 0;
+#X connect 12 0 5 0;
+#X connect 13 0 5 1;
+#X connect 13 0 8 0;
+#X connect 14 0 6 0;
+#X connect 15 0 7 0;
+#X connect 17 0 13 0;
+#X connect 30 0 14 1;
+#X connect 30 0 16 0;
+#X connect 32 0 9 0;
+#X connect 33 0 17 0;
diff --git a/externals/gridflow/doc/tutorials/gf_tutorial_intro.pd b/externals/gridflow/doc/tutorials/gf_tutorial_intro.pd
new file mode 100644
index 00000000..9113ebb0
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/gf_tutorial_intro.pd
@@ -0,0 +1,86 @@
+#N canvas 160 16 884 589 10;
+#X obj 5 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 5 550 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 6 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 4 232 cnv 15 430 145 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 25 271 pddp_open pure-data-1;
+#X obj 25 294 pddp_open pure-data-2;
+#X obj 25 317 pddp_open pure-data-3;
+#X obj 25 340 pddp_open pure-data-4;
+#X text 200 271 Pure-Data Introduction;
+#X text 200 294 GUI Objects for Interaction;
+#X text 200 317 Creating your first patch;
+#X text 200 340 Control: metro \, random & counter;
+#X obj 444 233 cnv 15 430 145 empty empty empty 20 12 0 14 -179884
+-66577 0;
+#X obj 5 391 cnv 15 430 145 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 25 416 pddp_open pure-data-5;
+#X obj 25 439 pddp_open pure-data-6;
+#X text 200 439 The powerful message object;
+#X obj 25 462 pddp_open pure-data-7;
+#X text 200 462 More about lists;
+#X text 200 485 Nesting collections of objects;
+#X text 200 416 Connectionless communications;
+#X obj 25 485 pddp_open pure-data-8;
+#X text 200 509 Using GUI's in abstractions;
+#X obj 25 509 pddp_open pure-data-9;
+#X obj 445 391 cnv 15 430 145 empty empty empty 20 12 0 14 -179884
+-66577 0;
+#X obj 468 271 pddp_open GridFlow-1;
+#X obj 468 294 pddp_open GridFlow-2;
+#X obj 468 317 pddp_open GridFlow-3;
+#X obj 468 340 pddp_open GridFlow-4;
+#X text 642 319 Introduction to video;
+#X obj 446 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 645 477 Interfacing with sensors;
+#X obj 467 426 pddp_open GridFlow-6;
+#X obj 467 452 pddp_open GridFlow-7;
+#X text 451 236 2 Introduction to GridFlow;
+#X obj 448 236 cnv 15 15 15 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X text 451 236 2 Introduction to GridFlow;
+#X obj 8 395 cnv 15 15 15 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X obj 449 395 cnv 15 15 15 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X obj 7 235 cnv 15 15 15 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X text 452 395 4 Intermediate GridFlow;
+#X text 10 235 1 Introduction to Pure-Data;
+#X text 11 395 3 Intermediate Pure-Data;
+#X text 582 563 Stephanie Brodeur and Darsha Hewitt 2006;
+#X text 451 46 What is GridFlow?;
+#X text 500 550 What is GridFlow? and GridFlow tutorials developed
+by;
+#X text 453 84 GridFlow is a plug-in for PureData that introduces the
+grid (#) data type into the PD environment. GridFlow allows you to
+work with live video \, still images and video files in a real-time
+environment.;
+#X text 11 46 What is PureData (aka PD)?;
+#X text 14 85 PureData is an open-source patching environment for multi-media
+(audio+image). PureData is a programming language where you create
+relationships by connecting visual boxes (rather than typing complex
+commands).;
+#X text 454 144 This section deals with the particular objects related
+to GridFlow. GridFlow uses the usual PD "control" objects \, as well
+as a set of GridFlow specific objects.;
+#X text 15 141 A basic understanding of PureData is useful when using
+GridFlow. If you are new to the PureData programming environment it
+is recommended that you follow the Introduction to PureData before
+you move onto the GridFlow tutorials.;
+#X text 10 13 Welcome to PureData;
+#X text 13 551 What is PureData? and PureData tutorials copyright Ben
+Bogart 2005 \; (See COPYING.TXT for details);
+#X text 642 340 Introduction to live video;
+#X text 641 273 Introduction to grids;
+#X text 639 296 Introduction to images;
+#X text 653 480;
+#X obj 467 477 pddp_open GridFlow-8;
+#X text 646 451 Motion detection;
+#X text 646 426 Advanced video effects;
diff --git a/externals/gridflow/doc/tutorials/grid-intro.pd b/externals/gridflow/doc/tutorials/grid-intro.pd
new file mode 100644
index 00000000..fdbfdbbf
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/grid-intro.pd
@@ -0,0 +1,10 @@
+#N canvas 0 0 476 213 10;
+#X text 29 30 GridFlow is a plug-in for PureData that introduces the
+grid (#) data type into the PD environment. GridFlow allows you to
+work with live video \, still images and video files in a rel-time
+environment.;
+#X text 32 97 This section deals with the particular objects related
+to GridFlow. GridFlow uses the usual PD "control" objects \, as well
+as a set of GridFlow specific objects. Before we get into the tutorials
+we will explain the grid "#" \, the most important concept in GridFlow.
+;
diff --git a/externals/gridflow/doc/tutorials/pure-data-1.pd b/externals/gridflow/doc/tutorials/pure-data-1.pd
new file mode 100644
index 00000000..7be2a91a
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-1.pd
@@ -0,0 +1,71 @@
+#N canvas 221 110 894 498 10;
+#N canvas 0 22 450 300 this 0;
+#X obj 192 128 inlet;
+#X obj 192 171 outlet;
+#X text 8 7 If you're looking at this you're just going to confuse
+yourself!;
+#X connect 0 0 1 0;
+#X restore 499 380 pd this is an object;
+#X text 509 358 <- This is a connection;
+#X msg 499 319 10;
+#X text 13 348 Objects are like filters \, they change the way messages
+flow through them.;
+#X text 13 153 You can think of a patch as plumbing. The way water
+flows through the plumbing of your house \, messages flow through the
+connections in your patch. Objects change the flow of the messages
+to allow different things to happen. Messages always go into objects
+at the top \, called the inlet \, and always come out at the bottom
+\, called the outlet. In PD messages flow from top to bottom.;
+#X text 458 236 This is a very simple example of a patch \, the message
+"10" can be sent through the "pd this is an object" and can be seen
+being passed out the outlet.;
+#X floatatom 499 416 5 0 0 0 - - -;
+#X text 539 415 <- This number box shows the float message;
+#X text 553 334 and watch the output!;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 13 252 You can work with PD in two ways \, the first is in
+"edit mode". Edit-mode is where you create your patch by adding objects
+and the connections between them. "Run mode" is when you're done with
+the construction of your patch \, and you wish to send messages through
+it. In run-mode your cursor is an arrow (as it is right now since we
+are in run-mode) \, in edit-mode your cursor is a pointing hand.;
+#X text 458 136 Messages are what allow objects to communicate with
+one and other. Messages can change the way an object acts \, and/or
+express the work the object is doing. Messages come in different types.
+They can contain words \, numbers and groups of these. The main types
+of messages we will be dealing with are floats (numbers). You can click
+on a message \, when in run-mode \, to send it through your patch.
+;
+#X obj 448 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 448 290 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 8 447 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 449 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#X text 12 20 DESCRIPTION: What is a patch? An object? A message?;
+#N canvas 0 22 466 316 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: metaphor object message GUI introduction;
+#X restore 16 453 pd META;
+#X text 457 67 GUI objects allow you to interact with your PD patch
+as it is running. They allow you to change what your patch is doing
+without reconnecting the objects. The simplest GUI object is the "Message"
+that simply contains a message you want to send in your patch.;
+#X text 453 290 A patch that connects a GUI to an object to a second
+GUI.;
+#X text 531 320 <- This GUI sends a float message (click on it);
+#X text 13 66 When working with PD you are dealing primarily with objects
+\, GUI (Graphical User Interface) objects \, connections and messages.
+These are the building blocks of PD programming. When you connect objects
+\, GUI objects \, and messages you are creating a "patch". Patching
+is making something complex out of smaller building blocks.;
+#X text 13 46 The "patch" \, "objects" and "connections";
+#X text 453 46 "GUI objects" and "messages";
+#X text 12 8 1 Introduction to Pure-Data & its Metaphors;
+#X connect 0 0 6 0;
+#X connect 2 0 0 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-2.pd b/externals/gridflow/doc/tutorials/pure-data-2.pd
new file mode 100644
index 00000000..151af26f
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-2.pd
@@ -0,0 +1,73 @@
+#N canvas 197 100 899 548 10;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 448 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 8 497 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 499 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 470 320 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: GUI slider toggle number message introduction
+;
+#X restore 16 503 pd META;
+#X text 12 20 DESCRIPTION: Message \, slider \, toggle \, bang and
+number;
+#X msg 93 145 hello world;
+#X obj 93 168 print;
+#X text 181 146 <- Click on this message;
+#X text 18 74 Messages control the behavior of objects and it is the
+objects that change what a patch does. The first object we're going
+to learn is "print". All "print" does is print out the messages you
+send it to the terminal:;
+#X text 19 197 TIP: If you forget what an object does you can always
+double-click (on a mac) or right-click (on a PC) and then choose "help".
+;
+#X text 19 250 In this tutorial we will use two different types of
+objects: "objects" (of which "print" is an example) and GUI objects
+\, (of which "message" is an example). GUI objects allow you to interact
+with your patch \, control PD and change parameters of objects. We
+are going to learn four types of GUI objects (but there are many more):
+Slider \, Toggle \, Bang \, and Number.;
+#X obj 76 355 hsl 300 30 0 127 0 0 empty empty This_is_a_HSlider_(Horizontal)
+10 15 1 10 -262144 -1 -1 0 1;
+#X obj 73 393 print;
+#X text 21 421 This "hslider" is connected to the print object. This
+way we can see what messages the "hslider" sends. Try clicking and
+dragging in the Slider. You can change the scale (and other properties)
+of some GUI Objects by double-clicking (mac) or right-clicking (pc)
+and choosing "properties".;
+#X text 13 46 The "message" and "hslider" GUI Objects:;
+#X text 453 46 "toggle" \, "bang" \, "number";
+#X obj 519 176 tgl 30 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 629 176 bng 30 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 629 210 print Bang;
+#X obj 519 210 print Toggle;
+#X obj 739 210 print Number;
+#X floatatom 739 192 5 0 0 0 - - -;
+#X text 466 76 "slider" \, "toggle" and "number" all send messages
+made up of floats (numbers). "bang" is a special case and it only sends
+the message "bang". Below we're using an argument to the print object
+that tags each message sent to the terminal. This way when we have
+multiple "print" objects in one patch we can differenciate thier output.
+;
+#X text 465 268 "toggle" sends the message "1" or "0" \, "bang" always
+sends "bang" and if you click and drag on the "number" you can see
+it acts a lot like a Slider. With "number" you can also click once
+\, and then type a number to send.;
+#X text 467 335 TIP: You can send floating point numbers by holding
+down the SHIFT key as you click and drag on the "number".;
+#X text 467 375 There are other types of GUI objects not covered here.
+See the guis-about.pd PDDP patch:;
+#X text 12 8 2 PD Introduction - Some Useful GUI Objects in Pure-Data
+;
+#X connect 7 0 8 0;
+#X connect 13 0 14 0;
+#X connect 18 0 21 0;
+#X connect 19 0 20 0;
+#X connect 23 0 22 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-3.pd b/externals/gridflow/doc/tutorials/pure-data-3.pd
new file mode 100644
index 00000000..729b2dc7
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-3.pd
@@ -0,0 +1,70 @@
+#N canvas 261 121 900 544 10;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 448 366 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 8 497 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 499 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 474 324 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: patch first connecting placing place connect
+;
+#X restore 16 503 pd META;
+#X text 12 20 DESCRIPTION: Using PD to create your first patch;
+#X text 13 46 Adding Objects:;
+#X text 19 75 In order to create a patch you need to first place objects
+and GUI objects \, and second make connections between these objects.
+To place an object you need to be in "edit-mode". You should now be
+in run mode \, so please go to the "Edit" pull-down menu and choose
+"Edit mode" at the bottom. You should see your cursor change from an
+arrow to a pointing hand.;
+#X text 19 175 SHORTCUT: You can press "Control" and "e" simultaneously
+in order to toggle (switch) between edit and Run modes.;
+#X obj 448 386 cnv 15 430 100 empty empty empty 20 12 0 14 -233017
+-66577 0;
+#X floatatom 506 406 5 0 0 0 - - -;
+#X text 19 355 SHORTCUT: You can press "Control" and "3" simultaneously
+in order to place a number. All shortcuts are listed next to the items
+in the "Put" menu.;
+#X text 453 366 Patch work area:;
+#X text 19 215 Once you are in "edit-mode" you are now free to place
+objects. To place an object go to the "Put" pull-down menu and choose
+"Number". Once you have chosen this menu item you will see that a "number"
+gui is attached to your mouse pointer. In order to place the number
+into the patch move your pointer to the grey area to the right (in
+the "Patch work area" -> Click once to release it from your mouse.
+Note that the number is coloured blue. The blue colour shows that an
+item in your patch is selected. To unselect any item simply click once
+on the blank (white) space between items.;
+#X obj 520 440 print;
+#X obj 448 156 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 453 156 Connecting Objects:;
+#X text 19 411 Next we're going to place the familar "print" object
+beneath the "number" GUI. Press "Control" and "1" to place an object
+box. Again the object gets attached to your mouse and again click once
+to place it in the patch area somewhere under the "number".;
+#X text 459 41 While the number box is still selected (coloured blue)
+you can see a flashing cursor. Type the word "print" into the object
+box. The object will retain a dashed line while you type. In order
+to create the object you simply need to unselect \, by clicking somewhere
+outside the object. Note that once you have clicked to create the object
+the dashed line turns solid and an inlet (small rectangle) gets drawn
+around the word "print". The objects have now been created!;
+#X text 459 185 All connections between objects in PD are created from
+outlet to inlet (top to bottom). To start making a connection move
+your hand-pointer over the outlet of the "number" gui. When over the
+outlet your pointer will change to a circle. When you see the circle
+press and hold the mouse button. As you drag (holding the mouse button
+down) the pointer you see a line being drawn from the outlet to your
+pointer. To attach this connection to another object drag your mouse
+to an inlet of another object. The pointer will again change to a circle
+and at this point you can release the mouse button. Once released the
+objects are now connected! To play with your patch go back into run-mode
+and click and drag on the number-box while watching the terminal.;
+#X text 12 8 3 PD Introduction - Creating your first patch;
+#X connect 11 0 15 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-4.pd b/externals/gridflow/doc/tutorials/pure-data-4.pd
new file mode 100644
index 00000000..4d38f41d
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-4.pd
@@ -0,0 +1,87 @@
+#N canvas 183 61 890 531 10;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 96 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 8 487 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 489 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 478 328 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: metro counter random;
+#X restore 16 493 pd META;
+#X text 12 20 DESCRIPTION: Learning "metro" \, "counter" & "random"
+;
+#X text 13 96 Using the "metro" object:;
+#X text 21 47 In this section we will learn three new objects \, "metro"
+\, "counter" \, and "random". Metro sends a bang at regular intervals
+\, just like a metronome.;
+#X obj 164 142 metro 250;
+#X obj 164 123 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 164 163 bng 15 100 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 222 123 5 0 0 0 - - -;
+#X text 21 187 You can turn a Metro on and off by sending it a "1"
+or "0" message. Because a toggle sends 0/1 messages \, we can simply
+connect it directly. Metro also accepts an argument (words or numbers
+wirtten after the object name). This argument is how fast the metro
+should send out bangs (in milliseconds). You can always change the
+speed of the metro by sending it number messages through the rightmost
+inlet.;
+#X obj 8 306 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 13 306 Using the "random" object:;
+#X text 21 277 For more info see the metro-help.pd patch.;
+#X obj 168 385 bng 15 100 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 168 425 print;
+#X obj 168 404 random 100;
+#X floatatom 233 385 5 0 0 0 - - -;
+#X text 20 327 The Random object returns a number between 0 and the
+(number) argument when it receives a bang message in the leftmost inlet.
+You can also change the upper limit by sending a message to the rightmost
+inlet.;
+#X obj 448 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 453 46 Using the "random" object:;
+#X obj 559 154 bng 15 100 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 590 154 3 1 3 0 - - -;
+#X floatatom 621 174 3 0 0 0 - - -;
+#X floatatom 652 194 3 0 0 0 - - -;
+#X obj 652 234 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 559 234 8 0 0 0 - - -;
+#X obj 559 213 counter 0 10 1;
+#X text 21 447 For more info see the random-help.pd patch.;
+#X text 461 77 "counter" is simply an object that counts. It can count
+up \, count down and count up and then down. Where it starts and where
+it stops are all definable. This is the counter that in included with
+Gem \, it is not compatible with other counter objects.;
+#X text 461 274 The first argument for counter is the lower limit (number
+to start counting at). The second is the upper limit to count to. The
+third argument is the direction in which to count. "1" means forward
+\, "2" means backward and "3" means forward and then backward. You
+can also use the three rightmost inlets to change the behaviour of
+counter. The rightmost inlet is the upper limit \, the second right-most
+the lower limit \, and the third right-most as the direction. The rightmost
+outlet sends out a bang message when the counter loops.;
+#X text 681 193 Rightmost inlet;
+#X text 651 173 Second Rightmost inlet;
+#X text 621 153 Third Rightmost inlet;
+#X text 461 407 For more info see the counter-help.pd patch.;
+#X text 12 8 4 Introduction to PD - More objects;
+#X connect 8 0 10 0;
+#X connect 9 0 8 0;
+#X connect 11 0 8 1;
+#X connect 16 0 18 0;
+#X connect 18 0 17 0;
+#X connect 19 0 18 1;
+#X connect 23 0 29 0;
+#X connect 24 0 29 1;
+#X connect 25 0 29 2;
+#X connect 26 0 29 3;
+#X connect 29 0 28 0;
+#X connect 29 1 27 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-5.pd b/externals/gridflow/doc/tutorials/pure-data-5.pd
new file mode 100644
index 00000000..dc357bb1
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-5.pd
@@ -0,0 +1,108 @@
+#N canvas -235 0 891 673 10;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 8 627 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 629 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 482 332 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: send receive netsend netreceive cordless communication
+network TCP/IP UDP internet;
+#X restore 16 633 pd META;
+#X obj 448 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 12 20 DESCRIPTION: Communicating between objects w/out connections
+;
+#X text 13 46 "send" & "receive";
+#X obj 86 223 send invisible-link;
+#X obj 86 248 receive invisible-link;
+#X floatatom 86 273 5 0 0 0 - - -;
+#X msg 86 198 10;
+#X floatatom 266 273 5 0 0 0 - - -;
+#X floatatom 266 203 5 0 0 0 - - -;
+#X obj 266 223 s invisible-link2;
+#X obj 266 248 r invisible-link2;
+#X obj 102 483 r send-from-number;
+#X floatatom 102 508 5 0 0 0 - - -;
+#X floatatom 102 462 5 0 0 0 - - send-from-number;
+#X floatatom 242 462 5 0 0 0 - - -;
+#X obj 242 483 s send-to-number2;
+#X floatatom 242 508 5 0 0 0 - send-to-number2 -;
+#X text 19 385 Note: Many GUI objects have built-in send and receive
+objects. The tag names are specified in the GUI properties. Remeber
+to get the GUI properties Right-Click or Control-Click on the GUI object
+and select "Properties".;
+#X text 453 46 "netsend" & "netreceive";
+#X text 19 575 For more info see: send-help.pd \, receive-help.pd \,
+netsend-help.pd and netreceive-help.pd;
+#X text 459 75 While "send" and "receive" allow you to send messages
+without connecting objects with patch-cords "netsend" and "netreceive"
+do the same but communicate between objects using TCP/IP the internet
+protocol. This means that you can send messages from a patch running
+on one machine to a second patch running on a second machine on the
+same network \, or even over the internet.;
+#X text 19 545 You can also send messages using UDP rather than TCP/IP.
+See "more info" below for details.;
+#X obj 589 292 netreceive 8001;
+#X text 459 185 The first argument of "netreceive" is the port the
+netrecive should listen on. "netsend" can connect to this port from
+other machines. "netreceive" has two outlets. The first outlet sends
+out the messages it receives over network \, and the second argument
+send a "1" when netsend is connected and "0" when netsend disconnects.
+;
+#X obj 589 318 print;
+#X obj 689 318 tgl 16 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 503 563 netsend;
+#X text 459 355 "netsend" is controlled using three messages: "connect"
+\, "disconnect" and "send". "connect" has two arguments \, the host
+or IP and the port number you wish to connect to. There needs to be
+a "netreceive" listening on the port you connect to. "disconnect" drops
+the current connection. "send" sends any arguments to the "netreceive"
+over the network. The single outlet of "netsend" prints "1" when a
+connection is made and "0" when the connection is lost.;
+#X obj 503 586 tgl 16 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X msg 503 486 connect localhost 8001;
+#X msg 516 511 disconnect;
+#X msg 525 537 send hello from the internet;
+#X text 602 510 Close connection;
+#X text 673 486 Connect to this machine;
+#X text 733 536 Send message;
+#X text 19 75 In some cases you will want to send messages without
+connecting objects. You may be sending one message to many different
+places that would make connections too laborious. "send" and "receive"
+both have a single argument. This argument is the tag name for the
+communication. "send" will always send any messages it gets in it inlet
+to any number of "receive" objects in a patch with the same tag name.
+"s" and "r" can be used in the place of "send" and "receive".;
+#X obj 86 336 s broadcast;
+#X floatatom 86 317 5 0 0 0 - - -;
+#X obj 176 316 r broadcast;
+#X floatatom 176 339 5 0 0 0 - - -;
+#X obj 266 316 r broadcast;
+#X floatatom 266 339 5 0 0 0 - - -;
+#X text 12 8 5 Intermediate Pure-Data - send and receive;
+#X msg 585 598 send \$1;
+#X floatatom 584 567 5 0 0 0 - - -;
+#X text 651 596 send variables to another computer;
+#X connect 9 0 10 0;
+#X connect 11 0 8 0;
+#X connect 13 0 14 0;
+#X connect 15 0 12 0;
+#X connect 16 0 17 0;
+#X connect 19 0 20 0;
+#X connect 27 0 29 0;
+#X connect 27 1 30 0;
+#X connect 31 0 33 0;
+#X connect 34 0 31 0;
+#X connect 35 0 31 0;
+#X connect 36 0 31 0;
+#X connect 42 0 41 0;
+#X connect 43 0 44 0;
+#X connect 45 0 46 0;
+#X connect 48 0 31 0;
+#X connect 49 0 48 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-6.pd b/externals/gridflow/doc/tutorials/pure-data-6.pd
new file mode 100644
index 00000000..01e6dcd7
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-6.pd
@@ -0,0 +1,92 @@
+#N canvas 304 98 891 675 10;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 627 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 629 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 486 336 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: message comma semicolon dollersign receive
+list;
+#X restore 16 633 pd META;
+#X text 12 20 DESCRIPTION: Advanced uses for the message object;
+#X text 19 45 In Pure-Data there are two distinct concepts with the
+name "message". Messages are the data that gets send in PD from object
+to object. There is also the Messsage object that contains a message
+you want to send. The message object is the first GUI object we covered
+in this tutorial. The message is not the only way to send messages
+in a patch \, since all GUI objects also send messages. So what makes
+the message object different? The message object can sent messages
+of any type \, where a number for example can only send float (number)
+messages. There are a number of powerful features in the message object.
+We are familar with the "usual" way of using the message object:;
+#X msg 163 208 hello;
+#X msg 212 208 bye;
+#X obj 196 238 print messages;
+#X text 459 556 Note: It is a very common mistake to confuse the message
+object with an object box. The object box is framed in a rectangle.
+The message object has a notch removed from the right edge.;
+#X obj 106 385 print messages;
+#X msg 106 358 hello \, bye;
+#X text 19 305 You can send multiple messages in succession from a
+single message box by using a comma " \, " between the messages. The
+messages get send from left to right.;
+#X obj 8 276 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X obj 8 416 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 13 416 Semicolon in message boxes;
+#X text 13 276 Comma in message boxes;
+#X text 19 445 Just like you can specify receive tags directly in GUI
+objects you can also use a message box to send a message directly to
+a particular "receive".;
+#X obj 34 536 r myreceive;
+#X floatatom 34 560 5 0 0 0 - - -;
+#X text 189 360 Click to send both messages;
+#X text 136 502 send "10" to receive tag "myreceive";
+#X text 19 585 For more info see: message-help.pd 04.messages.pd 10.more.messages.pd
+;
+#X msg 34 498 \; myreceive 10;
+#X obj 448 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 453 46 Dollarsign in message boxes;
+#X msg 534 175 \$1 \$1 \$1;
+#X msg 534 154 10;
+#X text 459 75 In messages there are placeholders that start with "$".
+These placeholders are variables that get replaced with messages you
+send to the message box. In the example below we have a single message
+"10". Each "$1" in the message box gets replaced with the message "10".
+;
+#X text 601 175 \$1 placeholder gets replaced;
+#X text 570 154 message sent to message box;
+#X msg 534 304 list 1 2;
+#X text 600 304 a list with items "1" and "2";
+#X msg 534 325 \$2 \$1;
+#X text 584 325 \$1 becomes "1" and \$2 becomes "2";
+#X obj 534 347 print reverse-list;
+#X text 459 235 The "$1" placeholder refers to the first element of
+the list the message box gets from its inlet. We can use this to use
+a message box to reverse the order of elements (called atoms) in a
+list.;
+#X text 459 385 In this case the list "1 2" has two elements (called
+atoms) when this list gets sent to the inlet of a message box its atoms
+are available to the message box through the $ variables. \$1 gets
+replaced with the first element \, \$2 the second and so on.;
+#X obj 534 197 print repeated-message;
+#X obj 480 511 print complex-message;
+#X msg 480 468 list Fred Marcus;
+#X text 607 468 a list with two symbol atoms;
+#X msg 480 489 Hi \$1. \, Ya know \$2?;
+#X text 623 489 Becomes: "Hi Fred \, Ya know Marcus?";
+#X text 12 8 6 Intermediate Pure-Data - Using the message object;
+#X connect 6 0 8 0;
+#X connect 7 0 8 0;
+#X connect 11 0 10 0;
+#X connect 18 0 19 0;
+#X connect 26 0 38 0;
+#X connect 27 0 26 0;
+#X connect 31 0 33 0;
+#X connect 33 0 35 0;
+#X connect 40 0 42 0;
+#X connect 42 0 39 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-7.pd b/externals/gridflow/doc/tutorials/pure-data-7.pd
new file mode 100644
index 00000000..0d8360ec
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-7.pd
@@ -0,0 +1,106 @@
+#N canvas 280 89 936 678 10;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 627 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 629 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 482 332 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: send receive netsend netreceive cordless communication
+network TCP/IP UDP internet;
+#X restore 16 633 pd META;
+#X obj 8 266 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 13 266 "pack" object;
+#X msg 96 543 2;
+#X msg 45 521 1;
+#X obj 45 588 print mylist;
+#X text 12 20 DESCRIPTION: Using pack \, unpack and route with lists
+;
+#X text 19 75 In the Pure-Data introduction we discussed the three
+different types of data in PD. These are floats (numbers) \, symbols
+(words) and lists (groups of floats and words). Floats and symbols
+are known as atoms. Atoms are single elements \, they do not contain
+spaces or other special characters. Atoms can be grouped into lists.
+;
+#X obj 8 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 13 46 What is a list?;
+#X msg 145 216 list one two three;
+#X obj 145 239 print this is a list;
+#X text 19 155 Lists can be created in a number of ways \, but we are
+going to cover the two most common ways of creating lists. The most
+simple way to create a list is to type the list into a message box
+starting with the word (symbol) "list":;
+#X text 19 295 The "pack" object is the second most common way to create
+a list. "pack" allows you to take individual atoms and combine them
+into a single list. "pack" accepts a number of arguments. Each argument
+defines the type of atom in the resulting list. The "f" argument creates
+an inlet that accepts float atoms. The "s" argument creates an inlet
+accepts symbol atoms. The number of arguments is the same as the number
+of elements in the resultant list.;
+#X text 19 405 "pack" is the first object we are going to learn that
+has a "cold" inlet. Some control objects in PD have "hot" and "cold"
+inlets. When you send a message to a "cold" inlet the object does not
+generate any output (it does not send any messages). When "hot" inlets
+get messages then the object does generate output. The leftmost inlet
+is always the "hot" inlet and all other inlets are "cold" or in some
+cases all inlets are "hot";
+#X text 75 521 sets the first atom "1" and then sends the list;
+#X text 132 543 sets the second atom "2";
+#X obj 45 566 pack f f;
+#X text 459 45 Note that if you do not set the second and onwards atoms
+via thier "cold" inlets and you generate the list by setting the first
+atom via the "hot" inlet then all float atoms will be set to "0" and
+all symbol atoms will be set to "symbol" in the resultant list.;
+#X obj 448 126 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 453 126 "unpack" object;
+#X obj 596 241 unpack f f f;
+#X msg 596 219 list 1 2 3;
+#X floatatom 596 294 5 0 0 0 - - -;
+#X floatatom 635 277 5 0 0 0 - - -;
+#X floatatom 675 262 5 0 0 0 - - -;
+#X text 639 293 First Atom;
+#X text 678 277 Second Atom;
+#X text 718 261 Third Atom;
+#X text 459 156 The "unpack" object is very similar to the "pack" object
+except it works in reverse. "unpack" takes a list and splits it up
+into a number of atoms. It uses the same arguments as "pack" but generates
+outlets rather than inlets.;
+#X obj 448 319 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 453 319 "route" object;
+#X text 459 349 The "route" object sorts lists based on the first atom
+of the list. It as a number of float or symbol arguments. For each
+argument "route" creates one outlet. "route" also creates one additional
+rightmost outlet for rejections. For each list route gets it compares
+the first atom to all its arguments. If the first atom matches one
+of the arguments it the rest of the list \, without the first atom
+\, gets send through the outlet corresponding to that argument. If
+the first atom of the list does not match any arguments the entire
+list \, including the first atom \, gets sent out the rejection outlet.
+;
+#X msg 688 493 rejection 1;
+#X obj 685 553 print rejection;
+#X msg 538 493 o1 2;
+#X msg 613 493 o2 3;
+#X obj 613 531 route o1 o2;
+#X obj 613 593 print o1;
+#X obj 649 573 print o2;
+#X text 12 8 7 Intermediate Pure-Data - Working with lists;
+#X connect 6 0 20 1;
+#X connect 7 0 20 0;
+#X connect 13 0 14 0;
+#X connect 20 0 8 0;
+#X connect 24 0 26 0;
+#X connect 24 1 27 0;
+#X connect 24 2 28 0;
+#X connect 25 0 24 0;
+#X connect 36 0 40 0;
+#X connect 38 0 40 0;
+#X connect 39 0 40 0;
+#X connect 40 0 41 0;
+#X connect 40 1 42 0;
+#X connect 40 2 37 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-8.pd b/externals/gridflow/doc/tutorials/pure-data-8.pd
new file mode 100644
index 00000000..aa95c087
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-8.pd
@@ -0,0 +1,89 @@
+#N canvas 238 94 891 621 10;
+#X obj 8 6 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 577 cnv 15 870 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 668 579 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 482 332 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: send receive netsend netreceive cordless communication
+network TCP/IP UDP internet;
+#X restore 16 583 pd META;
+#X obj 8 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 12 20 DESCRIPTION: nested patches using abstractions & subpatches
+;
+#X text 13 46 What is an abstraction?;
+#X text 23 76 Since objects are very simple in Pure-Data doing complex
+tasks often leads to very complex patches. Often it is useful to use
+the same bit of patching you do for one project for another. Pure-Data
+has a facility to "nest" \, that is to take a number of objects in
+a collection and place them into a group that looks like a single object.
+This is also handy to make a complex patch look simple and clear by
+hiding the nitty-gritty details. There are two types of these collections
+\, the subpatch and the abstraction.;
+#X obj 8 216 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 13 216 The subpatch;
+#X text 23 246 Subpatches are collections of objects that get "hidden"
+inside a container that looks like a normal PD object. Subpatches are
+created by creating an object box \, and typing the word "pd" followed
+by whatever you want to describe the contents of the subpatch. Subpatches
+are saved at the same time as the "parent" patch. Here is a subpatch:
+;
+#N canvas 0 22 460 310 subpatch 0;
+#X obj 30 34 inlet;
+#X obj 30 77 outlet;
+#X text 99 35 This is inside the subpatch.;
+#X connect 0 0 1 0;
+#X restore 178 359 pd subpatch;
+#X floatatom 178 336 5 0 0 0 - - -;
+#X floatatom 178 387 5 0 0 0 - - -;
+#X text 23 416 To open a subpatch simply click once on the subpatch
+in run-mode or control-click (or right-click) and select open in edit-mode.
+Both subpatches and abstractions communicate with the parent patch
+through special objects called "inlet" and "outlet" for each "inlet"
+in a subpatch or abstraction an inlet is created on the subpatch. This
+example has one inlet and one outlet.;
+#X obj 448 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 453 46 The abstraction;
+#X text 463 76 Abstractions are very similar to subpatches. They are
+collections of objects that are "hidden" inside PD objects \, and they
+both use "inlet" and "outlet" objects to communicate with the parent
+patch. The difference between subpatches and abstractions is that abstractions
+are saved in a separate file from the parent. This means when you save
+the parent patch containing abstractions the abstractions are not saved.
+The abstractions are saved as separate files so that they can be used
+in multiple patches. A second feature that exists in abstractions and
+not in subpatches is the ability to use arguments. "send" and "receive"
+can be used inside abstractions to send data without connections (patch-cords).
+;
+#X obj 682 253 r output;
+#X obj 682 277 print;
+#X obj 564 253 abstraction 1 2;
+#X text 463 316 To create an abstraction all you need to do is create
+a new PD patch ("File" -> "New"). Create the contents of the abstraction
+and then save it in the same directory as the patch you want to use
+it in. In this case the abstraction is saved as "abstraction.pd". Once
+saved you can easily embed the abstraction simply by typing its name
+\, without the .pd extension \, into an object box.;
+#X obj 448 416 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 453 416 Dollarsign in object boxes;
+#X text 463 446 If you open the above example you will see that the
+familiar "pack" object has a number of "$" arguments. The "$" arguments
+in a object box differ entirely from the "$" used in message objects.
+When you use a "$" in an object box inside an abstraction the values
+get replaced with the arguments to that abstraction. In the case above
+the "pack" object's first argument "$1" gets replaced with the first
+argument of the abstraction "1" "$2" gets replaced with the second
+argument "2".;
+#X text 23 536 For more info see: 12.PART2.subpatch.pd 14.dollersign.pd
+;
+#X text 12 8 8 Intermediate Pure-Data - Using abstractions and subpacthes
+;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 18 0 19 0;
diff --git a/externals/gridflow/doc/tutorials/pure-data-9.pd b/externals/gridflow/doc/tutorials/pure-data-9.pd
new file mode 100644
index 00000000..e5188ee0
--- /dev/null
+++ b/externals/gridflow/doc/tutorials/pure-data-9.pd
@@ -0,0 +1,43 @@
+#N canvas 291 108 450 562 10;
+#X obj 8 6 cnv 15 430 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 8 517 cnv 15 430 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 228 519 Copyright Ben Bogart 2005 \; (See COPYING.TXT for details)
+;
+#N canvas 0 22 486 336 META 0;
+#X text 12 5 CATEGORY: tutorial;
+#X text 12 15 KEYWORDS: GOP graph parent abstraction nesting ui interface
+;
+#X restore 16 523 pd META;
+#X obj 8 46 cnv 15 430 15 empty empty empty 20 12 0 14 -179884 -66577
+0;
+#X text 12 20 DESCRIPTION: Using Graph on Parent abstractions;
+#X text 13 46 What is Graph on Parent?;
+#X text 13 76 Graph on Parent is a feature of PD that allows you to
+show the GUI objects contained in an abstraction on the parent patch.
+This means that you can create abstractions that not only include a
+collection of objects but can also include a user interface. To use
+graph on parent you simply need to create an abstraction the usual
+way but before saving it you need should Control-Click (Right-Click)
+on the background (white area) in the abstraction and choose "properties".
+From the properties menu check the "graph on parent" option. Now when
+you save the patch and embed it in a second patch all GUI objects will
+be visible.;
+#X obj 154 250 gop_abstraction;
+#X text 13 331 In this simple example there is only one GUI object
+\, a slider. Inside the abstraction the slider is connected to an inlet
+and an outlet. If you move the slider you can see the result in the
+outlet. If you set a value in the inlet with the number GUI you can
+see the position of the slider change.;
+#X floatatom 154 231 5 0 0 0 - - -;
+#X floatatom 154 297 5 0 0 0 - - -;
+#X text 13 421 Note you can change the size of the abstractions bounding
+box by Control-Click (Right-Click) on the abstraction and choose "properties".
+The size of the bounding-box is specified by the "screen width" and
+"screen height".;
+#X text 13 487 For more info see:;
+#X text 12 8 9 Intermediate Pure-Data - Using GUI's in abstractions
+;
+#X connect 8 0 11 0;
+#X connect 10 0 8 0;