aboutsummaryrefslogtreecommitdiff
path: root/externals/gridflow/doc
diff options
context:
space:
mode:
Diffstat (limited to 'externals/gridflow/doc')
-rw-r--r--externals/gridflow/doc/Makefile7
-rw-r--r--externals/gridflow/doc/about.pd31
-rw-r--r--externals/gridflow/doc/find_missing.rb40
-rw-r--r--externals/gridflow/doc/flow_classes/#-help.pd55
-rw-r--r--externals/gridflow/doc/flow_classes/#apply_colormap_channelwise-help.pd55
-rw-r--r--externals/gridflow/doc/flow_classes/#background_model-help.pd90
-rw-r--r--externals/gridflow/doc/flow_classes/#border-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/#camera-help.pd49
-rw-r--r--externals/gridflow/doc/flow_classes/#cast-help.pd67
-rw-r--r--externals/gridflow/doc/flow_classes/#centroid-help.pd29
-rw-r--r--externals/gridflow/doc/flow_classes/#change-help.pd35
-rw-r--r--externals/gridflow/doc/flow_classes/#checkers-help.pd26
-rw-r--r--externals/gridflow/doc/flow_classes/#clip-help.pd70
-rw-r--r--externals/gridflow/doc/flow_classes/#cluster_avg-help.pd22
-rw-r--r--externals/gridflow/doc/flow_classes/#color-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/#contrast-help.pd72
-rw-r--r--externals/gridflow/doc/flow_classes/#convolve-help.pd67
-rw-r--r--externals/gridflow/doc/flow_classes/#dim-help.pd39
-rw-r--r--externals/gridflow/doc/flow_classes/#downscale_by-help.pd63
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_hpgl-help.pd35
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_image-help.pd102
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_points-help.pd56
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_polygon-help.pd116
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_rect-help.pd40
-rw-r--r--externals/gridflow/doc/flow_classes/#draw_slider-help.pd56
-rw-r--r--externals/gridflow/doc/flow_classes/#edit_polygon-help.pd42
-rw-r--r--externals/gridflow/doc/flow_classes/#extract_diagonal-help.pd32
-rw-r--r--externals/gridflow/doc/flow_classes/#fade-help.pd57
-rw-r--r--externals/gridflow/doc/flow_classes/#fade_lin-help.pd36
-rw-r--r--externals/gridflow/doc/flow_classes/#fastblur-help.pd90
-rw-r--r--externals/gridflow/doc/flow_classes/#fft-help.pd73
-rw-r--r--externals/gridflow/doc/flow_classes/#finished-help.pd54
-rw-r--r--externals/gridflow/doc/flow_classes/#fold-help.pd80
-rw-r--r--externals/gridflow/doc/flow_classes/#for-help.pd83
-rw-r--r--externals/gridflow/doc/flow_classes/#from_pix-help.pd89
-rw-r--r--externals/gridflow/doc/flow_classes/#gamma-help.pd29
-rw-r--r--externals/gridflow/doc/flow_classes/#grade-help.pd45
-rw-r--r--externals/gridflow/doc/flow_classes/#greyscale_to_rgb-help.pd26
-rw-r--r--externals/gridflow/doc/flow_classes/#hello-help.pd23
-rw-r--r--externals/gridflow/doc/flow_classes/#hueshift-help.pd20
-rw-r--r--externals/gridflow/doc/flow_classes/#import-help.pd88
-rw-r--r--externals/gridflow/doc/flow_classes/#in-help.pd236
-rw-r--r--externals/gridflow/doc/flow_classes/#inner-help.pd56
-rw-r--r--externals/gridflow/doc/flow_classes/#io.aalib-help.pd45
-rw-r--r--externals/gridflow/doc/flow_classes/#io.grid-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/#io.jpeg-help.pd16
-rw-r--r--externals/gridflow/doc/flow_classes/#io.png-help.pd18
-rw-r--r--externals/gridflow/doc/flow_classes/#io.quicktime-help.pd69
-rw-r--r--externals/gridflow/doc/flow_classes/#io.videodev-help.pd77
-rw-r--r--externals/gridflow/doc/flow_classes/#io.x11-help.pd150
-rw-r--r--externals/gridflow/doc/flow_classes/#join-help.pd72
-rw-r--r--externals/gridflow/doc/flow_classes/#labelling-help.pd55
-rw-r--r--externals/gridflow/doc/flow_classes/#layer-help.pd47
-rw-r--r--externals/gridflow/doc/flow_classes/#line_to_polygon-help.pd40
-rw-r--r--externals/gridflow/doc/flow_classes/#make_arrow-help.pd20
-rw-r--r--externals/gridflow/doc/flow_classes/#make_cross-help.pd47
-rw-r--r--externals/gridflow/doc/flow_classes/#moment-help.pd164
-rw-r--r--externals/gridflow/doc/flow_classes/#moment_polar-help.pd25
-rw-r--r--externals/gridflow/doc/flow_classes/#motion_detection-help.pd83
-rw-r--r--externals/gridflow/doc/flow_classes/#mouse-help.pd99
-rw-r--r--externals/gridflow/doc/flow_classes/#noise_gate_yuvs-help.pd26
-rw-r--r--externals/gridflow/doc/flow_classes/#out-help.pd139
-rw-r--r--externals/gridflow/doc/flow_classes/#outer-help.pd105
-rw-r--r--externals/gridflow/doc/flow_classes/#pack-help.pd46
-rw-r--r--externals/gridflow/doc/flow_classes/#perspective-help.pd49
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_area-help.pd28
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_comparator-help.pd85
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_each_edge-help.pd22
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_moment-help.pd64
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_perimetre-help.pd23
-rw-r--r--externals/gridflow/doc/flow_classes/#polygon_radial_map-help.pd55
-rw-r--r--externals/gridflow/doc/flow_classes/#posterize-help.pd63
-rw-r--r--externals/gridflow/doc/flow_classes/#print-help.pd73
-rw-r--r--externals/gridflow/doc/flow_classes/#ravel-help.pd42
-rw-r--r--externals/gridflow/doc/flow_classes/#record-help.pd53
-rw-r--r--externals/gridflow/doc/flow_classes/#redim-help.pd59
-rw-r--r--externals/gridflow/doc/flow_classes/#reinterval-help.pd33
-rw-r--r--externals/gridflow/doc/flow_classes/#remap_image-help.pd53
-rw-r--r--externals/gridflow/doc/flow_classes/#reverse-help.pd65
-rw-r--r--externals/gridflow/doc/flow_classes/#rgb_to_greyscale-help.pd27
-rw-r--r--externals/gridflow/doc/flow_classes/#rgb_to_yuv-help.pd30
-rw-r--r--externals/gridflow/doc/flow_classes/#rotate-help.pd49
-rw-r--r--externals/gridflow/doc/flow_classes/#rotatificator-help.pd50
-rw-r--r--externals/gridflow/doc/flow_classes/#saturation-help.pd52
-rw-r--r--externals/gridflow/doc/flow_classes/#scale_by-help.pd57
-rw-r--r--externals/gridflow/doc/flow_classes/#scale_to-help.pd66
-rw-r--r--externals/gridflow/doc/flow_classes/#scan-help.pd48
-rw-r--r--externals/gridflow/doc/flow_classes/#seq_fold-help.pd55
-rw-r--r--externals/gridflow/doc/flow_classes/#slice-help.pd47
-rw-r--r--externals/gridflow/doc/flow_classes/#solarize-help.pd39
-rw-r--r--externals/gridflow/doc/flow_classes/#sort-help.pd45
-rw-r--r--externals/gridflow/doc/flow_classes/#spread-help.pd79
-rw-r--r--externals/gridflow/doc/flow_classes/#store-help.pd111
-rw-r--r--externals/gridflow/doc/flow_classes/#swap-help.pd25
-rw-r--r--externals/gridflow/doc/flow_classes/#t-help.pd58
-rw-r--r--externals/gridflow/doc/flow_classes/#text_to_image-help.pd24
-rw-r--r--externals/gridflow/doc/flow_classes/#to_float-help.pd29
-rw-r--r--externals/gridflow/doc/flow_classes/#to_list-help.pd31
-rw-r--r--externals/gridflow/doc/flow_classes/#to_literal-help.pd34
-rw-r--r--externals/gridflow/doc/flow_classes/#to_pix-help.pd107
-rw-r--r--externals/gridflow/doc/flow_classes/#to_symbol-help.pd52
-rw-r--r--externals/gridflow/doc/flow_classes/#transpose-help.pd37
-rw-r--r--externals/gridflow/doc/flow_classes/#type-help.pd26
-rw-r--r--externals/gridflow/doc/flow_classes/#unpack-help.pd28
-rw-r--r--externals/gridflow/doc/flow_classes/#window-help.pd33
-rw-r--r--externals/gridflow/doc/flow_classes/0x40complex_sq-help.pd52
-rw-r--r--externals/gridflow/doc/flow_classes/args-demo.pd27
-rw-r--r--externals/gridflow/doc/flow_classes/args-help.pd50
-rw-r--r--externals/gridflow/doc/flow_classes/ascii-help.pd25
-rw-r--r--externals/gridflow/doc/flow_classes/ascii_to_f-help.pd31
-rw-r--r--externals/gridflow/doc/flow_classes/cv/#CornerHarris-help.pd14
-rw-r--r--externals/gridflow/doc/flow_classes/cv/#Ellipse-help.pd24
-rw-r--r--externals/gridflow/doc/flow_classes/cv/#Invert-help.pd32
-rw-r--r--externals/gridflow/doc/flow_classes/cv/#KMeans-help.pd29
-rw-r--r--externals/gridflow/doc/flow_classes/cv/#SVD-help.pd44
-rw-r--r--externals/gridflow/doc/flow_classes/cv/#numop-help.pd60
-rw-r--r--externals/gridflow/doc/flow_classes/display-help.pd24
-rw-r--r--externals/gridflow/doc/flow_classes/doc_add-help.pd23
-rw-r--r--externals/gridflow/doc/flow_classes/doc_also-help.pd18
-rw-r--r--externals/gridflow/doc/flow_classes/doc_below-help.pd40
-rw-r--r--externals/gridflow/doc/flow_classes/doc_bottom-help.pd27
-rw-r--r--externals/gridflow/doc/flow_classes/doc_c-help.pd17
-rw-r--r--externals/gridflow/doc/flow_classes/doc_cc-help.pd15
-rw-r--r--externals/gridflow/doc/flow_classes/doc_editmode-help.pd16
-rw-r--r--externals/gridflow/doc/flow_classes/doc_exist-help.pd26
-rw-r--r--externals/gridflow/doc/flow_classes/doc_f-help.pd7
-rw-r--r--externals/gridflow/doc/flow_classes/doc_h-help.pd13
-rw-r--r--externals/gridflow/doc/flow_classes/doc_i-help.pd10
-rw-r--r--externals/gridflow/doc/flow_classes/doc_ii-help.pd15
-rw-r--r--externals/gridflow/doc/flow_classes/doc_layout-help.pd46
-rw-r--r--externals/gridflow/doc/flow_classes/doc_m-help.pd78
-rw-r--r--externals/gridflow/doc/flow_classes/doc_make-help.pd25
-rw-r--r--externals/gridflow/doc/flow_classes/doc_o-help.pd11
-rw-r--r--externals/gridflow/doc/flow_classes/doc_oo-help.pd15
-rw-r--r--externals/gridflow/doc/flow_classes/for-help.pd56
-rw-r--r--externals/gridflow/doc/flow_classes/foreach-help.pd19
-rw-r--r--externals/gridflow/doc/flow_classes/fps-help.pd71
-rw-r--r--externals/gridflow/doc/flow_classes/gf.oneshot-help.pd42
-rw-r--r--externals/gridflow/doc/flow_classes/hpgl_find_bbox-help.pd21
-rw-r--r--externals/gridflow/doc/flow_classes/hpgl_font_render-help.pd178
-rw-r--r--externals/gridflow/doc/flow_classes/hpgl_op-help.pd30
-rw-r--r--externals/gridflow/doc/flow_classes/hpgl_track_position-help.pd21
-rw-r--r--externals/gridflow/doc/flow_classes/interval_overlap-help.pd46
-rw-r--r--externals/gridflow/doc/flow_classes/inv0x2a-help.pd78
-rw-r--r--externals/gridflow/doc/flow_classes/inv0x2b-help.pd75
-rw-r--r--externals/gridflow/doc/flow_classes/list.==-help.pd23
-rw-r--r--externals/gridflow/doc/flow_classes/listappend-help.pd49
-rw-r--r--externals/gridflow/doc/flow_classes/listelement-help.pd39
-rw-r--r--externals/gridflow/doc/flow_classes/listfind-help.pd32
-rw-r--r--externals/gridflow/doc/flow_classes/listflatten-help.pd39
-rw-r--r--externals/gridflow/doc/flow_classes/listlength-help.pd41
-rw-r--r--externals/gridflow/doc/flow_classes/listprepend-help.pd51
-rw-r--r--externals/gridflow/doc/flow_classes/listread-help.pd40
-rw-r--r--externals/gridflow/doc/flow_classes/listreverse-help.pd13
-rw-r--r--externals/gridflow/doc/flow_classes/listsublist-help.pd60
-rw-r--r--externals/gridflow/doc/flow_classes/norecurse-help.pd16
-rw-r--r--externals/gridflow/doc/flow_classes/parallel_port-help.pd96
-rw-r--r--externals/gridflow/doc/flow_classes/pingpong-help.pd27
-rw-r--r--externals/gridflow/doc/flow_classes/plotter_control-help.pd79
-rw-r--r--externals/gridflow/doc/flow_classes/plotter_parser-help.pd116
-rw-r--r--externals/gridflow/doc/flow_classes/range-help.pd28
-rw-r--r--externals/gridflow/doc/flow_classes/receives-help.pd38
-rw-r--r--externals/gridflow/doc/flow_classes/route2-help.pd33
-rw-r--r--externals/gridflow/doc/flow_classes/seq_fold-help.pd46
-rw-r--r--externals/gridflow/doc/flow_classes/shunt-help.pd70
-rw-r--r--externals/gridflow/doc/flow_classes/systemtime-help.pd33
-rw-r--r--externals/gridflow/doc/flow_classes/tsctime-help.pd50
-rw-r--r--externals/gridflow/doc/flow_classes/unix_time-help.pd50
-rw-r--r--externals/gridflow/doc/flow_classes/usertime-help.pd33
-rw-r--r--externals/gridflow/doc/flow_classes/var.#-help.pd21
-rw-r--r--externals/gridflow/doc/index.pd329
-rw-r--r--externals/gridflow/doc/locale/english.tcl210
-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/stuff.txt144
-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
201 files changed, 11298 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/about.pd b/externals/gridflow/doc/about.pd
new file mode 100644
index 00000000..6ebb5ad4
--- /dev/null
+++ b/externals/gridflow/doc/about.pd
@@ -0,0 +1,31 @@
+#N canvas 0 0 627 494 10;
+#X obj 0 453 doc_f;
+#N canvas 0 0 743 313 (subpatch) 0;
+#X obj 3 3 cnv 15 608 18 empty \$0-rect empty 2 9 1 13 -1 -262144 0
+;
+#X obj 511 3 cnv 15 100 18 empty \$0-rect2 GridFlow 1.0 2 9 1 12
+-1 -262144 0;
+#X coords 0 -1 1 1 614 24 1 0 0;
+#X restore 0 9 pd;
+#X text 96 280 Development of GridFlow 0.3.0 - 0.5.0 was made possible
+in part by a grant from the HRDC (DRHC) to Artengine.;
+#X text 96 311 Development of... much of GridFlow 0.8.x and 0.9.0 was
+made possible in part by a grant from the CSHRC.;
+#X text 96 371 Development of GridFlow 0.9.0 was made possible in part
+by Alexandre Castonguay's cooking.;
+#X text 96 260 GridFlow is sponsored by Artengine.;
+#X text 96 73 C++ Programming : Mathieu Bouchard;
+#X text 96 100 Pd Programming (abstractions) : Mathieu Bouchard;
+#X text 96 160 Pd Help Files (former ones) and Tutorials : Darsha Hewitt
+\, Stephanie Brodeur \, Alexandre Castonguay;
+#X text 96 130 Pd Help Files (current ones) : Mathieu Bouchard \, Patrick
+Boivin;
+#X text 19 47 Credits;
+#X text 16 231 Sponsors;
+#X text 96 195 OSX porting : Mathieu Bouchard \, James Tittle \, Adam
+Lindsay \, Patrick Boivin \, and others.;
+#X text 96 341 Development of [#from_pix] and [#to_pix] was sponsored
+by Videographe PARC;
+#X text 96 400 Development of GridFlow 0.9.3 and later has used Videographe
+as a meeting place. Since 0.9.6 \, the room is called Departement de
+Diagrammologie Algorithmique.;
diff --git a/externals/gridflow/doc/find_missing.rb b/externals/gridflow/doc/find_missing.rb
new file mode 100644
index 00000000..5ac44da0
--- /dev/null
+++ b/externals/gridflow/doc/find_missing.rb
@@ -0,0 +1,40 @@
+#!/usr/bin/env ruby
+
+a=[]
+`grep -nriw install ../src/*.[ch]xx ../src/*.m`.each {|line|
+ m=/install\(\"([^"]+)/.match(line)
+ a<<m[1] if m
+}
+
+b=Dir["../abstractions/*.pd"].map{|x|
+ x.gsub(/^\.\.\/abstractions\//,"").gsub(/\.pd$/,"")
+}
+
+c = Dir["flow_classes/*-help.pd" ].map{|x| x.gsub(/^flow_classes\//,"").gsub(/-help\.pd$/,"") }
+c.concat Dir["flow_classes/cv/*-help.pd"].map{|x| x.gsub(/^flow_classes\//,"").gsub(/-help\.pd$/,"") }
+ab=a+b
+
+d=[]
+File.open("index.pd") {|f|
+ f.each {|line|
+ m=/obj \d+ \d+ ([^ ;]+)/.match(line)
+ d<<m[1] if m
+ }
+}
+
+puts "missing from help files: "
+puts (ab-c).sort.join" "
+puts (ab-c).size
+puts ""
+
+puts "orphan help files:"
+puts (c-ab).sort.join" "
+puts ""
+
+puts "missing from index:"
+puts (ab-d).sort.join" "
+puts (ab-d).size
+puts ""
+
+puts "orphan index entries: "
+puts (d-ab).sort.join" "
diff --git a/externals/gridflow/doc/flow_classes/#-help.pd b/externals/gridflow/doc/flow_classes/#-help.pd
new file mode 100644
index 00000000..8a546e31
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#-help.pd
@@ -0,0 +1,55 @@
+#N canvas 648 0 632 642 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 54 81 click on this object to select a numop to try out:;
+#X text 55 64 # applies a simple Numeric Operator (numop).;
+#X obj 94 120 doc/numop;
+#X obj 0 0 doc_h;
+#X obj 14 439 doc_cc 0;
+#X obj 3 409 doc_c 1..2;
+#X obj 3 534 doc_i 2;
+#X obj 14 564 doc_ii 0;
+#X obj 14 735 doc_oo 0;
+#X obj 14 461 doc_cc 1;
+#X obj 14 673 doc_ii 1;
+#X obj 3 705 doc_o 1;
+#X obj 97 439 doc_m c0 numop;
+#X obj 97 463 doc_m c1 grid;
+#X obj 97 564 doc_m i0 grid;
+#X obj 97 673 doc_m i1 grid;
+#X obj 97 651 doc_m i0 numop;
+#X text 232 564 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 1are called "B". the resulting grid is the
+same size as theone in inlet 0;
+#X text 232 439 pick a way to combine the numbers. (see the numop table)
+;
+#X text 232 673 same as arg 1;
+#X text 232 651 same as arg 0;
+#X obj 97 735 doc_m o0 grid;
+#X text 232 463 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);
+#X obj 0 765 doc_f;
+#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 13 0 5 0;
+#X connect 23 1 29 0;
+#X connect 24 1 33 0;
+#X connect 25 1 28 0;
+#X connect 26 1 30 0;
+#X connect 27 1 31 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..61c29ebf
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#apply_colormap_channelwise-help.pd
@@ -0,0 +1,55 @@
+#N canvas 651 0 632 598 10;
+#X obj 25 293 #in;
+#X obj 25 342 #out window;
+#X text 232 537 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 obj 213 235 #for 0 256 1;
+#X obj 213 305 #outer gamma;
+#X msg 25 267 load bluemarble.jpg;
+#X obj 25 248 t b b;
+#X obj 289 261 #color 0 1024 1;
+#X msg 354 209 1024 512 256;
+#X obj 354 190 loadbang;
+#X obj 25 323 #apply_colormap_channelwise;
+#X obj 25 219 metro 100;
+#X obj 25 202 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X text 357 244 vary this:;
+#X obj 0 0 doc_h;
+#X obj 3 383 doc_c 0;
+#X obj 3 423 doc_i 2;
+#X obj 3 507 doc_o 1;
+#X obj 14 453 doc_ii 0;
+#X obj 14 475 doc_ii 1;
+#X obj 14 537 doc_oo 0;
+#X obj 97 453 doc_m i0 grid;
+#X text 12 70 currently works only with 3 channels at a time!;
+#X text 15 89 it also works on non-images \, for example on colormaps
+themselves \, but the last dimension must be channels \, and there
+must be three channels.;
+#X text 14 136 Note: if you just need to apply a palette on an indexed-color
+picture or greyscale picture \, you don't need this. Just use #store
+instead.;
+#X obj 0 569 doc_f;
+#X text 232 453 grid that will be modified by the colormap;
+#X text 232 475 Colormap (aka palette) is a grid[intensity \, channels]
+;
+#X obj 97 475 doc_m i1 grid;
+#X obj 97 537 doc_m o0 grid;
+#X connect 0 0 11 0;
+#X connect 4 0 5 0;
+#X connect 5 0 11 1;
+#X connect 6 0 0 0;
+#X connect 7 0 6 0;
+#X connect 7 1 4 0;
+#X connect 8 0 5 1;
+#X connect 9 0 8 0;
+#X connect 10 0 9 0;
+#X connect 11 0 1 0;
+#X connect 12 0 7 0;
+#X connect 13 0 12 0;
+#X connect 22 1 27 0;
+#X connect 29 1 28 0;
+#X connect 30 1 2 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..04cc2648
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#background_model-help.pd
@@ -0,0 +1,90 @@
+#N canvas 327 0 632 642 10;
+#X obj 58 86 #camera;
+#X obj 58 50 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 194 115 tgl 15 0 empty empty binaryFlag 0 -6 0 8 -24198 -1 -1
+0 1;
+#X obj 126 96 tgl 15 0 empty empty addBackground 0 -6 0 8 -24198 -1
+-1 0 1;
+#X obj 266 105 hsl 128 15 0 700 0 0 empty empty outputThreshold -2
+-6 0 8 -260818 -1 -1 0 1;
+#X obj 41 86 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 58 286 #greyscale_to_rgb;
+#X text 72 224 Arguments : size of buffer \, columns \, rows \, channel
+;
+#X text 70 242 <-- output is a greyscale image;
+#X obj 58 305 #out window \, title backgroundModel;
+#X obj 58 324 fps detailed;
+#X obj 58 343 print;
+#X obj 146 198 #out window \, title variance;
+#X obj 235 160 #out window \, title Mean;
+#X obj 146 160 # << 2;
+#X obj 146 179 #clip;
+#X floatatom 280 128 5 0 0 0 - - -;
+#X obj 58 267 #clip;
+#X obj 58 67 metro 33.33;
+#X obj 58 141 #background_model 20 120 160 3;
+#X obj 14 658 doc_oo 0;
+#X obj 14 680 doc_oo 1;
+#X obj 14 702 doc_oo 2;
+#X obj 14 532 doc_ii 0;
+#X obj 14 552 doc_ii 1;
+#X obj 14 574 doc_ii 2;
+#X obj 14 596 doc_ii 3;
+#X obj 14 404 doc_cc 0;
+#X obj 14 426 doc_cc 1;
+#X obj 14 448 doc_cc 2;
+#X obj 14 470 doc_cc 3;
+#X text 232 552 addBackground;
+#X text 232 574 binary_flag;
+#X text 232 596 output_threshold;
+#X text 232 404 frames;
+#X text 232 426 height;
+#X text 232 448 width;
+#X text 232 470 channels;
+#X text 232 680 variance;
+#X text 232 702 mean;
+#X text 232 658 greyscale image;
+#X obj 0 0 doc_h;
+#X obj 0 734 doc_f;
+#X obj 3 374 doc_c 4;
+#X obj 3 502 doc_i 4;
+#X obj 3 628 doc_o 3;
+#X obj 97 596 doc_m i3;
+#X obj 97 404 doc_m c0 float;
+#X obj 97 426 doc_m c1 float;
+#X obj 97 448 doc_m c2 float;
+#X obj 97 470 doc_m c3 float;
+#X obj 97 552 doc_m i1 grid;
+#X obj 97 532 doc_m i0 grid;
+#X obj 97 574 doc_m i2 float bool;
+#X obj 97 658 doc_m o0 grid;
+#X obj 97 680 doc_m o1 grid;
+#X obj 97 702 doc_m o2 grid;
+#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;
+#X connect 46 1 33 0;
+#X connect 47 1 34 0;
+#X connect 48 1 35 0;
+#X connect 49 1 36 0;
+#X connect 50 1 37 0;
+#X connect 51 1 31 0;
+#X connect 53 1 32 0;
+#X connect 54 1 40 0;
+#X connect 55 1 38 0;
+#X connect 56 1 39 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..5486c419
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#border-help.pd
@@ -0,0 +1,44 @@
+#N canvas 597 51 632 499 10;
+#X obj 20 84 #in;
+#X obj 20 127 #out window;
+#X text 15 28 Creates a black border around an image.;
+#X msg 20 62 load working.jpg;
+#X text 232 206 top padding and left padding. defaults to (1 1 0).
+;
+#X text 232 228 bottom and right padding. defaults to (1 1 0).;
+#X obj 20 105 #border (5 10 0) (15 20 0);
+#X text 209 98 5 at the top;
+#X text 208 112 10 at the left;
+#X text 208 126 15 at the bottom;
+#X text 208 139 20 at the right;
+#X text 114 255 both arguments must have 3 elements. The third element
+is reserved for future use.;
+#X text 232 425 The original image surrounded by zero padding \, which
+usually means black pixels.;
+#X obj 14 425 doc_oo 0;
+#X obj 14 321 doc_ii 0;
+#X obj 14 341 doc_ii 1;
+#X obj 14 363 doc_ii 2;
+#X obj 14 206 doc_cc 0;
+#X obj 14 228 doc_cc 1;
+#X text 232 341 same as arg 0;
+#X text 232 363 same as arg 1;
+#X obj 0 0 doc_h;
+#X obj 0 470 doc_f;
+#X obj 3 176 doc_c 2;
+#X obj 3 291 doc_i 3;
+#X obj 3 395 doc_o 1;
+#X obj 97 206 doc_m c0 grid[3];
+#X obj 97 228 doc_m c1 grid[3];
+#X obj 97 321 doc_m i0 grid;
+#X obj 97 341 doc_m i1 list;
+#X obj 97 363 doc_m i2 list;
+#X obj 97 425 doc_m o0 grid;
+#X connect 0 0 6 0;
+#X connect 3 0 0 0;
+#X connect 6 0 1 0;
+#X connect 26 1 4 0;
+#X connect 27 1 5 0;
+#X connect 29 1 19 0;
+#X connect 30 1 20 0;
+#X connect 31 1 12 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..403f396f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#camera-help.pd
@@ -0,0 +1,49 @@
+#N canvas 679 40 632 557 10;
+#X obj 86 164 #out window;
+#X obj 60 45 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 86 45 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 86 183 fps detailed;
+#X obj 86 202 print;
+#X obj 86 71 metro 20;
+#X text 232 496 Returns a grid from the video capture device for every
+bang.;
+#X obj 86 145 #scale_by;
+#X text 151 111 <-- open the abstraction and configure for your camera
+before sending it a bang.;
+#X obj 86 112 #camera;
+#X obj 14 496 doc_oo 0;
+#X obj 14 399 doc_ii 0;
+#X obj 14 271 doc_cc 0;
+#X text 232 399 same as arg 0;
+#X text 232 421 same as the class of the camera object being used inside:
+see #io.videodev-help.pd for a LONG list of options;
+#X text 232 293 8: a linux device using the DC-1394 interface;
+#X text 232 315 9: an OSX device using the QuickTime camera interface
+;
+#X text 232 271 0..7: a linux device using the V4L1 interface (videodev.h)
+;
+#X text 232 337 -1: none;
+#X obj 0 0 doc_h;
+#X obj 0 528 doc_f;
+#X obj 3 241 doc_c 1;
+#X obj 3 369 doc_i 1;
+#X obj 3 466 doc_o 1;
+#X obj 97 271 doc_m c0 float/int;
+#X obj 97 496 doc_m o0 grid;
+#X obj 97 399 doc_m i0 device;
+#X obj 97 421 doc_m i0 <any>;
+#X connect 0 0 3 0;
+#X connect 1 0 9 0;
+#X connect 2 0 5 0;
+#X connect 3 0 4 0;
+#X connect 5 0 9 0;
+#X connect 7 0 0 0;
+#X connect 9 0 7 0;
+#X connect 24 1 15 0;
+#X connect 24 1 16 0;
+#X connect 24 1 17 0;
+#X connect 24 1 18 0;
+#X connect 25 1 6 0;
+#X connect 26 1 13 0;
+#X connect 27 1 14 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..970a7647
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#cast-help.pd
@@ -0,0 +1,67 @@
+#N canvas 646 0 632 564 10;
+#X obj 14 219 #print;
+#X obj 14 199 #cast float64;
+#X obj 269 218 #print;
+#X obj 126 218 #print;
+#X obj 269 198 #cast uint8;
+#X obj 126 198 #cast int32;
+#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 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 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 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 232 358 Any grid;
+#X obj 14 420 doc_oo 0;
+#X obj 14 358 doc_ii 0;
+#X obj 14 283 doc_cc 0;
+#X text 232 420 Produces a grid of the same dimensions containing all
+the same values after type conversion.;
+#X text 232 455 conversion from float truncates fractional part (rounds
+towards zero);
+#X text 232 490 conversion to an int type may wrap (same as some #
+& or some # %);
+#X text 232 283 Number types are: uint8 \, int16 \, int32 \, int64
+\, float32 \, float64. see doc/numtype.pd for more info.;
+#X obj 306 154 #redim (2 2);
+#X obj 0 0 doc_h;
+#X obj 0 535 doc_f;
+#X obj 3 253 doc_c 1;
+#X obj 3 328 doc_i 1;
+#X obj 3 390 doc_o 1;
+#X obj 97 283 doc_m c0 symbol/numbertype;
+#X obj 97 358 doc_m i0 grid;
+#X obj 97 420 doc_m o0 grid;
+#X connect 1 0 0 0;
+#X connect 4 0 2 0;
+#X connect 5 0 3 0;
+#X connect 6 0 1 0;
+#X connect 7 0 5 0;
+#X connect 8 0 11 0;
+#X connect 9 0 12 0;
+#X connect 10 0 12 1;
+#X connect 11 0 4 0;
+#X connect 12 0 25 0;
+#X connect 13 0 6 0;
+#X connect 14 0 7 0;
+#X connect 16 0 12 2;
+#X connect 25 0 11 1;
+#X connect 31 1 24 0;
+#X connect 32 1 17 0;
+#X connect 33 1 21 0;
+#X connect 33 1 22 0;
+#X connect 33 1 23 0;
diff --git a/externals/gridflow/doc/flow_classes/#centroid-help.pd b/externals/gridflow/doc/flow_classes/#centroid-help.pd
new file mode 100644
index 00000000..81a8718f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#centroid-help.pd
@@ -0,0 +1,29 @@
+#N canvas 669 0 632 376 10;
+#X obj 43 44 #centroid;
+#X obj 14 163 doc_ii 0;
+#X obj 14 251 doc_oo 0;
+#X obj 14 273 doc_oo 1;
+#X obj 14 295 doc_oo 2;
+#X text 232 163 will compute the centroid of the given grid \, which
+is a weighted average \, namely \, the average position weighted by
+the pixel values.;
+#X text 138 41 obsolete. please use [#moment] instead.;
+#X obj 3 327 doc_also;
+#X obj 103 327 #moment;
+#X text 232 251 (y x);
+#X text 232 273 y;
+#X text 232 295 x;
+#X obj 0 0 doc_h;
+#X obj 0 347 doc_f;
+#X obj 3 93 doc_c;
+#X obj 3 133 doc_i 1;
+#X obj 3 221 doc_o 3;
+#X obj 97 163 doc_m i0;
+#X obj 97 251 doc_m o0 grid;
+#X obj 97 295 doc_m o2 float;
+#X obj 97 273 doc_m o1 float;
+#X connect 7 1 8 0;
+#X connect 17 1 5 0;
+#X connect 18 1 9 0;
+#X connect 19 1 11 0;
+#X connect 20 1 10 0;
diff --git a/externals/gridflow/doc/flow_classes/#change-help.pd b/externals/gridflow/doc/flow_classes/#change-help.pd
new file mode 100644
index 00000000..cbef68ef
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#change-help.pd
@@ -0,0 +1,35 @@
+#N canvas 646 85 632 417 10;
+#X obj 38 95 #change;
+#X text 234 116 should be to [change] what GridFlow is to PureData.
+;
+#X obj 14 278 doc_ii 0;
+#X obj 14 338 doc_oo 0;
+#X obj 14 218 doc_cc 0;
+#X obj 3 368 doc_also;
+#X obj 103 368 change;
+#X obj 38 137 print;
+#X obj 44 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 38 76 #pack;
+#X floatatom 72 58 5 0 0 0 - - -;
+#X floatatom 38 58 5 0 0 0 - - -;
+#X obj 72 41 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 38 41 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 0 0 doc_h;
+#X obj 0 388 doc_f;
+#X obj 3 188 doc_c 0..1;
+#X obj 3 248 doc_i 1;
+#X obj 3 308 doc_o 1;
+#X obj 97 218 doc_m c0 grid;
+#X obj 97 338 doc_m o0 grid;
+#X obj 97 278 doc_m i0 grid;
+#X connect 0 0 8 0;
+#X connect 0 0 7 0;
+#X connect 5 1 6 0;
+#X connect 9 0 0 0;
+#X connect 10 0 9 1;
+#X connect 11 0 9 0;
+#X connect 12 0 10 0;
+#X connect 13 0 11 0;
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..1c737f08
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#checkers-help.pd
@@ -0,0 +1,26 @@
+#N canvas 692 0 632 404 10;
+#X obj 171 66 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 171 135 #out window \, title checkers;
+#X obj 171 112 #checkers;
+#X text 232 330 Results in a checkered pattern of 50% / 75% greys in
+8 X 8 squares.;
+#X text 11 29 Displays a grid with a pattern of checkered squares.
+;
+#X obj 14 330 doc_oo 0;
+#X obj 14 256 doc_ii 0;
+#X obj 171 88 #for (0 0) (128 128) (1 1);
+#X text 232 256 typically the output of [#for (0 0) (height width)
+(1 1)];
+#X obj 0 0 doc_h;
+#X obj 0 375 doc_f;
+#X obj 3 186 doc_c 0;
+#X obj 3 226 doc_i 1;
+#X obj 3 300 doc_o 1;
+#X obj 97 256 doc_m i0 grid;
+#X obj 97 330 doc_m o0 grid;
+#X connect 0 0 7 0;
+#X connect 2 0 1 0;
+#X connect 7 0 2 0;
+#X connect 14 1 8 0;
+#X connect 15 1 3 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..9e494b44
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#clip-help.pd
@@ -0,0 +1,70 @@
+#N canvas 673 6 632 610 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 0 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 text 133 165 <-- vary this number;
+#X msg 81 138 open working.jpg;
+#X text 232 410 Grid values are clipped to the high and low values
+stored in the object;
+#X text 232 529 Outputs the modified grid;
+#X obj 103 561 # min;
+#X obj 145 561 # max;
+#X obj 187 561 clip;
+#X text 223 561 #numop-help.pd;
+#X text 319 561 gf_tutorial_image_6.pd;
+#X obj 51 240 #clip 0 255;
+#X text 139 231 <--if no creation argument is given the default range
+is 0-255.;
+#X obj 3 561 doc_also;
+#X obj 14 410 doc_ii 0;
+#X obj 14 445 doc_ii 1;
+#X obj 14 467 doc_ii 2;
+#X obj 14 529 doc_oo 0;
+#X obj 14 326 doc_cc 0;
+#X obj 14 348 doc_cc 1;
+#X text 232 445 same as arg 0;
+#X text 232 467 same as arg 1;
+#X text 232 326 minimum value (like [# max]);
+#X text 232 348 maximum value (like [# min]);
+#X obj 0 0 doc_h;
+#X obj 0 581 doc_f;
+#X obj 3 296 doc_c 2;
+#X obj 3 380 doc_i 3;
+#X obj 3 499 doc_o 1;
+#X obj 97 410 doc_m i0 grid;
+#X obj 97 445 doc_m i1 float int;
+#X obj 97 467 doc_m i2 float int;
+#X obj 97 529 doc_m o0 grid;
+#X obj 97 326 doc_m c0;
+#X obj 97 348 doc_m c1;
+#X connect 0 0 1 0;
+#X connect 1 0 19 0;
+#X connect 2 0 1 1;
+#X connect 4 0 0 0;
+#X connect 4 1 11 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 19 2;
+#X connect 8 0 19 1;
+#X connect 11 0 0 0;
+#X connect 19 0 3 0;
+#X connect 21 1 14 0;
+#X connect 21 1 15 0;
+#X connect 21 1 16 0;
+#X connect 21 1 17 0;
+#X connect 21 1 18 0;
+#X connect 37 1 12 0;
+#X connect 38 1 28 0;
+#X connect 39 1 29 0;
+#X connect 40 1 13 0;
+#X connect 41 1 30 0;
+#X connect 42 1 31 0;
diff --git a/externals/gridflow/doc/flow_classes/#cluster_avg-help.pd b/externals/gridflow/doc/flow_classes/#cluster_avg-help.pd
new file mode 100644
index 00000000..50e844a0
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#cluster_avg-help.pd
@@ -0,0 +1,22 @@
+#N canvas 615 299 632 303 10;
+#X obj 14 60 doc_cc 0;
+#X obj 14 120 doc_ii 0;
+#X text 232 242 counts;
+#X text 232 220 sums;
+#X obj 14 140 doc_ii 1;
+#X obj 14 160 doc_ii 2;
+#X obj 14 220 doc_oo 0;
+#X obj 14 242 doc_oo 1;
+#X obj 0 0 doc_h;
+#X obj 0 274 doc_f;
+#X obj 3 30 doc_c 1;
+#X obj 3 90 doc_i 3;
+#X obj 3 190 doc_o 2;
+#X obj 97 160 doc_m i2 grid;
+#X obj 97 60 doc_m c0 int;
+#X obj 97 220 doc_m o0 grid;
+#X obj 97 242 doc_m o1 grid;
+#X obj 97 140 doc_m i1 float int;
+#X obj 97 120 doc_m i0 grid i;
+#X connect 15 1 3 0;
+#X connect 16 1 2 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..2fd0b3b7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#color-help.pd
@@ -0,0 +1,44 @@
+#N canvas 653 126 632 519 10;
+#X obj 126 114 #color;
+#X text 308 126 <-- vary these;
+#X text 10 27 The [#color] object contains a triple slider for RGB
+value selection on each channel.;
+#X text 198 68 <-- click here;
+#X msg 126 68 255 0 204;
+#X msg 317 79 delegate steady 0;
+#X text 103 470 [hsl];
+#X obj 3 470 doc_also;
+#X text 232 253 whether to remove the color preview;
+#X text 232 209 lower bound;
+#X text 232 231 upper bound;
+#X obj 14 425 doc_oo 0;
+#X obj 14 315 doc_ii 0;
+#X obj 14 209 doc_cc 0;
+#X obj 14 231 doc_cc 1;
+#X obj 14 253 doc_cc 2;
+#X text 232 350 sends the rest of the message as a message to each
+of the sliders but not each of the numboxes.;
+#X text 232 315 replaces the current colour value inside [#color] \,
+including sliders and numboxes.;
+#X text 232 425 of size (3) representing a rgb colour or any other
+rgb-related settings you want to control with [#color].;
+#X obj 0 0 doc_h;
+#X obj 0 490 doc_f;
+#X obj 3 179 doc_c 3;
+#X obj 3 285 doc_i 1;
+#X obj 3 395 doc_o 1;
+#X obj 97 209 doc_m c0 float;
+#X obj 97 231 doc_m c1 float;
+#X obj 97 253 doc_m c2 bool;
+#X obj 97 315 doc_m i0 grid;
+#X obj 97 350 doc_m i0 delegate;
+#X obj 97 425 doc_m o0 grid;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 7 1 6 0;
+#X connect 24 1 9 0;
+#X connect 25 1 10 0;
+#X connect 26 1 8 0;
+#X connect 27 1 17 0;
+#X connect 28 1 16 0;
+#X connect 29 1 18 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..7136bd29
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#contrast-help.pd
@@ -0,0 +1,72 @@
+#N canvas 678 0 632 613 10;
+#X obj 77 88 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 97 136 metro 100;
+#X obj 97 115 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 222 134 hsl 128 15 0 256 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 371 135 hsl 128 15 0 256 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X floatatom 219 154 5 0 0 0 - - -;
+#X floatatom 368 157 5 0 0 0 - - -;
+#X msg 59 65 open bluemarble.jpg;
+#X obj 190 214 #out window;
+#X obj 59 162 #in;
+#X text 8 28 Adjusts the intensity of an image.;
+#X obj 190 189 #contrast;
+#X text 232 327 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 232 279 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 obj 103 564 #convolve;
+#X obj 169 564 #posterize;
+#X obj 241 564 #solarize;
+#X obj 307 564 #layer;
+#X text 366 118 contrast about black;
+#X text 216 118 contrast about white;
+#X obj 3 564 doc_also;
+#X obj 14 534 doc_oo 0;
+#X obj 14 415 doc_ii 0;
+#X obj 14 450 doc_ii 1;
+#X obj 14 472 doc_ii 2;
+#X text 232 415 produces a grid like the incoming grid but with different
+constrast.;
+#X text 7 42 resulting values outside 0-255 are automatically clipped.
+;
+#X obj 14 279 doc_cc 0;
+#X obj 14 327 doc_cc 1;
+#X text 232 450 same as arg 0;
+#X text 232 472 same as arg 1;
+#X obj 0 0 doc_h;
+#X obj 0 584 doc_f;
+#X obj 3 249 doc_c 0..2;
+#X obj 3 385 doc_i 3;
+#X obj 3 504 doc_o 1;
+#X obj 97 534 doc_m o0 grid;
+#X obj 97 415 doc_m i0 grid;
+#X obj 97 327 doc_m c1 grid;
+#X obj 97 279 doc_m c0 grid;
+#X obj 97 450 doc_m i1 grid;
+#X obj 97 472 doc_m i2 grid;
+#X connect 0 0 9 0;
+#X connect 1 0 9 0;
+#X connect 2 0 1 0;
+#X connect 3 0 5 0;
+#X connect 4 0 6 0;
+#X connect 5 0 11 1;
+#X connect 6 0 11 2;
+#X connect 7 0 9 0;
+#X connect 9 0 11 0;
+#X connect 11 0 8 0;
+#X connect 20 1 14 0;
+#X connect 20 1 15 0;
+#X connect 20 1 16 0;
+#X connect 20 1 17 0;
+#X connect 37 1 25 0;
+#X connect 38 1 12 0;
+#X connect 39 1 13 0;
+#X connect 40 1 29 0;
+#X connect 41 1 30 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..d644340d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#convolve-help.pd
@@ -0,0 +1,67 @@
+#N canvas 678 0 632 642 10;
+#X obj 43 87 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X msg 255 135 1 1 1 1 1 1 1 1 1;
+#X obj 255 113 loadbang;
+#X obj 255 157 #redim (3 3);
+#X obj 43 158 #in;
+#X obj 43 241 #out window;
+#X obj 103 723 #contrast;
+#X obj 169 723 #posterize;
+#X obj 241 723 #solarize;
+#X obj 307 723 #layer;
+#X obj 43 183 #convolve \, op ^ \, fold + \, seed 0;
+#X text 14 28 [#convolve] is used to perform various transformations
+on images such as blurring \, sharpening \, finding edges \, embossing
+\, cellular automata and many others.;
+#X text 232 316 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 obj 3 723 doc_also;
+#X obj 14 691 doc_oo 0;
+#X obj 14 443 doc_ii 0;
+#X obj 14 629 doc_ii 1;
+#X text 155 216 here ^ is the parallel operator \, fold is indicated
+by + and 0 is its base (seed).;
+#X obj 14 316 doc_cc 0;
+#X text 232 691 Resulting image.;
+#X text 232 443 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 [#] 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 text 232 629 same as arg 0;
+#X msg 43 135 open scissors.jpg \, bang;
+#X obj 0 0 doc_h;
+#X obj 0 743 doc_f;
+#X obj 3 286 doc_c 0..1;
+#X obj 3 413 doc_i 2;
+#X obj 3 661 doc_o 1;
+#X obj 97 443 doc_m i0 grid;
+#X obj 97 629 doc_m i1 grid;
+#X obj 97 691 doc_m o0 grid;
+#X obj 97 589 doc_m i0 op numop;
+#X obj 97 569 doc_m i0 fold numop;
+#X obj 97 609 doc_m i0 seed grid;
+#X obj 97 316 doc_m c0 grid;
+#X connect 0 0 22 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 10 1;
+#X connect 4 0 10 0;
+#X connect 10 0 5 0;
+#X connect 13 1 6 0;
+#X connect 13 1 7 0;
+#X connect 13 1 8 0;
+#X connect 13 1 9 0;
+#X connect 22 0 4 0;
+#X connect 28 1 20 0;
+#X connect 29 1 21 0;
+#X connect 30 1 19 0;
+#X connect 34 1 12 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..d86aaa70
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#dim-help.pd
@@ -0,0 +1,39 @@
+#N canvas 647 0 632 473 10;
+#X obj 22 178 print number_of_dimensions;
+#X obj 22 106 #in;
+#X obj 22 130 #dim;
+#X obj 22 154 #to_float;
+#X text 15 37 Outputs grid dimensions (columns \, row \, channels).
+;
+#X text 232 353 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 obj 3 323 doc_o 1;
+#X obj 103 424 #print;
+#X obj 151 424 #to_float;
+#X obj 217 424 #to_list;
+#X obj 3 424 doc_also;
+#X obj 14 278 doc_ii 0;
+#X obj 14 353 doc_oo 0;
+#X obj 97 278 doc_m i0 grid;
+#X obj 97 353 doc_m o0 grid;
+#X text 185 65 Returns list of dimensions as a grid. Given a grid sized
+like Dim(240 \, 320 \, 4) \, [#dim] will return a grid like Dim(3)
+\, whose values are 240 \, 320 \, 4 .;
+#X text 232 278 ignores any data contained within. sends a grid dim(length
+of dims) containing dims.;
+#X msg 22 66 load working.jpg;
+#X obj 0 0 doc_h;
+#X obj 0 444 doc_f;
+#X obj 3 208 doc_c;
+#X obj 3 248 doc_i 1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 10 1 7 0;
+#X connect 10 1 8 0;
+#X connect 10 1 9 0;
+#X connect 13 1 16 0;
+#X connect 14 1 5 0;
+#X connect 17 0 1 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..14f427db
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#downscale_by-help.pd
@@ -0,0 +1,63 @@
+#N canvas 676 0 632 699 10;
+#X obj 181 115 metro 10;
+#X obj 181 96 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 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 251 162 #pack 2;
+#X obj 165 186 #downscale_by;
+#X obj 165 212 #out window;
+#X text 9 24 Scales down a picture by a specified amount.;
+#X obj 103 650 #scale_to;
+#X obj 169 650 #scale_by;
+#X obj 0 0 doc_h;
+#X obj 3 650 doc_also;
+#X obj 3 588 doc_o 1;
+#X obj 14 618 doc_oo 0;
+#X obj 3 491 doc_i 2;
+#X obj 14 521 doc_ii 0;
+#X obj 14 556 doc_ii 1;
+#X obj 14 280 doc_cc 0;
+#X obj 97 280 doc_m c0 grid;
+#X obj 3 250 doc_c 1..2;
+#X obj 97 521 doc_m i0 grid;
+#X text 232 280 The value defines the scale factor. A pack object allows
+you to vary the horizontal and vertical values idenpendently. In the
+example above \, inlet 0 of [#pack] varies the image on a vertical
+axis \, inlet 1 of [#pack] varies the image on a horizontal axis.;
+#X obj 97 556 doc_m i1 grid;
+#X text 232 556 same as arg 0;
+#X text 232 521 Scales down picture by specified amount. (See scale
+factor above);
+#X text 232 618 grid((factor/y) (factor/x) channels);
+#X text 232 354 factor is optional (default is 2).;
+#X obj 97 618 doc_m o0 grid;
+#X obj 14 411 doc_cc 1;
+#X obj 97 411 doc_m c1 symbol;
+#X text 232 411 "smoothly": does the downscale by averaging each block
+of pixels.;
+#X text 232 446 omitted: does the downscale by keeping only the top
+right pixel in the block.;
+#X obj 0 670 doc_f;
+#X text 232 376 if it's a single value \, then that factor is to be
+used for both rows and columns.;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X connect 4 0 3 0;
+#X connect 5 0 6 1;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 13 1 10 0;
+#X connect 13 1 11 0;
+#X connect 20 1 23 0;
+#X connect 20 1 28 0;
+#X connect 20 1 35 0;
+#X connect 22 1 26 0;
+#X connect 24 1 25 0;
+#X connect 29 1 27 0;
+#X connect 31 1 32 0;
+#X connect 31 1 33 0;
diff --git a/externals/gridflow/doc/flow_classes/#draw_hpgl-help.pd b/externals/gridflow/doc/flow_classes/#draw_hpgl-help.pd
new file mode 100644
index 00000000..672e4689
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_hpgl-help.pd
@@ -0,0 +1,35 @@
+#N canvas 576 129 632 396 10;
+#X obj 0 0 doc_h;
+#X obj 0 367 doc_f;
+#X obj 103 51 #draw_hpgl;
+#X obj 3 283 doc_o 2;
+#X obj 3 131 doc_i 5;
+#X obj 3 91 doc_c 0;
+#X obj 14 313 doc_oo 0;
+#X obj 14 335 doc_oo 1;
+#X obj 14 161 doc_ii 0;
+#X obj 14 183 doc_ii 1;
+#X obj 14 205 doc_ii 2;
+#X obj 14 227 doc_ii 3;
+#X obj 14 251 doc_ii 4;
+#X obj 97 227 doc_m i3 grid;
+#X obj 97 251 doc_m i4 grid;
+#X text 232 227 (x y) start;
+#X text 232 251 (x y) end;
+#X obj 97 161 doc_m i0 grid;
+#X obj 97 183 doc_m i1 grid;
+#X obj 97 205 doc_m i2 grid;
+#X text 232 161 image;
+#X text 232 183 color;
+#X text 232 205 command;
+#X obj 97 335 doc_m o1 bang;
+#X obj 97 313 doc_m o0 grid;
+#X text 232 335 time to draw;
+#X text 232 313 image drawn on;
+#X connect 13 1 15 0;
+#X connect 14 1 16 0;
+#X connect 17 1 20 0;
+#X connect 18 1 21 0;
+#X connect 19 1 22 0;
+#X connect 23 1 25 0;
+#X connect 24 1 26 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..a2fd7df4
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_image-help.pd
@@ -0,0 +1,102 @@
+#N canvas 295 0 632 642 10;
+#X obj 172 147 #in;
+#X obj 135 181 #store;
+#X obj 135 46 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 0 1
+;
+#X obj 135 74 metro 40;
+#X obj 135 283 #out window \, title #draw_image-help;
+#X obj 172 99 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 188 209 #in;
+#X obj 188 169 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X text 194 101 2 <-- open background image;
+#X text 211 171 1 <-- open foreground image;
+#X obj 387 238 #dim;
+#X obj 387 257 #to_list;
+#X obj 387 276 unpack f f;
+#X obj 393 295 pack f f;
+#X obj 393 314 # / 2;
+#X obj 368 314 # -;
+#X obj 135 307 #mouse;
+#X text 159 48 3 <-- activate rendering;
+#X msg 188 190 load g001.jpg;
+#X msg 172 120 load r001.jpg;
+#X msg 275 257 0 0;
+#X obj 275 238 loadbang;
+#X text 135 331 Move mouse cursor to change layer position;
+#X obj 0 0 doc_h;
+#X obj 3 455 doc_i 3;
+#X obj 3 775 doc_o 1;
+#X obj 14 805 doc_oo 0;
+#X obj 14 485 doc_ii 0;
+#X obj 14 708 doc_ii 1;
+#X obj 14 730 doc_ii 2;
+#X text 232 397 Normally \, you would use the "put" operator \; but
+others (like + and ^) can be interesting for color effects.;
+#X obj 135 258 #draw_image *>>8;
+#X obj 3 367 doc_c 1;
+#X obj 14 397 doc_cc 0;
+#X text 232 485 Background image.;
+#X msg 321 197 tile;
+#X text 232 708 Foreground image.;
+#X text 232 673 If 1 \, foreground image will be repeated to cover
+the background image.;
+#X text 232 529 If 1 \, foreground image (inlet 1) will be combined
+with background image (inlet 0) \, and then blended with background
+image according to transparency of foreground image \, and then inserted
+in the result. If 0 \, the blending doesn't occur \, as the transparency
+level is considered "opaque". Note that with alpha enabled \, the last
+channel of foreground image is cnsidered to represent transparency.
+;
+#X text 232 730 Initial foreground image position (y x) \, corresponding
+to top-left corner of foreground picture.;
+#X text 232 805 Resulting image.;
+#X obj 97 397 doc_m c0 numop;
+#X obj 97 485 doc_m i0 grid;
+#X obj 97 651 doc_m i0 tile;
+#X obj 97 507 doc_m i0 alpha;
+#X text 232 507 \$1=flag;
+#X text 232 651 \$1=flag;
+#X obj 97 708 doc_m i1 grid;
+#X obj 97 730 doc_m i2 (y x);
+#X obj 97 805 doc_m o0 grid;
+#X obj 0 837 doc_f;
+#X obj 97 629 doc_m i0 op;
+#X text 232 629 same as arg 0;
+#X connect 0 0 1 1;
+#X connect 1 0 31 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 16 0;
+#X connect 5 0 19 0;
+#X connect 6 0 10 0;
+#X connect 6 0 31 1;
+#X connect 7 0 18 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 13 1;
+#X connect 13 0 14 0;
+#X connect 14 0 15 1;
+#X connect 15 0 31 2;
+#X connect 16 0 15 0;
+#X connect 16 1 15 0;
+#X connect 16 2 15 0;
+#X connect 16 3 15 0;
+#X connect 18 0 6 0;
+#X connect 19 0 0 0;
+#X connect 20 0 31 2;
+#X connect 21 0 20 0;
+#X connect 31 0 4 0;
+#X connect 35 0 31 0;
+#X connect 41 1 30 0;
+#X connect 42 1 34 0;
+#X connect 43 1 46 0;
+#X connect 43 1 37 0;
+#X connect 44 1 45 0;
+#X connect 44 1 38 0;
+#X connect 47 1 36 0;
+#X connect 48 1 39 0;
+#X connect 49 1 40 0;
+#X connect 51 1 52 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..21e2c3d2
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_points-help.pd
@@ -0,0 +1,56 @@
+#N canvas 678 62 632 584 10;
+#X msg 21 163 240 320 3 #;
+#X obj 236 155 #outer + (0 9000);
+#X obj 236 174 # cos* 100;
+#X obj 236 193 # + 120;
+#X obj 236 117 #for 0 12 1;
+#X obj 236 100 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 236 136 # * 3000;
+#X obj 237 223 display;
+#X obj 21 183 #draw_points put (255 255 0);
+#X obj 21 203 #out window;
+#X text 26 77 [#draw_points] is not yet ready for use.;
+#X obj 0 0 doc_h;
+#X obj 3 365 doc_i 3;
+#X obj 3 493 doc_o 1;
+#X obj 14 523 doc_oo 0;
+#X obj 14 395 doc_ii 0;
+#X obj 14 439 doc_ii 1;
+#X obj 14 461 doc_ii 2;
+#X obj 3 261 doc_c 0..3;
+#X obj 14 291 doc_cc 0;
+#X obj 14 311 doc_cc 1;
+#X obj 14 333 doc_cc 2;
+#X obj 0 555 doc_f;
+#X obj 97 333 doc_m c2;
+#X obj 97 523 doc_m o0 grid;
+#X obj 97 291 doc_m c0 symbol/numop;
+#X obj 97 311 doc_m c1 grid;
+#X text 232 311 color;
+#X text 232 333 points;
+#X obj 97 395 doc_m i0 grid;
+#X obj 97 439 doc_m i1 grid;
+#X obj 97 461 doc_m i2 grid;
+#X obj 97 417 doc_m i0 op;
+#X text 232 417 same as arg 0;
+#X text 232 439 same as arg 1;
+#X text 232 461 same as arg 2;
+#X text 232 395 image to be drawn on;
+#X text 232 523 image that has been drawn on;
+#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;
+#X connect 23 1 28 0;
+#X connect 24 1 37 0;
+#X connect 26 1 27 0;
+#X connect 29 1 36 0;
+#X connect 30 1 34 0;
+#X connect 31 1 35 0;
+#X connect 32 1 33 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..a5afe5e9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_polygon-help.pd
@@ -0,0 +1,116 @@
+#N canvas 628 21 632 642 10;
+#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 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 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 obj 0 0 doc_h;
+#X obj 3 389 doc_c 0..3;
+#X obj 3 508 doc_i 3;
+#X obj 3 614 doc_o 1;
+#X obj 14 644 doc_oo 0;
+#X obj 14 538 doc_ii 0;
+#X obj 14 560 doc_ii 1;
+#X obj 14 582 doc_ii 2;
+#X obj 14 419 doc_cc 0;
+#X obj 14 454 doc_cc 1;
+#X obj 14 476 doc_cc 2;
+#X obj 20 237 #draw_polygon ^ 1;
+#X text 232 419 Normally \, you would use the "put" operator \; but
+the + and ^ can be interesting for color effects.;
+#X text 232 538 Picture on which the polygon will be superimposed.
+;
+#X text 232 560 Color. (see argument 1);
+#X text 232 454 Color of the polygon.;
+#X text 232 644 Resulting picture.;
+#X text 232 476 Vertices of the polygon.;
+#X text 232 582 Vertices. (see argument 2);
+#X obj 97 419 doc_m c0 symbol/numop;
+#X obj 97 454 doc_m c1 grid;
+#X obj 97 476 doc_m c2 grid;
+#X obj 97 538 doc_m i0 grid;
+#X obj 97 560 doc_m i1 grid;
+#X obj 97 582 doc_m i2 grid;
+#X obj 97 644 doc_m o0 grid;
+#X obj 0 676 doc_f;
+#X connect 1 0 49 1;
+#X connect 2 0 31 0;
+#X connect 3 0 20 1;
+#X connect 4 0 35 0;
+#X connect 5 0 27 0;
+#X connect 7 0 49 0;
+#X connect 8 0 13 0;
+#X connect 10 0 49 0;
+#X connect 13 0 10 0;
+#X connect 14 0 26 0;
+#X connect 15 0 33 1;
+#X connect 16 0 15 0;
+#X connect 17 0 18 0;
+#X connect 17 0 19 0;
+#X connect 18 0 24 0;
+#X connect 19 0 30 0;
+#X connect 20 0 25 0;
+#X connect 21 0 33 0;
+#X connect 21 1 20 0;
+#X connect 21 2 17 0;
+#X connect 22 0 1 0;
+#X connect 23 0 32 0;
+#X connect 24 0 17 1;
+#X connect 25 0 49 2;
+#X connect 26 0 21 0;
+#X connect 27 0 7 0;
+#X connect 30 0 3 0;
+#X connect 31 0 1 0;
+#X connect 32 0 33 1;
+#X connect 33 0 49 0;
+#X connect 34 0 16 0;
+#X connect 35 0 0 0;
+#X connect 35 1 37 0;
+#X connect 36 0 35 1;
+#X connect 37 0 0 0;
+#X connect 49 0 4 0;
+#X connect 57 1 50 0;
+#X connect 58 1 53 0;
+#X connect 59 1 55 0;
+#X connect 60 1 51 0;
+#X connect 61 1 52 0;
+#X connect 62 1 56 0;
+#X connect 63 1 54 0;
diff --git a/externals/gridflow/doc/flow_classes/#draw_rect-help.pd b/externals/gridflow/doc/flow_classes/#draw_rect-help.pd
new file mode 100644
index 00000000..a66a4945
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_rect-help.pd
@@ -0,0 +1,40 @@
+#N canvas 335 118 632 443 10;
+#X obj 0 0 doc_h;
+#X obj 0 414 doc_f;
+#X obj 122 57 #draw_rect;
+#X obj 14 126 doc_cc 0;
+#X obj 14 148 doc_cc 1;
+#X obj 14 170 doc_cc 2;
+#X obj 3 96 doc_c 2..3;
+#X text 232 126 op;
+#X text 232 148 color;
+#X text 232 170 polygon;
+#X obj 97 126 doc_m c0 symbol;
+#X obj 97 148 doc_m c1 grid;
+#X obj 97 170 doc_m c2 grid;
+#X obj 3 202 doc_i 3;
+#X obj 3 352 doc_o 1;
+#X obj 14 382 doc_oo 0;
+#X obj 14 232 doc_ii 0;
+#X obj 14 298 doc_ii 1;
+#X obj 14 320 doc_ii 2;
+#X obj 97 232 doc_m i0 grid;
+#X obj 97 254 doc_m i0 outline;
+#X obj 97 298 doc_m i1 grid;
+#X obj 97 320 doc_m i2 grid;
+#X text 232 298 same as arg 1;
+#X text 232 232 picture to draw on;
+#X text 232 254 0: fill rectangle;
+#X text 232 276 1: draw outline only (1 pixel thickness);
+#X text 232 382 picture drawn on;
+#X obj 97 382 doc_m o0 grid;
+#X text 232 320 same as arg 2;
+#X connect 10 1 7 0;
+#X connect 11 1 8 0;
+#X connect 12 1 9 0;
+#X connect 19 1 24 0;
+#X connect 20 1 26 0;
+#X connect 20 1 25 0;
+#X connect 21 1 23 0;
+#X connect 22 1 29 0;
+#X connect 28 1 27 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..fa406625
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#draw_slider-help.pd
@@ -0,0 +1,56 @@
+#N canvas 587 8 632 619 10;
+#X obj 28 87 metro 100;
+#X obj 28 70 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1
+;
+#X obj 28 183 #out window;
+#X text 232 413 Grid values are clipped to the high and low values
+stored in the object;
+#X text 232 558 Outputs the modified grid;
+#X text 232 448 An integer can be used to vary the minimum value of
+the range.;
+#X text 232 483 An integer can be used to vary the maximum value of
+the range.;
+#X obj 28 106 #in scissors.jpg;
+#X obj 238 89 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -241291
+-1 -1 0 1;
+#X text 378 88 <-- value to be displayed;
+#X msg 126 135 255 200 150;
+#X text 209 135 <-- colour;
+#X obj 28 164 #draw_slider put (0 255 0) (255 0 255) (40 40 80 200)
+0 127;
+#X text 5 25 Draws a slider-like rectangle on an image.;
+#X obj 0 0 doc_h;
+#X obj 3 383 doc_i 3;
+#X obj 3 528 doc_o 1;
+#X obj 14 558 doc_oo 0;
+#X obj 14 413 doc_ii 0;
+#X obj 14 448 doc_ii 1;
+#X obj 14 483 doc_ii 2;
+#X obj 14 253 doc_cc 0;
+#X obj 14 273 doc_cc 1;
+#X obj 14 293 doc_cc 2;
+#X obj 14 313 doc_cc 3;
+#X obj 14 333 doc_cc 4;
+#X obj 97 333 doc_m c4;
+#X obj 97 253 doc_m c0 symbol/numop;
+#X obj 97 273 doc_m c1 grid[3];
+#X obj 97 293 doc_m c2 grid[3];
+#X obj 97 313 doc_m c3 grid;
+#X obj 3 223 doc_c 6;
+#X obj 14 353 doc_cc 5;
+#X obj 97 353 doc_m c5;
+#X obj 97 413 doc_m i0 grid;
+#X obj 97 448 doc_m i1 float int;
+#X obj 97 483 doc_m i2 float int;
+#X obj 97 558 doc_m o0 grid;
+#X obj 0 590 doc_f;
+#X connect 0 0 7 0;
+#X connect 1 0 0 0;
+#X connect 7 0 12 0;
+#X connect 8 0 12 2;
+#X connect 10 0 12 1;
+#X connect 12 0 2 0;
+#X connect 34 1 3 0;
+#X connect 35 1 5 0;
+#X connect 36 1 6 0;
+#X connect 37 1 4 0;
diff --git a/externals/gridflow/doc/flow_classes/#edit_polygon-help.pd b/externals/gridflow/doc/flow_classes/#edit_polygon-help.pd
new file mode 100644
index 00000000..8ebd5849
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#edit_polygon-help.pd
@@ -0,0 +1,42 @@
+#N canvas 335 118 632 440 10;
+#X obj 0 0 doc_h;
+#X obj 0 411 doc_f;
+#X obj 65 56 #edit_polygon;
+#X obj 3 95 doc_c 3;
+#X obj 14 125 doc_cc 0;
+#X obj 14 147 doc_cc 1;
+#X obj 14 169 doc_cc 2;
+#X obj 97 125 doc_m c0 symbol;
+#X text 232 125 op;
+#X text 232 147 color;
+#X text 232 169 position;
+#X obj 97 147 doc_m c1 grid;
+#X obj 97 169 doc_m c2 grid;
+#X obj 3 201 doc_i 3;
+#X obj 3 327 doc_o 2;
+#X obj 14 357 doc_oo 0;
+#X obj 14 379 doc_oo 1;
+#X obj 14 231 doc_ii 0;
+#X obj 14 273 doc_ii 1;
+#X obj 14 295 doc_ii 2;
+#X obj 97 251 doc_m i0 position;
+#X obj 97 231 doc_m i0 grid;
+#X obj 97 273 doc_m i1 grid;
+#X obj 97 295 doc_m i2 grid;
+#X text 232 295 same as arg 2;
+#X text 232 273 same as arg 1;
+#X text 232 251 from [#out window];
+#X text 201 231 picture to draw on;
+#X text 232 357 picture drawn on;
+#X obj 97 357 doc_m o0 grid;
+#X obj 97 379 doc_m o1 <none>;
+#X text 232 379 for future use;
+#X text 237 54 probably not finished coding this. (?);
+#X connect 7 1 8 0;
+#X connect 11 1 9 0;
+#X connect 12 1 10 0;
+#X connect 20 1 26 0;
+#X connect 22 1 25 0;
+#X connect 23 1 24 0;
+#X connect 29 1 28 0;
+#X connect 30 1 31 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..f21b9272
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#extract_diagonal-help.pd
@@ -0,0 +1,32 @@
+#N canvas 0 0 632 547 10;
+#X obj 53 82 cv/#SVD;
+#X obj 70 104 display;
+#X obj 54 174 display;
+#X msg 53 63 2 2 f # 30 40 50 60;
+#X text 53 43 numbers coming from the equation of an ellipse;
+#X text 101 85 eigenvectors show the direction of axes of the ellipse
+;
+#X text 64 155 eigenvalues show the square of the length of the axes
+;
+#X obj 23 233 #extract_diagonal;
+#X obj 36 257 display;
+#X text 130 232 just keep the diagonal of the matrix;
+#X obj 24 324 display;
+#X text 99 304 just the radiuses;
+#X obj 23 304 # sqrt (f #);
+#X obj 0 0 doc_h;
+#X obj 3 358 doc_c 0;
+#X obj 3 398 doc_i 1;
+#X obj 3 458 doc_o 1;
+#X obj 14 488 doc_oo 0;
+#X obj 14 428 doc_ii 0;
+#X obj 0 518 doc_f;
+#X obj 97 428 doc_m i0 grid;
+#X obj 97 488 doc_m o0 grid;
+#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..fe3adfe5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fade-help.pd
@@ -0,0 +1,57 @@
+#N canvas 676 0 632 596 10;
+#X obj 253 236 #out window;
+#X obj 131 111 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 131 150 #in;
+#X floatatom 295 218 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 152 #in;
+#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 obj 253 217 #fade;
+#X obj 0 0 doc_h;
+#X obj 3 390 doc_i 2;
+#X obj 3 487 doc_o 1;
+#X obj 14 517 doc_oo 0;
+#X obj 14 420 doc_ii 0;
+#X obj 14 455 doc_ii 1;
+#X obj 3 275 doc_c 1;
+#X obj 97 420 doc_m i0 grid;
+#X obj 97 455 doc_m i1 grid;
+#X text 232 332 indicates 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 obj 3 547 doc_also;
+#X obj 103 547 lop~;
+#X obj 139 547 rzero~;
+#X obj 14 332 doc_cc 0;
+#X obj 97 332 doc_m c0 grid;
+#X text 232 455 same as arg 0;
+#X obj 97 517 doc_m o0 grid;
+#X obj 0 567 doc_f;
+#X text 232 420 grids that are blended into each other over time.;
+#X msg 131 131 load b001.jpg;
+#X msg 253 133 load r001.jpg;
+#X text 11 29 temporal low-pass filter;
+#X connect 1 0 30 0;
+#X connect 2 0 10 0;
+#X connect 3 0 10 1;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 6 0 31 0;
+#X connect 7 0 10 0;
+#X connect 8 0 6 0;
+#X connect 9 0 8 0;
+#X connect 10 0 0 0;
+#X connect 18 1 29 0;
+#X connect 19 1 26 0;
+#X connect 21 1 22 0;
+#X connect 21 1 23 0;
+#X connect 25 1 20 0;
+#X connect 30 0 2 0;
+#X connect 31 0 7 0;
diff --git a/externals/gridflow/doc/flow_classes/#fade_lin-help.pd b/externals/gridflow/doc/flow_classes/#fade_lin-help.pd
new file mode 100644
index 00000000..189ec0b9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fade_lin-help.pd
@@ -0,0 +1,36 @@
+#N canvas 684 0 632 543 10;
+#X obj 0 0 doc_h;
+#X obj 3 212 doc_c 2;
+#X obj 77 134 #fade_lin;
+#X obj 3 296 doc_i 3;
+#X obj 3 454 doc_o 1;
+#X obj 14 326 doc_ii 0;
+#X obj 14 400 doc_ii 1;
+#X obj 14 422 doc_ii 2;
+#X obj 14 484 doc_oo 0;
+#X obj 14 242 doc_cc 0;
+#X obj 14 264 doc_cc 1;
+#X obj 97 242 doc_m c0 grid;
+#X obj 97 264 doc_m c1 grid;
+#X text 232 242 maxraise;
+#X text 232 264 maxdrop;
+#X obj 97 326 doc_m i0 grid;
+#X text 232 326 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.
+;
+#X obj 97 400 doc_m i1 grid;
+#X obj 97 422 doc_m i2 grid;
+#X text 232 400 same as arg 0;
+#X text 232 422 same as arg 1;
+#X obj 0 514 doc_f;
+#X text 16 33 non-linear temporal lowpass filter;
+#X text 16 47 (piecewise-constant);
+#X text 14 61 it is named "lin" because it has an output similar to
+[line] \, though the input is much different.;
+#X connect 11 1 13 0;
+#X connect 12 1 14 0;
+#X connect 15 1 16 0;
+#X connect 17 1 19 0;
+#X connect 18 1 20 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..12ce00a6
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fastblur-help.pd
@@ -0,0 +1,90 @@
+#N canvas 310 131 632 598 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 403 28 pd test convolve attr;
+#X obj 20 54 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 38 55 metro 33.3667;
+#X obj 100 93 loadbang;
+#X obj 84 94 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 38 110 #store;
+#X obj 38 290 #out window;
+#X obj 39 330 display;
+#X obj 38 309 fps detailed;
+#X obj 84 110 #in teapot.png;
+#X obj 248 56 f;
+#X obj 274 56 + 1;
+#X obj 149 301 #pack;
+#X obj 38 85 t b b;
+#X obj 38 131 #fastblur;
+#X obj 255 96 expr 1+100*pow(sin($f1/25) \, 4);
+#X obj 244 76 expr 1+100*pow(sin($f1/20) \, 4);
+#X obj 150 167 vsl 15 128 1 128 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 170 167 vsl 15 128 1 128 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 248 37 spigot;
+#X obj 294 38 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 38 270 #gamma 700;
+#X text 313 38 AUTO;
+#X obj 0 0 doc_h;
+#X obj 3 423 doc_i 2;
+#X obj 3 361 doc_c 1;
+#X obj 3 507 doc_o 1;
+#X obj 14 537 doc_oo 0;
+#X obj 14 453 doc_ii 0;
+#X obj 14 475 doc_ii 1;
+#X obj 14 391 doc_cc 0;
+#X obj 0 569 doc_f;
+#X obj 97 537 doc_m o0;
+#X obj 97 391 doc_m c0 grid;
+#X text 232 391 (y x) kernel size;
+#X obj 97 453 doc_m i0 grid;
+#X obj 97 475 doc_m i1 grid;
+#X text 232 475 same as arg 0;
+#X text 232 453 image to be blurred;
+#X text 232 537 image blurred;
+#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;
+#X connect 32 1 39 0;
+#X connect 33 1 34 0;
+#X connect 35 1 38 0;
+#X connect 36 1 37 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..1b240df9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fft-help.pd
@@ -0,0 +1,73 @@
+#N canvas 653 206 632 642 10;
+#X obj 13 144 #cast f;
+#X obj 13 236 #cast i;
+#X obj 13 86 #in teapot.png;
+#X obj 32 64 loadbang;
+#X obj 13 65 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X obj 13 106 t a a;
+#X obj 13 198 #fft;
+#X msg 23 169 help;
+#X msg 43 197 skip \$1;
+#X obj 64 163 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X obj 52 106 s orig;
+#X obj 66 312 r orig;
+#X obj 13 331 #out window;
+#X obj 13 274 # + 128;
+#X obj 13 293 #clip;
+#X obj 13 125 #outer * (1 0);
+#X obj 13 255 #inner (1 0);
+#X text 89 255 convert complex to real (kicking dummy imaginary);
+#X text 100 125 convert real to complex (introducing dummy imaginary=0)
+;
+#X obj 13 217 # / (f # 16);
+#X obj 0 0 doc_h;
+#X obj 3 355 doc_c 0;
+#X obj 3 395 doc_i 1;
+#X obj 3 589 doc_o 1;
+#X obj 14 619 doc_oo 0;
+#X obj 14 425 doc_ii 0;
+#X obj 0 651 doc_f;
+#X obj 13 312 #join 1;
+#X obj 97 619 doc_m o0 grid;
+#X obj 97 425 doc_m i0 grid;
+#X obj 97 491 doc_m i0 sign;
+#X obj 97 535 doc_m i0 skip;
+#X text 232 557 1: skip the y dimension (do fft only along x);
+#X text 20 35 spatial fft;
+#X obj 97 447 doc_m i0 real;
+#X text 232 535 0: don't skip the y dimension (do fft along both y
+and x);
+#X text 232 491 1: forward fft;
+#X text 232 513 -1: backward fft;
+#X text 232 447 0: complex fft;
+#X text 232 469 1: real fft;
+#X text 232 425 grid to apply fft on;
+#X text 232 619 grid that fft was applied on;
+#X connect 0 0 6 0;
+#X connect 1 0 16 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 15 0;
+#X connect 5 1 10 0;
+#X connect 6 0 19 0;
+#X connect 7 0 6 0;
+#X connect 8 0 6 0;
+#X connect 9 0 8 0;
+#X connect 11 0 27 1;
+#X connect 13 0 14 0;
+#X connect 14 0 27 0;
+#X connect 15 0 0 0;
+#X connect 16 0 13 0;
+#X connect 19 0 1 0;
+#X connect 27 0 12 0;
+#X connect 28 1 41 0;
+#X connect 29 1 40 0;
+#X connect 30 1 36 0;
+#X connect 30 1 37 0;
+#X connect 31 1 32 0;
+#X connect 31 1 35 0;
+#X connect 34 1 39 0;
+#X connect 34 1 38 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..46a31bdb
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#finished-help.pd
@@ -0,0 +1,54 @@
+#N canvas 648 0 632 642 10;
+#X text 21 37 a bang is emitted every time a grid transmission ends
+;
+#X obj 23 114 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 23 85 #finished;
+#X obj 0 0 doc_h;
+#X obj 3 568 doc_i 1;
+#X obj 3 630 doc_o 1;
+#X obj 3 528 doc_c 0;
+#X obj 14 660 doc_oo 0;
+#X obj 14 598 doc_ii 0;
+#X obj 97 598 doc_m i0 grid;
+#X obj 97 660 doc_m o0 bang;
+#X text 232 598 a bang is emitted every time a grid transmission ends.
+;
+#X obj 0 710 doc_f;
+#X obj 23 66 t a a;
+#X obj 89 66 #convolve (1 3 # 1 2 1);
+#X text 90 85 this is a pattern where [t b a] doesn't cut it \, because
+the bang would be output too early \, as it gets output at GRID_BEGIN
+time (the time at which the grid message is sent). But [#convolve]
+only outputs its contents after GRID_FLOW time \, which is what [#finished]
+ensures. However you still need a [t a a] \, because [#finished]'s
+GRID_FINISH time must happen after [#convolve]'s GRID_FINISH \, so
+that you can be sure that [#convolve] is really finished with producing
+its output.;
+#X obj 3 690 doc_also;
+#X obj 103 690 #t;
+#X text 39 278 the 2nd exception is that it definitely doesn't support
+any control-recursion (an object can't start processing a new message
+before it has finished processing its message).;
+#X obj 410 221 pdp_qt;
+#X obj 410 252 print;
+#X msg 409 199;
+#X text 40 327 the third exception is that the GRID atom type is not
+officially recognised by PureData because PureData provides no means
+for externals to register new atom types. You can see the effect of
+this in how GEM uses the POINTER atom type in an unstable way (which
+is also how GridFlow used to do it);
+#X text 38 215 this is one of GridFlow's exceptions to how much grid-processing
+is like normal pd message passing. there is also the [#t] class that
+provides a shortcut for the most common use pattern of [#t].;
+#X text 41 416 the fourth exception is that GridInlets support multiple
+selectors with quite peculiar autocasts \, meaning that [# +] can't
+support the equivalent of the 'list' message in the [+] class.;
+#X text 40 479 much of the text of this page should really go somewhere
+else \, but there is no place for it yet.;
+#X connect 2 0 1 0;
+#X connect 9 1 11 0;
+#X connect 13 0 2 0;
+#X connect 13 1 14 0;
+#X connect 16 1 17 0;
+#X connect 19 0 20 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..0120aad9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#fold-help.pd
@@ -0,0 +1,80 @@
+#N canvas 678 0 632 661 10;
+#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 obj 143 249 #to_float;
+#X obj 143 274 print values;
+#X text 6 721 some other forms:;
+#X obj 140 722 #fold *;
+#X obj 17 695 #fold + \, seed 0;
+#X obj 211 722 #fold ^;
+#X obj 284 722 #fold &;
+#X obj 355 722 #fold |;
+#N canvas 0 0 500 313 more 1;
+#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 #to_float;
+#X obj 122 195 print values;
+#X obj 28 137 #fold + \, seed (0 0);
+#X connect 1 0 0 0;
+#X connect 1 0 7 0;
+#X connect 3 0 1 0;
+#X connect 5 0 6 0;
+#X connect 7 0 2 0;
+#X connect 7 0 5 0;
+#X restore 160 694 pd more info;
+#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 224 #fold +;
+#X text 203 129 <-- clicking here creates a grid through [#import]
+;
+#X obj 3 324 doc_c 1;
+#X obj 3 386 doc_i 1;
+#X obj 3 570 doc_o 1;
+#X obj 0 0 doc_h;
+#X obj 14 600 doc_oo 0;
+#X obj 14 416 doc_ii 0;
+#X obj 14 354 doc_cc 0;
+#X text 219 155 [#fold +] computes totals;
+#X text 221 176 [#fold inv+] is an alternated sum (+/-);
+#X text 225 203 [#fold *] can compute the size of a grid using its
+dimension list;
+#X text 229 240 [#fold &] can mean "for all";
+#X text 228 260 [#fold |] can mean "there exists (at least one)";
+#X text 224 282 [#fold ^] can mean "there exists an odd number of..."
+;
+#X obj 97 354 doc_m c0 symbol/numop;
+#X text 232 354 the operator to fold with.;
+#X obj 97 416 doc_m i0 grid;
+#X obj 97 477 doc_m i0 op;
+#X obj 97 499 doc_m i0 seed;
+#X text 232 477 same as arg 0;
+#X text 232 416 replaces every 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".;
+#X text 232 499 the initial value for the folding. (default: whatever
+does nothing for the chosen op \; e.g. 0 + \, 0 - \, 1 * \, ...). this
+can be a grid of any size \, and this decides the size of the subgrids
+we are working on.;
+#X obj 97 600 doc_m o0 grid;
+#X text 232 600 Outputs a grid that has one less dimension than the
+input.;
+#X obj 0 632 doc_f;
+#X connect 3 0 4 0;
+#X connect 12 0 13 0;
+#X connect 13 0 0 0;
+#X connect 13 0 14 0;
+#X connect 14 0 1 0;
+#X connect 14 0 3 0;
+#X connect 29 1 30 0;
+#X connect 31 1 35 0;
+#X connect 32 1 34 0;
+#X connect 33 1 36 0;
+#X connect 37 1 38 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..28903e51
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#for-help.pd
@@ -0,0 +1,83 @@
+#N canvas 661 0 632 642 10;
+#X floatatom 13 197 5 0 0 0 - - -;
+#X floatatom 45 219 5 0 0 0 - - -;
+#X floatatom 78 238 5 0 0 0 - - -;
+#X obj 13 329 #print;
+#X obj 33 296 display;
+#X text 119 238 <-- step value;
+#X text 90 217 <-- upper bound;
+#X text 60 194 <-- lower bound;
+#X obj 13 261 #for 0 8 1;
+#X obj 264 328 #print;
+#X obj 314 288 display;
+#X msg 264 198 0 0;
+#X msg 369 244 1 1;
+#X msg 326 223 4 4;
+#X text 232 484 Upper bound;
+#X text 232 506 Step value;
+#X text 232 449 Lower bound. As with the other arguments \, they are
+overwritten when another value is given.;
+#X text 414 244 <-- step value (1);
+#X text 373 222 <-- upper bound (2);
+#X text 309 197 <-- 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 232 656 Sets the upper bound;
+#X text 232 678 Sets the step value;
+#X text 232 740 The result of the operation is a single dimension grid
+in the case of scalar values and variable dimensions for vectors.;
+#X obj 0 0 doc_h;
+#X obj 3 538 doc_i 3;
+#X obj 3 419 doc_c 3;
+#X text 232 568 activate object (send output);
+#X text 232 590 Sets the lower bound and activate;
+#X text 232 634 Sets the lower bound without activating;
+#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. (try it below);
+#X text 27 132 the formula for knowing the size of the output will
+be is floor((to-from)/step).;
+#X obj 14 740 doc_oo 0;
+#X obj 14 506 doc_cc 2;
+#X text 232 612 the three arguments at once;
+#X obj 14 449 doc_cc 0;
+#X obj 14 484 doc_cc 1;
+#X obj 14 568 doc_ii 0;
+#X obj 3 710 doc_o 1;
+#X obj 14 656 doc_ii 1;
+#X obj 14 678 doc_ii 2;
+#X text 11 177 With scalar bounds:;
+#X text 262 178 With vector bounds:;
+#X obj 97 612 doc_m i0 list;
+#X obj 97 568 doc_m i0 bang;
+#X obj 97 634 doc_m i0 set;
+#X obj 97 449 doc_m c0 grid;
+#X obj 97 484 doc_m c1 grid;
+#X obj 97 506 doc_m c2 grid;
+#X obj 97 590 doc_m i0 grid;
+#X obj 97 656 doc_m i1 grid;
+#X obj 97 678 doc_m i2 grid;
+#X obj 0 798 doc_f;
+#X obj 264 267 #for (0 0) (8 3) (1 1);
+#X obj 97 740 doc_m o0 grid;
+#X connect 0 0 8 0;
+#X connect 1 0 8 1;
+#X connect 2 0 8 2;
+#X connect 8 0 4 0;
+#X connect 8 0 3 0;
+#X connect 11 0 53 0;
+#X connect 12 0 53 2;
+#X connect 13 0 53 1;
+#X connect 43 1 34 0;
+#X connect 44 1 27 0;
+#X connect 45 1 29 0;
+#X connect 46 1 16 0;
+#X connect 47 1 14 0;
+#X connect 48 1 15 0;
+#X connect 49 1 28 0;
+#X connect 50 1 21 0;
+#X connect 51 1 22 0;
+#X connect 53 0 10 0;
+#X connect 53 0 9 0;
+#X connect 54 1 23 0;
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..d92aa497
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#from_pix-help.pd
@@ -0,0 +1,89 @@
+#N canvas 679 122 632 642 10;
+#X text 169 629 \, game_of_life_gem.pd in the examples folder;
+#X text 232 575 Grid with 4 channels;
+#X text 232 478 With one boolean argument that selects the order in
+which the y dimension of the Grid will be read \, defaults to '1';
+#X text 103 629 [#to_pix];
+#X obj 37 128 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0 1
+;
+#X msg 54 127 yflip \$1;
+#X obj 22 39 gemhead;
+#X obj 22 107 pix_image;
+#X msg 391 55 create \, 1;
+#X obj 391 36 loadbang;
+#X msg 455 56 destroy;
+#X text 36 201 Note : The fps is dependent on the gemwin framerate
+;
+#X text 101 184 <-- imports gemlist into Grids;
+#X text 232 456 Has to be a 'pix' gemlist;
+#X text 232 597 Passthrough outlet for gem chain;
+#X obj 0 0 doc_h;
+#X obj 3 298 doc_c 0;
+#X obj 3 545 doc_o 2;
+#X obj 3 629 doc_also;
+#X obj 14 575 doc_oo 0;
+#X obj 14 597 doc_oo 1;
+#X obj 3 338 doc_i 2;
+#X obj 14 368 doc_ii 0;
+#X obj 14 513 doc_ii 1;
+#X text 232 513 dummy inlet existing only for weird reasons \, please
+ignore.;
+#X obj 97 478 doc_m i0 yflip;
+#X obj 97 575 doc_m o0 grid;
+#X obj 0 649 doc_f;
+#X msg 30 82 open images/babbage.jpg;
+#X obj 97 513 doc_m i1 <none>;
+#X msg 186 90 open \$1;
+#X obj 186 71 openpanel;
+#X obj 186 54 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 30 62 loadbang;
+#X obj 22 242 fps;
+#X floatatom 22 261 5 0 0 0 - - -;
+#X obj 22 223 #out window \, title imported_pix;
+#X msg 159 109 cast b;
+#X msg 159 147 cast i;
+#X obj 22 179 #import_pix;
+#X obj 97 368 doc_m i0 cast;
+#X text 232 368 numbertype of grid to be output;
+#X msg 159 128 cast s;
+#X obj 97 390 doc_m i0 colorspace;
+#X text 232 412 colorspace rgb: output 3 channels;
+#X text 232 390 colorspace rgba: output 4 channels;
+#X msg 259 148 colorspace rgb;
+#X msg 259 168 colorspace rgba;
+#X obj 390 85 gemwin 150;
+#X text 232 434 (default: rgba);
+#X obj 97 456 doc_m i0 gem_state;
+#X obj 97 597 doc_m o1 gem_state;
+#X connect 4 0 5 0;
+#X connect 5 0 39 0;
+#X connect 6 0 7 0;
+#X connect 7 0 39 0;
+#X connect 8 0 48 0;
+#X connect 9 0 8 0;
+#X connect 10 0 48 0;
+#X connect 18 1 3 0;
+#X connect 18 1 0 0;
+#X connect 25 1 2 0;
+#X connect 26 1 1 0;
+#X connect 28 0 7 0;
+#X connect 29 1 24 0;
+#X connect 30 0 7 0;
+#X connect 31 0 30 0;
+#X connect 32 0 31 0;
+#X connect 33 0 28 0;
+#X connect 34 0 35 0;
+#X connect 36 0 34 0;
+#X connect 37 0 39 0;
+#X connect 38 0 39 0;
+#X connect 39 0 36 0;
+#X connect 40 1 41 0;
+#X connect 42 0 39 0;
+#X connect 43 1 44 0;
+#X connect 43 1 45 0;
+#X connect 43 1 49 0;
+#X connect 46 0 39 0;
+#X connect 47 0 39 0;
+#X connect 50 1 13 0;
+#X connect 51 1 14 0;
diff --git a/externals/gridflow/doc/flow_classes/#gamma-help.pd b/externals/gridflow/doc/flow_classes/#gamma-help.pd
new file mode 100644
index 00000000..adbec0dd
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#gamma-help.pd
@@ -0,0 +1,29 @@
+#N canvas 535 121 632 375 10;
+#X obj 0 0 doc_h;
+#X obj 0 346 doc_f;
+#X obj 57 63 #gamma;
+#X obj 3 118 doc_c 1;
+#X obj 3 180 doc_i 2;
+#X obj 3 264 doc_o 1;
+#X obj 14 148 doc_cc 0;
+#X obj 14 210 doc_ii 0;
+#X obj 14 232 doc_ii 1;
+#X obj 14 294 doc_oo 0;
+#X obj 3 326 doc_also;
+#X obj 103 326 # gamma;
+#X text 175 63 accelerated (cached) version of [# gamma];
+#X obj 97 210 doc_m i0 grid;
+#X obj 97 148 doc_m c0 float/int;
+#X obj 97 232 doc_m i1 float int;
+#X obj 97 294 doc_m o0 grid;
+#X text 232 148 positive int;
+#X text 175 82 note: this only accepts a single float argument \, whereas
+[# gamma] allows a grid argument.;
+#X text 232 232 same as arg 0;
+#X text 232 210 pixels to apply on;
+#X text 232 294 output pixels;
+#X connect 10 1 11 0;
+#X connect 13 1 20 0;
+#X connect 14 1 17 0;
+#X connect 15 1 19 0;
+#X connect 16 1 21 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..d05aeaea
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#grade-help.pd
@@ -0,0 +1,45 @@
+#N canvas 690 0 632 680 10;
+#X text 143 55 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 114 5 0 0 0 - - -;
+#X floatatom 60 114 5 0 0 0 - - -;
+#X floatatom 101 114 5 0 0 0 - - -;
+#X floatatom 142 114 5 0 0 0 - - -;
+#X obj 19 146 #pack 4;
+#X obj 19 179 #grade;
+#X obj 19 208 #print;
+#X obj 0 0 doc_h;
+#X obj 3 250 doc_c 0;
+#X obj 3 290 doc_i 1;
+#X obj 3 350 doc_o 1;
+#X obj 14 380 doc_oo 0;
+#X obj 14 320 doc_ii 0;
+#X obj 97 320 doc_m i0 grid;
+#X obj 97 380 doc_m o0 grid;
+#X text 232 380 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.;
+#X text 232 441 for example \, connecting a [#grade] to a [#outer ignore
+0] to a [#store] object \, storing a single vector into [#store] \,
+and sending the same vector to [#grade] \, will sort the values of
+the vector. however for higher-dimensional grids \, what should go
+between [#store] and [#grade] to achieve the same result would be more
+complex.;
+#X text 232 541 you may achieve different kinds of sorting by applying
+various filters before [#grade]. the possibilities are unlimited. if
+you plug [#grade] directly into another [#grade] \, 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.;
+#X obj 0 651 doc_f;
+#X connect 1 0 5 0;
+#X connect 2 0 5 1;
+#X connect 3 0 5 2;
+#X connect 4 0 5 3;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 15 1 16 0;
+#X connect 15 1 17 0;
+#X connect 15 1 18 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..c98ea289
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#greyscale_to_rgb-help.pd
@@ -0,0 +1,26 @@
+#N canvas 693 0 632 471 10;
+#X obj 19 161 s xx;
+#X obj 19 185 r xx;
+#X obj 19 105 #in;
+#X obj 19 141 #rgb_to_greyscale;
+#X obj 19 205 #greyscale_to_rgb;
+#X obj 19 243 #out window;
+#X msg 19 74 load bluemarble.jpg;
+#X obj 0 0 doc_h;
+#X obj 3 278 doc_c 0;
+#X obj 3 318 doc_i 1;
+#X obj 3 380 doc_o 1;
+#X obj 14 348 doc_ii 0;
+#X obj 14 410 doc_oo 0;
+#X obj 97 348 doc_m i0;
+#X obj 97 410 doc_m o0;
+#X text 232 410 rgb pixels;
+#X text 232 348 greyscale pixels;
+#X obj 0 442 doc_f;
+#X connect 1 0 4 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 6 0 2 0;
+#X connect 13 1 16 0;
+#X connect 14 1 15 0;
diff --git a/externals/gridflow/doc/flow_classes/#hello-help.pd b/externals/gridflow/doc/flow_classes/#hello-help.pd
new file mode 100644
index 00000000..d759b412
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#hello-help.pd
@@ -0,0 +1,23 @@
+#N canvas 610 97 632 367 10;
+#X obj 92 137 #out window;
+#X obj 92 117 #hello;
+#X obj 92 77 loadbang;
+#X obj 0 0 doc_h;
+#X obj 3 170 doc_c;
+#X obj 0 334 doc_f;
+#X obj 3 210 doc_i 1;
+#X obj 14 240 doc_ii 0;
+#X obj 97 240 doc_m i0 list;
+#X text 232 240 Size of the grid.;
+#X obj 3 272 doc_o 1;
+#X obj 14 302 doc_oo 0;
+#X obj 97 302 doc_m o0 grid;
+#X text 9 35 Generates a television test pattern of 7 colour bars à
+la SMPTE.;
+#X text 232 302 Returns a grid representing the 7 colour bars.;
+#X msg 92 97 200 200;
+#X connect 1 0 0 0;
+#X connect 2 0 15 0;
+#X connect 8 1 9 0;
+#X connect 12 1 14 0;
+#X connect 15 0 1 0;
diff --git a/externals/gridflow/doc/flow_classes/#hueshift-help.pd b/externals/gridflow/doc/flow_classes/#hueshift-help.pd
new file mode 100644
index 00000000..7b5853d7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#hueshift-help.pd
@@ -0,0 +1,20 @@
+#N canvas 692 0 632 364 10;
+#X obj 0 0 doc_h;
+#X obj 65 74 #hueshift;
+#X obj 3 105 doc_c 0..1;
+#X obj 3 165 doc_i 2;
+#X obj 3 275 doc_o 1;
+#X obj 14 195 doc_ii 0;
+#X obj 14 243 doc_ii 1;
+#X obj 14 135 doc_cc 0;
+#X obj 14 305 doc_oo 0;
+#X obj 97 135 doc_m c0 float;
+#X obj 97 195 doc_m i0 grid;
+#X obj 97 243 doc_m i1 float;
+#X text 232 243 same as arg 0;
+#X obj 97 305 doc_m o0 grid;
+#X text 232 195 RGB picture that gets hueshifted by a rotation in the
+colorwheel by the specified angle \; it gets sent to outlet 0;
+#X obj 0 335 doc_f;
+#X connect 10 1 14 0;
+#X connect 11 1 12 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..2620c142
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#import-help.pd
@@ -0,0 +1,88 @@
+#N canvas 648 0 632 642 10;
+#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 text 232 250 The argument establishes grid dimensions in parentheses
+in the order of columns \, rows and grid dimensions.;
+#X text 232 456 Symbols are considered as a list of ascii characters.
+;
+#X text 232 478 Like a sequence of ints sent one after another \, except
+in a single message.;
+#X text 232 680 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 232 421 This equivalent to filtering the grid through an [#to_float]
+object. It is over ten times faster.;
+#X msg 157 125 per_message;
+#X msg 158 147 240 320 3;
+#X text 232 347 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 232 579 "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 232 535 "to_ascii \$1" converts ints as decimal in ascii codes
+;
+#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 obj 0 0 doc_h;
+#X obj 3 317 doc_i 2;
+#X obj 13 149 #import (240 320 3);
+#X obj 3 650 doc_o 1;
+#X obj 3 220 doc_c 2;
+#X text 232 285 default: i;
+#X obj 14 347 doc_ii 0;
+#X obj 14 557 doc_ii 1;
+#X obj 14 250 doc_cc 0;
+#X obj 14 285 doc_cc 1;
+#X obj 97 250 doc_m c0 grid;
+#X obj 97 285 doc_m c1 numtype;
+#X obj 97 347 doc_m i0 float;
+#X obj 97 456 doc_m i0 symbol;
+#X obj 97 478 doc_m i0 list;
+#X obj 97 513 doc_m i0 reset;
+#X text 232 513 aborts the current grid if there is one.;
+#X obj 97 535 doc_m i0 to_ascii;
+#X obj 97 421 doc_m i0 grid;
+#X obj 97 579 doc_m i1 per_message;
+#X obj 97 557 doc_m i1 grid;
+#X obj 14 680 doc_oo 0;
+#X obj 97 680 doc_m o0 grid;
+#X obj 0 725 doc_f;
+#X text 232 557 same as arg 0;
+#X connect 0 0 23 0;
+#X connect 1 0 4 0;
+#X connect 2 0 23 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 12 0 23 1;
+#X connect 13 0 23 1;
+#X connect 17 0 20 0;
+#X connect 18 0 17 0;
+#X connect 19 0 18 0;
+#X connect 23 0 5 0;
+#X connect 31 1 6 0;
+#X connect 32 1 26 0;
+#X connect 33 1 14 0;
+#X connect 34 1 7 0;
+#X connect 35 1 8 0;
+#X connect 36 1 37 0;
+#X connect 38 1 16 0;
+#X connect 39 1 11 0;
+#X connect 40 1 15 0;
+#X connect 41 1 45 0;
+#X connect 43 1 9 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..cbb4cd46
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#in-help.pd
@@ -0,0 +1,236 @@
+#N canvas 679 0 632 642 10;
+#X obj 354 172 #out window;
+#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 text 232 759 "loop 0" - turns off the loop option. The video stops
+once it reaches the end.;
+#X text 232 1060 Signals the end of a file and when a file is unreadable.
+;
+#X text 232 1038 Displays the resulting grid when connected to [#out
+window];
+#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 251 964 pd quicktime file messages;
+#X obj 354 150 #in;
+#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 17 227 #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 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 258 #in sewing.jpg;
+#X text 378 234 <--click here;
+#X text 183 947 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 251 925 pd more info about video devices;
+#X text 183 908 For info about messages specifically for video devices
+\, click on:;
+#X text 169 213 (and turn off the metro);
+#X text 244 195 <-- vary this;
+#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 17 305 #out window \, title video;
+#X text 232 724 "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 obj 0 0 doc_h;
+#X obj 3 450 doc_i 1;
+#X obj 3 1008 doc_o 2;
+#X obj 14 480 doc_ii 0;
+#X obj 14 1038 doc_oo 0;
+#X obj 14 1060 doc_oo 1;
+#X obj 3 332 doc_c 1..2;
+#X text 164 389 auto-open with auto-detect of the format-handler;
+#X text 207 409 auto-open with manual choice of the format-handler
+;
+#X obj 97 794 doc_m i0 open;
+#X obj 97 851 doc_m i0 set;
+#X obj 97 667 doc_m i0 close;
+#X obj 97 829 doc_m i0 rewind;
+#X obj 97 724 doc_m i0 loop;
+#X obj 97 645 doc_m i0 float int;
+#X obj 97 1038 doc_m o0 grid;
+#X obj 97 1060 doc_m o1 bang;
+#X obj 3 1127 doc_also;
+#X obj 103 1127 #out;
+#X obj 32 370 #in;
+#X obj 33 391 #in filename.suffix;
+#X obj 34 411 #in handler filename.suffix;
+#X text 64 369 nothing opened \, you have to open by yourself;
+#X text 232 794 \$1=filename. sends it as a resource to [#in]. For
+example: "open sewing.jpg".;
+#X obj 97 480 doc_m i0 bang;
+#X obj 97 1082 doc_m o1 float int;
+#X text 232 1082 frame number of the frame currently being viewed.
+Applies to formats that have frame numbers \, i.e. video.;
+#X text 232 480 A bang reads a frame and sends it through the outlet.
+Since frames from videos and live streams are read as a series of individual
+grids \, successive bangs advance through the frames. A bang reads
+a frame and sends it through the outlet. Since frames from videos and
+live streams are read as a series of individual grids \, successive
+bangs advance through the frames. this is format-specific. most formats
+produce grids that have dimensions (rows columns rgb). 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.
+;
+#X obj 0 1147 doc_f;
+#X text 232 667 Closes the video input device. Only necessary when
+you are using a live capture device.;
+#X text 232 829 Will rewind video to the beginning.;
+#X text 232 851 select the video frame numbered \$1 \, where 0 is the
+first frame. A bang must be sent to [#in] in order to display the frame.
+this only works with video file formats.;
+#X text 232 645 same as set \$1 \, bang;
+#X obj 97 702 doc_m i0 load;
+#X text 232 702 shortcut for open \$1 \, bang \, close;
+#X connect 2 0 9 0;
+#X connect 3 0 9 0;
+#X connect 9 0 0 0;
+#X connect 10 0 17 0;
+#X connect 11 0 17 0;
+#X connect 12 0 17 0;
+#X connect 13 0 17 0;
+#X connect 15 0 17 0;
+#X connect 17 0 36 0;
+#X connect 17 1 14 0;
+#X connect 17 1 38 0;
+#X connect 19 0 20 0;
+#X connect 20 0 17 0;
+#X connect 21 0 23 0;
+#X connect 23 0 22 0;
+#X connect 32 0 17 0;
+#X connect 38 0 16 0;
+#X connect 39 0 17 0;
+#X connect 49 1 63 0;
+#X connect 50 1 71 0;
+#X connect 51 1 69 0;
+#X connect 52 1 70 0;
+#X connect 53 1 37 0;
+#X connect 53 1 5 0;
+#X connect 54 1 72 0;
+#X connect 55 1 7 0;
+#X connect 56 1 6 0;
+#X connect 57 1 58 0;
+#X connect 64 1 67 0;
+#X connect 65 1 66 0;
+#X connect 73 1 74 0;
diff --git a/externals/gridflow/doc/flow_classes/#inner-help.pd b/externals/gridflow/doc/flow_classes/#inner-help.pd
new file mode 100644
index 00000000..612a2c6a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#inner-help.pd
@@ -0,0 +1,56 @@
+#N canvas 666 0 632 642 10;
+#X obj 0 0 doc_h;
+#X obj 3 158 doc_c 1;
+#X obj 3 218 doc_i 2;
+#X obj 3 560 doc_o 1;
+#X obj 14 188 doc_cc 0;
+#X obj 14 248 doc_ii 0;
+#X obj 14 528 doc_ii 1;
+#X obj 14 590 doc_oo 0;
+#X text 232 248 Splits the Dim(anyA... \, lastA) left-hand grid into
+Dim(anyA...) pieces of Dim(lastA) size.;
+#X text 232 283 Splits the Dim(firstB \, anyB...) right-hand grid into
+Dim(anyB...) pieces of Dim(firstB) size.;
+#X text 232 318 On every piece pair \, does [#] using the specified
+op_para operation \, followed by a [#fold] using the specified op_fold
+operator and base value.;
+#X text 232 366 creates a Dim(anyA... \, anyB...) grid by assembling
+all the results together.;
+#X text 232 401 (note: lastA must be equal to firstB.);
+#X text 232 528 same as arg 0;
+#X text 232 471 the operation that combines the values from the two
+grids together. this defaults to "*" (as in the matrix product);
+#X text 232 423 the operation that combines the result of the "op"
+operations together. this defaults to "+" (as in the matrix product)
+;
+#X text 232 506 the base value for the fold;
+#X obj 0 640 doc_f;
+#X obj 97 248 doc_m i0 grid;
+#X obj 97 188 doc_m c0 grid;
+#X obj 97 471 doc_m i0 op;
+#X obj 97 506 doc_m i0 seed;
+#X obj 97 528 doc_m i1 grid;
+#X obj 97 590 doc_m o0 grid;
+#X obj 97 423 doc_m i0 fold;
+#X obj 3 620 doc_also;
+#X obj 103 620 #outer *;
+#X obj 163 620 #fold +;
+#X obj 62 89 #inner;
+#X text 160 48 think of this one as a special combination of [#outer]
+\, [#] and [#fold]. 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 [#inner]. [#inner] also does dot product and other funny operations.
+;
+#X connect 18 1 8 0;
+#X connect 18 1 9 0;
+#X connect 18 1 10 0;
+#X connect 18 1 11 0;
+#X connect 18 1 12 0;
+#X connect 20 1 14 0;
+#X connect 21 1 16 0;
+#X connect 22 1 13 0;
+#X connect 24 1 15 0;
+#X connect 25 1 26 0;
+#X connect 25 1 27 0;
diff --git a/externals/gridflow/doc/flow_classes/#io.aalib-help.pd b/externals/gridflow/doc/flow_classes/#io.aalib-help.pd
new file mode 100644
index 00000000..e97765d1
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#io.aalib-help.pd
@@ -0,0 +1,45 @@
+#N canvas 684 0 632 568 10;
+#X obj 0 0 doc_h;
+#X obj 3 67 doc_c;
+#X msg 48 109 open aalib X11;
+#X text 161 105 Normally "X11" with uppercase X \; else consult the
+AALib manual.;
+#X text 161 141 you can pass "commandline options" of AALib here \,
+after "X11" or whichever other thing you chose instead of "X11".;
+#X obj 3 179 doc_i 1;
+#X obj 3 477 doc_o 1;
+#X obj 14 209 doc_ii 0;
+#X obj 14 507 doc_oo 0;
+#X obj 97 507 doc_m o0 grid;
+#X obj 97 209 doc_m i0 grid;
+#X text 232 209 grid(rows columns 1): 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.;
+#X text 232 257 grid(rows columns 2): the inverse of "dump". Both together
+in a loop allow to post-process aalib's buffer before displaying. Goes
+well with "draw" \, "autodraw". the first channel is for the ascii
+codes and the second channel is for the attributes (colour \, blink).
+;
+#X obj 97 432 doc_m i0 print;
+#X text 232 432 \$1=y \$2=x \$3=attr \$4=text where text is a symbol
+and the rest are ints.;
+#X obj 97 331 doc_m i0 autodraw;
+#X text 232 331 "autodraw 1" does a "draw" after each incoming grid.
+;
+#X text 232 353 "autodraw 0" does not.;
+#X obj 97 375 doc_m i0 draw;
+#X text 232 375 eventually you need to use this if you use "autodraw
+0".;
+#X obj 97 397 doc_m i0 dump;
+#X text 232 397 produces a Dim[y \, x \, 2] grid whose two channels
+are ascii character codes and character attributes.;
+#X obj 0 539 doc_f;
+#X text 232 507 result of 'dump';
+#X connect 9 1 23 0;
+#X connect 10 1 11 0;
+#X connect 10 1 12 0;
+#X connect 13 1 14 0;
+#X connect 15 1 16 0;
+#X connect 15 1 17 0;
+#X connect 18 1 19 0;
+#X connect 20 1 21 0;
diff --git a/externals/gridflow/doc/flow_classes/#io.grid-help.pd b/externals/gridflow/doc/flow_classes/#io.grid-help.pd
new file mode 100644
index 00000000..fc30e0cc
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#io.grid-help.pd
@@ -0,0 +1,44 @@
+#N canvas 689 0 632 608 10;
+#X obj 0 0 doc_h;
+#X obj 3 160 doc_i 1;
+#X text 62 37 This is GridFlow's special file format. This is the only
+I/O format that can hold nearly anything that the [#store] object can.
+;
+#X obj 3 92 doc_c ...;
+#X msg 62 127 open foo.grid;
+#X obj 14 190 doc_ii 0;
+#X obj 97 465 doc_m i0 type;
+#X text 232 465 type that the output will be written as. (#out only)
+;
+#X text 232 487 supported: uint8 int32 and perhaps some others;
+#X obj 97 369 doc_m i0 headerful;
+#X obj 97 404 doc_m i0 headerless;
+#X text 232 369 cancels "headerless" (and back to reading the real
+.grid format);
+#X text 232 404 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: type and
+endian.;
+#X obj 97 190 doc_m i0 endian;
+#X text 232 190 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:;
+#X text 232 238 big: A number will be written starting with the biggest
+digit. This is the natural way on the Macintosh \, Sun \, Amiga \,
+and so on.;
+#X text 232 286 little: A number will be written starting with the
+smallest digit. This is the natural way on the Intel 386/Pentium.;
+#X text 232 321 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.;
+#X obj 0 579 doc_f;
+#X obj 3 519 doc_o 1;
+#X obj 14 549 doc_oo 0;
+#X connect 6 1 7 0;
+#X connect 6 1 8 0;
+#X connect 9 1 11 0;
+#X connect 10 1 12 0;
+#X connect 13 1 14 0;
+#X connect 13 1 15 0;
+#X connect 13 1 16 0;
+#X connect 13 1 17 0;
diff --git a/externals/gridflow/doc/flow_classes/#io.jpeg-help.pd b/externals/gridflow/doc/flow_classes/#io.jpeg-help.pd
new file mode 100644
index 00000000..363c48a7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#io.jpeg-help.pd
@@ -0,0 +1,16 @@
+#N canvas 666 0 632 245 10;
+#X obj 0 0 doc_h;
+#X obj 3 70 doc_i 1;
+#X obj 3 30 doc_c;
+#X obj 3 176 doc_o;
+#X obj 0 216 doc_f;
+#X obj 14 100 doc_ii 0;
+#X obj 97 100 doc_m i0 bang;
+#X obj 97 122 doc_m i0 grid;
+#X obj 97 144 doc_m i0 quality;
+#X text 232 100 read image (when in [#in]);
+#X text 232 122 write image (when in [#out]);
+#X text 232 144 quality percentage (when in [#out]);
+#X connect 6 1 9 0;
+#X connect 7 1 10 0;
+#X connect 8 1 11 0;
diff --git a/externals/gridflow/doc/flow_classes/#io.png-help.pd b/externals/gridflow/doc/flow_classes/#io.png-help.pd
new file mode 100644
index 00000000..0a2f1d05
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#io.png-help.pd
@@ -0,0 +1,18 @@
+#N canvas 674 0 632 267 10;
+#X obj 0 0 doc_h;
+#X obj 3 70 doc_i 1;
+#X obj 14 100 doc_ii 0;
+#X obj 97 100 doc_m i0 grid;
+#X text 232 100 1-channel is taken as Y 8 (greyscale);
+#X text 232 122 2-channel is taken as YA 8:8 (greyscale and transparency)
+;
+#X text 232 144 3-channel is taken as RGB 8:8:8;
+#X text 232 166 4-channel is taken as RGBA 8:8:8 (colour with transparency)
+;
+#X obj 3 30 doc_c;
+#X obj 3 198 doc_o;
+#X obj 0 238 doc_f;
+#X connect 3 1 4 0;
+#X connect 3 1 5 0;
+#X connect 3 1 6 0;
+#X connect 3 1 7 0;
diff --git a/externals/gridflow/doc/flow_classes/#io.quicktime-help.pd b/externals/gridflow/doc/flow_classes/#io.quicktime-help.pd
new file mode 100644
index 00000000..c4cb6713
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#io.quicktime-help.pd
@@ -0,0 +1,69 @@
+#N canvas 668 0 632 642 10;
+#X obj 0 0 doc_h;
+#X obj 3 218 doc_i 1;
+#X obj 14 248 doc_ii 0;
+#X text 190 43 Support for .mov files. This format supports frame-seek
+and frame-tell. 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. Some versions of those libraries may include support
+for different codecs \, and some also may support entirely different
+wrapper formats such as AVI. On Macintosh \, Apple QuickTime is used
+instead \, but several of the following messages may not be available.
+;
+#X obj 97 248 doc_m i0 codec;
+#X text 232 248 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 [#out]. 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.;
+#X obj 97 584 doc_m i0 parameter;
+#X text 232 584 \$1=symbol \$2=int;
+#X text 232 606 Sets special codec-specific settings. For example:
+"parameter jpeg_quality 75";
+#X obj 97 479 doc_m i0 framerate;
+#X text 232 479 \$1=int;
+#X text 232 501 Sets the framerate of the file. This is not used by
+GridFlow when reading a file \, but other programs usually care.;
+#X obj 97 387 doc_m i0 colorspace;
+#X text 232 387 Allowed values are rgb \, rgba \, bgr \, bgra \, yuv
+\, yuva. Normally you don't need this.;
+#X obj 97 641 doc_m i0 size;
+#X text 232 641 \$1=height \$2=width;
+#X obj 3 721 doc_o 1;
+#X obj 3 901 doc_also;
+#X text 232 663 Forces a window size when writing. Usually this has
+to be used _after_ setting the framerate and codec and _before_ setting
+the codec-parameters. (Strange. Sorry.);
+#X text 232 422 \$1=height \$2=width;
+#X text 232 444 forces a window size when reading. this is a workaround
+for a problem in HW-QuickTime.;
+#X obj 3 178 doc_c;
+#X obj 0 921 doc_f;
+#X obj 97 422 doc_m i0 force_size;
+#X obj 97 549 doc_m i0 get;
+#X text 232 549 output various properties of the video that is open
+(#in) (see outlet 0);
+#X obj 14 751 doc_oo 0;
+#X obj 103 901 #io.mpeg;
+#X obj 97 751 doc_m o0 grid;
+#X obj 97 771 doc_m o0 codec symbol;
+#X obj 97 791 doc_m o0 depth float;
+#X obj 97 811 doc_m o0 framerate float;
+#X obj 97 831 doc_m o0 frames float;
+#X obj 97 851 doc_m o0 height float;
+#X obj 97 871 doc_m o0 width float;
+#X connect 4 1 5 0;
+#X connect 6 1 7 0;
+#X connect 6 1 8 0;
+#X connect 9 1 10 0;
+#X connect 9 1 11 0;
+#X connect 12 1 13 0;
+#X connect 14 1 15 0;
+#X connect 14 1 18 0;
+#X connect 17 1 27 0;
+#X connect 23 1 19 0;
+#X connect 23 1 20 0;
+#X connect 24 1 25 0;
diff --git a/externals/gridflow/doc/flow_classes/#io.videodev-help.pd b/externals/gridflow/doc/flow_classes/#io.videodev-help.pd
new file mode 100644
index 00000000..af431363
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#io.videodev-help.pd
@@ -0,0 +1,77 @@
+#N canvas 676 0 632 642 10;
+#X obj 0 0 doc_h;
+#X obj 26 50 #in videodev;
+#X obj 3 99 doc_c ...;
+#X obj 3 160 doc_i 1;
+#X obj 3 898 doc_o 1;
+#X obj 3 995 doc_also;
+#X obj 103 995 #io:quicktimecamera;
+#X msg 28 129 open videodev /dev/video0;
+#X obj 14 190 doc_ii 0;
+#X obj 97 210 doc_m i0 brightness;
+#X obj 97 539 doc_m i0 hue;
+#X obj 97 338 doc_m i0 colour;
+#X obj 97 378 doc_m i0 contrast;
+#X obj 97 868 doc_m i0 whiteness;
+#X obj 97 418 doc_m i0 get;
+#X obj 97 519 doc_m i0 help;
+#X obj 97 230 doc_m i0 channel;
+#X obj 97 768 doc_m i0 tuner;
+#X obj 97 579 doc_m i0 norm;
+#X obj 97 398 doc_m i0 frequency;
+#X obj 97 619 doc_m i0 transfer symbol;
+#X text 232 619 "read";
+#X text 232 663 "mmap": \$1=nframes (default:2);
+#X text 232 685 This is the normal (and fast) way of transferring pictures
+from the camera.;
+#X text 232 641 Some cameras/drivers only support this instead of mmap.
+;
+#X obj 97 828 doc_m i0 white_red;
+#X obj 97 788 doc_m i0 white_blue;
+#X obj 97 848 doc_m i0 white_speed;
+#X obj 97 808 doc_m i0 white_delay;
+#X obj 97 190 doc_m i0 auto_gain;
+#X obj 97 559 doc_m i0 noise_reduction;
+#X obj 97 358 doc_m i0 compression;
+#X obj 97 250 doc_m i0 colorspace;
+#X text 232 250 "y":;
+#X text 232 272 "yuv":;
+#X text 232 294 "rgb":;
+#X text 232 316 "magic":;
+#X obj 97 599 doc_m i0 size;
+#X text 188 764 \$1=y \$2=x;
+#X text 232 453 "min": minimum values for "size";
+#X text 232 475 "max": maximum values for "size";
+#X text 232 497 default: gets all attributes.;
+#X text 232 418 gets a specific attribute. a message is sent through
+right outlet.;
+#X text 232 720 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.;
+#X obj 0 1015 doc_f;
+#X obj 229 995 #io.dc1394;
+#X obj 14 928 doc_oo 0;
+#X obj 97 928 doc_m o0 grid;
+#X obj 97 950 doc_m o0 <any>;
+#X text 232 928 image coming out;
+#X text 232 950 most any inlet 0 message is also an outlet 0 message
+whose output can be triggered using 'get'.;
+#X text 130 51 get images from a V4L1 camera interface.;
+#X text 130 66 this is for Linux only.;
+#X connect 5 1 6 0;
+#X connect 5 1 45 0;
+#X connect 14 1 42 0;
+#X connect 14 1 39 0;
+#X connect 14 1 40 0;
+#X connect 14 1 41 0;
+#X connect 20 1 21 0;
+#X connect 20 1 24 0;
+#X connect 20 1 22 0;
+#X connect 20 1 23 0;
+#X connect 20 1 43 0;
+#X connect 32 1 33 0;
+#X connect 32 1 34 0;
+#X connect 32 1 35 0;
+#X connect 32 1 36 0;
+#X connect 47 1 49 0;
+#X connect 48 1 50 0;
diff --git a/externals/gridflow/doc/flow_classes/#io.x11-help.pd b/externals/gridflow/doc/flow_classes/#io.x11-help.pd
new file mode 100644
index 00000000..2ccd9a29
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#io.x11-help.pd
@@ -0,0 +1,150 @@
+#N canvas 648 0 632 642 10;
+#X obj 0 0 doc_h;
+#X obj 3 517 doc_c 0..;
+#X msg 40 554 open x11;
+#X msg 40 574 open x11 here;
+#X msg 40 614 open x11 local 0;
+#X text 178 555 synonym of "open x11 here".;
+#X text 181 574 connects to the default X11 server \, according to
+your environment variable "DISPLAY".;
+#X text 182 614 connects to a display server on this machine.;
+#X msg 39 645 open x11 remote foo.org 0;
+#X text 201 644 connects to a remote X11 display server using TCP.
+Port number will be 6000 plus the display number \, because of the
+X11 standard.;
+#X text 141 38 supports 15 \, 16 \, 24 \, 32-bit truecolor displays
+;
+#X text 141 57 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.;
+#X text 141 129 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.;
+#X msg 37 700 open x11 display foo.org:0;
+#X obj 3 736 doc_i 1;
+#X obj 14 766 doc_ii 0;
+#X obj 97 788 doc_m i0 grid;
+#X text 232 788 with [#out] \, displays a frame;
+#X obj 97 766 doc_m i0 bang;
+#X text 232 766 with [#in] \, captures a frame;
+#X obj 97 852 doc_m i0 out_size;
+#X text 232 852 \$1=height \$2=width. changes the window's size \,
+just like sending a grid dim(height \, width \, 3) would. this affects
+the size of screen captures too.;
+#X obj 97 920 doc_m i0 setcursor;
+#X text 232 920 \$1=cursor_id. \$1=cursor_id. 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.);
+#X obj 97 810 doc_m i0 hidecursor;
+#X text 232 810 This makes the cursor invisible.;
+#X obj 3 1903 doc_also;
+#X obj 103 1903 #io.quartz;
+#X obj 175 1903 #io.sdl;
+#X text 141 227 Destroying the object (or sending "close") should close
+the window.;
+#X obj 35 65 #out x11;
+#X text 140 259 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.;
+#X text 140 330 only one window may be used per x11 connection (to
+simplify matters \; this doesn't reduce flexibility).;
+#X text 140 375 there is an additional argument that may be added to
+every "open" 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. 0x28003ff \, you may connect to
+an existing window \; you can find out the number of a window by using
+a tool like xwininfo \, part of X11 standard tools.;
+#X obj 3 1084 doc_o 1;
+#X obj 14 1114 doc_oo 0;
+#X obj 97 1114 doc_m o0 grid;
+#X text 232 1114 grid(rows columns rgb);
+#X text 232 1136 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".;
+#X obj 97 1415 doc_m o0 position;
+#X text 232 1415 \$1=y \$2=x \$3=buttons;
+#X text 232 1437 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.;
+#X text 232 1511 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 [>> buttonnumber] and then checking
+whether the result is odd.;
+#X text 232 1572 0: Shift;
+#X text 232 1594 1: Caps Lock;
+#X text 232 1616 2: Control;
+#X text 232 1638 3: Alternate;
+#X text 232 1660 4: NumLock;
+#X text 232 1682 5: (unknown);
+#X text 232 1704 6: Meta or Window Key;
+#X text 232 1726 7: Scroll Lock;
+#X text 232 1748 8: Left Mouse Button;
+#X text 232 1770 9: Middle Mouse Button or Mouse Wheel Click;
+#X text 232 1792 10: Right Mouse Button;
+#X text 232 1814 11: Wheel Up;
+#X text 232 1836 12: Wheel Down;
+#X text 232 1858 NOTE: This message form may become longer in the future
+\, but the already defined parts will stay the same.;
+#X obj 97 1210 doc_m o0 keypress;
+#X obj 97 1345 doc_m o0 keyrelease;
+#X text 232 1210 \$1=y \$2=x \$3=buttons \$4=keyname;
+#X text 232 1345 \$1=y \$2=x \$3=buttons \$4=keyname;
+#X text 232 1232 Similar to position 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.
+NOTE: This message form may become longer in the future \, but the
+already defined parts will stay the same.;
+#X text 232 1367 Same as keypress but when a key gets released instead.
+NOTE: This message form may become longer in the future \, but the
+already defined parts will stay the same.;
+#X obj 0 1923 doc_f;
+#X obj 97 832 doc_m i0 move;
+#X obj 97 994 doc_m i0 shared_memory;
+#X obj 97 1054 doc_m i0 xvideo;
+#X obj 97 1014 doc_m i0 title;
+#X obj 97 1034 doc_m i0 warp;
+#X obj 97 900 doc_m i0 set_geometry;
+#X text 208 701 other syntax for 'remote'.;
+#X connect 16 1 17 0;
+#X connect 18 1 19 0;
+#X connect 20 1 21 0;
+#X connect 22 1 23 0;
+#X connect 24 1 25 0;
+#X connect 26 1 27 0;
+#X connect 26 1 28 0;
+#X connect 36 1 37 0;
+#X connect 36 1 38 0;
+#X connect 39 1 40 0;
+#X connect 39 1 41 0;
+#X connect 39 1 42 0;
+#X connect 39 1 43 0;
+#X connect 39 1 44 0;
+#X connect 39 1 45 0;
+#X connect 39 1 46 0;
+#X connect 39 1 47 0;
+#X connect 39 1 48 0;
+#X connect 39 1 49 0;
+#X connect 39 1 50 0;
+#X connect 39 1 51 0;
+#X connect 39 1 52 0;
+#X connect 39 1 53 0;
+#X connect 39 1 54 0;
+#X connect 39 1 55 0;
+#X connect 39 1 56 0;
+#X connect 57 1 59 0;
+#X connect 57 1 61 0;
+#X connect 58 1 60 0;
+#X connect 58 1 62 0;
diff --git a/externals/gridflow/doc/flow_classes/#join-help.pd b/externals/gridflow/doc/flow_classes/#join-help.pd
new file mode 100644
index 00000000..10e71f1c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#join-help.pd
@@ -0,0 +1,72 @@
+#N canvas 648 0 632 642 10;
+#X obj 18 42 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 211 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X text 174 228 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 244 39 1 <--;
+#X text 45 41 2 <--;
+#X obj 18 222 #clip;
+#X obj 18 241 #out window;
+#X obj 18 106 #in;
+#X obj 211 125 #rgb_to_greyscale;
+#X obj 211 106 #in;
+#X obj 18 188 #perspective 128;
+#X text 175 160 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 obj 0 0 doc_h;
+#X obj 3 666 doc_also;
+#X obj 3 288 doc_c 0..2;
+#X obj 3 409 doc_i 2;
+#X obj 3 606 doc_o 1;
+#X obj 18 161 #join 2;
+#X obj 14 318 doc_cc 0;
+#X obj 14 379 doc_cc 1;
+#X obj 14 439 doc_ii 0;
+#X obj 14 574 doc_ii 1;
+#X obj 14 636 doc_oo 0;
+#X obj 97 318 doc_m c0 float;
+#X obj 97 379 doc_m c1 grid;
+#X obj 97 439 doc_m i0;
+#X text 232 318 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.;
+#X text 232 439 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.
+;
+#X text 232 513 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.;
+#X text 232 574 same as arg 1;
+#X obj 97 574 doc_m i1 grid;
+#X obj 97 636 doc_m o0 grid;
+#X obj 0 686 doc_f;
+#X msg 18 83 load r001.jpg;
+#X msg 211 78 load b001.jpg;
+#X obj 103 666 listappend;
+#X obj 175 666 list append;
+#X text 234 381 grid to be appended to the left-inlet grid;
+#X connect 0 0 33 0;
+#X connect 1 0 34 0;
+#X connect 5 0 6 0;
+#X connect 7 0 17 0;
+#X connect 8 0 17 1;
+#X connect 9 0 8 0;
+#X connect 10 0 5 0;
+#X connect 13 1 35 0;
+#X connect 13 1 36 0;
+#X connect 17 0 10 0;
+#X connect 23 1 26 0;
+#X connect 25 1 27 0;
+#X connect 25 1 28 0;
+#X connect 30 1 29 0;
+#X connect 33 0 7 0;
+#X connect 34 0 9 0;
diff --git a/externals/gridflow/doc/flow_classes/#labelling-help.pd b/externals/gridflow/doc/flow_classes/#labelling-help.pd
new file mode 100644
index 00000000..053b6ee0
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#labelling-help.pd
@@ -0,0 +1,55 @@
+#N canvas 573 85 632 627 10;
+#X obj 0 0 doc_h;
+#X obj 0 598 doc_f;
+#X obj 71 60 #labelling;
+#X obj 3 300 doc_o 4;
+#X obj 3 190 doc_i 1;
+#X obj 14 330 doc_oo 0;
+#X obj 14 391 doc_oo 1;
+#X obj 14 487 doc_oo 2;
+#X obj 14 544 doc_oo 3;
+#X obj 14 220 doc_ii 0;
+#X obj 97 544 doc_m o3 float;
+#X obj 97 487 doc_m o2 grid;
+#X obj 97 391 doc_m o1 grid;
+#X obj 97 330 doc_m o0 grid;
+#X obj 97 220 doc_m i0 grid;
+#X obj 3 106 doc_c 0..1;
+#X text 232 136 0 : bidimensional form;
+#X text 232 158 1 : form for horizontal lines;
+#X text 232 220 single-channel picture to analyse. the content must
+be made of zeroes and ones (other values are reserved for making the
+output);
+#X text 232 330 single-channel picture in which every contiguous region
+(of ones) is labelled (flood-filled) using a number greater than or
+equal to 2 those numbers are sorted according to the smallest pixel
+index found in each region.;
+#X obj 97 268 doc_m i0 form;
+#X text 232 268 same as arg 0;
+#X text 232 391 when form=0: a grid[2 \, 2] giving the standard-deviation
+([#moment 2]) of each region;
+#X text 232 487 when form=0: a grid[2] giving the centre ([#moment
+1]) of each region;
+#X text 232 544 when form=0: area of each region (in number of pixels)
+;
+#X obj 97 566 doc_m o3 <gone>;
+#X text 232 566 when form=1: not present;
+#X text 232 522 when form=1: not present;
+#X obj 97 522 doc_m o2 <gone>;
+#X text 232 426 when form=1: a grid[2 \, 2] that is a 2-polygon \,
+that is \, just a straight line. this line is horizontal \, and its
+right-side bound is for the first pixel that is NOT in the region.
+;
+#X obj 14 136 doc_cc 0;
+#X obj 97 136 doc_m c0 float/int;
+#X connect 10 1 24 0;
+#X connect 11 1 23 0;
+#X connect 12 1 22 0;
+#X connect 12 1 29 0;
+#X connect 13 1 19 0;
+#X connect 14 1 18 0;
+#X connect 20 1 21 0;
+#X connect 25 1 26 0;
+#X connect 28 1 27 0;
+#X connect 31 1 16 0;
+#X connect 31 1 17 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..0cbedf0f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#layer-help.pd
@@ -0,0 +1,47 @@
+#N canvas 686 0 632 512 10;
+#X text 176 92 opacity channel file;
+#X text 52 62 foreground file;
+#X text 383 83 background file;
+#X text 157 176 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 202 40 load b001.jpg;
+#X obj 179 67 #in;
+#X obj 205 67 #rgb_to_greyscale;
+#X obj 351 83 #in;
+#X msg 374 58 load g001.jpg;
+#X msg 42 38 load r001.jpg;
+#X obj 19 63 #in;
+#X obj 19 175 #layer;
+#X obj 19 206 #out window;
+#X obj 0 0 doc_h;
+#X obj 3 245 doc_c 0;
+#X obj 3 395 doc_o 1;
+#X obj 3 285 doc_i 2;
+#X obj 14 425 doc_oo 0;
+#X obj 14 315 doc_ii 0;
+#X obj 14 350 doc_ii 1;
+#X text 232 315 An image that has an opacity channel. Will be used
+as foreground.;
+#X text 232 350 An image that has NO opacity channel. Will be used
+as background.;
+#X text 232 425 An image that has NO opacity channel. The opacity channel
+of the foreground image is used as weighting of how much either picture
+is seen in the result.;
+#X obj 19 128 #join -1;
+#X obj 97 315 doc_m i0 grid;
+#X obj 97 350 doc_m i1 grid;
+#X obj 97 425 doc_m o0 grid;
+#X obj 0 483 doc_f;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 23 1;
+#X connect 7 0 11 1;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 10 0 23 0;
+#X connect 11 0 12 0;
+#X connect 23 0 11 0;
+#X connect 24 1 20 0;
+#X connect 25 1 21 0;
+#X connect 26 1 22 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..50133629
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#line_to_polygon-help.pd
@@ -0,0 +1,40 @@
+#N canvas 623 73 632 537 10;
+#X obj 43 180 #draw_polygon put (255 255 255);
+#X obj 43 239 #out window;
+#X msg 43 161 240 320 3 #;
+#X obj 256 167 display;
+#X msg 125 102 2 2 # 10 10 229 309;
+#X obj 125 121 #line_to_polygon 4;
+#X obj 0 0 doc_h;
+#X obj 3 286 doc_c 1;
+#X obj 3 352 doc_i 2;
+#X obj 3 446 doc_o 1;
+#X obj 14 476 doc_oo 0;
+#X obj 14 382 doc_ii 0;
+#X obj 14 414 doc_ii 1;
+#X obj 14 316 doc_cc 0;
+#X obj 0 508 doc_f;
+#X obj 43 73 t b b;
+#X obj 43 46 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1 -1
+;
+#X obj 97 316 doc_m c0 float;
+#X text 232 316 Line width.;
+#X obj 97 392 doc_m i0 grid;
+#X obj 97 414 doc_m i1 float;
+#X text 232 414 Line width (same as argument 0);
+#X obj 97 476 doc_m o0;
+#X text 232 392 Grid containing a pair of coordinates.;
+#X text 232 476 Grid representing the vertices of the resulting polygon.
+;
+#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;
+#X connect 15 0 2 0;
+#X connect 15 1 4 0;
+#X connect 16 0 15 0;
+#X connect 17 1 18 0;
+#X connect 19 1 23 0;
+#X connect 20 1 21 0;
+#X connect 22 1 24 0;
diff --git a/externals/gridflow/doc/flow_classes/#make_arrow-help.pd b/externals/gridflow/doc/flow_classes/#make_arrow-help.pd
new file mode 100644
index 00000000..4fa076e6
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#make_arrow-help.pd
@@ -0,0 +1,20 @@
+#N canvas 623 133 632 373 10;
+#X obj 0 0 doc_h;
+#X obj 0 344 doc_f;
+#X obj 55 53 #make_arrow;
+#X obj 3 180 doc_c 0;
+#X obj 3 220 doc_i 1;
+#X obj 3 282 doc_o 1;
+#X obj 14 250 doc_ii 0;
+#X obj 14 312 doc_oo 0;
+#X obj 97 250 doc_m i0 grid;
+#X obj 97 312 doc_m o0 grid;
+#X text 232 312 grid[;
+#X obj 58 77 display;
+#X msg 55 34 4 # 10 20 30 40;
+#X text 212 95 can anyone figure out what is this ?;
+#X text 232 250 grid[euh];
+#X connect 2 0 11 0;
+#X connect 8 1 14 0;
+#X connect 9 1 10 0;
+#X connect 12 0 2 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..0e0685be
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#make_cross-help.pd
@@ -0,0 +1,47 @@
+#N canvas 444 135 632 419 10;
+#X obj 43 57 tgl 15 0 empty empty empty 17 7 0 10 -204786 -1 -1 0 1
+;
+#X obj 43 78 metro 100;
+#X obj 43 149 #out window;
+#X obj 43 130 #draw_polygon put (255 0 0);
+#X obj 202 111 #make_cross 120;
+#X msg 202 92 240 320;
+#X obj 202 57 loadbang;
+#X msg 289 92 150;
+#X obj 261 66 t b b;
+#X obj 261 44 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 43 101 #camera 0;
+#X text 319 90 change cross size;
+#X obj 0 0 doc_h;
+#X obj 3 182 doc_c 1;
+#X obj 3 244 doc_i 2;
+#X obj 14 274 doc_ii 0;
+#X obj 14 296 doc_ii 1;
+#X obj 3 328 doc_o 1;
+#X obj 14 358 doc_oo 0;
+#X obj 14 212 doc_cc 0;
+#X obj 0 390 doc_f;
+#X obj 97 296 doc_m i1;
+#X obj 97 274 doc_m i0;
+#X obj 97 212 doc_m c0;
+#X obj 97 358 doc_m o0 grid;
+#X text 232 358 polygon;
+#X text 232 274 position of centre;
+#X text 232 212 size (radius);
+#X text 232 296 same as arg 0;
+#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;
+#X connect 21 1 28 0;
+#X connect 22 1 26 0;
+#X connect 23 1 27 0;
+#X connect 24 1 25 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..0d47f338
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#moment-help.pd
@@ -0,0 +1,164 @@
+#N canvas 663 46 632 642 10;
+#X obj 19 44 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X msg 234 48 4 2 # 1 1 1 -1 -1 -1 -1 1;
+#X obj 111 228 display;
+#X obj 43 258 display;
+#X obj 234 86 #rotate;
+#X obj 288 76 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 -1831 256;
+#X obj 288 92 * 100;
+#X obj 18 497 #out window;
+#X obj 67 181 #t;
+#X obj 110 207 #moment;
+#X msg 41 105 240 320 1 #;
+#X obj 41 124 #draw_polygon put (1 # 255);
+#X obj 426 123 #pack;
+#X obj 234 105 # +;
+#X obj 456 107 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 -45 256;
+#X obj 426 91 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 12 256;
+#X obj 426 72 #pack;
+#X obj 456 56 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 32 256;
+#X obj 426 40 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 49 256;
+#X obj 234 67 # *;
+#X obj 245 143 # inv+;
+#X obj 245 124 # +;
+#X obj 426 174 #pack;
+#X obj 456 158 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 149 256;
+#X obj 426 142 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -6 0 10
+-241291 -1 -1 128 256;
+#X obj 41 143 #draw_polygon put (1 # 255);
+#X text 162 460 red filter;
+#X text 121 105 draw rectangles;
+#X text 238 31 rectangle polygon;
+#X obj 42 206 #moment 2;
+#X obj 269 192 #moment_polar;
+#X obj 356 212 display;
+#X obj 270 232 display;
+#X obj 5 81 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X text 141 329 this is a fudge factor.;
+#X obj 18 516 fps;
+#X floatatom 18 535 5 0 0 0 - - -;
+#X text 143 341 depending on what you want to do \,;
+#X text 140 353 you set it to 2 \, 3 \, 4 \, whatever.;
+#X obj 402 314 #outer + (9000 0);
+#X obj 448 378 #transpose;
+#X obj 20 80 t b b b;
+#X obj 402 490 # + (120 160);
+#X obj 63 322 #cast f;
+#X obj 63 419 #inner \, seed (f #);
+#X obj 402 352 #cast f;
+#X obj 402 409 #inner \, seed (f #);
+#X obj 402 457 #cast i;
+#X obj 63 398 #swap;
+#X obj 402 276 #for 0 160 1;
+#X obj 63 379 # sqrt (f #);
+#X obj 63 341 # * (f # 3);
+#X obj 402 429 # / (f # 1000);
+#X obj 402 333 # cos* 1000;
+#X obj 402 295 # * 225;
+#X obj 18 459 #inner (1 3 # 1 0 0);
+#X obj 18 478 #draw_polygon + (0 255 255) (2 2 #);
+#X obj 19 61 metro 20;
+#X obj 18 164 #t;
+#X obj 63 360 cv/#SVD;
+#X obj 0 0 doc_h;
+#X obj 3 559 doc_c 0..1;
+#X obj 3 708 doc_i 2;
+#X obj 3 818 doc_o 1;
+#X obj 14 848 doc_oo 0;
+#X obj 14 738 doc_ii 0;
+#X obj 14 760 doc_ii 1;
+#X obj 14 589 doc_cc 0;
+#X obj 0 902 doc_f;
+#X obj 0 902 doc_f;
+#X obj 97 848 doc_m o0 grid;
+#X obj 97 760 doc_m i1 grid;
+#X obj 97 738 doc_m i0 grid;
+#X obj 97 589 doc_m c0 float;
+#X text 232 589 1: average index of the values in the grid \, weighted
+by the values themselves.;
+#X text 232 624 2: average square of index of the values in the grid
+\, weighted by the values themselves. this can be used to compute a
+variance (covariance) matrix \, which in turn can be fed to [#moment_polar]
+to figure out the standard deviation and the direction of the standard
+deviation.;
+#X text 232 848 mode 1: a grid[2];
+#X text 232 870 mode 2: a grid[2 \, 2];
+#X text 232 738 greyscale image;
+#X text 232 760 mode 2: alleged centroid (doesn't have to be the real
+centroid \, but when it is \, the output will be the variance matrix
+\; else it won't be a centred moment);
+#X connect 0 0 57 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 58 0;
+#X connect 29 0 3 0;
+#X connect 29 0 30 0;
+#X connect 29 0 43 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 53 0;
+#X connect 40 0 46 1;
+#X connect 41 0 49 0;
+#X connect 41 1 10 0;
+#X connect 41 2 1 0;
+#X connect 42 0 56 2;
+#X connect 43 0 51 0;
+#X connect 44 0 40 0;
+#X connect 45 0 46 0;
+#X connect 46 0 52 0;
+#X connect 47 0 42 0;
+#X connect 48 0 44 0;
+#X connect 48 1 44 1;
+#X connect 49 0 54 0;
+#X connect 50 0 48 0;
+#X connect 51 0 59 0;
+#X connect 52 0 47 0;
+#X connect 53 0 45 0;
+#X connect 54 0 39 0;
+#X connect 55 0 56 0;
+#X connect 56 0 7 0;
+#X connect 57 0 41 0;
+#X connect 58 0 55 0;
+#X connect 58 1 8 0;
+#X connect 59 0 50 0;
+#X connect 59 1 48 1;
+#X connect 70 1 76 0;
+#X connect 70 1 77 0;
+#X connect 71 1 79 0;
+#X connect 72 1 78 0;
+#X connect 73 1 74 0;
+#X connect 73 1 75 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..d68966a6
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#moment_polar-help.pd
@@ -0,0 +1,25 @@
+#N canvas 455 225 632 371 10;
+#X text 232 226 must be a 2x2 symmetric matrix.;
+#X text 232 288 outlet 0: angle (only makes sense with a 2x2 matrix)
+as int;
+#X text 232 310 outlet 1: radiuses (from biggest to smallest) as float
+grid;
+#X text 30 61 please open this other help patch for a demo:;
+#X obj 0 0 doc_h;
+#X obj 3 121 doc_c 0;
+#X obj 3 161 doc_i 1;
+#X obj 3 258 doc_o 2;
+#X obj 14 288 doc_oo 0;
+#X obj 14 310 doc_oo 1;
+#X obj 14 191 doc_ii 0;
+#X obj 0 342 doc_f;
+#X obj 97 191 doc_m i0 grid;
+#X obj 97 288 doc_m o0 grid;
+#X obj 97 310 doc_m o1 grid;
+#X obj 37 77 #moment-help;
+#X text 232 191 inlet 0: variance matrix (aka covariance matrix) \,
+from [#moment 2] or compatible.;
+#X connect 12 1 16 0;
+#X connect 12 1 0 0;
+#X connect 13 1 1 0;
+#X connect 14 1 2 0;
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..4acf4a15
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#motion_detection-help.pd
@@ -0,0 +1,83 @@
+#N canvas 536 0 632 642 10;
+#X obj 47 40 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 47 315 print;
+#X obj 47 292 fps detailed;
+#X obj 47 57 metro 33.3667;
+#X obj 47 76 #camera;
+#X obj 96 132 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -241291 -1
+-1 0;
+#X text 115 132 motion;
+#X text 116 146 presence;
+#X floatatom 223 237 7 0 0 0 - - -;
+#X obj 47 268 #out window;
+#X obj 209 168 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X obj 74 105 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -260818
+-1 -1 0 1;
+#X text 208 104 reduce the noise in the image;
+#X obj 156 237 nbx 5 14 -1e+37 1e+37 0 0 empty empty y -10 4 0 10 -24198
+-1 -1 0 256;
+#X obj 85 237 nbx 5 14 -1e+37 1e+37 0 0 empty empty x -10 4 0 10 -24198
+-1 -1 0 256;
+#X obj 47 183 #motion_detection;
+#X text 279 236 total amount of change;
+#X obj 177 142 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
+1;
+#X text 195 142 fade;
+#X text 227 168 crosshair;
+#X obj 0 0 doc_h;
+#X obj 0 678 doc_f;
+#X obj 3 378 doc_i 5;
+#X obj 3 338 doc_c 0;
+#X obj 3 550 doc_o 4;
+#X obj 14 580 doc_oo 0;
+#X obj 14 602 doc_oo 1;
+#X obj 14 624 doc_oo 2;
+#X obj 14 646 doc_oo 3;
+#X obj 14 408 doc_ii 0;
+#X obj 14 430 doc_ii 1;
+#X obj 14 452 doc_ii 2;
+#X obj 14 496 doc_ii 3;
+#X obj 14 518 doc_ii 4;
+#X obj 97 518 doc_m i4;
+#X obj 97 496 doc_m i3;
+#X obj 97 452 doc_m i2;
+#X obj 97 430 doc_m i1;
+#X obj 97 408 doc_m i0;
+#X obj 97 646 doc_m o3 float;
+#X obj 97 624 doc_m o2 float;
+#X obj 97 602 doc_m o1 float;
+#X text 232 602 x;
+#X text 232 624 y;
+#X text 232 646 amount of change;
+#X obj 97 580 doc_m o0 grid;
+#X text 232 580 image;
+#X text 232 518 crosshair;
+#X text 232 496 fade;
+#X text 232 452 0: motion;
+#X text 232 474 1: presence;
+#X text 232 430 noise reduction;
+#X text 232 408 camera input;
+#X connect 0 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 15 0;
+#X connect 5 0 15 2;
+#X connect 9 0 2 0;
+#X connect 10 0 15 4;
+#X connect 11 0 15 1;
+#X connect 15 0 9 0;
+#X connect 15 1 14 0;
+#X connect 15 2 13 0;
+#X connect 15 3 8 0;
+#X connect 17 0 15 3;
+#X connect 34 1 47 0;
+#X connect 35 1 48 0;
+#X connect 36 1 49 0;
+#X connect 36 1 50 0;
+#X connect 37 1 51 0;
+#X connect 38 1 52 0;
+#X connect 39 1 44 0;
+#X connect 40 1 43 0;
+#X connect 41 1 42 0;
+#X connect 45 1 46 0;
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..648afc0f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#mouse-help.pd
@@ -0,0 +1,99 @@
+#N canvas 675 0 632 699 10;
+#X msg 59 113 setcursor 32;
+#X msg 40 90 hidecursor;
+#X text 125 88 <-- removes the cursor;
+#X text 159 110 <-- accepts 0 - 63;
+#X obj 136 148 print xy_clicked;
+#X obj 137 194 print xy_unclicked;
+#X obj 68 281 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 85 281 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 102 281 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X floatatom 139 292 5 0 0 0 - - -;
+#X obj 139 273 +;
+#X obj 173 273 t a;
+#X obj 137 218 print xy_moved;
+#X obj 136 170 print xy_dragged;
+#X obj 340 175 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 360 175 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 380 175 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 400 151 loadbang;
+#X text 232 422 select buttons to be considered in click/drag/unclick
+;
+#X obj 40 145 #out window;
+#X obj 340 201 #pack 3;
+#X obj 0 0 doc_h;
+#X obj 3 330 doc_c 0;
+#X obj 3 370 doc_i 2;
+#X obj 3 454 doc_o 8;
+#X obj 14 484 doc_oo 0;
+#X obj 14 506 doc_oo 1;
+#X obj 14 528 doc_oo 2;
+#X obj 14 550 doc_oo 3;
+#X obj 14 572 doc_oo 4;
+#X obj 14 594 doc_oo 5;
+#X obj 14 616 doc_oo 6;
+#X obj 14 638 doc_oo 7;
+#X obj 14 400 doc_ii 0;
+#X obj 14 422 doc_ii 1;
+#X text 19 32 How to get the mouse coordinates and hide / change the
+cursor;
+#X obj 40 247 #mouse \, \, \, \, \,;
+#X obj 97 400 doc_m i0 list;
+#X text 232 484 (y x) click;
+#X text 232 506 (y x) drag;
+#X text 232 528 (y x) unclick;
+#X text 232 550 (y x) move;
+#X text 232 572 0 \, 1 button 1 status;
+#X text 232 594 0 \, 1 button 2 status;
+#X text 232 616 0 \, 1 button 3 status;
+#X text 232 638 mouse wheel difference: -1=up +1=down;
+#X obj 340 230 #to_list;
+#X text 232 400 what comes out of [#out window];
+#X obj 97 422 doc_m i1 list;
+#X obj 97 484 doc_m o0 list;
+#X obj 97 506 doc_m o1 list;
+#X obj 97 528 doc_m o2 list;
+#X obj 97 550 doc_m o3 list;
+#X obj 97 572 doc_m o4 float;
+#X obj 97 594 doc_m o5 float;
+#X obj 97 616 doc_m o6 float;
+#X obj 97 638 doc_m o7 float;
+#X obj 0 670 doc_f;
+#X connect 0 0 19 0;
+#X connect 1 0 19 0;
+#X connect 10 0 11 0;
+#X connect 10 0 9 0;
+#X connect 11 0 10 1;
+#X connect 14 0 20 0;
+#X connect 15 0 20 1;
+#X connect 16 0 20 2;
+#X connect 17 0 14 0;
+#X connect 17 0 15 0;
+#X connect 17 0 16 0;
+#X connect 19 0 36 0;
+#X connect 20 0 46 0;
+#X connect 36 0 4 0;
+#X connect 36 1 13 0;
+#X connect 36 2 5 0;
+#X connect 36 3 12 0;
+#X connect 36 4 6 0;
+#X connect 36 5 7 0;
+#X connect 36 6 8 0;
+#X connect 36 7 10 0;
+#X connect 37 1 47 0;
+#X connect 46 0 36 1;
+#X connect 48 1 18 0;
+#X connect 49 1 38 0;
+#X connect 50 1 39 0;
+#X connect 51 1 40 0;
+#X connect 52 1 41 0;
+#X connect 53 1 42 0;
+#X connect 54 1 43 0;
+#X connect 55 1 44 0;
+#X connect 56 1 45 0;
diff --git a/externals/gridflow/doc/flow_classes/#noise_gate_yuvs-help.pd b/externals/gridflow/doc/flow_classes/#noise_gate_yuvs-help.pd
new file mode 100644
index 00000000..a2003659
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#noise_gate_yuvs-help.pd
@@ -0,0 +1,26 @@
+#N canvas 591 265 632 338 10;
+#X obj 0 0 doc_h;
+#X obj 0 309 doc_f;
+#X obj 76 49 #noise_gate_yuvs;
+#X obj 3 150 doc_i 2;
+#X obj 3 247 doc_o 1;
+#X obj 3 88 doc_c 1;
+#X obj 14 277 doc_oo 0;
+#X obj 14 180 doc_ii 0;
+#X obj 14 215 doc_ii 1;
+#X obj 14 118 doc_cc 0;
+#X obj 97 118 doc_m c0 float/int;
+#X obj 97 180 doc_m i0 grid;
+#X text 203 44 sets pixels to (0 \, 0 \, 0) if their first component
+is lower than a certain threshold.;
+#X text 232 180 picture in signed YUV format (or whatever else works
+for you);
+#X obj 97 215 doc_m i1 float;
+#X text 232 215 same as arg 0;
+#X obj 97 277 doc_m o0 grid;
+#X text 232 118 threshold;
+#X text 232 277 filtered picture in signed YUV format;
+#X connect 10 1 17 0;
+#X connect 11 1 13 0;
+#X connect 14 1 15 0;
+#X connect 16 1 18 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..17d9d2e8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#out-help.pd
@@ -0,0 +1,139 @@
+#N canvas 674 0 632 642 10;
+#X obj 15 325 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 232 689 "rewind" rewinds to the beginning of a video file.
+Will overwrite previous data.;
+#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 65 227 open window;
+#X msg 65 252 close;
+#X text 232 597 "close" closes the file and hides the display \, must
+be accompanied by message "open window" to reopen the display.;
+#X text 232 764 A bang notifies when a complete grid has been received.
+;
+#X text 12 32 Displays or saves an incoming grid (usually an image
+or a video).;
+#X obj 15 302 #out window \, title example;
+#X obj 127 100 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 133 796 #record;
+#X msg 366 228 open somefile.jpg;
+#X text 232 654 "open filename.format" (ex: "open somefile.jpg") sets
+the filename to write to.;
+#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 266 #out;
+#X msg 127 262 hidecursor;
+#X text 196 261 <-- linux only;
+#X text 232 632 "hidecursor" (linux only) hides the mouse cursor.;
+#X obj 0 0 doc_h;
+#X obj 3 371 doc_c n;
+#X obj 3 796 doc_also;
+#X obj 3 734 doc_o 1;
+#N canvas 140 137 570 615 More 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 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 obj 23 223 cnv 15 23 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 23 223 #in;
+#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 14 36 #out communicating grids (images) to/from devices \,
+sockets \, files;
+#X text 37 502 An incoming file is sent through the opened device or
+file. In single file format \, a subsequent picture overwrites the
+preceeding one. There are many more options.;
+#X connect 1 0 15 0;
+#X connect 3 0 18 0;
+#X connect 4 0 18 0;
+#X connect 7 0 18 0;
+#X connect 10 0 18 0;
+#X connect 11 0 15 0;
+#X connect 12 0 18 0;
+#X connect 15 0 18 0;
+#X connect 19 0 15 0;
+#X connect 20 0 21 0;
+#X connect 21 0 15 0;
+#X connect 21 1 19 0;
+#X connect 22 0 15 0;
+#X connect 24 0 15 0;
+#X connect 25 0 18 0;
+#X restore 140 334 pd More info about this object class;
+#X obj 3 488 doc_i 1;
+#X obj 14 518 doc_ii 0;
+#X obj 14 764 doc_oo 0;
+#X obj 97 518 doc_m i0 grid;
+#X obj 97 654 doc_m i0 open;
+#X obj 97 597 doc_m i0 close;
+#X obj 97 632 doc_m i0 hidecursor;
+#X obj 97 689 doc_m i0 rewind;
+#X obj 103 796 #in;
+#X text 188 426 auto-open with auto-detect of the format-handler;
+#X text 226 451 auto-open with manual choice of the format-handler
+;
+#X text 88 406 nothing opened \, you have to open by yourself;
+#X obj 46 407 #out;
+#X obj 46 428 #out filename.suffix;
+#X obj 46 449 #out handler filename.suffix;
+#X obj 97 553 doc_m i0 autoclose;
+#X obj 0 816 doc_f;
+#X obj 97 764 doc_m o0 bang;
+#X msg 15 117 load working.jpg;
+#X msg 127 117 load sewing.jpg;
+#X msg 351 113 load sewing.jpg;
+#X text 232 553 "autoclose 1": close after incoming image is finished.
+;
+#X text 232 575 "autoclose 0": doesn't.;
+#X text 232 518 write one frame (or in the case of [#out grid] \, one
+grid of any kind).;
+#X connect 4 0 45 0;
+#X connect 5 0 11 0;
+#X connect 6 0 11 0;
+#X connect 7 0 11 0;
+#X connect 11 0 0 0;
+#X connect 12 0 46 0;
+#X connect 14 0 18 0;
+#X connect 16 0 47 0;
+#X connect 17 0 18 0;
+#X connect 19 0 11 0;
+#X connect 24 1 35 0;
+#X connect 24 1 13 0;
+#X connect 30 1 50 0;
+#X connect 31 1 15 0;
+#X connect 32 1 8 0;
+#X connect 33 1 21 0;
+#X connect 34 1 3 0;
+#X connect 42 1 48 0;
+#X connect 42 1 49 0;
+#X connect 44 1 9 0;
+#X connect 45 0 5 0;
+#X connect 46 0 5 0;
+#X connect 47 0 17 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..b56f18f8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#outer-help.pd
@@ -0,0 +1,105 @@
+#N canvas 668 0 632 642 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 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 obj 199 622 #finished;
+#X obj 103 622 #scan +;
+#X obj 265 622 #cast;
+#X obj 307 622 #ravel;
+#X obj 355 622 #grade;
+#X obj 403 622 #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 obj 3 622 doc_also;
+#X obj 0 0 doc_h;
+#X obj 3 320 doc_c 1;
+#X obj 3 404 doc_i 2;
+#X obj 14 434 doc_ii 0;
+#X obj 14 530 doc_ii 1;
+#X obj 3 562 doc_o 1;
+#X obj 14 592 doc_oo 0;
+#X obj 19 277 #out window;
+#X obj 14 350 doc_cc 0;
+#X obj 97 434 doc_m i0 grid;
+#X obj 97 508 doc_m i0 op;
+#X obj 97 372 doc_m c0 op;
+#X obj 97 530 doc_m i1 grid;
+#X obj 97 592 doc_m o0 grid;
+#X obj 97 350 doc_m c0 grid;
+#X obj 157 622 #join;
+#X text 171 250 #outer does the same two-input operation between every
+possible pair of the left-side grid and the right side grid.;
+#X obj 392 102 display;
+#X text 387 32 Multiplication table:;
+#X obj 391 79 #outer * (1 2 3 4 5 6 7);
+#X msg 391 56 1 2 3 4 5;
+#X text 232 434 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);
+#X text 232 508 same as arg 0;
+#X text 232 530 same as arg 1;
+#X text 232 350 grid B (see below);
+#X obj 0 642 doc_f;
+#X text 232 372 numop;
+#X connect 0 0 8 0;
+#X connect 0 0 14 0;
+#X connect 1 0 24 0;
+#X connect 1 0 24 1;
+#X connect 2 0 25 0;
+#X connect 2 0 25 1;
+#X connect 3 0 2 1;
+#X connect 4 0 1 1;
+#X connect 4 0 3 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 9 0 23 0;
+#X connect 10 0 9 1;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 0 21 0;
+#X connect 13 0 12 1;
+#X connect 14 0 11 0;
+#X connect 21 0 22 0;
+#X connect 22 0 27 1;
+#X connect 23 0 1 0;
+#X connect 23 0 2 0;
+#X connect 24 0 27 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 0;
+#X connect 27 0 36 0;
+#X connect 28 1 16 0;
+#X connect 28 1 44 0;
+#X connect 28 1 15 0;
+#X connect 28 1 17 0;
+#X connect 28 1 18 0;
+#X connect 28 1 19 0;
+#X connect 28 1 20 0;
+#X connect 38 1 50 0;
+#X connect 39 1 51 0;
+#X connect 40 1 55 0;
+#X connect 41 1 52 0;
+#X connect 43 1 53 0;
+#X connect 48 0 46 0;
+#X connect 49 0 48 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..1f3614f4
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#pack-help.pd
@@ -0,0 +1,46 @@
+#N canvas 379 12 632 544 10;
+#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 162 90 <--click and drag to place numbers in the grid.;
+#X text 232 463 Outputs values from each individual inlet into a grid.
+;
+#X obj 0 0 doc_h;
+#X obj 3 349 doc_i n;
+#X obj 3 252 doc_c 0..2;
+#X text 14 28 Creates a one-dimensional grid (a Dim(N) vector) from
+individual integers.;
+#X text 232 379 every inlet is hot.;
+#X text 232 401 inlet order corresponds to value order in the grid.
+;
+#X obj 3 433 doc_o 1;
+#X obj 14 463 doc_oo 0;
+#X obj 14 379 doc_ii any;
+#X obj 14 282 doc_cc 0;
+#X obj 14 317 doc_cc 1;
+#X obj 97 282 doc_m c0 float/int;
+#X obj 97 317 doc_m c1 numtype;
+#X obj 97 379 doc_m iany float;
+#X obj 97 463 doc_m o0 grid[n];
+#X obj 0 515 doc_f;
+#X text 232 317 number type (default: int32);
+#X obj 85 135 #pack 3 f;
+#X obj 3 495 doc_also;
+#X obj 103 495 pack;
+#X obj 139 495 #unpack;
+#X obj 263 180 display;
+#X text 232 282 number of elements in the vector to be built (aka number
+of dimensions in the vector space) (default: 2);
+#X connect 1 0 23 0;
+#X connect 2 0 23 1;
+#X connect 3 0 23 2;
+#X connect 17 1 28 0;
+#X connect 18 1 22 0;
+#X connect 19 1 10 0;
+#X connect 19 1 11 0;
+#X connect 20 1 5 0;
+#X connect 23 0 0 0;
+#X connect 23 0 27 0;
+#X connect 24 1 25 0;
+#X connect 24 1 26 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..d67b92ac
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#perspective-help.pd
@@ -0,0 +1,49 @@
+#N canvas 675 0 632 550 10;
+#X text 153 55 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 127 #pack 3;
+#X floatatom 75 82 5 0 0 0 - - -;
+#X obj 77 100 max 1;
+#X floatatom 12 95 5 0 0 0 - - -;
+#X floatatom 52 57 5 0 0 0 - - -;
+#X obj 30 190 #print;
+#X obj 79 182 #print;
+#X obj 79 163 #perspective;
+#X obj 103 501 #redim;
+#X obj 151 501 #ravel;
+#X obj 0 0 doc_h;
+#X obj 3 501 doc_also;
+#X obj 3 217 doc_c 1;
+#X obj 3 279 doc_i 1;
+#X obj 3 441 doc_o 1;
+#X obj 14 471 doc_oo 0;
+#X obj 14 309 doc_ii 0;
+#X obj 14 247 doc_cc 0;
+#X obj 97 309 doc_m i0 grid;
+#X obj 97 471 doc_m o0 grid;
+#X text 232 309 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.;
+#X text 232 383 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...(!);
+#X obj 97 247 doc_m c0 float;
+#X text 232 247 depth;
+#X obj 0 521 doc_f;
+#X connect 1 0 6 0;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 2;
+#X connect 4 0 1 0;
+#X connect 5 0 1 1;
+#X connect 8 0 7 0;
+#X connect 12 1 9 0;
+#X connect 12 1 10 0;
+#X connect 19 1 21 0;
+#X connect 19 1 22 0;
+#X connect 23 1 24 0;
diff --git a/externals/gridflow/doc/flow_classes/#polygon_area-help.pd b/externals/gridflow/doc/flow_classes/#polygon_area-help.pd
new file mode 100644
index 00000000..6d7a661c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_area-help.pd
@@ -0,0 +1,28 @@
+#N canvas 628 15 632 522 10;
+#X obj 0 0 doc_h;
+#X obj 0 493 doc_f;
+#X obj 58 239 #polygon_area;
+#X obj 59 259 display;
+#X msg 58 96 4 2 # 10 10 10 310 230 310 230 10;
+#X text 93 116 220 x 300 rectangle;
+#X obj 79 146 display;
+#X text 11 36 Find area of a polygon in square pixels.;
+#X obj 3 309 doc_c 0;
+#X obj 3 349 doc_i 1;
+#X obj 3 418 doc_o 1;
+#X obj 58 77 loadbang;
+#X obj 14 379 doc_ii 0;
+#X obj 97 379 doc_m i0 grid;
+#X text 232 379 Vertices of the polygon.;
+#X obj 14 448 doc_oo 0;
+#X obj 97 448 doc_m o0 grid;
+#X text 232 448 Grid of only one element representing the area of the
+polygon received from inlet 0;
+#X obj 58 115 # +;
+#X connect 2 0 3 0;
+#X connect 4 0 18 0;
+#X connect 11 0 4 0;
+#X connect 13 1 14 0;
+#X connect 16 1 17 0;
+#X connect 18 0 2 0;
+#X connect 18 0 6 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..5dd99ec8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_comparator-help.pd
@@ -0,0 +1,85 @@
+#N canvas 566 0 632 642 10;
+#X obj 255 129 #outer + (0 9000);
+#X text 333 91 make regular triangle;
+#X obj 255 227 #rotate;
+#X obj 209 53 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 308 227 * 100;
+#X floatatom 308 211 5 0 0 0 - - -;
+#X obj 268 72 t b b;
+#X obj 255 246 #polygon_comparator;
+#X obj 209 72 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 255 186 #t;
+#X obj 228 53 metro 1000;
+#X text 30 254 BUG: first try doesn't work;
+#X text 67 265 please bang twice;
+#X msg 381 149 4 2 # 1 1 1 -1 -1 -1 -1 1;
+#X obj 391 195 display;
+#X obj 255 110 # * 12000;
+#X obj 255 91 #for 0 3 1;
+#X obj 381 169 # * (100 100);
+#X obj 255 167 # + (0 0);
+#X obj 255 148 # cos* (100 100);
+#X obj 215 278 #fold min;
+#X obj 295 278 #fold max;
+#X obj 215 297 #to_float;
+#X obj 295 297 #to_float;
+#X obj 381 129 loadbang;
+#X obj 215 316 nbx 8 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 9
+-262144 -1 -1 0 256;
+#X obj 295 316 nbx 8 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 9
+-262144 -1 -1 0 256;
+#X text 232 453 or method "precision" for setting the size of the output
+grid.;
+#X text 232 510 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 24 239 NOTE: requires [#fft];
+#X text 33 150 translations \, e.g. [# +];
+#X text 33 168 rotations \, e.g. [#rotate];
+#X obj 0 0 doc_h;
+#X obj 3 361 doc_c;
+#X obj 3 401 doc_i 2;
+#X obj 3 594 doc_o 1;
+#X text 232 488 a 2-D polygon as N by 2 grid;
+#X text 232 431 a 2-D polygon as N by 2 grid;
+#X obj 14 431 doc_ii 0;
+#X obj 14 488 doc_ii 1;
+#X obj 14 624 doc_oo 0;
+#X obj 0 654 doc_f;
+#X obj 97 431 doc_m i0 grid;
+#X obj 97 488 doc_m i1;
+#X text 8 114 Comparisons are meant to be invariant;
+#X text 8 126 to the following transformations:;
+#X text 33 186 scalar scalings \, e.g. [# *] with;
+#X text 33 198 only one value.;
+#X obj 97 624 doc_m o0 grid;
+#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;
+#X connect 42 1 37 0;
+#X connect 42 1 27 0;
+#X connect 43 1 36 0;
+#X connect 43 1 28 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..06afba8a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_each_edge-help.pd
@@ -0,0 +1,22 @@
+#N canvas 338 225 632 377 10;
+#X obj 51 139 #print;
+#X obj 51 83 # +;
+#X obj 51 102 #polygon_each_edge;
+#X obj 0 0 doc_h;
+#X obj 3 170 doc_c;
+#X obj 3 210 doc_i 1;
+#X obj 3 273 doc_o 1;
+#X obj 14 303 doc_oo 0;
+#X obj 14 240 doc_ii 0;
+#X obj 0 348 doc_f;
+#X msg 51 48 4 2 # 0 0 0 20 20 20 20 0;
+#X obj 97 240 doc_m i0 grid;
+#X obj 97 303 doc_m o0 grid;
+#X text 232 240 Vertices of the polygon;
+#X text 232 303 Returns a grid contaning a vertex pair for each edge
+of the polygon.;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 10 0 1 0;
+#X connect 11 1 13 0;
+#X connect 12 1 14 0;
diff --git a/externals/gridflow/doc/flow_classes/#polygon_moment-help.pd b/externals/gridflow/doc/flow_classes/#polygon_moment-help.pd
new file mode 100644
index 00000000..41ee2986
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_moment-help.pd
@@ -0,0 +1,64 @@
+#N canvas 678 0 632 610 10;
+#X msg 263 58 4 2 # 1 1 1 5 5 5 5 1;
+#X text 413 58 should give 3 3;
+#X obj 282 188 display;
+#X obj 203 219 #outer + (-4 4);
+#X obj 203 238 #transpose;
+#X obj 37 64 metro 42;
+#X obj 37 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 37 83 240 320 3 #;
+#X obj 37 256 #out window;
+#X obj 37 122 #draw_polygon + (255 0 0);
+#X obj 37 219 #draw_rect + (255 255 0);
+#X obj 378 188 display;
+#X obj 377 168 #polygon_moment 2;
+#X obj 281 168 #polygon_moment;
+#X obj 263 77 # * (10 20);
+#X obj 263 96 #rotate;
+#X floatatom 316 98 5 0 0 0 - - -;
+#X obj 0 0 doc_h;
+#X obj 3 375 doc_i 2;
+#X obj 3 291 doc_c 1;
+#X obj 3 516 doc_o 1;
+#X obj 14 546 doc_oo 0;
+#X obj 14 405 doc_ii 0;
+#X obj 14 427 doc_ii 1;
+#X obj 14 321 doc_cc 0;
+#X obj 97 321 doc_m c0 float;
+#X text 232 321 1: first-order moment (average);
+#X text 232 343 2: second-order moment (standard-deviation);
+#X obj 97 546 doc_m o0 grid;
+#X obj 97 405 doc_m i0 grid;
+#X obj 97 427 doc_m i1 grid;
+#X text 232 427 centre to subtract from the input;
+#X text 232 449 in the case of an average \, you'd leave this unused
+;
+#X text 232 471 but in the case of a standard-deviation \, you'd put
+the average in here \, unless you want a nonstandard deviation.;
+#X text 232 546 polygon. size (N 2);
+#X text 232 405 polygon. size (N 2);
+#X obj 0 578 doc_f;
+#X connect 0 0 14 0;
+#X connect 3 0 4 0;
+#X connect 4 0 10 2;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 7 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X connect 12 0 11 0;
+#X connect 13 0 2 0;
+#X connect 13 0 3 0;
+#X connect 14 0 15 0;
+#X connect 15 0 9 2;
+#X connect 15 0 13 0;
+#X connect 15 0 12 0;
+#X connect 16 0 15 1;
+#X connect 25 1 26 0;
+#X connect 25 1 27 0;
+#X connect 28 1 34 0;
+#X connect 29 1 35 0;
+#X connect 30 1 31 0;
+#X connect 30 1 32 0;
+#X connect 30 1 33 0;
diff --git a/externals/gridflow/doc/flow_classes/#polygon_perimetre-help.pd b/externals/gridflow/doc/flow_classes/#polygon_perimetre-help.pd
new file mode 100644
index 00000000..6409a635
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_perimetre-help.pd
@@ -0,0 +1,23 @@
+#N canvas 335 118 632 342 10;
+#X obj 0 0 doc_h;
+#X obj 0 313 doc_f;
+#X obj 47 64 #polygon_perimetre;
+#X obj 3 129 doc_c 0;
+#X obj 3 169 doc_i 1;
+#X obj 3 231 doc_o 1;
+#X obj 14 261 doc_oo 0;
+#X obj 14 199 doc_ii 0;
+#X obj 97 261 doc_m o0 grid;
+#X obj 97 199 doc_m i0 grid;
+#X text 232 261 perimetre as grid[];
+#X text 232 199 polygon as grid[N \, 2] or any cyclic path as grid[N
+\, M];
+#X text 187 44 finds the perimetre of a sequence of points in which
+the last point is assumed to connect back to the first point. this
+not need be an actual polygon (because points don't need to be coplanar
+for this calculation to work).;
+#X obj 3 293 doc_also;
+#X obj 103 293 #polygon_area;
+#X connect 8 1 10 0;
+#X connect 9 1 11 0;
+#X connect 13 1 14 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..e08e8017
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#polygon_radial_map-help.pd
@@ -0,0 +1,55 @@
+#N canvas 486 64 632 526 10;
+#X obj 244 185 #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 244 280 #outer * (255 255 255);
+#X obj 244 299 #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 244 242 #for 128 0 -1;
+#X obj 24 259 #out window;
+#X obj 244 140 #t;
+#X obj 274 141 #polygon_moment;
+#X obj 293 162 display;
+#X obj 244 166 # -;
+#X obj 392 184 display;
+#X msg 24 116 4 2 # 30 30 30 250 120 200 170 90;
+#X obj 244 204 t a a;
+#X obj 244 223 #finished;
+#X obj 244 261 #outer <;
+#X obj 0 0 doc_h;
+#X obj 3 333 doc_c 0;
+#X obj 3 373 doc_i 1;
+#X obj 3 435 doc_o 1;
+#X obj 14 465 doc_oo 0;
+#X obj 14 403 doc_ii 0;
+#X obj 0 497 doc_f;
+#X obj 97 465 doc_m o0 grid;
+#X obj 97 403 doc_m i0 grid;
+#X text 232 403 polygon;
+#X text 232 465 radial map;
+#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;
+#X connect 26 1 29 0;
+#X connect 27 1 28 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..3ca6cba7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#posterize-help.pd
@@ -0,0 +1,63 @@
+#N canvas 674 0 632 625 10;
+#X obj 178 114 bng 15 250 50 0 empty empty empty 0 -6 0 8 -4034 -1
+-1;
+#X text 274 230 2 - 255;
+#X msg 217 157 open bluemarble.jpg;
+#X obj 197 179 #in;
+#X obj 178 203 #store;
+#X obj 178 251 #posterize;
+#X obj 103 570 #convolve;
+#X obj 169 570 #contrast;
+#X obj 235 570 #solarize;
+#X obj 301 570 #layer;
+#X obj 0 0 doc_h;
+#X obj 3 570 doc_also;
+#X obj 3 424 doc_i 2;
+#X obj 3 508 doc_o 1;
+#X obj 14 538 doc_oo 0;
+#X obj 14 454 doc_ii 0;
+#X obj 14 476 doc_ii 1;
+#X text 10 35 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 202 271 #out window \, title original;
+#X obj 178 291 #out window \, title modified;
+#X obj 178 136 t b b b;
+#X floatatom 235 230 5 0 0 0 - - -;
+#X msg 235 210 2;
+#X obj 235 190 loadbang;
+#X obj 97 454 doc_m i0 grid;
+#X obj 97 476 doc_m i1 float int;
+#X obj 97 538 doc_m o0 grid;
+#X text 232 538 posterised image;
+#X obj 3 323 doc_c 1;
+#X obj 14 353 doc_cc 0;
+#X obj 97 353 doc_m c0 float/int;
+#X text 11 75 example: simulate the 216-color "web" palette using 6
+levels. simulate a 15-bit display using 32 levels .;
+#X text 232 353 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 obj 0 590 doc_f;
+#X text 232 454 original image;
+#X text 232 476 same as arg 0;
+#X connect 0 0 20 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 1;
+#X connect 4 0 5 0;
+#X connect 4 0 18 0;
+#X connect 5 0 19 0;
+#X connect 11 1 6 0;
+#X connect 11 1 7 0;
+#X connect 11 1 8 0;
+#X connect 11 1 9 0;
+#X connect 20 0 4 0;
+#X connect 20 1 3 0;
+#X connect 20 2 2 0;
+#X connect 21 0 5 1;
+#X connect 22 0 21 0;
+#X connect 23 0 22 0;
+#X connect 24 1 34 0;
+#X connect 25 1 35 0;
+#X connect 26 1 27 0;
+#X connect 30 1 32 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..b15e8ff4
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#print-help.pd
@@ -0,0 +1,73 @@
+#N canvas 408 30 632 632 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 msg 71 88 load sewing.jpg;
+#X obj 71 251 #print paprika;
+#X text 232 409 Incoming grid.;
+#X obj 103 582 #dim;
+#X obj 139 582 #to_float;
+#X obj 205 582 #to_list;
+#X obj 265 582 print;
+#X text 232 431 select between base 2 \, 8 \, 10 \, 16;
+#X text 232 453 stop printing after that number of rows;
+#X text 232 475 stop printing after that number of characters on the
+same line;
+#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 obj 0 0 doc_h;
+#X obj 3 379 doc_i 1;
+#X obj 3 295 doc_c 0..1;
+#X obj 3 582 doc_also;
+#X obj 14 550 doc_oo 0;
+#X obj 14 409 doc_ii 0;
+#X obj 3 520 doc_o 2;
+#X obj 14 325 doc_cc 0;
+#X obj 97 325 doc_m c0 float|symbol;
+#X text 232 325 prefix before the printed element in the console.;
+#X text 232 347 default: no prefix;
+#X obj 97 409 doc_m i0 grid;
+#X obj 97 431 doc_m i0 base int;
+#X obj 97 453 doc_m i0 maxrows int;
+#X obj 97 475 doc_m i0 trunc int;
+#X obj 97 550 doc_m o0 grid;
+#X text 232 550 probably unused;
+#X obj 0 603 doc_f;
+#X connect 1 0 18 0;
+#X connect 2 0 18 1;
+#X connect 3 0 18 2;
+#X connect 4 0 9 0;
+#X connect 5 0 9 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 8 0 4 0;
+#X connect 18 0 9 0;
+#X connect 19 0 9 0;
+#X connect 20 0 9 0;
+#X connect 21 0 9 0;
+#X connect 22 0 9 0;
+#X connect 23 0 9 0;
+#X connect 24 0 9 0;
+#X connect 28 1 11 0;
+#X connect 28 1 12 0;
+#X connect 28 1 13 0;
+#X connect 28 1 14 0;
+#X connect 33 1 34 0;
+#X connect 33 1 35 0;
+#X connect 36 1 10 0;
+#X connect 37 1 15 0;
+#X connect 38 1 16 0;
+#X connect 39 1 17 0;
+#X connect 40 1 41 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..2f167e57
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#ravel-help.pd
@@ -0,0 +1,42 @@
+#N canvas 691 0 632 493 10;
+#X obj 20 80 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 20 231 print before;
+#X obj 140 233 print after;
+#X obj 20 142 #in;
+#X obj 20 188 #dim;
+#X obj 103 444 #redim (1);
+#X obj 175 444 #perspective;
+#X obj 140 190 #dim;
+#X obj 140 169 #ravel;
+#X obj 0 0 doc_h;
+#X obj 3 267 doc_c 0;
+#X obj 3 307 doc_i 1;
+#X obj 3 444 doc_also;
+#X obj 3 382 doc_o 1;
+#X obj 14 412 doc_oo 0;
+#X obj 14 337 doc_ii 0;
+#X obj 97 337 doc_m i0 grid;
+#X obj 97 412 doc_m o0 grid;
+#X text 232 337 like [#redim] but always produce a 1-D grid with the
+same total number of elements.;
+#X obj 0 464 doc_f;
+#X msg 20 120 load bluemarble.jpg;
+#X obj 20 210 #to_list;
+#X obj 140 212 #to_list;
+#X text 143 55 like #redim but always produces a 1-D grid with the
+same total number of elements.;
+#X text 232 412 1-D grid;
+#X connect 0 0 20 0;
+#X connect 3 0 4 0;
+#X connect 3 0 8 0;
+#X connect 4 0 21 0;
+#X connect 7 0 22 0;
+#X connect 8 0 7 0;
+#X connect 12 1 5 0;
+#X connect 12 1 6 0;
+#X connect 16 1 18 0;
+#X connect 17 1 24 0;
+#X connect 20 0 3 0;
+#X connect 21 0 1 0;
+#X connect 22 0 2 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..2cbb9721
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#record-help.pd
@@ -0,0 +1,53 @@
+#N canvas 525 0 632 584 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 172 fps detailed;
+#X obj 105 191 print;
+#X obj 79 98 metro 100;
+#X obj 93 220 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 123 269 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 108 244 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 79 299 #record;
+#X text 232 461 Starts recording to the file.;
+#X text 232 483 Stops recording.;
+#X text 232 426 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 218 <-- 1 select filename;
+#X text 128 243 <-- 2 start recording;
+#X text 143 269 <-- 3 stop recording;
+#X text 142 298 <-- open for more options;
+#X obj 0 0 doc_h;
+#X obj 3 374 doc_i 4;
+#X obj 3 334 doc_c 0;
+#X obj 3 515 doc_o 0;
+#X obj 14 404 doc_ii 0;
+#X obj 14 426 doc_ii 1;
+#X obj 14 461 doc_ii 2;
+#X obj 14 483 doc_ii 3;
+#X obj 97 404 doc_m i0 grid;
+#X obj 97 426 doc_m i1 bang;
+#X obj 97 461 doc_m i2 bang;
+#X obj 97 483 doc_m i3 bang;
+#X obj 0 555 doc_f;
+#X text 232 404 images to be recorded go here.;
+#X connect 0 0 2 0;
+#X connect 0 0 10 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 10 1;
+#X connect 8 0 10 3;
+#X connect 9 0 10 2;
+#X connect 27 1 32 0;
+#X connect 28 1 13 0;
+#X connect 29 1 11 0;
+#X connect 30 1 12 0;
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..6ccd005c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#redim-help.pd
@@ -0,0 +1,59 @@
+#N canvas 680 0 632 624 10;
+#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 obj 21 103 #in;
+#X obj 111 154 #out window;
+#X obj 103 575 #ravel;
+#X obj 151 575 #perspective;
+#X obj 21 154 #out window;
+#X obj 21 127 t a a;
+#X obj 111 124 #redim (120 160 3);
+#X text 232 443 Outputs the redimensioned data as a grid.;
+#X msg 232 131 240 320 3;
+#X msg 226 95 400 400 3;
+#X obj 0 0 doc_h;
+#X obj 3 277 doc_i 2;
+#X obj 3 193 doc_c 1;
+#X obj 3 575 doc_also;
+#X obj 3 413 doc_o 1;
+#X obj 14 307 doc_ii 0;
+#X obj 14 381 doc_ii 1;
+#X obj 14 443 doc_oo 0;
+#X obj 14 223 doc_cc 0;
+#X obj 97 223 doc_m c0 grid;
+#X text 232 223 dimension list \, (120 160 3) in this example.;
+#X obj 97 307 doc_m i0 grid;
+#X text 232 245 same as the dimension list of #import;
+#X text 232 307 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.;
+#X obj 97 381 doc_m i1 grid;
+#X text 232 381 same as arg 0;
+#X obj 97 443 doc_m o0 grid;
+#X text 232 465 example: with a 240 320 RGB image \, [#redim 120 640
+3] will visually separate the even lines (left) from the odd lines
+(right). contrary to this \, [#redim 640 120 3] will split every line
+and put its left half on a even line and the right half on the following
+odd line. [#redim] 480 320 3 will repeat the input image twice in the
+output image. [#redim] 240 50 3 will only keep the 50 top lines.;
+#X obj 0 595 doc_f;
+#X msg 21 81 load working.jpg;
+#X connect 1 0 31 0;
+#X connect 2 0 7 0;
+#X connect 7 0 6 0;
+#X connect 7 1 8 0;
+#X connect 8 0 3 0;
+#X connect 10 0 8 1;
+#X connect 11 0 8 1;
+#X connect 15 1 4 0;
+#X connect 15 1 5 0;
+#X connect 21 1 22 0;
+#X connect 21 1 24 0;
+#X connect 23 1 25 0;
+#X connect 26 1 27 0;
+#X connect 28 1 9 0;
+#X connect 28 1 29 0;
+#X connect 31 0 2 0;
diff --git a/externals/gridflow/doc/flow_classes/#reinterval-help.pd b/externals/gridflow/doc/flow_classes/#reinterval-help.pd
new file mode 100644
index 00000000..7ec9082f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#reinterval-help.pd
@@ -0,0 +1,33 @@
+#N canvas 335 118 632 382 10;
+#X obj 0 0 doc_h;
+#X obj 0 353 doc_f;
+#X obj 98 61 #reinterval;
+#X obj 3 101 doc_c 0;
+#X obj 3 141 doc_i 5;
+#X obj 3 291 doc_o 1;
+#X obj 14 171 doc_ii 0;
+#X obj 14 193 doc_ii 1;
+#X obj 14 215 doc_ii 2;
+#X obj 14 237 doc_ii 3;
+#X obj 14 259 doc_ii 4;
+#X obj 14 321 doc_oo 0;
+#X obj 97 171 doc_m i0 grid;
+#X obj 97 193 doc_m i1 grid;
+#X obj 97 215 doc_m i2 grid;
+#X obj 97 237 doc_m i3 grid;
+#X obj 97 259 doc_m i4 grid;
+#X obj 97 321 doc_m o0 grid;
+#X text 232 171 values to be rescaled;
+#X text 232 321 rescaled values;
+#X text 232 193 old start;
+#X text 232 215 old end;
+#X text 232 237 new start;
+#X text 232 259 new end;
+#X text 187 46 multiply and add to values such that the old start becomes
+the new start \, and the old end becomes the new end.;
+#X connect 12 1 18 0;
+#X connect 13 1 20 0;
+#X connect 14 1 21 0;
+#X connect 15 1 22 0;
+#X connect 16 1 23 0;
+#X connect 17 1 19 0;
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..0c704ab6
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#remap_image-help.pd
@@ -0,0 +1,53 @@
+#N canvas 690 0 632 578 10;
+#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 156 201 5 0 0 0 - - -;
+#X obj 140 229 # +;
+#X msg 61 153 open sewing.jpg;
+#X text 201 199 <-- Modify value to see transformation.;
+#X text 178 152 <-- open image;
+#X obj 46 261 #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 obj 46 229 #remap_image;
+#X text 187 229 <-- change the numop to change the transformation;
+#X obj 103 529 #rotate;
+#X obj 0 0 doc_h;
+#X obj 3 295 doc_c 0;
+#X obj 3 335 doc_i 2;
+#X obj 3 529 doc_also;
+#X obj 3 432 doc_o 2;
+#X obj 14 365 doc_ii 0;
+#X obj 14 387 doc_ii 1;
+#X obj 14 462 doc_oo 0;
+#X obj 14 497 doc_oo 1;
+#X obj 97 365 doc_m i0 grid;
+#X text 232 365 grid to be remapped;
+#X obj 97 497 doc_m o1 grid;
+#X text 232 497 indexmap of dummy coordinates \, to be deformed;
+#X obj 97 387 doc_m i1 grid;
+#X text 232 387 modified version of what came out of outlet 1 \, which
+will determine the remapping;
+#X obj 97 462 doc_m o0 grid;
+#X text 232 462 the grid from inlet 0 after being remapped using the
+grid from inlet 1;
+#X obj 0 549 doc_f;
+#X connect 1 0 2 0;
+#X connect 2 0 12 0;
+#X connect 3 0 4 1;
+#X connect 4 0 12 1;
+#X connect 5 0 2 0;
+#X connect 9 0 10 0;
+#X connect 10 0 2 0;
+#X connect 12 0 8 0;
+#X connect 12 1 4 0;
+#X connect 18 1 14 0;
+#X connect 24 1 25 0;
+#X connect 26 1 27 0;
+#X connect 28 1 29 0;
+#X connect 30 1 31 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..71c6fe6c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#reverse-help.pd
@@ -0,0 +1,65 @@
+#N canvas 668 0 632 642 10;
+#X obj 258 177 #color;
+#X obj 301 320 #color;
+#X obj 259 378 display;
+#X obj 258 319 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 257 #in;
+#X obj 22 176 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 371 #out window;
+#X obj 87 259 hradio 15 1 0 6 empty empty empty 0 -6 0 8 -260818 -1
+-1 0;
+#X obj 87 277 - 3;
+#X floatatom 87 297 5 0 0 0 - - -;
+#X obj 22 314 #reverse 0;
+#X obj 258 300 #reverse 0;
+#X obj 323 245 hradio 15 1 0 6 empty empty empty 0 -6 0 8 -260818 -1
+-1 0;
+#X obj 323 263 - 3;
+#X floatatom 323 283 5 0 0 0 - - -;
+#X obj 0 0 doc_h;
+#X obj 3 416 doc_c 1;
+#X obj 3 517 doc_i 2;
+#X obj 3 601 doc_o 1;
+#X obj 14 631 doc_oo 0;
+#X obj 14 547 doc_ii 0;
+#X obj 14 569 doc_ii 1;
+#X obj 14 446 doc_cc 0;
+#X obj 97 631 doc_m o0 grid;
+#X obj 97 547 doc_m i0 grid;
+#X obj 97 446 doc_m c0 float;
+#X obj 97 569 doc_m i1 float;
+#X text 232 569 same as arg 0;
+#X text 232 446 dimension 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.;
+#X obj 0 663 doc_f;
+#X text 232 547 grid to be reversed;
+#X text 232 631 reversed grid;
+#X msg 22 226 load b001.jpg;
+#X text 16 92 for an image \, 0 or -3 does vertical flip \, 1 or -2
+does horizontal flip \, and 2 or -1 does channel flip. if you do this
+on something else than an image \, you may see why the negative numbers
+are supported: if you make a grid of multiple images \, then -1 will
+always refer to the channels dimension no matter what.;
+#X connect 0 0 12 0;
+#X connect 3 0 2 0;
+#X connect 3 1 1 0;
+#X connect 5 0 11 0;
+#X connect 6 0 33 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 1;
+#X connect 11 0 7 0;
+#X connect 12 0 3 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 15 0 12 1;
+#X connect 24 1 32 0;
+#X connect 25 1 31 0;
+#X connect 26 1 29 0;
+#X connect 27 1 28 0;
+#X connect 33 0 5 0;
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..c370a754
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rgb_to_greyscale-help.pd
@@ -0,0 +1,27 @@
+#N canvas 689 0 632 401 10;
+#X obj 166 183 #out window;
+#X obj 166 112 #in;
+#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 obj 0 0 doc_h;
+#X obj 3 208 doc_c 0;
+#X obj 3 248 doc_i 1;
+#X obj 3 310 doc_o 1;
+#X obj 14 340 doc_oo 0;
+#X obj 14 278 doc_ii 0;
+#X text 15 27 Creates a greyscale image from a rgb color image.;
+#X obj 97 278 doc_m i0 grid;
+#X text 232 278 presumed to be an RGB image;
+#X obj 97 340 doc_m o0 grid;
+#X text 232 340 the image converted to greyscale.;
+#X obj 0 372 doc_f;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 0 0;
+#X connect 13 1 14 0;
+#X connect 15 1 16 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..cbb7ab1f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rgb_to_yuv-help.pd
@@ -0,0 +1,30 @@
+#N canvas 205 69 632 421 10;
+#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 #rgb_to_yuv;
+#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 obj 226 152 #out window;
+#X obj 0 0 doc_h;
+#X obj 3 268 doc_i 1;
+#X obj 3 228 doc_c 0;
+#X obj 3 330 doc_o 1;
+#X obj 14 360 doc_oo 0;
+#X obj 14 298 doc_ii 0;
+#X obj 0 392 doc_f;
+#X obj 97 298 doc_m i0 grid;
+#X obj 97 360 doc_m o0 grid;
+#X text 232 298 image in RGB format.;
+#X text 232 360 image in YUV format.;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 2 0 8 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 16 1 18 0;
+#X connect 17 1 19 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..f8167a45
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rotate-help.pd
@@ -0,0 +1,49 @@
+#N canvas 689 0 632 445 10;
+#X obj 180 121 #rotate;
+#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 0 1;
+#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 0 1;
+#X obj 9 76 metro 100;
+#X text 232 274 The Grid passed in inlet 0 will be the grid on which
+the rotation will be performed.;
+#X floatatom 243 123 7 0 0 0 - - -;
+#X msg 80 57 open b001.jpg;
+#X obj 0 0 doc_h;
+#X obj 3 244 doc_i 2;
+#X obj 3 169 doc_c 1;
+#X text 232 371 Outputs the result of the rotation and needs to be
+sent to a [#remap_image] to be visualised.;
+#X obj 3 341 doc_o 1;
+#X obj 14 371 doc_oo 0;
+#X obj 14 274 doc_ii 0;
+#X obj 14 309 doc_ii 1;
+#X obj 14 199 doc_cc 0;
+#X obj 97 199 doc_m c0 float;
+#X obj 97 274 doc_m i0 grid;
+#X obj 97 309 doc_m i1 float;
+#X text 232 309 same as arg 0;
+#X obj 97 371 doc_m o0 grid;
+#X obj 0 416 doc_f;
+#X text 232 199 integer number (0 to 35999) as a creation argument
+which initializes the first angle of rotation.;
+#X connect 0 0 5 1;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 4 0 0 1;
+#X connect 4 0 10 0;
+#X connect 5 0 6 0;
+#X connect 5 1 0 0;
+#X connect 7 0 8 0;
+#X connect 8 0 3 0;
+#X connect 11 0 3 0;
+#X connect 21 1 27 0;
+#X connect 22 1 9 0;
+#X connect 23 1 24 0;
+#X connect 25 1 15 0;
diff --git a/externals/gridflow/doc/flow_classes/#rotatificator-help.pd b/externals/gridflow/doc/flow_classes/#rotatificator-help.pd
new file mode 100644
index 00000000..e31066a3
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#rotatificator-help.pd
@@ -0,0 +1,50 @@
+#N canvas 604 245 632 581 10;
+#X obj 0 0 doc_h;
+#X obj 0 552 doc_f;
+#X obj 20 64 #rotatificator;
+#X text 191 138 named in honour of Laszlo Zlotz (a character from Achille
+Talon);
+#X obj 3 532 doc_also;
+#X obj 103 532 #rotate;
+#X obj 3 286 doc_i 2;
+#X obj 3 418 doc_o 1;
+#X obj 14 448 doc_oo 0;
+#X obj 14 316 doc_ii 0;
+#X obj 14 386 doc_ii 1;
+#X obj 97 316 doc_m i0 float;
+#X obj 97 338 doc_m i0 axis;
+#X obj 3 180 doc_c 3;
+#X obj 14 210 doc_cc 0;
+#X obj 14 232 doc_cc 1;
+#X obj 14 254 doc_cc 2;
+#X obj 97 448 doc_m o0 grid;
+#X obj 97 386 doc_m i1;
+#X obj 97 210 doc_m c0 float/int;
+#X obj 97 232 doc_m c1 float/int;
+#X obj 97 254 doc_m c2 float/int;
+#X text 232 210 from;
+#X text 232 232 to;
+#X text 232 254 n;
+#X text 232 338 \$1=from (default:0) \; \$2=to (default: 1) \; \$3=n
+(default: 2);
+#X text 232 386 angle;
+#X text 232 316 scale;
+#X text 192 44 generates a N by N rotation matrix that rotates through
+two dimensions of your choice (from \, to) by a certain angle (in centidegrees).
+values produced are integers. the rotation matrix is multiplied by
+the given scale factor such that after an eventual [#inner] \, a division
+by the same amount would be performed. greater scale factors are more
+precise.;
+#X text 232 448 rotation matrix such that if rows 'from' and 'to' were
+deleted and columns 'from' and 'to' were deleted \, you'd have an identity
+matrix. in other words \, the rotation happens in a plane space made
+of the two dimensions represented by those two rows and two columns.
+;
+#X connect 4 1 5 0;
+#X connect 11 1 27 0;
+#X connect 12 1 25 0;
+#X connect 17 1 29 0;
+#X connect 18 1 26 0;
+#X connect 19 1 22 0;
+#X connect 20 1 23 0;
+#X connect 21 1 24 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..f493dde7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#saturation-help.pd
@@ -0,0 +1,52 @@
+#N canvas 115 0 632 551 10;
+#X obj 47 267 print;
+#X obj 47 227 #out window;
+#X text 313 178 OR;
+#X text 295 140 global saturation;
+#X obj 47 248 fps detailed;
+#X text 260 197 per-channel saturation;
+#X msg 251 135 0;
+#X obj 251 114 loadbang;
+#X obj 254 156 hsl 137 15 -256 512 0 0 empty empty empty -2 -6 0 8
+-260818 -128992 -1 4533 1;
+#X floatatom 212 157 5 0 0 0 - - -;
+#X obj 47 65 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 47 99 metro 33.3667;
+#X msg 204 198 3 # \$1;
+#X obj 47 134 #in babbage.jpg;
+#X obj 204 224 #color -256 512 1;
+#X obj 47 203 #saturation -128;
+#X obj 0 0 doc_h;
+#X obj 3 376 doc_i 2;
+#X obj 3 301 doc_c 1;
+#X obj 3 460 doc_o 1;
+#X obj 14 406 doc_ii 0;
+#X obj 14 428 doc_ii 1;
+#X obj 14 490 doc_oo 0;
+#X obj 14 331 doc_cc 0;
+#X text 232 428 same as arg 0;
+#X obj 97 331 doc_m c0 float/int;
+#X obj 97 406 doc_m i0 grid;
+#X obj 97 428 doc_m i1 grid;
+#X obj 97 490 doc_m o0 grid;
+#X obj 0 522 doc_f;
+#X text 232 406 image to be modified;
+#X text 232 331 Saturation multiplier. 256 does nothing. 0 turns to
+greyscale. -256 does like [#hueshift 18000].;
+#X text 232 490 modified image;
+#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 15 0;
+#X connect 14 0 15 1;
+#X connect 15 0 1 0;
+#X connect 25 1 31 0;
+#X connect 26 1 30 0;
+#X connect 27 1 24 0;
+#X connect 28 1 32 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..5b61d091
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#scale_by-help.pd
@@ -0,0 +1,57 @@
+#N canvas 690 0 632 610 10;
+#X obj 11 82 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
+#X obj 11 102 metro 100;
+#X obj 89 149 #in;
+#X obj 103 561 #scale_to;
+#X obj 169 561 #downscale_by;
+#X text 232 507 Outputs the resulting scaled image.;
+#X obj 89 207 #out window \, title #scale_by;
+#X msg 89 85 open bluemarble.jpg \, bang;
+#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 232 362 The Grid on which the scale_to will be performed.;
+#X obj 0 0 doc_h;
+#X obj 3 332 doc_i 2;
+#X obj 3 477 doc_o 1;
+#X text 232 265 The scaling factor (defaults to 2).;
+#X obj 3 561 doc_also;
+#X obj 14 507 doc_oo 0;
+#X obj 14 362 doc_ii 0;
+#X obj 14 445 doc_ii 1;
+#X obj 14 265 doc_cc 0;
+#X obj 97 362 doc_m i0 grid;
+#X obj 97 265 doc_m c0 grid;
+#X obj 97 445 doc_m i1 grid;
+#X obj 3 235 doc_c 0..1;
+#X text 232 445 same as arg 0;
+#X text 232 287 if it's a single value \, then that factor is to be
+used for both rows and columns.;
+#X text 232 384 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.;
+#X text 232 529 grid((factor*y) (factor*x) channels);
+#X obj 97 507 doc_m o0 grid;
+#X obj 0 581 doc_f;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 8 0;
+#X connect 7 0 2 0;
+#X connect 8 0 6 0;
+#X connect 10 0 8 1;
+#X connect 11 0 8 1;
+#X connect 12 0 8 1;
+#X connect 18 1 3 0;
+#X connect 18 1 4 0;
+#X connect 23 1 13 0;
+#X connect 23 1 29 0;
+#X connect 24 1 17 0;
+#X connect 24 1 28 0;
+#X connect 25 1 27 0;
+#X connect 31 1 5 0;
+#X connect 31 1 30 0;
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..54adb77a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#scale_to-help.pd
@@ -0,0 +1,66 @@
+#N canvas 674 0 632 523 10;
+#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 15 0 640 0 0 empty empty empty 0 -8 0 8 -260818
+-1 -1 0 1;
+#X obj 325 158 hsl 128 15 0 640 0 0 empty empty empty 0 -8 0 8 -260818
+-1 -1 0 1;
+#X obj 89 208 #out window \, title #scale_to;
+#X obj 169 474 #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 msg 284 94 2 # 100 500;
+#X msg 285 115 2 # 500 100;
+#X text 460 133 height;
+#X text 460 155 width;
+#X text 232 442 Outputs the resulting scaled image.;
+#X text 232 270 A (height width) pair of integers indicating the size
+to scale to image to. This initial argument is required.;
+#X text 232 345 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 103 474 #scale_by;
+#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 obj 0 0 doc_h;
+#X obj 3 315 doc_i 2;
+#X obj 3 240 doc_c 1;
+#X obj 3 474 doc_also;
+#X obj 3 412 doc_o 1;
+#X obj 14 442 doc_oo 0;
+#X obj 14 345 doc_ii 0;
+#X obj 14 380 doc_ii 1;
+#X obj 14 270 doc_cc 0;
+#X obj 97 270 doc_m c0 (int int);
+#X obj 97 345 doc_m i0 grid;
+#X text 232 380 same as arg 0;
+#X obj 97 380 doc_m i1 (int int);
+#X obj 97 442 doc_m o0 grid;
+#X obj 0 494 doc_f;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 7 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 1;
+#X connect 4 0 10 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 1;
+#X connect 9 0 3 0;
+#X connect 11 0 2 1;
+#X connect 11 0 12 0;
+#X connect 13 0 2 1;
+#X connect 13 0 12 0;
+#X connect 14 0 2 1;
+#X connect 14 0 12 0;
+#X connect 26 1 21 0;
+#X connect 26 1 8 0;
+#X connect 32 1 18 0;
+#X connect 33 1 19 0;
+#X connect 35 1 34 0;
+#X connect 36 1 17 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..06bad143
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#scan-help.pd
@@ -0,0 +1,48 @@
+#N canvas 664 0 632 547 10;
+#X floatatom 17 76 5 0 0 0 - - -;
+#X floatatom 62 76 5 0 0 0 - - -;
+#X floatatom 109 76 5 0 0 0 - - -;
+#X floatatom 17 245 5 0 0 0 - - -;
+#X floatatom 56 245 5 0 0 0 - - -;
+#X floatatom 96 245 5 0 0 0 - - -;
+#X obj 17 116 #pack 3;
+#X obj 17 147 #scan +;
+#X obj 17 206 #unpack 3;
+#X obj 103 498 #fold +;
+#X obj 0 0 doc_h;
+#X obj 3 498 doc_also;
+#X obj 3 274 doc_c 1;
+#X obj 3 336 doc_i 1;
+#X obj 3 438 doc_o 1;
+#X obj 14 468 doc_oo 0;
+#X obj 14 304 doc_cc 0;
+#X text 69 35 computes subtotals and stuff;
+#X text 165 74 replaces every Dim(last) subgrid by all the results
+of cascading the operator on that subgrid \, producing a Dim(dims \,
+last) grid.;
+#X text 165 127 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".;
+#X obj 14 366 doc_ii 0;
+#X obj 97 366 doc_m i0 grid;
+#X obj 97 386 doc_m i0 op;
+#X obj 97 408 doc_m i0 seed;
+#X text 165 191 [#scan +] computes subtotals \; this can be used \,
+for example \, to convert a regular probability distribution into a
+cumulative one. (or in general \, discrete integration);
+#X obj 0 518 doc_f;
+#X obj 97 468 doc_m o0 grid;
+#X obj 97 304 doc_m c0 symbol;
+#X text 232 304 numop;
+#X text 232 386 same as arg 0;
+#X connect 0 0 6 0;
+#X connect 1 0 6 1;
+#X connect 2 0 6 2;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 3 0;
+#X connect 8 1 4 0;
+#X connect 8 2 5 0;
+#X connect 11 1 9 0;
+#X connect 22 1 29 0;
+#X connect 27 1 28 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..df26fff8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#seq_fold-help.pd
@@ -0,0 +1,55 @@
+#N canvas 677 0 632 548 10;
+#X obj 125 63 route end;
+#X obj 126 162 display;
+#X obj 125 106 #seq_fold;
+#X obj 154 130 # +;
+#X msg 125 43 2 1 \, 3 2 \, 5 3 \, 7 4 \, end;
+#X msg 206 82 0 0;
+#X obj 206 63 loadbang;
+#X obj 92 193 #print AAA;
+#X obj 0 0 doc_h;
+#X obj 3 225 doc_c;
+#X obj 3 265 doc_i 4;
+#X obj 14 423 doc_oo 0;
+#X obj 14 445 doc_oo 1;
+#X obj 14 467 doc_oo 2;
+#X obj 3 393 doc_o 3;
+#X obj 14 295 doc_ii 0;
+#X obj 14 317 doc_ii 1;
+#X obj 14 339 doc_ii 2;
+#X obj 14 361 doc_ii 3;
+#X obj 0 519 doc_f;
+#X obj 97 295 doc_m i0 bang;
+#X obj 97 317 doc_m i1 grid;
+#X obj 97 339 doc_m i2 grid;
+#X obj 97 361 doc_m i3 grid;
+#X obj 97 423 doc_m o0 grid;
+#X obj 97 445 doc_m o1 grid;
+#X obj 97 467 doc_m o2 grid;
+#X obj 3 499 doc_also;
+#X obj 103 499 seq_fold;
+#X text 232 445 to outside left inlet;
+#X text 232 467 to outside right inlet;
+#X text 232 423 final result;
+#X text 232 361 from outside outlet;
+#X text 232 339 seed;
+#X text 232 295 output the final result;
+#X text 232 317 sequence of values to be folded;
+#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;
+#X connect 20 1 34 0;
+#X connect 21 1 35 0;
+#X connect 22 1 33 0;
+#X connect 23 1 32 0;
+#X connect 24 1 31 0;
+#X connect 25 1 29 0;
+#X connect 26 1 30 0;
+#X connect 27 1 28 1;
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..df793231
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#slice-help.pd
@@ -0,0 +1,47 @@
+#N canvas 206 135 632 525 10;
+#X obj 38 190 display;
+#X text 36 213 should print subgrid: 3 5 8 13 21;
+#X msg 37 145 0 1 1 2 3 5 8 13 21 34 55 89;
+#X obj 37 170 #slice 4 9;
+#X obj 256 109 #slice (1 1) (3 3);
+#X obj 257 130 display;
+#X obj 256 90 #redim (4 4);
+#X obj 256 71 #for 0 16 1;
+#X obj 256 54 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 259 177 should print subgrid: 2 2 # 5 6 9 10;
+#X obj 0 0 doc_h;
+#X obj 3 244 doc_c 2;
+#X obj 3 328 doc_i 3;
+#X obj 3 434 doc_o 1;
+#X obj 14 464 doc_oo 0;
+#X obj 14 380 doc_ii 1;
+#X obj 14 358 doc_ii 0;
+#X obj 14 402 doc_ii 2;
+#X obj 14 274 doc_cc 0;
+#X obj 14 296 doc_cc 1;
+#X obj 0 496 doc_f;
+#X obj 97 274 doc_m c0 grid;
+#X obj 97 296 doc_m c1 grid;
+#X obj 97 358 doc_m i0 grid;
+#X obj 97 380 doc_m i1 grid;
+#X obj 97 402 doc_m i2 grid;
+#X obj 97 464 doc_m o0 grid;
+#X text 232 380 same as arg 0;
+#X text 232 402 same as arg 1;
+#X text 232 464 slice;
+#X text 232 358 grid to be sliced;
+#X text 232 296 end positions (as in #for);
+#X text 232 274 start positions as in #for);
+#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;
+#X connect 21 1 32 0;
+#X connect 22 1 31 0;
+#X connect 23 1 30 0;
+#X connect 24 1 27 0;
+#X connect 25 1 28 0;
+#X connect 26 1 29 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..02240cc0
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#solarize-help.pd
@@ -0,0 +1,39 @@
+#N canvas 690 0 632 491 10;
+#X obj 170 140 bng 15 250 50 0 empty empty empty 0 -6 0 8 -4034 -1
+-1;
+#X obj 170 219 #solarize;
+#X obj 170 183 #in;
+#X obj 103 442 #convolve;
+#X obj 169 442 #contrast;
+#X obj 235 442 #posterize;
+#X obj 307 442 #layer;
+#X obj 0 0 doc_h;
+#X obj 3 442 doc_also;
+#X obj 3 278 doc_c;
+#X obj 3 380 doc_o 1;
+#X obj 3 318 doc_i 1;
+#X obj 14 410 doc_oo 0;
+#X obj 14 348 doc_ii 0;
+#X obj 247 215 #out window \, title original;
+#X obj 170 240 #out window \, title modified;
+#X obj 97 410 doc_m o0 grid;
+#X obj 97 348 doc_m i0 grid;
+#X obj 0 462 doc_f;
+#X msg 170 157 load bluemarble.jpg;
+#X text 12 36 Makes medium intensities brightest. Formerly brightest
+colors become darkest \, formerly darkest stays darkest. This filter
+is non-linear (but piecewise-linear). It's like a 200% contrast \,
+except that overflows are mirrored instead of clipped or wrapped.;
+#X text 232 348 pixels;
+#X text 232 410 pixels;
+#X connect 0 0 19 0;
+#X connect 1 0 15 0;
+#X connect 2 0 1 0;
+#X connect 2 0 14 0;
+#X connect 8 1 3 0;
+#X connect 8 1 4 0;
+#X connect 8 1 5 0;
+#X connect 8 1 6 0;
+#X connect 16 1 22 0;
+#X connect 17 1 21 0;
+#X connect 19 0 2 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..f2cdc61c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#sort-help.pd
@@ -0,0 +1,45 @@
+#N canvas 484 136 632 572 10;
+#X obj 28 250 #sort;
+#X msg 28 45 0 1 1 2 3 5 8 13 21 34 55 89;
+#X msg 28 102 12 # 666;
+#X obj 28 121 # rand;
+#X obj 28 178 #store;
+#X obj 28 140 #grade;
+#X obj 28 64 t a a;
+#X obj 28 83 #finished;
+#X obj 58 204 display;
+#X obj 28 159 #outer + (0);
+#X text 151 140 shuffle;
+#X obj 58 274 display;
+#X text 140 252 unshuffle;
+#X obj 0 0 doc_h;
+#X obj 3 311 doc_c 0;
+#X obj 3 351 doc_i 1;
+#X obj 3 461 doc_o 1;
+#X obj 3 523 doc_also;
+#X obj 103 523 #grade;
+#X obj 14 491 doc_oo 0;
+#X obj 14 381 doc_ii 0;
+#X obj 0 543 doc_f;
+#X obj 97 381 doc_m i0 grid;
+#X obj 97 491 doc_m o0 grid;
+#X text 232 491 sorted data;
+#X text 232 381 1-D grid to be sorted;
+#X text 232 403 this takes an average time proportional to N log N
+(a pass on the data takes N time \, and sorting something twice bigger
+takes an extra pass);
+#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;
+#X connect 17 1 18 0;
+#X connect 22 1 25 0;
+#X connect 22 1 26 0;
+#X connect 23 1 24 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..9c6fc31a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#spread-help.pd
@@ -0,0 +1,79 @@
+#N canvas 673 0 632 642 10;
+#X text 1 25 makes noise;
+#X obj 207 42 bng 15 250 50 0 empty empty empty 0 -6 0 8 -233017 -1
+-1;
+#X obj 221 134 tgl 15 0 empty empty empty 0 -6 0 8 -233017 -1 -1 0
+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 219 308 we limit here \, because the values might go out of
+range;
+#X obj 149 73 metro 50;
+#X obj 149 51 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 20 129 #import (256 256 2);
+#X obj 195 269 #store;
+#X obj 195 341 #out window;
+#X obj 310 341 #out window;
+#X obj 310 291 #clip;
+#X obj 148 124 #in;
+#X obj 249 247 shunt;
+#X obj 0 0 doc_h;
+#X obj 3 491 doc_c 1;
+#X obj 3 633 doc_o 1;
+#X obj 3 551 doc_i 2;
+#X text 210 147 switch displays \, use this to get an image into the
+#store;
+#X obj 14 663 doc_oo 0;
+#X obj 14 581 doc_ii 0;
+#X obj 14 601 doc_ii 1;
+#X obj 14 521 doc_cc 0;
+#X obj 97 581 doc_m i0 grid;
+#X obj 97 663 doc_m o0 grid;
+#X text 326 33 typically you plug a [#for] into this object \, and
+you plug this object into the left side of a [#store]. it will scatter
+pixels around \, giving an "unpolished glass" effec.t;
+#X text 326 89 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.;
+#X text 54 364 [#spread] 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.;
+#X text 52 425 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 .;
+#X obj 0 693 doc_f;
+#X obj 97 601 doc_m i1 grid;
+#X obj 97 521 doc_m c0 grid;
+#X text 232 601 same as arg 0;
+#X obj 20 197 #spread 1;
+#X obj 310 270 #spread 1;
+#X msg 207 89 load r001.jpg;
+#X connect 1 0 41 0;
+#X connect 2 0 19 1;
+#X connect 3 0 40 1;
+#X connect 4 0 39 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 13 0;
+#X connect 9 0 8 1;
+#X connect 11 0 18 0;
+#X connect 12 0 11 0;
+#X connect 13 0 39 0;
+#X connect 14 0 15 0;
+#X connect 17 0 16 0;
+#X connect 18 0 19 0;
+#X connect 19 0 14 1;
+#X connect 19 1 40 0;
+#X connect 36 1 38 0;
+#X connect 39 0 14 0;
+#X connect 40 0 17 0;
+#X connect 41 0 18 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..bc4a52c0
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#store-help.pd
@@ -0,0 +1,111 @@
+#N canvas 602 0 632 642 10;
+#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 obj 134 150 #store;
+#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 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 obj 296 96 loadbang;
+#X obj 3 341 doc_i 2;
+#X obj 0 0 doc_h;
+#X obj 3 279 doc_c 1;
+#X obj 14 371 doc_ii 0;
+#X obj 14 571 doc_ii 1;
+#X obj 3 882 doc_o 1;
+#X obj 14 912 doc_oo 0;
+#X obj 14 309 doc_cc 0;
+#X obj 97 309 doc_m c0 grid;
+#X obj 97 406 doc_m i0 grid;
+#X obj 97 371 doc_m i0 bang;
+#X text 232 371 A bang at the left inlet will cause [#store] to send
+its value to the outlet.;
+#X obj 97 571 doc_m i1 grid;
+#X text 232 571 when in reassign mode \, this is same as arg 0;
+#X text 232 593 when it put_at mode \, it basically keeps the previous
+arg 0 or reassignment \, but replaces a selected part inside of it.
+;
+#X obj 97 824 doc_m i1 reassign;
+#X obj 97 663 doc_m i1 put_at;
+#X obj 97 912 doc_m o0 grid;
+#X text 232 406 in this grid \, the last dimension refers to subparts
+of the stored grid. sending a Dim(200 \, 200 \, 2) on a [#store] that
+holds a Dim(240 \, 320 \, 3) will cause the [#store] 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.;
+#X text 232 824 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.;
+#X text 232 663 makes it so that sending a grid to inlet 1 writes into
+the existing buffer of [#store].;
+#X text 232 698 example: suppose you have [#store 10 240 320 3]. 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.;
+#X text 194 227 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.;
+#X text 232 912 grids as stored \, as indexed \, or as assembled from
+multiple indexings.;
+#X obj 0 957 doc_f;
+#X text 232 309 initial value to be stored;
+#X obj 97 628 doc_m i1 op;
+#X text 232 628 recombination operator used by put_at \, just like
+arg 0 of [#draw_image];
+#X connect 0 0 12 0;
+#X connect 1 0 12 1;
+#X connect 12 0 15 0;
+#X connect 12 0 17 0;
+#X connect 12 0 22 0;
+#X connect 13 0 17 1;
+#X connect 14 0 13 0;
+#X connect 15 0 2 0;
+#X connect 15 1 9 0;
+#X connect 16 0 3 0;
+#X connect 16 1 5 0;
+#X connect 16 2 6 0;
+#X connect 17 0 16 0;
+#X connect 17 0 20 0;
+#X connect 21 0 17 0;
+#X connect 23 0 14 0;
+#X connect 32 1 49 0;
+#X connect 33 1 42 0;
+#X connect 34 1 35 0;
+#X connect 36 1 37 0;
+#X connect 36 1 38 0;
+#X connect 39 1 43 0;
+#X connect 40 1 44 0;
+#X connect 40 1 45 0;
+#X connect 41 1 47 0;
+#X connect 50 1 51 0;
diff --git a/externals/gridflow/doc/flow_classes/#swap-help.pd b/externals/gridflow/doc/flow_classes/#swap-help.pd
new file mode 100644
index 00000000..70263b36
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#swap-help.pd
@@ -0,0 +1,25 @@
+#N canvas 335 118 632 379 10;
+#X obj 0 0 doc_h;
+#X obj 0 350 doc_f;
+#X obj 60 55 #swap;
+#X text 223 55 grid equivalent of [swap];
+#X obj 3 168 doc_i 2;
+#X obj 3 250 doc_o 2;
+#X obj 14 198 doc_ii 0;
+#X obj 14 218 doc_ii 1;
+#X obj 14 280 doc_oo 0;
+#X obj 14 300 doc_oo 1;
+#X obj 97 198 doc_m i0 grid;
+#X obj 97 218 doc_m i1 grid;
+#X obj 97 280 doc_m o0 grid;
+#X obj 97 300 doc_m o1 grid;
+#X obj 3 330 doc_also;
+#X obj 103 330 swap;
+#X obj 14 136 doc_cc 0;
+#X obj 3 106 doc_c 0..1;
+#X text 232 136 same as [#store];
+#X text 232 218 same as arg 0;
+#X obj 97 136 doc_m c0 grid;
+#X connect 11 1 19 0;
+#X connect 14 1 15 0;
+#X connect 20 1 18 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..a8c4f064
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#t-help.pd
@@ -0,0 +1,58 @@
+#N canvas 78 0 632 554 10;
+#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 obj 237 134 #in teapot.png;
+#X text 232 425 The same grid received in inlet 0 is first sent to
+the outlet 0;
+#X text 232 460 The same grid received in inlet 0 is sent to the outlet
+1 after it was sent to outlet 0;
+#X text 232 337 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 obj 0 0 doc_h;
+#X obj 3 307 doc_i 1;
+#X obj 3 395 doc_o 2;
+#X obj 3 267 doc_c 0;
+#X obj 3 505 doc_also;
+#X obj 14 337 doc_ii 0;
+#X obj 14 425 doc_oo 0;
+#X obj 14 460 doc_oo 1;
+#X obj 97 337 doc_m i0 grid;
+#X obj 97 425 doc_m o0 grid;
+#X obj 97 460 doc_m o1 grid;
+#X obj 0 525 doc_f;
+#X obj 103 505 t;
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 1 1 2 0;
+#X connect 2 0 7 1;
+#X connect 3 0 6 1;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 5 1 3 0;
+#X connect 6 0 12 0;
+#X connect 7 0 11 0;
+#X connect 10 0 15 0;
+#X connect 15 0 5 0;
+#X connect 23 1 31 0;
+#X connect 27 1 18 0;
+#X connect 28 1 16 0;
+#X connect 29 1 17 0;
diff --git a/externals/gridflow/doc/flow_classes/#text_to_image-help.pd b/externals/gridflow/doc/flow_classes/#text_to_image-help.pd
new file mode 100644
index 00000000..238dab37
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#text_to_image-help.pd
@@ -0,0 +1,24 @@
+#N canvas 685 0 632 345 10;
+#X obj 0 0 doc_h;
+#X obj 33 40 #text_to_image;
+#X obj 3 71 doc_c 0;
+#X obj 3 111 doc_i 3;
+#X obj 3 256 doc_o 1;
+#X obj 14 141 doc_ii 0;
+#X obj 14 176 doc_ii 1;
+#X obj 14 211 doc_ii 2;
+#X obj 97 141 doc_m i0 bang;
+#X text 232 141 transforming the data into an image suitable for #draw_image.
+;
+#X obj 14 286 doc_oo 0;
+#X obj 97 286 doc_m o0 grid;
+#X obj 97 211 doc_m i2 grid;
+#X obj 97 176 doc_m i1 grid;
+#X text 232 176 2 by 3 matrix representing the colours to use (e.g.
+(2 3 # 0 170 0 255 255 0) means yellow on green);
+#X obj 0 316 doc_f;
+#X text 232 211 font grid \, for example \, from [#in grid lucida-typewriter-12.grid]
+;
+#X connect 8 1 9 0;
+#X connect 12 1 16 0;
+#X connect 13 1 14 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..16886baf
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_float-help.pd
@@ -0,0 +1,29 @@
+#N canvas 678 0 632 446 10;
+#X obj 15 188 cnv 15 55 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 39 135 display;
+#X msg 15 73 1 2 3 4 5 6 7 8;
+#X text 138 73 <-- create the grid here;
+#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 obj 15 100 #import (2 2 2);
+#X obj 0 0 doc_h;
+#X obj 3 280 doc_i 1;
+#X obj 3 240 doc_c;
+#X obj 14 372 doc_oo 0;
+#X obj 14 310 doc_ii 0;
+#X obj 3 342 doc_o 1;
+#X obj 97 310 doc_m i0 grid;
+#X obj 97 372 doc_m o0 float;
+#X obj 0 417 doc_f;
+#X text 232 310 content to be finely chopped;
+#X text 232 372 a sequence of floats that the incoming grid is transformed
+into. they are output in normal grid order.;
+#X connect 2 0 7 0;
+#X connect 4 0 6 0;
+#X connect 7 0 1 0;
+#X connect 7 0 4 0;
+#X connect 14 1 17 0;
+#X connect 15 1 18 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..51a376ea
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_list-help.pd
@@ -0,0 +1,31 @@
+#N canvas 544 108 632 450 10;
+#X obj 15 164 cnv 15 52 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 50 115 display;
+#X msg 14 64 1 2 3 4 5 6 7 8;
+#X obj 161 217 display;
+#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 14 165 #to_list;
+#X obj 14 216 print converted_grid;
+#X obj 14 91 #import (2 2 2);
+#X obj 0 0 doc_h;
+#X obj 3 346 doc_o 1;
+#X obj 3 284 doc_i 1;
+#X obj 3 244 doc_c 0;
+#X text 232 376 The grid is transformed into a single message containing
+a sequence of floats.;
+#X obj 14 314 doc_ii 0;
+#X obj 14 376 doc_oo 0;
+#X obj 97 314 doc_m i0 grid;
+#X obj 97 376 doc_m o0 list;
+#X obj 0 421 doc_f;
+#X text 232 314 will be transformed into a list.;
+#X connect 2 0 8 0;
+#X connect 6 0 3 0;
+#X connect 6 0 7 0;
+#X connect 8 0 1 0;
+#X connect 8 0 6 0;
+#X connect 16 1 19 0;
+#X connect 17 1 13 0;
diff --git a/externals/gridflow/doc/flow_classes/#to_literal-help.pd b/externals/gridflow/doc/flow_classes/#to_literal-help.pd
new file mode 100644
index 00000000..15f076e8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_literal-help.pd
@@ -0,0 +1,34 @@
+#N canvas 556 102 632 540 10;
+#X obj 0 0 doc_h;
+#X obj 0 511 doc_f;
+#X obj 96 289 #to_literal;
+#X obj 102 312 display;
+#X obj 3 347 doc_c 0;
+#X obj 3 387 doc_i 1;
+#X obj 3 449 doc_o 1;
+#X obj 14 417 doc_ii 0;
+#X obj 14 479 doc_oo 0;
+#X obj 97 417 doc_m i0 grid;
+#X obj 102 146 display;
+#X obj 96 165 # +;
+#X text 123 166 "do nothing": just convert literal to grid;
+#X obj 102 224 display;
+#X msg 96 123 3 3 # 2 3 5 7 11 13 17 19 23;
+#X obj 97 479 doc_m o0 list;
+#X text 232 479 grid literal;
+#X msg 118 62 3 2 f # 0.1 0.333333 2.71828 3.14159 1.4142 1.61803;
+#X obj 118 103 # + (f #);
+#X obj 96 201 t a;
+#X obj 124 83 display;
+#X text 232 417 any grid;
+#X connect 2 0 3 0;
+#X connect 9 1 21 0;
+#X connect 11 0 19 0;
+#X connect 14 0 10 0;
+#X connect 14 0 11 0;
+#X connect 15 1 16 0;
+#X connect 17 0 18 0;
+#X connect 17 0 20 0;
+#X connect 18 0 19 0;
+#X connect 19 0 13 0;
+#X connect 19 0 2 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..199ab591
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_pix-help.pd
@@ -0,0 +1,107 @@
+#N canvas 661 0 632 665 10;
+#X msg 365 61 create \, 1;
+#X obj 365 42 loadbang;
+#X msg 157 139 open violoncelle.mov;
+#X obj 130 72 tgl 15 0 empty empty empty 17 7 0 10 -4034 -1 -1 0 1
+;
+#X obj 45 52 gemhead;
+#X obj 45 272 pix_texture;
+#X obj 13 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 13 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 13 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 13 720 cnv 15 500 17 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X text 19 721 see also :;
+#X text 102 720 [#import_pix];
+#X msg 429 62 destroy;
+#X obj 365 93 gemwin 30;
+#X obj 157 117 loadbang;
+#X text 150 69 <-- start playing the video;
+#X text 94 250 <-- imports gridflow grids into GEM;
+#X text 181 720 \, game_of_life_gem.pd in the examples folder;
+#X obj 45 253 #to_pix;
+#X text 232 591 Modified gemstate so that the pix is equal to the Grid
+of inlet 1;
+#X text 232 472 Something coming from [gemhead];
+#X msg 57 217 yflip \$1;
+#X obj 57 197 tgl 15 0 empty empty empty 17 7 0 10 -257985 -1 -1 0
+1;
+#X text 232 494 With one boolean argument that selects the order in
+which the y dimension of the Grid will be read \, defaults to '1';
+#X obj 45 291 rectangle 4 3;
+#X obj 0 0 doc_h;
+#X obj 3 442 doc_i 2;
+#X obj 3 561 doc_o 1;
+#X obj 3 402 doc_c 0;
+#X obj 14 472 doc_ii 0;
+#X obj 14 529 doc_ii 1;
+#X obj 14 591 doc_oo 0;
+#X obj 97 472 doc_m i0 gem_state;
+#X obj 97 494 doc_m i0 yflip;
+#X obj 97 529 doc_m i1 grid;
+#X obj 97 591 doc_m o0 gem_state;
+#X obj 0 636 doc_f;
+#X obj 397 243 b;
+#X obj 397 263 fps;
+#X floatatom 397 282 5 0 0 0 - - -;
+#X obj 130 162 #in;
+#X msg 310 134 cast b;
+#X msg 310 154 cast s;
+#X msg 310 174 cast i;
+#X obj 140 195 shunt;
+#X obj 176 196 tgl 15 0 empty empty empty 17 7 0 10 -257985 -1 -1 0
+1;
+#N canvas 0 22 458 308 to_rgba_if_not_already 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 167 214 pd to_rgba_if_not_already;
+#X text 40 353 Note : you can get some timebased 'moire' effects if
+the arguments to the [gemwin] and the [metro] are not synched;
+#X text 232 529 Grid with 3 or 4 channels (4th channel gets destroyed)
+;
+#X obj 130 93 metro 33.3667;
+#X connect 0 0 13 0;
+#X connect 1 0 0 0;
+#X connect 2 0 40 0;
+#X connect 3 0 49 0;
+#X connect 4 0 18 0;
+#X connect 5 0 24 0;
+#X connect 12 0 13 0;
+#X connect 14 0 2 0;
+#X connect 18 0 5 0;
+#X connect 21 0 18 0;
+#X connect 22 0 21 0;
+#X connect 32 1 20 0;
+#X connect 33 1 23 0;
+#X connect 34 1 48 0;
+#X connect 35 1 19 0;
+#X connect 37 0 38 0;
+#X connect 38 0 39 0;
+#X connect 40 0 37 0;
+#X connect 40 0 44 0;
+#X connect 41 0 40 0;
+#X connect 42 0 40 0;
+#X connect 43 0 40 0;
+#X connect 44 0 18 1;
+#X connect 44 1 46 0;
+#X connect 45 0 44 1;
+#X connect 46 0 18 1;
+#X connect 49 0 40 0;
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..f991d814
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#to_symbol-help.pd
@@ -0,0 +1,52 @@
+#N canvas 648 0 632 642 10;
+#X obj 11 498 cnv 15 63 17 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 176 469 display;
+#X obj 174 557 display;
+#X symbolatom 353 559 12 0 0 0 - - -;
+#X msg 11 409 72 101 108 108 111 32 87 111 114 108 100 33;
+#X obj 11 428 #import (3 2 2);
+#X text 324 409 <-- create the grid here;
+#X obj 11 498 #to_symbol;
+#X obj 11 557 print converted_grid;
+#X obj 0 0 doc_h;
+#X obj 3 691 doc_o 1;
+#X obj 3 629 doc_i 1;
+#X obj 3 589 doc_c 0;
+#X text 11 102 note that a zero value will cause pd to truncate the
+symbol there. thus a symbol may have less bytes than the grid it was
+made from.;
+#X text 10 147 remember that a byte is not necessarily a codepoint
+\, a codepoint is not necessarily a character \, and all characters
+don't always have the same width. these distinctions don't matter for
+all encodings.;
+#X text 11 32 Produces a symbol from grid data in its input. The values
+are expected to be valid in the character encoding that you are using
+\, 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 obj 14 659 doc_ii 0;
+#X obj 14 721 doc_oo 0;
+#X obj 97 659 doc_m i0 grid;
+#X obj 97 721 doc_m o0 symbol;
+#X obj 0 753 doc_f;
+#X text 232 659 will be transformed into a symbol.;
+#X text 232 721 symbol made of grid elements as bytes.;
+#X text 12 211 in the future \, this might work at the level of codepoints
+instead. thus with today's default UTF-8 (compact unicode) encoding
+\, &eacute \; has to be written as 195 169 \, you would be able to
+write it as just 233 (as with iso-latin-1) and it would get converted
+to 195 169 automatically. however there is still another form of this
+character that is made as two codepoints \, 101 (e) and the "dead acute"
+character \, separately \, on systems that support it.;
+#X text 14 342 at this point \, though \, most branches of pd still
+can't handle utf-8 properly \, so there isn't much of a hurry in adding
+utf-8 support to [#to_symbol]...;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
+#X connect 5 0 7 0;
+#X connect 7 0 2 0;
+#X connect 7 0 3 0;
+#X connect 7 0 8 0;
+#X connect 18 1 21 0;
+#X connect 19 1 22 0;
diff --git a/externals/gridflow/doc/flow_classes/#transpose-help.pd b/externals/gridflow/doc/flow_classes/#transpose-help.pd
new file mode 100644
index 00000000..9537434a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#transpose-help.pd
@@ -0,0 +1,37 @@
+#N canvas 674 0 632 444 10;
+#X obj 3 150 doc_c 2;
+#X obj 36 65 #transpose;
+#X obj 3 234 doc_i 3;
+#X obj 3 353 doc_o 1;
+#X obj 0 0 doc_h;
+#X obj 14 180 doc_cc 0;
+#X obj 14 202 doc_cc 1;
+#X obj 14 264 doc_ii 0;
+#X obj 14 299 doc_ii 1;
+#X obj 14 321 doc_ii 2;
+#X obj 14 383 doc_oo 0;
+#X obj 97 180 doc_m c0 float;
+#X obj 97 202 doc_m c1 float;
+#X obj 97 264 doc_m i0 grid;
+#X obj 97 299 doc_m i1 float;
+#X obj 97 321 doc_m i2 float;
+#X obj 97 383 doc_m o0 grid;
+#X text 232 264 swaps the two specified dimensions \; dimension numbers
+are as in [#join].;
+#X text 232 180 dimension number;
+#X text 232 202 dimension number;
+#X text 232 299 same as arg 0;
+#X text 232 321 same as arg 1;
+#X obj 0 415 doc_f;
+#X text 226 58 remaps contents of a grid by swapping dimensions of
+indices. for example \, [#transpose 0 1] does the same as [#remap_image]x[#reverse].
+;
+#X text 232 383 remapped image;
+#X text 228 108 this is like matrix-transposition that you frequently
+read about in linear algebra books.;
+#X connect 11 1 18 0;
+#X connect 12 1 19 0;
+#X connect 13 1 17 0;
+#X connect 14 1 20 0;
+#X connect 15 1 21 0;
+#X connect 16 1 24 0;
diff --git a/externals/gridflow/doc/flow_classes/#type-help.pd b/externals/gridflow/doc/flow_classes/#type-help.pd
new file mode 100644
index 00000000..4f765f5f
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#type-help.pd
@@ -0,0 +1,26 @@
+#N canvas 0 0 632 350 10;
+#X obj 3 117 doc_c 0;
+#X obj 3 157 doc_i 1;
+#X obj 3 217 doc_o 1;
+#X obj 14 247 doc_oo 0;
+#X obj 14 187 doc_ii 0;
+#X text 138 34 gives a symbol representing the numeric type of the
+grid received.;
+#X obj 97 247 doc_m o0 symbol;
+#X obj 97 187 doc_m i0 grid;
+#X obj 3 301 doc_also;
+#X obj 103 301 #dim;
+#X obj 139 301 #finished;
+#X obj 0 0 doc_h;
+#X obj 0 321 doc_f;
+#X obj 17 65 #type;
+#X symbolatom 17 84 10 0 0 0 - - -;
+#X msg 27 38 3 3 f # 10.4;
+#X text 232 247 numbertype in long form.;
+#X text 232 269 one of: uint8 int16 int32 int64 float32 float64;
+#X connect 6 1 16 0;
+#X connect 6 1 17 0;
+#X connect 8 1 9 0;
+#X connect 8 1 10 0;
+#X connect 13 0 14 0;
+#X connect 15 0 13 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..7068382a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#unpack-help.pd
@@ -0,0 +1,28 @@
+#N canvas 286 66 632 455 10;
+#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 196 84 <--click and drag to view grid values.;
+#X obj 17 128 #unpack 3;
+#X obj 0 0 doc_h;
+#X obj 3 304 doc_i 1;
+#X obj 3 364 doc_o n;
+#X text 12 28 Outputs individual values from a grid.;
+#X obj 3 228 doc_c 1;
+#X text 232 394 Outputs grid dimensions as individual numbers.;
+#X obj 14 334 doc_ii 0;
+#X obj 14 394 doc_oo any;
+#X obj 14 258 doc_cc 0;
+#X obj 97 259 doc_m c0 float/int;
+#X obj 97 334 doc_m i0 grid;
+#X obj 97 394 doc_m oany float;
+#X obj 0 426 doc_f;
+#X text 232 259 number of outlets. usually corresponds to the number
+of grid dimensions. (default: 2);
+#X connect 0 0 5 0;
+#X connect 5 0 1 0;
+#X connect 5 1 2 0;
+#X connect 5 2 3 0;
+#X connect 15 1 19 0;
+#X connect 17 1 11 0;
diff --git a/externals/gridflow/doc/flow_classes/#window-help.pd b/externals/gridflow/doc/flow_classes/#window-help.pd
new file mode 100644
index 00000000..aec81f45
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/#window-help.pd
@@ -0,0 +1,33 @@
+#N canvas 514 151 632 415 10;
+#X obj 0 0 doc_h;
+#X obj 0 386 doc_f;
+#X obj 149 56 tgl 15 0 empty empty click_me 17 7 0 10 -4034 -1 -1 0
+1;
+#X obj 47 55 #window alakazou;
+#X obj 14 140 doc_cc 0;
+#X obj 3 110 doc_c 0..1;
+#X obj 97 140 doc_m c0 symbol;
+#X text 232 140 window title;
+#X obj 3 172 doc_i 2;
+#X obj 14 202 doc_ii 0;
+#X obj 14 272 doc_ii 1;
+#X obj 97 237 doc_m i0 state;
+#X text 232 272 same as 'state';
+#X obj 97 202 doc_m i0 grid;
+#X obj 97 272 doc_m i1 bool;
+#X obj 3 366 doc_also;
+#X obj 103 366 #out;
+#X text 232 202 as with #out window when state=1 \; else ignored when
+state=0;
+#X text 232 237 1 to open the window \; 0 to close it.;
+#X obj 3 304 doc_o 1;
+#X obj 14 334 doc_oo 0;
+#X obj 97 334 doc_m o0 ...;
+#X text 232 334 whatever [#out window] outputs.;
+#X connect 2 0 3 1;
+#X connect 6 1 7 0;
+#X connect 11 1 18 0;
+#X connect 13 1 17 0;
+#X connect 14 1 12 0;
+#X connect 15 1 16 0;
+#X connect 21 1 22 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..42ca0f5a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/0x40complex_sq-help.pd
@@ -0,0 +1,52 @@
+#N canvas 648 0 632 537 10;
+#X obj 21 109 @complex_sq;
+#X text 176 59 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 58 5 0 0 0 - - -;
+#X floatatom 21 188 5 0 0 0 - - -;
+#X floatatom 64 58 5 0 0 0 - - -;
+#X floatatom 58 188 5 0 0 0 - - -;
+#X obj 21 78 #pack;
+#X obj 114 185 #print;
+#X obj 21 159 #unpack;
+#X obj 103 488 # +;
+#X obj 133 488 # abs-;
+#X obj 3 488 doc_also;
+#X obj 181 488 # C.sq-;
+#X obj 3 324 doc_c 0;
+#X obj 3 364 doc_i 1;
+#X obj 3 426 doc_o 1;
+#X obj 0 0 doc_h;
+#X obj 14 456 doc_oo 0;
+#X obj 14 394 doc_ii 0;
+#X obj 97 394 doc_m i0 grid;
+#X obj 97 456 doc_m o0 grid;
+#X text 232 394 grid of size (... \, 2);
+#X text 232 456 grid of same size;
+#X obj 0 508 doc_f;
+#X text 178 128 However \, this (old) object is backwards from the
+rest of GridFlow because it puts Imaginary before Real. [#fft] puts
+the Real part first. Open this abstraction to discover the new way
+to square a complex number. (The extra multiplication is the net result
+of swapping components before and after the squaring);
+#X text 178 212 used on an indexmap (#remap_image) \, this makes each
+thing appear twice \, each appearance spanning half of the original
+angle. straight lines become hyperbolic \, etc.;
+#X text 179 259 In the original version of GridFlow (aka Video4jmax
+0.2) \, the first example patch was feedback_fractal \, which used
+this operation with a [#remap_image] \, though it was expressed in
+much different terms back then.;
+#X connect 0 0 7 0;
+#X connect 0 0 8 0;
+#X connect 2 0 6 0;
+#X connect 4 0 6 1;
+#X connect 6 0 0 0;
+#X connect 8 0 3 0;
+#X connect 8 1 5 0;
+#X connect 11 1 9 1;
+#X connect 11 1 10 0;
+#X connect 11 1 12 0;
+#X connect 19 1 21 0;
+#X connect 20 1 22 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..54e3cfe7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/args-demo.pd
@@ -0,0 +1,27 @@
+#N canvas 0 0 613 300 10;
+#X obj 152 20 args hello (world a 42) *;
+#X obj 43 96 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 2 0 0 0;
+#X connect 3 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 0 1 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..d7f6a345
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/args-help.pd
@@ -0,0 +1,50 @@
+#N canvas 648 0 632 631 10;
+#X text 354 70 demo default args;
+#X text 354 90 demo rest of args;
+#X text 354 130 demo missing args;
+#X text 354 110 demo comma args;
+#X obj 0 0 doc_h;
+#X obj 3 352 doc_i 1;
+#X obj 3 153 doc_c n;
+#X obj 14 382 doc_ii 0;
+#X obj 3 518 doc_o 1..;
+#X obj 97 382 doc_m i0 bang;
+#X obj 14 183 doc_cc any;
+#X obj 97 183 doc_m cany symbol;
+#X text 232 183 "*" represents the rest of arguments;
+#X text 232 205 other symbols represent mandatory arguments;
+#X obj 0 602 doc_f;
+#X obj 14 548 doc_oo any;
+#X obj 97 548 doc_m oany <atom>;
+#X text 232 548 output of single argument;
+#X text 232 570 output of rest of arguments \, if last arg of [args]
+is a "*".;
+#X obj 97 570 doc_m oany <list>;
+#X text 232 382 sends one message per outlet right-to-left. 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 init-message (comma-separated) is parsed
+from the arguments and sent (magically) to the first inlet of the abstraction
+itself.;
+#X obj 97 227 doc_m cany nested-list;
+#X text 232 227 represent optional arguments as nested-lists;
+#X text 232 249 inside the nested-list \, \$1 must be the name of the
+argument \, \$2 must be "a" (the single letter) \, and \$3 must be
+the default value. the "a" is actually for future use (type-checking).
+;
+#X text 97 314 the star can only occur once and at the end \, and all
+optionals must follow all mandatories.;
+#X obj 12 89 args-demo pommes poires ananas biscuits-soda;
+#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 connect 9 1 20 0;
+#X connect 11 1 12 0;
+#X connect 11 1 13 0;
+#X connect 16 1 17 0;
+#X connect 19 1 18 0;
+#X connect 21 1 22 0;
+#X connect 21 1 23 0;
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..b7ae57d5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/ascii-help.pd
@@ -0,0 +1,25 @@
+#N canvas 442 305 632 357 10;
+#X obj 39 73 ascii;
+#X floatatom 39 41 5 0 0 0 - - -;
+#X obj 39 92 print;
+#X text 135 74 write integer as decimal in ascii codes;
+#X text 232 195 number to be converted into ascii codes;
+#X obj 0 0 doc_h;
+#X obj 3 227 doc_o 1;
+#X obj 3 165 doc_i 1;
+#X obj 14 195 doc_ii 0;
+#X obj 14 257 doc_oo 0;
+#X obj 3 125 doc_c 0;
+#X obj 97 195 doc_m i0 float int;
+#X obj 97 257 doc_m o0 float;
+#X obj 0 328 doc_f;
+#X msg 86 40 1e+06;
+#X text 232 257 a sequence of floats corresponding to the ascii codes
+of the input integer as written in decimal. the sign is written in
+the case of negative values. exponential notation is used for large
+numbers.;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 11 1 4 0;
+#X connect 12 1 15 0;
+#X connect 14 0 0 0;
diff --git a/externals/gridflow/doc/flow_classes/ascii_to_f-help.pd b/externals/gridflow/doc/flow_classes/ascii_to_f-help.pd
new file mode 100644
index 00000000..a506c274
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/ascii_to_f-help.pd
@@ -0,0 +1,31 @@
+#N canvas 335 118 632 388 10;
+#X obj 0 0 doc_h;
+#X obj 0 359 doc_f;
+#X obj 31 75 ascii_to_f;
+#X text 200 74 parser for floats written in ascii as sequences of floats
+;
+#X obj 3 134 doc_c 0;
+#X obj 3 174 doc_i 1;
+#X obj 3 236 doc_o 2;
+#X obj 14 266 doc_oo 0;
+#X obj 14 327 doc_oo 1;
+#X obj 14 204 doc_ii 0;
+#X obj 97 204 doc_m i0;
+#X obj 97 327 doc_m o1 float;
+#X obj 97 266 doc_m o0 float;
+#X text 232 327 integer coming from inlet 0 but unrecognised;
+#X text 232 204 ascii bytes (integer);
+#X floatatom 31 100 8 0 0 0 - - -;
+#X obj 90 100 display;
+#X msg 30 50 51 \, 46 \, 49 \, 52 \, 49 \, 53 \, 57 \, 51 \, 0;
+#X text 232 266 float value successfully parsed. note that this is
+output only when an unrecognised character is received \, because otherwise
+\, it can't be known for sure that the number is finished.;
+#X text 201 93 recognises plus \, minus \, period \, but no exponents
+\, infinities nor NaN.;
+#X connect 2 0 15 0;
+#X connect 2 1 16 0;
+#X connect 10 1 14 0;
+#X connect 11 1 13 0;
+#X connect 12 1 18 0;
+#X connect 17 0 2 0;
diff --git a/externals/gridflow/doc/flow_classes/cv/#CornerHarris-help.pd b/externals/gridflow/doc/flow_classes/cv/#CornerHarris-help.pd
new file mode 100644
index 00000000..6d4aaf9d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv/#CornerHarris-help.pd
@@ -0,0 +1,14 @@
+#N canvas 599 185 568 336 10;
+#X obj 0 0 doc_h cv/;
+#X obj 0 307 doc_f;
+#X obj 73 53 cv/#CornerHarris;
+#X obj 3 87 doc_c 0;
+#X obj 3 127 doc_i 1;
+#X obj 14 157 doc_ii 0;
+#X obj 3 247 doc_o 1;
+#X obj 14 277 doc_oo 0;
+#X obj 97 277 doc_m o0 grid;
+#X obj 97 157 doc_m i0 grid;
+#X obj 97 197 doc_m i0 block_size;
+#X obj 97 177 doc_m i0 aperture_size;
+#X obj 97 217 doc_m i0 k;
diff --git a/externals/gridflow/doc/flow_classes/cv/#Ellipse-help.pd b/externals/gridflow/doc/flow_classes/cv/#Ellipse-help.pd
new file mode 100644
index 00000000..be29f945
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv/#Ellipse-help.pd
@@ -0,0 +1,24 @@
+#N canvas 580 166 568 551 10;
+#X obj 0 0 doc_h cv/;
+#X obj 0 443 doc_f;
+#X obj 94 47 cv/#Ellipse;
+#X obj 3 81 doc_c 0;
+#X obj 3 121 doc_i 1;
+#X obj 3 361 doc_o 2;
+#X obj 14 151 doc_ii 0;
+#X obj 14 391 doc_oo 0;
+#X obj 14 411 doc_oo 1;
+#X obj 97 411 doc_m o1;
+#X obj 97 391 doc_m o0 grid;
+#X obj 97 151 doc_m i0 grid;
+#X obj 97 211 doc_m i0 center;
+#X obj 97 191 doc_m i0 axes;
+#X obj 97 171 doc_m i0 angle;
+#X obj 97 311 doc_m i0 start_angle;
+#X obj 97 251 doc_m i0 end_angle;
+#X obj 97 231 doc_m i0 color;
+#X obj 97 331 doc_m i0 thickness;
+#X obj 97 271 doc_m i0 line_type;
+#X obj 97 291 doc_m i0 shift;
+#X text 200 411 attributes;
+#X connect 9 1 21 0;
diff --git a/externals/gridflow/doc/flow_classes/cv/#Invert-help.pd b/externals/gridflow/doc/flow_classes/cv/#Invert-help.pd
new file mode 100644
index 00000000..095a6b4e
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv/#Invert-help.pd
@@ -0,0 +1,32 @@
+#N canvas 335 118 568 535 10;
+#X obj 0 0 doc_h cv/;
+#X obj 0 506 doc_f;
+#X text 88 75 just convert to grid;
+#X obj 55 157 cv/#Invert;
+#X obj 61 178 display;
+#X obj 22 75 # + (f #);
+#X msg 22 56 3 3 f # 1 2 0 3 0 4 5 6 0;
+#X obj 29 96 display;
+#X obj 3 366 doc_i 1;
+#X obj 3 426 doc_o 1;
+#X obj 3 486 doc_also;
+#X obj 100 486 cv/#SVD;
+#X obj 22 157 #t;
+#X obj 23 259 display;
+#X obj 14 396 doc_ii 0;
+#X obj 14 456 doc_oo 0;
+#X obj 3 326 doc_c;
+#X obj 97 396 doc_m i0 grid;
+#X obj 97 456 doc_m o0 grid;
+#X obj 22 239 #inner \, seed (f #);
+#X text 224 105 finds the float matrix that would cancel a given float
+matrix \, if both were to be put in [#inner] together.;
+#X connect 3 0 4 0;
+#X connect 3 0 19 1;
+#X connect 5 0 7 0;
+#X connect 5 0 12 0;
+#X connect 6 0 5 0;
+#X connect 10 1 11 0;
+#X connect 12 0 19 0;
+#X connect 12 1 3 0;
+#X connect 19 0 13 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..166e0aeb
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv/#KMeans-help.pd
@@ -0,0 +1,29 @@
+#N canvas 642 52 560 437 10;
+#X obj 20 190 #out window;
+#X obj 20 63 #in babbage.jpg;
+#X obj 20 46 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 20 102 #cast f;
+#X obj 37 44 loadbang;
+#X obj 20 171 #inner (1 3 # 85 51 15);
+#X obj 42 150 #print;
+#X obj 102 93 #out window;
+#X msg 225 86 mode channels;
+#X obj 20 121 cv/#KMeans 8 \, termcrit (8 nil);
+#X obj 0 0 doc_h cv/;
+#X obj 3 221 doc_c 1;
+#X obj 3 280 doc_i 2;
+#X obj 3 369 doc_o 1;
+#X obj 14 304 doc_ii 0;
+#X obj 14 328 doc_ii 1;
+#X obj 14 393 doc_oo 0;
+#X obj 14 245 doc_cc 0;
+#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/#SVD-help.pd b/externals/gridflow/doc/flow_classes/cv/#SVD-help.pd
new file mode 100644
index 00000000..ba012df1
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv/#SVD-help.pd
@@ -0,0 +1,44 @@
+#N canvas 335 0 568 576 10;
+#X obj 0 0 doc_h cv/;
+#X obj 0 547 doc_f;
+#X obj 19 160 cv/#SVD;
+#X text 200 46 Singular Value Decomposition;
+#X obj 3 306 doc_c 0;
+#X obj 3 346 doc_i 1;
+#X obj 3 408 doc_o 3;
+#X obj 14 376 doc_ii 0;
+#X obj 14 438 doc_oo 0;
+#X obj 14 460 doc_oo 1;
+#X obj 14 482 doc_oo 2;
+#X obj 97 438 doc_m o0 grid;
+#X obj 97 460 doc_m o1 grid;
+#X obj 97 482 doc_m o2 grid;
+#X obj 28 88 display;
+#X text 82 65 just turn into a real grid;
+#X obj 210 161 display;
+#X obj 210 225 display;
+#X obj 20 225 display;
+#X msg 19 46 3 3 f # 1 0 0 0 2 3 0 3 -2;
+#X obj 19 65 # + (f #);
+#X text 287 89 for finding eigenvalues and eigenvectors.;
+#X obj 97 376 doc_m i0 grid;
+#X text 200 376 N by N matrix to decompose;
+#X text 200 438 N by N diagonal matrix containing eigenvalues;
+#X text 200 460 N by N matrix containing eigenvectors;
+#X text 200 482 N by N matrix containing fudge factors: typically contains
+only zeroes \, ones \, and minus ones.;
+#X obj 3 527 doc_also;
+#X obj 97 527 #extract_diagonal;
+#X obj 211 527 cv/#Invert;
+#X connect 2 0 18 0;
+#X connect 2 1 17 0;
+#X connect 2 2 16 0;
+#X connect 11 1 24 0;
+#X connect 12 1 25 0;
+#X connect 13 1 26 0;
+#X connect 19 0 20 0;
+#X connect 20 0 14 0;
+#X connect 20 0 2 0;
+#X connect 22 1 23 0;
+#X connect 27 1 28 0;
+#X connect 27 1 29 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..d8a26a75
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/cv/#numop-help.pd
@@ -0,0 +1,60 @@
+#N canvas 683 36 568 668 10;
+#X obj 22 114 #print;
+#X msg 22 69 2 2 # 0 1 2 3;
+#X obj 22 92 cv/#Add (2 2 # 0 1 2 3);
+#X obj 22 189 #print;
+#X msg 22 144 2 2 # 0 1 2 3;
+#X obj 267 114 #print;
+#X msg 267 69 2 2 # 0 1 2 3;
+#X obj 267 191 #print;
+#X obj 22 167 cv/#Sub (2 2 # 0 1 2 3);
+#X obj 267 92 cv/#Mul (2 2 # 0 1 2 3);
+#X obj 267 169 cv/#Div (2 2 # 0 1 2 3);
+#X msg 396 146 2 2 # 0 1 42 666;
+#X msg 396 69 2 2 # 0 1 42 666;
+#X msg 151 144 2 2 # 0 1 42 666;
+#X msg 151 69 2 2 # 0 1 42 666;
+#X obj 0 0 doc_h cv/;
+#X msg 267 146 2 2 # 0 1 2 -3000;
+#X text 424 167 rounds towards zero;
+#X obj 3 412 doc_c 1;
+#X obj 14 442 doc_cc 0;
+#X obj 3 472 doc_i 2;
+#X obj 14 502 doc_ii 0;
+#X obj 14 522 doc_ii 1;
+#X obj 3 552 doc_o 1;
+#X obj 14 582 doc_oo 0;
+#X obj 0 612 doc_f;
+#X obj 22 261 #print;
+#X msg 22 213 2 2 # 0 1 2 3;
+#X msg 151 213 2 2 # 0 1 42 666;
+#X obj 22 237 cv/#And (2 2 # 0 1 2 3);
+#X obj 267 261 #print;
+#X msg 267 213 2 2 # 0 1 2 3;
+#X msg 396 213 2 2 # 0 1 42 666;
+#X obj 267 333 #print;
+#X msg 267 285 2 2 # 0 1 2 3;
+#X msg 396 285 2 2 # 0 1 42 666;
+#X obj 267 237 cv/#Or (2 2 # 0 1 2 3);
+#X obj 267 309 cv/#Xor (2 2 # 0 1 2 3);
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 4 0 8 0;
+#X connect 6 0 9 0;
+#X connect 8 0 3 0;
+#X connect 9 0 5 0;
+#X connect 10 0 7 0;
+#X connect 11 0 10 1;
+#X connect 12 0 9 1;
+#X connect 13 0 8 1;
+#X connect 14 0 2 1;
+#X connect 16 0 10 0;
+#X connect 27 0 29 0;
+#X connect 28 0 29 1;
+#X connect 29 0 26 0;
+#X connect 31 0 36 0;
+#X connect 32 0 36 1;
+#X connect 34 0 37 0;
+#X connect 35 0 37 1;
+#X connect 36 0 30 0;
+#X connect 37 0 33 0;
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..9ed72fec
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/display-help.pd
@@ -0,0 +1,24 @@
+#N canvas 674 0 632 415 10;
+#X obj 90 185 display;
+#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 obj 0 0 doc_h;
+#X obj 3 211 doc_c 0;
+#X obj 3 251 doc_i 1;
+#X obj 3 326 doc_o 0;
+#X obj 14 281 doc_ii 0;
+#X obj 3 366 doc_also;
+#X obj 103 366 print;
+#X obj 145 366 #print;
+#X obj 0 386 doc_f;
+#X obj 97 281 doc_m i0 <any>;
+#X text 294 142 GUI object equivalent to [print] and [#print].;
+#X text 232 281 Displays the received message in the box \, resizing
+the box so that the message fits exactly.;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 9 1 10 0;
+#X connect 9 1 11 0;
+#X connect 13 1 15 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_add-help.pd b/externals/gridflow/doc/flow_classes/doc_add-help.pd
new file mode 100644
index 00000000..d80f048a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_add-help.pd
@@ -0,0 +1,23 @@
+#N canvas 283 161 632 333 10;
+#X obj 0 0 doc_h;
+#X obj 0 304 doc_f;
+#X obj 108 45 doc_add;
+#X obj 3 154 doc_i 2;
+#X obj 3 264 doc_o 0;
+#X obj 14 184 doc_ii 0;
+#X obj 14 219 doc_ii 1;
+#X obj 97 219 doc_m i1 float;
+#X obj 97 184 doc_m i0 bang;
+#X obj 3 92 doc_c 1;
+#X obj 14 122 doc_cc 0;
+#X obj 97 122 doc_m c0 symbol;
+#X text 195 37 add one [doc_m] to a given subsection.;
+#X text 194 57 for use by [doc_c] [doc_i] [doc_o] only.;
+#X text 232 184 add one [doc_m] with a blank \$2 (will show up as "~unspecified~")
+;
+#X text 232 219 y position of top of the parent (as given by outlet
+1 of [doc_layout]);
+#X text 232 122 subsection id \, such as "c0" \, "i3" or "oany".;
+#X connect 7 1 15 0;
+#X connect 8 1 14 0;
+#X connect 11 1 16 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_also-help.pd b/externals/gridflow/doc/flow_classes/doc_also-help.pd
new file mode 100644
index 00000000..c88d7e85
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_also-help.pd
@@ -0,0 +1,18 @@
+#N canvas 383 90 632 297 10;
+#X obj 0 0 doc_h;
+#X obj 0 268 doc_f;
+#X obj 3 84 doc_c 0;
+#X obj 3 124 doc_i 0;
+#X text 173 46 an auto-positioning documentation footer.;
+#X obj 3 164 doc_o 2;
+#X obj 14 194 doc_oo 0;
+#X obj 14 216 doc_oo 1;
+#X obj 97 194 doc_m o0 <none>;
+#X obj 97 216 doc_m o1 <evil>;
+#X text 232 194 this outlet is unused;
+#X text 232 216 this outlet is reserved for evil purposes;
+#X obj 3 248 doc_also;
+#X text 103 248 [doc_f];
+#X connect 8 1 10 0;
+#X connect 9 1 11 0;
+#X connect 12 1 13 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_below-help.pd b/externals/gridflow/doc/flow_classes/doc_below-help.pd
new file mode 100644
index 00000000..b4ac21cb
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_below-help.pd
@@ -0,0 +1,40 @@
+#N canvas 335 118 632 420 10;
+#X obj 0 0 doc_h;
+#X obj 0 391 doc_f;
+#X obj 102 50 doc_below;
+#X obj 3 95 doc_c 3;
+#X obj 3 223 doc_i 3;
+#X obj 3 329 doc_o 1;
+#X obj 14 359 doc_oo 0;
+#X obj 14 253 doc_ii 0;
+#X obj 14 275 doc_ii 1;
+#X obj 14 297 doc_ii 2;
+#X obj 14 125 doc_cc 0;
+#X obj 14 147 doc_cc 1;
+#X obj 14 191 doc_cc 2;
+#X obj 97 297 doc_m i2;
+#X obj 97 253 doc_m i0 list;
+#X obj 97 359 doc_m o0 list;
+#X obj 97 125 doc_m c0 symbol;
+#X obj 97 275 doc_m i1 symbol;
+#X text 232 275 same as arg 0;
+#X text 232 297 same as arg 1;
+#X obj 97 191 doc_m c2 float;
+#X obj 97 147 doc_m c1 float;
+#X text 232 147 0: just this node;
+#X text 232 169 1: recursively;
+#X text 218 41 this is to appear directly in the body of an element
+that appears in a help patch (there should be no subpatches involved
+in this case \, because of the uplevels);
+#X text 232 125 relative name such as c/0 or o/any/float;
+#X text 232 191 extra padding in pixels;
+#X text 232 253 (x y) to transform;
+#X text 232 359 (x y) \, usually the same as what came in.;
+#X connect 13 1 19 0;
+#X connect 14 1 27 0;
+#X connect 15 1 28 0;
+#X connect 16 1 25 0;
+#X connect 17 1 18 0;
+#X connect 20 1 26 0;
+#X connect 21 1 22 0;
+#X connect 21 1 23 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_bottom-help.pd b/externals/gridflow/doc/flow_classes/doc_bottom-help.pd
new file mode 100644
index 00000000..b17f8b4a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_bottom-help.pd
@@ -0,0 +1,27 @@
+#N canvas 335 118 632 372 10;
+#X obj 0 0 doc_h;
+#X obj 0 343 doc_f;
+#X obj 114 54 doc_bottom;
+#X obj 3 162 doc_i 2;
+#X obj 3 281 doc_o 1;
+#X obj 14 311 doc_oo 0;
+#X obj 14 192 doc_ii 0;
+#X obj 14 236 doc_ii 1;
+#X obj 97 311 doc_m o0 float;
+#X text 232 311 y position;
+#X obj 97 236 doc_m i1 symbol;
+#X obj 97 192 doc_m i0 float;
+#X obj 97 214 doc_m i0 before;
+#X text 232 192 y position;
+#X obj 3 100 doc_c 1;
+#X obj 14 130 doc_cc 0;
+#X obj 97 130 doc_m c0 float;
+#X text 232 130 0 or 1 whether to use the "before" directive.;
+#X text 232 214 used for sorting by name (id);
+#X text 232 236 node whose direct children should be queried (specified
+without the \$0);
+#X connect 8 1 9 0;
+#X connect 10 1 19 0;
+#X connect 11 1 13 0;
+#X connect 12 1 18 0;
+#X connect 16 1 17 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_c-help.pd b/externals/gridflow/doc/flow_classes/doc_c-help.pd
new file mode 100644
index 00000000..2362e2e8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_c-help.pd
@@ -0,0 +1,17 @@
+#N canvas 335 118 632 258 10;
+#X obj 0 0 doc_h;
+#X obj 0 229 doc_f;
+#X text 146 38 an auto-positioning documentation header;
+#X obj 3 67 doc_c 1;
+#X obj 3 129 doc_i 0;
+#X obj 3 169 doc_o 0;
+#X obj 14 97 doc_cc 0;
+#X obj 97 97 doc_m c0 float;
+#X text 232 97 number of creation arguments in the class being documented.
+;
+#X obj 3 209 doc_also;
+#X text 103 209 [doc_i];
+#X text 157 209 [doc_o];
+#X connect 7 1 8 0;
+#X connect 9 1 10 0;
+#X connect 9 1 11 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_cc-help.pd b/externals/gridflow/doc/flow_classes/doc_cc-help.pd
new file mode 100644
index 00000000..041cf718
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_cc-help.pd
@@ -0,0 +1,15 @@
+#N canvas 335 118 632 242 10;
+#X obj 0 0 doc_h;
+#X obj 3 73 doc_c;
+#X obj 3 113 doc_i;
+#X obj 3 153 doc_o;
+#X obj 0 213 doc_f;
+#X text 144 35 auto-positioning documentation subheader for a specific
+creation argument.;
+#X obj 3 193 doc_also;
+#X text 103 193 [doc_c];
+#X text 157 193 [doc_ii];
+#X text 217 193 [doc_oo];
+#X connect 6 1 7 0;
+#X connect 6 1 8 0;
+#X connect 6 1 9 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_editmode-help.pd b/externals/gridflow/doc/flow_classes/doc_editmode-help.pd
new file mode 100644
index 00000000..3c69aa5d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_editmode-help.pd
@@ -0,0 +1,16 @@
+#N canvas 451 192 632 304 10;
+#X obj 0 0 doc_h;
+#X obj 0 275 doc_f;
+#X obj 103 51 doc_editmode;
+#X obj 3 113 doc_c 0;
+#X obj 3 153 doc_i 2;
+#X obj 3 235 doc_o 0;
+#X obj 14 183 doc_ii 0;
+#X obj 14 203 doc_ii 1;
+#X obj 97 183 doc_m i0 float;
+#X obj 97 203 doc_m i1 float;
+#X text 200 182 x position of the button to manage;
+#X text 232 203 1: also manage the rectangle;
+#X text 226 50 used for handling the changes that happen when switching
+from and to edit mode in GridFlow's documentation.;
+#X connect 9 1 11 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_exist-help.pd b/externals/gridflow/doc/flow_classes/doc_exist-help.pd
new file mode 100644
index 00000000..aaf53a39
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_exist-help.pd
@@ -0,0 +1,26 @@
+#N canvas 215 276 632 354 10;
+#X obj 0 0 doc_h;
+#X obj 0 325 doc_f;
+#X obj 116 44 doc_exist;
+#X obj 3 82 doc_c 1;
+#X obj 3 157 doc_i 2;
+#X obj 3 241 doc_o 1;
+#X obj 14 271 doc_oo 0;
+#X obj 14 187 doc_ii 0;
+#X obj 14 209 doc_ii 1;
+#X obj 14 112 doc_cc 0;
+#X obj 97 112 doc_m c0 symbol;
+#X text 232 112 relative name of object to be checked for. the \$0
+of the parent will be automatically added (with a slash).;
+#X obj 97 187 doc_m i0 bang;
+#X obj 97 209 doc_m i1 symbol;
+#X text 232 209 same as arg 0;
+#X obj 97 271 doc_m o0 float;
+#X text 232 187 perform a check and output the result;
+#X text 232 271 0: not found;
+#X text 232 293 1: found;
+#X connect 10 1 11 0;
+#X connect 12 1 16 0;
+#X connect 13 1 14 0;
+#X connect 15 1 17 0;
+#X connect 15 1 18 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_f-help.pd b/externals/gridflow/doc/flow_classes/doc_f-help.pd
new file mode 100644
index 00000000..3c210670
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_f-help.pd
@@ -0,0 +1,7 @@
+#N canvas 335 118 632 227 10;
+#X obj 0 0 doc_h;
+#X obj 0 198 doc_f;
+#X obj 3 78 doc_c 0;
+#X obj 3 118 doc_i 0;
+#X obj 3 158 doc_o 0;
+#X text 173 46 an auto-positioning documentation footer.;
diff --git a/externals/gridflow/doc/flow_classes/doc_h-help.pd b/externals/gridflow/doc/flow_classes/doc_h-help.pd
new file mode 100644
index 00000000..00b71c86
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_h-help.pd
@@ -0,0 +1,13 @@
+#N canvas 409 226 632 269 10;
+#X obj 0 0 doc_h;
+#X obj 0 240 doc_f;
+#X text 126 40 an auto-positioning documentation header;
+#X obj 3 160 doc_i 0;
+#X obj 3 200 doc_o 0;
+#X obj 3 72 doc_c 1;
+#X obj 14 102 doc_cc 0;
+#X obj 97 102 doc_m c0 symbol;
+#X text 232 102 namespace prefix (can't be figured out automatically
+for now). must include trailing slash. hopefully this is a temporary
+measure.;
+#X connect 7 1 8 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_i-help.pd b/externals/gridflow/doc/flow_classes/doc_i-help.pd
new file mode 100644
index 00000000..ba2cbbcb
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_i-help.pd
@@ -0,0 +1,10 @@
+#N canvas 454 262 632 251 10;
+#X obj 0 0 doc_h;
+#X obj 0 222 doc_f;
+#X obj 3 80 doc_c 1;
+#X obj 3 142 doc_i 0;
+#X obj 3 182 doc_o 0;
+#X obj 14 110 doc_cc 0;
+#X obj 97 110 doc_m c0 float;
+#X text 232 110 number of inlets in the class being documented;
+#X connect 6 1 7 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_ii-help.pd b/externals/gridflow/doc/flow_classes/doc_ii-help.pd
new file mode 100644
index 00000000..9858cce7
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_ii-help.pd
@@ -0,0 +1,15 @@
+#N canvas 335 118 632 260 10;
+#X obj 0 0 doc_h;
+#X obj 3 91 doc_c;
+#X obj 3 131 doc_i;
+#X obj 3 171 doc_o;
+#X obj 0 231 doc_f;
+#X text 132 41 auto-positioning documentation subheader for a specific
+inlet.;
+#X text 103 211 doc_i;
+#X text 145 211 doc_cc;
+#X text 193 211 doc_oo;
+#X obj 3 211 doc_also;
+#X connect 9 1 6 0;
+#X connect 9 1 7 0;
+#X connect 9 1 8 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_layout-help.pd b/externals/gridflow/doc/flow_classes/doc_layout-help.pd
new file mode 100644
index 00000000..6ddf5154
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_layout-help.pd
@@ -0,0 +1,46 @@
+#N canvas 335 118 632 473 10;
+#X obj 0 0 doc_h;
+#X obj 0 444 doc_f;
+#X obj 3 91 doc_c 4;
+#X obj 14 121 doc_cc 0;
+#X obj 14 156 doc_cc 1;
+#X obj 14 178 doc_cc 2;
+#X obj 14 200 doc_cc 3;
+#X obj 97 200 doc_m c3 symbol;
+#X text 232 200 parent;
+#X text 232 178 height;
+#X text 232 156 width;
+#X text 232 121 relative id \, such as c0/hello \, to which the parent's
+\$0 will be automatically prefixed (with an extra slash);
+#X obj 3 232 doc_i 2;
+#X obj 3 360 doc_o 2;
+#X obj 14 390 doc_oo 0;
+#X obj 14 412 doc_oo 1;
+#X obj 97 390 doc_m o0 <none>;
+#X text 232 412 current (x y) position of the object;
+#X obj 97 412 doc_m o1 list;
+#X obj 97 328 doc_m i1 list;
+#X text 232 328 new (x y) position after processing the output of outlet
+1;
+#X obj 97 284 doc_m i0 name;
+#X obj 97 306 doc_m i0 parent;
+#X obj 97 262 doc_m i0 height;
+#X text 232 262 same as arg 2;
+#X text 232 284 same as arg 0;
+#X text 232 306 same as arg 3;
+#X obj 14 262 doc_ii 0;
+#X obj 14 328 doc_ii 1;
+#X obj 97 156 doc_m c1 float;
+#X obj 97 178 doc_m c2 float;
+#X obj 97 121 doc_m c0 symbol;
+#X text 109 49 used by all [doc_...] abstractions for their own positioning
+;
+#X connect 7 1 8 0;
+#X connect 18 1 17 0;
+#X connect 19 1 20 0;
+#X connect 21 1 25 0;
+#X connect 22 1 26 0;
+#X connect 23 1 24 0;
+#X connect 29 1 10 0;
+#X connect 30 1 9 0;
+#X connect 31 1 11 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_m-help.pd b/externals/gridflow/doc/flow_classes/doc_m-help.pd
new file mode 100644
index 00000000..3a955e48
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_m-help.pd
@@ -0,0 +1,78 @@
+#N canvas 335 0 632 700 10;
+#X obj 0 0 doc_h;
+#X obj 0 1031 doc_f;
+#X obj 3 347 doc_c 2;
+#X obj 3 911 doc_i 0;
+#X obj 3 951 doc_o 2;
+#X obj 14 981 doc_oo 0;
+#X obj 14 1001 doc_oo 1;
+#X obj 14 377 doc_cc 0;
+#X obj 14 425 doc_cc 1;
+#X obj 97 377 doc_m c0 symbol;
+#X obj 97 425 doc_m c1 symbol;
+#X text 232 377 code for associating to a specific [doc_c] \, [doc_i]
+or [doc_o]. for example \, to associate with [doc_c 3] \, the code
+is c3;
+#X text 232 425 in the case of [doc_i] or [doc_o] \, this is either
+a selector or a meta-selector.;
+#X text 232 556 the sorting order of [doc_m] elements in a given subsection
+is alphabetical except for those five at the beginning: bang \, float
+\, grid \, symbol \, pointer \, list. and this one at the very end:
+<any>.;
+#X text 232 617 a list of meta-selectors:;
+#X text 232 639 <any>: represents the anything-method;
+#X text 232 661 <none>: is for writing anything of interest (?) about
+nothing at all. when present \, this is usually the only entry in the
+given subsection \, and it usually just says that the inlet or outlet
+is meant to be useless. typically \, no messages are accepted in the
+inlet \, or else \, all messages are accepted without doing anything
+with them \, or in the case of outlet \, nothing ever comes out of
+it.;
+#X text 232 796 <evil>: is like <none> \, except that the outlet that
+bears it will do weird things to the object it gets connected to. things
+that are very different from sending mere messages.;
+#X text 232 866 <hpgl>: this stands for a pd message version of the
+HPGL protocol.;
+#X text 232 460 in the case of [doc_c] \, we're just faking that this
+is a selector \, but you better only use atom types here: float \,
+grid \, symbol \, pointer \, <atom>.;
+#X text 232 844 <atom>: this stands for float \, grid \, symbol \,
+or pointer.;
+#X obj 97 981 doc_m o0 <none>;
+#X obj 97 1001 doc_m o1 <evil>;
+#X text 232 761 <gone>: is like none \, except the inlet or outlet
+is completely missing.;
+#X text 190 37 style guide for comments:;
+#X text 190 59 do not say "accepts a grid that will do blah blah" \,
+because all methods are accepting messages anyway. but do not say "a
+grid that will do blah blah" \, because "grid" is already specified
+by the [doc_m]. in some sentence structures it will be clearer to say
+"the grid" in some places rather than not.;
+#X text 232 508 a meta-selector is a name written within <> marks.
+those represent special things that aren't really selectors \, as well
+as sets of several selectors (or of many of them).;
+#X text 190 142 say "image that will do blah blah" if an image is expected
+\, but note that not so many objects really require images as inputs.
+;
+#X text 192 186 there is also a difference between hard limitations
+\, and expected interpretations. for example \, if we say "an rgb image"
+and mean it and are right about it \, then only 3-dimensional grids
+will be accepted \, and only those with 3 elements in the last dimension
+will be accepted \, but it is up to us to think of that last dimension
+to represent rgb \, it is up to us to think that this last dimension
+is channels \, and that the other dimensions are rows and columns.
+however \, to ease the reading \, thinks like "(rows columns 3)" and
+"rgb image" will be said even though much of GridFlow itself doesn't
+care about it.;
+#X connect 9 1 11 0;
+#X connect 10 1 12 0;
+#X connect 10 1 26 0;
+#X connect 10 1 13 0;
+#X connect 10 1 14 0;
+#X connect 10 1 15 0;
+#X connect 10 1 16 0;
+#X connect 10 1 17 0;
+#X connect 10 1 18 0;
+#X connect 10 1 19 0;
+#X connect 10 1 20 0;
+#X connect 10 1 23 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_make-help.pd b/externals/gridflow/doc/flow_classes/doc_make-help.pd
new file mode 100644
index 00000000..422e889c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_make-help.pd
@@ -0,0 +1,25 @@
+#N canvas 543 148 632 330 10;
+#X obj 0 0 doc_h;
+#X obj 0 301 doc_f;
+#X obj 93 51 doc_make;
+#X obj 3 177 doc_i 2;
+#X obj 3 261 doc_o 0;
+#X obj 14 207 doc_ii 0;
+#X obj 14 229 doc_ii 1;
+#X obj 14 123 doc_cc 0;
+#X obj 97 123 doc_m c0 symbol id;
+#X text 232 123 something like c0 \, i0 \, o0 \, just like the \$1
+of [doc_m];
+#X obj 97 207 doc_m i0 bang;
+#X obj 97 229 doc_m i1 float;
+#X text 232 207 generate subsections;
+#X obj 3 93 doc_c 2;
+#X obj 14 145 doc_cc 1;
+#X obj 97 145 doc_m c1 float;
+#X text 232 145 how many subsections;
+#X text 232 229 starting position of new subsections;
+#X text 169 51 reserved for use by [doc_c] \, [doc_i] and [doc_o];
+#X connect 8 1 9 0;
+#X connect 10 1 12 0;
+#X connect 11 1 17 0;
+#X connect 15 1 16 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_o-help.pd b/externals/gridflow/doc/flow_classes/doc_o-help.pd
new file mode 100644
index 00000000..4481e7a5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_o-help.pd
@@ -0,0 +1,11 @@
+#N canvas 565 290 632 249 10;
+#X obj 0 0 doc_h;
+#X obj 0 220 doc_f;
+#X text 173 43 an auto-positioning documentation header;
+#X obj 3 78 doc_c 1;
+#X obj 3 140 doc_i 0;
+#X obj 14 108 doc_cc 0;
+#X obj 3 180 doc_o 0;
+#X obj 97 108 doc_m c0 float;
+#X text 232 108 number of outlets in the class being documented;
+#X connect 7 1 8 0;
diff --git a/externals/gridflow/doc/flow_classes/doc_oo-help.pd b/externals/gridflow/doc/flow_classes/doc_oo-help.pd
new file mode 100644
index 00000000..9ad3e905
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/doc_oo-help.pd
@@ -0,0 +1,15 @@
+#N canvas 546 210 632 258 10;
+#X obj 0 0 doc_h;
+#X obj 0 229 doc_f;
+#X text 103 209 doc_ii;
+#X text 151 209 doc_cc;
+#X text 199 209 doc_o;
+#X obj 3 89 doc_c 1;
+#X obj 3 129 doc_i 0;
+#X obj 3 169 doc_o 0;
+#X text 129 45 auto-positioning documentation subheader for a specific
+outlet.;
+#X obj 3 209 doc_also;
+#X connect 9 1 2 0;
+#X connect 9 1 3 0;
+#X connect 9 1 4 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..8868e367
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/for-help.pd
@@ -0,0 +1,56 @@
+#N canvas 480 175 632 542 10;
+#X obj 41 115 print;
+#X obj 41 73 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 40 135 should print 10 23 36 49 62 75 88 101;
+#X obj 41 91 for 10 114 13;
+#X obj 0 0 doc_h;
+#X obj 3 179 doc_c 3;
+#X obj 3 285 doc_i 3;
+#X obj 3 433 doc_o 1;
+#X obj 14 315 doc_ii 0;
+#X obj 14 379 doc_ii 1;
+#X obj 14 401 doc_ii 2;
+#X obj 14 463 doc_oo 0;
+#X obj 14 209 doc_cc 0;
+#X obj 14 231 doc_cc 1;
+#X obj 14 253 doc_cc 2;
+#X obj 0 513 doc_f;
+#X obj 97 463 doc_m o0 float;
+#X obj 97 401 doc_m i2 float;
+#X obj 97 379 doc_m i1 float;
+#X obj 97 335 doc_m i0 float;
+#X obj 97 357 doc_m i0 set;
+#X obj 97 315 doc_m i0 bang;
+#X obj 3 493 doc_also;
+#X obj 103 493 #for 0 0 1;
+#X obj 175 493 until;
+#X obj 97 209 doc_m c0 float;
+#X obj 97 231 doc_m c1 float;
+#X obj 97 253 doc_m c2 float;
+#X text 232 209 from;
+#X text 232 231 to;
+#X text 232 253 step;
+#X text 232 379 same as arg 1;
+#X text 232 401 same as arg 2;
+#X text 232 357 same as arg 0;
+#X text 232 335 same as set \$1 \, bang;
+#X text 41 151 note that 114 should not be included!;
+#X text 192 42 count from a value to another value. the latter value
+is excluded \, such that [for 0 10 1] and for [10 20 1] have no common
+outputs.;
+#X msg 72 68 set 0;
+#X msg 71 42 5;
+#X connect 1 0 3 0;
+#X connect 3 0 0 0;
+#X connect 17 1 32 0;
+#X connect 18 1 31 0;
+#X connect 19 1 34 0;
+#X connect 20 1 33 0;
+#X connect 22 1 23 0;
+#X connect 22 1 24 0;
+#X connect 25 1 28 0;
+#X connect 26 1 29 0;
+#X connect 27 1 30 0;
+#X connect 37 0 3 0;
+#X connect 38 0 3 0;
diff --git a/externals/gridflow/doc/flow_classes/foreach-help.pd b/externals/gridflow/doc/flow_classes/foreach-help.pd
new file mode 100644
index 00000000..a7f5ff02
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/foreach-help.pd
@@ -0,0 +1,19 @@
+#N canvas 635 118 632 307 10;
+#X obj 0 0 doc_h;
+#X obj 31 51 foreach;
+#X obj 3 96 doc_c 0;
+#X obj 3 136 doc_i 1;
+#X obj 14 166 doc_ii 0;
+#X obj 97 166 doc_m i0 list;
+#X obj 3 198 doc_o 1;
+#X obj 14 228 doc_oo 0;
+#X text 232 166 Outputs N messages \, one per list element \, in order.
+;
+#X obj 0 278 doc_f;
+#X obj 97 228 doc_m o0 <atom>;
+#X obj 3 258 doc_also;
+#X obj 103 258 drip 0;
+#X text 183 49 split a message into separate atoms and output them
+all.;
+#X connect 5 1 8 0;
+#X connect 11 1 12 0;
diff --git a/externals/gridflow/doc/flow_classes/fps-help.pd b/externals/gridflow/doc/flow_classes/fps-help.pd
new file mode 100644
index 00000000..55ab816e
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/fps-help.pd
@@ -0,0 +1,71 @@
+#N canvas 648 0 632 642 10;
+#X obj 0 0 doc_h;
+#X obj 27 52 fps;
+#X obj 3 94 doc_c 1;
+#X obj 14 124 doc_cc 0;
+#X obj 97 124 doc_m c0 symbol;
+#X obj 3 178 doc_i 1;
+#X obj 14 208 doc_ii 0;
+#X obj 97 208 doc_m i0 bang;
+#X obj 97 291 doc_m i0 detailed;
+#X obj 97 335 doc_m i0 mode;
+#X obj 97 467 doc_m i0 period;
+#X obj 3 521 doc_o 1;
+#X obj 14 551 doc_oo 0;
+#X obj 97 551 doc_m o0 float;
+#X obj 97 573 doc_m o0 list;
+#X text 232 423 "logical" uses [timer];
+#X text 232 445 "process" uses [cputime];
+#X text 232 401 "cpu" uses [tsctime];
+#X text 232 335 "real" uses [realtime];
+#X text 232 357 "user" uses [usertime];
+#X text 232 379 "system" uses [systemtime];
+#X obj 3 666 doc_also;
+#X obj 103 666 realtime;
+#X obj 163 666 usertime;
+#X obj 223 666 systemtime;
+#X obj 295 666 tsctime;
+#X obj 349 666 timer;
+#X obj 391 666 cputime;
+#X text 232 208 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.;
+#X text 232 489 exceptionally \, anything else gets ignored.;
+#X text 232 551 (terse) this is the messages-per-second rating.;
+#X text 232 573 (detailed) this is: messages-per-second \, followed
+by five values of milliseconds-per-message: minimum \, median \, maximum
+\, average \, standard deviation.;
+#X text 232 621 (the average happens to be simply 1000 divided by the
+messages-per-second \, but it is convenient to have it anyway);
+#X obj 0 686 doc_f;
+#X obj 97 489 doc_m i0 <any>;
+#X text 232 146 "detailed": see outlet 0 list;
+#X text 232 124 "terse": see outlet 0 float;
+#X text 232 313 1: same as arg 0 detailed;
+#X text 232 291 0: same as arg 0 terse;
+#X text 232 467 minimum time between updates;
+#X text 185 52 measures frames per second... or bangs per second in
+general;
+#X connect 4 1 36 0;
+#X connect 4 1 35 0;
+#X connect 7 1 28 0;
+#X connect 8 1 37 0;
+#X connect 8 1 38 0;
+#X connect 9 1 18 0;
+#X connect 9 1 19 0;
+#X connect 9 1 20 0;
+#X connect 9 1 17 0;
+#X connect 9 1 15 0;
+#X connect 9 1 16 0;
+#X connect 10 1 39 0;
+#X connect 13 1 30 0;
+#X connect 14 1 32 0;
+#X connect 14 1 31 0;
+#X connect 21 1 22 0;
+#X connect 21 1 23 0;
+#X connect 21 1 24 0;
+#X connect 21 1 25 0;
+#X connect 21 1 26 0;
+#X connect 21 1 27 0;
+#X connect 34 1 29 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..f207434d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/gf.oneshot-help.pd
@@ -0,0 +1,42 @@
+#N canvas 680 22 632 504 10;
+#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 msg 195 125 1;
+#X obj 171 125 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X msg 127 88 test;
+#X obj 127 199 print;
+#X floatatom 168 90 5 0 0 0 - - -;
+#X floatatom 171 200 5 0 0 0 - - -;
+#X text 232 125 <-- both will reset the object;
+#X text 232 441 Outputs incoming message.;
+#X text 232 366 Resets the object so that the next mesage will be passed
+through.;
+#X obj 127 159 gf.oneshot;
+#X obj 3 301 doc_i 2;
+#X obj 0 0 doc_h;
+#X obj 14 366 doc_ii 1;
+#X obj 14 441 doc_oo 0;
+#X obj 3 411 doc_o 1;
+#X obj 14 331 doc_ii 0;
+#X obj 3 239 doc_c 1;
+#X obj 14 269 doc_cc 0;
+#X text 232 269 Whether to start open (default: 1);
+#X text 232 331 Incoming messages can be Grids \, Symbols \, Integers
+\, Lists \, etc.;
+#X obj 0 473 doc_f;
+#X obj 97 269 doc_m c0 bool;
+#X obj 97 366 doc_m i1 bang;
+#X obj 97 441 doc_m o0 <any>;
+#X obj 97 331 doc_m i0 <any>;
+#X connect 1 0 10 1;
+#X connect 2 0 10 1;
+#X connect 3 0 10 0;
+#X connect 5 0 10 0;
+#X connect 10 0 4 0;
+#X connect 10 0 6 0;
+#X connect 22 1 19 0;
+#X connect 23 1 9 0;
+#X connect 24 1 8 0;
+#X connect 25 1 20 0;
diff --git a/externals/gridflow/doc/flow_classes/hpgl_find_bbox-help.pd b/externals/gridflow/doc/flow_classes/hpgl_find_bbox-help.pd
new file mode 100644
index 00000000..758f6560
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/hpgl_find_bbox-help.pd
@@ -0,0 +1,21 @@
+#N canvas 335 118 632 322 10;
+#X obj 0 293 doc_f;
+#X obj 0 0 doc_h;
+#X obj 94 48 hpgl_find_bbox;
+#X obj 3 81 doc_c 0;
+#X obj 3 121 doc_i 2;
+#X obj 3 231 doc_o 1;
+#X obj 14 151 doc_ii 0;
+#X obj 14 173 doc_ii 1;
+#X obj 14 261 doc_oo 0;
+#X obj 97 151 doc_m i0 <hpgl>;
+#X obj 97 173 doc_m i1 bang;
+#X obj 97 261 doc_m o0 grid;
+#X text 232 261 (2 2)-grid representing bounding box.;
+#X text 232 151 HPGL stream to find the bounding box of.;
+#X text 232 173 outputs the bounding box of all coordinates used so
+far in PA \, PD \, PU commands. if no such coordinates have been used
+so far \, it will output funny nonsense values instead.;
+#X connect 9 1 13 0;
+#X connect 10 1 14 0;
+#X connect 11 1 12 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..2764f4a5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/hpgl_font_render-help.pd
@@ -0,0 +1,178 @@
+#N canvas 604 0 632 642 10;
+#X obj 215 53 until;
+#X obj 215 36 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 148 36 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1
+;
+#X msg 222 77 rewind;
+#X obj 312 171 print bogus;
+#X obj 112 317 loadbang;
+#X obj 220 171 print command;
+#X obj 132 256 #store;
+#X obj 303 195 loadbang;
+#X obj 220 152 spigot;
+#X obj 266 153 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 33 503 fps;
+#X obj 306 38 bng 15 250 50 0 empty empty empty 17 7 0 10 -258699 -1
+-1;
+#X obj 148 53 metro 1;
+#X obj 224 382 #pack;
+#X obj 254 366 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 0 256;
+#X obj 224 350 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 0 256;
+#X obj 280 382 #pack;
+#X obj 310 366 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 750 256;
+#X obj 280 350 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 1000 256;
+#X obj 109 283 gf.oneshot;
+#X obj 132 200 t b b;
+#X obj 33 522 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-225271 -1 -1 0 256;
+#X obj 33 192 gf.oneshot;
+#X obj 63 156 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 63 173 t b b;
+#X obj 98 364 #draw_hpgl;
+#X obj 33 484 #out window;
+#X obj 130 157 f;
+#X obj 155 157 + 1;
+#X obj 130 176 sel;
+#X text 362 35 TODO: look for bug in [#in grid] code...;
+#X obj 215 131 plotter_parser;
+#X obj 312 152 spigot;
+#X obj 358 153 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 128 440 # >> 4;
+#X msg 112 336 3 # 255 255 255;
+#X msg 303 214 480 640 3 #;
+#X obj 63 463 #gamma;
+#X obj 109 465 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 350 256;
+#X obj 128 402 #convolve (3 3 # 0 1 0 1 12 1);
+#X obj 128 421 # + 7;
+#X obj 98 440 t a;
+#X obj 137 384 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 143 229 t a a;
+#X obj 33 444 shunt;
+#X obj 72 445 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 98 383 shunt;
+#X obj 221 287 hpgl_find_bbox;
+#X obj 311 288 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 221 306 #to_list;
+#X msg 221 325 PU \$1 \$2 \, PD \$3 \$2 \$3 \$4 \$1 \$4 \$1 \$2;
+#X obj 215 99 #in grid lots_of_text.hpgl \, headerless \, type b;
+#X obj 148 72 t b b b b;
+#X obj 215 252 hpgl_font_render images/hershey \, spacing 10 \, scaling
+0.12 \, rowheight 54 \, wrap 666;
+#X obj 155 176 % 16;
+#X obj 0 0 doc_h;
+#X obj 3 555 doc_c 1;
+#X obj 3 617 doc_i 2;
+#X obj 3 701 doc_o 1;
+#X obj 14 731 doc_oo 0;
+#X obj 14 647 doc_ii 0;
+#X obj 14 669 doc_ii 1;
+#X obj 14 585 doc_cc 0;
+#X obj 0 763 doc_f;
+#N canvas 0 0 450 300 tests 0;
+#X obj 15 242 outlet;
+#X msg 53 31 PU 0 10 \, PD 1000 10;
+#X msg 64 68 PU 0 0 \, print_from_ascii 116 114 97 98 111 117 108 105
+100 111 110;
+#X msg 77 123 PU 50 550 \, print_from_ascii 97 13 10 108 13 10 108
+13 10 244;
+#X msg 87 179 PU 0 0 \, LB world;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X restore 241 209 pd tests;
+#X obj 97 585 doc_m c0 symbol;
+#X text 232 585 font folder;
+#X obj 97 647 doc_m i0 <hpgl>;
+#X obj 97 731 doc_m o0 <hpgl>;
+#X text 232 647 containing LB or print_from_ascii commands;
+#X text 232 731 NOT containing LB or print_from_ascii commands anymore
+;
+#X obj 97 669 doc_m i1 symbol;
+#X text 232 669 same as arg 0;
+#X connect 0 0 52 0;
+#X connect 1 0 0 0;
+#X connect 2 0 13 0;
+#X connect 3 0 52 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 53 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 45 0;
+#X connect 24 0 25 0;
+#X connect 25 0 7 0;
+#X connect 25 1 23 1;
+#X connect 26 0 47 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 55 0;
+#X connect 30 0 24 0;
+#X connect 32 0 9 0;
+#X connect 32 0 54 0;
+#X connect 32 1 33 0;
+#X connect 33 0 4 0;
+#X connect 34 0 33 1;
+#X connect 35 0 42 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 41 0;
+#X connect 41 0 35 0;
+#X connect 42 0 44 0;
+#X connect 43 0 47 1;
+#X connect 44 0 23 0;
+#X connect 44 1 7 1;
+#X connect 45 0 27 0;
+#X connect 45 1 38 0;
+#X connect 46 0 45 1;
+#X connect 47 0 42 0;
+#X connect 47 1 40 0;
+#X connect 48 0 50 0;
+#X connect 49 0 48 1;
+#X connect 50 0 51 0;
+#X connect 52 0 32 0;
+#X connect 52 1 0 1;
+#X connect 52 1 2 0;
+#X connect 52 1 24 0;
+#X connect 53 0 52 0;
+#X connect 53 1 52 0;
+#X connect 53 2 52 0;
+#X connect 53 3 52 0;
+#X connect 54 0 26 2;
+#X connect 54 0 48 0;
+#X connect 55 0 28 1;
+#X connect 65 0 54 0;
+#X connect 66 1 67 0;
+#X connect 68 1 70 0;
+#X connect 69 1 71 0;
+#X connect 72 1 73 0;
diff --git a/externals/gridflow/doc/flow_classes/hpgl_op-help.pd b/externals/gridflow/doc/flow_classes/hpgl_op-help.pd
new file mode 100644
index 00000000..0ed87a04
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/hpgl_op-help.pd
@@ -0,0 +1,30 @@
+#N canvas 679 174 632 352 10;
+#X obj 0 0 doc_h;
+#X obj 0 323 doc_f;
+#X obj 93 42 hpgl_op;
+#X text 208 40 applies the same numop on all PA \, PD \, PU commands
+of the incoming HPGL stream;
+#X obj 3 80 doc_c 2;
+#X obj 3 164 doc_i 2;
+#X obj 3 248 doc_o 1;
+#X obj 14 110 doc_cc 0;
+#X obj 14 132 doc_cc 1;
+#X obj 14 194 doc_ii 0;
+#X obj 14 216 doc_ii 1;
+#X obj 14 278 doc_oo 0;
+#X obj 97 110 doc_m c0 symbol/numop;
+#X obj 97 132 doc_m c1 grid;
+#X obj 97 194 doc_m i0 <hpgl>;
+#X obj 97 278 doc_m o0 <hpgl>;
+#X obj 97 216 doc_m i1 grid;
+#X text 232 194 incoming HPGL commands;
+#X text 232 278 outgoing HPGL commands: same as incoming except coordinates
+of PA \, PU \, PD will have been changed.;
+#X text 232 216 same as argument 1;
+#X text 232 132 same as argument 1 of [#];
+#X text 232 110 same as argument 0 of [#];
+#X connect 12 1 21 0;
+#X connect 13 1 20 0;
+#X connect 14 1 17 0;
+#X connect 15 1 18 0;
+#X connect 16 1 19 0;
diff --git a/externals/gridflow/doc/flow_classes/hpgl_track_position-help.pd b/externals/gridflow/doc/flow_classes/hpgl_track_position-help.pd
new file mode 100644
index 00000000..17e987c6
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/hpgl_track_position-help.pd
@@ -0,0 +1,21 @@
+#N canvas 335 118 632 310 10;
+#X obj 0 281 doc_f;
+#X obj 0 0 doc_h;
+#X obj 43 52 hpgl_track_position;
+#X obj 3 133 doc_i 2;
+#X obj 3 217 doc_o 1;
+#X text 188 47 looks at PA \, PD \, PU in a HPGL stream to figure out
+what's the current position.;
+#X obj 3 93 doc_c 0;
+#X obj 14 163 doc_ii 0;
+#X obj 14 185 doc_ii 1;
+#X obj 14 247 doc_oo 0;
+#X obj 97 163 doc_m i0 <hpgl>;
+#X obj 97 185 doc_m i1 bang;
+#X obj 97 249 doc_m o0 grid;
+#X text 232 249 last position in the last PA \, PD or PU.;
+#X text 232 185 causes the last position to be output.;
+#X text 232 163 a HPGL stream.;
+#X connect 10 1 15 0;
+#X connect 11 1 14 0;
+#X connect 12 1 13 0;
diff --git a/externals/gridflow/doc/flow_classes/interval_overlap-help.pd b/externals/gridflow/doc/flow_classes/interval_overlap-help.pd
new file mode 100644
index 00000000..8956e701
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/interval_overlap-help.pd
@@ -0,0 +1,46 @@
+#N canvas 335 118 632 455 10;
+#X obj 0 0 doc_h;
+#X obj 0 426 doc_f;
+#X obj 77 49 interval_overlap;
+#X text 236 45 check whether two 1-D intervals overlap;
+#X obj 3 86 doc_c 4;
+#X obj 3 214 doc_i 4;
+#X obj 3 342 doc_o 1;
+#X obj 14 116 doc_cc 0;
+#X obj 14 138 doc_cc 1;
+#X obj 14 160 doc_cc 2;
+#X obj 14 182 doc_cc 3;
+#X obj 14 244 doc_ii 0;
+#X obj 14 266 doc_ii 1;
+#X obj 14 288 doc_ii 2;
+#X obj 14 310 doc_ii 3;
+#X obj 14 372 doc_oo 0;
+#X obj 97 116 doc_m c0 float;
+#X obj 97 138 doc_m c1 float;
+#X obj 97 160 doc_m c2 float;
+#X obj 97 182 doc_m c3 float;
+#X obj 97 244 doc_m i0 float;
+#X obj 97 266 doc_m i1 float;
+#X obj 97 288 doc_m i2 float;
+#X obj 97 310 doc_m i3 float;
+#X obj 97 372 doc_m o0 float;
+#X text 232 372 1: they overlap;
+#X text 232 394 0: they don't;
+#X text 232 116 start1;
+#X text 232 138 end1;
+#X text 232 160 start2;
+#X text 232 182 end2;
+#X text 232 244 same as arg 0;
+#X text 232 266 same as arg 1;
+#X text 232 310 same as arg 3;
+#X text 232 288 same as arg 2;
+#X connect 16 1 27 0;
+#X connect 17 1 28 0;
+#X connect 18 1 29 0;
+#X connect 19 1 30 0;
+#X connect 20 1 31 0;
+#X connect 21 1 32 0;
+#X connect 22 1 34 0;
+#X connect 23 1 33 0;
+#X connect 24 1 25 0;
+#X connect 24 1 26 0;
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..c0787d4b
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/inv0x2a-help.pd
@@ -0,0 +1,78 @@
+#N canvas 584 51 632 545 10;
+#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 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 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 188 hsl 128 15 1000 65000 0 0 empty empty empty -2 -6 0
+8 -262144 -1 -1 0 1;
+#X obj 187 496 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 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 147 inv* 10;
+#X obj 103 496 inv+;
+#X obj 139 496 # 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 232 464 Outputs the result of the operation "b/a".;
+#X obj 263 209 # inv* 4000;
+#X text 288 163 inversion;
+#X obj 0 0 doc_h;
+#X obj 34 145 inv*;
+#X obj 3 350 doc_i 2;
+#X obj 3 434 doc_o 1;
+#X obj 3 288 doc_c 1;
+#X obj 3 496 doc_also;
+#X obj 14 380 doc_ii 0;
+#X obj 14 402 doc_ii 1;
+#X obj 14 464 doc_oo 0;
+#X obj 14 318 doc_cc 0;
+#X text 323 91 numerical operator of the Grid object;
+#X obj 97 318 doc_m c0 float;
+#X obj 97 380 doc_m i0 float;
+#X obj 97 402 doc_m i1 float;
+#X obj 97 464 doc_m o0 float;
+#X obj 0 516 doc_f;
+#X text 232 318 number that the left inlet values will be divided by.
+;
+#X msg 219 139 load r001.jpg;
+#X text 232 380 a: divisor;
+#X text 232 402 b: dividend;
+#X text 323 78 Another application: inv* as a;
+#X connect 0 0 42 0;
+#X connect 1 0 4 0;
+#X connect 2 0 4 1;
+#X connect 3 0 6 0;
+#X connect 4 0 7 0;
+#X connect 4 1 23 0;
+#X connect 6 0 0 0;
+#X connect 10 0 23 1;
+#X connect 12 0 26 0;
+#X connect 13 0 26 1;
+#X connect 15 0 18 0;
+#X connect 16 0 18 1;
+#X connect 18 0 17 0;
+#X connect 23 0 7 0;
+#X connect 26 0 14 0;
+#X connect 30 1 19 1;
+#X connect 30 1 20 0;
+#X connect 30 1 11 0;
+#X connect 36 1 41 0;
+#X connect 37 1 43 0;
+#X connect 38 1 44 0;
+#X connect 39 1 22 0;
+#X connect 42 0 1 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..99a05e09
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/inv0x2b-help.pd
@@ -0,0 +1,75 @@
+#N canvas 652 22 632 574 10;
+#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 15 0 255 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 151 525 swap;
+#X obj 154 525 swap;
+#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 obj 103 525 # inv+;
+#X obj 34 146 inv+;
+#X obj 263 211 # inv+ 255;
+#X text 232 493 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 inv+ 10;
+#X obj 3 353 doc_i 2;
+#X obj 0 0 doc_h;
+#X obj 3 525 doc_also;
+#X obj 14 383 doc_ii 0;
+#X obj 14 418 doc_ii 1;
+#X obj 3 463 doc_o 1;
+#X obj 14 493 doc_oo 0;
+#X obj 3 278 doc_c 1;
+#X obj 14 308 doc_cc 0;
+#X obj 97 308 doc_m c0 float;
+#X obj 97 383 doc_m i0 float;
+#X obj 97 418 doc_m i1 float;
+#X obj 97 493 doc_m o0 float;
+#X obj 0 545 doc_f;
+#X text 232 308 number that the left inlet values will be subtracted
+from.;
+#X text 232 383 a: the value to subtract;
+#X text 232 418 b: the value to subtract from;
+#X connect 0 0 7 0;
+#X connect 2 0 5 0;
+#X connect 3 0 5 1;
+#X connect 4 0 8 0;
+#X connect 5 0 9 0;
+#X connect 5 1 21 0;
+#X connect 7 0 2 0;
+#X connect 8 0 0 0;
+#X connect 12 0 21 1;
+#X connect 16 0 20 0;
+#X connect 17 0 20 1;
+#X connect 20 0 18 0;
+#X connect 21 0 9 0;
+#X connect 23 0 26 0;
+#X connect 24 0 26 1;
+#X connect 26 0 25 0;
+#X connect 29 1 19 0;
+#X connect 29 1 13 0;
+#X connect 36 1 41 0;
+#X connect 37 1 42 0;
+#X connect 38 1 43 0;
+#X connect 39 1 22 0;
diff --git a/externals/gridflow/doc/flow_classes/list.==-help.pd b/externals/gridflow/doc/flow_classes/list.==-help.pd
new file mode 100644
index 00000000..6e38a0a9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/list.==-help.pd
@@ -0,0 +1,23 @@
+#N canvas 653 141 632 343 10;
+#X obj 0 0 doc_h;
+#X obj 0 314 doc_f;
+#X obj 84 56 list.==;
+#X text 174 49 compare two lists and tell whether they are exactly
+equal to each other.;
+#X obj 3 110 doc_c any;
+#X obj 14 140 doc_cc any;
+#X obj 97 140 doc_m cany <any>;
+#X obj 3 172 doc_i 2;
+#X obj 3 252 doc_o 1;
+#X obj 14 202 doc_ii 0;
+#X obj 14 222 doc_ii 1;
+#X obj 14 282 doc_oo 0;
+#X obj 97 202 doc_m i0 list;
+#X obj 97 222 doc_m i1 list;
+#X obj 97 282 doc_m o0 float bool;
+#X text 232 282 1 if lists are same \, 0 if they are different.;
+#X text 206 199 compare this list with the stored list;
+#X text 232 140 all arguments together form a list being stored;
+#X text 208 223 same as all arguments together;
+#X connect 6 1 17 0;
+#X connect 14 1 15 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..266738e8
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listappend-help.pd
@@ -0,0 +1,49 @@
+#N canvas 624 22 632 469 10;
+#X obj 103 420 listappend;
+#X obj 175 420 listelement;
+#X obj 253 420 listfind;
+#X obj 313 420 listflatten;
+#X obj 391 420 listprepend;
+#X obj 469 420 listreverse;
+#X obj 547 420 listsublist;
+#X msg 90 110 1 3 hello 8 13;
+#X msg 258 107 1 12 a b c d e f g h i j k l;
+#X obj 91 184 display;
+#X msg 267 128 200 201 202 203 204 205 206;
+#X obj 90 152 listappend 1 2 3 4 5 6 7;
+#X text 11 35 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 obj 0 0 doc_h;
+#X obj 3 274 doc_i 2;
+#X obj 3 358 doc_o 1;
+#X obj 3 212 doc_c n;
+#X obj 3 420 doc_also;
+#X obj 14 304 doc_ii 0;
+#X obj 14 326 doc_ii 1;
+#X obj 14 388 doc_oo 0;
+#X obj 14 242 doc_cc any;
+#X obj 97 304 doc_m i0 list;
+#X obj 97 326 doc_m i1 list;
+#X obj 97 388 doc_m o0 list;
+#X obj 0 440 doc_f;
+#X obj 97 242 doc_m cany <any>;
+#X text 232 242 all arguments together form the list to be appended
+;
+#X text 232 304 a list that the stored list will be appended to.;
+#X text 232 326 same as all args together;
+#X connect 7 0 11 0;
+#X connect 8 0 11 1;
+#X connect 10 0 11 1;
+#X connect 11 0 9 0;
+#X connect 17 1 0 0;
+#X connect 17 1 1 0;
+#X connect 17 1 2 0;
+#X connect 17 1 3 0;
+#X connect 17 1 4 0;
+#X connect 17 1 5 0;
+#X connect 17 1 6 0;
+#X connect 22 1 28 0;
+#X connect 23 1 29 0;
+#X connect 26 1 27 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..e30f98da
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listelement-help.pd
@@ -0,0 +1,39 @@
+#N canvas 604 22 632 523 10;
+#X floatatom 262 160 5 0 0 0 - - -;
+#X floatatom 281 106 5 0 0 0 - - -;
+#X obj 195 158 print;
+#X msg 195 81 1 3 hello 8 13;
+#X obj 195 129 listelement 0;
+#X text 10 32 Outputs one element from a list as selected by an integer.
+;
+#X text 232 238 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 232 387 Changes the value of the argument i.e. changes the
+index into the list to get a different element.;
+#X obj 0 0 doc_h;
+#X obj 3 335 doc_i 2;
+#X obj 3 432 doc_o 1;
+#X obj 14 365 doc_ii 0;
+#X obj 14 387 doc_ii 1;
+#X obj 14 462 doc_oo 0;
+#X obj 3 208 doc_c 1;
+#X obj 14 238 doc_cc 0;
+#X obj 97 238 doc_m c0 float/int;
+#X obj 97 365 doc_m i0 list;
+#X obj 97 387 doc_m i1 float/int;
+#X text 232 462 The element selected by the index is sent to the outlet
+;
+#X obj 0 494 doc_f;
+#X text 232 365 a list of numbers or symbols.;
+#X obj 97 462 doc_m o0 >any>;
+#X connect 1 0 4 1;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 4 0 2 0;
+#X connect 16 1 6 0;
+#X connect 17 1 21 0;
+#X connect 18 1 7 0;
+#X connect 22 1 19 0;
diff --git a/externals/gridflow/doc/flow_classes/listfind-help.pd b/externals/gridflow/doc/flow_classes/listfind-help.pd
new file mode 100644
index 00000000..de83d33c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listfind-help.pd
@@ -0,0 +1,32 @@
+#N canvas 527 144 632 394 10;
+#X obj 0 0 doc_h;
+#X obj 0 365 doc_f;
+#X obj 44 66 listfind 2 3 5 7 11 13;
+#X floatatom 44 48 5 0 0 0 - - -;
+#X floatatom 44 85 5 0 0 0 - - -;
+#X text 214 54 find the position of an element (float or symbol) in
+a list \, or -1 if it is not found. in case of duplicate elements \,
+it only tells the position of the first occurrence.;
+#X obj 3 113 doc_c any;
+#X obj 14 143 doc_cc any;
+#X obj 97 143 doc_m cany <any>;
+#X obj 3 173 doc_i 1;
+#X obj 14 203 doc_ii 0;
+#X obj 97 203 doc_m i0 float;
+#X obj 97 238 doc_m i0 symbol;
+#X text 232 238 look for a symbol.;
+#X text 232 203 look for a float. this has the same gotchas as using
+[==] and [sel] \, about the precision of numbers.;
+#X obj 3 270 doc_o 1;
+#X obj 14 300 doc_oo 0;
+#X obj 97 300 doc_m o0 float int;
+#X text 232 300 nonnegative list index of first occurrence \, or -1
+if not found.;
+#X obj 3 345 doc_also;
+#X obj 103 345 listread;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 11 1 14 0;
+#X connect 12 1 13 0;
+#X connect 17 1 18 0;
+#X connect 19 1 20 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..6f253a92
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listflatten-help.pd
@@ -0,0 +1,39 @@
+#N canvas 630 27 632 433 10;
+#X obj 103 384 listappend;
+#X obj 253 384 listelement;
+#X obj 409 384 listfind;
+#X obj 547 384 listflatten;
+#X obj 175 384 listprepend;
+#X obj 331 384 listreverse;
+#X obj 469 384 listsublist;
+#X obj 225 153 display;
+#X obj 224 120 listflatten;
+#X msg 209 84 1 (2 (3 4 5) 6 7) 8;
+#X obj 210 187 display;
+#X obj 0 0 doc_h;
+#X obj 3 260 doc_i 1;
+#X obj 3 322 doc_o 1;
+#X obj 3 220 doc_c 0;
+#X obj 3 384 doc_also;
+#X obj 14 290 doc_ii 0;
+#X obj 14 352 doc_oo 0;
+#X obj 97 290 doc_m i0 list;
+#X obj 97 352 doc_m o0 list;
+#X obj 0 404 doc_f;
+#X text 232 290 a (usually) nested list.;
+#X text 232 352 Outputs the flattened (not nested) list.;
+#X text 7 30 Takes nested lists and places their contents into a single
+list in the same order. this is just like removing all parentheses
+from the literal and doing nothing else.;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 9 0 10 0;
+#X connect 15 1 0 0;
+#X connect 15 1 4 0;
+#X connect 15 1 1 0;
+#X connect 15 1 5 0;
+#X connect 15 1 2 0;
+#X connect 15 1 6 0;
+#X connect 15 1 3 0;
+#X connect 18 1 21 0;
+#X connect 19 1 22 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..32e2512a
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listlength-help.pd
@@ -0,0 +1,41 @@
+#N canvas 637 22 632 432 10;
+#X text 10 33 The [listlength] outputs the number of elements in the
+incoming list.;
+#X obj 103 383 listappend;
+#X obj 253 383 listelement;
+#X obj 409 383 listfind;
+#X obj 547 383 listflatten;
+#X obj 175 383 listprepend;
+#X obj 331 383 listreverse;
+#X obj 469 383 listsublist;
+#X floatatom 206 160 5 0 0 0 - - -;
+#X obj 139 158 print;
+#X msg 139 81 1 3 hello 8 13;
+#X obj 139 120 listlength;
+#X msg 246 96 1 12 a b c d e f g h i j k l;
+#X text 232 276 The length of the list passed to the left inlet will
+be returned in the outlet.;
+#X obj 0 0 doc_h;
+#X obj 3 206 doc_c 0;
+#X obj 3 246 doc_i 1;
+#X obj 3 321 doc_o 1;
+#X obj 3 383 doc_also 1;
+#X obj 14 276 doc_ii 0;
+#X obj 14 351 doc_oo 0;
+#X obj 97 276 doc_m i0 list;
+#X obj 97 351 doc_m o0 float int;
+#X obj 0 403 doc_f;
+#X text 232 351 the number of elements in the list.;
+#X connect 10 0 11 0;
+#X connect 11 0 8 0;
+#X connect 11 0 9 0;
+#X connect 12 0 11 0;
+#X connect 18 1 1 0;
+#X connect 18 1 5 0;
+#X connect 18 1 2 0;
+#X connect 18 1 6 0;
+#X connect 18 1 3 0;
+#X connect 18 1 7 0;
+#X connect 18 1 4 0;
+#X connect 21 1 13 0;
+#X connect 22 1 24 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..c71314af
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listprepend-help.pd
@@ -0,0 +1,51 @@
+#N canvas 631 22 632 468 10;
+#X obj 103 419 listappend;
+#X obj 253 419 listelement;
+#X obj 409 419 listfind;
+#X obj 547 419 listflatten;
+#X obj 175 419 listprepend;
+#X obj 331 419 listreverse;
+#X obj 469 419 listsublist;
+#X msg 92 112 1 3 hello 8 13;
+#X msg 260 110 1 12 a b c d e f g h i j k l;
+#X obj 93 180 display;
+#X msg 269 131 200 201 202 203 204 205 206;
+#X obj 92 151 listprepend 1 2 3 4 5 6 7;
+#X text 232 387 Outputs the resulting list.;
+#X text 232 241 This optional argument can contain the initial list
+;
+#X text 8 35 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 obj 0 0 doc_h;
+#X obj 3 273 doc_i 2;
+#X obj 3 357 doc_o 1;
+#X obj 3 211 doc_c n;
+#X obj 3 419 doc_also;
+#X obj 14 303 doc_ii 0;
+#X obj 14 325 doc_ii 1;
+#X obj 14 387 doc_oo 0;
+#X obj 14 241 doc_cc any;
+#X obj 97 303 doc_m i0 list;
+#X obj 97 325 doc_m i1 list;
+#X obj 97 387 doc_m o0 list;
+#X obj 0 439 doc_f;
+#X text 232 303 a list to be appended to initial list.;
+#X text 232 325 initial list to be appended to.;
+#X obj 97 241 doc_m cany <any>;
+#X connect 7 0 11 0;
+#X connect 8 0 11 1;
+#X connect 10 0 11 1;
+#X connect 11 0 9 0;
+#X connect 19 1 0 0;
+#X connect 19 1 4 0;
+#X connect 19 1 1 0;
+#X connect 19 1 5 0;
+#X connect 19 1 2 0;
+#X connect 19 1 6 0;
+#X connect 19 1 3 0;
+#X connect 24 1 28 0;
+#X connect 25 1 29 0;
+#X connect 26 1 12 0;
+#X connect 30 1 13 0;
diff --git a/externals/gridflow/doc/flow_classes/listread-help.pd b/externals/gridflow/doc/flow_classes/listread-help.pd
new file mode 100644
index 00000000..a970e607
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listread-help.pd
@@ -0,0 +1,40 @@
+#N canvas 623 251 632 454 10;
+#X obj 0 0 doc_h;
+#X obj 0 425 doc_f;
+#X floatatom 44 48 5 0 0 0 - - -;
+#X floatatom 44 85 5 0 0 0 - - -;
+#X obj 3 143 doc_c any;
+#X obj 14 173 doc_cc any;
+#X obj 97 173 doc_m cany <any>;
+#X obj 3 203 doc_i 1;
+#X obj 14 233 doc_ii 0;
+#X obj 97 233 doc_m i0 float;
+#X obj 3 330 doc_o 1;
+#X obj 14 360 doc_oo 0;
+#X obj 97 360 doc_m o0 float int;
+#X text 232 360 nonnegative list index of first occurrence \, or -1
+if not found.;
+#X obj 3 405 doc_also;
+#X obj 103 405 listread;
+#X obj 44 66 listread 2 3 5 7 11 13;
+#X text 188 41 like [tabread] \, this outputs an element when given
+an index \, but unlike [tabread] \, this uses a list instead of an
+array.;
+#X obj 44 103 listfind 2 3 5 7 11 13;
+#X floatatom 44 122 5 0 0 0 - - -;
+#X text 188 88 a [listfind] with the same content cancels the effect
+of a [listread] when the input of [listread] is nonnegative and is
+smaller than the list's length.;
+#X text 232 233 lookup an element. if the index is nonnegative \, then
+it must be less than the list length \, else no output will be produced.
+if the index is negative \, then it must be greater than or equal to
+minus the list length \, and this counts from the end of the list:
+-1 will output the last element \, -2 will output the next to last
+\, etc.;
+#X connect 2 0 16 0;
+#X connect 3 0 18 0;
+#X connect 9 1 21 0;
+#X connect 12 1 13 0;
+#X connect 14 1 15 0;
+#X connect 16 0 3 0;
+#X connect 18 0 19 0;
diff --git a/externals/gridflow/doc/flow_classes/listreverse-help.pd b/externals/gridflow/doc/flow_classes/listreverse-help.pd
new file mode 100644
index 00000000..f5174d55
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listreverse-help.pd
@@ -0,0 +1,13 @@
+#N canvas 659 137 632 262 10;
+#X obj 40 40 listreverse;
+#X obj 0 0 doc_h;
+#X obj 3 73 doc_c 0;
+#X obj 3 113 doc_i 1;
+#X obj 3 173 doc_o 1;
+#X obj 14 143 doc_ii 0;
+#X obj 14 203 doc_oo 0;
+#X obj 97 143 doc_m i0 list;
+#X obj 97 203 doc_m o0 list;
+#X text 119 34 Outputs the incoming list \, from last element to first
+element.;
+#X obj 0 233 doc_f;
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..900328f5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/listsublist-help.pd
@@ -0,0 +1,60 @@
+#N canvas 628 22 632 580 10;
+#X obj 103 531 listappend;
+#X obj 175 531 listelement;
+#X obj 253 531 listfind;
+#X obj 313 531 listflatten;
+#X obj 391 531 listprepend;
+#X obj 469 531 listreverse;
+#X msg 173 112 1 3 hello 8 13;
+#X msg 182 136 1 12 a b c d e f g h i j k l;
+#X obj 174 211 display;
+#X text 232 486 Outputs the sublist as specified by the inlets or the
+arguments.;
+#X text 9 33 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 224 158 5 0 0 0 - - -;
+#X obj 0 0 doc_h;
+#X obj 3 350 doc_i 3;
+#X obj 3 456 doc_o 1;
+#X obj 3 253 doc_c 0..2;
+#X obj 3 531 doc_also;
+#X obj 14 380 doc_ii 0;
+#X obj 14 402 doc_ii 1;
+#X obj 14 424 doc_ii 2;
+#X obj 14 283 doc_cc 0;
+#X obj 14 305 doc_cc 1;
+#X obj 14 486 doc_oo 0;
+#X obj 547 531 listsublist;
+#X floatatom 267 158 5 0 0 0 - - -;
+#X obj 173 182 listsublist 2 3;
+#X text 232 283 The index in the list to start the sublist at.;
+#X text 232 305 The number of items wanted from the list starting at
+the index specified.;
+#X text 232 402 Index (See Argument 0);
+#X text 232 424 Number of items (See Argument 1);
+#X obj 97 283 doc_m c0 float/int;
+#X obj 97 305 doc_m c1 float/int;
+#X obj 97 380 doc_m i0 list;
+#X obj 97 402 doc_m i1 float int;
+#X obj 97 424 doc_m i2 float int;
+#X obj 97 486 doc_m o0 list;
+#X obj 0 551 doc_f;
+#X connect 6 0 25 0;
+#X connect 7 0 25 0;
+#X connect 11 0 25 1;
+#X connect 16 1 0 0;
+#X connect 16 1 1 0;
+#X connect 16 1 2 0;
+#X connect 16 1 3 0;
+#X connect 16 1 4 0;
+#X connect 16 1 5 0;
+#X connect 16 1 23 0;
+#X connect 24 0 25 2;
+#X connect 25 0 8 0;
+#X connect 30 1 26 0;
+#X connect 31 1 27 0;
+#X connect 33 1 28 0;
+#X connect 34 1 29 0;
+#X connect 35 1 9 0;
diff --git a/externals/gridflow/doc/flow_classes/norecurse-help.pd b/externals/gridflow/doc/flow_classes/norecurse-help.pd
new file mode 100644
index 00000000..d0207c97
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/norecurse-help.pd
@@ -0,0 +1,16 @@
+#N canvas 335 118 632 297 10;
+#X obj 0 0 doc_h;
+#X obj 3 80 doc_c;
+#X obj 0 268 doc_f;
+#X obj 76 48 norecurse;
+#X text 237 45 this will stop any control-recursion.;
+#X obj 3 120 doc_i 1;
+#X obj 3 208 doc_o 1;
+#X obj 14 150 doc_ii 0;
+#X obj 14 238 doc_oo 0;
+#X obj 97 150 doc_m i0 <any>;
+#X obj 97 238 doc_m o0 <any>;
+#X text 232 150 any incoming message will be copied as-is to the output.
+but only if a message is not currently "being sent" by this same object.
+thus this prevents any "strange loops".;
+#X connect 9 1 11 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..9cb8916d
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/parallel_port-help.pd
@@ -0,0 +1,96 @@
+#N canvas 188 22 632 673 10;
+#X floatatom 7 380 5 0 0 0 - - -;
+#X floatatom 71 348 5 0 0 0 - - -;
+#X floatatom 136 323 5 0 0 0 - - -;
+#X obj 7 34 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1;
+#X text 215 206 * my system resets the owner of the printer port to
+'root.lp' so I need to issue as root 'chown myuser.lp';
+#X text 215 50 * you will need : a paper clip (or a 'high tech' solid
+core 22-18 awg wire) an led a button;
+#X text 215 176 * consult http://en.wikipedia.org/wiki/Parallel_Port
+for the pinouts + more;
+#X text 215 255 7 6 5 4 3 2 1 0 bit number;
+#X text 215 269 9 8 7 6 5 4 3 2 pin number;
+#X text 215 237 layout of bit to pin numbers;
+#X text 18 32 <-- This will send a 0 or a 1 to the first pin;
+#X text 14 243 Will accept values from 0-255;
+#X obj 7 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 26 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 45 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 64 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 83 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0 1
+;
+#X obj 102 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 121 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 140 132 tgl 15 0 empty empty empty 0 -6 0 8 -260818 -1 -1 0
+1;
+#X obj 7 229 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-241291 -1 -1 0 256;
+#X obj 7 191 #fold +;
+#X obj 7 210 #to_float;
+#X obj 7 172 # << (0 1 2 3 4 5 6 7);
+#X obj 7 153 #pack 8 \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \,
+;
+#X text 19 274 takes the port as argument;
+#X text 44 -1 The cheapest digital i/o interface;
+#X obj 7 293 parallel_port /dev/lp0;
+#X obj 7 63 metro 1;
+#X text 215 286 Flags : PERRORP (active low) \, PSELECD (active high)
+\, POUTPA (active high) \, PACK (active low) \, PBUSY (active high)
+;
+#X obj 0 0 doc_h;
+#X text 215 80 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 215 138 2: connect the led between pins 2 (Data0) and 23 (GND)
+;
+#X text 215 156 3: connect a button between pin 10 and 22 (GND);
+#X obj 3 416 doc_c 1;
+#X obj 3 478 doc_i 1;
+#X obj 14 508 doc_ii 0;
+#X obj 14 446 doc_cc 0;
+#X obj 0 644 doc_f;
+#X text 177 322 parallel port flags;
+#X text 110 348 status (pin 10);
+#X text 51 379 reserved for future use;
+#X obj 3 540 doc_o 3;
+#X obj 14 570 doc_oo 0;
+#X obj 14 590 doc_oo 1;
+#X obj 14 612 doc_oo 2;
+#X obj 97 612 doc_m o2 float;
+#X obj 97 590 doc_m o1 float;
+#X obj 97 570 doc_m o0 <none>;
+#X obj 97 508 doc_m i0 float;
+#X obj 97 446 doc_m c0 symbol;
+#X text 232 446 device name (Linux parallel port interface);
+#X text 232 508 bytes to send;
+#X text 232 590 status;
+#X text 232 612 flags;
+#X connect 3 0 28 0;
+#X connect 12 0 24 0;
+#X connect 13 0 24 1;
+#X connect 14 0 24 2;
+#X connect 15 0 24 3;
+#X connect 16 0 24 4;
+#X connect 17 0 24 5;
+#X connect 18 0 24 6;
+#X connect 19 0 24 7;
+#X connect 20 0 27 0;
+#X connect 21 0 22 0;
+#X connect 22 0 20 0;
+#X connect 23 0 21 0;
+#X connect 24 0 23 0;
+#X connect 27 0 0 0;
+#X connect 27 1 1 0;
+#X connect 27 2 2 0;
+#X connect 28 0 12 0;
+#X connect 46 1 54 0;
+#X connect 47 1 53 0;
+#X connect 49 1 52 0;
+#X connect 50 1 51 0;
diff --git a/externals/gridflow/doc/flow_classes/pingpong-help.pd b/externals/gridflow/doc/flow_classes/pingpong-help.pd
new file mode 100644
index 00000000..17b44f36
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/pingpong-help.pd
@@ -0,0 +1,27 @@
+#N canvas 680 0 632 383 10;
+#X obj 0 0 doc_h;
+#X obj 3 294 doc_o 1;
+#X text 148 44 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.;
+#X obj 34 47 pingpong;
+#X obj 14 324 doc_oo 0;
+#X obj 3 109 doc_c 1;
+#X obj 3 171 doc_i 2;
+#X obj 14 139 doc_cc 0;
+#X obj 14 201 doc_ii 0;
+#X obj 14 262 doc_ii 1;
+#X obj 97 139 doc_m c0 float;
+#X obj 97 262 doc_m i1 float;
+#X text 232 262 same as arg 0;
+#X text 232 139 "top";
+#X obj 97 201 doc_m i0 float;
+#X text 232 201 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.;
+#X obj 97 324 doc_m o0 float;
+#X obj 0 354 doc_f;
+#X connect 10 1 13 0;
+#X connect 11 1 12 0;
+#X connect 14 1 15 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..944a0e53
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/plotter_control-help.pd
@@ -0,0 +1,79 @@
+#N canvas 576 39 632 605 10;
+#X obj 22 162 r foo;
+#X msg 427 236 print_from_ascii $*;
+#X msg 427 115 print hello_world;
+#X msg 154 117 pu;
+#X msg 154 165 pd;
+#X msg 155 268 sp 0;
+#X msg 154 217 pa 120 160;
+#X obj 427 187 unix_time;
+#X obj 427 167 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 14 318 comport 0 9600;
+#X obj 6 192 plotter_control;
+#X obj 23 221 print hpgl_commands;
+#X obj 427 259 s foo;
+#X text 194 117 pen up;
+#X text 194 165 pen down;
+#X obj 427 137 s foo;
+#X text 238 217 move to absolute position;
+#N canvas 0 22 450 300 draw_a_rectangle 0;
+#X msg 31 156 pu \, sp 0;
+#X msg 138 191 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 msg 138 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 obj 31 52 t a a a;
+#X obj 138 153 # * (110 320);
+#X obj 138 172 #to_list;
+#X connect 0 0 3 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 7 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 6 1 4 0;
+#X connect 6 2 2 0;
+#X connect 7 0 8 0;
+#X connect 8 0 1 0;
+#X restore 427 291 pd draw_a_rectangle;
+#X text 74 343 use the comport object to interface to the plotter;
+#X obj 155 290 s foo;
+#X obj 154 239 s foo;
+#X obj 154 187 s foo;
+#X obj 154 139 s foo;
+#X text 198 270 (0...6) remove/change the pen;
+#X obj 0 0 doc_h;
+#X obj 3 379 doc_c 0;
+#X obj 3 419 doc_i 1;
+#X obj 3 494 doc_o 1;
+#X obj 14 524 doc_oo 0;
+#X obj 14 449 doc_ii 0;
+#X text 10 32 This object produces HPGL instructions in ASCII form
+that can be sent to the comport object in order to control an HPGL
+compatible plotter.;
+#X obj 0 576 doc_f;
+#X obj 427 211 #to_list;
+#X obj 97 449 doc_m i0 <hpgl>;
+#X obj 97 524 doc_m o0 float;
+#X text 232 524 serialised hpgl (as ascii codes);
+#X text 232 449 hpgl stream (note: most other hpgl inlets don't support
+lowercase);
+#X obj 3 556 doc_also;
+#X obj 103 556 plotter_parser;
+#X connect 0 0 10 0;
+#X connect 1 0 12 0;
+#X connect 2 0 15 0;
+#X connect 3 0 22 0;
+#X connect 4 0 21 0;
+#X connect 5 0 19 0;
+#X connect 6 0 20 0;
+#X connect 7 0 32 0;
+#X connect 8 0 7 0;
+#X connect 10 0 11 0;
+#X connect 32 0 1 0;
+#X connect 33 1 36 0;
+#X connect 34 1 35 0;
+#X connect 37 1 38 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..637d8211
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/plotter_parser-help.pd
@@ -0,0 +1,116 @@
+#N canvas 663 22 632 620 10;
+#X obj 195 161 plotter_parser;
+#X obj 195 63 until;
+#X obj 195 46 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 128 46 tgl 15 0 empty empty empty 17 7 0 10 -24198 -1 -1 0 1
+;
+#X msg 202 87 rewind;
+#X obj 297 159 print bogus;
+#X obj 195 275 loadbang;
+#X obj 206 204 print command;
+#X obj 127 245 #store;
+#X obj 209 233 loadbang;
+#X obj 206 185 spigot;
+#X obj 252 186 tgl 15 0 empty empty empty 17 7 0 10 -241291 -1 -1 0
+1;
+#X obj 13 330 fps;
+#X obj 286 48 bng 15 250 50 0 empty empty empty 17 7 0 10 -258699 -1
+-1;
+#X obj 128 63 metro 1;
+#X obj 195 109 #in grid plotter_parser_old.pd.hpgl \, headerless \,
+type b;
+#X obj 326 302 #pack;
+#X obj 356 286 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 0 256;
+#X obj 326 270 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 -1000 256;
+#X obj 326 353 #pack;
+#X obj 356 337 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 10333 256;
+#X obj 326 321 nbx 5 14 -1e+37 1e+37 0 1 empty empty empty 0 -8 0 10
+-241291 -1 -1 7000 256;
+#X obj 128 82 t b b;
+#X obj 104 282 gf.oneshot;
+#X obj 127 226 t b b;
+#X obj 13 349 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-225271 -1 -1 0 256;
+#X obj 13 282 gf.oneshot;
+#X obj 31 149 bng 15 250 50 0 empty empty empty 17 7 0 10 -24198 -1
+-1;
+#X obj 31 166 t b b;
+#X obj 123 315 #draw_hpgl;
+#X obj 13 311 #out window;
+#X obj 125 166 f;
+#X obj 150 166 + 1;
+#X obj 125 185 sel;
+#X msg 209 252 600 800 3 b #;
+#X msg 195 294 3 b # 255 255 255;
+#X obj 150 185 % 8;
+#X obj 0 0 doc_h;
+#X obj 3 385 doc_c 0;
+#X obj 3 425 doc_i 1;
+#X obj 3 487 doc_o 2;
+#X obj 14 455 doc_ii 0;
+#X obj 14 517 doc_oo 0;
+#X obj 14 539 doc_oo 1;
+#X obj 0 591 doc_f;
+#X obj 3 571 doc_also;
+#X obj 103 571 plotter_control;
+#X obj 97 539 doc_m o1 float;
+#X text 232 539 unknown bytes;
+#X obj 97 455 doc_m i0 float;
+#X obj 97 517 doc_m o0 <hpgl>;
+#X text 232 455 bytes that are supposed to form HPGL commands;
+#X text 232 517 HPGL commands;
+#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;
+#X connect 45 1 46 0;
+#X connect 47 1 48 0;
+#X connect 49 1 51 0;
+#X connect 50 1 52 0;
diff --git a/externals/gridflow/doc/flow_classes/range-help.pd b/externals/gridflow/doc/flow_classes/range-help.pd
new file mode 100644
index 00000000..12415511
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/range-help.pd
@@ -0,0 +1,28 @@
+#N canvas 680 0 632 393 10;
+#X obj 0 0 doc_h;
+#X obj 3 99 doc_c 0..;
+#X obj 3 304 doc_o 1..;
+#X obj 14 169 doc_ii 0;
+#X text 232 169 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.
+;
+#X obj 14 334 doc_oo any;
+#X obj 97 334 doc_m oany float;
+#X obj 97 169 doc_m i0 float;
+#X obj 3 139 doc_i 1..;
+#X obj 14 169 doc_ii other;
+#X obj 97 270 doc_m iother float;
+#X text 232 270 sets the corresponding separator in the separator list.
+;
+#X obj 0 364 doc_f;
+#X obj 256 53 moses 1;
+#X obj 164 53 range 1 2 3;
+#X text 241 52 =;
+#X obj 306 53 moses 2;
+#X obj 356 53 moses 3;
+#X connect 7 1 4 0;
+#X connect 10 1 11 0;
+#X connect 13 1 16 0;
+#X connect 16 1 17 0;
diff --git a/externals/gridflow/doc/flow_classes/receives-help.pd b/externals/gridflow/doc/flow_classes/receives-help.pd
new file mode 100644
index 00000000..6284c1f9
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/receives-help.pd
@@ -0,0 +1,38 @@
+#N canvas 335 118 632 409 10;
+#X obj 0 0 doc_h;
+#X obj 0 380 doc_f;
+#X obj 3 93 doc_c 0..;
+#X obj 14 123 doc_cc 0;
+#X obj 14 165 doc_cc other;
+#X obj 97 123 doc_m c0 symbol;
+#X obj 97 165 doc_m cother symbol;
+#X text 232 123 the prefix that is going to be common to all receive-symbols.
+if omitted \, the blank symbol will be used (thus no prefix).;
+#X text 232 165 the suffix of each receive symbol that will be registered.
+;
+#X obj 3 195 doc_i 1;
+#X obj 3 296 doc_o 2;
+#X obj 14 225 doc_ii 0;
+#X obj 14 326 doc_oo 0;
+#X obj 14 348 doc_oo 1;
+#X obj 97 225 doc_m i0 list;
+#X text 232 225 list of symbols to register receive-symbols for. they
+will be prefixed. sending such a message unregisters all previous receive-symbols
+registered by this box (which may be reregistered immediately... if
+this is what you're doing);
+#X text 232 326 the message received;
+#X obj 97 326 doc_m o0 <any>;
+#X obj 97 348 doc_m o1 symbol;
+#X text 232 348 the receive-symbol that this message was received as.
+;
+#X obj 85 53 receives \$0- a b c;
+#X text 206 52 =;
+#X obj 223 54 r \$0-a;
+#X obj 265 54 r \$0-b;
+#X obj 307 54 r \$0-c;
+#X text 356 52 and more;
+#X connect 5 1 7 0;
+#X connect 6 1 8 0;
+#X connect 14 1 15 0;
+#X connect 17 1 16 0;
+#X connect 18 1 19 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..c2dceaa5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/route2-help.pd
@@ -0,0 +1,33 @@
+#N canvas 412 190 632 485 10;
+#X obj 11 140 route2 blah foo bar;
+#X msg 29 39 blah blah blah;
+#X msg 29 62 foo 42;
+#X msg 29 86 bar 3.14159;
+#X obj 140 160 display;
+#X obj 97 180 display;
+#X obj 54 200 display;
+#X obj 12 220 display;
+#X msg 29 114 pas rapport;
+#X text 176 29 just like [route];
+#X text 177 46 but preserves message as-is;
+#X obj 0 0 doc_h;
+#X obj 3 253 doc_c n;
+#X obj 3 313 doc_i 1;
+#X obj 3 373 doc_o n;
+#X obj 14 343 doc_ii 0;
+#X obj 14 403 doc_oo nonlast;
+#X obj 14 426 doc_oo last;
+#X obj 14 283 doc_cc any;
+#X obj 0 456 doc_f;
+#X obj 97 402 doc_m ononlast <any>;
+#X obj 97 426 doc_m olast <any>;
+#X obj 97 343 doc_m i0 <any>;
+#X obj 97 283 doc_m cany symbol;
+#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..fd21cebf
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/seq_fold-help.pd
@@ -0,0 +1,46 @@
+#N canvas 536 114 632 525 10;
+#X obj 125 126 seq_fold;
+#X msg 125 65 2 \, 3 \, 5 \, 7 \, end;
+#X obj 125 93 route end;
+#X obj 150 150 +;
+#X obj 126 179 display;
+#X obj 0 0 doc_h;
+#X obj 3 222 doc_c 0;
+#X obj 3 262 doc_i 4;
+#X obj 14 292 doc_ii 0;
+#X obj 14 314 doc_ii 1;
+#X obj 14 336 doc_ii 2;
+#X obj 14 358 doc_ii 3;
+#X obj 3 390 doc_o 3;
+#X obj 14 420 doc_oo 0;
+#X obj 14 442 doc_oo 1;
+#X obj 14 464 doc_oo 2;
+#X obj 0 496 doc_f;
+#X obj 97 292 doc_m i0 bang;
+#X obj 97 314 doc_m i1 <any>;
+#X obj 97 336 doc_m i2 <any>;
+#X obj 97 358 doc_m i3 <any>;
+#X obj 97 420 doc_m o0 <any>;
+#X obj 97 442 doc_m o1 <any>;
+#X obj 97 464 doc_m o2 <any>;
+#X text 232 442 to outside left inlet;
+#X text 232 464 to outside right inlet;
+#X text 232 420 final result;
+#X text 232 358 from outside outlet;
+#X text 232 336 seed;
+#X text 232 292 output the final result;
+#X text 232 314 sequence of values to be folded;
+#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;
+#X connect 17 1 29 0;
+#X connect 18 1 30 0;
+#X connect 19 1 28 0;
+#X connect 20 1 27 0;
+#X connect 21 1 26 0;
+#X connect 22 1 24 0;
+#X connect 23 1 25 0;
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..d2828f23
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/shunt-help.pd
@@ -0,0 +1,70 @@
+#N canvas 673 22 632 642 10;
+#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 232 527 The integer passed to inlet 1 determines which outlet
+is active.;
+#X text 232 602 Outputs incoming message value according to the selector
+value.;
+#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 obj 0 0 doc_h;
+#X obj 3 286 doc_i 2;
+#X obj 3 572 doc_o n;
+#X obj 14 316 doc_ii 0;
+#X obj 14 527 doc_ii 1;
+#X obj 14 602 doc_oo any;
+#X obj 166 114 shunt 4;
+#X text 232 219 Defines the number of outlets desired. If [shunt] is
+created without an argument \, it will have 2 outlets.;
+#X text 232 254 Defines the initial active outlet.;
+#X obj 3 189 doc_c 2;
+#X obj 14 254 doc_cc 1;
+#X obj 14 219 doc_cc 0;
+#X obj 0 647 doc_f;
+#X obj 97 219 doc_m c0 float/int;
+#X obj 97 254 doc_m c1 float/int;
+#X obj 97 527 doc_m i1 float int;
+#X obj 97 602 doc_m oany <any>;
+#X obj 97 338 doc_m i0 index;
+#X obj 97 382 doc_m i0 mode;
+#X obj 97 316 doc_m i0 hi;
+#X obj 97 360 doc_m i0 lo;
+#X text 232 382 -2: going down \, pingpong;
+#X text 232 404 -1: going down \, cycling;
+#X obj 97 492 doc_m i0 <any>;
+#X text 232 426 0: not changing;
+#X text 232 448 1: going up \, cycling;
+#X text 232 470 2: going up \, pingpong;
+#X text 232 338 same as arg 1;
+#X text 232 360 min value for cycling and pingpong (default: 0);
+#X text 232 316 max value for cycling and pingpong (default: N-1);
+#X text 232 492 Incoming message can be Grids \, Symbols \, Floats
+\, Lists \, etc.;
+#X connect 4 0 18 0;
+#X connect 5 0 18 1;
+#X connect 18 0 0 0;
+#X connect 18 1 1 0;
+#X connect 18 2 2 0;
+#X connect 18 3 3 0;
+#X connect 25 1 19 0;
+#X connect 26 1 20 0;
+#X connect 27 1 9 0;
+#X connect 28 1 10 0;
+#X connect 29 1 39 0;
+#X connect 30 1 33 0;
+#X connect 30 1 34 0;
+#X connect 30 1 36 0;
+#X connect 30 1 37 0;
+#X connect 30 1 38 0;
+#X connect 31 1 41 0;
+#X connect 32 1 40 0;
+#X connect 35 1 42 0;
diff --git a/externals/gridflow/doc/flow_classes/systemtime-help.pd b/externals/gridflow/doc/flow_classes/systemtime-help.pd
new file mode 100644
index 00000000..7bcdbd51
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/systemtime-help.pd
@@ -0,0 +1,33 @@
+#N canvas 463 105 632 422 10;
+#X obj 0 0 doc_h;
+#X obj 3 187 doc_c;
+#X obj 0 393 doc_f;
+#X obj 3 373 doc_also;
+#X obj 103 373 cputime;
+#X obj 157 373 systemtime;
+#X text 186 108 What [usertime] and [systemtime] tell you together
+should add up to the amount that [cputime] tells you.;
+#X obj 3 311 doc_o 1;
+#X obj 3 227 doc_i 2;
+#X obj 14 257 doc_ii 0;
+#X obj 14 279 doc_ii 1;
+#X obj 14 341 doc_oo 0;
+#X obj 97 257 doc_m i0 bang;
+#X obj 97 279 doc_m i1 bang;
+#X obj 97 341 doc_m o0 float;
+#X text 232 257 reset timer;
+#X text 232 279 trigger output;
+#X text 232 341 value in milliseconds;
+#X text 188 38 While [cputime] gives you the total time spent in the
+pd process \, therefore excluding any time spent running any other
+programmes \, time spent running pd.tk \, and time spent doing nothing
+at all \, [systemtime] also excludes whatever is NOT run in the kernel.
+;
+#X text 188 142 In C language \, this is the "stime" feature of the
+times() command.;
+#X obj 61 66 systemtime;
+#X connect 3 1 4 0;
+#X connect 3 1 5 0;
+#X connect 12 1 15 0;
+#X connect 13 1 16 0;
+#X connect 14 1 17 0;
diff --git a/externals/gridflow/doc/flow_classes/tsctime-help.pd b/externals/gridflow/doc/flow_classes/tsctime-help.pd
new file mode 100644
index 00000000..e53730a5
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/tsctime-help.pd
@@ -0,0 +1,50 @@
+#N canvas 508 124 632 550 10;
+#X obj 0 0 doc_h;
+#X obj 3 302 doc_c;
+#X obj 0 521 doc_f;
+#X obj 3 501 doc_also;
+#X obj 3 426 doc_o 1;
+#X obj 3 342 doc_i 2;
+#X obj 14 372 doc_ii 0;
+#X obj 14 394 doc_ii 1;
+#X obj 14 456 doc_oo 0;
+#X obj 97 372 doc_m i0 bang;
+#X obj 97 394 doc_m i1 bang;
+#X obj 97 456 doc_m o0 float;
+#X text 232 372 reset timer;
+#X text 232 394 trigger output;
+#X obj 103 501 realtime;
+#X obj 11 96 tsctime;
+#X text 188 38 This is a super-high-resolution version of the [realtime]
+class that does not look at the ordinary clock of the operating system
+\, and instead uses the clock tick of the CPU itself. However \, if
+you have a variable-clock CPU \, this will give you some kind of virtual
+time.;
+#X msg 50 45 bang;
+#X msg 11 45 bang;
+#X floatatom 14 122 10 0 0 0 - - -;
+#X obj 78 100 realtime;
+#X floatatom 78 122 10 0 0 0 - - -;
+#X text 190 114 It's also possible that this has some other bugs related
+to scaling. However \, even if it gives you really weird values \,
+this object will give you very precise values in what is really the
+wrong scale.;
+#X text 192 171 if you are trying to measure real time with this \,
+you should disable any CPU energy saving that may change the CPU's
+clock speed. However \, if you want to measure CPU usage \, [tsctime]
+is the ONLY of the time-objects to allow you to measure CPU usage reliably
+while your clock speed changes.;
+#X text 192 255 in assembly language \, [tsctime] is called "RDTSC"
+\, and this is where [tsctime] got its name from.;
+#X text 232 456 value in "milliseconds" (or lousy imitation thereof...
+see intro text above.);
+#X connect 3 1 14 0;
+#X connect 9 1 12 0;
+#X connect 10 1 13 0;
+#X connect 11 1 25 0;
+#X connect 15 0 19 0;
+#X connect 17 0 15 1;
+#X connect 17 0 20 1;
+#X connect 18 0 15 0;
+#X connect 18 0 20 0;
+#X connect 20 0 21 0;
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..6e499216
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/unix_time-help.pd
@@ -0,0 +1,50 @@
+#N canvas 679 22 632 619 10;
+#X obj 109 184 unix_time;
+#X obj 109 153 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 26 243 #to_list;
+#X obj 109 111 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 27 321 display;
+#X obj 109 129 metro 500;
+#X text 32 302 <-- Ascii format for the date;
+#X obj 326 292 display;
+#X obj 141 242 display;
+#X obj 325 266 display;
+#X obj 324 241 sprintf %04d%02d%02d-%02d%02d%02d;
+#X obj 0 0 doc_h;
+#X obj 3 356 doc_c 0;
+#X obj 3 396 doc_i 1;
+#X obj 3 471 doc_o 3;
+#X obj 14 426 doc_ii 0;
+#X obj 14 501 doc_oo 0;
+#X obj 14 523 doc_oo 1;
+#X obj 14 545 doc_oo 2;
+#X text 9 32 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 0 th of a second which is useful
+for creating filenames.;
+#X text 232 426 A bang at the left inlet will tell [unix_time] to get
+the current Unix timestamp and send it to the outlets.;
+#X text 232 501 Outputs the time and date in ASCII format.;
+#X text 232 523 Outputs the Unix timestamp in seconds.;
+#X text 232 545 Outputs the fractions of a second up to 10 microseconds
+(?) (actual precision is probably platform-dependent...);
+#X obj 97 426 doc_m i0 bang;
+#X obj 97 501 doc_m o0 list;
+#X obj 97 523 doc_m o1 list;
+#X obj 97 545 doc_m o2 list;
+#X obj 0 590 doc_f;
+#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;
+#X connect 24 1 20 0;
+#X connect 25 1 21 0;
+#X connect 26 1 22 0;
+#X connect 27 1 23 0;
diff --git a/externals/gridflow/doc/flow_classes/usertime-help.pd b/externals/gridflow/doc/flow_classes/usertime-help.pd
new file mode 100644
index 00000000..28d52a2c
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/usertime-help.pd
@@ -0,0 +1,33 @@
+#N canvas 508 124 632 412 10;
+#X obj 0 0 doc_h;
+#X obj 3 177 doc_c;
+#X obj 0 383 doc_f;
+#X obj 3 363 doc_also;
+#X obj 103 363 cputime;
+#X obj 157 363 systemtime;
+#X text 186 108 What [usertime] and [systemtime] tell you together
+should add up to the amount that [cputime] tells you.;
+#X obj 3 301 doc_o 1;
+#X obj 3 217 doc_i 2;
+#X obj 14 247 doc_ii 0;
+#X obj 14 269 doc_ii 1;
+#X obj 14 331 doc_oo 0;
+#X obj 97 247 doc_m i0 bang;
+#X obj 97 269 doc_m i1 bang;
+#X obj 97 331 doc_m o0 float;
+#X text 232 247 reset timer;
+#X text 232 269 trigger output;
+#X text 232 331 value in milliseconds;
+#X text 188 142 In C language \, this is the "utime" feature of the
+times() command.;
+#X obj 61 66 usertime;
+#X text 188 38 While [cputime] gives you the total time spent in the
+pd process \, therefore excluding any time spent running any other
+programmes \, time spent running pd.tk \, and time spent doing nothing
+at all \, [systemtime] also excludes whatever is run in the kernel.
+;
+#X connect 3 1 4 0;
+#X connect 3 1 5 0;
+#X connect 12 1 15 0;
+#X connect 13 1 16 0;
+#X connect 14 1 17 0;
diff --git a/externals/gridflow/doc/flow_classes/var.#-help.pd b/externals/gridflow/doc/flow_classes/var.#-help.pd
new file mode 100644
index 00000000..67f921ea
--- /dev/null
+++ b/externals/gridflow/doc/flow_classes/var.#-help.pd
@@ -0,0 +1,21 @@
+#N canvas 335 118 632 407 10;
+#X obj 0 0 doc_h;
+#X obj 0 378 doc_f;
+#X obj 125 58 var.#;
+#X text 189 44 somewhat like [#store] but designed to be most especially
+to grids what [f] is to floats and [symbol] is to symbols.;
+#X obj 3 218 doc_i 2;
+#X obj 3 318 doc_o 1;
+#X text 191 85 it was named that way because if you alias [f] to [var.f]
+\, and [s] to [var.s] \, then [var.\$1] will instantiate an object
+of that class-family. (this is related to the PureUnity project);
+#X obj 14 348 doc_oo 0;
+#X obj 14 288 doc_ii 1;
+#X obj 97 348 doc_m o0 grid;
+#X obj 97 288 doc_m i1 grid;
+#X obj 97 268 doc_m i0 grid;
+#X obj 97 248 doc_m i0 bang;
+#X obj 14 248 doc_ii 0;
+#X obj 14 188 doc_cc 0;
+#X obj 3 158 doc_c 0..1;
+#X obj 97 188 doc_m c0 grid;
diff --git a/externals/gridflow/doc/index.pd b/externals/gridflow/doc/index.pd
new file mode 100644
index 00000000..c508cff9
--- /dev/null
+++ b/externals/gridflow/doc/index.pd
@@ -0,0 +1,329 @@
+#N canvas 0 0 560 480 10 ;
+#X obj 140 50 # +;
+#X text 180 50 plain numeric operators on grids: + - * / etc;
+#X obj -4 82 #apply_colormap_channelwise;
+#X text 180 82 ;
+#X obj 56 114 #background_model;
+#X text 180 114 make mask from learning to distinguish background from foreground;
+#X obj 116 146 #border;
+#X text 180 146 add padding on sides of a grid;
+#X obj 116 178 #camera;
+#X text 180 178 control panel for opening cameras;
+#X obj 116 210 #cast i;
+#X text 180 210 convert grid from one number type to another;
+#X obj 104 242 #centroid;
+#X text 180 242 find centroid (weighted average) of the coordinates of a grid;
+#X obj 116 274 #change;
+#X text 180 274 send grid only if different from previous grid;
+#X obj 104 306 #checkers;
+#X text 180 306 make image of chequered background in two tones of grey;
+#X obj 128 338 #clip;
+#X text 180 338 min and max;
+#X obj 86 370 #cluster_avg;
+#X text 180 370 ;
+#X obj 4 402 #color;
+#X text 180 402 GUI for selecting a colour;
+#X obj 104 474 #contrast;
+#X text 180 474 adjust contrast in two different ways;
+#X obj 104 506 #convolve;
+#X text 180 506 compute convolution product of a grid (blur and edge-detection);
+#X obj 134 538 #dim;
+#X text 180 538 get the size (dimensions) of a grid;
+#X obj 80 570 #downscale_by;
+#X text 180 570 reduce the size of an image by a whole factor;
+#X obj 98 602 #draw_hpgl;
+#X text 180 602 ;
+#X obj 92 634 #draw_image;
+#X text 180 634 picture-in-picture;
+#X obj 86 666 #draw_points;
+#X text 180 666 (future use);
+#X obj 80 698 #draw_polygon;
+#X text 180 698 draw polygon in an image;
+#X obj 98 730 #draw_rect;
+#X text 180 730 draw a rectangle in an image;
+#X obj 86 762 #draw_slider;
+#X text 180 762 draw a slider in an image;
+#X obj 80 794 #edit_polygon;
+#X text 180 794 draw a polygon in an image and react to mouse events;
+#X obj 56 826 #extract_diagonal;
+#X text 180 826 ;
+#X obj 128 858 #fade;
+#X text 180 858 fade in exponential-decay fashion (linear recurrence);
+#X obj 104 890 #fade_lin;
+#X text 180 890 fade in piecewise-linear fashion;
+#X obj 104 922 #fastblur;
+#X text 180 922 speedy shortcut for rectangular blur;
+#X obj 134 954 #fft;
+#X text 180 954 compute forward or inverse one-or-two-dimensional complex FFT of a grid;
+#X obj 104 986 #finished;
+#X text 180 986 bang when grid transmission has ended;
+#X obj 116 1018 #fold +;
+#X text 180 1018 compute the sum of each row \, product of each row, and other similar operations;
+#X obj 98 1050 #for 0 4 1;
+#X text 180 1050 make a grid from all numbers or coordinates in a certain range;
+#X obj 104 1082 #from_pix;
+#X text 180 1082 convert pix (GEM) to grid;
+#X obj 122 1114 #gamma;
+#X text 180 1114 apply gamma correction;
+#X obj 122 1146 #grade;
+#X text 180 1146 make an index of the sorting of a grid;
+#X obj 56 1178 #greyscale_to_rgb;
+#X text 180 1178 convert greyscale to RGB;
+#X obj 122 1210 #hello;
+#X text 180 1210 make 7 colour bars;
+#X obj 104 1242 #hueshift;
+#X text 180 1242 apply hue shift by rotating the color wheel;
+#X obj 116 1274 #import;
+#X text 180 1274 convert float \, list, or symbol ASCII codes, to a grid;
+#X obj 92 1306 #import_pix;
+#X text 180 1306 old name of #from_pix;
+#X obj 140 1338 #in;
+#X text 180 1338 open file or device for reading or download;
+#X obj 122 1370 #inner;
+#X text 180 1370 scalar ("dot") product \, matrix product, tensor contraction, image channel remapping, etc.;
+#X obj 104 1402 #io.aalib;
+#X text 180 1402 open an aalib window;
+#X obj 98 1434 #io.dc1394;
+#X text 180 1434 open a faiawaia "DC" camera (not DV) using a Linux-compatible OS;
+#X obj 110 1466 #io.grid;
+#X text 180 1466 read or write a .grid file (GridFlow storage format);
+#X obj 110 1498 #io.jpeg;
+#X text 180 1498 read or write a .jpeg file;
+#X obj 110 1530 #io.mpeg;
+#X text 180 1530 read a .mpeg video file;
+#X obj 116 1562 #io.png;
+#X text 180 1562 read a .png image file;
+#X obj 116 1594 #io.ppm;
+#X text 180 1594 read or write a .pbm or .pgm or .ppm image file;
+#X obj 80 1626 #io.quicktime;
+#X text 180 1626 read a .mov video file (or perhaps .avi);
+#X obj 116 1658 #io.sdl;
+#X text 180 1658 open a SDL window;
+#X obj 86 1690 #io.videodev;
+#X text 180 1690 open a V4L1 device (Linux interface for video cameras and video digitisers);
+#X obj 116 1722 #io.x11;
+#X text 180 1722 open a X11 window;
+#X obj 128 1754 #join;
+#X text 180 1754 join two grids together along any dimension;
+#X obj 98 1786 #labelling;
+#X text 180 1786 tag connected pixels with region numbers in a two-tone single-channel image;
+#X obj 122 1818 #layer;
+#X text 180 1818 layer two same-sized images;
+#X obj 62 1850 #line_to_polygon;
+#X text 180 1850 convert line (as point pair) to polygon (rotated rectangle);
+#X obj 92 1882 #make_cross;
+#X text 180 1882 make cross-shaped polygon;
+#X obj 116 1914 #moment;
+#X text 180 1914 find 1st or 2nd order moment (weighted average or variance) of the coordinates of a grid;
+#X obj 80 1946 #moment_polar;
+#X text 180 1946 convert covariance matrix to the longest and shortest radius of an ellipse and a rotation angle;
+#X obj 56 1978 #motion_detection;
+#X text 180 1978 frame difference with some options;
+#X obj 122 2010 #mouse;
+#X text 180 2010 converts mouse events to reports of clicks \, drags, unclicks, motions, and separate buttons and wheel;
+#X obj 62 2042 #noise_gate_yuvs;
+#X text 180 2042 replaces dark pixels by black pixels in signed YUV images;
+#X obj 134 2074 #out;
+#X text 180 2074 open file or device for writing or upload;
+#X obj 110 2106 #outer +;
+#X text 180 2106 apply numeric operator on all possible combinations of elements of one grid with elements of another;
+#X obj 128 2138 #pack;
+#X text 180 2138 combine floats on separate inlets to make a grid;
+#X obj 86 2170 #perspective;
+#X text 180 2170 divide each point by its depth;
+#X obj 80 2202 #polygon_area;
+#X text 180 2202 find area of a polygon in square pixels;
+#X obj 44 2234 #polygon_comparator;
+#X text 180 2234 find similarity between two polygons independently of rotation \, by radial maps and FFT;
+#X obj 50 2266 #polygon_each_edge;
+#X text 180 2266 convert a polygon to a sequence of overlapping 2-sided polygons representing edges;
+#X obj 68 2298 #polygon_moment;
+#X text 180 2298 find average of all points inside of a polygon;
+#X obj 50 2330 #polygon_perimetre;
+#X text 180 2330 find perimetre of a polygon in pixels (euclidian);
+#X obj 44 2362 #polygon_radial_map;
+#X text 180 2362 find radius of a polygon from a given origin \, sampled at equally spaced angles;
+#X obj 98 2394 #posterize;
+#X text 180 2394 quantise pixel values;
+#X obj 122 2426 #print;
+#X text 180 2426 print to console;
+#X obj 122 2458 #ravel;
+#X text 180 2458 do #redim so that a grid keeps same number of elements but just one dimension;
+#X obj 116 2490 #record;
+#X text 180 2490 wrapper around [#in quicktime];
+#X obj 104 2522 #redim ();
+#X text 180 2522 change the size of a grid by restreaming contents into a new shape;
+#X obj 92 2554 #reinterval;
+#X text 180 2554 ;
+#X obj 86 2586 #remap_image;
+#X text 180 2586 apply object chain on pixel positions to make new image from chosen pixels of the input image;
+#X obj 110 2618 #reverse;
+#X text 180 2618 mirror image of a grid along a dimension;
+#X obj 56 2650 #rgb_to_greyscale;
+#X text 180 2650 convert RGB to greyscale;
+#X obj 86 2682 #rgb_to_rgba;
+#X text 180 2682 convert RGB to RGBA (but setting alpha to 0);
+#X obj 92 2714 #rgb_to_yuv;
+#X text 180 2714 convert RGB to unsigned YUV;
+#X obj 86 2746 #rgba_to_rgb;
+#X text 180 2746 convert RGBA to RGB;
+#X obj 116 2778 #rotate;
+#X text 180 2778 rotate points through two axes (or rotate pixels as points in a colorspace);
+#X obj 74 2810 #rotatificator;
+#X text 180 2810 make rotation matrix for any two dimensions chosen from a space of any number of dimensions;
+#X obj 92 2842 #saturation;
+#X text 180 2842 multiply chroma by some value;
+#X obj 104 2874 #scale_by;
+#X text 180 2874 reduce the size of an image by a whole factor;
+#X obj 104 2906 #scale_to;
+#X text 180 2906 scale an image from one size to any other size by deleting or duplicating rows and columns;
+#X obj 116 2938 #scan +;
+#X text 180 2938 compute the cumulative sums of each row \, and other similar operations;
+#X obj 104 2970 #seq_fold;
+#X text 180 2970 cascade the use of an object on all elements of an incoming grid message sequence;
+#X obj 122 3002 #slice;
+#X text 180 3002 crop an image using a start point (top left) and end point (bottom right);
+#X obj 104 3034 #solarize;
+#X text 180 3034 like pingpong but on all pixel values of a grid;
+#X obj 128 3066 #sort;
+#X text 180 3066 sort each row of a grid;
+#X obj 116 3098 #spread;
+#X text 180 3098 add noise to each vector (point or pixel);
+#X obj 122 3130 #store;
+#X text 180 3130 store image in RAM \, in-place picture-in-picture, and make lookups in various ways;
+#X obj 128 3162 #swap;
+#X text 180 3162 like [swap] for grids;
+#X obj 140 3194 #t;
+#X text 180 3194 like [t a a] for grids;
+#X obj 74 3226 #text_to_image;
+#X text 180 3226 use a fixed-width font grid to make a tiling of characters as specified by a text string;
+#X obj 104 3258 #to_float;
+#X text 180 3258 convert grid to sequence of floats;
+#X obj 110 3290 #to_list;
+#X text 180 3290 convert grid to list;
+#X obj 92 3322 #to_literal;
+#X text 180 3322 convert grid to grid-literal (list with a # sign);
+#X obj 116 3354 #to_pix;
+#X text 180 3354 convert grid to pix (GEM);
+#X obj 98 3386 #to_symbol;
+#X text 180 3386 convert grid of ASCII codes to symbol;
+#X obj 98 3418 #transpose;
+#X text 180 3418 swap two dimensions out of any \, in a grid;
+#X obj 128 3450 #type;
+#X text 180 3450 get a symbol representing the number type of a grid;
+#X obj 116 3482 #unpack;
+#X text 180 3482 split a grid into floats on separate outlets;
+#X obj 116 3514 #window;
+#X text 180 3514 a [#out window] that can be toggled to appear and disappear;
+#X obj 92 3546 #yuv_to_rgb;
+#X text 180 3546 convert unsigned YUV to RGB;
+#X obj 134 3578 args;
+#X text 180 3578 pick up the arguments of an abstraction instance \, including nested lists and init-messages;
+#X obj 128 3610 ascii;
+#X text 180 3610 write integer as decimal in ascii codes;
+#X obj 98 3642 ascii_to_f;
+#X text 180 3642 converts a list of ascii codes to a float;
+#X obj 86 3674 class_exists;
+#X text 180 3674 figure out whether a class has been loaded by pd;
+#X obj 116 3706 cv/#Add;
+#X text 180 3706 OpenCV addition;
+#X obj 116 3738 cv/#And;
+#X text 180 3738 OpenCV bitwise AND;
+#X obj 74 3770 cv/#ApproxPoly;
+#X text 180 3770 ;
+#X obj 62 3802 cv/#CornerHarris;
+#X text 180 3802 ;
+#X obj 116 3834 cv/#Div;
+#X text 180 3834 OpenCV division;
+#X obj 92 3866 cv/#Ellipse;
+#X text 180 3866 OpenCV draw ellipse;
+#X obj 32 3898 cv/#HaarDetectObjects;
+#X text 180 3898 OpenCV (future use);
+#X obj 98 3930 cv/#Invert;
+#X text 180 3930 OpenCV invert matrix;
+#X obj 98 3962 cv/#KMeans;
+#X text 180 3962 OpenCV K-Means clusteriser;
+#X obj 98 3994 cv/#Kalman;
+#X text 180 3994 OpenCV (future use);
+#X obj 116 4026 cv/#Mul;
+#X text 180 4026 OpenCV multiplication;
+#X obj 122 4058 cv/#Or;
+#X text 180 4058 OpenCV bitwise OR;
+#X obj 116 4090 cv/#SVD;
+#X text 180 4090 OpenCV singular value decomposition (eigendecomposition);
+#X obj 116 4122 cv/#Sub;
+#X text 180 4122 OpenCV subtraction;
+#X obj 116 4154 cv/#Xor;
+#X text 180 4154 OpenCV bitwise XOR;
+#X obj 116 4186 display;
+#X text 180 4186 print message or grid inside of the patch;
+#X obj 122 4218 expect;
+#X text 180 4218 currently does like list.== (will do more than that in the future);
+#X obj 140 4250 for;
+#X text 180 4250 make sequence of float messages for each number in a range with specified stepping;
+#X obj 116 4282 foreach;
+#X text 180 4282 convert a list to a sequence of atom messages;
+#X obj 140 4314 fps;
+#X text 180 4314 measure frames per second and make statistics;
+#X obj 110 4346 gf.error;
+#X text 180 4346 emit error message from the perspective of the current abstraction instance in its parent patch;
+#X obj 74 4378 gf.io_generate;
+#X text 180 4378 for internal use by #in and #out;
+#X obj 98 4410 gf.oneshot;
+#X text 180 4410 spigot that shuts itself down after each message;
+#X obj 62 4442 gf.suffix_lookup;
+#X text 180 4442 find the objectclass corresponding ;
+#X obj 74 4474 hpgl_find_bbox;
+#X text 180 4474 ;
+#X obj 62 4506 hpgl_font_render;
+#X text 180 4506 ;
+#X obj 116 4538 hpgl_op;
+#X text 180 4538 ;
+#X obj 44 4570 hpgl_track_position;
+#X text 180 4570 ;
+#X obj 62 4602 interval_overlap;
+#X text 180 4602 ;
+#X obj 134 4634 inv*;
+#X text 180 4634 swapped /;
+#X obj 134 4666 inv+;
+#X text 180 4666 swapped -;
+#X obj 116 4698 list.==;
+#X text 180 4698 test two lists of floats and/or symbols for equality;
+#X obj 110 4730 listfind;
+#X text 180 4730 find index of an element in a list;
+#X obj 92 4762 listflatten;
+#X text 180 4762 merge all nested lists together \, depth-first;
+#X obj 110 4794 listread;
+#X text 180 4794 find element at an index in a list;
+#X obj 92 4826 listreverse;
+#X text 180 4826 mirror image of a list;
+#X obj 104 4858 norecurse;
+#X text 180 4858 ;
+#X obj 80 4890 parallel_port;
+#X text 180 4890 send to and receive from a DB25 parallel port;
+#X obj 110 4922 pingpong;
+#X text 180 4922 turns value of a counter into a zigzag between 0 and a given value;
+#X obj 68 4954 plotter_control;
+#X text 180 4954 make HPGL commands;
+#X obj 74 4986 plotter_parser;
+#X text 180 4986 interprets ascii codes as HPGL commands and output them as messages;
+#X obj 128 5018 range;
+#X text 180 5018 multiple moses in cascade;
+#X obj 86 5050 receives \$0-;
+#X text 180 5050 multiple receives with common outlet and other outlet telling the name of intended destination;
+#X obj 122 5082 route2;
+#X text 180 5082 route messages but keep them intact (does not remove selector);
+#X obj 110 5114 seq_fold;
+#X text 180 5114 cascade the use of an object on all elements of an incoming message sequence;
+#X obj 128 5146 shunt;
+#X text 180 5146 demultiplexer: send input to separately specified outlet;
+#X obj 98 5178 systemtime;
+#X text 180 5178 time spent by process in kernel mode \, as measured by the OS;
+#X obj 116 5210 tsctime;
+#X text 180 5210 high-resolution real time \, as measured by the CPU;
+#X obj 104 5242 unix_time;
+#X text 180 5242 real time as measured by the OS \, including date;
+#X obj 110 5274 usertime;
+#X text 180 5274 time spent by process in non-kernel mode \, as measured by the OS;
+#X obj 128 5306 var.#;
+#X text 180 5306 like [f] for grids;
diff --git a/externals/gridflow/doc/locale/english.tcl b/externals/gridflow/doc/locale/english.tcl
new file mode 100644
index 00000000..87324620
--- /dev/null
+++ b/externals/gridflow/doc/locale/english.tcl
@@ -0,0 +1,210 @@
+# 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 a space of any number of dimensions"
+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/#Mul "OpenCV multiplication"
+say cv/#Sub "OpenCV subtraction"
+say cv/#And "OpenCV bitwise AND"
+say cv/#Or "OpenCV bitwise OR"
+say cv/#Xor "OpenCV bitwise XOR"
+say cv/#Invert "OpenCV invert matrix"
+say cv/#SVD "OpenCV singular value decomposition (eigendecomposition)"
+say cv/#Ellipse "OpenCV draw ellipse"
+say cv/#KMeans "OpenCV K-Means clusteriser"
+say cv/#HaarDetectObjects "OpenCV (future use)"
+say cv/#Kalman "OpenCV (future use)"
+say cv/#ApproxPoly ""
+say cv/#CornerHarris ""
+
+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"
+
+say #apply_colormap_channelwise ""
+say #cluster_avg ""
+say #draw_hpgl ""
+say #extract_diagonal ""
+say #reinterval ""
+say hpgl_find_bbox ""
+say hpgl_font_render ""
+say hpgl_op ""
+say hpgl_track_position ""
+say interval_overlap ""
+say norecurse ""
diff --git a/externals/gridflow/doc/make_index.tcl b/externals/gridflow/doc/make_index.tcl
new file mode 100644
index 00000000..8b95003e
--- /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 560 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*6+2}]
+ if {$k == "#color"} {set w 156}
+ puts "#X obj [expr 160-$w] $y $k;"
+ regsub "," $v " \\, " v
+ regsub ";" $v " \\; " v
+ regsub "\\$" $v "\\$" v
+ puts "#X text 180 $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/stuff.txt b/externals/gridflow/doc/stuff.txt
new file mode 100644
index 00000000..2a495735
--- /dev/null
+++ b/externals/gridflow/doc/stuff.txt
@@ -0,0 +1,144 @@
+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.
+
+
+Introduction
+
+ 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.
+
+ 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.
+
+ 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.
+
+ 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.
+
+ 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.
+
+ 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 Grids
+ (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.
+
+ Here is an example of how things work in GridFlow. (if you want more
+ information, consult the rest of this manual)
+
+ A picture is a three-dimensional Grid:
+ 0 : rows
+ 1 : columns
+ 2 : channels
+
+ Pictures come in all sorts of heights and widths. The channels, however,
+ are more limited in number. Usually it's three: Red, Green, Blue.
+
+ 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.
+
+ 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 _within_ the
+ PureData / GridFlow framework. You don't need to wait for me.
+
+
+GridFlow Release
+
+dir=gridflow-0.9.6; tag=gridflow_0_9_6
+svn copy svn+ssh://gridflow.ca/home/svn/gridflow/trunk svn+ssh://gridflow.ca/home/svn/gridflow/tags/$tag/
+svn export svn+ssh://gridflow.ca/home/svn/gridflow/tags/$tag/ $dir
+chmod -R go=u-w $dir && tar cfzvv $dir.tar.gz $dir && rm -rf $dir
+scp $dir.tar.gz gridflow@artengine.ca:public_html/download
+mv $dir.tar.gz /home/matju/GridFlow
+cd doc/homepage; pico index.html; make install
+
+download somewhere else and try to compile
+pd-announce mlist : post release
+
+Committed revision 4239.
+Warning: 'post-commit' hook failed with error output:
+/home/svn/gridflow/hooks/post-commit: line 49: /home/svn/gridflow/hooks/svn-mailer.log: Permission denied
+
+svn copy svn+ssh://gridflow.ca/home/svn/gridflow/tags/$tag/ https://pure-data.svn.sourceforge.net/svnroot/pure-data/trunk/externals/gridflow/
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;