diff --git a/doc/.gitignore b/doc/.gitignore
deleted file mode 100644
index 72e8ffc0db8aad71a934dd11e5968bd5109e54b4..0000000000000000000000000000000000000000
--- a/doc/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d2dad7c4312e95ecd265718def4df5fa989610f7
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,306 @@
+#==============================================================================#
+#
+# Centralized build system for "doc".  
+#
+# see for instructions: http://puredata.org/docs/developer/build
+#  <hans@at.or.at>
+#
+#==============================================================================#
+
+CWD := $(shell pwd)
+
+# these are designed to be overridden by the packages/Makefile
+cvs_root_dir := $(shell cd $(CWD)/.. && pwd)
+DESTDIR = $(CWD)/build/
+BUILDLAYOUT_DIR = $(cvs_root_dir)/packages
+
+CURL := curl --connect-timeout 600 --max-time 3600
+
+# default target
+all:
+	@echo "this currently does nothing"
+
+include $(BUILDLAYOUT_DIR)/Makefile.buildlayout
+
+#==============================================================================#
+#
+# OVERARCHING BUILD TARGETS
+#
+#==============================================================================#
+
+DOC_TARGETS = media messageoddness pd_fileformat pd-msg pddp \
+tutorials
+
+# clean up after everything is installed
+final_setup:
+	chmod -R ugo-w $(pddocdir)
+
+install: $(objectsdir) $(helpdir) $(manualsdir) $(examplesdir) \
+$(patsubst %, %_install,$(DOC_TARGETS))
+	@echo " "
+	@echo "doc install succeeded!"
+
+
+#==============================================================================#
+#
+# PROJECT-SPECIFIC TARGETS
+#
+#==============================================================================#
+
+
+#------------------------------------------------------------------------------#
+# TEMPLATE
+TEMPLATE_NAME = template
+template_install: $(manualsdir)
+	install -d $(helpdir)$(manualsdir)/$(TEMPLATE_NAME)
+	install -p $(doc_src)/template/*.* \
+		$(helpdir)$(manualsdir)/$(TEMPLATE_NAME) 
+
+template_clean:
+	-rm -f -- $(helpdir)$(manualsdir)/$(TEMPLATE_NAME)/*.*
+	-rmdir --	$(helpdir)$(manualsdir)/$(TEMPLATE_NAME) 
+
+
+
+
+#------------------------------------------------------------------------------#
+# EXTERNALS-HOWTO
+EXTERNALS-HOWTO_NAME = Externals-HOWTO
+externals-howto_install: $(manualsdir)
+	install -d $(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/pd-externals-HOWTO.pdf > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/pd-externals-HOWTO.pdf
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/HOWTO-externals-en.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/HOWTO-externals-en.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node1.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node1.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node2.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node2.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node3.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node3.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node4.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node4.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node5.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node5.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node6.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node6.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node7.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node7.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node8.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node8.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node9.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node9.html
+	-$(CURL) http://iem.kug.ac.at/pd/externals-HOWTO/node10.html > \
+		$(DESTDIR)$(manualsdir)/$(EXTERNALS-HOWTO_NAME)/node10.html
+
+externals-howto_clean:
+
+
+
+
+#------------------------------------------------------------------------------#
+# MEDIA
+MEDIA_NAME = media
+media_install: $(pddocdir)
+	install -d $(DESTDIR)$(pddocdir)/$(MEDIA_NAME)
+	install -p $(doc_src)/media/*.* \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME) 
+# ln is cp on MinGW, so these won't work since the target files don't exist at
+# the time that the media_install target is generally run. For MinGW, this is
+# instead handled in packages/win32_inno/pd-inno.iss.in
+ifneq (MINGW,$(findstring MINGW,$(UNAME)))
+# random sound files
+	ln -sf ../../doc/sound/bell.aiff \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/bell.aiff
+	ln -sf ../../doc/sound/voice.wav \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/voice.wav
+	ln -sf ../../doc/sound/voice2.wav \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/voice2.wav
+	ln -sf ../../extra/bsaylor/examples/noiseburst.wav \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/noiseburst.wav
+	ln -sf ../../extra/ekext/examples/stink.wav \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/stink.wav
+	ln -sf ../../extra/ekext/examples/beauty.wav \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/beauty.wav
+	ln -sf ../../extra/ekext/examples/drummach.wav \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/drummach.wav
+# Gem videos
+	ln -sf ../../extra/Gem/examples/data/alea.mpg \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/alea.mpg
+	ln -sf ../../extra/Gem/examples/data/homer.avi \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/homer.avi
+	ln -sf ../../extra/Gem/examples/data/anim-1.mov \
+		$(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/anim-1.mov
+endif
+
+media_clean:
+	-rm -f -- $(DESTDIR)$(pddocdir)/$(MEDIA_NAME)/*.*
+	-rmdir --	$(DESTDIR)$(pddocdir)/$(MEDIA_NAME) 
+
+
+
+
+#------------------------------------------------------------------------------#
+# MESSAGEODDNESS
+MESSAGEODDNESS_NAME = MessageOddness
+messageoddness_install: $(manualsdir)
+	install -d $(DESTDIR)$(manualsdir)/$(MESSAGEODDNESS_NAME)
+	install -p $(doc_src)/additional/messageoddness/*.* \
+		$(DESTDIR)$(manualsdir)/$(MESSAGEODDNESS_NAME) 
+
+messageoddness_clean:
+	-rm -f -- $(DESTDIR)$(manualsdir)/$(MESSAGEODDNESS_NAME)/*.*
+	-rmdir --	$(DESTDIR)$(manualsdir)/$(MESSAGEODDNESS_NAME) 
+
+
+
+
+#------------------------------------------------------------------------------#
+# PD-MSG
+PD-MSG_NAME = pd-msg
+pd-msg_install: $(manualsdir)
+	install -d $(DESTDIR)$(manualsdir)/$(PD-MSG_NAME)
+	install -p $(doc_src)/additional/pd-msg/*.txt \
+		$(DESTDIR)$(manualsdir)/$(PD-MSG_NAME) 
+	for dir in $(shell cd  $(doc_src)/additional/pd-msg && ls -d [1-5].*); do \
+		echo "Including $$dir in $(PD-MSG_NAME)"; \
+		install -d $(DESTDIR)$(manualsdir)/$(PD-MSG_NAME)/$$dir; \
+		install -p $(doc_src)/additional/pd-msg/$$dir/*.* \
+			$(DESTDIR)$(manualsdir)/$(PD-MSG_NAME)/$$dir; \
+	done
+
+pd-msg_clean:
+
+
+#------------------------------------------------------------------------------#
+# PD_FILEFORMAT
+PD_FILEFORMAT_NAME = Pd
+pd_fileformat_install: $(manualsdir)
+	install -d $(DESTDIR)$(manualsdir)/$(PD_FILEFORMAT_NAME)
+	install -p $(doc_src)/additional/pd-fileformat.html \
+		$(DESTDIR)$(manualsdir)/$(PD_FILEFORMAT_NAME)/Pd_File_Format.html
+
+pd_fileformat_clean:
+
+
+#------------------------------------------------------------------------------#
+# PDDP
+pddp_install: $(helpdir)
+	install -p $(doc_src)/pddp/*.pd $(DESTDIR)$(helpdir)
+# this file is used in key-help.pd
+	install -p $(doc_src)/pddp/glossary.txt $(DESTDIR)$(helpdir)
+	install -p $(doc_src)/pddp/keyboard_fun.txt $(DESTDIR)$(helpdir)
+
+pddp_clean:
+
+
+
+
+#------------------------------------------------------------------------------#
+# TUTORIALS
+tutorials_install: $(manualsdir)
+# start-here
+	install -d "$(DESTDIR)$(manualsdir)/StartHere"
+	install -p $(doc_src)/tutorials/start-here/*.* "$(DESTDIR)$(manualsdir)/StartHere"
+# pddrums
+	install -d $(DESTDIR)$(manualsdir)/PdDrums
+	install -p $(doc_src)/tutorials/footils/pddrums/*.* $(DESTDIR)$(manualsdir)/PdDrums
+# playnow
+	install -d $(DESTDIR)$(manualsdir)/PlayNow
+	install -p $(doc_src)/tutorials/playnow/*.* $(DESTDIR)$(manualsdir)/PlayNow
+# cognition
+	install -d $(DESTDIR)$(manualsdir)/Cognition
+	install -p $(doc_src)/tutorials/cognition/*.* $(DESTDIR)$(manualsdir)/Cognition
+# intro
+	install -d $(DESTDIR)$(manualsdir)/0.Intro
+	install -p $(doc_src)/tutorials/intro/*.* $(DESTDIR)$(manualsdir)/0.Intro
+	install -p $(externals_src)/pddp/+pager.pd $(DESTDIR)$(manualsdir)/0.Intro
+# sound
+	install -d $(DESTDIR)$(manualsdir)/1.Sound
+	install -p $(doc_src)/tutorials/sound/*.* $(DESTDIR)$(manualsdir)/1.Sound
+	install -p $(externals_src)/pddp/+pager.pd $(DESTDIR)$(manualsdir)/1.Sound
+# visual
+	install -d $(DESTDIR)$(manualsdir)/2.Image
+	install -p $(doc_src)/tutorials/visual/*.* $(DESTDIR)$(manualsdir)/2.Image
+	install -p $(externals_src)/pddp/+pager.pd $(DESTDIR)$(manualsdir)/2.Image
+# networking
+	install -d $(DESTDIR)$(manualsdir)/3.Networking
+	install -p $(doc_src)/tutorials/networking/*.* $(DESTDIR)$(manualsdir)/3.Networking
+	install -p $(externals_src)/pddp/+pager.pd $(DESTDIR)$(manualsdir)/3.Networking
+# physical
+#	install -d $(manualsdir)/4.Physical
+#	install -p $(doc_src)/tutorials/physical/*.* $(manualsdir)/4.Physical
+#	install -p $(externals_src)/pddp/+pager.pd $(manualsdir)/4.Physical
+
+tutorials_clean:
+	-rm -f -- $(DESTDIR)$(manualsdir)/PdDrums/*.*
+	-rmdir -- $(DESTDIR)$(manualsdir)/PdDrums
+	-rm -f -- $(DESTDIR)$(manualsdir)/PlayNow/*.*
+	-rmdir -- $(DESTDIR)$(manualsdir)/PlayNow
+	-rm -f -- $(DESTDIR)$(manualsdir)/0.Intro/*.*
+	-rmdir -- $(DESTDIR)$(manualsdir)/0.Intro
+	-rm -f -- $(DESTDIR)$(manualsdir)/1.Sound/*.*
+	-rmdir -- $(DESTDIR)$(manualsdir)/1.Sound
+	-rm -f -- $(DESTDIR)$(manualsdir)/0.Intro/Visual/*.*
+	-rmdir -- $(DESTDIR)$(manualsdir)/0.Intro/Visual
+	-rm -f -- $(DESTDIR)$(manualsdir)/3.Networking/*.*
+	-rmdir -- $(DESTDIR)$(manualsdir)/3.Networking
+	-rm -f -- $(DESTDIR)$(manualsdir)/4.Physical/*.*
+	-rmdir -- $(DESTDIR)$(manualsdir)/4.Physical
+
+
+#==============================================================================#
+#
+# DEVELOPER'S TARGETS
+#
+#==============================================================================#
+
+# make the symlinks necessary to simulate the installed environment
+devsymlinks:
+	test -e $(doc_src)/2.control.examples || \
+		ln -sf $(pd_src)/doc/2.control.examples $(doc_src)/2.control.examples
+	test -e $(doc_src)/3.audio.examples || \
+		ln -sf $(pd_src)/doc/3.audio.examples $(doc_src)/3.audio.examples
+# pd <= 0.38-4 has 4.fft.examples
+	test -e $(doc_src)/4.fft.examples || \
+		ln -sf $(pd_src)/doc/4.fft.examples $(doc_src)/4.fft.examples
+# pd > 0.38-4 has 4.data.structures
+	test -e $(doc_src)/4.data.structures || \
+		ln -sf $(pd_src)/doc/4.data.structures $(doc_src)/4.data.structures
+	test -e $(doc_src)/7.stuff || \
+		ln -sf $(pd_src)/doc/7.stuff $(doc_src)/7.stuff
+	test -e $(doc_src)/sound || \
+		ln -sf $(pd_src)/doc/sound $(doc_src)/sound
+# put the pddp support objects in the path
+	test -e $(doc_src)/pddp/pddp || \
+		ln -sf $(externals_src)/pddp $(doc_src)/pddp/pddp
+
+#==============================================================================#
+#
+# CLEAN TARGETS
+#
+#==============================================================================#
+
+# the destination-specific clean targets are in Makefile.buildlayout
+clean: $(patsubst %, %_clean,$(DOC_TARGETS))
+
+distclean: clean cruft_clean
+
+
+
+
+test_locations:
+	@echo "PD_VERSION: $(PD_VERSION)"
+	@echo "PACKAGE_VERSION: $(PACKAGE_VERSION)"
+	@echo "CWD $(CWD)"
+	@echo "DESTDIR $(DESTDIR)"
+	@echo "PREFIX $(prefix)"
+	@echo "BINDIR  $(bindir)"
+	@echo "LIBDIR  $(libdir)"
+	@echo "OBJECTSDIR  $(objectsdir)"
+	@echo "PDDOCDIR  $(pddocdir)"
+	@echo "LIBPDDIR  $(libpddir)"
+	@echo "LIBPDBINDIR  $(libpdbindir)"
+	@echo "HELPDIR  $(helpdir)"
+	@echo "MANUALSDIR  $(manualsdir)"
+	@echo "EXAMPLESDIR  $(examplesdir)"
diff --git a/doc/TODO b/doc/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..a6a3a76776d8bff5042487f75cbb081e1d139f91
--- /dev/null
+++ b/doc/TODO
@@ -0,0 +1,19 @@
+
+- add externals HOWTO to manuals/Pd
+
+- create Makefile for Pd-extended build system
+
+- add pd-fileformat doc: http://student-kmt.hku.nl/%7Etjeerd/pd/pd_fileformat.html
+
+- replace [pddp] with "pddp" in all help files so that it doesn't cause bugs
+  with the pddp/pddp.pd meta file, and other things in the future.  Here's a
+  pattern:  sed -n 's|obj \([0-9]*\) \([0-9]*\) pddp;|msg \1 \2 pddp;|p' *.pd
+
+- add doc/pddp/about, help, etc. to doc/Makefile
+
+- mv doc/pddp/pddp.pd to doc/pddp/about/pddp-about.pd
+
+- add [symbol 1( and [1 ( test messages to the bottom right example in 
+  [pd some odd cases of list handling] in
+  doc/pddp/all_about_lists_vs_anythings.pd
+
diff --git a/doc/additional/messageoddness/float-precision-misrepresentation.pd b/doc/additional/messageoddness/float-precision-misrepresentation.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4deb40bc878c097cdccb08501fdf8cee862a59f5
--- /dev/null
+++ b/doc/additional/messageoddness/float-precision-misrepresentation.pd
@@ -0,0 +1,22 @@
+#N canvas 389 283 450 300 10;
+#X msg 173 54 0.999999;
+#X obj 173 86 + 9e-07;
+#X floatatom 164 184 15 0 0 0 - - -;
+#X obj 135 215 pddp/print;
+#X obj 112 245 nbx 15 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0
+10 -262144 -1 -1 1 256;
+#X obj 98 264 print LEFT;
+#X obj 269 182 print RIGHT;
+#X text 51 5 there is a disconnect between the precision that can be
+displayed in Pd and the precision of the math that is happening behind
+the scenes:;
+#X floatatom 187 113 15 0 0 0 - - -;
+#X obj 173 147 moses 1;
+#X connect 0 0 1 0;
+#X connect 1 0 8 0;
+#X connect 1 0 9 0;
+#X connect 9 0 2 0;
+#X connect 9 0 3 0;
+#X connect 9 0 4 0;
+#X connect 9 0 5 0;
+#X connect 9 1 6 0;
diff --git a/doc/additional/messageoddness/inconsistent_numeric_symbols.pd b/doc/additional/messageoddness/inconsistent_numeric_symbols.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0bd25bdb9fda1f944a9c948274d822267dbe3fa0
--- /dev/null
+++ b/doc/additional/messageoddness/inconsistent_numeric_symbols.pd
@@ -0,0 +1,46 @@
+#N canvas 279 119 474 393 10;
+#X obj 82 96 makefilename %c;
+#X msg 81 75 55;
+#X floatatom 142 303 5 0 0 0 - - -;
+#X symbolatom 190 302 10 0 0 0 - - -;
+#X obj 95 323 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X obj 95 279 route bang float symbol list;
+#X obj 142 323 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 190 323 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 238 323 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 286 323 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X text 195 93 makes a symbol of the ascii char '7';
+#X msg 108 136 symbol 7;
+#X msg 132 222 7;
+#X obj 132 243 symbol;
+#X text 184 243 makes a symbol of the word 'float';
+#X obj 31 279 print;
+#X obj 124 176 symbol 7;
+#X msg 123 157 bang;
+#X text 197 157 these both make a blank symbol;
+#X text 11 11 All of these create a symbol \, but they create totally
+different symbols. It seems that only [makefilename] does the correct
+thing.;
+#X connect 0 0 5 0;
+#X connect 0 0 15 0;
+#X connect 1 0 0 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X connect 5 0 4 0;
+#X connect 5 1 2 0;
+#X connect 5 2 3 0;
+#X connect 5 3 8 0;
+#X connect 5 4 9 0;
+#X connect 11 0 5 0;
+#X connect 11 0 15 0;
+#X connect 12 0 13 0;
+#X connect 13 0 5 0;
+#X connect 13 0 15 0;
+#X connect 16 0 5 0;
+#X connect 16 0 15 0;
+#X connect 17 0 16 0;
diff --git a/doc/additional/messageoddness/list_must_have_2_or_more_elements.pd b/doc/additional/messageoddness/list_must_have_2_or_more_elements.pd
new file mode 100644
index 0000000000000000000000000000000000000000..da0dee16201ab96ff38e057d3d1ca326b428a487
--- /dev/null
+++ b/doc/additional/messageoddness/list_must_have_2_or_more_elements.pd
@@ -0,0 +1,74 @@
+#N canvas 271 55 464 710 10;
+#X floatatom 243 167 5 0 0 0 - - -;
+#X symbolatom 291 166 10 0 0 0 - - -;
+#X obj 196 187 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X obj 196 143 route bang float symbol list;
+#X obj 243 187 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 291 187 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 339 187 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 387 187 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X text 24 35 There are no 0- or 1-element lists. These are immediately
+converted to other types:;
+#X msg 195 75 list;
+#X msg 202 96 list 2;
+#X msg 207 115 list word;
+#X floatatom 11 147 5 0 0 0 - - -;
+#X symbolatom 77 147 10 0 0 0 - - -;
+#X obj 11 165 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 77 165 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 19 244 Therefore \, the definition of list is: a series of
+elements with a selector of "list" and 2 or more elements. (But don't
+forget! A series whose element is a float has an implied "list" selector!)
+;
+#X obj 123 373 select;
+#X msg 157 343 list;
+#X msg 122 344 bang;
+#X msg 247 343 list;
+#X msg 212 344 bang;
+#X obj 213 373 print;
+#X msg 73 429 3;
+#X msg 106 428 list 3;
+#X obj 59 471 *;
+#X msg 223 429 3;
+#X msg 256 428 list 3;
+#X obj 208 481 *~;
+#X text 19 311 These two disagree about 0 element lists:;
+#X text 19 401 These two disagree about 1 element lists:;
+#X obj 140 597 route 1;
+#X msg 140 575 1 3;
+#X obj 125 622 *~;
+#X text 24 528 [route] doesn't seem to automatically convert 1 element
+lists:;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 3 0 2 0;
+#X connect 3 1 0 0;
+#X connect 3 2 1 0;
+#X connect 3 3 6 0;
+#X connect 3 4 7 0;
+#X connect 9 0 3 0;
+#X connect 9 0 13 0;
+#X connect 9 0 12 0;
+#X connect 10 0 3 0;
+#X connect 10 0 12 0;
+#X connect 11 0 3 0;
+#X connect 11 0 13 0;
+#X connect 12 0 14 0;
+#X connect 13 0 15 0;
+#X connect 18 0 17 1;
+#X connect 19 0 17 1;
+#X connect 20 0 22 0;
+#X connect 21 0 22 0;
+#X connect 23 0 25 1;
+#X connect 24 0 25 1;
+#X connect 26 0 28 1;
+#X connect 27 0 28 1;
+#X connect 31 0 33 1;
+#X connect 32 0 31 0;
diff --git a/doc/additional/messageoddness/message_arguments_need_lists.pd b/doc/additional/messageoddness/message_arguments_need_lists.pd
new file mode 100644
index 0000000000000000000000000000000000000000..497ed390c46095897a69138efdafa6b5f76c47dd
--- /dev/null
+++ b/doc/additional/messageoddness/message_arguments_need_lists.pd
@@ -0,0 +1,16 @@
+#N canvas 220 136 605 423 10;
+#X obj 190 245 print message;
+#X msg 190 58 list x.wav 44100;
+#X msg 223 118 x.wav 44100;
+#X msg 189 159 read \$1 \$2;
+#X msg 202 79 44100 x.wav;
+#X text 119 33 message arguments only work with lists.;
+#X text 318 56 declared list;
+#X text 314 79 implied list;
+#X text 307 118 undefined list;
+#X text 77 68 these work -->;
+#X text 68 120 this does not -->;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
diff --git a/doc/additional/messageoddness/multiple_delay_bang_weird.pd b/doc/additional/messageoddness/multiple_delay_bang_weird.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a8c187c667c1912e524ca34d7dc9c53ee278684a
--- /dev/null
+++ b/doc/additional/messageoddness/multiple_delay_bang_weird.pd
@@ -0,0 +1,90 @@
+#N canvas 238 303 753 580 10;
+#X obj 63 224 float;
+#X floatatom 63 252 5 0 0 0 - - -;
+#X obj 102 224 + 1;
+#X obj 62 274 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144 -1
+-1;
+#X obj 35 166 bang;
+#X obj 81 167 bang;
+#X obj 59 124 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144 -1
+-1;
+#X obj 220 232 float;
+#X floatatom 220 260 5 0 0 0 - - -;
+#X obj 259 232 + 1;
+#X obj 219 282 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 224 123 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 180 165 delay 1000;
+#X obj 261 166 delay 1000;
+#X msg 90 199 0;
+#X text 118 199 reset;
+#X msg 247 208 0;
+#X text 275 208 reset;
+#X obj 550 231 float;
+#X floatatom 550 259 5 0 0 0 - - -;
+#X obj 589 231 + 1;
+#X obj 549 281 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 554 122 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 510 164 delay 1000;
+#X obj 591 165 delay 1000;
+#X msg 577 207 0;
+#X text 605 207 reset;
+#X obj 449 171 bang;
+#X text 80 68 counts twice per bang button click:;
+#X text 451 70 but this counts once:;
+#X obj 102 445 float;
+#X floatatom 102 473 5 0 0 0 - - -;
+#X obj 141 445 + 1;
+#X obj 101 495 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 106 336 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X msg 129 421 0;
+#X text 157 421 reset;
+#X obj 62 378 metro 1000;
+#X obj 143 379 metro 1000;
+#X text 317 334 The first [delay] triggers the execution \, which ultimately
+sends a bang to the second [delay] \, which hasn't fired yet. When
+the second [delay] receives that bang \, it resets its timer. Therefore
+\, the second [delay] never fires.;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 1;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 10 0;
+#X connect 9 0 7 1;
+#X connect 11 0 12 0;
+#X connect 11 0 13 0;
+#X connect 12 0 7 0;
+#X connect 13 0 7 0;
+#X connect 14 0 0 1;
+#X connect 16 0 7 1;
+#X connect 18 0 19 0;
+#X connect 18 0 20 0;
+#X connect 18 0 27 0;
+#X connect 19 0 21 0;
+#X connect 20 0 18 1;
+#X connect 22 0 23 0;
+#X connect 22 0 24 0;
+#X connect 23 0 18 0;
+#X connect 24 0 18 0;
+#X connect 25 0 18 1;
+#X connect 27 0 22 0;
+#X connect 30 0 31 0;
+#X connect 30 0 32 0;
+#X connect 31 0 33 0;
+#X connect 32 0 30 1;
+#X connect 34 0 37 0;
+#X connect 34 0 38 0;
+#X connect 35 0 30 1;
+#X connect 37 0 30 0;
+#X connect 38 0 30 0;
diff --git a/doc/additional/messageoddness/mystery_type_after_conversion.pd b/doc/additional/messageoddness/mystery_type_after_conversion.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b1960d6ae2f2abcbbd294039da719c72094cdc2a
--- /dev/null
+++ b/doc/additional/messageoddness/mystery_type_after_conversion.pd
@@ -0,0 +1,78 @@
+#N canvas 478 110 624 399 10;
+#X msg 65 79 1234;
+#X obj 20 285 print;
+#X obj 66 245 list trim;
+#X floatatom 113 309 5 0 0 0 - - -;
+#X symbolatom 161 308 10 0 0 0 - - -;
+#X obj 66 329 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X obj 66 285 route bang float symbol list;
+#X obj 113 329 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 161 329 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 209 329 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 257 329 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X text 19 8 If you start with a symbolic atom in a symbol message
+\, then run it thru a [list trim] \, you end up with a mystery type
+that is just a numeric atom \, but does not work as a float message.
+;
+#X text 184 93 <-- this generates a symbolic atom with numeric data
+\, and outputs a symbol message.;
+#X obj 65 112 makefilename %d;
+#X floatatom 143 176 5 0 0 0 - - -;
+#X symbolatom 191 175 10 0 0 0 - - -;
+#X obj 96 196 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X obj 96 152 route bang float symbol list;
+#X obj 143 196 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 191 196 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 239 196 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 287 196 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X obj 7 231 atoi;
+#X floatatom 9 251 5 0 0 0 - - -;
+#X obj 324 330 select 1234;
+#X obj 324 349 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 396 349 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 426 350 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 491 349 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 426 330 route 1234;
+#X obj 4 154 print RAW;
+#X connect 0 0 13 0;
+#X connect 2 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 7 0;
+#X connect 4 0 8 0;
+#X connect 6 0 5 0;
+#X connect 6 1 3 0;
+#X connect 6 2 4 0;
+#X connect 6 3 9 0;
+#X connect 6 4 10 0;
+#X connect 6 4 24 0;
+#X connect 6 4 29 0;
+#X connect 13 0 2 0;
+#X connect 13 0 17 0;
+#X connect 13 0 22 0;
+#X connect 13 0 30 0;
+#X connect 14 0 18 0;
+#X connect 15 0 19 0;
+#X connect 17 0 16 0;
+#X connect 17 1 14 0;
+#X connect 17 2 15 0;
+#X connect 17 3 20 0;
+#X connect 17 4 21 0;
+#X connect 22 0 23 0;
+#X connect 24 0 25 0;
+#X connect 24 1 26 0;
+#X connect 29 0 27 0;
+#X connect 29 1 28 0;
diff --git a/doc/additional/messageoddness/pack_mixed_up_symbols.pd b/doc/additional/messageoddness/pack_mixed_up_symbols.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ebc5e18e06e11a9efd5810fb1172fe13312c21c0
--- /dev/null
+++ b/doc/additional/messageoddness/pack_mixed_up_symbols.pd
@@ -0,0 +1,73 @@
+#N canvas 269 219 673 426 10;
+#X msg 225 57 test;
+#X msg 83 57 test;
+#X text 83 39 this works;
+#X text 225 38 this complains;
+#X msg 225 103 symbol test;
+#X text 226 86 this works;
+#X obj 49 101 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 128 226 5 0 0 0 - - -;
+#X symbolatom 176 225 10 0 0 0 - - -;
+#X obj 81 246 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X obj 81 202 route bang float symbol list;
+#X obj 128 246 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 176 246 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 224 246 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 272 246 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X obj 97 166 print;
+#X obj 82 133 pack symbol symbol;
+#X msg 95 103 symbol test;
+#X text 96 86 this works;
+#X obj 37 316 unpack symbol symbol;
+#X symbolatom 37 337 10 0 0 0 - - -;
+#X symbolatom 154 337 10 0 0 0 - - -;
+#X msg 403 57 test;
+#X text 403 39 this works;
+#X floatatom 448 226 5 0 0 0 - - -;
+#X symbolatom 496 225 10 0 0 0 - - -;
+#X obj 401 246 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X obj 401 202 route bang float symbol list;
+#X obj 448 246 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 496 246 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 544 246 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 592 246 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X obj 417 166 print;
+#X obj 402 133 pack symbol;
+#X connect 0 0 16 1;
+#X connect 1 0 16 0;
+#X connect 4 0 16 1;
+#X connect 6 0 16 0;
+#X connect 7 0 11 0;
+#X connect 8 0 12 0;
+#X connect 10 0 9 0;
+#X connect 10 1 7 0;
+#X connect 10 2 8 0;
+#X connect 10 3 13 0;
+#X connect 10 4 14 0;
+#X connect 16 0 10 0;
+#X connect 16 0 15 0;
+#X connect 16 0 19 0;
+#X connect 17 0 16 0;
+#X connect 19 0 20 0;
+#X connect 19 1 21 0;
+#X connect 22 0 33 0;
+#X connect 24 0 28 0;
+#X connect 25 0 29 0;
+#X connect 27 0 26 0;
+#X connect 27 1 24 0;
+#X connect 27 2 25 0;
+#X connect 27 3 30 0;
+#X connect 27 4 31 0;
+#X connect 33 0 27 0;
+#X connect 33 0 32 0;
diff --git a/doc/additional/messageoddness/print_oddness.pd b/doc/additional/messageoddness/print_oddness.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7e2a48bf661afe0dbf4fdc1ea091cbcff2e1dcf7
--- /dev/null
+++ b/doc/additional/messageoddness/print_oddness.pd
@@ -0,0 +1,26 @@
+#N canvas 259 51 474 426 10;
+#X obj 178 130 print;
+#X msg 175 51 1 2 3;
+#X msg 189 75 list 1 2 3;
+#X msg 202 103 list one 2 three;
+#X text 27 12 [print] automatically converts lists that start with
+a a numeric atom into a list with an implied selector:;
+#X obj 178 270 print;
+#X msg 175 191 list word;
+#X msg 189 215 symbol word;
+#X msg 202 243 word;
+#X text 27 152 [print] automatically converts lists with one symbolic
+atom into a symbol message:;
+#X obj 178 400 print;
+#X msg 175 331 1;
+#X msg 189 355 float 4;
+#X text 27 292 [print] automatically converts all floats to a numeric
+atom with an implied float selector:;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 8 0 5 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
diff --git a/doc/additional/messageoddness/route_mixing_float_and_symbol_arguments.pd b/doc/additional/messageoddness/route_mixing_float_and_symbol_arguments.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b9d07a21b88e574cb56c8e5b7ebbdba69c00d88d
--- /dev/null
+++ b/doc/additional/messageoddness/route_mixing_float_and_symbol_arguments.pd
@@ -0,0 +1,26 @@
+#N canvas 793 278 453 550 10;
+#X obj 122 255 route 1 bla;
+#X msg 118 113 list bla hu;
+#X obj 114 293 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 149 297 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 197 296 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 86 85 bla hu;
+#X msg 159 147 1 two;
+#X msg 203 147 list 1 two;
+#X text 32 22 mixing different data types in one route object is not
+supported and thus leads to unexpected behaviour.;
+#X msg 169 220 0;
+#X text 197 218 <- unexpectedly matches 'bla';
+#X text 134 83 <- unexpectedly not matching;
+#X text 200 113 unexpectedly matches 'bla';
+#X connect 0 0 2 0;
+#X connect 0 1 3 0;
+#X connect 0 2 4 0;
+#X connect 1 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 9 0 0 0;
diff --git a/doc/additional/messageoddness/routing_by_data_types.pd b/doc/additional/messageoddness/routing_by_data_types.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d63a13369ac83525c1a3607afec3e34b278a6971
--- /dev/null
+++ b/doc/additional/messageoddness/routing_by_data_types.pd
@@ -0,0 +1,115 @@
+#N canvas 414 90 494 642 10;
+#X obj 334 314 route symbol;
+#X obj 336 334 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 413 335 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 331 361 route symbol;
+#X obj 333 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 410 382 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 318 269 test;
+#X msg 357 269 symbol test;
+#X obj 58 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 135 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 55 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 132 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 89 266 bang;
+#X obj 56 311 route bang;
+#X obj 53 358 route bang;
+#X text 14 5 routing based on reserved words:;
+#X obj 188 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 265 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 185 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 262 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 186 311 route float;
+#X obj 183 358 route float;
+#X msg 170 266 1;
+#X msg 209 266 float 12;
+#X obj 181 542 route list;
+#X obj 181 561 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 249 562 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 168 580 route list;
+#X obj 168 599 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 236 600 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 184 493 list 1 two 3;
+#X msg 167 473 1 two 3;
+#X msg 200 513 list one 2 three;
+#X msg 365 289 symbol;
+#X msg 113 484 list;
+#X msg 224 287 float test;
+#X text 26 245 These all output the as same atom type that is routed:
+;
+#X msg 15 266 bang test;
+#X obj 71 131 route 1;
+#X msg 71 183 2 3 4;
+#X obj 71 164 prepend set;
+#X msg 71 100 1 2 3 4;
+#X msg 218 183 is not a list;
+#X obj 218 164 prepend set;
+#X obj 218 131 route this;
+#X msg 218 100 this is not a list;
+#X text 21 50 [route] has three modes \, first is float \, second is
+symbol \, and third is data type. In the first two modes \, the first
+element of the set is stripped off by [route].;
+#X text 26 206 In the third mode \, [route] outputs the same atom type
+(bang->bang \, float->float \, symbol->symbol).;
+#X text 26 419 Lists do not behave the same with [route list] even
+though it is interpreting incoming lists \, not just routing by keyword
+\, as in the second symbol mode.;
+#X msg 174 164 set;
+#X text 157 164 re;
+#X text 164 24 "bang" \, "float" \, "symbol" \, and "list";
+#X connect 0 0 1 0;
+#X connect 0 0 3 0;
+#X connect 0 1 2 0;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 12 0 13 0;
+#X connect 13 0 8 0;
+#X connect 13 0 14 0;
+#X connect 13 1 9 0;
+#X connect 14 0 10 0;
+#X connect 14 1 11 0;
+#X connect 20 0 16 0;
+#X connect 20 0 21 0;
+#X connect 20 1 17 0;
+#X connect 21 0 18 0;
+#X connect 21 1 19 0;
+#X connect 22 0 20 0;
+#X connect 23 0 20 0;
+#X connect 24 0 25 0;
+#X connect 24 0 27 0;
+#X connect 24 1 26 0;
+#X connect 27 0 28 0;
+#X connect 27 1 29 0;
+#X connect 30 0 24 0;
+#X connect 31 0 24 0;
+#X connect 32 0 24 0;
+#X connect 33 0 0 0;
+#X connect 34 0 24 0;
+#X connect 35 0 20 0;
+#X connect 37 0 13 0;
+#X connect 38 0 40 0;
+#X connect 40 0 39 0;
+#X connect 41 0 38 0;
+#X connect 43 0 42 0;
+#X connect 44 0 43 0;
+#X connect 45 0 44 0;
+#X connect 49 0 42 0;
+#X connect 49 0 39 0;
diff --git a/doc/additional/messageoddness/select_creation_argument.pd b/doc/additional/messageoddness/select_creation_argument.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ce75d33ad13243315c466efca011767beac4ba0a
--- /dev/null
+++ b/doc/additional/messageoddness/select_creation_argument.pd
@@ -0,0 +1,48 @@
+#N canvas 514 341 621 440 10;
+#X obj 57 205 select;
+#X msg 52 108 symbol twenty;
+#X msg 7 109 23;
+#X msg 99 179 symbol twenty;
+#X obj 57 250 bng 25 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 93 250 bng 25 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 86 158 23;
+#X msg 402 108 symbol twenty;
+#X msg 357 109 23;
+#X msg 509 179 symbol twenty;
+#X obj 407 250 bng 25 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 493 250 bng 25 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 496 158 23;
+#X obj 407 205 select twenty;
+#X msg 218 108 symbol twenty;
+#X msg 177 109 23;
+#X msg 289 179 symbol twenty;
+#X obj 217 250 bng 25 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 253 250 bng 25 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 276 158 23;
+#X obj 217 205 select 23;
+#X text 68 59 a [select] without a creation argument cannot use a symbol
+selector (you get an error in the Pd window);
+#X connect 0 0 4 0;
+#X connect 0 1 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 6 0 0 1;
+#X connect 7 0 13 0;
+#X connect 8 0 13 0;
+#X connect 9 0 13 1;
+#X connect 12 0 13 1;
+#X connect 13 0 10 0;
+#X connect 13 1 11 0;
+#X connect 14 0 20 0;
+#X connect 15 0 20 0;
+#X connect 16 0 20 1;
+#X connect 19 0 20 1;
+#X connect 20 0 17 0;
+#X connect 20 1 18 0;
diff --git a/doc/additional/messageoddness/select_mixing_float_and_symbol_arguments.pd b/doc/additional/messageoddness/select_mixing_float_and_symbol_arguments.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d85b5f3eedad4cea8134d3c27c5d409abbd1462e
--- /dev/null
+++ b/doc/additional/messageoddness/select_mixing_float_and_symbol_arguments.pd
@@ -0,0 +1,31 @@
+#N canvas 91 39 450 300 12;
+#X obj 88 163 select one 2;
+#X msg 87 93 symbol one;
+#X obj 89 198 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 131 195 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 170 195 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 102 122 2;
+#X msg 228 91 symbol one;
+#X obj 230 196 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 272 193 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 311 193 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 243 120 2;
+#X obj 229 161 select 2 one;
+#X text 24 25 [select] doesn't let you mix symbols and floats \, and
+behaves oddly when you do:;
+#X connect 0 0 2 0;
+#X connect 0 1 3 0;
+#X connect 0 2 4 0;
+#X connect 1 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 11 0;
+#X connect 10 0 11 0;
+#X connect 11 0 7 0;
+#X connect 11 1 8 0;
+#X connect 11 2 9 0;
diff --git a/doc/additional/messageoddness/trigger_type_handling.pd b/doc/additional/messageoddness/trigger_type_handling.pd
new file mode 100644
index 0000000000000000000000000000000000000000..bcba814b2046fbcb64b9248e24df9d4342a4d2d9
--- /dev/null
+++ b/doc/additional/messageoddness/trigger_type_handling.pd
@@ -0,0 +1,64 @@
+#N canvas 366 31 565 405 10;
+#X msg 168 46 anything 1 two three;
+#X msg 180 66 one 2 3;
+#X obj 167 308 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 362 305 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 190 114 list one 2 3;
+#X msg 191 136 1 2 3;
+#X obj 167 285 trigger anything bang float list pointer symbol;
+#X obj 424 306 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 491 307 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 296 305 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 230 305 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 35 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 111 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 137 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 164 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 85 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 59 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 35 340 trigger a b f l p s;
+#X text 48 20 how [trigger] interprets and converts data can be tricky:
+;
+#X text 315 59 "undefined lists";
+#X text 288 127 lists;
+#X msg 199 175 4;
+#X msg 202 196 float 234;
+#X text 280 181 floats;
+#X msg 208 229 symbol blah;
+#X text 303 242 symbols;
+#X msg 188 84 asdf;
+#X msg 208 251 symbol four;
+#X connect 0 0 6 0;
+#X connect 1 0 6 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 6 0 2 0;
+#X connect 6 0 17 0;
+#X connect 6 1 10 0;
+#X connect 6 2 9 0;
+#X connect 6 3 3 0;
+#X connect 6 4 7 0;
+#X connect 6 5 8 0;
+#X connect 17 0 11 0;
+#X connect 17 1 16 0;
+#X connect 17 2 15 0;
+#X connect 17 3 12 0;
+#X connect 17 4 13 0;
+#X connect 17 5 14 0;
+#X connect 21 0 6 0;
+#X connect 22 0 6 0;
+#X connect 24 0 6 0;
+#X connect 26 0 6 0;
+#X connect 27 0 6 0;
diff --git a/doc/additional/messageoddness/undefined_series.pd b/doc/additional/messageoddness/undefined_series.pd
new file mode 100644
index 0000000000000000000000000000000000000000..15aa4b91cacf98e75c68aaf6e6ce28c4842c699f
--- /dev/null
+++ b/doc/additional/messageoddness/undefined_series.pd
@@ -0,0 +1,55 @@
+#N canvas 242 94 461 496 10;
+#X floatatom 161 180 5 0 0 0 - - -;
+#X symbolatom 209 179 10 0 0 0 - - -;
+#X obj 114 200 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X obj 114 156 route bang float symbol list;
+#X obj 161 200 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 209 200 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 257 200 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 305 200 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X msg 151 83 lots of pie;
+#X floatatom 191 405 5 0 0 0 - - -;
+#X symbolatom 259 404 10 0 0 0 - - -;
+#X obj 124 425 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X obj 191 425 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 259 425 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 328 425 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X msg 156 104 is this a list 2?;
+#X text 144 61 [route] says these are not lists:;
+#X msg 147 29 list lots of pie;
+#X text 268 30 a list;
+#X obj 123 381 trigger bang float symbol list;
+#X msg 124 274 list lots of pie;
+#X text 251 274 a list;
+#X msg 158 330 lots of pie;
+#X msg 158 349 is this a list 2?;
+#X text 15 316 [trigger] says these are not floats \, lists \, symbols
+or lists;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 3 0 2 0;
+#X connect 3 1 0 0;
+#X connect 3 2 1 0;
+#X connect 3 3 6 0;
+#X connect 3 4 7 0;
+#X connect 8 0 3 0;
+#X connect 9 0 12 0;
+#X connect 10 0 13 0;
+#X connect 15 0 3 0;
+#X connect 17 0 3 0;
+#X connect 19 0 11 0;
+#X connect 19 1 9 0;
+#X connect 19 2 10 0;
+#X connect 19 3 14 0;
+#X connect 20 0 19 0;
+#X connect 22 0 19 0;
+#X connect 23 0 19 0;
diff --git a/doc/additional/messageoddness/what_is_a_bang.pd b/doc/additional/messageoddness/what_is_a_bang.pd
new file mode 100644
index 0000000000000000000000000000000000000000..172308f33bbf3631ad89c9a9deb980f5c975ab1b
--- /dev/null
+++ b/doc/additional/messageoddness/what_is_a_bang.pd
@@ -0,0 +1,91 @@
+#N canvas 312 241 798 505 10;
+#X floatatom 80 298 5 0 0 0 - - -;
+#X symbolatom 128 297 10 0 0 0 - - -;
+#X obj 33 318 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X obj 33 274 route bang float symbol list;
+#X obj 80 318 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 128 318 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 176 318 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 224 318 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X msg 32 21 bang;
+#X obj 46 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 72 31 element;
+#X obj 68 54 bang;
+#X msg 81 96 float bang;
+#X text 164 96 invalid;
+#X msg 86 118 symbol bang;
+#X text 173 118 not a bang \, but a symbol;
+#X msg 92 142 list bang;
+#X msg 94 169 list bang bang bang;
+#X text 163 141 not a bang \, but a symbol;
+#X text 235 170 not a bang \, but a list;
+#X msg 87 203 bang bang bang;
+#X text 195 203 this is a bang;
+#X msg 91 226 bang 1 2;
+#X msg 92 247 bang one two;
+#X text 160 226 this is a bang;
+#X text 191 247 this is a bang;
+#X msg 422 27 bang;
+#X obj 436 46 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 469 43 element;
+#X obj 447 74 bang;
+#X msg 471 102 float bang;
+#X text 554 102 invalid;
+#X msg 476 124 symbol bang;
+#X text 563 124 not a bang \, but a symbol;
+#X msg 482 148 list bang;
+#X msg 484 175 list bang bang bang;
+#X text 553 147 not a bang \, but a symbol;
+#X text 625 176 not a bang \, but a list;
+#X msg 477 209 bang bang bang;
+#X text 585 209 this is a bang;
+#X msg 481 232 bang 1 2;
+#X msg 482 253 bang one two;
+#X text 550 232 this is a bang;
+#X text 581 253 this is a bang;
+#X obj 423 280 print;
+#X text 482 74 this turns [element( into a bang;
+#X msg 47 392 list bang;
+#X obj 47 416 list trim;
+#X obj 47 440 print;
+#X text 124 414 another way to convert a list to a bang;
+#X msg 77 77 list;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 3 0 2 0;
+#X connect 3 1 0 0;
+#X connect 3 2 1 0;
+#X connect 3 3 6 0;
+#X connect 3 4 7 0;
+#X connect 8 0 3 0;
+#X connect 9 0 3 0;
+#X connect 10 0 11 0;
+#X connect 11 0 3 0;
+#X connect 12 0 3 0;
+#X connect 14 0 3 0;
+#X connect 16 0 3 0;
+#X connect 17 0 3 0;
+#X connect 20 0 3 0;
+#X connect 22 0 3 0;
+#X connect 23 0 3 0;
+#X connect 26 0 44 0;
+#X connect 27 0 44 0;
+#X connect 28 0 29 0;
+#X connect 29 0 44 0;
+#X connect 30 0 44 0;
+#X connect 32 0 44 0;
+#X connect 34 0 44 0;
+#X connect 35 0 44 0;
+#X connect 38 0 44 0;
+#X connect 40 0 44 0;
+#X connect 41 0 44 0;
+#X connect 46 0 47 0;
+#X connect 47 0 48 0;
+#X connect 50 0 3 0;
diff --git a/doc/additional/messageoddness/what_is_a_symbol.pd b/doc/additional/messageoddness/what_is_a_symbol.pd
new file mode 100644
index 0000000000000000000000000000000000000000..79f4c8892ed1a921b630bcd375ade22c9f9462ca
--- /dev/null
+++ b/doc/additional/messageoddness/what_is_a_symbol.pd
@@ -0,0 +1,129 @@
+#N canvas 146 67 812 610 10;
+#X msg 48 49 symbol pie;
+#X msg 67 101 pie;
+#X text 127 49 a symbol;
+#X floatatom 96 297 5 0 0 0 - - -;
+#X symbolatom 144 296 10 0 0 0 - - -;
+#X obj 49 317 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X obj 49 273 route bang float symbol list;
+#X obj 96 317 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 144 317 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 192 317 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 240 317 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X msg 86 220 lots of pie;
+#X obj 142 538 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 233 538 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 370 96 symbol pie;
+#X msg 387 142 pie;
+#X text 449 96 a symbol;
+#X floatatom 438 299 5 0 0 0 - - -;
+#X symbolatom 504 298 10 0 0 0 - - -;
+#X obj 371 319 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X obj 438 319 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 504 319 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 572 319 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X text 28 566 [select] requires a atom type selector in order to understand
+the data (the float selector is implied);
+#X text 54 79 [route] says these are not symbols:;
+#X msg 74 121 word;
+#X msg 91 241 is this a list 2?;
+#X text 79 198 [route] says these are not lists:;
+#X msg 82 166 list lots of pie;
+#X text 203 167 a list;
+#X msg 397 161 word;
+#X msg 414 189 list lots of pie;
+#X text 541 189 a list;
+#X msg 415 214 lots of pie;
+#X msg 416 238 is this a list 2?;
+#X msg 474 444 symbol pie;
+#X msg 505 497 pie;
+#X msg 541 497 word;
+#X symbolatom 473 554 10 0 0 0 - - -;
+#X obj 473 571 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 616 486 (check Pd Window):;
+#X text 482 474 symbolatom says these are not symbols;
+#X obj 370 275 trigger bang float symbol list anything;
+#X obj 639 319 bng 15 250 50 0 empty empty anything -15 23 1 12 -262144
+-1 -1;
+#X text 390 122 [trigger] says these are not symbols:;
+#X text 360 16 The Pd window reports that it 'can only convert "s"
+to "b" or "a"'. So it considers the non-symbols of type "s" since they
+are converted only to "bang" and "anything". But type "s" is not the
+same as "symbol" because the symbol is converted to all of the types.
+;
+#X msg 132 473 element;
+#X msg 140 492 symbol element;
+#X obj 141 517 select element;
+#X obj 71 538 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 119 538 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 70 517 select 1;
+#X text 190 472 not a symbol or a float;
+#X text 15 444 [select] considers [element( as something other than
+a symbol or a float:;
+#X msg 433 512 bang;
+#X symbolatom 60 417 10 0 0 0 - - -;
+#X msg 60 367 symbol bang;
+#X text 148 368 this is a symbol \, not a bang;
+#X msg 76 390 symbol 5;
+#X text 145 391 this is a blank symbol;
+#X msg 377 365 symbol bang;
+#X text 465 366 this is a symbol \, not a bang;
+#X msg 393 388 symbol 5;
+#X text 462 389 this is a blank symbol;
+#X obj 376 416 print;
+#X connect 0 0 6 0;
+#X connect 1 0 6 0;
+#X connect 3 0 7 0;
+#X connect 4 0 8 0;
+#X connect 6 0 5 0;
+#X connect 6 1 3 0;
+#X connect 6 2 4 0;
+#X connect 6 3 9 0;
+#X connect 6 4 10 0;
+#X connect 11 0 6 0;
+#X connect 14 0 42 0;
+#X connect 15 0 42 0;
+#X connect 17 0 20 0;
+#X connect 18 0 21 0;
+#X connect 25 0 6 0;
+#X connect 26 0 6 0;
+#X connect 28 0 6 0;
+#X connect 30 0 42 0;
+#X connect 31 0 42 0;
+#X connect 33 0 42 0;
+#X connect 34 0 42 0;
+#X connect 35 0 38 0;
+#X connect 36 0 38 0;
+#X connect 37 0 38 0;
+#X connect 38 0 39 0;
+#X connect 42 0 19 0;
+#X connect 42 1 17 0;
+#X connect 42 2 18 0;
+#X connect 42 3 22 0;
+#X connect 42 4 43 0;
+#X connect 46 0 48 0;
+#X connect 46 0 51 0;
+#X connect 47 0 48 0;
+#X connect 48 0 12 0;
+#X connect 48 1 13 0;
+#X connect 51 0 49 0;
+#X connect 51 1 50 0;
+#X connect 54 0 38 0;
+#X connect 56 0 55 0;
+#X connect 58 0 55 0;
+#X connect 60 0 64 0;
+#X connect 62 0 64 0;
diff --git a/doc/additional/pd-fileformat.html b/doc/additional/pd-fileformat.html
new file mode 100644
index 0000000000000000000000000000000000000000..b132fd30294e7ea8a94eb3d464af583ead7e60c4
--- /dev/null
+++ b/doc/additional/pd-fileformat.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+
+<head>
+<title>Unofficial PD v0.37 fileformat specification</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><style type="text/css"><!--.Title {	font-family: Verdana, Arial, Helvetica, sans-serif;	font-size: 18px;	font-style: normal;	line-height: normal;	font-weight: bold;	font-variant: normal;	text-transform: none;	color: #000000;	text-decoration: none;	text-align: center;}.subTitle {	font-family: Verdana, Arial, Helvetica, sans-serif;	font-size: 12px;	font-style: normal;	line-height: normal;	font-weight: normal;	font-variant: normal;	text-transform: none;	color: #000000;	text-decoration: none;	text-align: center;}a:link {	color: #0000FF;	text-decoration: none;}a:visited {	text-decoration: none;	color: #0000FF;}a:hover {	text-decoration: underline;	color: #0000FF;}a:active {	text-decoration: none;	color: #0000FF;}body,td,th {	font-family: Verdana, Arial, Helvetica, sans-serif;	font-size: 12px;	color: #000000;}body {	background-color: #FFFFFF;}.code {	font-family: "Courier New", Courier, mono;	font-size: 12px;	font-style: normal;	line-height: normal;	font-weight: normal;	font-variant: normal;	text-transform: none;	color: #000000;	text-decoration: none;}.Head {	font-family: Verdana, Arial, Helvetica, sans-serif;	font-size: 16px;	font-style: normal;	line-height: normal;	font-weight: normal;	font-variant: normal;	text-decoration: underline;}--></style></head><body><div align="center">  <p align="center"><span class="Title"><a name="0"></a>Unofficial PD v0.37 fileformat specification</span><br>      <span class="subTitle">by <a href="mailto:simon3@student-kmt.hku.nl">Simon Asselbergs</a> and <a href="mailto:tjeerd@student-kmt.hku.nl">Tjeerd Sietsma</a><br>    Hogeschool voor de Kunsten Utrecht<br>    Faculty of Art Media and Technology <br>    October 23rd 2004<br><br>
+      Copyright (c) 2005 Free Software Foundation.
+      Permission is granted to copy, distribute and/or modify this document
+      under the terms of the GNU Free Documentation License, Version 1.2
+      or any later version published by the Free Software Foundation;
+      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+	 Texts.  A copy of the license is online at
+      <a href="http://www.gnu.org/licenses/fdl.html">http://www.gnu.org/licenses/fdl.html</a>.
+      Initial authors: Simon Asselbergs and Tjeerd Sietsma.
+</span></p></div><hr width="100%" size="2" noshade><div align="center"><a href="#1">introduction</a> | <a href="#2">records</a> | <a href="#3">wiring</a> | <a href="#4">elements and objects</a> | <a href="#5">common parameters</a> | <strong><a href="#6">reference</a></strong> | <a href="pd_fileformat.ebnf">EBNF version</a></div><hr width="100%" size="2" noshade><P class="Head"><a name="1"></a>Introduction</P><blockquote>  <p>This file describes the fileformat of patchfiles (*.pd) of Miller Puckette's PureData.</p>  <p> It is released because:</p></blockquote><ul>  <li>PureData's patchfile format is officially undocumented.</li>  <li>It may serve as a partial tutorial to help readers understand PureData better.</li></ul><blockquote>  <p>This documents is currently unofficial, beware that there is no warranty whatsoever.<br>  If you find this document incorrect or incomplete please send us an e-mail using the links at the top of this document.<br>  There are a few things still unknown, we don't exclude the possibility those things are used for compatibility with Max.</p>  <p><a href="#0">back to top</a> </p></blockquote><P class="Head"><br>  <a name="2"></a>Records</P><blockquote>  <p>The PD fileformat is a genuine custom textfile format, not to be confused with XML.<br>    It consists of one ore more records.<br>    Each record may cover multiply lines but they all have thesame syntax:</p>  <p> <span class="code"><strong>#</strong>[data]<strong>;</strong>\r\n</span></p>  <p>where[data] holds the record data, \r represents an ASCII code 13 carriage return character, and \n represents an ASCII code 10 line-feed character.<br>    Let us take a closer look on the records contents.</p>  <p>Each record consists of a chunk type, element type and optional parameters like this:</p>  <p class="code"><strong>#</strong>[chunk_type] [element_type] [p1] [p2] [p3] [...]<strong>;\r\n</strong></p>  <p>[chunk_type] is a sinlge character with only three possible values: &quot;X&quot; for an object, &quot;N&quot; for a new window, and finally &quot;A&quot; for array data.</p>  <p>[element_type] is a predefined PD element. This declaration is also used for wires. <em>Object </em>elements are numbered in order of appearance in the file, all other elements are excluded from numbering. These numbers are pure virtual and can not be seen directly in the file.</p>  <p>[p1] [p2] [p3] [...] are the required parameters for each element, this differences per element.</p>  <p><a href="#0">back to top</a> </p></blockquote><P class="style13"><br>  <span class="Head"><a name="3"></a>Wiring</span></P><blockquote>  <p>Almost all objects can be interconnected with wires in PureData. Each wire is stored in the file using the following syntax: </p>  <p class="code"><strong>#X connect</strong> [source] [outlet_number] [sink] [inlet_number]<strong>;\r\n</strong></p>  <p>[source] Is the number of the object the data is coming from. [outlet-number] Represents the number of the outlet of the source object where the wire starts. Sequentially, [sink] is the number of the target object, and finally [inlet_number] specifies inlet of the target object to which the wired is connected.<br>    Logically, the objects (again, <strong>connect</strong>s excluded) are numbered from 0 to the total number of objects in the file using the integer format. The inlets and outlets are numbered likewise.<br>    Please keep this in mind, to prevent making often made off-by-one errors.</p>  <p><a href="#0">back to top</a> </p></blockquote><P class="style13"><br>  <span class="Head"><a name="4"></a>Elements and objects </span></P><blockquote>  <p>There's a difference between elements and objects. Elements are the parts that together make up the entire layout of a patch, including windowsizes and position. Objects are the building blocks of PureData that contain functionality, gui-related or not. </p>  <p>All other <strong>elements</strong> are used to build actual PureData objects:</p></blockquote><ul>  <li>array - visual two dimensional array</li>  <li>canvas - specifications for the windowsizes and position </li>  <li>coords - used for graphs </li>  <li>floatatom - number</li>  <li>msg - message</li>  <li>obj - object, empty, subpatch or gui:      <ul>        <li>bang</li>        <li>toggle</li>        <li>nbx</li>        <li>vslider</li>        <li>hslider</li>        <li>vu</li>        <li>canvas - gui element</li>        <li>pd [name]</li>        <li>[name]</li>      </ul>  </li>  <li>restore - for exiting subwindows and graphs </li>  <li>symbolatom - symbol</li>  <li>text - comment</li></ul><blockquote>  <p><a href="#0">back to top</a></p></blockquote><p><br>    <span class="Head"><a name="5"></a>Common parameters</span></p><ul>  <li><em>Positions and size</em>: As PureData uses a graphical interface every gui-related element (object, message, number, symbol, comment, bang, toggle, number2, vslider, hslider, vradio, hradio, vu, canvas, graph, array) have a horizontal and vertical position in the window that holds the (sub)patch.<br>    Records of gui elements that have adjustable sizes also contain the horizontal and/or vertical size.<br>    Positions and sizes are stored in pixels.<br>    Note that in graphs (element: coords) the pixel sizes of its canvas are relative of the coordinates of the graph, when the option &quot;graph on parent&quot; is selected.</li>  <li><em>Color</em>: Some graphical elements have color attributes. Per color only one signed integer value is stored that contains the three 8-bit color components (RGB).<br>  Formula to calculate color attribute values:<br>  <br>  <strong>color = ( </strong>[red]<strong> * -65536) + ( </strong>[green]<strong> * -256) + ( </strong>[blue]<strong> * -1)<br>  <br>  </strong>Where [red], [green], [blue] obviously represent the three color components, their values range from 0 to 255.<br>  They apply to the attributes [background color], [front color], [label color] of various elements.</li>  <li><em>Fonts</em>: elements that have a unsigned integer [font] attribute (e.g. the element <strong>text</strong>) have a choice out of three different fonts:<br>  0 = Courier, 1 = Helvetica, 2 = Times. Courier is the only available fixed width font.<br>  The [fontsize] attribute contains the font size in pixels.</li>  <li><em>Labels</em>: the many GUI-elements that have a [label] attribute can be named. In its label string no spaces ASCII code 32 is allowed. It will generally be recognized as a seperator character for the next parameter/attribute.</li>  <li><em>Other parameters</em>: Because of the difference between element parameters there is no default syntax for all elements. They may or may not look much like other elements, depending on their visual and functional similarities.</li></ul><blockquote>  <p><a href="#0">back to top</a></p>  </blockquote><br><hr width="100%" size="2" noshade><p> <span class="Head"><a name="6"></a>Reference</span></p><ul>  <li><a href="#r1">A</a></li>  <li><a href="#r2">N</a><ul>      <li><a href="#r21">canvas</a></li>    </ul>  </li>  <li><a href="#r3">X</a><ul>      <li><a href="#r31">array</a></li>      <li><a href="#r32">connect</a></li>      <li><a href="#r33">coords</a></li>      <li><a href="#r34">floatatom</a></li>      <li><a href="#r35">msg</a></li>      <li><a href="#r36">obj</a>        <ul>          <li><a href="#r361">bng</a></li>          <li><a href="#r362">tgl</a></li>          <li><a href="#r363">nbx</a></li>          <li><a href="#r364">vsl</a></li>          <li><a href="#r365">hsl</a></li>          <li><a href="#r366">vradio</a></li>          <li><a href="#r367">hradio</a></li>          <li><a href="#r368">vu</a></li>          <li><a href="#r369">cnv</a></li>        </ul>      </li>      <li><a href="#r37">[name]</a></li>      <li><a href="#r38">pd [name]</a></li>      <li><a href="#r39">restore</a></li>      <li><a href="#r3A">symbolatom</a></li>      <li><a href="#r3B">text</a></li>    </ul>  </li></ul><blockquote><p><a href="#0">back to top</a></p></blockquote><br><hr width="100%" size="2" noshade><br><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r1"></a>A</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Announces array data </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td><span class="code"><strong>#A </strong>[p1] [p2] [p3] [...]<strong>;\r\n</strong></span></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[p1] [p2] [p3] [...] floating point variables representing array elements</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td>See Array</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td>Used only in combination of an array definition </td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r2"></a>N</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Announces a  frameset</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td><span class="code"><strong>#N </strong>[new_frame]<strong>;\r\n</strong></span></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[new_frame] new  frameset, currently only a new patchwindow can be defined</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td>see canvas</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td>Currently used only for new canvas definitions</td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r21" id="r21"></a>canvas</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines window properties</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td><span class="code"><strong>#N canvas </strong>[x_pos] [y_pos] [x_size] [y_size] [name] [open_on_load]<strong>;\r\n</strong></span></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position offset of  frameset (window)<br>    [y_pos] - vertical position offset of  frameset (window)<br>    [x_size] - horizontal size of  frameset (window)<br>    [y_size] - vertical size of  frameset (window)<br>    [name] - name / handle of  frameset <br>    [open_on_load] - when flag is set the canvas is opened when the patch is loaded</td>  </tr>  <tr>    <td valign="top"><div align="right">Example:</div></td>    <td class="code">#N canvas 0 0 452 302 12;</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">      #N canvas 0 0 452 302 thiscanvas 0;<br>    #X restore 41 136 pd thiscanvas;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td>In this example patch there are two canvas definitions.<br>    The first example has a special syntax, the attributes [name] and [open_on_load] have been replaced by a [font_size] attribute. This is only the case when the canvas definition is the first record in the patchfile, to define the position and size of the main patcher window, and set the default font size. When a first canvas definition is absent the default values of PureData are used. Note that in this case you can alter the default font size with a command line parameter.<br>    The second example shows a regular internal subpatch definition. Normally a canvas defintion is always postceeded with a restore element to define the position within the canvas, and the name of the subpatch.<br>    Presumably, the canvas name in the canvas defintion and restore definition should be thesame.</td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r3"></a>X</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Announces regular elements </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X </strong>[element]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[element] - element definition</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 50 36;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td>Used with <em>every</em> element definition except canvas definitions</td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r31"></a>array</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Array</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X array </strong>[array_name] [array_size] <strong>float </strong>[save_flag]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[array_name] - name / handle of the array <br>      [array_size] - total number of elements of an array<br>      [save_flag] - with this flag set the array data is stored in the patch</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#N canvas 0 0 450 300 graph4 0;<br>      #X array array3 10 float 1;<br>      #A 0 0 0 0 0 0 0 0 0 0;<br>      #X coords 0 1 99 -1 200 140 1;<br>    #X restore 270 193 graph;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td>An array is a gui-form of a table, always visualised using a graph. Optionally the array data can be saved in the patch - which can be <strong>very</strong> space-consuming and CPU intensive when you want to store a large number of floating point values typed out in a textfile.</td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r32"></a>connect</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Wires GUI-elements</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X connect </strong> [source] [outlet] [target] [inlet]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[source]<br>    [outlet]<br>    [target]<br>    [inlet]</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 30 27 midiin;<br>      #X obj 26 59 midiout;<br>      #X connect 0 0 1 0;<br>    #X connect 0 1 1 1;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p><strong>Obj</strong>ects are virtually numbered in order of appearance in the file, starting from zero. Inlets and outlets of the objects are numbered likewise. <strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r33"></a>coords</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Visual ranges of a frameset (window) </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X coords</strong> [x_from] [y_to] [x_to] [y_from] [width] [heigth] [graph_on_parent]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_from] - first index to display <br>    [y_to] - dynamic range of graph upper border<br>    [x_to] - last index to display<br>    [y_from] - dynamic range of graph lower border <br>    [width] - relative horizontal size of graph <br>    [heigth] - relative vertical size of graph <br>    [graph_on_parent] - when set displayes child path, when unset graph is displayed like an object</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#N canvas 0 0 452 302 graph1 0;<br>      #X coords 0 1 100 -1 200 140 1;<br>    #X restore 58 26 graph;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>A coords statement must always be preceded with a canvas statement which also holds the graph name. <br>      A coords statement must always be terminated with a restore statement that has the reserved handle <strong>graph<br>      </strong>Off limit values will be displayed outside the graph in the PureData GUI.<strong><br>            </strong></p>      </td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r34"></a>floatatom</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a number box </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X floatatom </strong> [x_pos] [y_pos] [width] [lower_limit] [upper_limit] [label_pos] [label] [receive] [send]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within window <br>    [y_pos] - vertical position within window<br>    [width] - number of digits <br>    [lower_limit] - minimal value<br>    [upper_limit] - maximum value <br>    [label_pos] - label position relative to floatatom position. 0 = left, 1 = right, 2 = top, 3 = bottom <br>    [label] - floatatom label/name<br>    [receive] - receive symbol name <br>    [send] - send symbol name</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X floatatom 32 26 5 0 0 0 - - -;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>When the value of [upper_limit] minus the value of [lower_limit] is less than one, or the [width] attribute is set to one, PureData resets these values both to zero.<br>      Floatatom and symbolatom are the only elements that uses &quot;-&quot; characters to indicate that no value has been assigned to its attributes [label], [receive] and [send].<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r35"></a>msg</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a message </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X msg </strong> [x_pos] [y_pos] [p1] [p2] [p3] [...]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window <br>    [y_pos] - vertical position within the window<br>    [p1] [p2] [p3] [...] the content of the message</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X msg 61 48 read audio.wav;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>-<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r36"></a>obj</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines an object </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] [object_name] [p1] [p2] [p3] [...]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window <br>      [y_pos] - vertical position within the window<br>      [object_name] - name of the object (optional) <br>      [p1] [p2] [p3] [...] the parameters of the object (optional)</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 55 50;<br>    #X obj 132 72 trigger bang float;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>The first line is an example of an empty object. The second line describes a trigger object with its parameters<strong>.<br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r361"></a>bng</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a bang </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>bng</strong> [size] [hold] [interrupt] [init] [send] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [fg_color] [label_color] <strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>    [y_pos] - vertical position within the window <br>    [size] - square size of the gui element<br>    [hold] - hold time in milliseconds, ranges from 50 to 1000000000<br>    [interrupt] - interrupt time in milliseconds, ranges from 10 to 250<br>    [init] - bang on load <br>    [send] - send symbol name <br>    [receive] - receive symbol name <br>    [label] - label<br>    [x_off] - horizontal position of the label text relative to the upperleft corner of the object <br>    [y_off] - vertical position of the label text relative to the upperleft corner of the object <br>    [font] - font type <br>    [fontsize] - font size<br>    [bg_color] - background color <br>    [fg_color] - foreground color <br>    [label_color] - label color</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 27 32 bng 15 10000 100 1 empty empty empty 0 -6 0 8 -262144 -1 -1;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>Hold time is for how long you see a flash when you click on the bang, interrupt time is for how long you don't see it flash when you click on this object while it's flashing.<strong><br>      </strong>[send], [receive] and [label] cannot be named &quot;empty&quot;, this is a reserved name for when no value is assigned. <strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r362"></a>tgl</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a toggle </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>tgl</strong> [size] [init] [send] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [fg_color] [label_color] [init_value] [default_value] <strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window <br>      [size] - square size of the gui element<br>      [init] - set on load <br>      [send] - send symbol name <br>      [receive] - receive symbol name <br>      [label] - label<br>      [x_off] - horizontal position of the label text relative to the upperleft corner of the object <br>      [y_off] - vertical position of the label text relative to the upperleft corner of the object <br>      [font] - font type <br>      [fontsize] - font size<br>      [bg_color] - background color <br>      [fg_color] - foreground color <br>      [label_color] - label color<br>      [init_value] - value sent when the [init] attribute is set<br>      [default_value] - default value when the [init] attribute is not set</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 29 44 tgl 15 1 empty empty empty 0 -6 192 8 -262144 -1 -1 234 234;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>[send], [receive] and [label] cannot be named &quot;empty&quot;, this is a reserved name for when no value is assigned.<br>      The [default_value] attribute can be changed in a patch and saved, this is why there are different values for [init_value] and [default_value]<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r363"></a>nbx</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a Number2 number box </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>nbx</strong> [size] [height] [min] [max] [log] [init] [send] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [fg_color] [label_color] [log_height]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window <br>      [size] - number of digits the element displays <br>      [height] - vertical size of element in pixels<br>      [min] - minimum value, typically -1e+037<br>      [max] - maximum value, typically 1e+037<br>      [log] - linear when unset, logarithmic when set<br>      [init] - when set outputs <br>      [send] - send symbol name <br>      [receive] - receive symbol name<br>      [label] - label <br>      [x_off] -  horizontal position of the label text relative to the upperleft corner of the object<br>      [y_off] - vertical position of the label text relative to the upperleft corner of the object<br>      [font] - font type <br>      [fontsize] - font size in pixels<br>      [bg_color] - background color<br>      [fg_color] - foreground color<br>      [label_color] - label color <br>      [log_height] - logarithmic steps, accepts values from 10 to 2000, default is 256</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 39 48 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 256;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>This element resembles the floatatom element, but is extended with gui and logarithmic parameters and (probably) more accurate.<br>      The attributes [font], [font_size] and [fg_color] also apply to the digits.<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r364"></a>vsl</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a vertical slider </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>vsl</strong> [width] [height] [bottom] [top] [log] [init] [send] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [fg_color] [label_color] [default_value] [steady_on_click]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window <br>      [width] - horizontal size of gui element <br>      [height] - vertical size of gui element <br>      [bottom] - minimum value <br>      [top] - maximum value<br>      [log] - when set the slider range is outputted logarithmically, otherwise it's output is linair<br>      [init] - sends default value on patch load <br>      [send] - send symbol name <br>      [receive] - receive symbol name <br>      [label] - label <br>      [x_off] -  horizontal position of the label text relative to the upperleft corner of the object<br>[y_off] - vertical position of the label text relative to the upperleft corner of the object<br>      [font] - font type <br>      [fontsize] - font size <br>      [bg_color] - background color <br>      [fg_color] - foreground color<br>      [label_color] - label color <br>      [default_value] - default value times hundred<br>      [steady_on_click] - when set, fader is steady on click, otherwise it jumps on click</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 50 38 vsl 15 128 0 127 0 0 empty empty empty 0 -8 0 8 -262144 -1 -1 0 1;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>The vertical slider object and the horizontal slider are the only objects which have a default value multiplied by hundred. This purpose is unknown.<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r365"></a>hsl</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a horizontal slider </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>hsl</strong> [width] [height] [bottom] [top] [log] [init] [send] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [fg_color] [label_color] [default_value] [steady_on_click]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window <br>      [width] - horizontal size of gui element <br>      [height] - vertical size of gui element <br>      [bottom] - minimum value <br>      [top] - maximum value<br>      [log] - when set the slider range is outputted logarithmically, otherwise it's output is linair<br>      [init] - sends default value on patch load <br>      [send] - send symbol name <br>      [receive] - receive symbol name <br>      [label] - label <br>      [x_off] - horizontal position of the label text relative to the upperleft corner of the object<br>      [y_off] - vertical position of the label text relative to the upperleft corner of the object<br>      [font] - font type <br>      [fontsize] - font size <br>      [bg_color] - background color <br>      [fg_color] - foreground color<br>      [label_color] - label color <br>      [default_value] - default value times hundred<br>      [steady_on_click] - when set, fader is steady on click, otherwise it jumps on click</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 53 44 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>The horizontal slider object and the vertical slider are the only objects which have a default value multiplied by hundred. This purpose is unknown.<br>    </p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r366"></a>vradio</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a vertical radio button selector</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>vradio</strong> [size] [new_old] [init] [number] [send] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [fg_color] [label_color] [default_value]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window <br>      [size] - horizontal size and vertical size, depending on the number of radio buttons <br>      [new_old] - send new and old value, or only the new value<br>      [init] - send default value on init <br>      [number] - amount of radio buttons <br>      [send] - send symbol name <br>      [receive] - receive symbol name <br>      [label] - label <br>      [x_off] - horizontal position of the label text relative to the upperleft corner of the object<br>[y_off] - vertical position of the label text relative to the upperleft corner of the object<br>[font] - font type <br>[fontsize] - font size <br>[bg_color] - background color <br>[fg_color] - foreground color<br>[label_color] - label color<br>      [default_value] - default value to be sent on patch load when the [init] attribute has been set.</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 48 42 vradio 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1 0;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>The purpose of the [new_old] switch is unknown.<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r367"></a>hradio</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a horizontal radio button selector</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>hradio</strong> [size] [new_old] [init] [number] [send] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [fg_color] [label_color] [default_value]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window <br>      [size] - vertical size and horizontal size, depending on the number of radio buttons <br>      [new_old] - send new and old value, or only the new value<br>      [init] - send default value on init <br>      [number] - amount of radio buttons <br>      [send] - send symbol name <br>      [receive] - receive symbol name <br>      [label] - label <br>      [x_off] - horizontal position of the label text relative to the upperleft corner of the object<br>      [y_off] - vertical position of the label text relative to the upperleft corner of the object<br>      [font] - font type <br>      [fontsize] - font size <br>      [bg_color] - background color <br>      [fg_color] - foreground color<br>      [label_color] - label color<br>      [default_value] - default value to be sent on patch load when the [init] attribute has been set.</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj -50 54 hradio 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1 0;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>The purpose of the [new_old] switch is unknown.<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r368"></a>vu</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a VU-meter </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>vu</strong> [width] [height] [receive] [label] [x_off] [y_off] [font] [fontsize] [bg_color] [label_color] [scale] [?]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window <br>      [width] - horizontal size of element <br>      [height] - vertical size of element <br>      [receive] - receive symbol name <br>      [label] - label<br>      [x_off] - horizontal position of the label text relative to the upperleft corner of the object<br>[y_off] - vertical position of the label text relative to the upperleft corner of the object<br>[font] - font type <br>[fontsize] - font size <br>[bg_color] - background color <br>      [label_color] - label color <br>      [scale] - when set the logarithmic scale is displayed <br>      [?] - unknown value, default is zero</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td>#X obj 40 44 vu 15 120 empty empty -1 -8 0 8 -66577 -1 1 0;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>We looked inside the source code but still couldn't see the purpose of the final value.<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r369"></a>cnv</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a canvas, a gui component </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] <strong>cnv</strong> [size] [width] [height] [send] [receive] [label] [x_off] [y_off] [font] [font_size] [bg_color] [label_color] [?]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>[y_pos] - vertical position within the window<br>    [size] - size of selectable square<br>[width] - horizontal size of the GUI-element<br>[height] - vertical size of the GUI-element<br>[send] - send symbol name <br>[receive] - receive symbol name <br>[label] - label <br>[x_off] - horizontal position of the label text relative to the upperleft corner of the object<br>[y_off] - vertical position of the label text relative to the upperleft corner of the object<br>[font] - font type <br>[fontsize] - font size <br>[bg_color] - background color<br>[label_color] - foreground color <br>[?] - unknown value, default is zero</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 27 40 cnv 15 100 60 empty empty empty 20 12 0 14 -233017 -66577 0;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>We couldn't find the purpose of the final value.<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r37"></a>[name]</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines an external subpatch or library patch </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X obj </strong> [x_pos] [y_pos] [name] [p1] [p2] [p3] [...] <strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>[y_pos] - vertical position within the window<br>      [name] - name of the subpatch / library patch<br>      [p1] [p2] [p3] [...] - optional parameters</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#X obj 121 102 subpatch; </td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>If the external object isn't in the loaded libraries PureData searches in the folder of the main frame (window) to locate the object. <strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r38"></a>pd</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines an internal subpatch </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X restore </strong> [x_pos] [y_pos] <strong>pd</strong> [name]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>[y_pos] - vertical position within the window<br>    [size] - size of selectable square<br>      [width] - horizontal size of the GUI-element<br>      [name] - name of the subpatch</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#N canvas 0 0 454 304 inc 0;<br>      #X obj 34 40 inlet;<br>      #X obj 34 95 outlet;<br>      #X obj 34 67 + 1;<br>      #X connect 0 0 2 0;<br>      #X connect 2 0 1 0;<br>      #X restore 90 124 pd inc;<br>      #X floatatom 90 99 5 0 0 0 - - -;<br>      #X floatatom 90 151 5 0 0 0 - - -;<br>      #X connect 0 0 2 0;<br>      #X connect 1 0 0 0;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>Naturally the restore element which invokes a subpatch is preceded with a canvas element and the subpatch elements. <br>        Objects within a subpatch are counted seperately from a parent frame (window).<strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r39"></a>restore</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Ends a canvas definition</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X restore </strong> [x_pos] [y_pos]  [type] [name]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td>[x_pos] - horizontal position within the window<br>      [y_pos] - vertical position within the window<br>      [type] - type of canvas, values are either &quot;graph&quot; or &quot;pd&quot;<br>      [name] - name of the subpatch, only used when the [type] attribute is set to &quot;pd&quot;</td>  </tr>  <tr>    <td valign="top"><div align="right">Example:</div></td>    <td class="code">#N canvas 0 0 450 300 graph2 0;<br>    #X coords 0 1 100 -1 200 140 1;<br>    #X restore 27 30 graph;</td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Example:</div></td>    <td class="code">#N canvas 0 0 452 302 subpatch 0;<br>    #X restore 64 69 pd subpatch;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>The restore element is used only in combination with canvas elements. There are two uses:<br>      In the first example it defines a graph, in this case a coords element is required.<br>      In the second example it defines a subpatch. In this case only the canvas attribute [name] and the restore attribute [name] should correlate.<strong><br>    </strong></p>    </td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r3A"></a>symbolatom</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines an symbol box </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X symbolatom </strong> [x_pos] [y_pos] [width] [lower_limit] [upper_limit] [label_pos] [label] [receive] [send]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td><p>[x_pos] - horizontal position within the window<br>        [y_pos] - vertical position within the window<br>        [width] - amount of digits/characters<br>[lower_limit] - minimum value <br>        [upper_limit] - maximum value <br>        [label_pos] - label position relative to floatatom position. 0 = left, 1 = right, 2 = top, 3 = bottom        <br>        [label] - label <br>        [receive] - receive symbol value <br>      [send] - send symbol value</p>      </td>  </tr>  <tr>    <td valign="top"><div align="right">Example:</div></td>    <td class="code">#X symbolatom 36 37 10 0 0 0 - - -;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>When the value of [upper_limit] minus the value of [lower_limit] is less than one, PureData resets these values both to zero.<br>      Symbolatom and floatatom are the only elements that uses &quot;-&quot; characters to indicate that no value has been assigned to its attributes [label], [receive] and [send].<strong></strong><strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p>  <p>&nbsp;</p></blockquote><table width="100%"  border="0">  <tr bgcolor="#CCCCCC">    <td colspan="2"><a name="r3B"></a>text</td>  </tr>  <tr>    <td valign="top"><div align="right">Description:</div></td>    <td>Defines a comment </td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Syntax:</div></td>    <td class="code"><strong>#X text </strong> [x_pos] [y_pos] [comment]<strong>;\r\n</strong></td>  </tr>  <tr>    <td width="85" valign="top"><div align="right">Parameters:</div></td>    <td><p>[x_pos] - horizontal position within the window<br>        [y_pos] - vertical position within the window<br>        [comment] - custom string, spaces allowed<br>        </p></td>  </tr>  <tr>    <td valign="top"><div align="right">Example:</div></td>    <td class="code">#X text 28 25 comment;</td>  </tr>  <tr>    <td valign="top"><div align="right">Remarks:</div></td>    <td><p>ASCII return codes 13 and 10 are not stored, a semicolon character is preceded with the escape character backslash. <strong><br>    </strong></p></td>  </tr></table><blockquote>  <p><a href="#6">back to reference index</a></p></blockquote><p> <br>  <hr width="100%" size="2" noshade>    <p>
+      <a href="http://validator.w3.org/check?uri=referer"><img border="0"
+          src="http://www.w3.org/Icons/valid-html401"
+          alt="Valid HTML 4.01!" height="31" width="88"></a>
+    </p>
+</body>
+</html>
diff --git a/doc/additional/pd-msg/0.intro.txt b/doc/additional/pd-msg/0.intro.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7574af96e627c646454c5b2e209827251f198e4a
--- /dev/null
+++ b/doc/additional/pd-msg/0.intro.txt
@@ -0,0 +1,152 @@
+Here is some documentation that covers internal pd messages.
+(pd-msg_05)
+
+1) Internal msgs are sent directly to pd (pd selector) or to a loaded patch (pd-patch.pd selector).
+  all these msgs have to end with a semicolon ";"
+  you can test them using :
+    the pd menu under "File : Message..." or with the shortcut <ctrl-m>
+    pdsend
+    the tclsend2pd in the 4.msg_from_tcl folder.
+
+  These messages allow you to:
+    control pd without the gui :
+    make use of the no-gui option
+    open a patch via socket... (tcl, python, sh, c++,...)
+    modify or create a new patch
+    create a patch that will create some other patch
+    dynamically create objects to create polyphony (e.g., 100 osc~ or more...)
+    load patches from within another patch
+    construct generative patches
+    create a new gui
+    and much more...
+
+2) Here's a list of pd's internal msgs (* are documented somewhere in this doc):
+
+  messages to pd:
+        init  [gimme]
+        filename  [symbol] [symbol]
+    *   open  [symbol] [symbol]
+    *   quit
+        foo  [gimme]
+    *   dsp  [gimme]
+        meters  [float]
+        key  [gimme]
+    *   audiostatus
+        finderror
+        ping
+
+ messages to canvas:
+    *   obj  [gimme]
+    *   msg  [gimme]
+    *   floatatom  [gimme]
+    *   symbolatom  [gimme]
+    *   text  [gimme]
+    *   graph  [gimme]
+    *   array
+    *   scalar  [gimme]
+        bng  [gimme]
+        toggle  [gimme]
+        vslider  [gimme]
+        hslider  [gimme]
+        radio  [gimme]
+        vumeter  [gimme]
+        mycnv  [gimme]
+    *   connect  [float] [float] [float] [float]
+    *   restore  [gimme]
+        write  [symbol] [defsymbol]
+        read  [symbol] [defsymbol]
+        mergefile  [symbol] [defsymbol]
+        sort
+    *   click  [float] [float] [float] [float]
+    *   mouseup  [float] [float] [float]
+    *   key  [gimme]
+    *   motion  [float] [float] [float]
+    *   print  [symbol]
+    *   menusave
+    *   menusaveas
+    *   menuclose  [deffloat]
+    *   saveto  [symbol] [symbol]
+    *   cut
+    *   copy
+    *   paste
+    *   duplicate
+    *   selectall
+    *   tidy
+    *   texteditor
+    *   editmode  [deffloat]
+        protectmode  [deffloat]
+    *   print  [symbol]
+    *   pop  [deffloat]
+    *   loadbang
+    *   relocate  [symbol] [symbol]
+    *   menufont
+    *   font  [float] [float] [float]
+    *   find  [gimme]
+    *   findagain
+    *   findparent
+    *   vis  [float]
+        properties  [float] [float]
+        help  [float] [float]
+        arraydialog  [symbol] [float] [float] [float]
+        map  [float]
+        clear
+        intatom  [gimme]
+        atom  [gimme]
+
+
+
+3) Here's an overview of the documentation :
+  1.msg_and_patch
+    description of msgs that can be sent to patches.
+    (contains pd files)
+
+  2.msg_and_pd
+    description of msgs that can be sent to pd.
+    (contains pd files)  
+
+  3.pdscript 
+    an example sh scrip using pdsend to create a patch in pd.
+    pdscript was authored by Guenter Geiger
+    (contains it's own readme + files)
+
+  4.msg_from_tcl/tk
+    decription of how to use tcl/tk to create a patch, open a patch, etc...
+  
+  5.Examples
+    examples of how an "obj x y myOsc~" message can be used
+    to deal with "massive polyphony"
+
+4) Releases :
+
+  release 0.5 : pd-msg_05.tar.gz
+    added some more msg.
+    Thanks to Krzysztof Czaja
+    all msgs are listed for pd0.34
+
+  release 0.4 : pd-msg_04.tar.gz
+    added many messages :
+      the events messages
+      the menu messages
+      the cut&paste msg, etc...
+    complete the polyphonie example
+  
+  release 0.3 : pd-msg
+    Rearrange patch & examples in different directory.
+    add polyphonie examples
+    add tcl scripts...
+
+  release 0.2 : self-generation
+    added messages to open and close patch.
+
+  release 0.1 : self-construction
+    first release
+
+5) To do list :
+
+  some msgs are not well explained or not explained at all.
+
+6) Reference :
+  Look @ the end of code of g_canvas.c in the source directory.
+
+
+Damien HENRY
\ No newline at end of file
diff --git a/doc/additional/pd-msg/1.msg_and_patch/0.all_msg.pd b/doc/additional/pd-msg/1.msg_and_patch/0.all_msg.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d1b73a5692ebd062acdd77e41118b018054e5108
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/0.all_msg.pd
@@ -0,0 +1,149 @@
+#N canvas 0 18 580 666 10;
+#X msg 40 615 restore;
+#X text 23 17 objects;
+#X text 371 2 GUI stuff;
+#X msg 375 25 menusave;
+#X msg 375 47 menusaveas;
+#X msg 375 69 menuclose;
+#X msg 375 92 saveto;
+#X msg 375 171 cut;
+#X msg 375 193 copy;
+#X msg 375 237 duplicate;
+#X msg 375 114 tidy;
+#X msg 375 136 texteditor;
+#X msg 375 421 editmode \$1;
+#X msg 375 474 print;
+#X msg 375 528 pop;
+#X msg 375 448 loadbang;
+#X msg 375 291 menufont;
+#X msg 375 313 font 10 100 100;
+#X msg 375 367 findagain;
+#X msg 375 389 findparent;
+#X text 426 93 ?????;
+#X msg 375 215 paste;
+#X msg 375 259 selectall;
+#X text 22 386 reset the patch;
+#X msg 40 406 clear;
+#N canvas 1 87 424 410 subpatch 1;
+#X coords 0 0 1 1 50 50 0;
+#X restore 230 638 pd subpatch;
+#X obj 40 638 s pd-subpatch;
+#X obj 375 639 s pd-subpatch;
+#X msg 40 192 connect 0 0 1 0;
+#X msg 40 448 read textfile.txt;
+#X msg 40 470 write textfile.txt;
+#X msg 375 501 vis \$1;
+#X msg 423 594 vis 1 \, clear;
+#X obj 423 575 loadbang;
+#X msg 40 593 donecanvasdialog 1 -1 1 0 -1 1 1 50 50 100 100;
+#X text 22 573 this controls graph-on-parent;
+#X msg 40 214 disconnect 0 0 1 0;
+#X text 167 203 obj# outlet# obj# inlet#;
+#X text 91 616 ?????;
+#X msg 40 147 graph mygraph;
+#X obj 143 169 s pd-mygraph;
+#X msg 143 147 pop \, array array1 100 float 2;
+#X msg 40 37 obj 350 10 r test;
+#X msg 40 59 msg 350 40 bang;
+#X msg 40 81 floatatom 350 70;
+#X msg 40 103 symbolatom 350 100 symbol;
+#X msg 40 125 text 350 130 comment;
+#N canvas 166 389 351 173 ds 0;
+#X obj 38 39 filledcurve 990 0 1 0 0 50 0 50 50 0 50;
+#X obj 38 66 drawcurve 0 1 15 15 20 15 20 20 15 20 15 15;
+#X obj 38 93 drawcurve 0 1 30 15 35 15 35 20 30 20 30 15;
+#X obj 38 120 filledcurve 999 0 1 10 25 25 45 40 25 25 35 10 25;
+#X obj 20 12 struct ds float x float y symbol sym;
+#X obj 38 147 drawsymbol sym 55 25 0;
+#X restore 225 492 pd ds;
+#X msg 40 366 motion 200 200 0;
+#X msg 40 257 editmode 1;
+#X msg 40 322 key 1 8 0;
+#X msg 40 278 mouse 340 135 1 0;
+#X msg 40 300 mouseup 355 145 0;
+#X msg 40 344 click 355 145 0 1 0;
+#X text 23 235 events (only work when editmode = 1 \, vis = 1);
+#X text 22 511 relocate windows;
+#X msg 40 554 vis 1;
+#X text 114 321 (8 = backspace);
+#X text 166 344 ?????;
+#X text 159 366 ?????;
+#X msg 40 532 vis 0 \, relocate 300x250+1+1 1x1+100+200;
+#X text 420 501 ( 0 or 1 );
+#X text 451 421 ( 0 or 1 );
+#X text 11 2 Here is a list of all messages:;
+#X text 23 169 connections;
+#X text 78 554 make it visible again;
+#N canvas 523 391 152 85 ds2 0;
+#N canvas 50 470 557 157 template-toplevel 0;
+#X obj 21 94 plot bazoo 700 3 10 20 20;
+#X obj 21 68 drawpolygon q 4 0 0 20 z z -5 10 20;
+#X obj 21 30 struct template-toplevel float x float y float z float
+q array bazoo template-element;
+#X restore 11 11 pd template-toplevel;
+#N canvas 199 231 600 239 template-element 0;
+#X obj 58 83 drawpolygon 10 2 5 0 0 -5 -5 0 0 5 5 0;
+#X obj 59 48 struct template-element float x float y float w;
+#X restore 11 34 pd template-element;
+#X restore 225 448 pd ds2;
+#X msg 40 492 scalar ds 225 225 -hi_there!;
+#X text 22 426 reading/writing/creating data structures;
+#X text 459 345 ( 0 or 1 );
+#X msg 375 345 find +test \$1;
+#X text 456 68 Warning !!!;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 65 DESCRIPTION a (hopefully) comprehensive list of all internal
+messages that can be sent to a canvas;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 45 LICENSE public domain;
+#X restore 525 638 pd META;
+#X connect 0 0 26 0;
+#X connect 3 0 27 0;
+#X connect 4 0 27 0;
+#X connect 5 0 27 0;
+#X connect 6 0 27 0;
+#X connect 7 0 27 0;
+#X connect 8 0 27 0;
+#X connect 9 0 27 0;
+#X connect 10 0 27 0;
+#X connect 11 0 27 0;
+#X connect 12 0 27 0;
+#X connect 13 0 27 0;
+#X connect 14 0 27 0;
+#X connect 15 0 27 0;
+#X connect 16 0 27 0;
+#X connect 17 0 27 0;
+#X connect 18 0 27 0;
+#X connect 19 0 27 0;
+#X connect 21 0 27 0;
+#X connect 22 0 27 0;
+#X connect 24 0 26 0;
+#X connect 28 0 26 0;
+#X connect 29 0 26 0;
+#X connect 30 0 26 0;
+#X connect 31 0 27 0;
+#X connect 32 0 27 0;
+#X connect 33 0 32 0;
+#X connect 34 0 26 0;
+#X connect 36 0 26 0;
+#X connect 39 0 26 0;
+#X connect 41 0 40 0;
+#X connect 42 0 26 0;
+#X connect 43 0 26 0;
+#X connect 44 0 26 0;
+#X connect 45 0 26 0;
+#X connect 46 0 26 0;
+#X connect 48 0 26 0;
+#X connect 49 0 26 0;
+#X connect 50 0 26 0;
+#X connect 51 0 26 0;
+#X connect 52 0 26 0;
+#X connect 53 0 26 0;
+#X connect 56 0 26 0;
+#X connect 60 0 26 0;
+#X connect 67 0 26 0;
+#X connect 70 0 27 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.0.objects.pd b/doc/additional/pd-msg/1.msg_and_patch/1.0.objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7e7ed1303c8ad90e87382a14787dab7d7b9a1bb5
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.0.objects.pd
@@ -0,0 +1,73 @@
+#N canvas 0 18 543 545 10;
+#X msg 39 481 restore;
+#X text 23 48 objects;
+#X msg 39 71 obj 300 10 r test;
+#X msg 39 93 msg 300 40 bang;
+#X msg 39 115 floatatom 300 70 symbol;
+#X msg 39 137 symbolatom 300 100 symbol;
+#X msg 39 159 text 300 130 comment;
+#X obj 39 510 s pd-1.0.objects.pd;
+#X text 110 481 ??????;
+#N canvas 478 329 385 188 ds-example 0;
+#X text 27 119 An example struct to show how the "scalar" msg works
+;
+#X obj 18 23 struct ds-example float x float y symbol desc;
+#X obj 52 56 filledpolygon 900 0 1 0 0 10 0 10 10 0 10;
+#X obj 53 83 drawsymbol desc 20 0 0;
+#X text 28 146 usage: scalar <struct name> <arg1 arg2 arg3 etc.>;
+#X restore 69 213 pd ds-example;
+#X msg 39 191 scalar ds-example 300 160 this-is-a-ds-instance;
+#X obj 69 349 s pd-my_graph;
+#X msg 69 283 pop;
+#X text 24 259 1;
+#X text 54 284 2;
+#X text 54 320 3;
+#N canvas 34 396 417 187 connections 0;
+#X obj 14 8 inlet;
+#X obj 14 107 outlet;
+#X text 61 29 Object and inlet numbers start at 0;
+#X text 73 83 "connect"-ing multiple times will create duplicate;
+#X text 74 63 Warnings: cutting and pasting changes object order!;
+#X text 59 9 usage: connect obj# outlet# obj# inlet#;
+#X text 73 103 connections! (try it \, then scroll the number box and
+;
+#X text 73 124 watch the console);
+#X restore 204 413 pd connections;
+#X obj 69 439 s pd-connections;
+#X msg 69 388 connect 0 0 1 0;
+#X msg 69 413 disconnect 0 0 1 0;
+#X floatatom 204 388 5 0 0 0 - - -;
+#X obj 254 439 print;
+#X floatatom 204 439 5 0 0 0 - - -;
+#X text 43 238 graph name xfrom yfrom xto yto xtopl ytopl xbtmr ybtmr
+;
+#X msg 39 259 graph my_graph 0 1 99 -1 300 280 500 420;
+#X text 72 301 array name size float style;
+#X msg 69 321 array my_array 100 float 2;
+#X text 17 24 that deal with objects:;
+#X text 16 7 Here's a list of all messages;
+#N canvas 218 113 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 65 DESCRIPTION list of canvas messages that can be used
+to dynamically instantiate objects and connections.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 45 LICENSE public domain;
+#X restore 481 514 pd META;
+#X connect 0 0 7 0;
+#X connect 2 0 7 0;
+#X connect 3 0 7 0;
+#X connect 4 0 7 0;
+#X connect 5 0 7 0;
+#X connect 6 0 7 0;
+#X connect 10 0 7 0;
+#X connect 12 0 11 0;
+#X connect 16 0 21 0;
+#X connect 16 0 22 0;
+#X connect 18 0 17 0;
+#X connect 19 0 17 0;
+#X connect 20 0 16 0;
+#X connect 24 0 7 0;
+#X connect 26 0 11 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.1.add_objects.pd b/doc/additional/pd-msg/1.msg_and_patch/1.1.add_objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d0afc985613d80769a597761ec788f8b50013587
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.1.add_objects.pd
@@ -0,0 +1,70 @@
+#N canvas 0 18 711 648 10;
+#X msg 42 49 msg 500 10 bang;
+#X text 224 53 <= Click here first;
+#X text 207 232 <= and here;
+#X text 42 456 And now the end of this exemple :;
+#X text 42 143 The next 2 numbers are X & Y position in the canvas.
+Then it's a symbol for the name of the obj \, the content of the msg
+\, etc... and some additionals parameters.;
+#X msg 42 205 floatatom 600 10 7 50 5000;
+#X msg 42 230 obj 500 40 metro 500;
+#X msg 42 482 obj 500 70 random 127;
+#X msg 42 532 floatatom 500 100 5;
+#X msg 42 582 text 500 130 That's it !;
+#X text 16 53 1;
+#X text 20 204 2;
+#X text 20 226 3;
+#X text 18 348 4;
+#X text 18 370 5;
+#X text 20 483 6;
+#X text 20 509 7;
+#X text 20 532 8;
+#X text 19 556 9;
+#X text 14 582 10;
+#X text 42 13 To add an object into a patch just send a message to
+the patch itself :;
+#X obj 42 74 s pd-1.1.add_objects.pd;
+#X obj 42 255 s pd-1.1.add_objects.pd;
+#X obj 43 399 s pd-1.1.add_objects.pd;
+#X obj 42 612 s pd-1.1.add_objects.pd;
+#X text 42 98 The selector should be "msg" \, "floatatom" \, "obj"
+\, "text" \, "array" \, "symbolatom" \, "scalar" or "graph";
+#X text 236 204 <= Then click here (and have a look at the properties
+of the object created);
+#X text 42 279 For connecting objects use the selector "connect". It
+takes 4 arguments : the number of the first object \, the number of
+the outlet \, the number of the second object \, and the number of
+the inlet :;
+#X text 193 375 <= and here;
+#X text 193 348 <= click here;
+#X msg 43 349 connect 35 0 37 0;
+#X msg 43 374 connect 36 0 37 1;
+#X msg 42 507 connect 37 0 38 0;
+#X msg 42 557 connect 38 0 39 0;
+#X text 276 530 !!! W A R N N I N G !!! It's very important to respect
+the order in which objects are created. If you don't the "connect"
+selector won't work correctly. If you get stuck \, reload this patch
+and try again.;
+#N canvas 218 113 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 65 DESCRIPTION how to dynamically instantiate objects and
+connections.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 44 LICENSE public domain;
+#X restore 654 623 pd META;
+#X connect 0 0 21 0;
+#X connect 5 0 22 0;
+#X connect 6 0 22 0;
+#X connect 7 0 24 0;
+#X connect 8 0 24 0;
+#X connect 9 0 24 0;
+#X connect 30 0 23 0;
+#X connect 31 0 23 0;
+#X connect 31 0 23 0;
+#X connect 31 0 23 0;
+#X connect 31 0 23 0;
+#X connect 32 0 24 0;
+#X connect 33 0 24 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.2.create_patch.pd b/doc/additional/pd-msg/1.msg_and_patch/1.2.create_patch.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b10d68950f6c2ea7587fa3f7a1f2322ec6c815a3
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.2.create_patch.pd
@@ -0,0 +1,39 @@
+#N canvas 0 18 743 475 10;
+#X msg 38 150 msg 10 10 bang;
+#X msg 38 198 obj 10 40 metro 500;
+#X msg 38 174 floatatom 100 10 7 50 5000;
+#X msg 38 270 obj 10 70 random 127;
+#X msg 38 318 floatatom 10 100 5;
+#X msg 38 366 text 10 130 That's it !;
+#X msg 38 222 connect 0 0 2 0;
+#X msg 38 246 connect 1 0 2 1;
+#X msg 38 294 connect 2 0 3 0;
+#X msg 38 342 connect 3 0 4 0;
+#X text 195 37 click here first;
+#X obj 38 404 s pd-new_patch;
+#X msg 33 37 obj 500 200 pd new_patch;
+#X text 40 127 and then click here to fill it :;
+#X obj 33 62 s pd-1.2.create_patch.pd;
+#X text 33 13 This will create a sub patch in this window and open
+it :;
+#N canvas 218 113 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 85 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 65 DESCRIPTION how to dynamically instantiate a subpatch
+;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 44 LICENSE public domain;
+#X restore 685 449 pd META;
+#X connect 0 0 11 0;
+#X connect 1 0 11 0;
+#X connect 2 0 11 0;
+#X connect 3 0 11 0;
+#X connect 4 0 11 0;
+#X connect 5 0 11 0;
+#X connect 6 0 11 0;
+#X connect 7 0 11 0;
+#X connect 8 0 11 0;
+#X connect 9 0 11 0;
+#X connect 12 0 14 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/1.3.show_hide.pd b/doc/additional/pd-msg/1.msg_and_patch/1.3.show_hide.pd
new file mode 100644
index 0000000000000000000000000000000000000000..513b101c3e42477239c2f4175fac6472f57b8ebb
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/1.3.show_hide.pd
@@ -0,0 +1,18 @@
+#N canvas 0 18 383 241 10;
+#N canvas 209 154 262 142 my-subpatch 0;
+#X text 37 40 This is the sub patch;
+#X restore 215 98 pd my-subpatch;
+#X msg 33 62 \; pd-my-subpatch vis 1;
+#X msg 37 127 \; pd-my-subpatch vis 0;
+#X text 43 42 pop-up;
+#X text 40 109 close;
+#X text 13 17 pop-up and close a subpatch :;
+#N canvas 218 113 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 85 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 65 DESCRIPTION how to show/hide a patch using messages;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 44 LICENSE public domain;
+#X restore 329 216 pd META;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/2.menu.pd b/doc/additional/pd-msg/1.msg_and_patch/2.menu.pd
new file mode 100644
index 0000000000000000000000000000000000000000..22a16add1526cfd89f43d8199f9b766eb8a2bd32
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/2.menu.pd
@@ -0,0 +1,46 @@
+#N canvas 0 18 222 544 10;
+#X text 17 121 GUI stuff;
+#X msg 17 145 menusave;
+#X msg 17 171 menusaveas;
+#X msg 17 197 menuclose;
+#X msg 17 223 saveto;
+#X msg 17 249 tidy;
+#X msg 17 275 texteditor;
+#X msg 17 434 editmode \$1;
+#X msg 35 408 0;
+#X msg 69 408 1;
+#X msg 17 460 print;
+#X msg 17 301 menufont;
+#X msg 17 353 findagain;
+#X msg 17 379 findparent;
+#X text 68 222 ?????;
+#X obj 17 496 s pd-2.menu.pd;
+#X text 98 196 Warnning !!!;
+#X text 17 33 what the corresponding;
+#X text 15 14 These messages will do exactly;
+#X text 19 52 menu items do.;
+#X msg 17 327 find +test 1;
+#N canvas 218 113 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 65 DESCRIPTION how to access a patch's menu options by sending
+messages to a canvas;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 44 LICENSE public domain;
+#X restore 169 520 pd META;
+#X connect 1 0 15 0;
+#X connect 2 0 15 0;
+#X connect 3 0 15 0;
+#X connect 4 0 15 0;
+#X connect 5 0 15 0;
+#X connect 6 0 15 0;
+#X connect 7 0 15 0;
+#X connect 8 0 7 0;
+#X connect 9 0 7 0;
+#X connect 10 0 15 0;
+#X connect 11 0 15 0;
+#X connect 12 0 15 0;
+#X connect 13 0 15 0;
+#X connect 20 0 15 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/3.0.events.pd b/doc/additional/pd-msg/1.msg_and_patch/3.0.events.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6fcf7ad599e2cabf0a177a37551502f62050b856
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/3.0.events.pd
@@ -0,0 +1,43 @@
+#N canvas 0 18 381 325 10;
+#X msg 36 86 click \$1 \$2 \$3 \$4;
+#X obj 111 182 key;
+#X floatatom 111 208 0 0 0 0 - - -;
+#X floatatom 50 184 0 0 0 0 - - -;
+#X msg 50 158 0;
+#X msg 6 6 bang;
+#X text 56 41 left;
+#X text 124 41 rigth;
+#X text 70 4 Msg-dealing with events :;
+#X text 89 28 click;
+#X text 218 37 \$1 x;
+#X text 218 52 \$2 y;
+#X obj 36 290 s pd-3.0.events.pd;
+#X msg 36 129 mouseup \$1 \$2 \$4;
+#X msg 113 60 15 15 0 8;
+#X msg 36 60 15 15 0 1;
+#X msg 36 257 motion \$1 \$2 \$4;
+#X msg 36 209 key 1 \$1 0;
+#X text 274 84 0:nomod \; 1 shift \; 2 crtl \; 3 alt \; 4 right click)
+;
+#X text 218 82 \$4 mod :;
+#X text 218 67 \$3 (unused ???);
+#X text 73 230 \$1 : number of the key;
+#N canvas 218 113 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 65 DESCRIPTION simulating mouse and key events with messages
+to a canvas;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 44 LICENSE public domain;
+#X restore 325 297 pd META;
+#X connect 0 0 12 0;
+#X connect 1 0 2 0;
+#X connect 3 0 17 0;
+#X connect 4 0 3 0;
+#X connect 13 0 12 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 12 0;
+#X connect 17 0 12 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/3.1.motion.pd b/doc/additional/pd-msg/1.msg_and_patch/3.1.motion.pd
new file mode 100644
index 0000000000000000000000000000000000000000..22fe1f886891b7dc1afdb5c54f0f6cf09bc983f8
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/3.1.motion.pd
@@ -0,0 +1,45 @@
+#N canvas 0 18 415 490 10;
+#N canvas 425 18 332 294 testing 1;
+#X obj 95 11 loadbang;
+#X msg 95 36 0;
+#X obj 12 37 random 127;
+#X floatatom 66 94 0 0 0 0 - - -;
+#X msg 12 11 bang;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 2 0;
+#X restore 119 439 pd testing;
+#X obj 20 438 s pd-testing;
+#X obj 89 247 pack f f;
+#X text 8 54 Start here;
+#X floatatom 120 185 0 0 0 0 - - -;
+#X floatatom 89 186 0 0 0 0 - - -;
+#X obj 100 219 t b f;
+#X text 7 363 Stop here;
+#X text 85 154 try this !!!;
+#X text 9 9 This example will show you how to use the motion msg.;
+#X msg 89 271 motion \$1 \$2 0;
+#X msg 20 390 motion 15 15 0 \, editmode 0 \, vis 0;
+#X msg 20 75 vis 1 \, editmode 1 \, mouse 5 5 0 0 0 \, mouseup 200
+200 0;
+#X msg 20 101 mouse 15 15 0 0 0;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 65 DESCRIPTION simulating mouse motion with messages to
+a canvas;
+#X text 12 42 LICENSE public domain;
+#X restore 364 466 pd META;
+#X connect 2 0 10 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 6 1 2 1;
+#X connect 10 0 1 0;
+#X connect 11 0 1 0;
+#X connect 12 0 1 0;
+#X connect 13 0 1 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/3.2.cut_paste.pd b/doc/additional/pd-msg/1.msg_and_patch/3.2.cut_paste.pd
new file mode 100644
index 0000000000000000000000000000000000000000..058e834a4cb21e3b31917b6c00dfe65d04c53911
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/3.2.cut_paste.pd
@@ -0,0 +1,55 @@
+#N canvas 0 18 425 489 10;
+#N canvas 438 18 368 330 testing 1;
+#X obj 95 10 loadbang;
+#X msg 95 35 0;
+#X obj 12 37 random 127;
+#X floatatom 68 91 0 0 0 0 - - -;
+#X msg 12 11 bang;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 0;
+#X connect 4 0 2 0;
+#X restore 315 409 pd testing;
+#X obj 20 438 s pd-testing;
+#X obj 248 211 pack f f;
+#X text 7 40 Start here;
+#X floatatom 279 149 0 0 0 0 - - -;
+#X floatatom 248 148 0 0 0 0 - - -;
+#X obj 259 183 t b f;
+#X text 38 355 Stop here;
+#X text 17 11 This example will show you how to use the motion msg.
+;
+#X msg 194 307 cut;
+#X msg 194 333 duplicate;
+#X text 50 81 show and select what's in the patch;
+#X text 171 409 close all;
+#X text 231 306 you can try thoses too.;
+#X msg 248 235 motion \$1 \$2 0;
+#X msg 20 60 vis 1 \, editmode 1 \, mouse 5 5 0 0 \, mouseup 200 200
+0;
+#X msg 194 359 selectall;
+#X msg 40 389 motion 15 15 0 \, editmode 0 \, vis 0;
+#X msg 37 146 copy \, paste \, mouse 25 25 0 0;
+#X text 50 125 and then here to copy \, paste ... and move;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 64 DESCRIPTION simulating mouse selections and cut \, copy
+\, and paste by sending messages to a canvas;
+#X text 12 42 LICENSE public domain;
+#X restore 373 458 pd META;
+#X connect 2 0 14 0;
+#X connect 4 0 6 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 6 1 2 1;
+#X connect 9 0 1 0;
+#X connect 10 0 1 0;
+#X connect 14 0 1 0;
+#X connect 15 0 1 0;
+#X connect 16 0 1 0;
+#X connect 17 0 1 0;
+#X connect 18 0 1 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/4.fonts.pd b/doc/additional/pd-msg/1.msg_and_patch/4.fonts.pd
new file mode 100644
index 0000000000000000000000000000000000000000..dd17fbe958f29f84a78390be8a5dccd59891697d
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/4.fonts.pd
@@ -0,0 +1,33 @@
+#N canvas 0 18 405 234 10;
+#X msg 14 26 menufont;
+#X msg 32 64 font 10 100 100;
+#X msg 32 88 font 14 100 100;
+#X msg 30 114 font 24 100 100;
+#X msg 158 86 50;
+#X msg 198 86 200;
+#X msg 158 112 font 10 100 \$1;
+#X msg 274 84 50;
+#X msg 314 84 200;
+#X msg 274 112 font 10 \$1 100;
+#X obj 14 196 s pd-4.fonts.pd;
+#X text 14 3 Here a list of all the messages dealing with fonts :;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 64 DESCRIPTION changing font size with messages to a canvas
+;
+#X text 12 43 LICENSE public domain;
+#X restore 347 206 pd META;
+#X connect 0 0 10 0;
+#X connect 1 0 10 0;
+#X connect 2 0 10 0;
+#X connect 3 0 10 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 6 0 10 0;
+#X connect 7 0 9 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/5.loadbang.pd b/doc/additional/pd-msg/1.msg_and_patch/5.loadbang.pd
new file mode 100644
index 0000000000000000000000000000000000000000..50cd158f2fd4bd56c01ec67dfba6d3adb20d38f0
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/5.loadbang.pd
@@ -0,0 +1,56 @@
+#N canvas 0 18 845 545 10;
+#X msg 39 266 loadbang;
+#X obj 62 152 loadbang;
+#X msg 62 178 1;
+#X floatatom 62 204 0 0 0 0 - - -;
+#X obj 29 123 random 127;
+#X msg 29 98 bang;
+#X text 23 12 The loadbang message;
+#X text 81 98 <= click here first;
+#X text 118 264 <= then click here;
+#X obj 39 292 s pd-5.loadbang.pd;
+#X msg 375 442 loadbang;
+#X msg 450 442 clear;
+#N canvas 448 72 536 411 \$0-dynamic 0;
+#X restore 642 443 pd \$0-dynamic;
+#X obj 328 479 s pd-\$0-dynamic;
+#X text 23 37 Sending a message "loadbang" to a subpatch or abstraction
+receiver will fire all loadbangs in that (sub-)patch.;
+#X msg 328 302 clear \, obj 131 117 lb-abs \, msg 131 153 10 \, obj
+113 178 + \, obj 113 65 loadbang \, msg 113 88 10 \, floatatom 113
+209 5 0 0 0 - - - \, msg 245 154 10 \, obj 227 179 + \, msg 227 89
+10 \, floatatom 227 210 5 0 0 0 - - - \, obj 227 66 lb-abs \, obj 245
+118 loadbang \, connect 0 0 1 0 \, connect 1 0 2 1 \, connect 2 0 5
+0 \, connect 3 0 4 0 \, connect 4 0 2 0 \, connect 6 0 7 1 \, connect
+7 0 9 0 \, connect 8 0 7 0 \, connect 10 0 8 0 \, connect 11 0 6 0
+;
+#X text 325 87 A "loadbang" message is important \, if you create instances
+of abstractions dynamically \, that have loadbangs inside. These loadbangs
+DO NOT FIRE AUTOMATICALLY in dynamically created abstractions!;
+#X text 324 148 Loadbangs in abstractions normally fire before loadbangs
+in the surrounding patch and their loadbangs may propagate to the abstraction's
+outlet. But with dynamic patching \, outlets are not yet connected
+when the object has been created \, which would make such loadbangs
+useless.;
+#X text 327 222 So in the case of dynamic patching \, you're supposed
+to know when you're finished "instantiating" \, and then call "loadbang"
+by yourself by sending a "loadbang" message at the appropriate time.
+;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 64 DESCRIPTION how to fire a loadbang inside a dynamically
+instantiating abstraction;
+#X text 12 42 LICENSE public domain;
+#X restore 782 518 pd META;
+#X connect 0 0 9 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 10 0 13 0;
+#X connect 11 0 13 0;
+#X connect 15 0 13 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/6.relocate_windows.pd b/doc/additional/pd-msg/1.msg_and_patch/6.relocate_windows.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4b1954689de8fb1cb610bec1a7936fcc8de9330e
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/6.relocate_windows.pd
@@ -0,0 +1,100 @@
+#N canvas 0 18 554 615 10;
+#X text 21 35 1 create a new subpatch;
+#X msg 36 89 \; pd-6.relocate_windows.pd obj 400 20 pd my_subpatch
+;
+#X text 22 143 2 send new subpatch relocation messages;
+#X text 42 180 The subpatch needs to be closed in order for this to
+take effect \, so the message closes the patch first \, then reopens
+it after the "relocate" message has been sent.;
+#X obj 48 252 hsl 128 15 0 1700 0 0 \$0-width empty width 12 8 0 10
+-203904 -1 -1 0 0;
+#N canvas 322 162 480 510 pack 0;
+#X obj 20 457 outlet;
+#X obj 23 9 inlet;
+#X obj 70 9 inlet;
+#X obj 70 98 trigger bang float;
+#X obj 200 9 inlet;
+#X obj 320 9 inlet;
+#X obj 320 98 trigger bang float;
+#X obj 200 58 int;
+#X obj 320 58 int;
+#X obj 70 58 int;
+#X obj 20 58 int;
+#X obj 21 220 pack 200 200;
+#X obj 20 352 pack symbol symbol;
+#X obj 217 292 trigger bang symbol;
+#X obj 217 220 pack 100 100;
+#X obj 21 263 zexy/makesymbol %sx%s+0+0;
+#X obj 217 263 zexy/makesymbol 0x0+%s+%s;
+#X connect 1 0 10 0;
+#X connect 2 0 9 0;
+#X connect 3 0 11 0;
+#X connect 3 1 11 1;
+#X connect 4 0 7 0;
+#X connect 5 0 8 0;
+#X connect 6 0 14 0;
+#X connect 6 1 14 1;
+#X connect 7 0 14 0;
+#X connect 8 0 6 0;
+#X connect 9 0 3 0;
+#X connect 10 0 11 0;
+#X connect 11 0 15 0;
+#X connect 12 0 0 0;
+#X connect 13 0 12 0;
+#X connect 13 1 12 1;
+#X connect 14 0 16 0;
+#X connect 15 0 12 0;
+#X connect 16 0 13 0;
+#X restore 27 331 pd pack + bang;
+#X obj 68 272 hsl 128 15 0 1200 0 0 \$0-height empty height 12 8 0
+10 -232576 -1 -1 0 0;
+#X obj 88 292 hsl 128 15 0 1600 0 0 \$0-x empty x 12 8 0 10 -4160 -1
+-1 0 0;
+#X obj 108 312 hsl 128 15 8 1200 0 0 \$0-y empty y 12 8 0 10 -159808
+-1 -1 0 0;
+#X floatatom 203 272 5 0 0 0 - #0-height -;
+#X floatatom 188 253 5 0 0 0 - #0-width -;
+#X floatatom 224 292 5 0 0 0 - #0-x -;
+#X floatatom 244 312 5 0 0 0 - #0-y -;
+#X obj 26 387 delay 200;
+#X msg 97 517 \; pd-my_subpatch menuclose \; pd-my_subpatch relocate
+200x200+1+1 1x1+100+100 \; pd-my_subpatch vis 1;
+#X text 109 492 reset:;
+#X obj 36 61 loadbang;
+#X obj 26 471 pddp/print;
+#X obj 26 364 trigger bang anything bang;
+#X obj 147 445 send pd-my_subpatch;
+#X msg 227 411 menuclose;
+#X msg 101 411 relocate \$1 \$2;
+#X msg 26 411 vis 1;
+#X obj 227 387 purepd/once;
+#N canvas 0 0 450 300 my_subpatch 0;
+#X restore 400 20 pd my_subpatch;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 64 DESCRIPTION move a patch window with messages to a canvas
+;
+#X text 12 43 LICENSE public domain;
+#X restore 496 584 pd META;
+#N canvas 0 0 450 300 my_subpatch 1;
+#X restore 400 20 pd my_subpatch;
+#X connect 4 0 5 0;
+#X connect 5 0 18 0;
+#X connect 6 0 5 1;
+#X connect 7 0 5 2;
+#X connect 8 0 5 3;
+#X connect 13 0 22 0;
+#X connect 13 0 23 1;
+#X connect 16 0 1 0;
+#X connect 18 0 13 0;
+#X connect 18 1 21 0;
+#X connect 18 2 23 0;
+#X connect 20 0 19 0;
+#X connect 21 0 19 0;
+#X connect 21 0 17 0;
+#X connect 22 0 19 0;
+#X connect 23 0 20 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/lb-abs.pd b/doc/additional/pd-msg/1.msg_and_patch/lb-abs.pd
new file mode 100644
index 0000000000000000000000000000000000000000..674d1a565a3ce66ab860a2ccfb9c0f7a6eb9f058
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/lb-abs.pd
@@ -0,0 +1,6 @@
+#N canvas 0 0 450 300 10;
+#X obj 160 102 loadbang;
+#X obj 160 137 outlet;
+#X obj 232 136 print \$0-lb-abs;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
diff --git a/doc/additional/pd-msg/1.msg_and_patch/textfile.txt b/doc/additional/pd-msg/1.msg_and_patch/textfile.txt
new file mode 100644
index 0000000000000000000000000000000000000000..62b6a167980dd77b82055e2fa816c35c03c505d9
--- /dev/null
+++ b/doc/additional/pd-msg/1.msg_and_patch/textfile.txt
@@ -0,0 +1,39 @@
+data;
+template template-toplevel;
+float x;
+float y;
+float z;
+float q;
+array bazoo template-element;
+;
+template template-element;
+float x;
+float y;
+float w;
+;
+;
+template-toplevel 76 177 -66 85;
+0 0 0;
+30 0 0;
+0 111 8;
+-47 22 0;
+0 0 0;
+0 70 0;
+0 70 70;
+70 70 0;
+0 70 0;
+;
+template-toplevel 196 109 77 802;
+-20 77 0;
+0 0 4;
+67 59 0;
+0 76 12;
+-45 -68 0;
+;
+template-toplevel 150 250 20 80;
+0 0 0;
+40 0 4;
+60 50 0;
+100 30 3;
+200 0 0;
+;
diff --git a/doc/additional/pd-msg/2.msg_and_pd/1.pd_basic.pd b/doc/additional/pd-msg/2.msg_and_pd/1.pd_basic.pd
new file mode 100644
index 0000000000000000000000000000000000000000..572145830c661aab9d78468a5082620e6c1ccc6f
--- /dev/null
+++ b/doc/additional/pd-msg/2.msg_and_pd/1.pd_basic.pd
@@ -0,0 +1,23 @@
+#N canvas 0 18 378 475 10;
+#X text 20 51 turn DSP calculation off & on;
+#X msg 98 94 \; pd dsp 0 \;;
+#X msg 172 94 \; pd dsp 1 \;;
+#X msg 24 301 \; pd quit \;;
+#X floatatom 26 73 1 0 1 0 - - -;
+#X obj 26 123 s pd;
+#X msg 26 97 dsp \$1;
+#X msg 25 218 \; pd audiostatus \;;
+#X text 22 194 same as "DIO errors";
+#X text 21 356 There are many more that i don't know :-(;
+#X text 25 12 Here are some messages we can send to pd.;
+#X text 21 275 Quit pd (WARNING);
+#N canvas 437 191 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 65 DESCRIPTION sending messages to a pd instance;
+#X text 12 25 KEYWORDS control pd_op nonlocal;
+#X text 12 45 LICENSE public domain;
+#X restore 317 443 pd META;
+#X connect 4 0 6 0;
+#X connect 6 0 5 0;
diff --git a/doc/additional/pd-msg/2.msg_and_pd/2.open_close.pd b/doc/additional/pd-msg/2.msg_and_pd/2.open_close.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9744eca44c87ebd06915c058e1871f42f45a52ab
--- /dev/null
+++ b/doc/additional/pd-msg/2.msg_and_pd/2.open_close.pd
@@ -0,0 +1,47 @@
+#N canvas 0 18 525 543 10;
+#X text 10 4 open and close an abstraction;
+#X msg 25 205 \; pd-abstraction.pd menuclose \;;
+#X text 25 141 Sometimes you can get relative paths (./ \, ../ \, etc.)
+to work \, but usually not. I don't know why...;
+#X msg 176 434 \; pd open \$1 \$2;
+#X obj 221 369 getdir;
+#X msg 25 63 \; pd open abstraction.pd /usr/local/lib/pd/doc/7.stuff/additional/pd-msg/2.msg_and_pd
+;
+#X text 25 41 OPEN;
+#X text 24 184 CLOSE;
+#X obj 51 418 makefilename pd-%s;
+#X msg 51 441 \; \$1 menuclose \;;
+#X obj 51 396 symbol;
+#X msg 51 310 abstraction.pd;
+#X obj 51 335 trigger bang anything bang;
+#X obj 127 369 symbol;
+#X obj 51 369 del 2000;
+#X obj 176 411 pack s s;
+#X obj 176 369 symbol;
+#X text 27 288 OPEN \, THEN CLOSE AFTER 2 SECONDS;
+#X text 25 109 You have to put the name of the patch to open and its
+complete path;
+#X text 22 241 (you have to put the correct name & a valid path);
+#X text 47 481 you have to put the name of the patch to open (\$1)
+and the complete path to it (\$2);
+#N canvas 437 191 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 95 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control pd_op nonlocal;
+#X text 12 65 DESCRIPTION opening and closing a patch by sending messages
+to Pd;
+#X text 12 45 LICENSE public domain;
+#X restore 445 516 pd META;
+#X connect 4 0 15 1;
+#X connect 8 0 9 0;
+#X connect 10 0 8 0;
+#X connect 11 0 12 0;
+#X connect 12 0 14 0;
+#X connect 12 1 13 0;
+#X connect 12 1 16 0;
+#X connect 12 2 4 0;
+#X connect 13 0 10 1;
+#X connect 14 0 10 0;
+#X connect 15 0 3 0;
+#X connect 16 0 15 0;
diff --git a/doc/additional/pd-msg/2.msg_and_pd/abstraction.pd b/doc/additional/pd-msg/2.msg_and_pd/abstraction.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e09e8fef225a68a9dabf206b67835cb613b48fa2
--- /dev/null
+++ b/doc/additional/pd-msg/2.msg_and_pd/abstraction.pd
@@ -0,0 +1,2 @@
+#N canvas 445 86 454 304 10;
+#X text 68 98 This is your abstraction which you just opened.;
diff --git a/doc/additional/pd-msg/3.pdscript/README.txt b/doc/additional/pd-msg/3.pdscript/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..750e161f5ce1cec7abc0f4958b7b11d4b6219ba2
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/README.txt
@@ -0,0 +1,21 @@
+This is a short example that shows how to "script" a Pd patch with pd commands.
+You will need to have 'pdsend' installed, which is a command line 
+tool for sending messages to Pd.  There is one included in this
+directory which might work for you.
+
+First start Pd with the patch "lispg.pd".  It has a [netreceive 3005]
+object in it which allows the patch to receive messages on port 3005.
+
+# pd -open lisp.pd
+
+Then either start the automated shell script:
+
+# sh ./test.sh
+
+or pipe the Pd commands to 'pdsend' directly:
+
+# pdsend 3005 < test.txt
+
+Read through test.txt for further explanations.
+
+Guenter
diff --git a/doc/additional/pd-msg/3.pdscript/lisp.pd b/doc/additional/pd-msg/3.pdscript/lisp.pd
new file mode 100644
index 0000000000000000000000000000000000000000..34dfa1900b9e382a0229dd9df193a059057e4367
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/lisp.pd
@@ -0,0 +1,2 @@
+#N canvas 417 30 252 94 10;
+#X obj 39 27 netreceive 3005 0 old;
diff --git a/doc/additional/pd-msg/3.pdscript/pdsend b/doc/additional/pd-msg/3.pdscript/pdsend
new file mode 100755
index 0000000000000000000000000000000000000000..cf6339e6a0ffde18f0d11cf8dc26e41bb93317b5
Binary files /dev/null and b/doc/additional/pd-msg/3.pdscript/pdsend differ
diff --git a/doc/additional/pd-msg/3.pdscript/test.sh b/doc/additional/pd-msg/3.pdscript/test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..27b4b5e52dc9185d20ca42aa1840e9458c9f1e69
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/test.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+PORT=3005
+
+
+function setfreq() 
+{
+pdsend $PORT <<EOF
+freq $1 $2;
+EOF
+}
+
+#
+# Read in the script
+#
+./pdsend $PORT < test.txt
+
+sleep 3
+setfreq 220 5000
+sleep 5
+setfreq 1000 100
+sleep 1
+setfreq 100 50
+sleep 1
+setfreq 3000 1000
+sleep 1
+setfreq 100 1000
+sleep 1
+setfreq 3000 1000
+sleep 1
+setfreq 100 1000
+sleep 1
+setfreq 3000 1000
+sleep 1
+setfreq 100 1000
+# and so on
+
+
diff --git a/doc/additional/pd-msg/3.pdscript/test.txt b/doc/additional/pd-msg/3.pdscript/test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..652bfed8b580750a0e868416fe84ea0f7fd72a28
--- /dev/null
+++ b/doc/additional/pd-msg/3.pdscript/test.txt
@@ -0,0 +1,83 @@
+
+// create a new canvas with name "new";
+// important to terminate each command to pd with a ";";
+pd filename new ./;
+#N canvas;
+#X pop 1;
+
+// now we create a osc~ i, *~ and a dac~;
+// the first word is the name of the canvas where the objects;
+// are put (with "pd-" prepended .. hence pd-new);
+// then the "obj" keyword;
+// then comes the position x y,  propose to increment y for each;
+// object by 30, then the patch can still be read with the gui ;
+// then comes the object name and eventual parameters;
+// object number 0 and 1 and 2;
+
+pd-new obj 10 0 osc~ 220;
+pd-new obj 10 30 *~ 0.1;
+pd-new obj 10 60 dac~;
+
+// we connect them together; 
+// we kept track of the objects we have created and can;
+// access them via numbers;
+// pd-new same as above, message connect, then the four parameters;
+// <number-of object> <outlet number> <number of 2nd object> <inlet number>; 
+
+pd-new connect 0 0 1 0;
+pd-new connect 1 0 2 0;
+pd-new connect 1 0 2 1;
+
+// we put a comment;
+// object number 3;
+pd-new text 80 0 This is a comment;
+
+// a Message object;
+// object number 4;
+
+pd-new msg 10 90 440;
+
+// connect it to the osc~;
+
+pd-new connect 4 0 0 0;
+
+// and a number object;
+// nr 5;
+
+pd-new floatatom 10 120;
+
+// connect it;
+
+pd-new connect 5 0 0 0;
+
+// put a communication channel for the frequency (a "receive");
+// nr 6;
+
+pd-new obj 10 150 r freq;
+// a line;
+// nr 7;
+pd-new obj 10 180 line;
+
+// connect receive to the line; 
+
+pd-new connect 6 0 7 0;
+
+// line to the osc~;
+
+pd-new connect 7 0 0 0;
+
+// turn on audio;
+
+pd dsp 1;
+
+// and ... control it the first word is the name of the receive above;
+
+freq 500 4000;
+
+// that's it, there will be several things to figure out, but by writing;
+// this patch down in ascii I get the feeling that coding pd in lisp;
+// will be a killer ... defininitely.;
+// we will be able to automate lots of things I had to do by hand here;
+
+
+
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/0.create_dummy_patch.tk b/doc/additional/pd-msg/4.msg_from_tcl/0.create_dummy_patch.tk
new file mode 100755
index 0000000000000000000000000000000000000000..030d068723b3ed8f5311e83d2ab57d2ab82b8ee6
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/0.create_dummy_patch.tk
@@ -0,0 +1,18 @@
+#!/usr/bin/wish -f
+
+#damien HENRY le 2001 07 14
+
+puts "***********************************************"
+puts "* This will create a patch in pure-data       *"
+puts "* be sure that the recv.pd file is loadded    *"
+puts "***********************************************"
+
+set to_pd [socket localhost 3006]
+
+puts $to_pd "pd-recv.pd obj 10 10 pd new_patch;"
+puts $to_pd "pd-new_patch msg 10 10 bang;"
+puts $to_pd "pd-new_patch msg 10 30 message;"
+puts $to_pd "pd-new_patch connect 0 0 1 0;"
+
+exit
+
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/1.tcl2pd b/doc/additional/pd-msg/4.msg_from_tcl/1.tcl2pd
new file mode 100755
index 0000000000000000000000000000000000000000..883cc78eb7768814ca7da1815c91bac1502a4684
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/1.tcl2pd
@@ -0,0 +1,33 @@
+#!/usr/bin/wish -f
+
+#Here a small exemple that show how to send msg to pd from TCL.
+#damien HENRY
+#dh20010806
+
+puts "*********************"
+puts "* pd -nogui example *"
+puts "* (c) Damien HENRY  *"
+puts "*    This is GPL... *"
+puts "*********************"
+puts ""
+puts "WARNING : you need to run pd -open and load recv.pd first"
+
+#definition of the procedure that send msg to pd
+proc pd_send {string2send} {
+  set to_pd [socket localhost 3006]
+  puts $to_pd $string2send
+  .lmsg configure -text $string2send
+  close $to_pd
+}
+
+#create the gui
+wm title . "a simple tcl/tk gui msg-sender to pd"
+button .bsend -text "send to pd" -width 20  -command {pd_send "$pd_rcv $text2send;"}
+button .bq -text "quit" -width 20  -command {exit}
+entry .msg -textvariable text2send -width 30
+entry .pd_rcv -textvariable pd_rcv -width 10
+label .l1 -text "destination"
+label .l2 -text "msg to send"
+label .lmsg
+
+pack .l1 .pd_rcv .l2 .msg .lmsg .bsend .bq
\ No newline at end of file
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.tk b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.tk
new file mode 100755
index 0000000000000000000000000000000000000000..7911e4b504acc636eb77a0de6b4cd2205a459118
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.tk
@@ -0,0 +1,35 @@
+#!/usr/bin/wish -f
+
+#Here a small exemple that show a way to use the -nogui option.
+#damien HENRY
+#dh20010730
+
+puts "*********************"
+puts "* pd -nogui example *"
+puts "* (c) Damien HENRY  *"
+puts "*    This is GPL... *"
+puts "*********************"
+puts ""
+puts "WARNING : you need to run pd -open recv.pd -nogui first"
+
+#definition of the procedure that send msg to pd
+proc pd_send {string2send} {
+  set to_pd [socket localhost 3006]
+  puts $to_pd "$string2send;"
+  .lmsg configure -text "$string2send;"
+  close $to_pd
+}
+
+#create the gui
+wm title . "a simple tcl/tk gui to open pd-patch"
+label .l1 -text "open :  patch & path"
+entry .pd_patch -textvariable pd_patch -width 23
+entry .pd_path -textvariable pd_path -width 23
+button .bload -text Load -width 20 -command {pd_send "pd open $pd_patch $pd_path" }
+button .bclose -text close -width 20 -command {pd_send "pd-$pd_patch menuclose" }
+button .bdspon -text "dsp on" -width 20  -command {pd_send "pd dsp 1" }
+button .bdspoff -text "dsp off" -width 20  -command {pd_send "pd dsp 0" }
+label .lmsg
+button .bq -text "quit" -width 20  -command {exit}
+
+pack .l1 .pd_patch .pd_path .bload .bclose .bdspon .bdspoff .lmsg .bq
\ No newline at end of file
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.txt b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6bac60179b13a927f49892ccb61d485bab535d30
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/2.nogui.txt
@@ -0,0 +1,12 @@
+This small example show an easy way to use pd without the classical gui.
+
+
+0) run pd -open recv.pd -nogui
+1) run 2.nogui (use wish83 if you are under win xx)
+2) chose an abstraction to open, for example test.pd (in this folder)
+3) turn the dsp on
+4) here you can listen to your abstraction !!!
+
+Enjoy !!!
+
+Damien HENRY.
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/recv.pd b/doc/additional/pd-msg/4.msg_from_tcl/recv.pd
new file mode 100644
index 0000000000000000000000000000000000000000..81910ba69e34e1451498ded563465e0286984136
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/recv.pd
@@ -0,0 +1,8 @@
+#N canvas 357 509 628 150 10;
+#X obj 453 26 netreceive 3006 0 old;
+#X text 27 66 Execute the tcl files in 4.msg_from_tcl. (use wish83if
+your under Win xx);
+#X text 32 10 This patch is here to receive the commands sent by tcl
+scripts;
+#X text 25 92 Have a look to the TCL source to understand how this
+works.;
diff --git a/doc/additional/pd-msg/4.msg_from_tcl/test.pd b/doc/additional/pd-msg/4.msg_from_tcl/test.pd
new file mode 100644
index 0000000000000000000000000000000000000000..bba80296d8bdc29e0fd44917bf61420afea0863e
--- /dev/null
+++ b/doc/additional/pd-msg/4.msg_from_tcl/test.pd
@@ -0,0 +1,10 @@
+#N canvas 357 509 468 150 10;
+#X text 32 10 This patch is here to test the 2.nogui script;
+#X obj 35 32 osc~ 440;
+#X obj 34 82 dac~;
+#X obj 35 56 /~ 50;
+#X text 18 101 Have a look to the TCL source to understand how this
+works.;
+#X connect 1 0 3 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
diff --git a/doc/additional/pd-msg/5.examples/1.polyphonie.pd b/doc/additional/pd-msg/5.examples/1.polyphonie.pd
new file mode 100644
index 0000000000000000000000000000000000000000..01ef4a7aeeae7c7ede5a3755eadec2955554123c
--- /dev/null
+++ b/doc/additional/pd-msg/5.examples/1.polyphonie.pd
@@ -0,0 +1,107 @@
+#N canvas -9 18 894 406 10;
+#X obj 486 176 s as_b;
+#X floatatom 542 147 0 0 0 0 - - -;
+#X obj 542 171 s as_f;
+#X floatatom 617 150 0 0 0 0 - - -;
+#X obj 617 174 s as_bw;
+#X msg 486 107 127;
+#X msg 486 130 1;
+#X msg 486 154 10;
+#X obj 93 110 float;
+#X obj 147 110 + 1;
+#X obj 93 155 select 1;
+#X obj 34 128 delay 0;
+#X msg 93 45 bang;
+#X floatatom 486 201 0 0 0 0 - - -;
+#X obj 486 225 s as_sl;
+#X obj 93 68 t b 0;
+#X text 541 128 mean freq.;
+#X text 616 130 freq. bandwith;
+#X text 530 203 time for change (log);
+#X text 488 87 % of osc that will change;
+#X msg 745 80 127 50 13 74;
+#X obj 745 177 unpack f f f f;
+#X msg 745 101 127 0 75 127;
+#X msg 745 60 127 127 6 127;
+#X text 745 38 examples...;
+#X obj 93 134 < 100;
+#X msg 745 124 127 64 64 127;
+#X obj 807 204 s as_f;
+#X obj 838 225 s as_bw;
+#X text 532 106 <= ACTIVE INLET !!!;
+#X text 95 21 FIRST;
+#X text 303 20 SECOND;
+#X msg 745 147 127 0 0 10;
+#X obj 745 203 s as_b;
+#X obj 776 225 s as_sl;
+#X obj 245 220 float;
+#X obj 299 220 + 1;
+#X obj 245 265 select 1;
+#X obj 186 238 delay 0;
+#X msg 245 155 bang;
+#X obj 245 178 t b 0;
+#X obj 245 244 < 100;
+#X text 135 60 100 asound patch;
+#X text 137 46 this will load;
+#X text 289 171 100 asound patch;
+#X text 289 156 this will remove the;
+#X msg 93 300 \; pd-1.polyphonie.pd obj 10 10 asound \;;
+#X msg 375 464 editmode \$1;
+#X msg 361 284 \; pd-1.polyphonie.pd editmode 1 \; pd-1.polyphonie.pd
+click 12 12 1 1 \; pd-1.polyphonie.pd cut \; pd-1.polyphonie.pd editmode
+0 \;;
+#X msg 306 54 1;
+#X msg 341 55 0;
+#X text 300 186 if created \, if not...;
+#X obj 306 79 switch~;
+#X text 85 -4 kill Asound in the upper left corner to remove all the
+osc.;
+#X text 303 34 turn all asound's on and off;
+#X text 483 65 the controller :;
+#X text 744 24 THIRD;
+#X text 93 340 this msg does it all !!!;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 75 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS signal canvas_op nonlocal dynamic_patching;
+#X text 12 45 DESCRIPTION generating a polyphonic pd patch dynamically
+;
+#X restore 836 376 pd META;
+#X connect 1 0 2 0;
+#X connect 3 0 4 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 9 0;
+#X connect 8 0 25 0;
+#X connect 9 0 8 1;
+#X connect 10 0 46 0;
+#X connect 10 0 11 0;
+#X connect 11 0 8 0;
+#X connect 12 0 15 0;
+#X connect 13 0 14 0;
+#X connect 15 0 8 0;
+#X connect 15 1 8 0;
+#X connect 20 0 21 0;
+#X connect 21 0 33 0;
+#X connect 21 1 34 0;
+#X connect 21 2 27 0;
+#X connect 21 3 28 0;
+#X connect 22 0 21 0;
+#X connect 23 0 21 0;
+#X connect 25 0 10 0;
+#X connect 26 0 21 0;
+#X connect 32 0 21 0;
+#X connect 35 0 36 0;
+#X connect 35 0 41 0;
+#X connect 36 0 35 1;
+#X connect 37 0 38 0;
+#X connect 37 0 48 0;
+#X connect 38 0 35 0;
+#X connect 39 0 40 0;
+#X connect 40 0 35 0;
+#X connect 40 1 35 0;
+#X connect 41 0 37 0;
+#X connect 49 0 52 0;
+#X connect 50 0 52 0;
diff --git a/doc/additional/pd-msg/5.examples/2.create_new_abstract.pd b/doc/additional/pd-msg/5.examples/2.create_new_abstract.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fe1639acc2b765533bdd8f6b0f561de9bba85af5
--- /dev/null
+++ b/doc/additional/pd-msg/5.examples/2.create_new_abstract.pd
@@ -0,0 +1,38 @@
+#N canvas -9 18 505 524 10;
+#X msg 77 224 msg 10 10 bang;
+#X msg 77 272 obj 10 40 metro 500;
+#X msg 77 248 floatatom 100 10 7 50 5000;
+#X msg 77 344 obj 10 70 random 127;
+#X msg 77 392 floatatom 10 100 5;
+#X msg 78 440 text 10 130 That's it !;
+#X obj 30 475 s pd-new;
+#X msg 77 296 connect 0 0 2 0;
+#X msg 77 319 connect 1 0 2 1;
+#X msg 77 368 connect 2 0 3 0;
+#X msg 77 416 connect 3 0 4 0;
+#X msg 40 79 \; pd filename new ./ \; #N canvas \; #X pop 1 \;;
+#X text 53 59 click here first;
+#X text 28 176 And then we fill it with the way describe in 1.add_objects.pd
+;
+#X text 26 15 This describe how to create a new abstraction :;
+#X msg 290 457 menuclose;
+#X text 294 483 this will kill it !;
+#N canvas 458 158 494 396 META 0;
+#X text 12 5 GENRE tutorial;
+#X text 12 75 HELP_PATCH_AUTHORS Damien Henry. "pd meta" information
+added by Jonathan Wilkes for Pd version 0.42.;
+#X text 12 25 KEYWORDS control canvas_op nonlocal dynamic_patching
+;
+#X text 12 45 DESCRIPTION creating a pd patch dynamically;
+#X restore 448 496 pd META;
+#X connect 0 0 6 0;
+#X connect 1 0 6 0;
+#X connect 2 0 6 0;
+#X connect 3 0 6 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 7 0 6 0;
+#X connect 8 0 6 0;
+#X connect 9 0 6 0;
+#X connect 10 0 6 0;
+#X connect 15 0 6 0;
diff --git a/doc/additional/pd-msg/5.examples/asound.pd b/doc/additional/pd-msg/5.examples/asound.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e44f8751750f2ea3d8d0e6948ca7cbd25f2f3713
--- /dev/null
+++ b/doc/additional/pd-msg/5.examples/asound.pd
@@ -0,0 +1,52 @@
+#N canvas -9 18 452 479 10;
+#X obj 105 408 osc~;
+#X obj 105 332 mtof;
+#X obj 105 459 dac~;
+#X obj 105 432 /~ 100;
+#X obj 122 91 random 127;
+#X obj 106 30 r as_b;
+#X obj 106 140 select 1;
+#X obj 106 115 >;
+#X obj 106 52 t f b;
+#X obj 106 164 t b b;
+#X obj 105 308 +;
+#X obj 105 256 -;
+#X obj 56 224 *;
+#X obj 173 225 *;
+#X obj 173 199 random 100000;
+#X obj 56 198 random 100000;
+#X obj 105 283 / 100000;
+#X obj 155 262 r as_f;
+#X obj 100 225 r as_bw;
+#X obj 105 382 line~;
+#X obj 105 357 pack f f;
+#X obj 221 282 r as_sl;
+#X obj 221 305 mtof;
+#X text 12 7 This patch is to illustrate how to use contructions msg
+for polyphonie;
+#X connect 0 0 3 0;
+#X connect 1 0 20 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
+#X connect 4 0 7 1;
+#X connect 5 0 8 0;
+#X connect 6 0 9 0;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 8 1 4 0;
+#X connect 9 0 15 0;
+#X connect 9 1 14 0;
+#X connect 10 0 1 0;
+#X connect 11 0 16 0;
+#X connect 12 0 11 0;
+#X connect 13 0 11 1;
+#X connect 14 0 13 0;
+#X connect 15 0 12 0;
+#X connect 16 0 10 0;
+#X connect 17 0 10 1;
+#X connect 18 0 13 1;
+#X connect 18 0 12 1;
+#X connect 19 0 0 0;
+#X connect 20 0 19 0;
+#X connect 21 0 22 0;
+#X connect 22 0 20 1;
diff --git a/doc/additional/pd-msg/LICENSE.txt b/doc/additional/pd-msg/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..84388cef9844247372ce1bffcb6c23c5ff721b9b
--- /dev/null
+++ b/doc/additional/pd-msg/LICENSE.txt
@@ -0,0 +1,4 @@
+pd-msg is public domain, so you can do everything you want with pd-msg :-)
+
+Cheers,
+Damien
diff --git a/doc/doxygen/pd.doxygen b/doc/doxygen/pd.doxygen
new file mode 100644
index 0000000000000000000000000000000000000000..0d75551124ca92e4d054bef0091f8e9b95dcea00
--- /dev/null
+++ b/doc/doxygen/pd.doxygen
@@ -0,0 +1,206 @@
+# Doxyfile 1.3.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = pd
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = 
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+DISTRIBUTE_GROUP_DOC   = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../../pd/src
+FILE_PATTERNS          = 
+RECURSIVE              = YES
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = 
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = 
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = pd-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = YES
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = NO
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+GRAPHICAL_HIERARCHY    = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 0
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
+
diff --git a/doc/font_sizes.pd b/doc/font_sizes.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a5e2c07a9f05c4b081041b1d894a1f1bffc78837
--- /dev/null
+++ b/doc/font_sizes.pd
@@ -0,0 +1,241 @@
+#N canvas 26 165 1002 607 10;
+#X obj 351 386 cnv 15 69 16 empty empty 69x16 2 12 0 9 -128992 -66577
+0;
+#X obj 351 355 cnv 15 78 20 empty empty 78x20 2 12 0 9 -128992 -66577
+0;
+#X obj 695 387 cnv 15 70 17 empty empty 70x17 2 12 0 9 -128992 -66577
+0;
+#X text 161 389 Mac OS X;
+#X text 160 357 Windows;
+#X text 161 417 GNU/Linux;
+#X obj 775 387 cnv 15 70 17 empty empty 70x17 2 12 0 9 -128992 -66577
+0;
+#X obj 865 387 cnv 15 60 15 empty empty 60x15 2 12 0 9 -128992 -66577
+0;
+#X obj 520 173 cnv 15 100 60 empty empty courier10 20 12 0 8 -233017
+-66577 0;
+#X msg 539 177 courier10;
+#X obj 650 103 cnv 15 100 60 empty empty courier10 20 12 0 9 -233017
+-66577 0;
+#X msg 670 105 courier10;
+#X text 651 124 Windows/0.39.2-extended-test7;
+#X obj 695 357 cnv 15 60 17 empty empty 60x17 2 12 0 9 -128992 -66577
+0;
+#X obj 775 357 cnv 15 60 17 empty empty 60x17 2 12 0 9 -128992 -66577
+0;
+#X obj 351 416 cnv 15 87 19 empty empty 87x19 2 12 0 9 -128992 -66577
+0;
+#X text 17 314 these represent the size of this message box:;
+#X msg 346 313 courier10;
+#X text 15 1 the fonts line up on these platforms:;
+#X obj 139 35 cnv 15 100 60 empty empty courier10 20 12 0 9 -233017
+-66577 0;
+#X msg 157 41 courier10;
+#X text 350 335 0.39.2-extended-test7;
+#X text 697 335 0.39-2;
+#X text 777 334 0.40-2;
+#X text 857 334 devel 0.39-1test1;
+#X obj 501 386 cnv 15 69 16 empty empty 69x16 2 12 0 9 -128992 -66577
+0;
+#X text 500 335 0.38.4-extended;
+#X obj 612 387 cnv 15 70 17 empty empty 70x17 2 12 0 9 -128992 -66577
+0;
+#X text 614 335 0.38-4;
+#X text 18 444 these represent the size of this comment:;
+#X obj 140 240 cnv 15 100 60 empty empty courier10 20 12 0 10 -233017
+-66577 0;
+#X msg 158 243 courier10;
+#X obj 232 500 cnv 7 52 7 empty empty 52x7 2 15 0 11 -128992 -66577
+0;
+#X text 163 499 Mac OS X;
+#X text 162 467 Windows;
+#X text 163 527 GNU/Linux;
+#X obj 784 500 cnv 7 63 8 empty empty 63x8 2 15 0 11 -128992 -66577
+0;
+#X obj 506 500 cnv 7 62 7 empty empty 62x7 2 15 0 11 -128992 -66577
+0;
+#X obj 20 170 cnv 15 100 60 empty empty courier10 20 12 0 12 -233017
+-66577 0;
+#X msg 39 174 courier10;
+#X text 47 212 12 pt;
+#X text 176 284 10pt;
+#X text 686 140 9 pt;
+#X obj 20 35 cnv 15 100 60 empty empty courier10 20 12 0 12 -233017
+-66577 0;
+#X msg 39 39 courier10;
+#X text 47 77 12 pt;
+#X text 40 64 0.38-4;
+#X text 40 199 0.40-2;
+#X text 139 64 devel 0.39-1test1;
+#X text 32 16 ---------- Mac OS X ----------;
+#X obj 614 500 cnv 7 63 8 empty empty 63x8 2 15 0 11 -128992 -66577
+0;
+#X text 435 442 ----------------------------------------------------------
+;
+#X text 445 312 ----------------------------------------------------------
+;
+#X obj 699 500 cnv 7 63 8 empty empty 63x8 2 15 0 11 -128992 -66577
+0;
+#X obj 21 102 cnv 15 100 60 empty empty courier10 20 12 0 12 -233017
+-66577 0;
+#X msg 40 106 courier10;
+#X text 48 144 12 pt;
+#X text 41 131 0.39-2;
+#X text 141 78 9 pt (closest);
+#X obj 870 500 cnv 6 53 6 empty empty 53x6 2 15 0 11 -128992 -66577
+0;
+#X obj 520 103 cnv 15 100 60 empty empty courier10 20 12 0 8 -233017
+-66577 0;
+#X msg 539 107 courier10;
+#X text 548 124 0.39-2;
+#X text 542 16 ---------- Windows ----------;
+#X text 528 140 8 pt (closest);
+#X text 549 197 0.40-2;
+#X obj 699 470 cnv 5 51 5 empty empty 51x5 2 15 0 11 -128992 -66577
+0;
+#X text 526 213 8 pt (closest);
+#X obj 784 470 cnv 5 51 5 empty empty 51x5 2 15 0 11 -128992 -66577
+0;
+#X text 296 443 courier10;
+#X obj 269 102 cnv 15 100 60 empty empty courier10 20 12 0 8 -233017
+-66577 0;
+#X msg 288 106 courier10;
+#X text 297 123 0.39-2;
+#X text 272 16 ---------- GNU/Linux ----------;
+#X obj 381 242 cnv 15 100 60 empty empty courier10 20 12 0 8 -233017
+-66577 0;
+#X msg 399 246 courier10;
+#X text 382 263 0.39.2-extended-RC1;
+#X text 417 279 8 pt;
+#X text 307 139 8 pt;
+#X obj 695 414 cnv 15 69 17 empty empty 69x17 2 12 0 9 -128992 -66577
+0;
+#X obj 700 530 cnv 7 61 8 empty empty 61x8 2 15 0 11 -128992 -66577
+0;
+#X obj 233 416 cnv 15 62 17 empty empty 62x17 2 12 0 9 -128992 -66577
+0;
+#X obj 380 103 cnv 15 100 60 empty empty courier8 20 12 0 8 -233017
+-66577 0;
+#X msg 399 106 courier10;
+#X text 416 140 8 pt;
+#X text 381 124 0.39.2-extended-test7;
+#X obj 355 529 cnv 7 80 10 empty empty 80x10 2 15 0 11 -128992 -66577
+0;
+#X obj 269 170 cnv 15 100 60 empty empty courier10 20 12 0 10 -233017
+-66577 0;
+#X msg 290 175 courier10;
+#X text 298 194 0.40-2;
+#X text 275 210 10 pt (closest);
+#X obj 785 530 cnv 7 61 8 empty empty 61x8 2 15 0 11 -128992 -66577
+0;
+#N canvas 0 22 466 290 instructions 0;
+#X text 18 45 If the sizing was all working nicely \, the fonts would
+line up exactly on the top section when both are set to 10 point since
+they are the same font. That is what we are trying to achieve. But
+that doesn't happen very much. So here are the three tests \, from
+the top to bottom: - top: adjust the font size in the canvas until
+it matches the message box. Move the message box over the canvas font
+so it lines up it exactly. Mark down the font size in the canvas. If
+you can't get an exact match \, write (closest) - middle: copy and
+paste one of the canvases with the dimensions in it (e.g. 69x16). Take
+this canvas and make it fit exactly over the [courier10( message box.
+then put it in the right place in the grid. - bottom: copy and paste
+one of the canvases with the dimensions in it (e.g. 53x6). Take this
+canvas and make it fit exactly over the comment "courier1)". then put
+it in the correct place in the grid.;
+#X obj 364 7 import cyclone;
+#X restore 849 28 pd instructions;
+#X obj 782 150 comment 173 10 helvetica ? 0 0 0 0 adjust the font size
+in the canvas until it matches the message box. Move the message box
+over the canvas font so it lines up it exactly. Mark down the font
+size in the canvas. If you can't get an exact match \, write (closest)
+;
+#X obj 13 340 comment 132 10 helvetica ? 0 0 0 0 copy and paste one
+of the canvases with the dimensions in it (e.g. 69x16). Take this canvas
+and make it fit exactly over the [courier10( message box. then put
+it in the right place in the grid.;
+#X obj 13 480 comment 132 10 helvetica ? 0 0 0 0 copy and paste one
+of the canvases with the dimensions in it (e.g. 53x6). Take this canvas
+and make it fit exactly over the comment "courier10". then put it in
+the correct place in the grid.;
+#X obj 354 499 cnv 7 63 8 empty empty 63x8 2 15 0 11 -128992 -66577
+0;
+#X obj 140 170 cnv 15 100 60 empty empty courier10 20 12 0 12 -233017
+-66577 0;
+#X msg 159 174 courier10;
+#X text 167 212 12 pt;
+#X text 140 196 0.39.2-ext-test7;
+#N canvas 285 122 610 587 get-fontsize 0;
+#X obj 45 79 cnv 10 68 16 empty \$0-cnv 68x16 2 30 0 11 -260818 -128992
+0;
+#X obj 146 165 pack 0 0;
+#X floatatom 146 80 5 0 0 0 - - -;
+#X obj 176 139 t b a;
+#X floatatom 176 119 5 0 0 0 - - -;
+#X obj 146 235 s \$0-cnv;
+#X msg 45 79 courier10;
+#X msg 146 207 vis_size \$1 \$2 \, label \$1x$2;
+#X text 144 261 setting label this way only works with pd >= 0-40;
+#X obj 50 319 cnv 10 55 8 empty \$0-cnv2 55x8 2 30 0 11 -260818 -128992
+0;
+#X obj 152 387 pack 0 0;
+#X floatatom 152 322 5 0 0 0 - - -;
+#X obj 182 361 t b a;
+#X floatatom 182 341 5 0 0 0 - - -;
+#X msg 152 449 vis_size \$1 \$2 \, label \$1x$2;
+#X text 150 503 setting label this way only works with pd >= 0-40;
+#X obj 152 477 s \$0-cnv2;
+#X text 48 316 courier10;
+#X obj 148 45 hsl 128 15 40 80 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X obj 145 61 int;
+#X obj 188 85 hsl 128 15 5 20 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X obj 185 101 int;
+#X obj 154 285 hsl 128 15 40 80 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X obj 151 301 int;
+#X obj 194 305 hsl 128 15 5 20 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X obj 191 321 int;
+#X connect 1 0 7 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 3 1 1 1;
+#X connect 4 0 3 0;
+#X connect 7 0 5 0;
+#X connect 10 0 14 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 12 1 10 1;
+#X connect 13 0 12 0;
+#X connect 14 0 16 0;
+#X connect 18 0 19 0;
+#X connect 19 0 2 0;
+#X connect 20 0 21 0;
+#X connect 21 0 4 0;
+#X connect 22 0 23 0;
+#X connect 23 0 11 0;
+#X connect 24 0 25 0;
+#X connect 25 0 13 0;
+#X restore 852 60 pd get-fontsize;
+#X obj 520 240 cnv 15 100 60 empty empty courier10 20 12 0 10 -233017
+-66577 0;
+#X msg 538 244 courier10;
+#X text 556 284 10pt;
+#X text 520 265 0.39-2-extended-rc2;
+#X obj 233 359 cnv 15 62 17 empty empty 62x17 2 12 0 9 -128992 -66577
+0;
+#X obj 232 470 cnv 7 52 7 empty empty 52x7 2 15 0 11 -128992 -66577
+0;
+#X obj 233 389 cnv 15 62 17 empty empty 62x17 2 12 0 9 -128992 -66577
+0;
+#X obj 270 240 cnv 15 100 60 empty empty courier10 20 12 0 10 -233017
+-66577 0;
+#X msg 288 244 courier10;
+#X text 306 284 10pt;
+#X text 270 265 0.39-2-extended-rc2;
+#X text 140 265 0.39-2-extended-rc2;
+#X obj 232 530 cnv 7 52 7 empty empty 52x7 2 15 0 11 -128992 -66577
+0;
+#X text 221 334 0.39.2-extended-rc2;
diff --git a/doc/media/bach.mid b/doc/media/bach.mid
new file mode 100644
index 0000000000000000000000000000000000000000..301546cdcb85e6fb0ffe4b49785e47d6857084af
Binary files /dev/null and b/doc/media/bach.mid differ
diff --git a/doc/media/kanon.mid b/doc/media/kanon.mid
new file mode 100644
index 0000000000000000000000000000000000000000..a07f5ecaca33130e66304d6eb1ae20bb96910416
Binary files /dev/null and b/doc/media/kanon.mid differ
diff --git a/doc/media/midr-mjpeg.mov b/doc/media/midr-mjpeg.mov
new file mode 100644
index 0000000000000000000000000000000000000000..0f658d3051fb4e9f929af5adaa30135b0fbe292e
Binary files /dev/null and b/doc/media/midr-mjpeg.mov differ
diff --git a/doc/media/nixon.aiff b/doc/media/nixon.aiff
new file mode 100644
index 0000000000000000000000000000000000000000..3a58dc2b50274a478ac59eea4503a2b330250b82
Binary files /dev/null and b/doc/media/nixon.aiff differ
diff --git a/doc/pddp/LICENSE.txt b/doc/pddp/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7f87ef8bc91148faed40be7e930f55c2d5c59036
--- /dev/null
+++ b/doc/pddp/LICENSE.txt
@@ -0,0 +1,340 @@
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR PDP.LICENSE, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/doc/pddp/Nmop~3pIsdn~tno9V~llV.pd b/doc/pddp/Nmop~3pIsdn~tno9V~llV.pd
new file mode 100644
index 0000000000000000000000000000000000000000..63ad08e6abd01033fe48dfa253a71ae5935432da
--- /dev/null
+++ b/doc/pddp/Nmop~3pIsdn~tno9V~llV.pd
@@ -0,0 +1,50 @@
+#N canvas 0 0 448 189 10;
+#X obj 1 165 cnv 15 445 20 empty \$0-pddp.cnv.header Nmop~3p!sdn~+no9V~llV
+175 10 1 18 -261106 -33289 0;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0 14
+-233017 -33289 0;
+#X obj 7 166 pddp/pddplink http://puredata.info/dev/pddp -text dppd
+;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X obj 101 101 cnv 15 45 16 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X text 100 100 VL3W pd;
+#X coords 0 -1 1 1 47 18 2 100 100;
+#X restore 2 3 pd;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X obj 101 101 cnv 15 117 16 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X text 100 100 s+>3(9O~p3+V13J pd;
+#X coords 0 -1 1 1 119 18 2 100 100;
+#X restore 104 3 pd;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X obj 101 91 cnv 15 23 16 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X text 101 100 l +;
+#X obj 65 56 inlet;
+#X obj 131 228 outlet;
+#X text 100 99 T;
+#X coords 0 -1 1 1 25 18 2 100 100;
+#X restore 64 75 pd;
+#X floatatom 64 46 5 0 0 0 - #0-gatom -;
+#N canvas 0 0 450 300 foo 0;
+#X obj 100 100 cnv 10 10 10 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X obj 130 61 inlet;
+#X obj 130 137 s \$0-gatom;
+#X msg 130 115 set \$1;
+#X text 91 26 IT'S A SECRET TO EVERYBODY.;
+#X obj 130 88 + 10000;
+#X connect 1 0 5 0;
+#X connect 3 0 2 0;
+#X connect 5 0 3 0;
+#X coords 0 -1 1 1 10 10 2 100 100;
+#X restore 64 121 pd foo;
+#X msg 64 103 48008;
+#X text 66 133 `pd u! Nmop-3p!sdn H>+Vd o+ ( +|n>!tt!p +n9) 3|9!ssod
+s! +I;
+#X text 109 75 <-- H>+Vd Nmop-3p!sdn;
+#X obj 416 3 pddp/pddplink pddp/help.pd -text d13H;
+#X connect 5 0 8 0;
+#X connect 6 0 5 0;
+#X connect 8 0 7 0;
diff --git a/doc/pddp/TODO b/doc/pddp/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..00278f013185507f20c2cd8e0d72de4689ee79b2
--- /dev/null
+++ b/doc/pddp/TODO
@@ -0,0 +1,13 @@
+
+- create message-help.pd, namecanvas-help.pd and all_about_messages which
+  include [namecanvas] and the additional/pd-msg docs
+
+- check pddplinks to manuals folder (e.g., in all_about_getting_help.pd)
+
+- improve glossary
+
+- finish all_about_externals.pd
+
+- finish all_about_libraries.pd
+
+- update PDDP guidelines (or remove it)
diff --git a/doc/pddp/about/GUIs-about.pd b/doc/pddp/about/GUIs-about.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8baff1edc3ea4fc9785e68b455f8c7f2a7e48b9a
--- /dev/null
+++ b/doc/pddp/about/GUIs-about.pd
@@ -0,0 +1,88 @@
+#N canvas 293 91 803 616 10;
+#X obj 57 73 bng 15 250 50 0 \$1 \$1 empty 20 8 0 8 -262144 -1 -1;
+#X obj 57 105 tgl 15 1.04858e+06 \$2 \$2 empty 20 8 0 8 -262144 -1
+-1 0 1;
+#X obj 56 137 vsl 15 128 0 127 0 1.04858e+06 \$3 \$3 empty 20 8 0 8
+-262144 -1 -1 0 1;
+#X obj 99 72 hsl 128 15 0 127 0 0 \$4 \$4 empty 20 8 0 8 -262144 -1
+-1 0 1;
+#X obj 97 105 hdl 15 1 2.6624e+06 8 \$5 \$5 empty 20 8 192 8 -262144
+-1 -1 0;
+#X obj 96 141 vu 15 120 \$6 empty 35 8 0 8 -66577 -1 1 0;
+#X obj 149 141 cnv 15 100 60 \$7 \$7 \$7 20 12 0 14 -233017 -66577
+1.04858e+06;
+#X obj 261 72 vdl 15 1 4.79232e+06 8 \$9 \$9 empty 20 8 192 8 -262144
+-1 -1 0;
+#X obj 150 218 nbx 5 14 -1e+37 1e+37 0 0 \$8 \$8 empty 45 7 0 10 -262144
+-1 -1 0 256;
+#X text 8 22 Pd comes with a standard \, built-in set of GUI elements
+\, which you can select from the "Put" menu.;
+#X text 16 332 There are also some OS-native GUI elements available
+;
+#X text 403 521 Graph-On-Parent aka GOP is an essential element for
+building elaborate GUIs in Pd.;
+#X obj 44 372 button OK;
+#X obj 142 376 popup 124 25 #ffffff popup option;
+#X text 23 348 [button]:;
+#X text 129 350 [popup]:;
+#X text 424 22 [unauthorized/playlist]:;
+#X text 605 28 [unauthorized/grid]:;
+#X obj 78 303 cnv-edit;
+#X text 16 283 You can edit the look of the above GUI elements with
+this editor:;
+#X text 412 464 toxy's [tot] \, [tow] \, and [widget];
+#X obj 463 53 playlist all 100 100 {Helvetica 10 bold} #457782 yellow
+black red;
+#X obj 632 47 grid grid1 100 0 199 100 0 199 1 1 1 10 10 710 57;
+#X text 17 427 cyclone has some clones of Max GUI objects:;
+#X obj 53 456 Scope~ 130 130 256 3 128 -1 1 0 0 0 0 102 255 51 135
+135 135 0;
+#X text 19 440 [cyclone/Scope~]:;
+#N canvas 308 82 645 525 More 0;
+#X text 440 185 [gcanvas]:;
+#X obj 452 218 gcanvas 80 80;
+#X obj 64 208 probalizer 100 100 100 100 1 0 10 1 10 2 10 3 10 4 10
+5 10 6 10 7 10 8 10 9 10 10 10 11 10 12 10 13 10 14 10 15 10 16 10
+17 10 18 10 19 10 20 10 21 10 22 10 23 10 24 10 25 10 26 10 27 10 28
+10 29 10 30 50 31 50 32 10 33 10 34 10 35 10 36 10 37 10 38 10 39 10
+40 10 41 10 42 10 43 10 44 10 45 10 46 10 47 10 48 10 49 10 50 10 51
+10 52 10 53 10 54 10 55 10 56 10 57 10 58 10 59 10 60 10 61 10 62 10
+63 10 64 54 65 10 66 10 67 55 68 10 69 10 70 10 71 10 72 10 73 10 74
+10 75 10 76 76 77 10 78 10 79 10 80 10 81 10 82 10 83 10 84 10 85 10
+86 10 87 10 88 10 89 10 90 10 91 10 92 10 93 10 94 10 95 10 96 10 97
+10 98 10 99 32;
+#X text 17 188 [unauthorized/probalizer]:;
+#X obj 319 265 image logo100.gif;
+#X text 257 189 [image]:;
+#X obj 443 41 entry 124 100 grey70 yellow;
+#X text 438 6 [entry]:;
+#X text 31 26 [unauthorized_scratcher~]:;
+#X text 222 28 [unauthorized/audience~]:;
+#X obj 75 45 scratcher~ 88200 100 100 25 2 0.01;
+#X obj 261 47 audience~ 100 100 4 2 0.01 0 48 10 97 10 146 10 195 10
+0 190 195 190;
+#X obj -1 -1 cooled~ 1024 300 100 1;
+#X text 292 363 [unauthorized/cooled~]:;
+#X text 8 361 LINK: [unauthorized/pianoroll]:;
+#X text 6 343 Some are crash-prone:;
+#X restore 487 495 pd More GUI elements;
+#X obj 298 372 ticker ;
+#X obj 516 347 state;
+#X text 412 347 State saving:;
+#X text 565 344 memento!;
+#X obj 521 187 envgen 200 140 1 0  ;
+#X text 404 440 libraries: cyclone \, ggee \, unauthorized;
+#X text 398 567 data structures!;
+#X obj 247 479 comment 0 10 helvetica ? 0 0 0 0 this is a comment;
+#X text 195 462 [cyclone/comment]:;
+#X obj 440 223 knob 32 32 0 127 0 0 empty empty empty 0 -8 32 8 -262144
+-1 -1 0 1;
+#X text 434 197 [knob];
+#X obj 569 397 sliderh 127 0 15;
+#X text 591 374 [ggee/sliderh];
+#X text 281 349 [ggee/ticker]:;
+#X text 501 163 [env/envgen]:;
+#X obj 744 326 slider 127 0 15;
+#X text 699 480 [ggee/slider];
+#X text 412 371 [ggee/toddle];
+#X obj 446 401 toddle black 15 15;
diff --git a/doc/pddp/about/mapping-about.pd b/doc/pddp/about/mapping-about.pd
new file mode 100644
index 0000000000000000000000000000000000000000..63eeb30ba809563a4d0e9240781f7c4b08c460db
--- /dev/null
+++ b/doc/pddp/about/mapping-about.pd
@@ -0,0 +1,292 @@
+#N canvas 209 116 779 549 10;
+#X obj 0 0 cnv 15 750 17 empty empty Mapping 10 9 0 16 -233017 -66577
+0;
+#X obj 305 18 cnv 15 445 15 empty empty Getting_your_message_across
+10 7 0 12 -217069 -33289 0;
+#X obj 305 230 cnv 15 445 15 empty empty Broadcasting_with_sends_and_receives
+10 7 0 12 -217069 -33289 0;
+#X obj 305 18 cnv 5 5 500 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 0 500 cnv 15 750 20 bs br PDDP_Project_2005 10 10 0 14 -217069
+-1 0;
+#N canvas 0 22 454 304 META 0;
+#X restore 151 502 pd META;
+#N canvas 696 168 524 404 PAGES 0;
+#X text 19 9 Put your pages here: (They must be named [pd PAGE1] [pd
+PAGE2]... (PAGE0 is the main patch).;
+#N canvas 93 122 779 548 PAGE4 0;
+#X obj 0 0 cnv 15 750 17 empty empty Mapping 10 9 0 16 -233017 -66577
+0;
+#X obj 6 328 cnv 15 300 15 empty empty Related_Objects 10 7 0 12 -217069
+-33289 0;
+#X obj 0 500 cnv 15 750 20 bs br PDDP_2005 10 10 0 14 -217069 -1 0
+;
+#X obj 624 503 bng 15 250 50 0 \$0-previous \$0- Previous -60 8 0 12
+-262144 -1 -1;
+#X obj 644 503 cnv 15 15 15 empty empty 4 0 8 0 12 -217069 -1 0;
+#X obj 660 503 cnv 15 15 15 empty empty of 0 8 0 12 -217069 -1 0;
+#X obj 676 503 cnv 15 25 15 empty 1000-page_count 4 4 8 0 12 -217069
+-1 0;
+#X obj 692 503 bng 15 250 50 0 \$0-next \$0- Next 20 8 0 12 -262144
+-1 -1;
+#X obj 745 0 cnv 5 5 500 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 0 0 cnv 5 5 500 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 305 16 cnv 5 5 485 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 38 388 LINK: universal-help.pd;
+#X obj 18 361 cnv 15 100 17 empty empty cyclone 3 9 0 12 -233017 -1
+0;
+#X text 39 447 LINK: send13-help.pd;
+#X text 39 467 LINK: receive13-help.pd;
+#X obj 18 421 cnv 15 100 17 empty empty ext13 3 9 0 12 -233017 -1 0
+;
+#X obj 305 378 cnv 15 445 15 empty empty More_Info 10 7 0 12 -217069
+-33289 0;
+#X text 345 401 LINK: spiffy example;
+#X text 345 416 LINK: Scope and Locality;
+#X text 345 432 LINK: pd-msg docs;
+#X obj 305 18 cnv 15 445 15 empty empty Sending_And_Receiving_from_Pd_itself
+10 7 0 12 -217069 -33289 0;
+#X text 358 70 blah blah blah \, no text here yet.;
+#X text 17 123 Or draw your own curve:;
+#X obj 192 72 curve_graph;
+#X restore 158 56 pd PAGE4;
+#N canvas 184 134 785 547 PAGE3 0;
+#X obj -70 0 cnv 15 750 17 empty empty Mapping 10 9 0 16 -233017 -66577
+0;
+#X obj 235 18 cnv 15 445 15 empty empty Internal_sends_and_receives
+10 7 0 12 -217069 -33289 0;
+#X obj 235 18 cnv 5 5 500 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj -70 500 cnv 15 750 20 bs br PDDP_2005 10 10 0 14 -217069 -1
+0;
+#X obj 554 503 bng 15 250 50 0 \$0-previous \$0- Previous -60 8 0 12
+-262144 -1 -1;
+#X obj 574 503 cnv 15 15 15 empty empty 3 0 8 0 12 -217069 -1 0;
+#X obj 590 503 cnv 15 15 15 empty empty of 0 8 0 12 -217069 -1 0;
+#X obj 606 503 cnv 15 25 15 empty 1000-page_count 4 4 8 0 12 -217069
+-1 0;
+#X obj 622 503 bng 15 250 50 0 \$0-next \$0- Next 20 8 0 12 -262144
+-1 -1;
+#X obj 235 200 cnv 15 445 15 empty empty Explicit_vs_hidden 10 7 0
+12 -217069 -33289 0;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-sin 100 float 0;
+#X coords 0 1 99 -1 100 100 1;
+#X restore 127 98 graph;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-cos 100 float 0;
+#X coords 0 1 99 -1 100 100 1;
+#X restore 127 217 graph;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-atan 100 float 0;
+#X coords 0 1 99 -1 100 100 1;
+#X restore 127 337 graph;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0s 100 float 0;
+#X coords 0 1 99 0 100 100 1;
+#X restore -70 98 graph;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0c 100 float 0;
+#X coords 0 1 99 0 100 100 1;
+#X restore -70 217 graph;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0a 100 float 0;
+#X coords 0 1 99 0 100 100 1;
+#X restore -70 337 graph;
+#X text 54 77 range;
+#X text 151 78 -1 to 1;
+#X text -43 77 0 to 1;
+#N canvas 487 55 717 697 draw_arrays 0;
+#X msg 77 62 bang;
+#X obj 77 83 until;
+#X text 108 62 start;
+#X obj 77 105 f;
+#X obj 106 105 + 1;
+#X obj 152 107 sel 0;
+#X obj 106 127 mod 100;
+#X obj 77 23 loadbang;
+#X obj 77 156 trigger float float;
+#X obj 77 217 / 50;
+#X obj 77 191 - 50;
+#X obj 483 211 float;
+#X obj 18 217 / 100;
+#X obj 149 38 metro 5000;
+#X obj 149 19 loadbang;
+#X obj 183 255 tabwrite \$0-sin;
+#X obj 183 300 tabwrite \$0-cos;
+#X obj 183 351 tabwrite \$0-atan;
+#X obj 183 445 tabwrite \$0s;
+#X obj 183 485 tabwrite \$0c;
+#X obj 183 536 tabwrite \$0a;
+#X obj 183 236 sinusoid sin;
+#X obj 183 281 sinusoid cos;
+#X obj 183 332 sinusoid atan;
+#X obj 183 420 sinusoid sin;
+#X obj 183 466 sinusoid cos;
+#X obj 183 517 sinusoid atan;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 0 8 0;
+#X connect 4 0 6 0;
+#X connect 5 0 1 1;
+#X connect 6 0 3 1;
+#X connect 6 0 5 0;
+#X connect 7 0 0 0;
+#X connect 8 0 10 0;
+#X connect 8 0 12 0;
+#X connect 8 1 11 0;
+#X connect 9 0 21 0;
+#X connect 9 0 22 0;
+#X connect 9 0 23 0;
+#X connect 10 0 9 0;
+#X connect 11 0 15 1;
+#X connect 11 0 16 1;
+#X connect 11 0 17 1;
+#X connect 11 0 18 1;
+#X connect 11 0 19 1;
+#X connect 11 0 20 1;
+#X connect 12 0 24 0;
+#X connect 12 0 25 0;
+#X connect 12 0 26 0;
+#X connect 13 0 0 0;
+#X connect 14 0 13 0;
+#X connect 21 0 15 0;
+#X connect 22 0 16 0;
+#X connect 23 0 17 0;
+#X connect 24 0 18 0;
+#X connect 25 0 19 0;
+#X connect 26 0 20 0;
+#X restore 36 502 pd draw_arrays;
+#X text 151 198 -1 to 1;
+#X text -43 197 0 to 1;
+#X text 151 318 -1 to 1;
+#X text -43 317 0 to 1;
+#X text 151 438 -1 to 1;
+#X text -43 437 0 to 1;
+#X obj 32 98 sinusoid sin;
+#X obj 36 218 sinusoid cos;
+#X obj 32 337 sinusoid atan;
+#X restore 95 56 pd PAGE3;
+#X text 9 109 Don't forget to set \$0 and the number of pages \, including
+the main page.;
+#X obj 26 156 pddp_page \$0 4;
+#N canvas 137 150 787 558 PAGE2 0;
+#X obj 0 0 cnv 15 750 17 empty empty Mapping 10 9 0 16 -233017 -66577
+0;
+#X obj 305 18 cnv 15 445 15 empty empty Getting_your_message_across
+10 7 0 12 -217069 -33289 0;
+#X obj 305 230 cnv 15 445 15 empty empty Broadcasting_with_sends_and_receives
+10 7 0 12 -217069 -33289 0;
+#X obj 305 18 cnv 5 5 500 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 0 500 cnv 15 750 20 bs br PDDP_Project_2005 10 10 0 14 -217069
+-1 0;
+#X obj 624 503 bng 15 250 50 0 \$0-previous \$0- Previous -60 8 0 12
+-262144 -1 -1;
+#X obj 644 503 cnv 15 15 15 empty empty 2 0 8 0 12 -217069 -1 0;
+#X obj 660 503 cnv 15 15 15 empty empty of 0 8 0 12 -217069 -1 0;
+#X obj 676 503 cnv 15 25 15 empty \$0-page_count 4 4 8 0 12 -217069
+-1 0;
+#X obj 692 503 bng 15 250 50 0 \$0-next \$0- Next 20 8 0 12 -262144
+-1 -1;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-curve 200 float 0;
+#X coords 0 1 199 -1 200 200 1;
+#X restore 87 181 graph;
+#X floatatom 46 58 8 0 0 0 - - -;
+#X floatatom 46 129 8 0 0 0 - - -;
+#X obj 49 146 hsl 200 15 0 1 0 0 empty empty empty 22 8 1 12 -262144
+-1 -1 0 1;
+#X obj 49 38 hsl 200 15 0 1 0 0 empty empty empty 22 8 1 12 -261681
+-1 -1 0 1;
+#N canvas 721 196 411 401 draw_array 0;
+#X msg 54 82 bang;
+#X obj 54 103 until;
+#X text 85 82 start;
+#X obj 54 125 f;
+#X obj 83 125 + 1;
+#X obj 54 43 loadbang;
+#X text 96 257 mapping output range: -1 to 1;
+#X obj 54 180 trigger float float;
+#X obj 127 127 select 0;
+#X obj 53 313 tabwrite \$0-curve;
+#X obj 138 9 inlet;
+#X obj 153 32 send \$0-to-numbox;
+#X obj 139 53 trigger bang float;
+#X obj 53 283 curve;
+#X obj 83 147 mod 200;
+#X obj 53 229 - 100;
+#X obj 54 257 / 100;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 0 7 0;
+#X connect 4 0 14 0;
+#X connect 5 0 0 0;
+#X connect 7 0 15 0;
+#X connect 7 1 9 1;
+#X connect 8 0 1 1;
+#X connect 10 0 11 0;
+#X connect 10 0 12 0;
+#X connect 12 0 0 0;
+#X connect 12 1 13 1;
+#X connect 13 0 9 0;
+#X connect 14 0 3 1;
+#X connect 14 0 8 0;
+#X connect 15 0 16 0;
+#X connect 16 0 13 0;
+#X restore 116 109 pd draw_array;
+#X obj 74 84 hsl 128 15 -1 1 0 1 empty empty empty -2 -6 0 8 -225271
+-1 -1 3600 0;
+#X floatatom 213 85 7 0 0 0 - #0-to-numbox -;
+#X obj 46 108 curve;
+#X connect 11 0 18 0;
+#X connect 12 0 13 0;
+#X connect 14 0 11 0;
+#X connect 16 0 15 0;
+#X connect 16 0 18 1;
+#X connect 18 0 12 0;
+#X restore 31 56 pd PAGE2;
+#X coords 0 0 1.01598e-05 1.58148e-05 96 15 0;
+#X restore 208 502 pd PAGES;
+#X obj 624 503 bng 15 250 50 0 \$0-previous \$0- Previous -60 8 0 12
+-262144 -1 -1;
+#X obj 644 503 cnv 15 15 15 empty empty 1 0 8 0 12 -217069 -1 0;
+#X obj 660 503 cnv 15 15 15 empty empty of 0 8 0 12 -217069 -1 0;
+#X obj 676 503 cnv 15 25 15 empty \$0-page_count 4 4 8 0 12 -217069
+-1 0;
+#X obj 692 503 bng 15 250 50 0 \$0-next \$0- Next 20 8 0 12 -262144
+-1 -1;
+#X obj 187 69 hid_rel2abs;
+#X obj 17 112 hid_smooth;
+#X obj 17 47 notescale;
+#X obj 95 69 hid_centered;
+#X obj 17 158 buttongate;
+#X obj 96 158 keygate;
+#X obj 96 112 hid_average;
+#X text 9 28 SCALING AND RANGING;
+#X text 9 95 SMOOTHING;
+#X obj 93 47 autoscale;
+#X text 9 141 BASIC CONTROLS;
+#X text 10 182 ONE-TO-MANY MAPPING;
+#X obj 17 207 hid_one2two;
+#X obj 102 207 hid_one2three;
+#X text 9 231 POLAR COORDINATES;
+#X text 9 275 ANGLE CONVERSIONS;
+#X obj 181 112 hid_lowpass;
+#X obj 201 207 hid_one2four;
+#X obj 17 69 reverse;
+#X obj 67 248 polar;
+#X obj 110 248 spiral;
+#X obj 17 248 vector;
+#X text 9 340 CURVES;
+#X obj 18 366 curve;
+#X obj 62 366 sinusoid;
+#X obj 141 295 radians->mapping;
+#X obj 143 315 degrees->mapping;
+#X obj 18 295 mapping->radians;
+#X obj 18 315 mapping->degrees;
diff --git a/doc/pddp/about/pddp-about.pd b/doc/pddp/about/pddp-about.pd
new file mode 100644
index 0000000000000000000000000000000000000000..138aa6a7411f56b7d50057afbcb13998c5934f4c
--- /dev/null
+++ b/doc/pddp/about/pddp-about.pd
@@ -0,0 +1,35 @@
+#N canvas 298 124 492 628 10;
+#X text 25 119 The PDDP was proposed initially in early 2002 by Krzysztof
+Czaja who suggested that Pure Data was in need of comprehensive documentation.
+;
+#X text 45 231 - Michal Seta;
+#X text 45 204 - Miller Puckette;
+#X text 45 217 - Dave Sabine;
+#X text 14 374 THINGS TO NOTE:;
+#X text 25 480 Externals and other Libraries: Each PDDP document includes
+mention of "related objects from other Pd libraries" as well as mention
+of "related native Pd objects". The objects from other libraries are
+available only if you download those libraries from their respective
+authors and integrate them properly into your version of Pd. We do
+not and cannot maintain a complete list of externals - but we try.
+For more info about externals and other objects \, see http://www.puredata.org/
+and the Pure Data Base at http://iem.kug.ac.at/pdb/;
+#X text 45 245 - Hans-Christoph Steiner;
+#X text 25 315 All comments \, corrections \, etc. regarding the PDDP
+reference files should be directed to the Pd Developers' list: pd-dev@iem.at
+;
+#X text 26 265 PDDP is now part of the CVS Pd distributions. It was
+originally available at Dave's web site: http://www.davesabine.com/media/puredata.asp
+;
+#X obj 3 2 cnv 15 450 20 empty empty PDDP 2 12 1 18 -233017 -66577
+0;
+#X text 102 5 Pure Data Documentation Project;
+#X obj 25 38 pddp_open table_of_contents;
+#X text 25 392 Authors: If you would like to participate in this project
+\, simply gather together information about objects \, tutorials \,
+examples \, etc. and email pd-dev@iem.at for info about formatting
+your documents. All documents should be committed to the CVS so that
+they will be included in future releases.;
+#X text 25 168 The project was originally managed by Dave Sabine. The
+people involved in this project include (alphabetically):;
+#X obj 25 67 pddp_open glossary;
diff --git a/doc/pddp/about/reverb-about.pd b/doc/pddp/about/reverb-about.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7bf5ca1f12f12d881bac585d4ff0221bb8376ee8
--- /dev/null
+++ b/doc/pddp/about/reverb-about.pd
@@ -0,0 +1,5 @@
+#N canvas 0 22 454 304 10;
+#X obj 101 233 freeverb~;
+#X obj 109 92 rev1~;
+#X obj 105 124 rev2~;
+#X obj 104 157 rev3~;
diff --git a/doc/pddp/abs-help.pd b/doc/pddp/abs-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..67ad07fd27be45dfc5449dadd0088ba20e86df6d
--- /dev/null
+++ b/doc/pddp/abs-help.pd
@@ -0,0 +1,71 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 foo \$0-pddp.cnv.footer empty 20 12 0 14
+-228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header abs 3 12 0 18 -204280
+-1 0;
+#X obj 0 452 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 48 237 507 320 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 35 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 15 KEYWORDS control;
+#X text 12 55 DESCRIPTION absolute value;
+#X text 12 75 INLET_0 float;
+#X text 12 95 OUTLET_0 float;
+#X text 12 175 RELEASE_DATE 1997;
+#X restore 500 598 pd META;
+#X obj 0 511 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 542 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 570 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 546 (none);
+#N canvas 102 479 428 109 Related_objects 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 236 42 sqrt;
+#X obj 271 42 pow;
+#X obj 56 75 cos~;
+#X obj 88 75 osc~;
+#X obj 22 75 expr;
+#X obj 22 42 sin;
+#X obj 48 42 cos;
+#X obj 75 42 tan;
+#X obj 108 42 atan;
+#X obj 143 42 atan2;
+#X obj 181 42 exp;
+#X text 7 1 [abs] Related Objects;
+#X obj 208 42 log;
+#X restore 102 598 pd Related_objects;
+#X obj 78 460 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 479 list;
+#X text 98 518 float;
+#X obj 78 519 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 239 225 0 0 0 0 - - -;
+#X floatatom 239 168 0 0 0 0 - - -;
+#X text 112 248 [abs] will output the absolute value of a number.;
+#X obj 239 198 abs;
+#X obj 492 4 abs;
+#X obj 465 21 pddp/pddplink http://wiki.puredata.info/en/abs -text
+pdpedia: abs;
+#X text 11 24 absolute value;
+#X text 168 479 - a list will be truncated \, and the first element
+will be used as input.;
+#X text 168 518 - the absolute value of the number given at the inlet.
+;
+#X text 98 459 float;
+#X text 168 459 - the incoming value.;
+#X obj 4 598 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 14 0 16 0;
+#X connect 16 0 13 0;
diff --git a/doc/pddp/acoustics-help.pd b/doc/pddp/acoustics-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..42a5416db49445938010be8895d125794bab5246
--- /dev/null
+++ b/doc/pddp/acoustics-help.pd
@@ -0,0 +1,101 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header acoustics 3 12 0
+18 -204280 -1 0;
+#X obj 0 433 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 25 KEYWORDS control conversion MIDI;
+#X text 12 5 NAME mtof ftom dbtorms rmstodb dbtopow powtodb;
+#X text 12 65 DESCRIPTION control objects for conversion;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 536 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 565 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 442 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 540 (none);
+#N canvas 71 422 428 163 Related_objects 0;
+#X text 19 37 Control objects for conversion:;
+#X obj 59 66 dbtorms;
+#X obj 113 66 rmstodb;
+#X obj 167 66 dbtopow;
+#X obj 222 66 powtodb;
+#X obj 22 125 mtof~;
+#X obj 67 125 ftom~;
+#X obj 110 125 dbtorms~;
+#X obj 175 125 rmstodb~;
+#X obj 241 125 dbtopow~;
+#X obj 303 125 powtodb~;
+#X text 19 102 Signal objects for conversion:;
+#X obj 22 66 mtof;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [ftom] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 512 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 441 float;
+#X text 98 468 list;
+#X text 98 512 float;
+#X text 158 468 - lists will be truncated \, and the first element
+will be used as input.;
+#X obj 392 250 ftom;
+#X obj 392 198 mtof;
+#X floatatom 392 170 0 0 0 0 - - -;
+#X floatatom 392 225 0 0 0 0 - - -;
+#X floatatom 392 274 0 0 0 0 - - -;
+#X floatatom 231 170 0 0 0 0 - - -;
+#X floatatom 231 225 0 0 0 0 - - -;
+#X floatatom 231 274 0 0 0 0 - - -;
+#X obj 231 198 dbtorms;
+#X obj 231 250 rmstodb;
+#X floatatom 58 170 0 0 0 0 - - -;
+#X floatatom 58 225 0 0 0 0 - - -;
+#X floatatom 58 274 0 0 0 0 - - -;
+#X obj 58 198 dbtopow;
+#X obj 58 250 powtodb;
+#X obj 258 2 mtof;
+#X obj 294 2 ftom;
+#X obj 330 3 dbtorms;
+#X obj 386 3 rmstodb;
+#X obj 440 3 dbtopow;
+#X obj 497 3 powtodb;
+#X obj 433 20 pddp/pddplink http://wiki.puredata.info/en/acoustics
+-text pdpedia: acoustics;
+#X text 11 23 control objects for conversion;
+#X obj 110 197 pddp/pddplink dbtopow-help.pd -text dbtopow-help;
+#X obj 110 251 pddp/pddplink powtodb-help.pd -text powtodb-help;
+#X obj 282 197 pddp/pddplink dbtorms-help.pd -text dbtorms-help;
+#X obj 282 251 pddp/pddplink rmstodb-help.pd -text rmstodb-help;
+#X obj 426 197 pddp/pddplink ftom-help.pd -text ftom-help;
+#X obj 426 251 pddp/pddplink mtof-help.pd -text mtof-help;
+#X text 158 441 - the incoming value.;
+#X obj 98 569 pddp/pddplink all_about_acoustic_conversions.pd;
+#X text 87 126 Click on the links next to each object for more help:
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 15 0 19 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 18 0 15 0;
+#X connect 20 0 23 0;
+#X connect 21 0 24 0;
+#X connect 23 0 21 0;
+#X connect 24 0 22 0;
+#X connect 25 0 28 0;
+#X connect 26 0 29 0;
+#X connect 28 0 26 0;
+#X connect 29 0 27 0;
diff --git a/doc/pddp/acoustics~-help.pd b/doc/pddp/acoustics~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..80ef70e64899d4bcb45de42390423a2b83257e96
--- /dev/null
+++ b/doc/pddp/acoustics~-help.pd
@@ -0,0 +1,125 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 550 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 550 40 empty \$0-pddp.cnv.header (acoustics~) 3 12
+0 18 -204280 -1 0;
+#X obj 0 424 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 25 KEYWORDS signal conversion MIDI;
+#X text 12 65 DESCRIPTION signal objects for conversion;
+#X text 12 5 NAME mtof~ ftom~ dbtorms~ rmstodb~ dbtopow~ powtodb~;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 536 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 565 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 433 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 540 (none);
+#N canvas 71 422 428 163 Related_objects 0;
+#X text 19 37 Control objects for conversion:;
+#X obj 59 66 dbtorms;
+#X obj 113 66 rmstodb;
+#X obj 167 66 dbtopow;
+#X obj 222 66 powtodb;
+#X obj 22 125 mtof~;
+#X obj 67 125 ftom~;
+#X obj 110 125 dbtorms~;
+#X obj 175 125 rmstodb~;
+#X obj 241 125 dbtopow~;
+#X obj 303 125 powtodb~;
+#X text 19 102 Signal objects for conversion:;
+#X obj 22 66 mtof;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (acoustics) Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 508 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 433 20 pddp/pddplink http://wiki.puredata.info/en/acoustics
+-text pdpedia: acoustics;
+#X text 11 23 signal objects for conversion;
+#X text 98 432 signal;
+#X text 98 508 signal;
+#X text 158 508 - the outgoing signal.;
+#X text 158 432 - the incoming signal.;
+#X floatatom 68 136 0 0 0 0 - - -;
+#X obj 68 160 dbtopow~;
+#X obj 67 217 snapshot~;
+#X floatatom 67 246 0 0 0 0 - - -;
+#X obj 67 294 powtodb~;
+#X obj 67 341 snapshot~;
+#X floatatom 67 368 0 0 0 0 - - -;
+#X obj 242 3 mtof~;
+#X obj 281 3 ftom~;
+#X obj 320 3 dbtorms~;
+#X obj 377 3 rmstodb~;
+#X obj 434 3 dbtopow~;
+#X obj 491 3 powtodb~;
+#X floatatom 248 136 0 0 0 0 - - -;
+#X obj 247 217 snapshot~;
+#X floatatom 247 246 0 0 0 0 - - -;
+#X obj 247 341 snapshot~;
+#X floatatom 247 368 0 0 0 0 - - -;
+#X obj 248 160 dbtorms~;
+#X obj 247 294 rmstodb~;
+#X floatatom 418 136 0 0 0 0 - - -;
+#X obj 417 217 snapshot~;
+#X floatatom 417 246 0 0 0 0 - - -;
+#X obj 417 341 snapshot~;
+#X floatatom 417 368 0 0 0 0 - - -;
+#X obj 418 160 ftom~;
+#X obj 417 294 mtof~;
+#X obj 29 190 bang~;
+#X obj 209 190 bang~;
+#X obj 379 190 bang~;
+#X obj 438 180 pddp/pddplink ftom~-help.pd -text ftom~-help;
+#X obj 88 314 pddp/pddplink powtodb~-help.pd -text powtodb~-help;
+#X obj 268 314 pddp/pddplink rmstodb~-help.pd -text rmstodb~-help;
+#X obj 438 314 pddp/pddplink mtof~-help.pd -text mtof~-help;
+#X obj 268 180 pddp/pddplink dbtorms~-help.pd -text dbtorms~-help;
+#X obj 88 180 pddp/pddplink dbtopow~-help.pd -text dbtopow~-help;
+#X text 98 452 float;
+#X text 158 452 - an incoming float will be converted to a signal.
+;
+#X text 98 472 list;
+#X text 158 472 - a list will be truncated to the first element.;
+#X obj 98 569 pddp/pddplink all_about_acoustic_conversions.pd;
+#X text 97 96 Click on the links under each object for more help:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 22 0 23 0;
+#X connect 30 0 35 0;
+#X connect 31 0 32 0;
+#X connect 32 0 36 0;
+#X connect 33 0 34 0;
+#X connect 35 0 31 0;
+#X connect 36 0 33 0;
+#X connect 37 0 42 0;
+#X connect 38 0 39 0;
+#X connect 39 0 43 0;
+#X connect 40 0 41 0;
+#X connect 42 0 38 0;
+#X connect 43 0 40 0;
+#X connect 44 0 19 0;
+#X connect 44 0 22 0;
+#X connect 45 0 31 0;
+#X connect 45 0 33 0;
+#X connect 46 0 38 0;
+#X connect 46 0 40 0;
diff --git a/doc/pddp/adc~-help.pd b/doc/pddp/adc~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..30d203a01195ceb6154d9e099c3f9d6aab76390b
--- /dev/null
+++ b/doc/pddp/adc~-help.pd
@@ -0,0 +1,150 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header adc~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 292 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 45 DESCRIPTION: audio input;
+#X text 12 65 INLET_0;
+#X text 12 85 OUTLET_N signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 501 597 pd META;
+#X obj 0 329 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 421 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 508 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 79 301 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 96 433 428 209 Related_objects 0;
+#X obj 22 43 dac~;
+#X obj 62 43 switch~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [adc~] Related Objects;
+#X text 114 43 [block~];
+#X text 19 66 (Note: having a [block~] and a [switch~] in the same
+window causes an error \, which is why [block~] is shown above as a
+comment.);
+#X text 19 118 Externals;
+#X obj 173 43 throw~;
+#X obj 225 43 catch~;
+#X obj 277 43 send~;
+#X obj 321 43 receive~;
+#X obj 19 142 pddp/helplink pdogg/oggcast~;
+#X obj 19 162 pddp/helplink unauthorized/mp3cast~;
+#X text 18 183 [shoutcast~] (What library is this object in?);
+#X restore 102 597 pd Related_objects;
+#X obj 490 3 adc~;
+#X obj 466 20 pddp/pddplink http://wiki.puredata.info/en/adc~ -text
+pdpedia: adc~;
+#X text 99 338 signal;
+#X obj 79 338 cnv 17 3 70 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 86 59 adc~;
+#X obj 86 191 adc~ 5;
+#X text 144 192 a mono signal from channel 5;
+#X obj 86 222 adc~ 1 3 8 6 11 15 19 22 23 24 36;
+#X text 360 223 11 channels of audio;
+#X obj 86 252 adc~ 1 2 3 4 5 6 7 8;
+#X text 257 253 all channels on an 8-channel device;
+#X text 130 59 default stereo signals: same as:;
+#X obj 332 60 adc~ 1 2;
+#X text 168 438 - the object defaults to 2 incoming audio channels
+(usually a left and right stereo pair). Any number of arguments (integers)
+can be used to define one or multiple input channels - each integer
+corresponds to an input channel on your audio hardware.;
+#X text 80 438 n) float;
+#X text 169 338 - the number of outlets corresponds with the number
+of arguments - each outlet represents an input channel on your audio
+hardware which corresponds to the argument you provide. If no arguments
+are provided \, then there are two outlets which represent audio channels
+1 and 2 on your computers sound card.;
+#X obj 87 103 env~;
+#X floatatom 87 151 5 0 0 0 - - -;
+#X obj 87 127 spigot;
+#X obj 150 104 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 180 104 <- Click to get amplitude of channel 1;
+#X text 130 151 RMS amplitude (dB);
+#X text 169 300 - the inlet to [adc~] is not used.;
+#X text 99 300 (inactive);
+#X obj 5 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#N canvas 45 94 428 471 Multi-channel_audio 0;
+#X text 19 38 All sound cards are capable of at least two channels
+of audio. Pd supports these two channels by default and uses your system's
+generic audio drivers to communicate with your hardware. However \,
+for faster input/output and for more than two channels of audio \,
+PD incorporates the use of "PortAudio" which uses ASIO drivers to communicate
+with your hardware. So \, to instruct Pd to use more than two channels
+of audio \, your command line should read like below:;
+#X text 80 145 c:/pd/bin/pd.exe -pa -inchannels 8 -outchannels 8;
+#X text 19 174 The "-pa" switch means "PortAudio". This switch is new
+as of Pd version 0.37 TEST 4 and replaces the old "-asio" switch.;
+#X text 19 234 The "-inchannels" and "-outchannels" switches can be
+summarized by using "-channels 8" because currently PortAudio requires
+that the number of incoming and outgoing channels must be equal. This
+may change in the Pd's future...;
+#X text 19 314 To further optimize Pd's usage of your audio hardware
+\, you can explore the following:;
+#X text 29 355 - audiobuf;
+#X text 30 373 - blocksize;
+#X text 29 389 - audioindev;
+#X text 29 407 - audiooutdev;
+#X text 25 433 With the right hardware \, Pd can manage audio input
+and output with lower than 10 milliseconds of latency.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] Multi-channel Audio;
+#X restore 102 542 pd Multi-channel_audio;
+#N canvas 85 194 428 347 sample_rate 0;
+#X text 19 37 [adc~] and [dac~] always operate at the sample rate that
+is specified in Pd's command line. By default \, the sample rate is
+44100 hz. But Pd operates any sample rate supported by standard audio
+hardware. Sample rates cannot be changed at run-time in Pd \, but must
+be stated in the command line when Pd is instantiated. As well \, two
+or more instances of Pd running simoultaneously can each be using different
+sample rates! Having said that \, Pd can easily upsample or downsample
+by using the [block~] object. Here are some example of the common sample
+rates:;
+#X text 19 191 c:/pd/bin/pd.exe -r 11025;
+#X text 19 221 c:/pd/bin/pd.exe -r 22050;
+#X text 19 281 c:/pd/bin/pd.exe -r 88200;
+#X text 19 176 c:/pd/bin/pd.exe -r 8000;
+#X text 19 206 c:/pd/bin/pd.exe -r 16000;
+#X text 19 236 c:/pd/bin/pd.exe -r 32000;
+#X text 19 251 c:/pd/bin/pd.exe -r 44100 CD Quality;
+#X text 19 266 c:/pd/bin/pd.exe -r 48000 DAT Quality;
+#X text 19 311 c:/pd/bin/pd.exe -r 192000 DVD-Audio Quality;
+#X text 19 296 c:/pd/bin/pd.exe -r 96000 DVD-Video/Audio Quality;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] Sample Rate;
+#X restore 102 517 pd sample_rate;
+#N canvas 60 473 428 117 defeating_audio_computation 0;
+#X text 19 37 There may be cases when you do not want Pd to send or
+receive audio signal with your soundcard. You can manually disable
+the [dac~] and [adc~] objects separately using the "-nodac" and "-noadc"
+switch \, or disable both using the "-nosound" switch.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] -nodac and -noadc;
+#X restore 102 567 pd defeating_audio_computation;
+#X text 12 23 audio input;
+#X connect 13 0 25 0;
+#X connect 25 0 27 0;
+#X connect 27 0 26 0;
+#X connect 28 0 27 1;
diff --git a/doc/pddp/adc~_dac~-help.pd b/doc/pddp/adc~_dac~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..17a117757a497e111ef3c18f6270e90baf7a5a3b
--- /dev/null
+++ b/doc/pddp/adc~_dac~-help.pd
@@ -0,0 +1,110 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (adc~/dac~) 3 12
+0 18 -204280 -1 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 25 KEYWORDS signal conversion;
+#X text 12 5 NAME adc~ dac~;
+#X text 12 145 RELEASE_DATE 1997;
+#X text 12 65 DESCRIPTION audio input/output;
+#X restore 501 597 pd META;
+#X obj 0 508 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 98 338 428 239 Related_objects 0;
+#X obj 22 43 dac~;
+#X obj 62 43 switch~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [adc~] Related Objects;
+#X text 114 43 [block~];
+#X text 19 66 (Note: having a [block~] and a [switch~] in the same
+window causes an error \, which is why [block~] is shown above as a
+comment.);
+#X text 19 118 Externals;
+#X obj 173 43 throw~;
+#X obj 225 43 catch~;
+#X obj 277 43 send~;
+#X obj 321 43 receive~;
+#X obj 19 138 pddp/helplink pdogg/oggcast~;
+#X obj 19 158 pddp/helplink unauthorized/mp3cast~;
+#X text 18 180 [shoutcast~] (What library is this in?);
+#X restore 102 597 pd Related_objects;
+#X obj 469 3 adc~;
+#X obj 5 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#N canvas 44 65 428 471 Multi-channel_audio 0;
+#X text 19 38 All sound cards are capable of at least two channels
+of audio. Pd supports these two channels by default and uses your system's
+generic audio drivers to communicate with your hardware. However \,
+for faster input/output and for more than two channels of audio \,
+PD incorporates the use of "PortAudio" which uses ASIO drivers to communicate
+with your hardware. So \, to instruct Pd to use more than two channels
+of audio \, your command line should read like below:;
+#X text 80 145 c:/pd/bin/pd.exe -pa -inchannels 8 -outchannels 8;
+#X text 19 174 The "-pa" switch means "PortAudio". This switch is new
+as of Pd version 0.37 TEST 4 and replaces the old "-asio" switch.;
+#X text 19 234 The "-inchannels" and "-outchannels" switches can be
+summarized by using "-channels 8" because currently PortAudio requires
+that the number of incoming and outgoing channels must be equal. This
+may change in the Pd's future...;
+#X text 19 314 To further optimize Pd's usage of your audio hardware
+\, you can explore the following:;
+#X text 29 355 - audiobuf;
+#X text 30 373 - blocksize;
+#X text 29 389 - audioindev;
+#X text 29 407 - audiooutdev;
+#X text 25 433 With the right hardware \, Pd can manage audio input
+and output with lower than 10 milliseconds of latency.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] Multi-channel Audio;
+#X restore 102 542 pd Multi-channel_audio;
+#N canvas 84 179 428 341 sample_rate 0;
+#X text 19 37 [adc~] and [dac~] always operate at the sample rate that
+is specified in Pd's command line. By default \, the sample rate is
+44100 hz. But Pd operates any sample rate supported by standard audio
+hardware. Sample rates cannot be changed at run-time in Pd \, but must
+be stated in the command line when Pd is instantiated. As well \, two
+or more instances of Pd running simoultaneously can each be using different
+sample rates! Having said that \, Pd can easily upsample or downsample
+by using the [block~] object. Here are some example of the common sample
+rates:;
+#X text 19 191 c:/pd/bin/pd.exe -r 11025;
+#X text 19 221 c:/pd/bin/pd.exe -r 22050;
+#X text 19 281 c:/pd/bin/pd.exe -r 88200;
+#X text 19 176 c:/pd/bin/pd.exe -r 8000;
+#X text 19 206 c:/pd/bin/pd.exe -r 16000;
+#X text 19 236 c:/pd/bin/pd.exe -r 32000;
+#X text 19 251 c:/pd/bin/pd.exe -r 44100 CD Quality;
+#X text 19 266 c:/pd/bin/pd.exe -r 48000 DAT Quality;
+#X text 19 311 c:/pd/bin/pd.exe -r 192000 DVD-Audio Quality;
+#X text 19 296 c:/pd/bin/pd.exe -r 96000 DVD-Video/Audio Quality;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] Sample Rate;
+#X restore 102 517 pd sample_rate;
+#N canvas 59 444 428 117 defeating_audio_computation 0;
+#X text 19 37 There may be cases when you do not want Pd to send or
+receive audio signal with your soundcard. You can manually disable
+the [dac~] and [adc~] objects separately using the "-nodac" and "-noadc"
+switch \, or disable both using the "-nosound" switch.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] -nodac and -noadc;
+#X restore 102 567 pd defeating_audio_computation;
+#X obj 509 3 adc~;
+#X obj 436 20 pddp/pddplink http://wiki.puredata.info/en/adc~_dac~
+-text pdpedia: adc~_dac~;
+#X text 12 23 audio input/output;
+#X obj 101 107 pddp/pddplink adc~-help.pd;
+#X text 98 56 [adc~] and [dac~] provide real-time audio input and output
+for Pd \, respectively \, whether analog or digital. Click below for
+the individual help patches:;
+#X obj 101 127 pddp/pddplink dac~-help.pd;
diff --git a/doc/pddp/all_about.pd b/doc/pddp/all_about.pd
new file mode 100644
index 0000000000000000000000000000000000000000..91c2ba85dabead8b98524c9246f7953b951b3b84
--- /dev/null
+++ b/doc/pddp/all_about.pd
@@ -0,0 +1,46 @@
+#N canvas 0 0 448 374 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header all_about_pd 20
+10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 352 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION general info for Pure Data;
+#X restore 392 354 pd META;
+#N canvas 10 196 428 105 Related_objects 0;
+#X text 31 37 Hm...what to put here?;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 All About Pd- Related Objects;
+#X restore 103 354 pd Related_objects;
+#X obj 6 354 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 24 254 pddp/pddplink cyclone/all_about_cyclone.pd;
+#X text 20 32 The "All About Pd" collection is a detailed reference
+for key concepts \, objects \, and settings in Pure Data.;
+#X obj 23 161 pddp/pddplink all_about_atoms.pd -text 1) All About Atoms
+;
+#X obj 23 181 pddp/pddplink all_about_messages.pd -text 2) All About
+Messages;
+#X obj 23 201 pddp/pddplink all_about_arrays.pd -text 3) All About
+Arrays;
+#X text 20 67 If you're just getting started \, it may be helpful to
+take a few minutes to read the following patches:;
+#X text 20 222 If you're coming from Max/MSP/Jitter \, have a look
+at the cyclone library for compatible objects:;
+#X text 5 315 All PDDP help patches have a link to a general help file
+in the bottom left-hand corner.;
+#X text 20 277 There are many more "All About..." patches:;
+#X obj 20 294 pddp/pddplink all_about_index.pd;
+#X text 20 142 For a brief introduction to data and messages in Pd
+\, see:;
+#X obj 23 99 pddp/pddplink all_about_getting_help.pd -text Pure Data
+Tutorials and Resources;
+#X obj 23 119 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+for Internal Pd Objects;
diff --git a/doc/pddp/all_about_acoustic_conversions.pd b/doc/pddp/all_about_acoustic_conversions.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b047ee37d8954e55210bd36337a6cb4b51d87221
--- /dev/null
+++ b/doc/pddp/all_about_acoustic_conversions.pd
@@ -0,0 +1,621 @@
+#N canvas 0 0 448 570 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header acoustic_conversions
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 180 63 mtof;
+#X floatatom 180 86 0 0 0 0 - - -;
+#X obj 180 110 ftom;
+#X floatatom 180 131 0 0 0 0 - - -;
+#N canvas 13 23 428 336 understanding_mtof 0;
+#X text 19 36 [mtof] will convert MIDI note numbers to Wave Freqeuency.
+This object exists in Pd for the sake of convenience and speed of processing.
+;
+#X obj 45 195 mtof;
+#X floatatom 45 173 5 0 0 0 - - -;
+#X text 85 172 Select a MIDI note: (Middle C is 60).;
+#X floatatom 45 218 5 0 0 0 - - -;
+#X obj 45 237 osc~;
+#X floatatom 107 217 0 0 0 0 - - -;
+#N canvas 396 146 628 393 output 0;
+#X obj 393 156 t b;
+#X obj 393 106 f;
+#X obj 393 56 inlet;
+#X text 399 25 mute;
+#X obj 393 181 f;
+#X msg 480 174 0;
+#X msg 393 81 bang;
+#X obj 393 131 moses 1;
+#X obj 480 149 t b f;
+#X obj 452 113 moses 1;
+#X obj 138 144 dbtorms;
+#X obj 452 88 r master-lvl;
+#X obj 138 38 r master-lvl;
+#X obj 393 206 s master-lvl;
+#X obj 22 181 inlet~;
+#X obj 254 37 inlet;
+#X text 254 14 level;
+#X obj 254 152 s master-lvl;
+#X msg 151 61 set \$1;
+#X obj 151 85 outlet;
+#X obj 138 190 line~;
+#X obj 22 212 *~;
+#X obj 138 167 pack 0 50;
+#X text 34 159 audio;
+#X text 148 106 show level;
+#X obj 73 182 inlet~;
+#X obj 73 213 *~;
+#X obj 22 241 dac~ 1;
+#X obj 73 241 dac~ 2;
+#X msg 290 82 1;
+#X obj 265 59 sel 0;
+#X msg 265 119 \; pd dsp \$1;
+#X msg 265 82 0;
+#X connect 0 0 4 0;
+#X connect 1 0 7 0;
+#X connect 2 0 6 0;
+#X connect 4 0 13 0;
+#X connect 5 0 13 0;
+#X connect 5 0 31 0;
+#X connect 6 0 1 0;
+#X connect 7 0 0 0;
+#X connect 7 1 8 0;
+#X connect 8 0 5 0;
+#X connect 9 1 4 1;
+#X connect 10 0 22 0;
+#X connect 11 0 1 1;
+#X connect 11 0 9 0;
+#X connect 12 0 10 0;
+#X connect 12 0 18 0;
+#X connect 14 0 21 0;
+#X connect 15 0 17 0;
+#X connect 15 0 30 0;
+#X connect 18 0 19 0;
+#X connect 20 0 21 1;
+#X connect 20 0 26 1;
+#X connect 21 0 27 0;
+#X connect 22 0 20 0;
+#X connect 25 0 26 0;
+#X connect 26 0 28 0;
+#X connect 29 0 31 0;
+#X connect 30 0 32 0;
+#X connect 30 1 29 0;
+#X connect 32 0 31 0;
+#X restore 45 262 pd output;
+#X msg 116 239 MUTE;
+#X text 133 217 <-- Turn up your volume here.;
+#X text 19 85 MIDI notes usually range between 0 and 127 from an incoming
+MIDI controller. However \, in Pd negative numbers to -1500 and positive
+numbers to 1499 are also supported and decimal places can be used to
+achive microtonal pitches.;
+#X text 19 145 CONVENIENT? YES!;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [mtof];
+#N canvas 14 48 428 488 Alternatives_to_mtof 0;
+#N canvas 14 48 428 416 mtof_patches 0;
+#X text 25 36 HERE IS THE ALTERNATIVE;
+#X obj 46 97 mtof;
+#X floatatom 46 57 5 0 0 0 - - -;
+#X floatatom 25 121 0 0 0 0 - - -;
+#X floatatom 133 237 0 0 0 0 - - -;
+#X obj 148 88 <= -1500;
+#X obj 148 108 expr 1-$f1;
+#X obj 105 128 spigot;
+#X obj 105 71 t f f;
+#X obj 105 148 min 1499;
+#X obj 105 195 expr (8.17579891564*exp(0.0577622650*$f1));
+#X obj 161 128 s zero;
+#X obj 133 216 r zero;
+#X obj 106 261 bang;
+#X obj 46 258 bang;
+#X obj 46 278 realtime;
+#X floatatom 171 352 0 0 0 0 - - -;
+#X obj 214 275 bang;
+#X obj 171 275 bang;
+#X obj 171 295 realtime;
+#X floatatom 171 316 0 0 0 0 - - -;
+#X obj 375 165 *;
+#X obj 418 118 loadbang;
+#X obj 375 184 exp;
+#X obj 375 204 *;
+#X floatatom 375 224 0 0 0 0 - - -;
+#X obj 407 207 r zero;
+#X text 89 53 Select a MIDI note here.;
+#X text 172 332 Arithmetic is __?__ milliseconds slower than [mtof].
+;
+#X text 169 368 [expr] is __?__ milliseconds slower than [mtof].;
+#X text 22 139 RESULT A;
+#X text 133 252 RESULT B;
+#X text 374 241 RESULT C;
+#X msg 418 139 0.0577623;
+#X msg 418 179 8.1758;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 An alternative to [mtof];
+#X connect 1 0 3 0;
+#X connect 1 0 14 0;
+#X connect 2 0 1 0;
+#X connect 2 0 8 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 1;
+#X connect 6 0 11 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 1 5 0;
+#X connect 9 0 10 0;
+#X connect 9 0 13 0;
+#X connect 9 0 21 0;
+#X connect 10 0 4 0;
+#X connect 12 0 4 0;
+#X connect 13 0 15 1;
+#X connect 14 0 15 0;
+#X connect 14 0 18 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 1;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 21 0 23 0;
+#X connect 22 0 33 0;
+#X connect 22 0 34 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 24 0 17 0;
+#X connect 26 0 25 0;
+#X connect 33 0 21 1;
+#X connect 34 0 24 1;
+#X restore 22 452 pd mtof_patches;
+#X text 19 121 The examples at the botton left are Pd structures which
+emulate the source code of the [mtof] object. In one case \, I have
+used the [expr] object to perform the necessary calculation. In the
+other case \, I used Pd's Arithmetic objects to perform the calculation.
+;
+#X text 19 268 Secondly \, the incoming MIDI note number is translated
+into a frequency value by the simple equation:;
+#X text 19 332 For curiosity's sake \, I included a timer to show how
+much faster the [mtof] object is compared to the two alternative methods.
+;
+#X text 20 37 The [mtof] object is really just a function defined in
+Pd's source code - which is programmed in "C".;
+#X text 20 74 As such \, it operates very quickly. If a similar function
+were to be created using Pd's arithmetic objects \, the process would
+be quite a bit slower. How much slower?;
+#X text 19 376 As well \, notice that RESULT C (the output from Pd's
+basic arithmetic objects) is not as accurate as the other two methods:
+[mtof] and/or [expr]. This is because the message boxes and the [*]
+object round off the operands because they cannot handle enough decimal
+places.;
+#X text 19 190 The first order of business performed by these examples
+is the filtering out of all numbers less than -1500 and greater than
+1499 (Just like the [mtof] source code). In other words \, "overflows
+and underflows are clipped" as Miller Puckette stated in the original
+documentation for this object.;
+#X text 19 302 (8.17579891564 * exp(0.0577622650 * MIDI_note)) = frequency
+;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Alternatives to [mtof];
+#X restore 22 302 pd Alternatives_to_mtof;
+#X connect 1 0 4 0;
+#X connect 2 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 6 0 7 2;
+#X connect 7 0 6 0;
+#X connect 8 0 7 3;
+#X restore 23 63 pd understanding_mtof;
+#N canvas 15 29 428 344 understanding_ftom 0;
+#X floatatom 21 109 5 0 0 0 - - -;
+#X floatatom 21 154 5 0 0 0 - - -;
+#X text 19 89 CONVENIENT? YES!;
+#X text 19 37 [ftom] will convert Wave/Signal Frequency to MIDI note
+numbers. This object exists in Pd for the sake of convenience and speed
+of processing.;
+#X text 61 108 Select a Frequency: (i.e. 440 hz is an "A" above middle
+C);
+#X obj 21 131 ftom;
+#X obj 21 181 makenote 100 500;
+#X obj 21 204 noteout;
+#X text 37 225 Note that fractional values have no effect. MIDI controllers
+only accept integers. Perhaps a subroutine could be designed to parse
+the decimal places and manipulate the pitch bend controller to achieve
+microtonal control?;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [ftom];
+#N canvas 14 48 428 488 Alternatives_to_ftom 0;
+#X text 19 71 As such \, it operates very quickly. If a similar function
+were to be created using Pd's arithmetic objects \, the process would
+be quite a bit slower. How much slower?;
+#X text 19 37 The [ftom] object is really just a function defined in
+Pd's source code - which is programmed in "C".;
+#X text 19 117 The examples at the botton left are Pd structures which
+emulate the source code of the [ftom] object. In one case \, I have
+used the [expr] object to perform the necessary calculation. In the
+other case \, I used Pd's Arithmetic objects to perform the calculation.
+;
+#X text 19 184 Firstly \, the Pd source code "clips" overflows and
+underflows. This means simply that frequencies LESS THAN zero cannot
+be tranlated into a MIDI note value - so they're ignored completely
+and the object responds with "-1500".;
+#X text 19 255 Secondly \, the incoming frequency is translated into
+a MIDI note value by the simple equation:;
+#X text 19 310 For curiosity's sake \, I included a timer to show how
+much faster the [ftom] object is compared to the two alternative methods.
+;
+#X text 19 364 As well \, notice that RESULT C (the output from Pd's
+basic arithmetic objects) is not as accurate as the other two methods:
+[ftom] and/or [expr]. This is because the message boxes and the [*]
+object round off the operands because they cannot handle enough decimal
+places.;
+#X text 19 285 (17.3123405046 * log(0.12231220585 * Frequency)) = MIDI_note
+;
+#N canvas 14 48 428 416 ftom_patches 0;
+#X text 19 39 HERE IS THE ALTERNATIVE;
+#X floatatom 40 60 5 0 0 0 - - -;
+#X floatatom 19 124 0 0 0 0 - - -;
+#X text 16 142 RESULT A;
+#X text 83 56 Select a FREQUENCY here.;
+#X obj 40 100 ftom;
+#X obj 71 80 moses 0;
+#X msg 71 101 -1500;
+#X floatatom 71 232 0 0 0 0 - - -;
+#X floatatom 121 170 0 0 0 0 - - -;
+#X obj 121 137 * 17.3123;
+#X obj 121 97 * 0.122312;
+#X obj 121 117 log;
+#X obj 108 209 expr (17.3123405046*log(.12231220585*$f1));
+#X text 71 247 RESULT B;
+#X text 120 183 RESULT C;
+#X obj 100 273 bang;
+#X obj 40 270 bang;
+#X obj 40 290 realtime;
+#X floatatom 165 364 0 0 0 0 - - -;
+#X obj 208 287 bang;
+#X obj 165 287 bang;
+#X obj 165 307 realtime;
+#X floatatom 165 328 0 0 0 0 - - -;
+#X text 196 344 Arithmetic is __?__ milliseconds slower than [mtof].
+;
+#X text 163 380 [expr] is __?__ milliseconds slower than [mtof].;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 An alternative to [ftom];
+#X connect 1 0 5 0;
+#X connect 1 0 6 0;
+#X connect 2 0 17 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 6 1 11 0;
+#X connect 6 1 13 0;
+#X connect 7 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 16 0;
+#X connect 9 0 20 0;
+#X connect 10 0 9 0;
+#X connect 11 0 12 0;
+#X connect 12 0 10 0;
+#X connect 13 0 8 0;
+#X connect 16 0 18 1;
+#X connect 17 0 18 0;
+#X connect 17 0 21 0;
+#X connect 18 0 19 0;
+#X connect 20 0 22 1;
+#X connect 21 0 22 0;
+#X connect 22 0 23 0;
+#X restore 22 442 pd ftom_patches;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Alternatives to [ftom];
+#X restore 21 297 pd Alternatives_to_ftom;
+#X connect 0 0 5 0;
+#X connect 1 0 6 0;
+#X connect 5 0 1 0;
+#X connect 6 0 7 0;
+#X connect 6 1 7 1;
+#X restore 23 110 pd understanding_ftom;
+#X floatatom 180 42 0 0 0 0 - - -;
+#X floatatom 180 212 0 0 0 0 - - -;
+#X floatatom 180 257 0 0 0 0 - - -;
+#X floatatom 180 168 0 0 0 0 - - -;
+#X obj 180 189 dbtorms;
+#X obj 180 236 rmstodb;
+#N canvas 14 77 428 407 understanding_dbtorms 0;
+#N canvas 3 118 452 302 What_is_a_decibel? 0;
+#X text 24 94 The difficulty in measuring the volume of an instrument
+however is caused by 'distance'. For example \, at one metre away from
+a door bell \, the amplitude might be 70 Decibels \, while at 50 metres
+away the same door bell is just a fraction of that amplitude.;
+#X text 25 33 DECIBELS are units by which we measure amplitude. A human
+voice is approximately 70 Decibels - a snare drum is approximately
+120 Decibels - the threshold of pain for the human ear is approximately
+110 Decibels (poor drummers!);
+#X text 23 174 Literally \, a Decibel is one-tenth of a Bel. A Bel
+\, according to a medical dictionary is approximately the threshold
+of the human ear at 1000 hz. I know that this seems a little vague
+\, and perhaps this isn't the best way to explain it - we might as
+well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
+not an acoustician.;
+#X restore 20 350 pd What_is_a_decibel?;
+#N canvas 5 174 440 242 What_does_RMS_mean? 0;
+#X text 24 21 RMS is an acronym meaning "Root Mean Square".;
+#X text 23 43 In the analog realm \, RMS is the result of an equation
+performed on electrical flow. It is used to measure voltage or current.
+It is important to note however \, that it does NOT measure "power".
+It's also important to recognize that our ears perceive changes in
+amplitude (decibels) more than we perceive changes in RMS levels.;
+#X text 23 133 In the digital realm \, i.e. Pd! \, RMS is better defined
+as "a measurement of a signal taken by squaring data points along the
+curve \, finding the mean \, and then determining the square root of
+that mean value.;
+#X restore 20 373 pd What_does_RMS_mean?;
+#X text 17 158 Example:;
+#X floatatom 20 210 0 0 0 0 - - -;
+#X obj 20 230 moses 0;
+#X msg 20 250 0;
+#X obj 82 269 min 485;
+#X floatatom 20 314 0 0 0 0 - - -;
+#X obj 147 227 dbtorms;
+#X floatatom 147 247 0 0 0 0 - - -;
+#X obj 82 289 expr (exp((2.302585092994*0.05)*($f1-100)));
+#X text 18 116 On a scale of zero to 100 decibels \, the [dbtorms]
+produces exponential values between 0 and 1;
+#X msg 20 181 0;
+#X msg 53 181 100;
+#X obj 57 249 sel 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [dbtorms];
+#X text 18 92 (exp((2.302585092994 * 0.05) * (db_value - 100)) = RMS
+;
+#X text 18 37 [dbtorms] in Pd performs the following equation to convert
+the data: Note that incoming values less than 0 or greater than 485
+are considered overflow or underflow and are clipped/ignored.;
+#X connect 3 0 4 0;
+#X connect 3 0 8 0;
+#X connect 4 0 5 0;
+#X connect 4 1 14 0;
+#X connect 5 0 7 0;
+#X connect 6 0 10 0;
+#X connect 8 0 9 0;
+#X connect 10 0 7 0;
+#X connect 12 0 3 0;
+#X connect 13 0 3 0;
+#X connect 14 0 5 0;
+#X connect 14 1 6 0;
+#X restore 23 189 pd understanding_dbtorms;
+#X floatatom 180 338 0 0 0 0 - - -;
+#X floatatom 180 383 0 0 0 0 - - -;
+#X floatatom 180 294 0 0 0 0 - - -;
+#X obj 180 315 dbtopow;
+#X obj 180 362 powtodb;
+#N canvas 13 87 428 440 understanding_rmstodb 0;
+#N canvas 4 161 452 302 What_is_a_decibel? 0;
+#X text 24 94 The difficulty in measuring the volume of an instrument
+however is caused by 'distance'. For example \, at one metre away from
+a door bell \, the amplitude might be 70 Decibels \, while at 50 metres
+away the same door bell is just a fraction of that amplitude.;
+#X text 25 33 DECIBELS are units by which we measure amplitude. A human
+voice is approximately 70 Decibels - a snare drum is approximately
+120 Decibels - the threshold of pain for the human ear is approximately
+110 Decibels (poor drummers!);
+#X text 23 174 Literally \, a Decibel is one-tenth of a Bel. A Bel
+\, according to a medical dictionary is approximately the threshold
+of the human ear at 1000 hz. I know that this seems a little vague
+\, and perhaps this isn't the best way to explain it - we might as
+well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
+not an acoustician.;
+#X restore 21 383 pd What_is_a_decibel?;
+#N canvas 3 246 440 242 What_does_RMS_mean? 0;
+#X text 24 21 RMS is an acronym meaning "Root Mean Square".;
+#X text 23 43 In the analog realm \, RMS is the result of an equation
+performed on electrical flow. It is used to measure voltage or current.
+It is important to note however \, that it does NOT measure "power".
+It's also important to recognize that our ears perceive changes in
+amplitude (decibels) more than we perceive changes in RMS levels.;
+#X text 23 133 In the digital realm \, i.e. Pd! \, RMS is better defined
+as "a measurement of a signal taken by squaring data points along the
+curve \, finding the mean \, and then determining the square root of
+that mean value.;
+#X restore 21 406 pd What_does_RMS_mean?;
+#X text 18 157 Example:;
+#X floatatom 21 179 0 0 0 0 - - -;
+#X floatatom 21 345 0 0 0 0 - - -;
+#X floatatom 148 279 0 0 0 0 - - -;
+#X msg 65 201 0;
+#X text 18 107 On a scale of zero to 1 decibels \, the [rmstodb] produces
+logarithmic values between 0 and 100 \, although higher values can
+also be produced.;
+#X obj 148 257 rmstodb;
+#X obj 21 279 max 0;
+#X obj 21 323 max 0;
+#X obj 21 301 expr (100+((20/2.302585092994)*log($f1)));
+#X obj 21 201 / 1000;
+#X floatatom 21 233 0 0 0 0 - - -;
+#X msg 98 201 1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [rmstodb];
+#X text 18 82 (100 + ((20/2.302585092994) * log(RMS_value)));
+#X text 18 37 [rmstodb] in Pd performs the following equation to convert
+the data: Note that incoming values less than 0 is consider underflow
+and is clipped/ignored.;
+#X connect 3 0 12 0;
+#X connect 6 0 13 0;
+#X connect 8 0 5 0;
+#X connect 9 0 11 0;
+#X connect 10 0 4 0;
+#X connect 11 0 10 0;
+#X connect 12 0 13 0;
+#X connect 13 0 8 0;
+#X connect 13 0 9 0;
+#X connect 14 0 13 0;
+#X restore 23 236 pd understanding_rmstodb;
+#N canvas 7 22 428 333 understanding_dbtopow 0;
+#N canvas 0 46 452 302 What_is_a_decibel? 0;
+#X text 24 94 The difficulty in measuring the volume of an instrument
+however is caused by 'distance'. For example \, at one metre away from
+a door bell \, the amplitude might be 70 Decibels \, while at 50 metres
+away the same door bell is just a fraction of that amplitude.;
+#X text 25 33 DECIBELS are units by which we measure amplitude. A human
+voice is approximately 70 Decibels - a snare drum is approximately
+120 Decibels - the threshold of pain for the human ear is approximately
+110 Decibels (poor drummers!);
+#X text 23 174 Literally \, a Decibel is one-tenth of a Bel. A Bel
+\, according to a medical dictionary is approximately the threshold
+of the human ear at 1000 hz. I know that this seems a little vague
+\, and perhaps this isn't the best way to explain it - we might as
+well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
+not an acoustician.;
+#X restore 22 267 pd What_is_a_decibel?;
+#X floatatom 22 128 0 0 0 0 - - -;
+#X floatatom 22 234 0 0 0 0 - - -;
+#X floatatom 149 167 0 0 0 0 - - -;
+#N canvas 3 96 442 209 What_does_power_mean? 0;
+#X text 30 25 What does power mean? I really don't know? I can't determine
+from my own research or from Pd's documentation why or how this data
+is used. All that I do know \, is that Pd provides these objects for
+a good reason -- I just don't know the reason.;
+#X text 27 103 Having said that \, I would enjoy learning from somebody
+who DOES know more about these objects and their usage. All that I
+can offer is an explanation of the equation used to perform these conversions.
+;
+#X restore 22 290 pd What_does_power_mean?;
+#X obj 149 145 dbtopow;
+#X obj 22 150 max 0;
+#X obj 22 172 min 870;
+#X text 19 92 exp((2.302585092994 * 0.1) * (db_value - 100)) = Power
+;
+#X obj 22 194 expr exp((2.302585092994*0.1)*($f1-100));
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [dbtopow];
+#X text 19 37 [dbtopow] in Pd performs the following equation to convert
+the data: Note that incoming values less than 0 or greater than 870
+are considered overflow or underflow and are clipped/ignored.;
+#X connect 1 0 5 0;
+#X connect 1 0 6 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 9 0;
+#X connect 9 0 2 0;
+#X restore 23 315 pd understanding_dbtopow;
+#N canvas 13 22 428 336 understanding_powtodb 0;
+#N canvas 0 22 452 302 What_is_a_decibel? 0;
+#X text 24 94 The difficulty in measuring the volume of an instrument
+however is caused by 'distance'. For example \, at one metre away from
+a door bell \, the amplitude might be 70 Decibels \, while at 50 metres
+away the same door bell is just a fraction of that amplitude.;
+#X text 25 33 DECIBELS are units by which we measure amplitude. A human
+voice is approximately 70 Decibels - a snare drum is approximately
+120 Decibels - the threshold of pain for the human ear is approximately
+110 Decibels (poor drummers!);
+#X text 23 174 Literally \, a Decibel is one-tenth of a Bel. A Bel
+\, according to a medical dictionary is approximately the threshold
+of the human ear at 1000 hz. I know that this seems a little vague
+\, and perhaps this isn't the best way to explain it - we might as
+well be measuring "fortnights" and "bunches" and "Alens"! Anyways...I'm
+not an acoustician.;
+#X restore 22 274 pd What_is_a_decibel?;
+#X text 19 110 Example:;
+#X floatatom 22 131 0 0 0 0 - - -;
+#X floatatom 22 237 0 0 0 0 - - -;
+#X floatatom 149 170 0 0 0 0 - - -;
+#N canvas 2 68 442 244 What_does_power_mean? 0;
+#X text 30 25 What does power mean? I really don't know? I can't determine
+from my own research or from Pd's documentation why or how this data
+is used. All that I do know \, is that Pd provides these objects for
+a good reason -- I just don't know the reason.;
+#X text 27 103 Having said that \, I would enjoy learning from somebody
+who DOES know more about these objects and their usage. All that I
+can offer is an explanation of the equation used to perform these conversions.
+;
+#X restore 22 297 pd What_does_power_mean?;
+#X text 18 37 [powtodb] in Pd performs the following equation to convert
+the data: Note that incoming values less than 0 are considered underflow
+and are clipped/ignored.;
+#X text 17 84 (100 + ((10/2.302585092994) * log(POWER_value))) = Debibels
+;
+#X obj 149 148 powtodb;
+#X obj 22 153 max 0;
+#X obj 22 193 expr (100 + ((10/2.302585092994)*log($f1)));
+#X obj 22 215 max 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Understanding [powtodb];
+#X connect 2 0 8 0;
+#X connect 2 0 9 0;
+#X connect 8 0 4 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 3 0;
+#X restore 23 362 pd understanding_powtodb;
+#X text 215 63 - MIDI note number to frequency;
+#X text 215 110 - Frequency to MIDI note number;
+#X text 234 190 - Decibels to RMS;
+#X text 234 237 - RMS to Decibels;
+#X text 234 316 - Decibels to power;
+#X text 234 363 - power to Decibels;
+#X text 21 412 Please note: I have no idea why it's necessary for Pd
+to measure decibels \, rms \, or power. It seems to me that RMS and
+Power are extremely important in the analog world (so that an engineer
+doesn't blow up a transistor)...but in Pd \, these things are just
+numbers which have been abstracted from their original analog counterparts.
+I would really appreciate if somebody could help me understand these
+concepts and finish this document. Why are these objects present in
+Pd? WHY should they be used and what benefits to they produce in a
+digital process?;
+#X obj 1 548 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 323 229 494 344 META 0;
+#X text 12 115 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 KEYWORDS conversion;
+#X text 12 95 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME mtof ftom dbtorms rmstodb dbtopow powtodb;
+#X text 12 65 DESCRIPTION examples of objects that do conversions between
+acoustic units;
+#X restore 392 550 pd META;
+#N canvas 12 355 428 212 Related_objects 0;
+#X obj 23 42 dbtopow~;
+#X obj 77 42 dbtorms~;
+#X obj 132 42 rmstodb~;
+#X obj 187 42 powtodb~;
+#X obj 242 42 mtof~;
+#X obj 279 42 ftom~;
+#X obj 23 69 expr;
+#X obj 58 69 expr~;
+#X obj 98 69 sig~;
+#X obj 132 69 snapshot~;
+#X text 150 99 [rmstopow~];
+#X text 230 99 [powtorms~];
+#X text 150 120 [b2db];
+#X text 193 120 [tmtof];
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Acoustic Objects- Related Objects;
+#X obj 21 122 pddp/helplink iemlib/db2v;
+#X obj 21 142 pddp/helplink iemlib/f2note;
+#X obj 21 162 pddp/helplink iemlib/t3_sig~;
+#X obj 21 182 pddp/helplink iemlib/m2f~;
+#X obj 21 103 pddp/pddplink all_about_externals.pd -text _________
+;
+#X obj 21 103 pddp/pddplink all_about_externals.pd -text Externals
+;
+#X text 152 135 Which library for these four?;
+#X restore 103 550 pd Related_objects;
+#X obj 6 549 pddp/pddplink all_about.pd -text All About Pd;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 8 0 2 0;
+#X connect 9 0 13 0;
+#X connect 11 0 12 0;
+#X connect 12 0 9 0;
+#X connect 13 0 10 0;
+#X connect 15 0 19 0;
+#X connect 17 0 18 0;
+#X connect 18 0 15 0;
+#X connect 19 0 16 0;
diff --git a/doc/pddp/all_about_arrays.pd b/doc/pddp/all_about_arrays.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6631d78dd808185d9b17763b452018425ffdddf2
--- /dev/null
+++ b/doc/pddp/all_about_arrays.pd
@@ -0,0 +1,834 @@
+#N struct ds-array-ex float x float y array circles circle;
+#N struct circle float y symbol a;
+#N canvas 0 0 448 312 10;
+#N canvas 12 67 428 377 Common_uses_for_arrays_in_PD 0;
+#X text 20 37 Arrays are versatile. Their simple structure make them
+useful in countless situations. This page discusses perhaps the most
+common applications.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Common Uses for Arrays in Pd;
+#X text 20 81 1) Audio sample data: when an array's values are limited
+to a range between -1 and 1 \, the numbers are suitable for conversion
+to analog audio signal. These arrays are typically many thousands of
+elements and stored on hard disk in the form of aiff \, wav or pure
+text.;
+#X text 20 149 2) MIDI Sequencers: array values limited to a range
+between 0 and 127 are suitable for MIDI output to be used as pitch
+\, velocity \, or controller numbers. Some MIDI information requires
+a much larger range \, such as pitch benders.;
+#X text 20 207 3) Envelopes: an array with four elements can be used
+effectively as an ADSR enveloper. There are numerous examples of this
+in other Pd help documents.;
+#X text 20 253 4) Math and conversion tables: arrays are an excellent
+visual tool when performing Fourier analysis and other higher mathematic
+functions.;
+#X text 20 300 5) Wave editing: with proper manipulation of array data
+\, Pd can be a fully functional wave editor \, complete with mouse-clickable
+cut-n-paste \, pitch-shift \, time expansion \, down/upsampling \,
+and other tools typically found in commercial wave editors.;
+#X restore 43 135 pd Common_uses_for_arrays_in_PD;
+#X text 40 180 This document is meant to supplement the help documentation
+for [table] \, [tabread] \, [tabwrite] \, [soundfiler] \, [tabsend~]
+\, [tabreceive~] \, [tabplay~] \, etc.;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header arrays 20 10 1 18
+-261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 290 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 284 META 0;
+#X text 12 95 LIBRARY PDDP;
+#X text 12 115 HELP_PATCH_AUTHORS Updated for Pd 0.38-2. Jonathan Wilkes
+revised the patch to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS array storage;
+#X text 12 25 NAME table struct;
+#X text 12 65 DESCRIPTION description of arrays and related objects
+for creating and managing them;
+#X restore 392 292 pd META;
+#N canvas 13 162 428 183 Related_objects 0;
+#X obj 22 41 struct;
+#X obj 76 41 plot;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Arrays- Related Objects;
+#X obj 121 41 list;
+#X obj 20 120 pddplink all_about_expr_functions.pd;
+#X text 20 76 The [expr] family objects have some limited functionality
+for dealing with arrays. See heading "Array/Table Functions" in:;
+#X restore 103 292 pd Related_objects;
+#X obj 6 292 pddp/pddplink all_about.pd -text All About Pd;
+#N canvas 14 48 428 287 What_is_an_array_in_PD 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What is an Array in Pure Data?;
+#X text 19 36 Arrays \, in most programming environments \, are considered
+to be "a sequence of objects all of which have the same variable type"
+wherein each object is called an element and the elements are numbered
+in a row: 0 \, 1 \, 2 \, 3 \, etc. These numbers are called indices.
+Each index holds a corresponding value.;
+#X text 19 119 All of this is true in Pd \, although the word "array"
+is often used loosely to refer to three different concepts:;
+#X text 19 146 1) an array as defined above.;
+#X text 19 161 2) a graphical representation of an array \, or "garray"
+\, created by:;
+#X text 37 186 a) choosing "Array" from the "Put" menu \, or;
+#X text 37 201 b) creating a [table] object (in which case it's hidden
+inside a subpatch).;
+#X text 19 228 3) (less commonly) an array defined (and possibly represented
+graphically) as part of a data structure.;
+#X restore 43 42 pd What_is_an_array_in_PD;
+#N canvas 0 0 428 403 The_Put_menu_array 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-pddp-garray-ex1 100 float 2;
+#X coords 0 1 99 -1 200 140 1;
+#X restore 22 73 graph;
+#X text 233 149 the black line to change;
+#X text 227 134 (You can click-drag the;
+#X text 233 164 the values of the array);
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 19 331 An explanation of how to create a "Put" menu garray
+\, as well as what all the properties mean \, is outlined below:;
+#X text 7 1 The Put Menu Graphical Array;
+#X text 19 288 Right-click on the graph and select "Properties" from
+the menu. Two dialogue boxes will open-- one for the graph (titled
+"canvas") and one for the array (titled "array").;
+#X text 19 37 Below is a graphical array created with the "Put" menu:
+;
+#X text 19 222 The array above is actually only the horizontal line!
+The rectangle surrounding it is called a "graph". By default \, Pd
+automatically creates a new graph to house a garray when you choose
+"Array" from the "Put" menu \, although you can put several arrays
+in one graph. (See subpatch below.);
+#N canvas 4 71 428 439 How_to_create_a_Put_menu_array 0;
+#X text 19 272 4) If you want Pd to create a new graph for this array
+\, then select "in new graph". If you have another location in mind
+-- for example if you want to overlap two arrays in a single graph
+\, then select "in last graph".;
+#X text 19 366 6) Note: if you do not want to see the graph in this
+window \, then you can use the [table] object instead...the array will
+then be created inside the [table] object and will be seen only if
+you manually open the table.;
+#X text 19 178 3) The "Save contents" checkbox will inform Pure Data
+that you want the array saved within the source code of this patch.
+This way \, you can ensure that the array will maintain its values
+each time you open this patch. This is recommended only for relatively
+small arrays-- larger arrays should be saved to either a text file
+\, or an audio file.;
+#X text 19 330 5) Click "OK" and place the new array anywhere in this
+window.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 How to Create a Garray in PD;
+#X text 20 37 1) In a new/existing patch window \, select "Array" from
+the "Put" menu.;
+#X text 20 72 2) A dialogue window will pop up \; type a name for the
+array and the desired size. If you want a localized array \, then name
+it something like \$0-dave (the "\$0" indicates that part of the name
+is a variable which is unique to this patch). The size of the array
+can be anything greater than 0 (zero). At a sample rate of 441000 khz
+\, an array of 882000 will provide you with 2 seconds of audio data.
+;
+#X restore 22 366 pd How_to_create_a_Put_menu_array;
+#X restore 63 64 pd The_Put_menu_array;
+#N canvas 0 0 428 388 The_[table]_object 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 The [table] object;
+#X text 19 37 The [table] object is another way to create a graphical
+array.;
+#X text 19 96 If you click the [table] object in runmode you can see
+it's just a subcanvas \, inside which is a graph containing an array.
+;
+#X text 19 209 * when using the [table] object \, you can't save any
+changes you make to the properites of the garray \, graph \, or the
+[table] subpatch itself.;
+#X text 19 140 At first glance \, this might look strikingly similar
+to the "Put" menu array. There are \, however \, some important differences:
+;
+#X text 19 179 * with the [table] object \, you can use the arguments
+to set the name and size of the array.;
+#X text 19 249 * with the [table] object \, you cannot save the contents
+of the array with the patch. (Note: this is true even if you open [table]
+and check "save contents" in the garray properties.);
+#X obj 22 73 table myTable 10;
+#X text 138 73 (arguments are ARRAY_NAME and SIZE);
+#X text 19 309 The [table] object is useful when you don't really need
+to look at the array data. Note that [table]s are more CPU friendly
+than "Put" menu arrays.;
+#X restore 63 86 pd The_[table]_object;
+#X obj 201 87 pddp/pddplink table-help.pd;
+#X obj 201 65 pddp/pddplink array-help.pd;
+#N canvas 0 0 428 410 Data_structure_arrays 0;
+#X scalar ds-array-ex 26 195 \; 5 Jan \; 3 Feb \; 6 Mar \; 13 Apr \;
+23 May \; 36 Jun \; 52 Jul \; 68 Aug \; 74 Sep \; 75 Oct \; 76 Nov
+\; 76 Dec \; \;;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Arrays in Data Structures;
+#X text 20 137 For more about using arrays with data structures \,
+see the help patches in doc/4.data.structures/ \, especially 05.array.pd.
+;
+#N canvas 19 76 425 300 ds-array-ex 0;
+#N canvas 15 209 450 300 circle 0;
+#X obj 25 56 filledcurve 800 509 1 -5 5 5 5 5 -5 -5 -5;
+#X obj 25 29 struct circle float y symbol a;
+#X text 283 83 (hack to anchor labels;
+#X text 284 99 at the bottom of x-axis);
+#X obj 25 83 drawsymbol a -10 y(-1000:1000)(1105:-895) 0;
+#X restore 55 111 pd circle;
+#X obj 171 215 pointer;
+#X obj 55 20 struct ds-array-ex float x float y array circles circle
+;
+#X obj 12 242 setsize ds-array-ex circles;
+#X floatatom 35 216 5 0 0 0 - - -;
+#X msg 171 188 traverse pd-Data_structure_arrays \, next;
+#X obj 55 47 plot circles 759 3 15 0 25;
+#X obj 55 74 drawpolygon 666 1 0 0 0 100 310 100;
+#X text 121 111 <- template for array elements;
+#X obj 171 161 loadbang;
+#X obj 12 190 inlet;
+#X connect 1 0 3 1;
+#X connect 5 0 1 0;
+#X connect 9 0 5 0;
+#X connect 10 0 3 0;
+#X connect 10 0 4 0;
+#X restore 305 371 pd ds-array-ex;
+#X text 20 91 However \, data structure arrays have a big drawback--
+their array data cannot currently be accessed directly by objects like
+[tabread] or [soundfiler].;
+#X text 20 36 Arrays can be used in data structures \, with or without
+graphical representation. They provide more flexibility than "Put"
+menu arrays (both graphically and in their structure).;
+#X text 90 371 see subpatch for ds definition ->;
+#X text 20 343 click here to change the size of the array ->;
+#X floatatom 305 345 5 0 0 0 - - -;
+#X connect 9 0 4 0;
+#X restore 63 108 pd Data_structure_arrays;
+#X obj 216 109 pddp/pddplink struct-help.pd;
+#N canvas 14 32 428 532 How_to_manipulate_arrays_in_PD 0;
+#N canvas 0 22 452 302 (subpatch) 0;
+#X array exampleArray 14 float 0;
+#X coords 0 2 13 -2 200 140 1;
+#X restore 214 378 graph;
+#N canvas 9 24 434 213 Setting_the_size_of_an_array 0;
+#X msg 214 88 \; exampleArray resize \$1;
+#X floatatom 214 66 5 0 0 0 - - -;
+#X text 151 100 same as;
+#X floatatom 48 66 5 0 0 0 - - -;
+#X obj 48 114 s exampleArray;
+#X msg 48 88 resize \$1;
+#X text 15 8 For "Put" menu arrays \, you can right-click and use the
+"Properties" menu to change the size. For both "Put" menu arrays and
+[table] objects \, you can also send messages to the array by name:
+;
+#X text 15 145 Note that when you make an array larger \, new elements
+always have a default value of zero. Also note that if you make arrays
+smaller \, you may lose data as each element is deleted from the end
+of the array.;
+#X connect 1 0 0 0;
+#X connect 3 0 5 0;
+#X connect 5 0 4 0;
+#X restore 23 206 pd Setting_the_size_of_an_array;
+#N canvas 4 16 720 375 Concatenate_two_arrays 0;
+#X text 19 10 This example assumes that we already know the size of
+the two arrays which will be concatenated. This process will fill NewArray
+with the contents of exampleArray and concatArray.;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array concatArray 15 float 1;
+#A 0 -0.700355 -0.371783 -0.443212 -0.700355 -0.714641 -0.386069 0.0425035
+0.399647 0.513933 0.399647 0.128218 -0.128925 -0.21464 -0.0289252 -0.700355
+;
+#X coords 0 1 14 -1 200 120 1;
+#X restore 492 25 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array NewArray 29 float 0;
+#X coords 0 1 28 -1 300 140 1;
+#X restore 389 225 graph;
+#X obj 125 57 bng 15 250 50 0 empty empty Bang_me 18 7 0 8 -262144
+-1 -1;
+#X obj 28 87 until;
+#X obj 28 162 f;
+#X obj 58 162 + 1;
+#X obj 28 277 tabread exampleArray;
+#X obj 28 331 tabwrite NewArray;
+#X obj 141 302 tabread concatArray;
+#X text 372 152 This example is much more interesting if;
+#X text 373 170 you draw new values into each array with;
+#X text 373 188 your mouse - then reset and bang again.;
+#X obj 125 179 +;
+#X msg 178 232 \; NewArray resize \$1;
+#X text 28 66 loop;
+#X obj 28 210 moses;
+#X obj 141 245 -;
+#X obj 125 76 t b b b;
+#X obj 125 203 t f f;
+#X msg 47 135 0;
+#X obj 176 100 s clr1;
+#X obj 47 110 r clr1;
+#X obj 125 154 expr size("concatArray");
+#X obj 150 125 expr size("exampleArray");
+#X connect 3 0 18 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 0 16 0;
+#X connect 5 0 8 1;
+#X connect 6 0 5 1;
+#X connect 7 0 8 0;
+#X connect 9 0 8 0;
+#X connect 13 0 19 0;
+#X connect 16 0 7 0;
+#X connect 16 1 17 0;
+#X connect 17 0 9 0;
+#X connect 18 0 23 0;
+#X connect 18 1 24 0;
+#X connect 18 2 21 0;
+#X connect 19 0 4 0;
+#X connect 19 1 14 0;
+#X connect 20 0 5 1;
+#X connect 22 0 20 0;
+#X connect 23 0 13 0;
+#X connect 24 0 13 1;
+#X connect 24 0 17 1;
+#X connect 24 0 16 1;
+#X restore 23 316 pd Concatenate_two_arrays;
+#N canvas 4 23 678 354 Join_array_elements_into_a_list 0;
+#X text 16 12 JOIN ARRAY ELEMENTS INTO A LIST;
+#X obj 23 133 bng 15 250 50 0 empty empty Bang_me 18 7 0 8 -24198 -1
+-1;
+#X obj 23 211 until;
+#X obj 23 284 tabread exampleArray;
+#X obj 216 205 pack s f;
+#X obj 216 153 t b f;
+#X obj 23 256 f;
+#X obj 57 256 + 1;
+#X obj 23 312 s \$1-value;
+#X obj 216 127 r \$1-value;
+#X obj 216 231 route list;
+#X obj 509 170 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 509 189 savepanel;
+#X msg 509 212 \; exampleArray write \$1;
+#X obj 283 323 print;
+#X text 289 300 store the list;
+#X obj 283 282 textfile;
+#X msg 345 255 rewind;
+#X obj 216 179 symbol add2;
+#X obj 310 210 bng 15 250 50 0 empty empty THEN_Print_the_list 18 7
+0 8 -24198 -1 -1;
+#X text 441 268 can be achieved by saving the;
+#X text 441 284 array elements to a text file;
+#X text 442 301 using the savepanel and write;
+#X text 443 317 message.;
+#X text 442 252 Alternatively \, a similar result;
+#X obj 23 153 arraysize exampleArray;
+#X msg 129 231 clear;
+#X obj 310 231 t b b;
+#X msg 74 230 0;
+#X text 20 37 In some other programming environments \, including Visual
+Basic and Java (among others) \, there are functions which join all
+elements of an array into a list. This example shows how this functionality
+can be duplicated in Pd. This example uses the elements of exampleArray
+from the previous help window. The list can either be printed to the
+terminal window \, or it can be saved to a text file.;
+#X obj 23 184 t f b;
+#X connect 1 0 25 0;
+#X connect 2 0 6 0;
+#X connect 3 0 8 0;
+#X connect 4 0 10 0;
+#X connect 5 0 18 0;
+#X connect 5 1 4 1;
+#X connect 6 0 7 0;
+#X connect 6 0 3 0;
+#X connect 7 0 6 1;
+#X connect 9 0 5 0;
+#X connect 10 0 16 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 16 0 14 0;
+#X connect 17 0 16 0;
+#X connect 18 0 4 0;
+#X connect 19 0 27 0;
+#X connect 25 0 30 0;
+#X connect 26 0 16 0;
+#X connect 27 0 16 0;
+#X connect 27 1 17 0;
+#X connect 28 0 6 1;
+#X connect 30 0 2 0;
+#X connect 30 1 28 0;
+#X connect 30 1 26 0;
+#X restore 23 338 pd Join_array_elements_into_a_list;
+#N canvas 1 2 418 389 Getting_the_size_of_an_array 0;
+#X obj 18 69 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 18 114 5 0 0 0 - - -;
+#X msg 148 336 \; exampleArray print;
+#X text 15 11 If you deal with arrays often \, you will want have a
+look at the [expr] object \, which offers several functions for manipulating
+arrays. The [expr] \, [expr~] \, and [fexpr~] objects are included
+in most Pd distributions.;
+#X obj 18 89 expr size("exampleArray");
+#X text 182 89 (Notice the quotes around the;
+#X text 185 104 array name.);
+#X floatatom 18 244 5 0 0 0 - - -;
+#X text 15 138 You can use the special dollarsign variables of [expr]
+to dynamically change the array name:;
+#X obj 18 219 expr size("$s1");
+#X msg 18 172 symbol exampleArray;
+#X msg 36 194 symbol someOtherArray;
+#X text 15 300 Arrays accept a "print" command which will output important
+array information to the terminal window. Like below:;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array someOtherArray 4 float 2;
+#X coords 0 1 4 -1 75 50 1;
+#X restore 235 201 graph;
+#X text 15 266 See the [expr] help patch for other array functions.
+;
+#X connect 0 0 4 0;
+#X connect 4 0 1 0;
+#X connect 9 0 7 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 0;
+#X restore 23 250 pd Getting_the_size_of_an_array;
+#N canvas 0 31 721 355 Reversing_an_array 0;
+#X text 20 15 REVERSING AN ARRAY;
+#X text 23 35 When an array is reversed \, as the name implies the
+first element becomes the last and the last becomes the first. When
+viewing this example \, please be sure you can see the "exampleArray"
+in the previous window.;
+#X obj 110 99 bng 15 250 50 0 empty empty Reverse_me 18 7 0 8 -262144
+-1 -1;
+#X obj 110 118 arraysize exampleArray;
+#X obj 110 190 until;
+#X obj 176 218 + 1;
+#X obj 144 218 f;
+#X obj 135 166 s \$1-length;
+#X obj 169 271 tabread exampleArray;
+#X obj 313 325 table tempArray;
+#X obj 110 142 t f f f;
+#X obj 234 186 s tempArray;
+#X msg 234 162 resize \$1;
+#X obj 65 298 tabwrite tempArray;
+#X obj 510 41 sel;
+#X obj 586 31 - 1;
+#X obj 586 7 r \$1-length;
+#X obj 144 244 t f f f;
+#X obj 57 268 s \$1-eof;
+#X obj 510 8 r \$1-eof;
+#X obj 510 113 until;
+#X obj 510 88 f;
+#X obj 510 146 f;
+#X obj 542 146 - 1;
+#X obj 561 93 r \$1-length;
+#X obj 529 64 r \$1-length;
+#X obj 510 198 tabread tempArray;
+#X obj 510 325 tabwrite exampleArray;
+#X obj 574 245 f;
+#X obj 593 221 r \$1-length;
+#X obj 574 294 mod;
+#X obj 593 269 r \$1-length;
+#X obj 604 245 + 1;
+#X obj 510 171 t f b;
+#X obj 561 116 - 1;
+#X text 43 325 Copies array to a temporary location.;
+#X msg 327 114 0;
+#X obj 327 138 s clr2;
+#X obj 453 100 r clr2;
+#X obj 163 190 r clr2;
+#X connect 2 0 3 0;
+#X connect 2 0 36 0;
+#X connect 3 0 10 0;
+#X connect 4 0 6 0;
+#X connect 5 0 6 1;
+#X connect 6 0 5 0;
+#X connect 6 0 17 0;
+#X connect 8 0 13 0;
+#X connect 10 0 4 0;
+#X connect 10 1 7 0;
+#X connect 10 2 12 0;
+#X connect 12 0 11 0;
+#X connect 14 0 21 0;
+#X connect 15 0 14 1;
+#X connect 16 0 15 0;
+#X connect 17 0 18 0;
+#X connect 17 1 8 0;
+#X connect 17 2 13 1;
+#X connect 19 0 14 0;
+#X connect 20 0 22 0;
+#X connect 21 0 20 0;
+#X connect 22 0 23 0;
+#X connect 22 0 33 0;
+#X connect 23 0 22 1;
+#X connect 24 0 34 0;
+#X connect 25 0 21 1;
+#X connect 26 0 27 0;
+#X connect 28 0 30 0;
+#X connect 28 0 32 0;
+#X connect 29 0 28 1;
+#X connect 30 0 27 1;
+#X connect 31 0 30 1;
+#X connect 32 0 28 1;
+#X connect 33 0 26 0;
+#X connect 33 1 28 0;
+#X connect 34 0 22 1;
+#X connect 36 0 37 0;
+#X connect 38 0 22 1;
+#X connect 39 0 6 1;
+#X restore 23 404 pd Reversing_an_array;
+#N canvas 2 30 522 357 Popping_and_Pushing_arrays 0;
+#X obj 53 151 bng 15 250 50 0 empty empty Pop_me -18 -6 0 8 -262144
+-1 -1;
+#X obj 125 169 arraysize exampleArray;
+#X obj 125 264 tabread exampleArray;
+#X floatatom 125 288 0 0 0 0 - - -;
+#X obj 90 143 t b b;
+#X obj 42 290 - 1;
+#X msg 42 316 \; exampleArray resize \$1;
+#X floatatom 149 193 0 0 0 0 - - -;
+#X text 166 288 value of last element;
+#X obj 349 151 bng 15 250 50 0 empty empty Push_me 18 7 0 8 -262144
+-1 -1;
+#X text 31 33 I got this idea from Java \, which provides a method
+to "pop" an array. The "pop" method will remove the last element in
+the array and return its value. The interesting thing about this in
+PD is that we need to know the length of the array before we start
+(hence another situation where [arraysize] is an essential tool). "Pushing"
+is the opposite effect and also a tool provided in Java. When an array
+is pushed \, an element is added to the array and the new size is returned.
+;
+#X obj 349 171 arraysize exampleArray;
+#X obj 349 195 + 1;
+#X msg 349 255 \; exampleArray resize \$1;
+#X floatatom 367 221 0 0 0 0 - - -;
+#X text 412 221 new size;
+#X text 16 12 POPPING AND PUSHING AN ARRAY;
+#X obj 149 216 - 1;
+#X text 188 193 # of total elements;
+#X floatatom 149 241 0 0 0 0 - - -;
+#X text 189 243 new size;
+#X connect 0 0 4 0;
+#X connect 1 0 2 0;
+#X connect 1 0 5 0;
+#X connect 1 0 7 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 0;
+#X connect 4 1 1 0;
+#X connect 5 0 6 0;
+#X connect 7 0 17 0;
+#X connect 9 0 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 0 14 0;
+#X connect 17 0 19 0;
+#X restore 23 360 pd Popping_and_Pushing_arrays;
+#N canvas 5 2 669 391 Shifting_an_array 0;
+#X obj 30 90 bng 15 250 50 0 empty empty Shift_me 18 7 0 8 -24198 -1
+-1;
+#X text 16 12 SHIFTING AN ARRAY;
+#X text 20 32 The shift method \, in Java \, will remove the first
+element of the array and return its value. This is opposite of the
+"Pop" method which removes the last element.;
+#X obj 30 272 tabread exampleArray;
+#X obj 30 354 tabwrite tempArray2;
+#X obj 551 11 table tempArray2;
+#X obj 30 110 arraysize exampleArray;
+#X msg 225 160 \; tempArray2 resize \$1;
+#X obj 30 163 until;
+#X obj 30 215 f;
+#X obj 62 215 + 1;
+#X obj 30 136 t f f f;
+#X obj 129 167 s \$1-length;
+#X obj 160 301 spigot;
+#X obj 203 276 < 1;
+#X floatatom 160 328 5 0 0 0 - - -;
+#X text 209 327 First value.;
+#X text 208 345 ...to be deleted.;
+#X obj 304 239 - 1;
+#X obj 304 212 r \$1-length;
+#X obj 30 239 t f f f f;
+#X obj 285 263 sel;
+#X obj 285 288 s \$2-eof;
+#X obj 427 71 r \$2-eof;
+#X obj 427 95 t b b;
+#X msg 419 304 \; tempArray2 resize \$1 \; exampleArray resize \$1
+;
+#X obj 401 256 r \$1-length;
+#X obj 401 280 - 1;
+#X obj 382 304 f;
+#X obj 497 128 until;
+#X obj 497 102 f;
+#X obj 551 69 r \$1-length;
+#X obj 529 155 + 1;
+#X obj 574 156 r \$1-length;
+#X obj 497 184 mod;
+#X obj 497 155 f 1;
+#X obj 497 209 t f f;
+#X obj 497 257 tabread tempArray2;
+#X obj 497 281 tabwrite exampleArray;
+#X obj 551 93 - 1;
+#X obj 574 179 - 1;
+#X obj 497 234 + 1;
+#X msg 223 105 0;
+#X msg 588 118 1;
+#X obj 223 129 s clr;
+#X obj 588 94 r clr;
+#X obj 49 188 r clr;
+#X connect 0 0 6 0;
+#X connect 0 0 42 0;
+#X connect 3 0 4 0;
+#X connect 3 0 13 0;
+#X connect 6 0 11 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 9 0 20 0;
+#X connect 10 0 9 1;
+#X connect 11 0 8 0;
+#X connect 11 1 12 0;
+#X connect 11 2 7 0;
+#X connect 13 0 15 0;
+#X connect 14 0 13 1;
+#X connect 18 0 21 1;
+#X connect 19 0 18 0;
+#X connect 20 0 3 0;
+#X connect 20 1 4 1;
+#X connect 20 2 14 0;
+#X connect 20 3 21 0;
+#X connect 21 0 22 0;
+#X connect 23 0 24 0;
+#X connect 24 0 28 0;
+#X connect 24 1 30 0;
+#X connect 26 0 27 0;
+#X connect 27 0 28 1;
+#X connect 28 0 25 0;
+#X connect 29 0 35 0;
+#X connect 30 0 29 0;
+#X connect 31 0 39 0;
+#X connect 32 0 35 1;
+#X connect 33 0 40 0;
+#X connect 34 0 36 0;
+#X connect 35 0 32 0;
+#X connect 35 0 34 0;
+#X connect 36 0 41 0;
+#X connect 36 1 38 1;
+#X connect 37 0 38 0;
+#X connect 39 0 30 1;
+#X connect 40 0 34 1;
+#X connect 41 0 37 0;
+#X connect 42 0 44 0;
+#X connect 43 0 35 1;
+#X connect 45 0 43 0;
+#X connect 46 0 9 1;
+#X restore 23 382 pd Shifting_an_array;
+#N canvas 21 125 413 203 Setting_a_constant_array_value 0;
+#X floatatom 226 99 0 0 0 0 - - -;
+#X obj 226 123 / 100;
+#X msg 226 153 \; exampleArray const \$1;
+#X text 16 50 This feature is useful to reset all values in an array
+\, or with a little creativity can be used to "delete" a slice \, or
+create silence in audio samples.;
+#X text 17 13 By default \, all array element values are zero. However
+\, Pd allows you to change that using the "const" message.;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 23 294 pd Setting_a_constant_array_value;
+#N canvas 3 26 727 298 Higher_math_using_arrays 0;
+#X text -7 12 HIGHER MATH USING ARRAYS;
+#X text -3 176 Normalize;
+#X text 78 177 (arg: renormer...a number by which all array values
+will be normalized);
+#X msg 6 228 \; exampleArray normalize \$1;
+#X floatatom 6 206 5 0 0 0 - - -;
+#N canvas 9 28 710 366 sine_waves 0;
+#X text 34 160 Sinesum;
+#X text 98 162 (arg 1: Number of Points - arg 2: list of partial strengths)
+;
+#X msg 40 265 \; exampleArray sinesum 64 1 0 0.5 0 0.2 0 0.15;
+#X msg 40 223 \; exampleArray sinesum 64 1 0.5 0.38 0.3 0.28 0.25 0.2
+;
+#X msg 40 182 \; exampleArray sinesum 64 1;
+#X text 26 7 SINE WAVES;
+#X text 45 26 When the "sinesum" message is sent to the array \, Pd
+will want to know two things:;
+#X text 58 57 1 How many samples (array elements) should be used? The
+higher the number is \, the higher the resolution of the wave form.
+;
+#X text 58 104 2 What is the relative strength of each "partial" or
+"overtone" in the sound? For more info about this \, please lookup
+"overtones" or "harmonics" or "partials" on the internet.;
+#X text 250 192 a pure sine wave!;
+#X text 369 231 a triangle wave;
+#X text 331 274 a square wave;
+#X text 33 309 Note that these waves aren't exactly triangular or square...instead
+they are "smoothed" by the sinesum function to more accurately produce
+these wave forms as analog instruments do.;
+#X restore 7 42 pd sine_waves;
+#X text 141 26 Audio signals in a digital realm are created using a
+series of samples. It is digitally possible to create extremely angular
+wave forms using Pd arrays \, but the aural result is sometimes distorted
+and unpleasant. Hence \, higher math functions help our digital tools
+to produce data which can effectively be converted to analog signals
+similar to those of our electronic and mechanical predecessors. The
+first and one of the most important mathematic functions in digital
+synthesis is undoubtebly "sinesum". Pd provides an easy method for
+us to integrate these higher math functions in our arrays.;
+#N canvas 3 29 750 302 cosine_waves 0;
+#X text 11 22 Cosinesum;
+#X text 91 22 (arg 1: Number of Points - arg 2: list of partial strengths)
+;
+#X text 273 84 pure cosine wave!;
+#X msg 23 117 \; exampleArray cosinesum 64 0 -0.5 0 -0.2 0.1 0;
+#X msg 24 76 \; exampleArray cosinesum 64 0 1;
+#X msg 22 159 \; exampleArray cosinesum 64 -0.15 0.2 0.15 -0.15 0.1
+0.1 0.2 -0.2 0.35 -0.25 -0.1 0.1 0.199;
+#X restore 6 73 pd cosine_waves;
+#X text 222 207 To normalize an audio signal means to alter the average
+amplitude of the signal. For the sake of clear \, undistored sounds
+\, Pd would like all of your audio signals to never exceed 1 or -1
+The first step in achieving this is "normalization" \, but can be assisted
+by more drastic tools like compressors \, limiters \, gain multipliers
+\, etc.;
+#X connect 4 0 3 0;
+#X restore 23 426 pd Higher_math_using_arrays;
+#N canvas 4 16 727 320 Files_and_arrays 0;
+#X text 24 14 OTHER IMPORTANT STUFF;
+#X obj 225 91 savepanel;
+#X obj 225 70 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 225 117 \; exampleArray write \$1;
+#X obj 475 70 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 475 89 openpanel;
+#X msg 475 113 \; exampleArray read \$1;
+#X text 26 29 Using text files can be helpful in saving or loading
+arrays in Pd. Note that the "read" message does not resize your array
+automatically.;
+#X text 29 160 Audio files can be treated in similar ways by incorporating
+the [soundfiler] object. The soundfiler object provides Pd with tools
+to automatically resize arrays \, and read/write audio files in a variety
+of formats.;
+#X obj 77 231 openpanel;
+#X obj 52 232 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 77 285 soundfiler;
+#X obj 373 231 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 398 284 soundfiler;
+#X obj 398 230 savepanel;
+#X msg 77 258 read -resize \$1 exampleArray;
+#X msg 398 257 write -aiff \$1 exampleArray;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 9 0 15 0;
+#X connect 10 0 9 0;
+#X connect 12 0 14 0;
+#X connect 14 0 16 0;
+#X connect 15 0 11 0;
+#X connect 16 0 13 0;
+#X restore 23 448 pd Files_and_arrays;
+#N canvas 0 22 719 367 Additional_tools 0;
+#X text 18 9 ADDITIONAL TOOLS;
+#X text 29 28 The "array" object in Pd accepts special messages to
+alter the appearance of the array on screen.;
+#X text 19 71 Arrays can be renamed:;
+#X msg 203 68 \; exampleArray rename george;
+#X msg 431 68 \; george rename exampleArray;
+#X msg 303 153 \; exampleArray bounds 0 1 67 -1;
+#X text 20 109 You can set the bounds of the rectangle: (the arguments
+are:;
+#X text 353 126 low x \, high y \, high x \, low y);
+#X msg 58 153 \; exampleArray bounds 0 2 67 -2;
+#X text 18 199 Array graphs can be given "ticks" on both the x and
+y axis to help you visually measure your data. The tick messages require
+3 values: (the index or value of the FIRST large tick \, then the interval
+between ticks \, then finally the number of ticks overall per large
+tick).;
+#X msg 395 203 \; exampleArray xticks 0 5 3;
+#X msg 378 250 \; exampleArray yticks 0 0.5 4;
+#X msg 354 329 \; exampleArray ylabel -5 -2 -1.5 -1 1 1.5 2;
+#X msg 26 329 \; exampleArray xlabel 0 10 20 30 40 50 60;
+#X text 17 285 Arrays can be given labels to describe the x and y axis.
+Give a y value and a bunch of x values or vice versa:;
+#X restore 23 470 pd Additional_tools;
+#N canvas 2 2 433 386 Populating_an_array 0;
+#X text 19 21 An array in Pd is primarily a storage device for numbers.
+The result is a series of numbers that you can do with whatever you
+wish...but how does one populate an array?;
+#X msg 22 232 \; exampleArray 0 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 -0.2
+0.1 -0.1 0;
+#X text 19 340 Note that if your array is larger than your list \,
+then only the first elements will be effected. If your array is smaller
+than your list \, then your list will be truncated.;
+#X msg 22 267 \; exampleArray 9 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 -0.2
+0.1 -0.1 0;
+#X msg 22 302 \; exampleArray 55 -1 1 -1 0.5 -0.5 0.5 -0.2 0.2 0.2
+0.1 -0.1 0;
+#X text 19 60 Advanced techniques using text or audio files is described
+later \, but for now it's important to know that you can send an array
+a list. Each element in the list will be assigned to the corresponding
+element in the array. Note that the first position in an array is always
+zero!;
+#X text 19 164 These messages below populate exampleArray on the parent
+patch with some values. The first element is the name of the array
+to populate. The second element is the position to start at. The rest
+of the elements are values to add to the array sequentially.;
+#X text 33 127 first position in array = array[0];
+#X text 33 143 second position in array = array[1];
+#X restore 23 228 pd Populating_an_array;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Manipulate Arrays in Pd;
+#X text 19 37 Arrays in Pd are different than the arrays in other languages
+primarily because \, in Pd \, they are designed to be displayed graphically
+on screen. This is due to the nature of audio synthesis - we want to
+see our wave forms and visually understand the data. That's why arrays
+in Pd are complicated by other objects like tables \, graphs and widgets.
+PD uses these objects to provide a graphic representation of the array
+data.;
+#X text 20 139 Like all programming languages \, Pd provides numerous
+tools to manipulate arrays and their data. The follow examples may
+be used with "Put" menu arrays and with the [table] object (but \,
+unfortunately \, not with data structure arrays):;
+#N canvas 1 41 433 307 Clearing_an_array 0;
+#X obj 38 209 tabwrite exampleArray;
+#X obj 38 69 expr size("exampleArray");
+#X obj 38 187 0;
+#X obj 38 143 f;
+#X obj 66 143 + 1;
+#X obj 38 113 until;
+#X obj 38 91 t float bang;
+#X obj 107 113 0;
+#X obj 38 165 t b f;
+#X msg 38 42 bang;
+#X text 242 17 The Easy Way;
+#X msg 261 42 const 0;
+#X obj 261 69 s exampleArray;
+#X text 52 17 The Long \, Didactic Way;
+#X text 35 239 There's no "clear" message for arrays \, but you can
+just set a constant value of 0;
+#X text 35 273 See the next subpatch for more on setting constants.
+;
+#X connect 1 0 6 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 0 8 0;
+#X connect 4 0 3 1;
+#X connect 5 0 3 0;
+#X connect 6 0 5 0;
+#X connect 6 1 7 0;
+#X connect 7 0 3 1;
+#X connect 8 0 2 0;
+#X connect 8 1 0 1;
+#X connect 9 0 1 0;
+#X connect 11 0 12 0;
+#X restore 23 272 pd Clearing_an_array;
+#X restore 43 157 pd How_to_manipulate_arrays_in_PD;
+#X text 40 226 For more discussion about arrays and tables \, please
+see:;
+#X obj 40 241 pddp/pddplink ../2.control.examples/15.array.pd;
+#X obj 40 256 pddp/pddplink ../2.control.examples/16.more.arrays.pd
+;
diff --git a/doc/pddp/all_about_ascii_art.pd b/doc/pddp/all_about_ascii_art.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6c9fa5da00eaa5294743b97b9cedcfdbaa543676
--- /dev/null
+++ b/doc/pddp/all_about_ascii_art.pd
@@ -0,0 +1,99 @@
+#N canvas 0 0 448 528 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header ascii_art 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 506 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 45 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 65 DESCRIPTION how to draw pd patches in a textfile;
+#X text 12 25 NAME text;
+#X restore 392 508 pd META;
+#N canvas 10 418 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 ASCII Art- Related Objects;
+#X obj 31 37 pddp/pddplink ../manuals/0.Intro/typing_conventions.pd
+;
+#X restore 103 508 pd Related_objects;
+#X obj 6 508 pddp/pddplink all_about.pd -text All About Pd;
+#X text 180 36 Meaning;
+#X text 40 36 Text;
+#X text 270 36 Example;
+#X text 40 68 [];
+#X text 180 68 object box;
+#X obj 336 68 osc~;
+#X text 40 118 [(;
+#X text 180 118 message box;
+#X msg 336 118 foo;
+#X text 180 168 connection;
+#X text 270 183 |;
+#X text 270 198 [*~];
+#X obj 336 168 osc~;
+#X obj 336 198 *~;
+#X text 270 248 [f]X[+ 1];
+#X text 270 168 [osc~];
+#X text 270 118 [foo(;
+#X text 270 68 [osc~];
+#X obj 336 248 f;
+#X obj 368 248 + 1;
+#X text 100 36 ASCII Codes;
+#X text 100 68 91 \, 93;
+#X text 100 118 91 \, 40;
+#X text 100 168 124 \, 47 \, 92*;
+#X text 100 248 88 \, 120;
+#X text 180 248 crossed;
+#X text 180 263 connections;
+#X text 40 188 - or _;
+#X text 40 168 | or /;
+#X text 100 188 45 \, 95;
+#X text 40 208 +;
+#X text 40 248 x or X;
+#X text 40 43 ____________________________________________________________
+;
+#X text 100 208 43**;
+#X text 333 36 In Pd;
+#N canvas 10 249 428 252 segmented_patch_cord_rant 0;
+#X text 19 206 -Jonathan Wilkes;
+#X text 19 36 What's interesting is that while some people argue against
+segmented patch cords as a future feature in Pd \, on the grounds that
+it would lead to "sloppy" patching habits and unreadable patches \,
+I have yet to read a negative response to an email that used them in
+ASCII art. That is \, no one to my knowledge has said: "Excuse me but
+I can't ready your ASCII art \, could you please remove the 90-degree
+angles?" Evidently segmented connections are not themselves a problem--
+it's unclear to me then how their use on a Pd canvas would lead an
+otherwise lucid mind down a path of chaos and confusion.;
+#X text 19 186 Thank you for your time.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 ASCII Art- A Rant;
+#X restore 43 469 pd segmented_patch_cord_rant;
+#X text 39 377 [osc~];
+#X text 39 392 |;
+#X text 39 412 |;
+#X text 39 422 |;
+#X text 39 435 [dac~];
+#X text 39 402 +---------;
+#X text 94 412 |;
+#X text 94 422 |;
+#X obj 171 377 osc~;
+#X obj 170 435 dac~;
+#X text 93 435 [writesf~];
+#X obj 212 435 writesf~;
+#X text 40 325 ** People use + in Pd ASCII art to show a segmented
+connection (e.g. \, a connection with at least one 90-degree angle
+in it) \, which isn't currently possible in Pd.;
+#X text 40 295 * ASCII code 92 (backslash) cannot be displayed in Pd
+(at least not without a lot of trouble)!;
+#X connect 18 0 19 0;
+#X connect 24 0 25 0;
+#X connect 25 0 24 1;
+#X connect 50 0 51 0;
+#X connect 50 0 53 0;
diff --git a/doc/pddp/all_about_atom_conversion.pd b/doc/pddp/all_about_atom_conversion.pd
new file mode 100644
index 0000000000000000000000000000000000000000..210e5ca21cb4af232f2ddd519057d9c37285ea6c
--- /dev/null
+++ b/doc/pddp/all_about_atom_conversion.pd
@@ -0,0 +1,124 @@
+#N canvas 0 0 448 248 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header atom_conversion
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 43 80 pddp/pddplink all_about_messages.pd;
+#X obj 1 226 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 65 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION how to convert Pd atoms;
+#X restore 392 228 pd META;
+#N canvas 14 133 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Atoms- Related Objects;
+#X floatatom 22 43 5 0 0 0 - - -;
+#X symbolatom 22 67 10 0 0 0 - - -;
+#X obj 105 42 makefilename;
+#X obj 200 60 pddp/helplink cyclone/fromsymbol;
+#X obj 200 80 pddp/helplink zexy/symbol2list;
+#X obj 311 59 pddp/helplink zexy/list2symbol;
+#X obj 311 79 pddp/helplink cyclone/tosymbol;
+#X obj 200 40 pddp/pddplink all_about_externals.pd -text _________
+;
+#X obj 200 40 pddp/pddplink all_about_externals.pd -text Externals
+;
+#X restore 103 228 pd Related_objects;
+#X obj 6 228 pddp/pddplink all_about.pd -text All About Pd;
+#X text 208 106 <- give some links to the manual;
+#X obj 43 65 pddp/pddplink all_about_atoms.pd;
+#X text 42 36 Converting between atom types in Pd can be tricky. Make
+sure you have read the following help patches first:;
+#N canvas 11 164 428 140 symbol-atom_to_float 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 From a symbol-atom to a float;
+#X obj 20 70 pddp/helplink cyclone/fromsymbol;
+#X obj 20 90 pddp/helplink zexy/symbol2list;
+#X text 20 37 There are no internal objects to turn a symbol-atom into
+a float. There are two important externals for this \, however:;
+#X restore 43 128 pd symbol-atom_to_float;
+#N canvas 15 77 428 554 float_to_symbol-atom 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Changing a float to a symbol-atom;
+#X obj 45 201 hsl 128 15 0 127 0 0 empty 123 empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X msg 42 353 symbol 123;
+#X obj 42 375 print empty_symbol;
+#X msg 151 457 123;
+#X text 192 456 <- try it;
+#X obj 151 479 makefilename %d;
+#X text 255 479 <- outputs "symbol 123" \,;
+#X text 255 494 where "123" is a real;
+#X text 255 509 symbol-atom;
+#X obj 130 503 send;
+#X floatatom 93 479 5 0 0 0 - - -;
+#X text 19 494 Also see:;
+#X obj 20 514 pddp/helplink zexy/list2symbol;
+#X obj 20 529 pddp/helplink cyclone/tosymbol;
+#X text 19 267 However \, you can send a symbol message to the right
+inlet of [send] to specify the send-name. You might think that using
+a symbol message will convert the float to a symbol-atom. Unfortunately
+\, that doesn't work either-- the message box in Pd silently ignores
+the float and outputs an empty symbol:;
+#X text 19 119 For example \, you can enter a number for the "receive-symbol"
+of the so-called IEMGUIS like the slider below. Since receive-names
+need to be symbol-atoms \, the slider automatically makes "123" a symbol-atom
+after you click "Ok" or "Apply" in the "Properties" dialogue.;
+#X text 181 198 <- [hslider] with receive-symbol "123";
+#X text 19 36 Usually it is easy to distinguish between floats and
+symbol-atoms in Pd. However \, there are times when it can be useful
+to have a symbol-atom that looks like a number. This can quickly get
+confusing because there's no visible difference between the float "123"
+and the symbol-atom "123". The only difference is in how it is understood
+by Pd.;
+#X text 19 225 If I try to send a value to the slider using [send 123]
+\, there will be an error because after I type the argument "123" in
+an object box \, Pd will interpret it as a float.;
+#X text 19 395 Solution: the [makefilename] object. It always outputs
+a symbol message (remember that a symbol message must have a symbol-atom
+as an element) \, and so it will convert an incoming float to a symbol-atom:
+;
+#X connect 3 0 4 0;
+#X connect 5 0 7 0;
+#X connect 7 0 11 1;
+#X connect 12 0 11 0;
+#X restore 43 106 pd float_to_symbol-atom;
+#N canvas 25 220 428 426 multiple_atoms_to_one_symbol-atom 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Concatenate multiple atoms;
+#X msg 42 98 list one 2 3;
+#X msg 140 98 1 2 3;
+#X msg 42 131 symbol \$1\$2\$3;
+#X symbolatom 42 158 10 0 0 0 - - -;
+#X text 19 36 Dollarsign variables can be used to join several atoms
+together to form one atom. The result is always a symbol-atom.;
+#X text 139 131 \$1\$2\$3 is always a symbol-atom \,;
+#X text 139 148 so we can safely use it build a;
+#X text 139 165 symbol message.;
+#X obj 42 277 makefilename Program%cFiles;
+#X symbolatom 42 301 0 0 0 0 - - -;
+#X msg 42 250 32;
+#X obj 41 352 pddp/helplink zexy/list2symbol;
+#X obj 41 372 pddp/helplink cyclone/tosymbol;
+#X text 19 196 There are also times when you may need to create a symbol-atom
+that contains spaces in it. Use the %c argument with [makefilename].
+;
+#X text 19 335 For more complex constructions \, see:;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 10 0 11 0;
+#X connect 12 0 10 0;
+#X restore 43 150 pd multiple_atoms_to_one_symbol-atom;
+#X text 42 171 See also:;
+#X obj 43 187 pddp/pddplink all_about_message_conversion.pd;
+#X obj 43 202 pddp/pddplink all_about_symbol_construction.pd;
diff --git a/doc/pddp/all_about_atoms.pd b/doc/pddp/all_about_atoms.pd
new file mode 100644
index 0000000000000000000000000000000000000000..108a6b7d0e6b9351c7b3e93d19b7a51f21af7acd
--- /dev/null
+++ b/doc/pddp/all_about_atoms.pd
@@ -0,0 +1,182 @@
+#N canvas 0 0 448 238 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header atoms 20 10 1 18
+-261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#N canvas 15 77 428 202 What_is_an_atom? 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What is an atom in Pd?;
+#X text 19 166 See the other subpatches for more details.;
+#X text 19 136 3) Variables: dollar and dollsym atoms.;
+#X text 19 36 An atom is the the most basic unit of data in a message.
+Atoms can be divided into three groups:;
+#X text 19 66 1) Basic atom types: float \, symbol \, and (less commonly)
+pointer atoms.;
+#X text 19 101 2) Special atom types: comma and semicolons \, which
+are generally used to separate messages in Pd.;
+#X restore 43 42 pd What_is_an_atom?;
+#N canvas 22 133 428 399 Basic_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 20 320 Pointer is a special type of atom used in connection
+with data-structures. It has no visible form and cannot be converted
+to one of the other atom types. See help for data structures for more
+info.;
+#X text 20 131 A symbol atom can be defined in two ways:;
+#X text 20 37 A float atom represents a single floating point number
+\, which can be used for mathematical computations in Pd.;
+#X obj 1 95 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 285 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Float Atom;
+#X text 7 95 Symbol Atom;
+#X text 7 285 Pointer Atom;
+#X text 80 176 Five Examples: word pitch foo-bar 1.2.3 #x21;
+#X text 80 62 Five Examples: 12 -42 3.14 0.019 1e-16;
+#X text 30 146 a) a series of characters that does not contain whitespace
+\, semicolons or commas that cannot be interpreted as a float.;
+#X text 30 197 b) Any set of characters that is created and stored
+in Pd's memory as a symbol atom. For example \, some Pd objects can
+format a directory name like "Video Projects" as a single symbol atom
+for convenience \, (even though it has a space in it). Note that as
+of Pd version 0.42 such "exotic" symbol atoms will not be saved correctly
+in a Pd patch.;
+#X restore 43 69 pd Basic_atoms;
+#N canvas 9 155 428 464 Special_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Commas and Semicolons in Pd;
+#X text 20 37 Commas and Semicolons are also atoms.;
+#X text 20 58 They are normally used in message boxes \, where they
+separate multiple messages from each other. See message box help for
+more details on this.;
+#X msg 23 102 This is a message box. Right-click and choose "Help"
+;
+#X text 19 179 Commas and semicolons are special because they are not
+separated from other atoms by whitespace.;
+#X text 19 134 Commas and semicolons can also be used in object boxes.
+For example \, the [expr] object uses them in order to organize and
+separate complex mathematical expressions.;
+#X obj 1 226 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 22 339 list append three atoms \,;
+#X obj 22 400 list length;
+#X floatatom 22 422 5 0 0 0 - - -;
+#X obj 22 319 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 55 380 print;
+#X text 19 259 At least for the standard "vanilla" objects \, when
+you enter commas and semicolons as arguments it seems they are converted
+to symbol atoms (and escaped):;
+#X msg 112 380 set \$3;
+#X text 160 433 it again. (I.e. \, you will lose data.);
+#X text 178 339 <- In object boxes \, commas/semicolons;
+#X text 196 354 are saved and loaded consistently;
+#X text 142 403 <- In message boxes \, commas/semicolons won't;
+#X text 7 226 Conversion of Commas and Semicolons to Symbol Atoms;
+#X msg 115 404;
+#X text 160 418 be escaped if you save the patch and load;
+#X connect 8 0 9 0;
+#X connect 8 0 12 0;
+#X connect 8 0 14 0;
+#X connect 9 0 10 0;
+#X connect 11 0 8 0;
+#X connect 14 0 20 0;
+#X restore 43 95 pd Special_atoms;
+#N canvas 7 69 428 561 Variable_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 228 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 298 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 298 In message boxes;
+#X obj 1 368 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X msg 22 462 symbol o;
+#X symbolatom 22 506 10 0 0 0 - - -;
+#X msg 22 484 symbol f\$1o;
+#X msg 127 462 1 2 3;
+#X obj 178 529 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 204 527 so this doesn't match;
+#X obj 127 506 route 123;
+#X text 209 505 [route] expects a float \,;
+#X text 169 484 <- this will always output a symbol-atom;
+#X obj 20 323 pddp/pddplink ../2.control.examples/10.more.messages.pd
+-text doc/2.control.examples/10.more.messages.pd;
+#X obj 127 529 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 19 266 pddp/pddplink ../2.control.examples/14.dollarsigns.pd
+-text doc/2.control.examples/14.dollarsigns.pd;
+#X obj 19 251 pddp/pddplink ../2.control.examples/13.locality.pd -text
+doc/2.control.examples/13.locality.pd;
+#X text 20 343 Also see help for message box:;
+#X msg 205 344 right-click me;
+#X text 7 368 Dollsym Atom Expansion;
+#X text 7 228 In object boxes and iemGUIs;
+#X text 20 37 Dollarsign atoms are variables \, used when the actual
+value will be filled in somewhere else. They have two separate behaviors:
+one in object boxes \, and the other in message boxes. In both cases
+\, there are two types of dollarsign variables:;
+#X text 7 1 Variable atoms \, aka Dollarsign Atoms or Dollarsign Variables
+;
+#X msg 127 484 \$1\$2\$3;
+#X text 20 107 1) dollar atoms- a dollar sign followed by an integer:
+"\$1" \, "\$2" \, and so on. These variables can expand to become float
+\, symbol \, or pointer atoms.;
+#X text 20 152 2) dollsym atoms- a dollar atom followed and/or preceded
+by a symbol atom \, with no whitespace in between. Examples are "\$1-something"
+\, "\$2.blah" \, and "pd-\$1-foo". They always expand to symbol atoms.
+;
+#X text 20 403 You can create a dollsym atom that consists only of
+dollar atoms ganged together with no white space in between. Just remember
+that the result will always be a symbol-atom-- even if each dollar
+atom is substituted with a float.;
+#X connect 5 0 7 0;
+#X connect 7 0 6 0;
+#X connect 8 0 24 0;
+#X connect 11 0 15 0;
+#X connect 11 1 9 0;
+#X connect 24 0 11 0;
+#X restore 43 120 pd Variable_atoms;
+#X text 42 162 Atoms are used to build messages in Pd. For more details
+on messages \, see the following:;
+#X obj 43 191 pddp/pddplink all_about_messages.pd;
+#X text 163 120 also see:;
+#X obj 223 120 pddp/pddplink all_about_dollarsign_zero.pd;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42. Some info was pulled from puredata.info;
+#X text 12 45 DESCRIPTION overview of Pd atoms;
+#X restore 392 218 pd META;
+#N canvas 14 133 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Atoms- Related Objects;
+#X floatatom 22 43 5 0 0 0 - - -;
+#X symbolatom 22 67 10 0 0 0 - - -;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink all_about.pd -text All About Pd;
+#X text 168 42 <- give some links to the manual;
+#N canvas 7 69 428 185 Custom_atoms 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 External atoms;
+#X text 20 37 External libraries may add atom types-- for example \,
+to support video or graphics \, or to add expressivity to the Pd language
+that would be difficult to achieve using only numbers or symbols.;
+#X text 20 97 The custom atom types may or may not work with Pd's built-in
+objects. Consult the documentation for the particular library for more
+information.;
+#X text 20 147 What else to say here?;
+#X restore 43 145 pd Custom_atoms;
+#X text 163 145 <-- work on this;
diff --git a/doc/pddp/all_about_canvas_properties.pd b/doc/pddp/all_about_canvas_properties.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6f1a8745501ddb0a14fc1ae1cda0c75acf6f0acc
--- /dev/null
+++ b/doc/pddp/all_about_canvas_properties.pd
@@ -0,0 +1,157 @@
+#N struct xy-units float x float y;
+#N canvas 0 0 448 318 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header canvas_properties
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 296 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS GUI needs_work;
+#X text 12 45 DESCRIPTION settings for the visual appearance of a Pd
+canvas;
+#X restore 392 298 pd META;
+#N canvas 10 196 428 114 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Canvas Properties- Related Objects;
+#X obj 33 76 pddp/pddplink ../3.audio.examples/A05.output.subpatch.pd
+;
+#X text 33 45 The [output~] object used throughout the audio tutorials
+is a "gop" enabled abstraction. See:;
+#X restore 103 298 pd Related_objects;
+#X obj 6 298 pddp/pddplink all_about.pd -text All About Pd;
+#X text 21 37 You can access canvas properties by right-clicking on
+an empty area of a canvas and choosing "Properties". (You can also
+right-click on the object box of a subcanvas.);
+#X text 21 78 Most of the settings only make sense for subwindows \,
+but you can change them for a root canvas as well (for instance \,
+if you want to use it later as an abstraction).;
+#X text 21 197 hide object name and arguments: self-explanatory;
+#X text 21 252 X and Y size: width and height of the gop canvas;
+#X text 21 268 X and Y margins: which part of the gop canvas is shown
+;
+#X text 21 129 X units per pixel: scale data structures drawings;
+#X text 21 144 Y units per pixel:;
+#N canvas 12 79 428 253 gop 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Some examples of graph on parent (gop) subpatches;
+#N canvas 0 0 414 354 gop_subpatch 0;
+#X floatatom 105 126 5 0 0 1 count - -;
+#X obj 105 104 inlet;
+#X obj 105 171 + 1;
+#X msg 170 145 set \$1;
+#X obj 105 228 outlet;
+#X text 25 15 Here's the inside. Notice that wires \, object boxes
+\, and (unfortunately) message boxes don't show up on the parent patch.
+;
+#X obj 242 68 inlet;
+#X msg 242 95 set 0;
+#X text 24 257 The red box shows which area of this subpatch will be
+visible on the parent canvas. Use the x/y "size" and "margin" settings
+in the canvas properties menu to specify which portion of the subpatch
+will be visible. You can also check the box for "hide object name and
+arguments" (which can be useful for making GUI abstractions).;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 0 0;
+#X connect 6 0 7 0;
+#X connect 7 0 0 0;
+#X coords 0 -1 1 1 120 65 1 100 100;
+#X restore 28 143 pd gop_subpatch;
+#X obj 28 118 bng 15 250 50 0 empty empty step 17 7 0 10 -4034 -1 -1
+;
+#X obj 28 218 print;
+#X obj 141 118 bng 15 250 50 0 empty empty reset 17 7 0 10 -232576
+-1 -1;
+#X text 154 165 <- right-click inside the rectangle;
+#X text 174 180 and choose "Open" to see the "innards"...;
+#X text 25 27 "Graph on parent" lets you see (and use) GUI objects
+that are inside a subpatch. Simply check the box next to "graph on
+parent" in the canvas properties menu to enable this feature.;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 5 0 2 1;
+#X restore 332 184 pd gop;
+#X text 21 223 X range & Y range: for garrays and data structures;
+#N canvas 12 79 428 376 xy-range 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 X and Y Range;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 10 float 3;
+#A 0 1.25716 0.514292 0.814295 1.27144 1.44287 1.57145 1.35716 1.18573
+0.55715 1.28573;
+#X coords 0 1 10 -1 200 140 1;
+#X restore 102 212 graph;
+#X text 24 37 Similar to "Units per pixel" \, but you can use these
+settings to change how an array is displayed in a graph (as well as
+data structures in a "gop"-enabled subpatch).;
+#X text 24 87 For example: the Y-range for the array below is the default
+1 to -1 \, yet many of the values lie above this range. Try changing
+the Y-range to lie between 2 and 0 and you will see an improvement
+in the display of this array.;
+#X restore 332 224 pd xy-range;
+#N canvas 174 40 427 544 units 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 X and Y Units per Pixel;
+#X text 19 357 1) Right-click on an empty portion of this subpatch
+;
+#X floatatom 254 191 5 0 0 2 x #0-x -;
+#X floatatom 293 191 5 0 0 2 y #0-y -;
+#X obj 293 220 t b a;
+#X obj 274 243 set xy-units x y;
+#N canvas 0 0 450 300 xy-units 0;
+#X obj 42 146 filledpolygon 559 0 1 0 0 100 0 100 100 0 100;
+#X obj 42 173 drawnumber x 5 5 0 x=;
+#X obj 42 200 drawnumber y 5 35 0 y=;
+#X obj 234 241 pointer;
+#X obj 234 268 outlet;
+#X obj 42 53 route displace;
+#X obj 42 119 s \$0-x;
+#X obj 135 118 s \$0-y;
+#X msg 42 98 set \$1;
+#X msg 135 98 set \$1;
+#X obj 42 26 struct xy-units float x float y;
+#X obj 42 76 get xy-units x y;
+#X msg 234 214 traverse pd-units \, next;
+#X obj 234 187 loadbang;
+#X connect 3 0 4 0;
+#X connect 5 0 11 0;
+#X connect 8 0 6 0;
+#X connect 9 0 7 0;
+#X connect 10 0 5 0;
+#X connect 11 0 8 0;
+#X connect 11 1 9 0;
+#X connect 12 0 3 0;
+#X connect 13 0 12 0;
+#X restore 337 206 pd xy-units;
+#X scalar xy-units 130 209 \;;
+#X text 19 377 2) In the "Canvas Properties" dialogue \, change the
+values for the x/y units per pixel. For example \, changing x to 2
+and y to -2 will make the square half its original size.;
+#X text 19 427 3) Notice when you scroll the y value with the number
+box above \, the rectangle moves in the opposite direction from the
+mouse. This is because with the number box \, up = higher numbers \,
+while with the canvas coordinates up = lower numbers. To change this
+\, make the y units per pixel "1" instead of "-1" .;
+#X text 19 512 4) That's it \, as far as I can tell...;
+#X text 19 327 The square above is a scalar. You can use the "Units
+per pixel" settings to scale its units in the following ways:;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 1 6 1;
+#X connect 7 0 6 2;
+#X restore 332 134 pd units;
+#X text 21 163 graph on parent (gop): reveal part of a subpatch's content
+;
diff --git a/doc/pddp/all_about_data_types.pd b/doc/pddp/all_about_data_types.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c9de0c7250a78482889415927c03ab1299ba1340
--- /dev/null
+++ b/doc/pddp/all_about_data_types.pd
@@ -0,0 +1,52 @@
+#N canvas 0 0 448 239 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header data_types 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 43 66 pddp/pddplink all_about_atoms.pd;
+#X obj 1 217 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME;
+#X text 12 45 KEYWORDS;
+#X text 12 65 DESCRIPTION list of help patches related to Pd data types
+;
+#X restore 392 219 pd META;
+#X obj 6 219 pddp/pddplink all_about.pd -text All About Pd;
+#N canvas 25 153 428 150 Quick_Quiz! 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Messages- Related Objects;
+#X obj 22 99 bng 15 500 50 0 empty empty list 0 25 0 8 -262144 -1 -1
+;
+#X obj 69 99 bng 15 500 50 0 empty empty bang 0 25 0 8 -262144 -1 -1
+;
+#X obj 117 99 bng 15 500 50 0 empty empty float 0 25 0 8 -262144 -1
+-1;
+#X obj 165 99 bng 15 500 50 0 empty empty symbol 0 25 0 8 -262144 -1
+-1;
+#X obj 213 99 bng 15 500 50 0 empty empty pop 0 25 0 8 -262144 -1 -1
+;
+#X obj 261 99 bng 15 500 50 0 empty empty none_of_the_above 0 25 0
+8 -262144 -1 -1;
+#X text 276 42 <- Click to find out;
+#X msg 22 43 pop quiz: What type of message is this?;
+#X obj 22 70 route list bang float symbol pop;
+#X connect 9 0 10 0;
+#X connect 10 0 2 0;
+#X connect 10 1 3 0;
+#X connect 10 2 4 0;
+#X connect 10 3 5 0;
+#X connect 10 4 6 0;
+#X connect 10 5 7 0;
+#X restore 103 219 pd Quick_Quiz!;
+#X text 42 36 See:;
+#X obj 43 86 pddp/pddplink all_about_messages.pd;
+#X obj 43 106 pddp/pddplink all_about_message_conversion.pd;
+#X obj 43 126 pddp/pddplink all_about_atom_conversion.pd;
+#X obj 43 146 pddp/pddplink all_about_symbol_construction.pd;
diff --git a/doc/pddp/all_about_dollarsign_zero.pd b/doc/pddp/all_about_dollarsign_zero.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c2cc36a53d5fba3c2d33b2e0923967e72c5897aa
--- /dev/null
+++ b/doc/pddp/all_about_dollarsign_zero.pd
@@ -0,0 +1,57 @@
+#N canvas 0 0 448 462 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header dollarsign_zero
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 20 36 \$0 is a special variable that is guaranteed to be unique
+to each abstraction.;
+#X obj 43 89 float \$0;
+#X obj 43 69 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 43 111 5 0 0 0 - - -;
+#X obj 43 343 s \$0-local-variable-ex;
+#X obj 196 321 r \$0-local-variable-ex;
+#X floatatom 43 321 5 0 0 0 - - -;
+#X floatatom 196 343 5 0 0 0 - - -;
+#X text 20 136 It can be used to make local variables in Pd. To test
+it:;
+#X obj 38 182 pddp/pddplink all_about_dollarsign_zero.pd;
+#X text 20 156 1) Open another instance of this help patch and move
+it next to this one so both are visible.;
+#X text 20 206 2) Compare the two send/receive pairs below:;
+#X text 39 227 -- Normal (global) send/receive pair --;
+#X text 39 301 -- Local send/receive pair --;
+#X floatatom 43 249 5 0 0 0 - - -;
+#X floatatom 196 271 5 0 0 0 - - -;
+#X obj 43 271 s normal-variable-ex;
+#X obj 196 249 r normal-variable-ex;
+#X text 35 377 see also: Manual 2.6.5;
+#X obj 1 440 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 25 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 DESCRIPTION how to use \$0 to simulate locality in Pd
+;
+#X restore 392 442 pd META;
+#N canvas 11 306 428 145 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 \$0- Related Objects;
+#X obj 20 38 pddp/helplink ggee/sendlocal;
+#X obj 20 58 pddp/helplink ggee/receivelocal;
+#X restore 103 442 pd Related_objects;
+#X obj 6 442 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 35 392 pddp/pddplink ../2.control.examples/13.locality.pd -text
+doc/2.control.examples/13.locality.pd;
+#X obj 35 407 pddp/pddplink all_about_scope_and_locality.pd;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 7 0 9 0;
+#X connect 8 0 6 0;
+#X connect 16 0 18 0;
+#X connect 19 0 17 0;
diff --git a/doc/pddp/all_about_expr_and_value.pd b/doc/pddp/all_about_expr_and_value.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0fe4940121f954dfab6bedb60906deaec0ac901c
--- /dev/null
+++ b/doc/pddp/all_about_expr_and_value.pd
@@ -0,0 +1,50 @@
+#N canvas 0 0 448 350 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_and_value 20
+10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 176 268 v _\$0_foo;
+#X obj 24 268 expr $f1 + _\$0_foo;
+#X floatatom 24 246 5 0 0 0 - - -;
+#X floatatom 24 291 5 0 0 0 - - -;
+#X floatatom 176 248 5 0 0 0 - - -;
+#X floatatom 206 108 5 0 0 0 - - -;
+#X floatatom 23 108 5 0 0 0 - - -;
+#X floatatom 23 158 5 0 0 0 - - -;
+#X text 248 106 set variable "some_number";
+#X obj 206 131 value some_number;
+#X obj 23 131 expr $f1 + some_number;
+#X text 20 36 Access to variables within [expr] \, [expr~] \, and [fexpr~]
+is possible using the [value] object. These aren't the special dollarsign
+variables like $f3- rather \, they are global symbolic variables that
+aren't the names of functions or operators like some_number \, below:
+;
+#X text 21 184 Using Pd's dollar sign variables is tricky-- for example
+\, \$0-foo is interpretated as "\$0 minus foo". Additionally \, \$0
+cannot be at the beginning of the variable name (e.g. \, \$0foo). Underscores
+provide a workable \, if clunky \, solution:;
+#X obj 1 328 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 45 KEYWORDS nonlocal;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr expr~ fexpr~ value;
+#X text 12 65 DESCRIPTION a touching tale of an unlikely romance between
+two Pd objects;
+#X restore 392 330 pd META;
+#N canvas 10 196 428 141 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 [expr] and [value]- Related Objects;
+#X restore 103 330 pd Related_objects;
+#X obj 6 330 pddp/pddplink all_about.pd -text All About Pd;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 6 0 2 0;
+#X connect 7 0 11 0;
+#X connect 8 0 12 0;
+#X connect 12 0 9 0;
diff --git a/doc/pddp/all_about_expr_functions.pd b/doc/pddp/all_about_expr_functions.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f609c133ded9f19cc776722b03733b6c5ad6581c
--- /dev/null
+++ b/doc/pddp/all_about_expr_functions.pd
@@ -0,0 +1,503 @@
+#N canvas 0 0 448 545 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_operators_and_functions
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X floatatom 140 881 5 0 0 0 - - -;
+#X floatatom 188 880 5 0 0 0 - - -;
+#X obj 140 901 v a;
+#X obj 188 901 v b;
+#X obj 36 794 expr max(a \, b);
+#X obj 22 774 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 795 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 711 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 732 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 753 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 36 880 0 0 0 0 - - -;
+#X obj 22 990 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 1010 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1030 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1050 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1070 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1090 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1110 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1130 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1150 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 816 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 1171 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 837 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 858 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 36 1200 0 0 0 0 - - -;
+#X obj 36 773 expr min(a \, b);
+#X obj 36 710 expr int(a);
+#X obj 36 731 expr rint(a);
+#X obj 36 752 expr float(a);
+#X obj 36 1129 expr tanh(a);
+#X obj 36 1149 expr fact(a);
+#X obj 36 815 expr abs(a);
+#X obj 36 857 expr modf(a);
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array expr_array 11 float 3;
+#A 0 -0.707106 0 0.707106 1 0.707108 2.65359e-006 -0.707104 -1 -0.70711
+-5.30718e-006 0.707103;
+#X coords 0 1 11 -1 80 60 1;
+#X restore 22 1757 graph;
+#X obj 22 1844 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1864 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1884 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1904 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1924 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1944 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 36 1971 0 0 0 0 - - -;
+#X text 185 1842 size of an array;
+#X text 24 1620 * Bug: floor and ceiling must take two values to initialize
+properly. You can just put a zero as the second value.;
+#X text 9 1171 *;
+#X text 9 837 *;
+#X text 185 1861 sum of all elements in an array;
+#X text 206 1903 average of all elements;
+#X text 138 772 minimum;
+#X text 138 793 maximum;
+#X text 138 709 convert to integer;
+#X text 138 730 round a float to a nearby integer;
+#X text 138 751 convert to float;
+#X text 4 753 **;
+#X text 24 1646 ** Bug: float(a) converts a to an integer;
+#X text 149 1127 hyperbolic tangent;
+#X text 149 1147 factorial;
+#X text 127 835 get signed integer value from floating point number
+;
+#X floatatom 120 504 5 0 0 0 - - -;
+#X floatatom 168 503 5 0 0 0 - - -;
+#X obj 120 524 v a;
+#X obj 168 524 v b;
+#X floatatom 36 503 0 0 0 0 - - -;
+#X text 117 123 One's complement;
+#X text 117 143 Multiply;
+#X text 117 183 Modulo;
+#X text 117 203 Add;
+#X text 117 223 Subtract;
+#X text 117 243 Shift Left;
+#X text 117 263 Shift Right;
+#X text 117 283 Less than (boolean);
+#X text 117 303 Less than or equal (boolean);
+#X text 117 323 Greater than (boolean);
+#X text 117 343 Greater than or equal (boolean);
+#X text 117 363 Equal (boolean);
+#X text 117 383 Not equal (boolean);
+#X text 117 403 Bitwise And;
+#X text 117 423 Exclusive Or;
+#X text 117 443 Bitwise Or;
+#X text 117 463 Logical And (boolean);
+#X text 117 483 Logical Or (boolean);
+#X text 117 163 Divide (division by zero detected);
+#X text 138 815 absolute value;
+#X obj 22 613 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 612 expr if(a \, b \, c);
+#X floatatom 238 880 5 0 0 0 - - -;
+#X obj 238 901 v c;
+#X text 147 637 (See expr-if subpatch for more details);
+#X text 117 855 get signed fractional value from floating point number
+;
+#X floatatom 152 1201 5 0 0 0 - - -;
+#X floatatom 200 1200 5 0 0 0 - - -;
+#X obj 152 1221 v a;
+#X obj 200 1221 v b;
+#X obj 22 664 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 663 expr random(a \, b);
+#X obj 36 989 expr pow(a \, b);
+#X text 149 987 raise a to the power of b;
+#X obj 36 1009 expr sqrt(a);
+#X text 149 1007 square root;
+#X obj 36 1029 expr exp(a);
+#X text 149 1027 e raised to the power of a;
+#X obj 36 1049 expr ln(a);
+#X text 149 1047 natural log;
+#X obj 36 1069 expr log(a);
+#X text 149 1067 natural log (same as above);
+#X obj 36 1089 expr log10(a);
+#X text 149 1087 log base 10;
+#X obj 36 1109 expr fact(a);
+#X text 149 1107 factorial;
+#X obj 36 1170 expr ldexp(a);
+#X obj 22 1310 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1330 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1350 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1370 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1390 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1410 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1430 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1450 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1470 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1491 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 36 1575 0 0 0 0 - - -;
+#X text 9 1511 *;
+#X floatatom 152 1575 5 0 0 0 - - -;
+#X floatatom 200 1574 5 0 0 0 - - -;
+#X obj 152 1595 v a;
+#X obj 200 1595 v b;
+#X obj 36 1309 expr sin(a);
+#X text 149 1307 sine;
+#X obj 36 1329 expr cos(a);
+#X text 149 1327 cosine;
+#X obj 36 1349 expr tan(a);
+#X text 149 1347 tangent;
+#X obj 36 1369 expr asin(a);
+#X text 149 1367 arc sine;
+#X obj 36 1389 expr acos(a);
+#X text 149 1387 arc cosine;
+#X obj 36 1409 expr atan(a);
+#X text 149 1407 arc tangent;
+#X obj 36 1429 expr atan2(a \, b);
+#X text 149 1427 arc tangent of 2 variables;
+#X obj 36 1449 expr sinh(a);
+#X text 149 1447 hyperbolic sine;
+#X obj 36 1469 expr cosh(a);
+#X text 149 1467 hyperbolic cosine;
+#X obj 22 1512 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1532 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 22 1552 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 36 1490 expr tanh(a);
+#X text 149 1487 hyperbolic tangent;
+#X obj 36 1511 expr floor(a \, 0);
+#X text 149 1509 largest integral value not greater than argument;
+#X obj 36 1531 expr ceil(a \, 0);
+#X text 149 1529 smallest integral value not less than argument;
+#X text 149 1549 floating-point remainder function;
+#X obj 36 1551 expr fmod(a \, b);
+#X text 9 1531 *;
+#X obj 22 144 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 164 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 184 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 204 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 224 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 264 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 284 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 304 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 324 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 344 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 364 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 384 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 404 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 22 424 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 143 expr a * b;
+#X obj 36 163 expr a / b;
+#X obj 36 183 expr a % b;
+#X obj 36 203 expr a + b;
+#X obj 36 223 expr a - b;
+#X obj 36 243 expr a << b;
+#X obj 36 263 expr a >> b;
+#X obj 36 283 expr a < b;
+#X obj 36 303 expr a <= b;
+#X obj 36 323 expr a > b;
+#X obj 36 343 expr a >= b;
+#X obj 36 363 expr a == b;
+#X obj 36 383 expr a != b;
+#X obj 36 403 expr a & b;
+#X obj 36 423 expr a ^ b;
+#X obj 22 444 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 443 expr a | b;
+#X obj 22 464 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 463 expr a && b;
+#X obj 22 484 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 483 expr a || b;
+#X obj 22 124 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 36 123 expr a ~ b;
+#X obj 36 836 expr imodf(a);
+#X floatatom 131 1971 5 0 0 0 - - -;
+#X floatatom 179 1970 5 0 0 0 - - -;
+#X obj 131 1991 v a;
+#X obj 179 1991 v b;
+#X text 18 2277 cbrt(a);
+#X text 18 2297 erf(a);
+#X text 18 2317 erfc(a);
+#X text 18 2357 loglp(a);
+#X text 18 2377 isinf(a);
+#X text 18 2397 finite(a);
+#X text 18 2417 isnan(a);
+#X text 18 2457 drem(a);
+#X text 18 2477 asinh(a);
+#X text 18 2497 acosh(a);
+#X text 18 2517 atanh(a);
+#X text 98 2277 cube root;
+#X text 98 2297 error function;
+#X text 98 2317 complementary error function;
+#X text 18 2337 expm1(a);
+#X text 98 2337 exponential minus 1;
+#X text 98 2357 logarithm of 1 plus;
+#X text 98 2377 is the value infinite;
+#X text 98 2397 is the value finite;
+#X text 98 2417 is the value not a number;
+#X text 98 2437 copy the sign of a number;
+#X text 98 2457 floating-point remainder function;
+#X text 98 2477 inverse hyperbolic sine;
+#X text 98 2497 inverse hyperbolic cosine;
+#X text 98 2517 inverse hyperbolic tangent;
+#X obj 36 1843 expr size("expr_array");
+#X text 242 524 ***Scroll Down for more***;
+#X obj 1 572 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X obj 1 949 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X obj 1 1269 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 1269 Trigonometric Functions;
+#X text 7 949 Power Functions;
+#X text 7 572 General Purpose Functions;
+#X obj 1 1705 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 1705 Array/Table Functions;
+#X obj 1 2241 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 2241 Functions Not Available in Windows;
+#X text 148 612 conditional \; if (condition \, ifTrue-expr \, ifFalse-expr)
+;
+#X text 147 663 random number between a and b. The value will;
+#X text 148 676 be less than the upper boundary and greater;
+#X text 148 688 than or equal to the lower boundary.;
+#X text 149 1180 power of 2;
+#X text 149 1167 multiply floating-point number by integral;
+#X text 217 1882 sum of an array within boundaries;
+#X text 219 1922 average of elements within boundaries;
+#X text 239 1942 store a value in an array;
+#X text 239 1955 ("array_name" \, index \, value);
+#X text 19 2032 Note: the quotation marks inside the parentheses are
+also required when using a variable \, like "$s2". When using array/table
+names like "array-name" or "\$0-table" \, use a variable-- otherwise
+the dash and the \$0 will get interpreted as an operator and a value
+\, respectively.;
+#X obj 35 2131 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 35 2195 5 0 0 0 - - -;
+#X obj 35 2150 symbol \$0-expr-array;
+#X obj 35 2172 expr size("$s1");
+#X obj 36 1863 expr sum("expr_array");
+#X text 19 2096 For a table name like "\$0-array2" \, send the array
+name as a message:;
+#X text 239 1981 than the size of the table \,;
+#X text 239 1968 If the index is greater;
+#X text 240 1994 a modulo the size of the;
+#X text 240 2007 table is made.;
+#X text 109 1790 Note: The array name in [expr] must be in quotes;
+#X text 146 1803 when using these functions.;
+#X text 109 1816 (even when for a variable like "$s2");
+#X obj 36 1883 expr Sum("expr_array" \, 6 \, 0);
+#X obj 36 1903 expr avg("expr_array");
+#X obj 36 1923 expr Avg("expr_array" \, 1 \, 3);
+#X obj 36 1943 expr store("expr_array" \, 0 \, 3);
+#X text 254 2439 ***;
+#X text 17 2540 *** bug: copysign is spelled "copysig" in the source
+;
+#X text 18 2437 copysign(a);
+#X obj 1 82 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 19 37 The following operators and functions are available as
+arguments to the [expr] \, [expr~] \, and [fexpr~] objects.;
+#X text 7 82 Operators (from highest to lowest precedence);
+#X obj 1 2568 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 45 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr expr~ fexpr~;
+#X text 12 65 DESCRIPTION complete list of functions and operators
+for expr family objects;
+#X restore 392 2570 pd META;
+#N canvas 10 380 428 140 Related_objects 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 6 1 [expr] Functions and Operators- Related Objects;
+#X restore 103 2570 pd Related_objects;
+#X obj 6 2570 pddp/pddplink all_about.pd -text All About Pd;
+#X connect 2 0 4 0;
+#X connect 3 0 5 0;
+#X connect 6 0 12 0;
+#X connect 7 0 27 0;
+#X connect 8 0 6 0;
+#X connect 9 0 28 0;
+#X connect 10 0 29 0;
+#X connect 11 0 30 0;
+#X connect 13 0 96 0;
+#X connect 14 0 98 0;
+#X connect 15 0 100 0;
+#X connect 16 0 102 0;
+#X connect 17 0 104 0;
+#X connect 18 0 106 0;
+#X connect 19 0 108 0;
+#X connect 20 0 31 0;
+#X connect 21 0 32 0;
+#X connect 22 0 33 0;
+#X connect 23 0 110 0;
+#X connect 24 0 195 0;
+#X connect 25 0 34 0;
+#X connect 27 0 12 0;
+#X connect 28 0 12 0;
+#X connect 29 0 12 0;
+#X connect 30 0 12 0;
+#X connect 31 0 26 0;
+#X connect 32 0 26 0;
+#X connect 33 0 12 0;
+#X connect 34 0 12 0;
+#X connect 36 0 225 0;
+#X connect 37 0 252 0;
+#X connect 38 0 261 0;
+#X connect 39 0 262 0;
+#X connect 40 0 263 0;
+#X connect 41 0 264 0;
+#X connect 59 0 61 0;
+#X connect 60 0 62 0;
+#X connect 84 0 85 0;
+#X connect 85 0 12 0;
+#X connect 86 0 87 0;
+#X connect 90 0 92 0;
+#X connect 91 0 93 0;
+#X connect 94 0 95 0;
+#X connect 96 0 26 0;
+#X connect 98 0 26 0;
+#X connect 100 0 26 0;
+#X connect 102 0 26 0;
+#X connect 104 0 26 0;
+#X connect 106 0 26 0;
+#X connect 108 0 26 0;
+#X connect 110 0 26 0;
+#X connect 111 0 127 0;
+#X connect 112 0 129 0;
+#X connect 113 0 131 0;
+#X connect 114 0 133 0;
+#X connect 115 0 135 0;
+#X connect 116 0 137 0;
+#X connect 117 0 139 0;
+#X connect 118 0 141 0;
+#X connect 119 0 143 0;
+#X connect 120 0 148 0;
+#X connect 123 0 125 0;
+#X connect 124 0 126 0;
+#X connect 127 0 121 0;
+#X connect 129 0 121 0;
+#X connect 131 0 121 0;
+#X connect 133 0 121 0;
+#X connect 135 0 121 0;
+#X connect 137 0 121 0;
+#X connect 139 0 121 0;
+#X connect 141 0 121 0;
+#X connect 143 0 121 0;
+#X connect 145 0 150 0;
+#X connect 146 0 152 0;
+#X connect 147 0 155 0;
+#X connect 148 0 121 0;
+#X connect 150 0 121 0;
+#X connect 152 0 121 0;
+#X connect 155 0 121 0;
+#X connect 157 0 172 0;
+#X connect 158 0 173 0;
+#X connect 159 0 174 0;
+#X connect 160 0 175 0;
+#X connect 161 0 176 0;
+#X connect 162 0 177 0;
+#X connect 163 0 178 0;
+#X connect 164 0 179 0;
+#X connect 165 0 180 0;
+#X connect 166 0 181 0;
+#X connect 167 0 182 0;
+#X connect 168 0 183 0;
+#X connect 169 0 184 0;
+#X connect 170 0 185 0;
+#X connect 171 0 186 0;
+#X connect 172 0 63 0;
+#X connect 173 0 63 0;
+#X connect 174 0 63 0;
+#X connect 175 0 63 0;
+#X connect 176 0 63 0;
+#X connect 177 0 63 0;
+#X connect 178 0 63 0;
+#X connect 179 0 63 0;
+#X connect 180 0 63 0;
+#X connect 181 0 63 0;
+#X connect 182 0 63 0;
+#X connect 183 0 63 0;
+#X connect 184 0 63 0;
+#X connect 185 0 63 0;
+#X connect 186 0 63 0;
+#X connect 187 0 188 0;
+#X connect 188 0 63 0;
+#X connect 189 0 190 0;
+#X connect 190 0 63 0;
+#X connect 191 0 192 0;
+#X connect 192 0 63 0;
+#X connect 193 0 194 0;
+#X connect 194 0 63 0;
+#X connect 195 0 12 0;
+#X connect 196 0 198 0;
+#X connect 197 0 199 0;
+#X connect 225 0 42 0;
+#X connect 248 0 250 0;
+#X connect 250 0 251 0;
+#X connect 251 0 249 0;
+#X connect 252 0 42 0;
+#X connect 261 0 42 0;
+#X connect 262 0 42 0;
+#X connect 263 0 42 0;
+#X connect 264 0 42 0;
diff --git a/doc/pddp/all_about_expr_if.pd b/doc/pddp/all_about_expr_if.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7984aa5af91ad0183eb646e34282e0c8dba97328
--- /dev/null
+++ b/doc/pddp/all_about_expr_if.pd
@@ -0,0 +1,64 @@
+#N canvas 0 0 448 500 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_if 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X floatatom 23 315 5 0 0 0 - - -;
+#X floatatom 23 266 5 0 0 0 - - -;
+#X obj 374 374 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+10;
+#X floatatom 23 441 5 0 0 0 - - -;
+#X floatatom 23 376 5 0 0 0 - - -;
+#X obj 83 441 print;
+#X floatatom 374 353 5 0 0 0 - - -;
+#X obj 23 400 expr if($f2 != 0 \, if($f1 % 13 != 0 \, random($f1 -
+$f2 * 0.5 \, $f1 + $f2 * 0.5) \, $f1) \, $f1 % 60);
+#X text 20 93 b) an expression to evaluate if the condition is true
+\, and;
+#X text 20 78 a) the condition \,;
+#X text 20 37 The [expr] \, [expr~] \, and [fexpr~] objects allow you
+to build a conditional statement using the "expr if" syntax. It is
+made up of three parts \, enclosed in parentheses:;
+#X text 20 126 Each part is separated by a comma.;
+#X text 20 108 c) an expression to evaluate if the condition is false.
+;
+#X text 20 239 c) if the condition is false \, the number 20 is output.
+;
+#X text 20 340 You can nest other functions within the if function
+\, including the if function itself.;
+#X text 20 157 By scrolling the number box below you can see the [expr
+if] function in action. When a number is received at the inlet:;
+#X text 20 189 a) the condition "$f1 < 20" checks if the input is less
+than twenty.;
+#X text 20 219 b) if true \, the value is subtracted from twenty and
+output.;
+#X obj 1 478 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 45 KEYWORDS;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr expr~ fexpr~;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 DESCRIPTION an explanation of the "if" function from
+sly and the expr family stone;
+#X restore 392 480 pd META;
+#N canvas 9 355 428 136 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 [expr] if- Related Objects;
+#X obj 22 42 moses;
+#X obj 72 42 select;
+#X obj 132 42 spigot;
+#X restore 103 480 pd Related_objects;
+#X obj 6 480 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 23 290 expr if($f1 < 50 \, 50-$f1 \, 50);
+#X connect 3 0 24 0;
+#X connect 4 0 9 1;
+#X connect 6 0 9 0;
+#X connect 8 0 4 0;
+#X connect 9 0 5 0;
+#X connect 9 0 7 0;
+#X connect 24 0 2 0;
diff --git a/doc/pddp/all_about_expr_multiline.pd b/doc/pddp/all_about_expr_multiline.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fff3e8864d6f12a8513e28aded4555cdcf7e97ff
--- /dev/null
+++ b/doc/pddp/all_about_expr_multiline.pd
@@ -0,0 +1,44 @@
+#N canvas 0 0 448 282 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header expr_multiline 20
+10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X floatatom 23 196 5 0 0 0 - - -;
+#X floatatom 102 196 5 0 0 0 - - -;
+#X floatatom 23 93 5 0 0 0 - - -;
+#X floatatom 181 196 0 0 0 0 - - -;
+#X floatatom 260 196 5 0 0 0 - - -;
+#X obj 23 119 expr $f1 \; $f1 * 2 \; pow($f1 \, 2) \; if($f1%128 <
+64 \, $f1%128 \, 128 - $f1%128);
+#X text 260 227 back down;
+#X text 259 213 count to 64 \, then;
+#X text 20 37 A semicolon can be used to enter multiple expressions
+in [expr] \, [expr~] \, and [fexpr~]. For each new statement \, an
+extra outlet is added to the object.;
+#X text 273 174 semicolon;
+#X text 272 165 doesn't require a;
+#X text 272 155 the last statement;
+#X obj 1 260 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 KEYWORDS conversion;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 NAME expr fexpr~ expr~;
+#X text 12 65 DESCRIPTION Like to enter multiple expressions inside
+expr? You can if you want \, and this patch tells you how...;
+#X restore 392 262 pd META;
+#N canvas 10 196 428 129 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 [expr] Multiline- Related Objects;
+#X restore 103 262 pd Related_objects;
+#X obj 6 262 pddp/pddplink all_about.pd -text All About Pd;
+#X connect 4 0 7 0;
+#X connect 7 0 2 0;
+#X connect 7 1 3 0;
+#X connect 7 2 5 0;
+#X connect 7 3 6 0;
diff --git a/doc/pddp/all_about_externals.pd b/doc/pddp/all_about_externals.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a8578754bd1a5b001c48682fe6cc3c0ddbc6ba9b
--- /dev/null
+++ b/doc/pddp/all_about_externals.pd
@@ -0,0 +1,34 @@
+#N canvas 433 152 446 395 10;
+#X obj 1 -2 cnv 15 445 20 empty \$0-pddp.cnv.header externals 20 12
+1 18 -261106 -33289 0;
+#X obj 412 -2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 373 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 DESCRIPTION notions of scope in Pd;
+#X text 12 25 KEYWORDS needs_work;
+#X restore 397 375 pd META;
+#N canvas 11 243 428 121 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Externals - Related Objects;
+#X restore 103 375 pd Related_objects;
+#X obj 6 375 pddp/pddplink all_about.pd -text All About Pd;
+#X text 20 36 Externals are objects that can be used in addition to
+the core Pd objects \, or vanilla objects. Externals can be created
+with other programming languages like C \, C++ \, or Python \, as well
+as being programmed directly in Pd.;
+#X obj 59 347 pddp/pddplink all_about_libraries.pd;
+#N canvas 16 214 428 369 Subpatch 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Subpatch;
+#X text 18 23 Subpatch;
+#X restore 23 164 pd Subpatch;
+#X text 20 116 This help file is unfinished;
diff --git a/doc/pddp/all_about_finding_objects.pd b/doc/pddp/all_about_finding_objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9a8e527891a674d669a38d8d09604a93f7d8bbad
--- /dev/null
+++ b/doc/pddp/all_about_finding_objects.pd
@@ -0,0 +1,52 @@
+#N canvas 0 0 448 447 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header Pure_Data_search
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 425 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 274 223 494 284 META 0;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 DESCRIPTION tips for searching for objects;
+#X text 12 85 HELP_PATCH_AUTHORS Jonathan Wilkes \, Pd-ext 0.42.;
+#X text 12 25 KEYWORDS help;
+#X restore 392 427 pd META;
+#X obj 6 427 pddp/pddplink all_about.pd -text All About Pd;
+#N canvas 9 180 428 183 References 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Searching for Objects;
+#X text 32 39 * pdpedia;
+#X text 32 59 * mailing lists;
+#X text 32 79 * google;
+#X text 32 99 * your own harddrive;
+#X restore 103 427 pd References;
+#X text 19 121 Advanced Search;
+#X text 19 26 Simple Search;
+#X text 19 26 _____________;
+#X text 19 121 _______________;
+#X text 19 171 You can use regular expressions \, too:;
+#X text 19 188 "obj [0-9]+ [0-9]+ osc~ [0-9]+" will match all help
+patches that have an [osc~] object with a creation argument.;
+#X text 19 141 Use quotes to search for a specific phrase \, such as:
+"frequency modulation";
+#X obj 24 250 pddp/pddplink http://www.tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm
+;
+#X text 19 218 Pd search uses the regex syntax from the Tcl language
+\, which is documented here:;
+#X text 19 382 For more details on PDDP tags \, see:;
+#X obj 24 399 pddp/pddplink all_about_pd_META.pd;
+#X text 19 46 Enter your search terms and click "Search" \, or click
+a keyword. You can use the drop-down menu below the search bar to filter
+the results by category. Searches are not case sensitive.;
+#X text 19 101 Use <ctrl-+> and <ctrl-=> to change the size of the
+fonts.;
+#X text 19 272 Finally \, you can make use of PDDP keywords to refine
+your search. They are listed at the bottom of the search homepage.
+Click one to see the regex syntax \, which you can use to search for
+any of the PDDP tag.;
+#X text 19 322 Clicking on a "folder" icon will bring up the containing
+directory in an external file browser. Clicking the "i" icon will bring
+up a README.txt for the containing library (or META.pd if there isn't
+a README). Internal objects will pop up a message saying so.;
diff --git a/doc/pddp/all_about_getting_help.pd b/doc/pddp/all_about_getting_help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d46d4bdbd0bc32b80cd5b654eee6ebf21b2de72e
--- /dev/null
+++ b/doc/pddp/all_about_getting_help.pd
@@ -0,0 +1,76 @@
+#N canvas 0 0 448 570 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header getting_help_in_Pure_Data
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 548 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 323 229 494 344 META 0;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 DESCRIPTION Table of Contents for Pd documentation;
+#X text 12 85 HELP_PATCH_AUTHORS Jonathan Wilkes.;
+#X text 12 25 KEYWORDS;
+#X restore 392 550 pd META;
+#N canvas 12 355 428 212 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Help - Related Objects;
+#X restore 103 550 pd Related_objects;
+#X text 18 218 Control Examples;
+#X text 18 238 Audio Examples;
+#X text 18 258 Data Structures;
+#X text 18 358 Dynamic Patching;
+#X text 18 278 Intro to Pd;
+#X text 18 298 Audio Basics;
+#X text 18 318 Intro to Gem;
+#X text 18 338 Networking;
+#X obj 18 148 pddp/pddplink http://www.crca.ucsd.edu/~msp/Pd_documentation/index.htm
+;
+#X text 18 199 All About Pd;
+#X text 18 77 Document Browser;
+#X text 126 77 click <ctrl>-b or look under the "Help" menu;
+#X obj 18 128 pddp/pddplink ../../1.manual/index.htm -text doc/1.manual/index.htm
+;
+#X text 158 128 (Or use the "Help" menu and choose "Html ...");
+#X text 18 448 Click the "Help" menu for FAQ \, IRC Channel \, Pd webpage
+\, etc.;
+#X obj 18 518 pddp/pddplink all_about_writing_help_patches.pd -text
+Writing Help Patches for Pd Objects;
+#X text 18 108 Manual;
+#X text 18 108 ______;
+#X text 18 38 Using Pure Data's Help System;
+#X text 18 38 _____________________________;
+#X obj 18 57 pddp/pddplink all_about_help_patches.pd -text Using the
+Help Patches for Pd's Internal Objects;
+#X text 18 178 Tutorials;
+#X text 19 177 _________;
+#X text 18 388 Tools;
+#X text 19 387 _____;
+#X obj 18 408 pddp/pddplink all_about_finding_objects.pd -text Search
+for Pd Objects;
+#X text 18 428 Right-click an empty area in a patch and choose "Help"
+;
+#X text 18 478 Developer Docs;
+#X text 19 477 ______________;
+#X obj 6 550 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 126 199 pddp/pddplink all_about.pd -text doc/5.reference/all_about.pd
+;
+#X obj 126 218 pddp/pddplink ../2.control.examples/01.PART1.hello.pd
+-text doc/2.control.examples/01.PART1.hello.pd;
+#X obj 126 238 pddp/pddplink ../3.audio.examples/A00.intro.pd -text
+doc/2.audio.examples/A00.intro.pd;
+#X obj 126 258 pddp/pddplink ../4.data.structures/01.scalars.pd -text
+doc/4.data.structures/01.scalars.pd;
+#X obj 126 278 pddp/pddplink ../manuals/0.Intro/01.hello_world.pd -text
+doc/manuals/0.Intro/01.hello_world.pd;
+#X obj 126 298 pddp/pddplink ../manuals/1.Sound/00.controlling_dsp_processing.pd
+-text doc/manuals/1.Sound/00.controlling_dsp_processing.pd;
+#X obj 126 318 pddp/pddplink ../manuals/2.Image/01.gemwin.pd -text
+doc/manuals/2.Image/01.gemwin.pd;
+#X obj 126 338 pddp/pddplink ../manuals/3.Networking/01.network_ports.pd
+-text doc/manuals/3.Networking/01.network_ports.pd;
+#X obj 126 358 pddp/pddplink ../manuals/pd-msg/msg_and_patch/0.all_msg.pd
+-text doc/manuals/pd-msg/msg_and_patch/0.all_msg.pd;
+#X obj 18 498 pddp/pddplink ../manuals/Externals-HOWTO/HOWTO-externals-en.html
+-text Writing External Objects for Pure Data;
diff --git a/doc/pddp/all_about_haptics.pd b/doc/pddp/all_about_haptics.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d54cdf99f526854063ba443a537c3a0b0ccd981a
--- /dev/null
+++ b/doc/pddp/all_about_haptics.pd
@@ -0,0 +1,61 @@
+#N canvas 0 0 448 374 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header haptics 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 352 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION definition of haptics;
+#X restore 392 354 pd META;
+#N canvas 10 196 428 359 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Haptic Objects in Pd;
+#X text 72 58 Control the pulses and vibrations of a TouchSense (aka
+iFeel) mouse;
+#X text 24 114 Set the overall gain for all force effects;
+#X text 24 153 Apply forces to automatically center the controller
+;
+#X text 24 193 Apply a spring force in a specified direction;
+#X text 24 233 Apply friction to the movement of the controller. Also
+known as damping.;
+#X text 25 280 Periodic effects are forces controlled by waveforms
+of various shape \, strength \, and frequency;
+#X text 25 329 Apply a constant force in a specified direction;
+#X obj 10 33 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 10 33 pddp/pddplink all_about_externals.pd -text Externals;
+#X obj 10 58 pddp/helplink hcs/ifeel;
+#X obj 10 94 pddp/helplink flatspace/ff-gain;
+#X obj 10 134 pddp/helplink flatspace/ff-autocenter;
+#X obj 10 174 pddp/helplink flatspace/ff-spring;
+#X obj 10 214 pddp/helplink flatspace/ff-friction;
+#X obj 10 264 pddp/helplink flatspace/ff-periodic;
+#X obj 10 314 pddp/helplink flatspace/ff-constant;
+#X restore 103 354 pd Related_objects;
+#X obj 6 354 pddp/pddplink all_about.pd -text All About Pd;
+#X text 19 37 "Haptic" means relating to the sense of touch. Haptic
+feedback relates to the sense of touch at the skin level \, and the
+feeling of forces in the muscles and joints. Vibrations stimulate the
+sense of touch while various forces stimulate the muscles.;
+#X text 19 106 There are many haptic devices available \, from a US\$35
+Logitech iFeel mouse \, to the massive \, extremely expensive haptic
+devices used for remote control surgery. Immersion \, Inc. has almost
+a monopoly on this technology due to a number of patents. These objects
+all work with Immersion technology \, generally known as "TouchSense".
+;
+#X text 19 188 Numerous companies produce haptic game controllers:
+mice \, joysticks \, gamepads \, steering wheels. These objects work
+with game controllers. Belkin \, Logitech \, Microsoft \, Saitek \,
+and others make TouchSense game controllers.;
+#X text 19 245 Currently \, these objects only work on GNU/Linux. For
+info on how to get it working \, see: http://at.or.at/hans/haptics
+;
+#X text 19 295 See also:;
+#X obj 19 315 pddp/pddplink all_about_hid.pd;
diff --git a/doc/pddp/all_about_help_patches.pd b/doc/pddp/all_about_help_patches.pd
new file mode 100644
index 0000000000000000000000000000000000000000..975c4bd72bbcc7657f44d2415e1d69459d38d098
--- /dev/null
+++ b/doc/pddp/all_about_help_patches.pd
@@ -0,0 +1,244 @@
+#N canvas 398 77 554 618 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#X obj 0 168 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 507 26 494 625 META 0;
+#X text 12 95 RELEASE_VERSION 0.41.4;
+#X text 158 96 Keywords:;
+#X text 12 5 GENRE help;
+#X text 12 65 DESCRIPTION using help patches in Pure Data;
+#X text 12 25 KEYWORDS needs_work (mention how pd finds help files
+and replace 'common_terminology' subpatch with link to glossary);
+#X text 117 111 control- control rate objects \; signal- audiorate
+objects \; data_structure- objects for creating and managing data structures
+\; nonlocal- objects that can make nonlocal connections to other objects
+(i.e. \, communicate with other objects without using wires) \; storage-
+objects whose main function is to store a value \; array- objects for
+creating and editing arrays \; GUI- objects that provide a graphical
+user interface \; MIDI- objects that provide MIDI functionality \;
+time- objects that measure time or which the user can use to manipulate
+time \; unfinished- help patches under construction \; orphan- help
+patches that can't get accessed by right clicking on the corresponding
+object (like [drawsymbol]) \; block-oriented- see Matju's definition
+\; analysis- object that does analysis \; conversion- convert from
+one set of units to another \; filter \; network \; trigonometry \;
+soundfile- object that can play \, manipulate \, and/or save a sound
+file (wav \, ogg \, mp3 \, etc.). \; random- object outputs a random
+value \, list \, or signal \; symbol_op- object that manipulates or
+stores a symbol \; list_op- object that manipulates or stores a list
+\; canvas_op- object whose behavior only makes sense in terms of a
+canvas \; patchfile_op- object whose behavior only makes sense in terms
+of a patchfile \; ramp - a ramp \; bandlimited \; pd-op - object that
+can report on or manipulate global Pd operation \; anything_op - store
+or manipulate an anything \; abstraction_op - object that only makes
+sense in terms of abstractions;
+#X restore 500 597 pd META;
+#X obj 0 390 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 427 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 78 483 428 109 Related_objects 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 Related Objects;
+#X obj 19 57 pddp/helplink pddp/pddplink;
+#X obj 19 83 pddp/helplink pddp/helplink;
+#X obj 20 33 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 20 33 pddp/pddplink all_about_externals.pd -text Externals;
+#X restore 101 597 pd Related_objects;
+#X obj 78 177 cnv 17 3 42 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 399 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 298 cnv 17 3 35 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 344 cnv 17 3 35 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#N canvas 117 160 428 384 More_about_creation_arguments 0;
+#X obj 110 143 float 6.5;
+#X obj 110 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 110 175 5 0 0 0 - - -;
+#X obj 260 143 symbol foo;
+#X obj 260 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X symbolatom 260 175 10 0 0 0 - - -;
+#X text 40 143 Examples:;
+#X obj 22 292 delwrite~ help-delay 500;
+#X obj 0 210 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 7 211 Creation Argument Numbers;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 More About Creation Arguments;
+#X text 20 332 Arguments: 1 symbol atom "help-delay";
+#X text 86 347 2 float "500";
+#X text 19 246 For most objects in Pd \, the zeroth argument is the
+class name (i.e. \, the name of the object itself) \, so it isn't written
+explicitly.;
+#X text 80 317 (0 symbol atom "delwrite~");
+#X text 19 37 Creation arguments initialize an object's behavior. They
+can be numbers or symbols. Some objects \, like [route] \, can take
+an arbitrary number of arguments. In the example below \, the arguments
+"6.5" and "foo" specify initial values for [float] and [symbol] objects
+\, respectively.;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X restore 101 527 pd More_about_creation_arguments;
+#N canvas 70 265 428 280 Message_types 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 Message types;
+#X text 19 108 float;
+#X text 19 128 list;
+#X text 69 108 - floating point number;
+#X text 19 78 bang;
+#X text 19 199 symbol;
+#X text 19 179 pointer;
+#X text 19 218 signal;
+#X text 19 35 anything;
+#X text 69 218 - audio signal;
+#X text 69 179 - the so-called "gpointer" (used with data-structures)
+;
+#X text 69 78 - the single selector "bang". Usually it is used to trigger
+the object to perform an action.;
+#X text 69 128 - message with the "list" selector plus two or more
+elements. Also includes implicit lists-- messages made up of two or
+more atoms in which the first atom is a float atom.;
+#X text 69 199 - selector "symbol" \, followed by a symbol atom;
+#X text 69 35 - any message (including messages with custom selectors)
+;
+#N canvas 95 140 428 253 about_custom_selectors 0;
+#X msg 24 90 set 20;
+#X msg 24 117 clear;
+#X text 111 61 Documented as:;
+#X text 19 61 Message:;
+#X text 112 90 "set" message or "set";
+#X text 111 117 "clear" message or "clear";
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -33289 0;
+#X msg 168 162 set 20;
+#X floatatom 131 196 5 0 0 0 - - -;
+#X obj 131 215 print OUTPUT;
+#X floatatom 131 164 5 0 0 0 - - -;
+#X text 19 37 Many objects accept custom messages like:;
+#X text 7 1 [help] Messages with Custom Selectors;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 10 0 8 0;
+#X restore 84 56 pd about_custom_selectors;
+#X text 19 238 (inactive);
+#X text 79 238 - some objects like [noise~] will draw an inlet that
+accepts no messages. These xlets are labeled (inactive).;
+#X restore 101 202 pd Message_types;
+#X text 98 507 mention how pd finds help files;
+#X text 98 176 message type;
+#X text 178 176 - description of behavior;
+#X msg 151 125 42;
+#X floatatom 151 147 5 0 0 0 - - -;
+#X text 180 125 <-- Click the message box;
+#X obj 455 51 pddp/dsp;
+#X obj -1 0 cnv 15 552 40 empty \$0-pddp.cnv.header help_patches 3
+12 0 18 -204280 -1 0;
+#X obj 426 89 cnv 15 122 44 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 423 86 cnv 15 122 44 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 424 87 cnv 15 120 42 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 426 110 that produce sound.;
+#X text 426 98 appears in patches;
+#X obj 120 301 cnv 15 352 31 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 117 298 cnv 15 352 31 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 118 299 cnv 15 350 29 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X obj 78 229 cnv 17 3 57 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 120 347 cnv 15 352 31 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 117 344 cnv 15 352 31 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 118 345 cnv 15 350 29 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 120 344 Some objects have a final \, rightmost inlet that has
+a specific behavior. This is identified by the letter "r".;
+#X obj 120 231 cnv 15 355 54 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 117 228 cnv 15 355 54 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 118 229 cnv 15 353 52 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X obj 44 64 cnv 15 356 55 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 41 61 cnv 15 356 55 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 42 62 cnv 15 354 53 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 44 60 Help patches start with a short example that demonstrates
+the object being used. Most are interactive \, like the one below.
+Help patches are read-only by default \, so you can't accidentally
+overwrite anything in them.;
+#X text 98 398 message type;
+#X text 178 398 - description of behavior;
+#X obj 269 4 cnv 15 172 33 empty 411-cnv65 empty 20 12 0 10 -191407
+-1 0;
+#X obj 265 0 cnv 15 172 33 empty 411-cnv66 empty 20 12 0 10 -1 -1 0
+;
+#X obj 266 1 cnv 15 170 31 empty 411-cnv67 empty 20 12 0 10 -261106
+-1 0;
+#X text 268 12 it's shown at the right -->;
+#X text 269 1 If the object has an alias;
+#X obj 454 4 trigger;
+#X obj 523 4 t;
+#X text 502 4 or;
+#X text 80 445 1) atom type;
+#X text 167 445 - description of behavior;
+#X obj 336 439 cnv 15 198 53 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 333 436 cnv 15 198 53 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 334 437 cnv 15 196 51 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 337 448 after the object name to define;
+#X text 337 470 initialize its value(s).;
+#X text 337 437 Many objects accept arguments;
+#N canvas 71 285 428 178 Argument_types 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 Argument types;
+#X text 19 35 float;
+#X text 89 35 - a float atom;
+#X text 19 55 symbol atom;
+#X text 89 55 - symbol atom;
+#X text 19 75 comma;
+#X text 19 95 semicolon;
+#X text 19 125 Note: dollar atoms ("\$1") and dollsym atoms ("\$1-foo")
+are automatically expanded by Pd. They therefore may be used in any
+object box.;
+#X text 89 75 - comma atom (used in objects like [expr] \, msg box)
+;
+#X text 89 95 - semicolon atom (also used in [expr] \, msg box);
+#X restore 101 467 pd Argument_types;
+#X obj 336 525 cnv 15 169 55 empty empty empty 20 12 0 10 -191407 -1
+0;
+#X obj 333 522 cnv 15 169 55 empty empty empty 20 12 0 10 -1 -1 0;
+#X obj 334 523 cnv 15 167 53 empty empty empty 20 12 0 10 -261106 -1
+0;
+#X text 336 534 as well as links to;
+#X text 336 546 tutorials or other help;
+#X text 336 557 patches \, may be found here.;
+#X text 336 523 Important object behavior \,;
+#X text 121 227 Inlet numbers are listed \, starting from zero and
+in left-to-right order. The same goes for the outlets. Additional information
+may sometimes appear in a subpatch \, like the one above-- click it
+with the mouse to open it.;
+#X obj 99 572 pddp/pddplink all_about_messages.pd;
+#X text 337 459 the object's behavior or to;
+#X text 120 298 "n" means there is a variable number of inlets \, the
+exact number of which is determined by creation argument(s).;
+#X text 11 23 usage guide for internal help patches;
+#X obj 99 552 pddp/pddplink glossary.pd;
+#X obj 5 597 pddp/pddplink all_about.pd -text All About Pd;
+#X text 426 87 The 'dsp' button;
+#X connect 16 0 17 0;
diff --git a/doc/pddp/all_about_hid.pd b/doc/pddp/all_about_hid.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5f5a95ff0de371c41eb7e6ddffe9487d0fad711c
--- /dev/null
+++ b/doc/pddp/all_about_hid.pd
@@ -0,0 +1,146 @@
+#N canvas 0 26 773 596 10;
+#X text 5 29 "HID" stands for "Human Interface Device". A HID is any
+device that is meant to allow humans to interact with a computer. Usually
+\, HIDs are mice \, keyboards \, joysticks \, tablets \, gamepads \,
+etc. There a number of unusual HIDs \, like the Griffin PowerMate on
+the low end \, or the SensAble PHANTOM 6DOF on the high end.;
+#X obj 545 437 gemmouse;
+#X text 0 214 KEYBOARDS;
+#X obj 11 233 key;
+#X obj 43 233 keyup;
+#X obj 381 437 gemkeyboard;
+#X obj 467 437 gemkeyname;
+#X obj 88 233 keyname;
+#N canvas 0 22 671 475 deprecated 0;
+#X text 35 38 The use of these objects is deprecated since the functionality
+that they provide is available in the [hid] object \, which is a unified
+\, cross-platform approach.;
+#X text 23 14 DEPRECATED HID OBJECTS;
+#X text 22 148 CYCLONE;
+#X text 22 346 J. SARLO'S [joystick];
+#X text 31 374 only works with Windows and GNU/Linux;
+#X text 26 163 meant for porting Max/MSP patches to Pd.;
+#X text 21 218 RAWHID;
+#X text 28 230 incomplete \, first stab at creating [hid];
+#X text 26 293 These have been replaced by [linuxhid] and [joystick]
+;
+#X text 22 278 LINUXEVENT;
+#X text 108 181 [mousefilter];
+#X text 27 181 [MouseState];
+#X text 26 250 [rawmouse];
+#X text 103 250 [rawjoystick];
+#X text 158 312 [linuxevent];
+#X text 32 312 [linuxjoystick];
+#X text 26 97 GEM;
+#X obj 33 117 gemtablet;
+#X obj 104 117 gemorb;
+#X restore 388 533 pd deprecated HID objects;
+#X text 375 415 USING HIDs WITH GEM;
+#X text 385 478 There are quite a few objects that support HIDs from
+many different sources. Here are a bunch whose functionality is available
+in the [hid] object \, so it is recommended that you do not use these
+objects any more.;
+#X text 386 176 device type;
+#X text 624 160 latency;
+#X text 715 176 (Hz);
+#X text 635 176 (ms);
+#X text 385 186 --------------------------------------------------------
+;
+#X text 635 201 15.5;
+#X text 715 201 64;
+#X text 635 216 8-10;
+#X text 715 216 100-125;
+#X text 385 231 USB mice on GNU/Linux;
+#X text 635 231 1-10;
+#X text 715 231 100-1000;
+#X text 385 246 USB wireless mice;
+#X text 635 246 12-20;
+#X text 715 246 50-80;
+#X text 384 334 While it does not make sense to use a poll rate that
+is much faster than the refresh rate of the device \, it does make
+sense to make the poll rate somewhat faster. If you poll at the same
+rate as the device refreshes \, you could get up to double the latency
+\, i.e. if [hid] polls right before the event is reported.;
+#X text 375 461 DEPRECATED OBJECTS;
+#X text 5 117 When talking about HIDs \, "DOF" is often mentioned.
+"DOF" stands for "degrees of freedom". A degree of freedom is one dimension
+in which that HID can give information. A mouse generally had 2DOFs:
+X-axis and Y-axis \, though a wheel could be considered another DOF.
+The PHANTOM 6DOF device has six degrees of freedom: X \, Y \, Z movement
+\; X \, Y \, Z rotation.;
+#X text 0 325 GENERAL HIDs;
+#X text 96 424 [mouse];
+#X text 159 424 [joystick];
+#X text 243 424 [tablet];
+#X text 313 424 [gamepad];
+#X text 385 201 ADB (Apple Desktop Bus) devices;
+#X text 385 303 P5 Glove;
+#X text 635 303 22;
+#X text 715 303 45;
+#X text 715 289 40;
+#X text 635 289 25;
+#X text 12 424 [keyboard];
+#X text 635 275 5-25;
+#X text 715 275 40-200;
+#X text 385 261 Generic USB Devices;
+#X text 635 261 10;
+#X text 715 261 100;
+#X text 385 275 PS/2 mice;
+#X text 385 289 Serial mice;
+#X text 375 25 LATENCY AND POLLING;
+#X text 375 156 REFRESH RATES OF VARIOUS DEVICES;
+#X text 11 369 Basically any device that is supported by the various
+HID layers on each OS is supported by the [hid] object. So any of those
+devices can be used as controllers with Pd. There already exists a
+number of objects for more common HIDs:;
+#X text 384 39 An essential detail to making an usable instrument is
+the latency between when you perform an action and the sound it produces.
+If the latency is too large \, it will make the instrument annoying
+to play \, or even unplayable. So the aim is to have as low latency
+as possible. To put it into perspective \, if you were playing an electric
+guitar and the amp was 3m (10ft) away from you \, there would be a
+9ms delay between when you plucked the string and when you heard the
+sound.;
+#X text 385 314 --------------------------------------------------------
+;
+#X text 3 453 PLATFORM-SPECIFIC HID OBJECTS;
+#X text 15 470 To get full access to some devices \, you need to use
+the platform-specific objects. The objects have dummy versions on the
+other platforms so that you open the patches on other platforms and
+edit them without breaking them.;
+#X text 5 254 These objects are quite simple to use \, but are limited.
+They only receive key events when Pd has focus \; they output alternating
+1s and 0s to represent auto-repeat \; [key] and [heyup] are limited
+to the 'printing' characters. [keyname] reports Shift \, Ctrl \, Alt
+\, Meta \, etc.;
+#X text 385 216 USB mice on Windows or MacOS X;
+#X text 85 527 [darwinhid];
+#X text 166 527 [windowshid];
+#X text 692 160 refresh rate;
+#X text 12 527 [linuxhid];
+#X obj 11 347 hid;
+#X obj 1 1 cnv 15 770 20 empty \$0-pddp.cnv.header hid 20 10 1 18 -261106
+-33289 0;
+#X obj 737 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 566 cnv 15 770 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION definition of haptics;
+#X restore 722 568 pd META;
+#N canvas 151 430 428 155 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 hid - Related Objects;
+#X obj 19 38 key;
+#X obj 19 69 keyname;
+#X obj 19 99 keyup;
+#X restore 303 568 pd Related_objects;
+#X obj 6 568 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 209 332 linuxhid;
diff --git a/doc/pddp/all_about_index.pd b/doc/pddp/all_about_index.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a1a8b75fe160ff590ca5d0386f372aace24dbcc0
--- /dev/null
+++ b/doc/pddp/all_about_index.pd
@@ -0,0 +1,76 @@
+#N canvas 0 0 447 577 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header All_About_Pd 20
+10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 552 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION table of contents;
+#X restore 392 554 pd META;
+#N canvas 10 462 428 105 Related_objects 0;
+#X text 31 37 Hm...what to put here?;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 All About Pd- Related Objects;
+#X restore 103 554 pd Related_objects;
+#X obj 6 554 pddp/pddplink all_about.pd -text All About Pd
+;
+#X obj 19 112 pddp/pddplink all_about_arrays.pd -text arrays;
+#X obj 19 127 pddp/pddplink all_about_ascii_art.pd -text ascii_art
+;
+#X obj 19 142 pddp/pddplink all_about_atom_conversion.pd -text atom_conversion
+;
+#X obj 19 157 pddp/pddplink all_about_atoms.pd -text atoms;
+#X obj 19 172 pddp/pddplink all_about_canvas_properties.pd -text canvas_properties
+;
+#X obj 19 187 pddp/pddplink all_about_data_types.pd -text data_types
+;
+#X obj 19 202 pddp/pddplink all_about_dollarsign_zero.pd -text dollarsign_zero
+;
+#X obj 19 217 pddp/pddplink all_about_expr_and_value.pd -text expr_and_value
+;
+#X obj 19 232 pddp/pddplink all_about_expr_functions.pd -text expr_functions
+;
+#X obj 19 247 pddp/pddplink all_about_expr_if.pd -text expr_if;
+#X obj 19 262 pddp/pddplink all_about_expr_multiline.pd -text expr_multiline
+;
+#X obj 19 277 pddp/pddplink all_about_haptics.pd -text haptics;
+#X obj 19 292 pddp/pddplink all_about_help_patches.pd -text help_patches
+;
+#X obj 19 307 pddp/pddplink all_about_hid.pd -text hid;
+#X obj 19 322 pddp/pddplink all_about_libraries.pd -text libraries
+;
+#X obj 19 337 pddp/pddplink all_about_lists_vs_anythings.pd -text lists_vs_anythings
+;
+#X obj 19 352 pddp/pddplink all_about_looping.pd -text looping;
+#X obj 19 367 pddp/pddplink all_about_message_conversion.pd -text message_conversion
+;
+#X obj 19 382 pddp/pddplink all_about_messages.pd -text messages;
+#X obj 19 397 pddp/pddplink all_about_midi_flags.pd -text midi_flags
+;
+#X obj 19 427 pddp/pddplink all_about_pd_META.pd -text pd_META;
+#X obj 19 442 pddp/pddplink all_about_scope_and_locality.pd -text scope_and_locality
+;
+#X obj 19 457 pddp/pddplink all_about_send_n_receive.pd -text send_n_receive
+;
+#X obj 19 472 pddp/pddplink all_about_submitting_bugs.pd -text submitting_bugs
+;
+#X obj 19 487 pddp/pddplink all_about_symbol_construction.pd -text
+symbol_construction;
+#X obj 19 502 pddp/pddplink all_about_writing_help_patches.pd -text
+writing_help_patches;
+#X obj 19 517 pddp/pddplink all_about_z_order.pd -text z_order;
+#X obj 19 97 pddp/pddplink all_about_acoustic_conversions.pd -text
+acoustic_conversions;
+#X obj 19 412 pddp/pddplink all_about.pd -text pd;
+#X text 19 77 Table of Contents;
+#X text 19 77 _________________;
+#X text 19 37 "All_About_Pd" is a series of patches to provide a resource
+for concepts and techniques in the Pure Data language.;
diff --git a/doc/pddp/all_about_libraries.pd b/doc/pddp/all_about_libraries.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f3a10b486cff8ee7955056b4dfff1699ac5c4d79
--- /dev/null
+++ b/doc/pddp/all_about_libraries.pd
@@ -0,0 +1,49 @@
+#N canvas 0 0 448 238 10;
+#X declare;
+#X declare;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header libraries 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42. Some info was pulled from puredata.info;
+#X text 12 65 DESCRIPTION how pure data libraries are loaded;
+#X text 12 25 NAME;
+#X restore 392 218 pd META;
+#N canvas 14 133 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Libraries - Related Objects;
+#X obj 22 42 declare;
+#X obj 22 72 import;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink all_about.pd -text All About Pd;
+#X text 20 37 Explain what libraries are \, how to load them \, and
+any missing features that are currently being worked on.;
+#N canvas 14 48 428 166 How_to_load_libraries 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 How to load libraries;
+#X text 19 36 Ways to load libraries: command line \, declare \, import
+\, any others?;
+#X restore 43 81 pd How_to_load_libraries;
+#N canvas 9 155 428 240 What_happens_when_you_load_a_library 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What happens when you load a library?;
+#X text 19 37 Describe what happens \, and maybe give one or two examples...
+;
+#X restore 43 111 pd What_happens_when_you_load_a_library;
+#N canvas 7 69 428 112 Loading_libs_in_an_abstraction 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Loading libs in an abstraction;
+#X text 20 37 Info here...;
+#X restore 43 141 pd Loading_libs_in_an_abstraction;
diff --git a/doc/pddp/all_about_lists_vs_anythings.pd b/doc/pddp/all_about_lists_vs_anythings.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a2b63f425c7395c2917d837f70d3559a41bb8a65
--- /dev/null
+++ b/doc/pddp/all_about_lists_vs_anythings.pd
@@ -0,0 +1,347 @@
+#N canvas 0 0 448 568 10;
+#N canvas 0 0 878 658 old 0;
+#X msg 95 368 1 2 3;
+#X obj 125 399 route list;
+#X msg 62 348 list 1 2 3;
+#X msg 10 93 list;
+#X symbolatom 32 159 10 0 0 0 - - -;
+#X obj 4 2 cnv 15 750 20 empty empty all_about_lists_vs_anythings 20
+10 1 18 -233017 -66577 0;
+#X text 7 69 SPECIAL CASES OF "LISTS".;
+#X obj 125 418 bng 15 250 50 0 empty empty list -20 7 1 10 -262144
+-1 -1;
+#X obj 189 419 bng 15 250 50 0 empty empty non-list 19 7 1 10 -262144
+-1 -1;
+#X msg 184 347 list this is a set with a cast;
+#X msg 191 366 this is a set withOUT a cast;
+#X obj 441 195 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 490 195 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 539 195 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X msg 443 133 list this is a set with a cast;
+#X msg 450 152 this is a set withOUT a cast;
+#X obj 638 195 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 120 617 route list;
+#X obj 120 636 bng 15 250 50 0 empty empty list -20 7 1 10 -262144
+-1 -1;
+#X obj 184 637 bng 15 250 50 0 empty empty non-list 19 7 1 10 -262144
+-1 -1;
+#X msg 189 581 one 2 three 4 five;
+#X msg 40 581 1 two 3 four 5;
+#X text 8 268 IMPLICIT LISTS;
+#X msg 40 561 list 1 two 3 four 5;
+#X msg 189 561 list one 2 three 4 five;
+#X msg 17 113 list 25;
+#X msg 24 133 list foo;
+#X text 87 134 A "list" of one "symbol" is converted to a "symbol"
+;
+#X text 72 113 A "list" of one "float" is converted to a "float";
+#X text 50 93 An empty "list" is converted to a "bang";
+#X obj 477 594 pddp/pddplink all_about_atom_conversion.pd -text all_about_atom_conversion
+;
+#X obj 721 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 11 490 Sets of mixed atoms are defined based on what the "selector"
+(the first element of a set). If the "selector" is a "float" \, then
+the set is a "list". If the "selector" is the word "list" \, then the
+set is a "list". If the "selector" is a "symbol" \, then the set is
+NOT a "list":;
+#X text 570 631 updated for Pd 0.38-2;
+#X obj 688 195 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X msg 459 356 1 1;
+#X obj 452 382 +;
+#X floatatom 452 404 5 0 0 0 - - -;
+#X msg 424 356 1 3;
+#X text 416 106 A set that is not a "list" has an undefined type:;
+#X msg 451 337 list 1 2;
+#X text 402 278 If you send a "list" of arguments to the first inlet
+of an object \, the elements of that "list" will be applied to the
+respective inlet. This does not apply to sets that are NOT "lists".
+;
+#X text 400 262 "LISTS" MAP TO INLETS;
+#X text 407 457 WORKING WITH MIXED SETS;
+#X text 11 471 SETS OF MIXED "ATOMS";
+#X text 9 288 A message having more than one atom starting with a "float"
+is implicitly considered a list. A message having more than one atom
+starting with a "symbol" is not \, unless that "symbol" is the selector
+"list".;
+#N canvas 30 68 857 475 has 0;
+#X obj 96 162 print;
+#X msg 57 93 list one two three;
+#X msg 42 54 1 2 3;
+#X msg 51 73 one 2 three;
+#X obj 17 162 route list;
+#X obj 17 181 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 85 182 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 44 132 prepend test;
+#X text 12 229 [print] only interprets the "list" selector when the
+following body of the message is an implied list \, i.e. a set of atoms
+that starts with a float.;
+#X msg 443 68 one 2 three;
+#X text 141 134 (I used cyclone's);
+#X obj 442 127 route one;
+#X text 426 17 [route] accepts lists and undefined sets and outputs
+lists \, and like [print] only interprets the 'list' selector for implied
+lists:;
+#X obj 460 159 print ONE;
+#X obj 441 159 bng 16 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 604 159 bng 16 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 668 160 print ONE;
+#X obj 650 160 bng 16 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 813 160 bng 16 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 651 129 route 1;
+#X msg 658 90 list 1 two 3;
+#X msg 652 70 1 two 3;
+#X msg 449 88 list one 2 three;
+#X msg 281 68 one 2 three;
+#X obj 280 133 prepend list;
+#X obj 280 177 print PREPEND_LIST;
+#X msg 290 89 list one 2 three;
+#X text 12 19 [prepend] interprets lists and outputs undefined sets.
+;
+#X obj 746 160 print NOT;
+#X obj 536 159 print NOT;
+#X msg 679 305 symbol test;
+#X obj 685 359 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 762 360 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 677 398 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 755 398 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 685 341 route symbol;
+#X obj 677 379 route symbol;
+#X msg 770 305 test;
+#X obj 470 359 route list;
+#X obj 470 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 538 379 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 457 397 route list;
+#X obj 457 416 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 525 417 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 473 310 list 1 two 3;
+#X msg 456 290 1 two 3;
+#X msg 489 330 list one 2 three;
+#X msg 133 330 one 2 three;
+#X obj 65 414 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 133 415 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 151 390 print STRAIGHT;
+#X msg 117 310 list 1 two 3;
+#X msg 100 290 1 two 3;
+#X msg 142 351 list one 2 three;
+#X obj 68 391 route list;
+#X text 429 231 [route list] interprets all lists \, but outputs non-lists
+on its left outlet for lists whose first element is a symbol. [route
+symbol] outputs a symbol from its left outlet.;
+#X connect 1 0 7 0;
+#X connect 2 0 7 0;
+#X connect 3 0 7 0;
+#X connect 4 0 5 0;
+#X connect 4 1 6 0;
+#X connect 7 0 0 0;
+#X connect 7 0 4 0;
+#X connect 9 0 11 0;
+#X connect 11 0 13 0;
+#X connect 11 0 14 0;
+#X connect 11 1 15 0;
+#X connect 11 1 29 0;
+#X connect 19 0 16 0;
+#X connect 19 0 17 0;
+#X connect 19 1 18 0;
+#X connect 19 1 28 0;
+#X connect 20 0 19 0;
+#X connect 21 0 19 0;
+#X connect 22 0 11 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 26 0 24 0;
+#X connect 30 0 35 0;
+#X connect 35 0 31 0;
+#X connect 35 0 36 0;
+#X connect 35 1 32 0;
+#X connect 36 0 33 0;
+#X connect 36 1 34 0;
+#X connect 37 0 35 0;
+#X connect 38 0 39 0;
+#X connect 38 0 41 0;
+#X connect 38 1 40 0;
+#X connect 41 0 42 0;
+#X connect 41 1 43 0;
+#X connect 44 0 38 0;
+#X connect 45 0 38 0;
+#X connect 46 0 38 0;
+#X connect 47 0 50 0;
+#X connect 47 0 54 0;
+#X connect 51 0 50 0;
+#X connect 51 0 54 0;
+#X connect 52 0 50 0;
+#X connect 52 0 54 0;
+#X connect 53 0 50 0;
+#X connect 53 0 54 0;
+#X connect 54 0 48 0;
+#X connect 54 1 49 0;
+#X restore 443 543 pd has some odd cases of list handling;
+#X text 407 479 When working with sets that might be either "lists"
+or undefined \, use [prepend]. Many of the "list" handling objects
+in Pd have odd quirks which can make things difficult.;
+#X obj 441 175 route bang float symbol pointer list;
+#X obj 589 195 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
+-1 -1;
+#X obj 11 199 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 60 199 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 109 199 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X obj 208 199 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 258 199 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X obj 11 179 route bang float symbol pointer list;
+#X obj 159 199 bng 15 250 50 0 empty empty pointer 0 21 1 9 -262144
+-1 -1;
+#X text 39 53 (this has nothing to do with lists vs. anythings);
+#X text 419 243 (this has nothing to do with lists vs. anythings);
+#X text 413 79 (this is misleading-- the anything below would match
+selector "this");
+#X text 424 440 (mention list trim here);
+#X text 16 455 (this is an anything \, which is never defined);
+#X connect 0 0 1 0;
+#X connect 1 0 7 0;
+#X connect 1 1 8 0;
+#X connect 2 0 1 0;
+#X connect 3 0 55 0;
+#X connect 9 0 1 0;
+#X connect 10 0 1 0;
+#X connect 14 0 48 0;
+#X connect 15 0 48 0;
+#X connect 17 0 18 0;
+#X connect 17 1 19 0;
+#X connect 20 0 17 0;
+#X connect 21 0 17 0;
+#X connect 23 0 17 0;
+#X connect 24 0 17 0;
+#X connect 25 0 55 0;
+#X connect 26 0 4 0;
+#X connect 26 0 55 0;
+#X connect 35 0 36 0;
+#X connect 36 0 37 0;
+#X connect 38 0 36 0;
+#X connect 40 0 36 0;
+#X connect 48 0 11 0;
+#X connect 48 1 12 0;
+#X connect 48 2 13 0;
+#X connect 48 3 49 0;
+#X connect 48 4 16 0;
+#X connect 48 5 34 0;
+#X connect 55 0 50 0;
+#X connect 55 1 51 0;
+#X connect 55 2 52 0;
+#X connect 55 3 56 0;
+#X connect 55 4 53 0;
+#X connect 55 5 54 0;
+#X restore 368 202 pd old;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header lists_vs_anythings
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 546 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 115 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 95 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 25 NAME list;
+#X text 12 65 DESCRIPTION definitions for list and anything in the
+context of Pd;
+#X restore 392 548 pd META;
+#X obj 6 548 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 40 92 pddp/pddplink all_about_atoms.pd;
+#X obj 40 107 pddp/pddplink all_about_messages.pd;
+#X text 40 249 Anythings;
+#X text 40 182 Examples:;
+#X text 60 202 list one two three;
+#X text 60 217 0 1 60;
+#X text 60 232 list foo 121 bar;
+#X text 40 35 If you are familiar with messages in Pd then the difference
+between a list and an "anything" will be easy to understand. If not
+\, have a look at the following help patches:;
+#X text 199 201 move to all_about_route? ->;
+#X text 40 142 A list message consists of either a) the selector "list"
+followed by two or more atoms \, or b) a multi-element message beginning
+with a number ("implicit list").;
+#X text 40 269 1) The term "anything" in Pd generally means "any message"--
+to be specific \, any message in Pd that has a valid selector (or is
+an implicit float or list message). This includes the built-in message
+types float \, symbol \, list \, bang \, and pointer \, as well as
+custom messages like "set 87" \, print \, debug \, "receive972 a b
+d 3" \, etc.;
+#X text 40 349 2) The term "anything" is also used to mean messages
+with selectors other than those of Pd's built-in message types-- i.e
+\, "anything else." This use probably arises because there is not a
+name for the set of messages consisting of one or more atoms that aren't
+float \, symbol \, list \, pointer \, nor bang messages. (The word
+"meta-message" is synonymous with this meaning.);
+#N canvas 14 370 428 105 Fine_print 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Lists vs. Anythings - A few more details;
+#X text 22 43 What about messages with custom atoms? Are these included
+in "anything"?;
+#X restore 243 253 pd Fine_print;
+#X text 39 448 * (archaic) To confuse matters even more \, many externals
+were made before there was a built-in "list" message in Pd. Some external
+objects' help patches may refer to all messages that are not a symbol
+\, float \, pointer \, or bang as a "list.";
+#X text 40 127 Lists *;
+#N canvas 15 248 428 305 Related_objects_and_Quick_Quiz 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Lists vs. Anythings - Related Objects;
+#X obj 22 43 list;
+#X msg 77 43;
+#X obj 1 71 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 72 Quick Quiz!;
+#X msg 35 105 list one two three;
+#X msg 65 156 one two three;
+#X msg 75 183 symbol one_two_three;
+#X msg 55 129 1 2 3;
+#X obj 35 215 route list symbol one;
+#X obj 153 242 bng 15 500 50 0 empty empty one 0 24 1 12 -262144 -1
+-1;
+#X obj 86 242 bng 15 500 50 0 empty empty symbol 0 24 1 12 -262144
+-1 -1;
+#X obj 35 242 bng 15 500 50 0 empty empty list 0 24 1 12 -262144 -1
+-1;
+#X obj 201 242 bng 15 500 50 0 empty empty None_of_the_above 0 24 1
+12 -262144 -1 -1;
+#X connect 6 0 10 0;
+#X connect 7 0 10 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 0;
+#X connect 10 0 13 0;
+#X connect 10 1 12 0;
+#X connect 10 2 11 0;
+#X connect 10 3 14 0;
+#X restore 103 548 pd Related_objects_and_Quick_Quiz;
+#X obj 40 517 pddp/pddplink all_about_message_conversion.pd;
diff --git a/doc/pddp/all_about_looping.pd b/doc/pddp/all_about_looping.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6ae42dd558c5a470e52b56bc170085a05e07c73c
--- /dev/null
+++ b/doc/pddp/all_about_looping.pd
@@ -0,0 +1,229 @@
+#N canvas 0 0 448 570 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header looping 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 20 37 Programming with Pd is a different way of thinking than
+standard procedural or object-oriented programming. Looping illustrates
+this.;
+#X text 21 102 a) a chain of several object connect together;
+#X text 21 118 b) a wire (or nonlocal connection) from the outlet of
+an object at the end of the chain that goes to the inlet of an earlier
+object in the chain.;
+#X text 21 156 c) a condition to continue the loop \, and a condition
+that stops the loop. (Otherwise this is an infinite loop!);
+#N canvas 14 48 428 513 Recursive_vs_Iterative_Loops 0;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 10 1 18 -233017 -66577
+0;
+#X text 7 1 Recursive vs. Iterative Loops;
+#X obj 102 161 f;
+#X obj 102 115 t b b;
+#X obj 129 137 0;
+#X obj 129 254 print;
+#X obj 152 161 + 1;
+#X obj 102 187 t a a;
+#X obj 102 209 moses 100;
+#X obj 102 95 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 19 36 Recursive loops are [define it] \, while iterative loops
+are [define it];
+#X text 19 68 Below is an example of a recursive loop in Pd.;
+#X obj 59 353 t b b;
+#X obj 86 375 0;
+#X obj 59 476 print;
+#X obj 59 449 moses 100;
+#X obj 59 328 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 19 288 Here are two iterative loops \, both using [until] to
+perform the same task as above.;
+#X obj 59 399 until;
+#X obj 59 425 f;
+#X obj 93 425 + 1;
+#X obj 127 399 b;
+#X obj 59 169 b;
+#X obj 102 231 t a a;
+#X msg 229 328 100;
+#X obj 229 350 t a b;
+#X obj 276 373 0;
+#X obj 229 400 f;
+#X obj 259 400 + 1;
+#X obj 229 373 until;
+#X obj 229 427 print;
+#X text 157 353 or...;
+#X connect 2 0 7 0;
+#X connect 3 0 2 0;
+#X connect 3 1 4 0;
+#X connect 4 0 2 1;
+#X connect 6 0 2 1;
+#X connect 7 0 8 0;
+#X connect 7 1 6 0;
+#X connect 8 0 23 0;
+#X connect 9 0 3 0;
+#X connect 12 0 18 0;
+#X connect 12 1 13 0;
+#X connect 13 0 19 1;
+#X connect 15 0 14 0;
+#X connect 15 1 21 0;
+#X connect 16 0 12 0;
+#X connect 18 0 19 0;
+#X connect 19 0 15 0;
+#X connect 19 0 20 0;
+#X connect 20 0 19 1;
+#X connect 21 0 18 1;
+#X connect 22 0 2 0;
+#X connect 23 0 22 0;
+#X connect 23 1 5 0;
+#X connect 24 0 25 0;
+#X connect 25 0 29 0;
+#X connect 25 1 26 0;
+#X connect 26 0 27 1;
+#X connect 27 0 28 0;
+#X connect 27 0 30 0;
+#X connect 28 0 27 1;
+#X connect 29 0 27 0;
+#X restore 23 237 pd Recursive_vs_Iterative_Loops;
+#X text 21 82 A recursive loop in Pd consists of the following:;
+#X text 21 196 Additionally \, there are several Pd objects that can
+be used to create iterative loops.;
+#N canvas 22 133 428 498 A_more_complex_recursive_loop 0;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 10 1 18 -233017 -66577
+0;
+#X text 7 1 A more complex recursive loop;
+#X obj 91 123 +;
+#X floatatom 130 123 5 0 0 0 - - -;
+#X msg 91 94 1;
+#X obj 170 146 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 130 94 0;
+#X obj 91 169 t f f;
+#X text 189 255 X;
+#X text 99 256 Y;
+#X obj 61 249 t b f;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array \$0-array 100 float 1;
+#A 0 0 0.935458 0.948449 0.960016 0.970142 0.978811 0.98601 0.991728
+0.995956 0.998689 0.999923 0.999654 0.997884 0.994616 0.989854 0.983606
+0.97588 0.966689 0.956046 0.943968 0.930471 0.915578 0.899309 0.88169
+0.862747 0.842508 0.821004 0.798267 0.774331 0.749233 0.723009 0.695699
+0.667345 0.637988 0.607673 0.576446 0.544353 0.511443 0.477764 0.443368
+0.408306 0.372631 0.336397 0.299657 0.262467 0.224883 0.186962 0.148759
+0.110333 0.0717417 0.0330423 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274 0.000796274 0.000796274 0.000796274
+0.000796274 0.000796274 0.000796274;
+#X coords 0 1 99 -1 300 100 1;
+#X restore 24 375 graph;
+#X obj 88 274 tabwrite \$0-array;
+#X obj 91 146 moses 100;
+#X obj 91 67 bng 20 250 50 0 empty empty start 0 -6 1 10 -4033 -1 -1
+;
+#X text 177 119 <-- counter;
+#X text 189 146 <-- split at array size to stop;
+#X text 217 159 and reset counter to 0;
+#X text 61 296 ^--bang for next step;
+#X obj 61 209 expr abs(cos( min (1.57 \, ($f1 / $f2 - 0.4)) ) );
+#X obj 276 186 hsl 128 15 1 127 0 1 empty empty change_graph_shape
+-130 8 1 12 -208896 -1 -1 2500 0;
+#X text 21 322 In this example \, the "bang" from [t b f] continues
+the loop. The [moses 100] ends the loop.;
+#X text 157 94 <-- stop;
+#X obj 43 161 bang;
+#X text 9 95 continue -->;
+#X text 20 37 Here is a recursive loop with a little more complex behavior:
+;
+#X connect 2 0 3 0;
+#X connect 2 0 13 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 6 0 2 1;
+#X connect 7 0 19 0;
+#X connect 7 1 12 1;
+#X connect 10 0 23 0;
+#X connect 10 1 12 0;
+#X connect 13 0 7 0;
+#X connect 13 1 5 0;
+#X connect 14 0 4 0;
+#X connect 19 0 10 0;
+#X connect 20 0 19 1;
+#X connect 23 0 4 0;
+#X restore 23 264 pd A_more_complex_recursive_loop;
+#N canvas 20 155 428 257 A_basic_sample_looper 0;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 10 1 18 -233017 -66577
+0;
+#X text 7 1 A basic sample looper using recursive looping;
+#X text 20 37 For the most basic looping of samples \, you can use
+[readsf~]:;
+#X obj 59 186 readsf~;
+#X obj 50 106 spigot;
+#X obj 83 84 tgl 15 0 empty empty allow_looping 17 7 0 10 -4033 -1
+-1 0 1;
+#X msg 59 160 open ../sound/voice.wav;
+#X text 104 206 ^- "bang"ed when complete;
+#X msg 23 160 1;
+#X obj 60 218 dac~;
+#X obj 23 133 t b b;
+#X obj 23 85 bng 20 250 50 0 empty empty start 0 -6 1 10 -4033 -1 -1
+;
+#X connect 3 0 9 0;
+#X connect 3 0 9 1;
+#X connect 3 1 4 0;
+#X connect 4 0 10 0;
+#X connect 5 0 4 1;
+#X connect 6 0 3 0;
+#X connect 8 0 3 0;
+#X connect 10 0 8 0;
+#X connect 10 1 6 0;
+#X connect 11 0 10 0;
+#X restore 23 290 pd A_basic_sample_looper;
+#X obj 1 548 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 25 NAME until;
+#X text 12 65 DESCRIPTION how to create loops in Pd;
+#X restore 392 550 pd META;
+#N canvas 9 223 428 342 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Looping- Related Objects;
+#X obj 22 42 until;
+#X obj 21 78 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 21 78 pddp/pddplink all_about_externals.pd -text Externals;
+#X obj 20 99 pddp/helplink flatspace/loop;
+#X obj 20 139 pddp/helplink iemlib/modulo_counter;
+#X obj 20 179 pddp/helplink creb/count;
+#X obj 20 199 pddp/helplink creb/count;
+#X obj 20 219 pddp/helplink unauthorized/countund;
+#X obj 20 239 pddp/helplink ekext/cup;
+#X obj 20 259 pddp/helplink ekext/cupd;
+#X obj 20 279 pddp/helplink markex/counter;
+#X obj 20 299 pddp/helplink cyclone/counter;
+#X obj 20 119 pddp/helplink flatspace/gem_counter;
+#X obj 20 159 pddp/helplink iemlib/for++;
+#X text 186 78 Sample Looping;
+#X text 187 78 ______________;
+#X obj 185 98 pddp/helplink flatspace/susloop~;
+#X obj 82 42 loop~;
+#X obj 185 118 pddp/helplink cyclone/count~;
+#X text 186 198 Video Looping;
+#X text 187 198 _____________;
+#X obj 185 228 pddp/helplink pdp/pdp_loop;
+#X obj 185 248 pddp/helplink pdp/pdp_qtloop~;
+#X obj 185 138 pddp/helplink loopsampler;
+#X obj 185 158 pddp/helplink xgroove~;
+#X text 263 139 Which library for;
+#X text 263 159 loopsampler and xgroove~?;
+#X restore 103 550 pd Related_objects;
+#X obj 6 550 pddp/pddplink all_about.pd -text All About Pd;
diff --git a/doc/pddp/all_about_message_conversion.pd b/doc/pddp/all_about_message_conversion.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fbbfcd2af3920f777895b905df506ce7ad14387e
--- /dev/null
+++ b/doc/pddp/all_about_message_conversion.pd
@@ -0,0 +1,121 @@
+#N canvas 0 0 448 238 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header message_conversion
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 43 150 pddp/pddplink all_about_messages.pd;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 115 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 95 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 65 DESCRIPTION description of message conversion performed
+by Pd;
+#X text 12 25 NAME;
+#X restore 392 218 pd META;
+#N canvas 14 133 428 370 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Message Conversion - Related Objects;
+#X obj 22 82 makefilename;
+#X obj 22 127 pddp/helplink zexy/list2symbol;
+#X obj 22 147 pddp/helplink zexy/symbol2list;
+#X obj 22 167 pddp/helplink zexy/makesymbol;
+#X obj 22 307 pddp/helplink cyclone/tosymbol;
+#X obj 22 327 pddp/helplink cyclone/fromsymbol;
+#X obj 22 347 pddp/helplink cyclone/sprintf;
+#X obj 22 52 list;
+#X obj 62 52 route;
+#X obj 22 187 pddp/helplink zexy/lister;
+#X obj 22 207 pddp/helplink zexy/list2int;
+#X obj 22 227 pddp/helplink zexy/any2list;
+#X obj 22 247 pddp/helplink zexy/repack;
+#X obj 22 267 pddp/helplink zexy/glue;
+#X obj 112 52 pack;
+#X obj 152 52 pipe;
+#X obj 22 287 pddp/helplink iemlib/iem_any;
+#X msg 196 52;
+#X obj 21 108 pddp/pddplink all_about_externals.pd -text _________
+;
+#X obj 21 108 pddp/pddplink all_about_externals.pd -text Externals
+;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink all_about.pd -text All About Pd;
+#N canvas 20 56 428 587 anythings_and_lists 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X obj 1 190 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 20 27 All the list family objects-- [list append] \, [list
+prepend] [list length] \, [list split] \, and [list trim]-- convert
+the incoming message to a list before it is processed.;
+#X msg 25 76 this is an anything.;
+#X obj 25 98 list append;
+#X obj 25 120 route list;
+#X obj 35 142 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 103 98 <- convert this message to a list;
+#X text 7 190 Convert a List to an Anything;
+#X text 7 1 Convert an Anything to a List;
+#X msg 22 266 list one two three;
+#X obj 22 338 list trim;
+#X msg 45 313 one two three;
+#X obj 25 162 print any2list;
+#X obj 22 360 print list2any;
+#X text 20 216 Use the [list trim] object to remove the "list" or "symbol"
+selector \, which will convert a list or symbol message to an anything:
+;
+#X msg 40 289 symbol one;
+#X obj 1 388 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X msg 24 419 list;
+#X symbolatom 45 488 10 0 0 0 - - -;
+#X msg 30 443 list 25;
+#X msg 37 466 list foo;
+#X text 100 466 A "list" of one "symbol" is converted to a "symbol"
+;
+#X text 85 443 A "list" of one "float" is converted to a "float";
+#X text 64 419 An empty "list" is converted to a "bang";
+#X obj 24 541 bng 15 500 50 0 empty empty bang 0 24 1 12 -262144 -1
+-1;
+#X obj 73 541 bng 15 500 50 0 empty empty float 0 24 1 12 -262144 -1
+-1;
+#X obj 122 541 bng 15 500 50 0 empty empty symbol 0 24 1 12 -262144
+-1 -1;
+#X obj 241 541 bng 15 500 50 0 empty empty list 0 24 1 12 -262144 -1
+-1;
+#X obj 281 541 bng 15 500 50 0 empty empty OTHER 0 24 1 12 -262144
+-1 -1;
+#X obj 24 514 route bang float symbol pointer list;
+#X obj 182 541 bng 15 500 50 0 empty empty pointer 0 24 1 12 -262144
+-1 -1;
+#X text 7 388 Special Cases of Lists;
+#X text 103 118 <- route removes the selector "list"...;
+#X text 123 162 <- ... so this is once again an anything;
+#X text 138 328 message "one two three" will pass unchanged;
+#X text 138 313 custom selectors are not "trimmed" \, so the;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 0 13 0;
+#X connect 10 0 11 0;
+#X connect 11 0 14 0;
+#X connect 12 0 11 0;
+#X connect 16 0 11 0;
+#X connect 18 0 30 0;
+#X connect 20 0 30 0;
+#X connect 21 0 19 0;
+#X connect 21 0 30 0;
+#X connect 30 0 25 0;
+#X connect 30 1 26 0;
+#X connect 30 2 27 0;
+#X connect 30 3 31 0;
+#X connect 30 4 28 0;
+#X connect 30 5 29 0;
+#X restore 43 42 pd anythings_and_lists;
+#X obj 43 170 pddp/pddplink all_about_lists_vs_anythings.pd;
+#X obj 43 190 pddp/pddplink all_about_atom_conversion.pd;
diff --git a/doc/pddp/all_about_messages.pd b/doc/pddp/all_about_messages.pd
new file mode 100644
index 0000000000000000000000000000000000000000..90a97e3fe4955f67a92bf298f9d4a688a6874b5b
--- /dev/null
+++ b/doc/pddp/all_about_messages.pd
@@ -0,0 +1,381 @@
+#N canvas 0 0 448 248 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header messages 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#N canvas 14 48 428 289 What_is_a_message_in_Pd? 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 What is a message in Pd?;
+#X text 19 126 1) A selector \, which must be a symbol atom.[1];
+#X text 19 243 [1] The exceptions to this are implicit float and list
+messages. See the next subpatch for details.;
+#X text 19 106 Messages in Pd are made up of the following components:
+;
+#X text 19 183 Messages divide into two groups: those with selectors
+that have a predefined meaning and behavior in Pd \, and everything
+else. See the other subpatches for more on how Pd processes messages.
+;
+#X text 19 36 Objects in Pd send each other various data in the form
+of messages. Messages can transport all kinds of information: float
+\, symbol \, and pointer atoms \, groups of floats and symbols \, etc.
+Understanding how to build and work with messages is a key to understanding
+Pd.;
+#X text 19 146 2) Zero or more arguments \, which may be any atom type
+that Pd can understand.;
+#X restore 43 42 pd What_is_a_message_in_Pd?;
+#X obj 43 183 pddp/pddplink all_about_atoms.pd;
+#N canvas 19 160 428 264 User_defined_messages_in_Pd 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 User-defined messages in Pd;
+#X text 20 79 1) single selector messages - these are messages made
+up of a single symbol atom \, like "set" \, "clear" \, or "flush".
+;
+#X text 20 37 User defined messages \, also referred to as "anythings"
+\, are messages with selectors other than those predefined by Pd (listed
+in the previous subpatch). These include:;
+#X obj 20 231 pddp/pddplink all_about_lists_vs_anythings.pd;
+#X text 20 212 For more information about "anythings" \, see:;
+#X text 20 110 2) custom selector + 1 or more arguments - messages
+with a custom selector followed by one or more atoms of any type. Examples
+include "set 3 4 5" \, "threshold 30 74" \, and "foo bar 3 four".;
+#X text 20 165 These messages are also referred to as meta-messages
+\, selector series \, and anythings. (Additionally \, a message like
+"foo 1 2 3" could be called a "foo message").;
+#X restore 43 94 pd User_defined_messages_in_Pd;
+#X obj 1 226 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS needs_work;
+#X text 12 25 NAME list float symbol;
+#X text 12 65 DESCRIPTION message syntax in Pd;
+#X restore 392 228 pd META;
+#X obj 6 228 pddp/pddplink all_about.pd -text All About Pd;
+#X text 42 153 Messages are made up of atoms. Make sure you understand
+atoms before reading about messages.;
+#N canvas 20 104 428 468 Distinguishing_Message_Types 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X msg 23 72 foo;
+#X msg 23 140 symbol foo;
+#X symbolatom 22 378 10 0 0 0 - - -;
+#X msg 22 254 symbol clear;
+#X msg 46 310 clear;
+#X text 109 260 like this one and pass it to the outlet after;
+#X text 108 246 The [pipe] object will take a symbol message;
+#X text 91 297 On the other hand \, the "clear" message tells the;
+#X text 19 403 It's helpful to consider the following: if Pd didn't
+make a distinction between "symbol clear" and "clear" \, how would
+[pipe] know whether you want to send the word "clear" to the outlet
+\, or trigger the "clear" function described above?;
+#X text 90 312 [pipe] object to forget all stored message and;
+#X text 90 327 refrain from outputting anything.;
+#X obj 22 351 pipe s 3000;
+#X text 95 351 <-- wait 3 seconds \, then output the message;
+#X text 7 1 Understanding Message Types;
+#X text 20 35 Remember that messages in Pd can consist of a single
+symbol atom. Consider the following:;
+#X text 19 201 This distinction is important: some objects \, for example
+\, have one behavior for symbol messages \, and a different behavior
+for custom messages.;
+#X text 109 274 the specified duration (3 seconds).;
+#X text 19 93 Above is a message with the selector "foo". You might
+also refer to this as a custom message \, the symbol atom "foo" \,
+or even a "foo message". The message has no arguments.;
+#X text 19 159 Above is a message with the selector "symbol". The first
+(and only) argument is "foo". This is a "symbol message" \, one of
+Pd's built-in message types.;
+#X connect 4 0 12 0;
+#X connect 5 0 12 0;
+#X connect 12 0 3 0;
+#X restore 43 120 pd Distinguishing_Message_Types;
+#N canvas 24 124 428 150 Quick_Quiz! 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Messages- Related Objects;
+#X msg 22 43 list quiz: What type of message is this?;
+#X obj 22 99 bng 15 250 50 0 empty empty list 0 25 0 8 -262144 -1 -1
+;
+#X obj 63 99 bng 15 250 50 0 empty empty bang 0 25 0 8 -262144 -1 -1
+;
+#X obj 104 99 bng 15 250 50 0 empty empty float 0 25 0 8 -262144 -1
+-1;
+#X obj 146 99 bng 15 250 50 0 empty empty symbol 0 25 0 8 -262144 -1
+-1;
+#X obj 187 99 bng 15 250 50 0 empty empty secret 0 25 0 8 -262144 -1
+-1;
+#X obj 229 99 bng 15 250 50 0 empty empty none_of_the_above 0 25 0
+8 -262144 -1 -1;
+#X obj 22 70 route list bang float symbol secret;
+#X text 276 42 <- Click to find out;
+#X connect 2 0 9 0;
+#X connect 9 0 3 0;
+#X connect 9 1 4 0;
+#X connect 9 2 5 0;
+#X connect 9 3 6 0;
+#X connect 9 4 7 0;
+#X connect 9 5 8 0;
+#X restore 103 228 pd Quick_Quiz!;
+#N canvas 0 0 878 627 old 0;
+#X obj 433 459 route;
+#X floatatom 113 135 5 0 0 1 "float" - -;
+#X symbolatom 204 135 10 0 0 1 "symbol" - -;
+#X obj 116 231 symbol;
+#X symbolatom 116 278 0 0 0 0 - - -;
+#X msg 125 255 word;
+#X msg 116 213 test;
+#X msg 99 191 symbol this;
+#X text 190 190 set type directly;
+#X text 157 255 does not work (check console messages);
+#X floatatom 35 253 5 0 0 0 - - -;
+#X msg 40 232 12;
+#X msg 23 212 float 83;
+#N canvas 534 126 490 340 Related_Objects 0;
+#X obj 32 54 ftos;
+#X obj 68 54 list2symbol;
+#X text 23 22 data type conversion;
+#X obj 155 55 tosymbol;
+#X obj 219 55 fromsymbol;
+#X obj 36 252 lister;
+#X obj 34 98 atoi;
+#X obj 30 138 list2int;
+#X obj 94 137 l2i;
+#X obj 96 163 a2l;
+#X obj 29 164 any2list;
+#X obj 158 138 list2symbol;
+#X obj 158 159 symbol2list;
+#X obj 247 138 l2s;
+#X obj 247 158 s2l;
+#X obj 123 252 list;
+#X restore 447 604 pd Related_Objects;
+#X text 407 245 Many objects cast the data they receive when they output
+it:;
+#X text 526 326 Some objects do not cast the data:;
+#X obj 424 297 trigger anything;
+#X msg 424 272 this is a list without a cast;
+#X obj 424 320 print;
+#X text 410 360 Some objects need to have the data explicitly declared
+in order to handle it. These are mostly symbol handling objects.;
+#X text 410 426 Objects which route data generally can handle explicitly
+or implicitly defined data.;
+#X obj 480 459 trigger;
+#X obj 538 459 niagara;
+#X obj 426 403 select;
+#X obj 15 18 cnv 15 750 20 empty empty all_about_data_types 20 10 1
+18 -233017 -66577 0;
+#X obj 731 19 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 11 311 "anything";
+#X text 11 427 "list";
+#X text 11 413 "float";
+#X text 11 454 "symbol";
+#X text 11 400 "bang";
+#X msg 111 359 anything 1 two three;
+#X msg 262 359 one 2 3;
+#X obj 167 442 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 171 416 t a b f l p s;
+#X obj 201 443 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 264 393 list one 2 3;
+#X msg 303 423 1 2 3;
+#X text 17 55 atoms (basic data types):;
+#X text 17 80 The basic data types are known as 'atoms' in Pd. "float"
+and "symbol" atoms have 'atom boxes' for realtime display and control
+from within a patch. "pointer" atoms are used for accessing data stored
+in graphical data structures.;
+#X obj 421 197 int;
+#X obj 429 177 / 5.23;
+#X floatatom 429 149 5 0 0 0 - - -;
+#X floatatom 462 217 5 0 0 0 - - -;
+#X floatatom 421 217 5 0 0 0 - - -;
+#X obj 511 147 tosymbol;
+#X obj 575 148 fromsymbol;
+#X obj 658 147 list2symbol;
+#X obj 662 189 ftos;
+#X obj 617 56 symbol;
+#X obj 580 100 int;
+#X obj 699 56 pointer;
+#X obj 440 100 bang;
+#X obj 478 101 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 499 56 float;
+#X text 21 547 There a number of objects which are used for storing
+messages \, or casting messages as a specific data type \, sometimes
+converting from one data type to another. The right inlet on these
+objects is stores that value \, which can be later output using a bang.
+;
+#X obj 608 100 lister;
+#X text 540 57 aka;
+#X obj 566 56 f;
+#X obj 470 531 pddp/pddplink all_about_lists_vs_anythings.pd -text
+all_about_lists_vs_anythings;
+#X obj 470 552 pddp/pddplink all_about_symbol_construction.pd -text
+all_about_symbol_construction;
+#X obj 470 573 pddp/pddplink all_about_data_structures.pd -text all_about_data_structures
+;
+#X text 495 101 (aka [bng]);
+#X text 23 324 "anything" allows anything to pass through unchanged.
+It is not a data type tho.;
+#X text 14 163 "symbols" need to be declared explicitly. "floats" do
+not need to be declared explicitly \, but can be:;
+#X text 173 232 casting as a "symbol";
+#X text 21 529 CASTING AND STORAGE OBJECTS;
+#X text 411 487 FOR MORE INFO:;
+#X text 410 127 EXAMPLES OF CASTING;
+#X text 405 56 atom objects:;
+#X text 412 78 other data types:;
+#X text 11 440 "pointer";
+#X obj 44 480 trigger anything bang float list pointer symbol;
+#X obj 44 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 98 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 154 499 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 211 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 267 499 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 323 500 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 213 55 "float" \, "symbol" \, "pointer";
+#N canvas 0 22 505 381 float/list 0;
+#X msg 75 133 float 1 2 3;
+#X text 34 22 FLOAT CONVERSION;
+#X msg 95 187 list 1 2 3;
+#X text 92 164 A list with multiple elements remains a list.;
+#X text 43 59 A float with one element remains a float.;
+#X text 72 106 A float with multiple elements remains a float but is
+cut to one element.;
+#X text 99 218 A list with one float element is converted to a float.
+;
+#X obj 58 308 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 105 308 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 152 308 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X obj 200 308 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 248 308 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X obj 57 286 route bang float symbol list;
+#X obj 92 349 print FLOAT;
+#X msg 50 81 float 3;
+#X msg 106 239 list 2;
+#X obj 188 349 print LIST;
+#X connect 0 0 12 0;
+#X connect 2 0 12 0;
+#X connect 12 0 7 0;
+#X connect 12 1 8 0;
+#X connect 12 1 13 0;
+#X connect 12 2 9 0;
+#X connect 12 3 10 0;
+#X connect 12 3 16 0;
+#X connect 12 4 11 0;
+#X connect 14 0 12 0;
+#X connect 15 0 12 0;
+#X restore 445 506 pd float/list conversion;
+#N canvas 0 22 479 361 empty 0;
+#X obj 78 268 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 125 268 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 172 268 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X obj 220 268 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 268 268 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X msg 127 205 list;
+#X msg 50 75 float;
+#X msg 97 134 symbol;
+#X text 31 21 EMPTY DATA TYPES;
+#X obj 77 246 route bang float symbol list;
+#X obj 73 326 print FLOAT;
+#X obj 155 326 print SYMBOL;
+#X text 120 184 An empty list is converted to a bang;
+#X text 85 114 An empty "symbol" remains a empty "symbol".;
+#X text 46 55 An empty "float" remains a "float" and is initialized
+to 0;
+#X connect 5 0 9 0;
+#X connect 6 0 9 0;
+#X connect 7 0 9 0;
+#X connect 9 0 0 0;
+#X connect 9 1 1 0;
+#X connect 9 1 10 0;
+#X connect 9 2 2 0;
+#X connect 9 2 11 0;
+#X connect 9 3 3 0;
+#X connect 9 4 4 0;
+#X restore 636 506 pd empty data types;
+#X text 568 604 updated for Pd version 0.38.4;
+#X connect 3 0 4 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 4 0;
+#X connect 11 0 10 0;
+#X connect 12 0 10 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 31 0 34 0;
+#X connect 32 0 34 0;
+#X connect 34 0 33 0;
+#X connect 34 3 35 0;
+#X connect 36 0 34 0;
+#X connect 37 0 34 0;
+#X connect 40 0 44 0;
+#X connect 41 0 40 0;
+#X connect 41 0 43 0;
+#X connect 42 0 41 0;
+#X connect 72 0 73 0;
+#X connect 72 1 74 0;
+#X connect 72 2 75 0;
+#X connect 72 3 76 0;
+#X connect 72 4 77 0;
+#X connect 72 5 78 0;
+#X restore 290 119 pd old;
+#X obj 43 203 pddp/pddplink ../1.manual/x2.htm#s3.1;
+#X text 194 202 <- fix this;
+#N canvas 18 112 428 500 Predefined_and_implicit_messages_in_Pd 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Predefined messages in Pd;
+#X text 20 131 2) symbol message - the selector "symbol" \, followed
+by a single symbol atom.;
+#X obj 1 274 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 20 216 5) pointer message - the selector "pointer" \, followed
+by a pointer atom.;
+#X text 20 186 4) list - the selector "list" \, followed by two or
+more atoms of any type (these are the elements of the list).;
+#X text 20 166 3) bang message - the single selector "bang".;
+#X text 20 246 6) signal - an audio signal;
+#X text 7 274 Implicit float and list Messages;
+#X text 20 37 In Pd \, when an object receives a message to an inlet
+\, it looks at the selector to figure out what to do next. So that
+objects can easily communicate with one another \, Pd has several predefined
+messages:;
+#X text 20 344 1) A single float atom has an implicit "float" selector.
+;
+#X msg 41 370 1;
+#X msg 181 370 float 1;
+#X text 71 370 is the same as...;
+#X text 20 394 1) a message that starts with a float atom and is followed
+by one or more atoms has an implicit "list" selector. Thus "1 2 3"
+or "1 4 63" \, and even "1 foo fee four" are list messages.;
+#X text 81 460 is the same as...;
+#X msg 41 460 2 3 4;
+#X msg 191 460 list 2 3 4;
+#X text 20 97 1) float message - this message has the selector "float"
+\, followed by a single float atom like 12 \, -4 \, or 1.8.;
+#X text 20 309 Since numbers are used so often in Pd \, two shortcuts
+are provided to make it easier to type and read them:;
+#X restore 43 69 pd Predefined_and_implicit_messages_in_Pd;
diff --git a/doc/pddp/all_about_midi_flags.pd b/doc/pddp/all_about_midi_flags.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ffac219b41f5d3c0b49ee8b8ed10f82bc2e77287
--- /dev/null
+++ b/doc/pddp/all_about_midi_flags.pd
@@ -0,0 +1,94 @@
+#N canvas 0 0 448 643 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header midi_flags 20 10
+1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 40 79 pd -midiindev 1 -midioutdev 2;
+#X text 39 201 pd -mididev 1;
+#X text 19 223 This will use the first port for both MIDI input and
+output.;
+#X text 19 291 There is also a little bit of confusion about OSS midi
+(which uses the raw midi - /dev/midi* - devices by default) and ALSA
+(which is becoming very popular). ALSA uses /dev/snd/midiC*D* as their
+raw midi devices. The C* (* = some number) is the device number while
+D* (* = some number) is the port number. Normally the ALSA driver links
+its raw devices to the corresponding /dev/midi* automatically (i.e.:
+/dev/snd/midiC0d0 -> /dev/midi00 \, /dev/snd/midiC0D1 -> /dev/midi01
+etc).;
+#X text 19 411 MIDI objects in Pd (the ones that read and write to
+MIDI ports) take a MIDI channel as an argument. Channels 1-16 use the
+first MIDI device \, 17-32 use the second MIDI device and so on. For
+this to work one must specify which devices Pd is supposed to use:
+;
+#X text 38 478 -midiindev 1 \, 2 -- use devices 1 and 2 for input;
+#X text 38 493 -midioutdev 1 \, 2 -- use devices 1 and 2 for output
+;
+#X text 38 508 -mididev 1 \, 2 -- use devices 1 and 2 for input and
+output;
+#X text 19 526 NOTE (Windows): -listdev command line option lists all
+available MIDI and audio devices.;
+#X text 19 558 A couple more useful command line options (related to
+MIDI):;
+#X text 39 573 -nomidiin -- do not listen to any midi input;
+#X text 39 588 -nomidiout -- do not send any midi output;
+#X text 39 603 -nomidi -- do not use any MIDI;
+#X text 20 36 MIDI in Pd is handled through the 'raw' midi devices
+(such as /dev/midi*). Specify which MIDI port Pd is supposed to use
+through a command line switch when starting Pd \, i.e.:;
+#X text 19 101 The above will use the first MIDI device for MIDI input
+(it could be a MIDI controller such as a keyboard \, midi-guitar \,
+midi knob box \, etc.) and device #2 will be used for outputting the
+MIDI (re)generated or sent by Pd.;
+#X text 19 158 To use the same device for MIDI input AND output (e.g.
+\, a MIDI keyboard which is also a synthesizer) use the following command
+line switch:;
+#X text 19 238 NOTE (Linux): Pd counts the MIDI devices starting from
+one. Usually \, the operating system counts them starting with 0 (zero)
+so if you want to use /dev/midi00 \, start Pd with "-mididev 1". Always
+add 1 to the device number.;
+#X obj 1 621 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS MIDI;
+#X text 12 45 DESCRIPTION list of command line flags relating to MIDI
+;
+#X restore 392 623 pd META;
+#N canvas 10 196 428 342 Related_objects 0;
+#X obj 22 41 dbtopow~;
+#X obj 76 41 dbtorms~;
+#X obj 131 41 rmstodb~;
+#X obj 186 41 powtodb~;
+#X obj 241 41 mtof~;
+#X obj 278 41 ftom~;
+#X obj 22 68 expr;
+#X obj 57 68 expr~;
+#X obj 97 68 sig~;
+#X obj 131 68 snapshot~;
+#X text 19 98 [rmstopow~];
+#X text 99 98 [powtorms~];
+#X obj 22 169 db2v;
+#X obj 60 169 f2note;
+#X obj 108 169 t3_sig~;
+#X obj 164 169 m2f~;
+#X text 19 226 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 19 266 The best places to find information about Pd's libraries
+is:;
+#X text 20 286 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 20 301 or;
+#X text 19 316 iem.kug.ac.at/pdb/;
+#X text 18 198 [b2db];
+#X text 61 198 [tmtof];
+#X text 20 142 Externals;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 MIDI flags- Related Objects;
+#X restore 103 623 pd Related_objects;
+#X obj 6 623 pddp/pddplink all_about.pd -text All About Pd;
diff --git a/doc/pddp/all_about_pd_META.pd b/doc/pddp/all_about_pd_META.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e2599f64edd58939482bf629d5bcaad2ac388596
--- /dev/null
+++ b/doc/pddp/all_about_pd_META.pd
@@ -0,0 +1,77 @@
+#N canvas 0 0 448 227 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header pd_META 20 10 1
+18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 204 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 40 264 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION description of the pd META tags;
+#X restore 392 206 pd META;
+#N canvas 10 196 428 105 Related_objects 0;
+#X text 31 37 Hm...what to put here?;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Atoms- Related Objects;
+#X restore 103 206 pd Related_objects;
+#X obj 6 206 pddp/pddplink all_about.pd -text All About Pd;
+#N canvas 256 88 428 493 TAGS 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 pd META - TAGS;
+#X text 31 37 Each pd META entry is a comment that begins with a tag
+in uppercase \, followed by values for that tag.;
+#X text 31 232 LICENSE - the license used for the object (not relevant
+for tutorials or all_about_pd patches). Some common values are:;
+#X text 51 262 SIBSD: three-clause BSD license;
+#X text 51 282 GPL v2: GNU/GPL license version 2;
+#X text 51 302 GPL v3: GNU/GPL license version 3;
+#X text 31 327 DESCRIPTION - short (one-line) description of an object's
+behavior. May also be used for tutorials or all_about_pd patches to
+describe the concept being discussed.;
+#X obj 1 521 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -261106 -33289 0;
+#X text 7 522 TAGS for an object's inlets/outlets;
+#X text 31 557 Tags to show which messages are accepted by the inlets/outlets
+of an object. The tag starts with the word INLET or OUTLET \, followed
+by an underscore and a digit showing the xlet number:;
+#X text 31 640 There are two special designations:;
+#X text 31 617 INLET_0 - left-most inlet;
+#X text 31 660 INLET_N or OUTLET_N - variable number of xlets \, the
+exact number of which is determined by the creation arguments.;
+#X text 31 700 For objects with variable xlets \, the following may
+apply:;
+#X text 31 723 INLET_R or OUTLET_R - a right-most xlet which always
+has the same function regardless of the total number of xlets.;
+#X text 31 441 WEBSITE - website of the author or group that made the
+object/tutorial.;
+#X text 31 407 AUTHOR - multiple authors can be specified \, as well
+as additional text explaining each author's role.;
+#X text 31 763 The values may be float \, list \, bang \, symbol \,
+pointer \, anything \, as well as specific custom selectors such as
+set \, clear \, etc.;
+#X text 31 77 GENRE - describes what type of help patch this is. Possible
+values are: tutorial \, and all_about_pd (in-depth help for a pd concept).
+If GENRE is omitted \, the patch is assumed to be an object help patch.
+;
+#X text 31 137 NAME - name of the objects covered by a multi-object
+help patch. This tag may also be used for tutorials and all_about_pd
+patches to show the relevant object(s) being discussed.;
+#X text 31 197 ALIAS - for an object help patch \, any additional creator
+names for the object. For [trigger] \, this would be: ALIAS t;
+#X text 31 377 LIBRARY - name of the library to which the object belongs.
+If this is a libdir object \, this can be omitted.;
+#X text 31 476 HELP_PATCH_AUTHORS - the person or group who made/edited
+this help patch.;
+#X restore 22 147 pd TAGS;
+#X text 19 37 META keywords/tags are used to organize and categorize
+Pure Data documents so that they're easier to search. They follow the
+following syntax:;
+#X text 19 87 TAG keyword1 keyword2 keyword3;
+#X text 19 117 Currently used tags are detailed below:;
diff --git a/doc/pddp/all_about_route.pd b/doc/pddp/all_about_route.pd
new file mode 100755
index 0000000000000000000000000000000000000000..b4dcca5f1bfe30eb8ef0f54d6239daba5d1885fd
--- /dev/null
+++ b/doc/pddp/all_about_route.pd
@@ -0,0 +1,289 @@
+#N canvas 190 100 1023 661 10;
+#X obj 82 273 route 23 54 1;
+#X msg 170 239 54 43;
+#X msg 212 239 1 foo bar;
+#X obj 141 418 route big apple;
+#X msg 351 376 1 2 3;
+#X msg 248 376 big apple pie;
+#X msg 320 238 walk the dog;
+#X text 8 217 numeric arguments:;
+#X text 16 356 symbolic arguments:;
+#X msg 590 287 bang;
+#X msg 621 380 list;
+#X msg 622 413 list 5;
+#X msg 593 307 symbol pie;
+#X msg 596 327 pie;
+#X msg 584 248 1 2 3;
+#X obj 26 13 route;
+#X text 67 13 - route messages according to their first element;
+#X text 25 108 If a match is found \, and the message contains only
+ONE element \, then a bang is sent out the corresponding outlet. If
+a match if found \, and the message contains multiple elements (a list)
+\, then all the list elements except the first element is sent out
+the corresponding outlet. If no match is found \, then the entire message
+is sent out the right-most outlet - the "rejection" outlet. The number
+of outlets is the number of arguments plus one.;
+#X msg 18 239 23 345 456;
+#X msg 96 239 420 34 45;
+#X msg 32 376 apple pie;
+#X msg 105 376 impeach ringo starr;
+#X text 34 490 In this case \, the data type 'symbol' is implied by
+the creation arguments and therefore this [route] object will match
+symbols only. Symbolic messages that do not match any of the arguments
+\, and all numbers \, will be output through the right-most outlet.
+;
+#X text 565 21 If necessary \, messages of different data types can
+be matched by the [route] object if the data type is explictly defined
+in the creation arguments.;
+#X text 564 71 In the example below \, instead of matching the 'value'
+of a message \, the [route] object will match 'data type': i.e. lists
+will be sent through the first outlet \, floats will be sent through
+the second outlet \, symbols through the third outlet \, bangs through
+the fourth outlet. The fifth outlet will then output anything that
+does not match one of the previously defined data types (i.e. the "pie"
+message below is a text message that hasn't been defined as a 'symbol'
+- hence \, Pd cannot determine which data type it is and it will be
+output through the right-most outlet).;
+#X text 608 208 a float;
+#X text 632 247 a list (of floats);
+#X text 627 287 a bang;
+#X text 672 307 a symbol;
+#X text 630 328 none of the above!;
+#X text 702 268 a list of symbols;
+#X text 599 349 SPECIAL CASES OF LISTS.;
+#X text 17 583 RELATED OBJECTS;
+#X obj 21 604 select;
+#X obj 68 604 trigger;
+#X obj 122 604 moses;
+#X text 26 36 Route checks the first element of a message against each
+of its creation arguments \, which may be numbers or symbols (but not
+a mixture of the two unless the data types are defined explicitly)
+\, then sends the messages through the appropriate outlets.;
+#N canvas 0 22 466 316 related_objects_from_other_libraries 0;
+#X obj 26 33 segregate;
+#X obj 104 34 multiselect;
+#X text 18 86 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 17 135 The best places to find information about Pd's libraries
+is:;
+#X text 14 157 www.pure-data.org and click on "Downloads" then "Software"
+;
+#X text 15 173 or;
+#X text 16 187 iem.kug.ac.at/pdb/;
+#X obj 193 34 demux;
+#X obj 245 34 gate;
+#X restore 21 627 pd related_objects_from_other_libraries;
+#X floatatom 625 498 5 0 0 0 - - -;
+#X symbolatom 673 497 10 0 0 0 - - -;
+#X obj 578 518 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X msg 622 450 list not-a-list;
+#X msg 578 208 89;
+#X msg 581 228 float 7;
+#X obj 578 474 route bang float symbol list;
+#X obj 625 518 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 673 518 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 721 518 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 769 518 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X msg 587 268 list moon earth;
+#X text 636 228 definitely a float!;
+#X text 620 366 An empty list is translated into a bang;
+#X text 620 399 A list with only one float is translated to a float
+;
+#X text 620 435 A list with only one symbol is translated to a symbol
+;
+#X obj 141 439 bng 15 250 50 0 empty empty big -4 23 1 12 -262144 -1
+-1;
+#X obj 189 439 bng 15 250 50 0 empty empty apple -7 23 1 12 -262144
+-1 -1;
+#X obj 237 439 bng 15 250 50 0 empty empty everything_else -2 23 1
+12 -262144 -1 -1;
+#X obj 129 469 print x1;
+#X obj 189 469 print x2;
+#X obj 249 469 print x3;
+#X text 565 555 [trigger]-style shortcuts don't work:;
+#X text 678 574 !=;
+#X obj 579 575 route b f s l;
+#X obj 700 575 route bang float symbol list;
+#X obj 7 331 print x23;
+#X obj 75 331 print x54;
+#X obj 143 331 print x1;
+#X obj 204 331 print other;
+#X obj 82 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 109 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 137 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 161 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 176 265 In this case \, the creation arguments are all numbers
+and [route] will therefore assume that it should attempt to match messages
+that are data type "float". All messages that are not numbers will
+be output through the right-most outlet.;
+#N canvas 0 22 466 633 routing_data_types 0;
+#X obj 334 314 route symbol;
+#X obj 336 334 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 413 335 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 331 361 route symbol;
+#X obj 333 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 410 382 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 318 269 test;
+#X msg 357 269 symbol test;
+#X obj 58 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 135 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 55 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 132 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 89 266 bang;
+#X obj 56 311 route bang;
+#X obj 53 358 route bang;
+#X text 14 5 routing based on reserved words:;
+#X obj 188 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 265 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 185 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 262 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 186 311 route float;
+#X obj 183 358 route float;
+#X msg 170 266 1;
+#X msg 209 266 float 12;
+#X obj 181 542 route list;
+#X obj 181 561 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 249 562 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 168 580 route list;
+#X obj 168 599 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 236 600 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 184 493 list 1 two 3;
+#X msg 167 473 1 two 3;
+#X msg 200 513 list one 2 three;
+#X msg 365 289 symbol;
+#X msg 113 484 list;
+#X msg 224 287 float test;
+#X text 26 245 These all output the as same atom type that is routed:
+;
+#X msg 15 266 bang test;
+#X obj 71 131 route 1;
+#X msg 71 183 2 3 4;
+#X obj 71 164 prepend set;
+#X msg 71 100 1 2 3 4;
+#X msg 218 183 is not a list;
+#X obj 218 164 prepend set;
+#X obj 218 131 route this;
+#X msg 218 100 this is not a list;
+#X text 21 50 [route] has three modes \, first is float \, second is
+symbol \, and third is data type. In the first two modes \, the first
+element of the set is stripped off by [route].;
+#X text 26 206 In the third mode \, [route] outputs the same atom type
+(bang->bang \, float->float \, symbol->symbol).;
+#X text 26 419 Lists do not behave the same with [route list] even
+though it is interpreting incoming lists \, not just routing by keyword
+\, as in the second symbol mode.;
+#X msg 174 164 set;
+#X text 157 164 re;
+#X text 164 24 "bang" \, "float" \, "symbol" \, and "list";
+#X connect 0 0 1 0;
+#X connect 0 0 3 0;
+#X connect 0 1 2 0;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 12 0 13 0;
+#X connect 13 0 8 0;
+#X connect 13 0 14 0;
+#X connect 13 1 9 0;
+#X connect 14 0 10 0;
+#X connect 14 1 11 0;
+#X connect 20 0 16 0;
+#X connect 20 0 21 0;
+#X connect 20 1 17 0;
+#X connect 21 0 18 0;
+#X connect 21 1 19 0;
+#X connect 22 0 20 0;
+#X connect 23 0 20 0;
+#X connect 24 0 25 0;
+#X connect 24 0 27 0;
+#X connect 24 1 26 0;
+#X connect 27 0 28 0;
+#X connect 27 1 29 0;
+#X connect 30 0 24 0;
+#X connect 31 0 24 0;
+#X connect 32 0 24 0;
+#X connect 33 0 0 0;
+#X connect 34 0 24 0;
+#X connect 35 0 20 0;
+#X connect 37 0 13 0;
+#X connect 38 0 40 0;
+#X connect 40 0 39 0;
+#X connect 41 0 38 0;
+#X connect 43 0 42 0;
+#X connect 44 0 43 0;
+#X connect 45 0 44 0;
+#X connect 49 0 42 0;
+#X connect 49 0 39 0;
+#X restore 838 496 pd routing_data_types;
+#X text 580 601 This document was updated for Pd version 0.38.4 by
+Dave Sabine and Hans-Christoph Steiner as part of a project called
+pddp proposed by Krzysztof Czaja to build comprehensive documentation
+for Pd.;
+#X text 832 475 More info:;
+#X connect 0 0 64 0;
+#X connect 0 0 68 0;
+#X connect 0 1 65 0;
+#X connect 0 1 69 0;
+#X connect 0 2 66 0;
+#X connect 0 2 70 0;
+#X connect 0 3 67 0;
+#X connect 0 3 71 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 54 0;
+#X connect 3 0 57 0;
+#X connect 3 1 55 0;
+#X connect 3 1 58 0;
+#X connect 3 2 56 0;
+#X connect 3 2 59 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 0 0;
+#X connect 9 0 44 0;
+#X connect 10 0 44 0;
+#X connect 11 0 44 0;
+#X connect 12 0 44 0;
+#X connect 13 0 44 0;
+#X connect 14 0 44 0;
+#X connect 18 0 0 0;
+#X connect 19 0 0 0;
+#X connect 20 0 3 0;
+#X connect 21 0 3 0;
+#X connect 38 0 45 0;
+#X connect 39 0 46 0;
+#X connect 41 0 44 0;
+#X connect 42 0 44 0;
+#X connect 43 0 44 0;
+#X connect 44 0 40 0;
+#X connect 44 1 38 0;
+#X connect 44 2 39 0;
+#X connect 44 3 47 0;
+#X connect 44 4 48 0;
+#X connect 49 0 44 0;
diff --git a/doc/pddp/all_about_scope_and_locality.pd b/doc/pddp/all_about_scope_and_locality.pd
new file mode 100644
index 0000000000000000000000000000000000000000..202bbf38344ee728aeb99dce0e8a3934b12c5bb1
--- /dev/null
+++ b/doc/pddp/all_about_scope_and_locality.pd
@@ -0,0 +1,188 @@
+#N canvas 0 0 448 395 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header scope_and_locality
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 20 36 Depending on the complexity of your patches \, you may
+need to control whether or not messages will be used by only ONE patch
+\, or throughout all open patches. The scope of a message is considered
+either 'local' or 'global'.;
+#N canvas 16 214 428 369 Global_scope 0;
+#N canvas 1 1 254 169 example_a 0;
+#X obj 18 19 r foo;
+#X floatatom 18 44 5 0 0 0 - - -;
+#X obj 18 96 r a-foo;
+#X floatatom 18 116 5 0 0 0 - - -;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X restore 14 56 pd example_a;
+#N canvas 121 2 256 168 example_b 0;
+#X obj 18 19 r foo;
+#X floatatom 18 44 5 0 0 0 - - -;
+#X obj 18 96 r a-foo;
+#X floatatom 18 116 5 0 0 0 - - -;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X restore 14 81 pd example_b;
+#N canvas 215 2 263 169 example_c 0;
+#X obj 18 19 r foo;
+#X floatatom 18 44 5 0 0 0 - - -;
+#X obj 18 96 r a-foo;
+#X floatatom 18 116 5 0 0 0 - - -;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X restore 14 106 pd example_c;
+#X text 17 38 Open these subpatches.;
+#X obj 23 187 s foo;
+#X floatatom 23 166 5 0 0 0 - - -;
+#X text 13 125 Click-n-drag these number boxes and notice the appropriate
+receive objects in each open sub-patch.;
+#X floatatom 82 166 5 0 0 0 - - -;
+#X floatatom 159 166 5 0 0 0 - - -;
+#X floatatom 232 166 5 0 0 0 - - -;
+#X obj 82 187 s a-foo;
+#X obj 159 187 s b-foo;
+#X obj 232 187 s c-foo;
+#X text 18 23 GLOBAL SCOPE - send and receive messages in ALL OPEN
+PATCHES;
+#X text 15 217 Send objects simply post their information to the cyberspace
+within your computer (that's one way to look at it!) Receive objects
+simply keep their ears open for all messages floating through that
+cyberspace from send objects of the same name! Hence \, if you name
+a [send] something like "foo" \, then all [receive] objects in open
+patches named "foo" will 'hear' those messages. Also note that the
+term 'open patches' includes all sub-patches \, abstractions and patches
+that are currently open in Pd - they don't have to be VISIBLE...they
+only have to be active.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 20 10
+1 18 -261106 -33289 0;
+#X text 7 1 Global Scope;
+#X connect 5 0 4 0;
+#X connect 7 0 10 0;
+#X connect 8 0 11 0;
+#X connect 9 0 12 0;
+#X restore 23 94 pd Global_scope;
+#N canvas 146 22 618 662 Local_scope 0;
+#X text 4 9 LOCAL SCOPE -send and receive messages within a SINGLE
+PATCH;
+#X text 13 37 There are many cases where you may want messages to be
+sent within a single patch. For example \, you might have designed
+many modules with a receive object called [r number] but you want that
+'number' to be passed to only the objects within a single module so
+that they don't effect the performance of the other modules.;
+#X obj 84 222 r \$1;
+#X obj 18 245 s \$1;
+#X floatatom 18 221 5 0 0 0 - - -;
+#X floatatom 84 248 5 0 0 0 - - -;
+#X floatatom 189 224 5 0 0 0 - - -;
+#X floatatom 278 250 5 0 0 0 - - -;
+#X obj 278 224 r \$1-foo;
+#X obj 189 248 s \$1-foo;
+#X floatatom 367 224 5 0 0 0 - - -;
+#X floatatom 456 250 5 0 0 0 - - -;
+#X text 62 513 LOCAL_SCOPE (and inheritance);
+#X obj 456 224 r \$2-dave;
+#X obj 367 248 s \$2-dave;
+#X text 14 541 The words "and" and "inheritance" are arguments that
+I used when I created the abstraction called "all_about_scope_and_locality".
+These two agruments are now available in this patch by using \$1 or
+\$2 variables. There's more information about this in the section called
+'Inheritance'.;
+#X text 13 267 In the examples above I have used a variable (\$1) to
+name these [send] and [receive] objects. The value of this variable
+is assigned either by Pd (randomly for each abstraction or patch) \,
+or by me with the use of arguments.;
+#X text 11 335 If you would like Pd to assign the value of your local
+variable at random \, use \$0. This will ensure that your local variables
+will always be 'local' and won't ever correspond with variables in
+other open patches or abstractions.;
+#X text 12 138 In these cases \, you should use "local variables" ...as
+in [r \$0-number] to name your send and receive objects. Local variables
+are assigned using dollar signs and numbers. There is more documentation
+about this in 2.control.examples/locality.pd;
+#X text 13 424 If you want to define the value of the local variables
+\, you can use 'arguments' when you create the abstraction and then
+refer to those arguments by using \$1 (for the first agrument) or \$2
+(for the second) and so on. Notice in the 'title' of this patch \,
+you should see:;
+#X connect 2 0 5 0;
+#X connect 4 0 3 0;
+#X connect 6 0 9 0;
+#X connect 8 0 7 0;
+#X connect 10 0 14 0;
+#X connect 13 0 11 0;
+#X restore 23 119 pd Local_scope;
+#N canvas 145 31 610 615 Inheritance 0;
+#X text 20 18 The word "Inherit" means to "receive a characteristic
+from one's parent".;
+#X text 19 59 In Pd \, all abstracions and subpatches have 'parents'
+-- the parent is the main patch which created the instance of the abstraction
+or subpatch.;
+#X text 18 117 We can use 'arguments' when creating an abstraction
+in a patch to send values to those 'children'. For example \, this
+help document contains a number of different subpatches and abstractions.
+One abstraction is called "all_about_scope_and_locality" -- you are
+currently reading a subpatch in that abstraction. When I created that
+abstraction in the parent patch \, I defined two arguments: "and" and
+"inheritance". So \, those two values are now available throughout
+this abstraction and all of its subpatches!;
+#X obj 49 327 symbol \$1;
+#X symbolatom 49 356 0 0 0 0 - - -;
+#X obj 49 305 bng 15 250 50 0 empty empty click_here_to_see 0 -6 0
+8 -262144 -1 -1;
+#X symbolatom 146 356 0 0 0 0 - - -;
+#X obj 146 327 symbol \$2;
+#X text 24 388 So \, if a [send] object is named "\$1-foo" or "\$2-foo"
+inside this abstraction \, Pd identifies that [send] object as "and-foo"
+or "inheritance-foo".;
+#X obj 47 466 s and-foo;
+#X obj 47 516 s \$1-foo;
+#X obj 47 445 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 47 493 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 163 495 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 163 462 r and-foo;
+#X obj 280 443 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 280 491 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 431 497 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 280 464 s inheritance-foo;
+#X obj 431 464 r inheritance-foo;
+#X obj 280 514 s \$2-foo;
+#X connect 3 0 4 0;
+#X connect 5 0 3 0;
+#X connect 5 0 7 0;
+#X connect 7 0 6 0;
+#X connect 11 0 9 0;
+#X connect 12 0 10 0;
+#X connect 14 0 13 0;
+#X connect 15 0 18 0;
+#X connect 16 0 20 0;
+#X connect 19 0 17 0;
+#X restore 23 144 pd Inheritance;
+#X text 115 119 <- confusing \, clean it up;
+#X obj 1 373 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS nonlocal needs_work;
+#X text 12 45 DESCRIPTION notions of scope in Pd;
+#X restore 392 375 pd META;
+#N canvas 11 243 428 121 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Scope and Locality- Related Objects;
+#X restore 103 375 pd Related_objects;
+#X obj 6 375 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 59 349 pddp/pddplink ../2.control.examples/14.dollarsigns.pd
+-text doc/2.control.examples/14.dollarsigns.pd;
+#X obj 59 334 pddp/pddplink all_about_dollarsign_zero.pd;
+#X text 52 209 This help file is unfinished.;
diff --git a/doc/pddp/all_about_send_n_receive.pd b/doc/pddp/all_about_send_n_receive.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7198c20068f321ba24a1c3eaded86f4e0935b52c
--- /dev/null
+++ b/doc/pddp/all_about_send_n_receive.pd
@@ -0,0 +1,153 @@
+#N canvas 0 0 448 523 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header send_and_receive
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 501 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS nonlocal;
+#X text 12 25 NAME send receive vsl hsl vradio hradio;
+#X text 12 65 DESCRIPTION additional information for send and receive
+;
+#X restore 392 503 pd META;
+#N canvas 14 368 428 126 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X obj 22 42 pddp/helplink cyclone/universal;
+#X text 7 2 send and receive - Related objects;
+#X obj 22 62 pddp/helplink ext13/send13;
+#X obj 22 82 pddp/helplink ext13/receive13;
+#X obj 21 23 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 21 23 pddp/pddplink all_about_externals.pd -text Externals;
+#X restore 103 503 pd Related_objects;
+#X obj 6 503 pddp/pddplink all_about.pd -text All About Pd;
+#X text 19 27 The [send] and [receive] objects are useful for linking
+objects and subroutines together in a single canvas or throughout multiple
+patches. Understanding these objects will help 'clean up' your patches
+and allow you to communicate messages between various modules that
+you build or between objects where patch cords are not possible.;
+#X text 18 162 In the [send] and [receive] help files \, you will see
+message sent within a single patch - from a [send] object to a [receive]
+object in the same patch. But the functionality of these objects goes
+far beyond the scope of a single patch.;
+#X floatatom 42 110 5 0 0 0 - - -;
+#X floatatom 96 136 5 0 0 0 - - -;
+#X obj 42 136 s aNum;
+#X obj 96 110 r aNum;
+#X obj 170 135 s aSymbol;
+#X msg 170 110 symbol hello;
+#X obj 267 110 r aSymbol;
+#X symbolatom 267 137 10 0 0 0 - - -;
+#X obj 16 262 send one_send;
+#X obj 16 306 receive one_send;
+#X obj 19 244 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 3800 0;
+#X obj 153 262 send one_send;
+#X obj 156 244 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 1200 0;
+#X obj 291 262 send one_send;
+#X obj 294 244 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 3200 0;
+#X obj 19 327 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 3200 1;
+#X obj 153 306 receive one_send;
+#X obj 156 327 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 3200 1;
+#X obj 291 306 receive one_send;
+#X obj 294 327 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 3200 1;
+#X text 17 289 All [receive]s of the same name will receive the "messages":
+;
+#X text 17 224 You can have multiple [send]s with the same name:;
+#N canvas 7 324 428 153 scope_and_inheritance 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Send and receive - scope and inheritance;
+#X obj 85 107 pddp/pddplink all_about_scope_and_locality.pd;
+#X text 20 107 See also:;
+#X text 19 36 However \, controlling the 'scope' of a [send] or [receive]
+object is important if you want to ensure that a message is only transmitted
+within a single patch \, or within a single abstraction. Check out
+the following information about 'scope' and 'locality'.;
+#X restore 21 483 pd scope_and_inheritance;
+#N canvas 0 123 684 434 special-send-and-receives 0;
+#X text 19 10 SPECIAL OBJECTS;
+#X obj 28 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 28 66 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 28 91 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 0 256;
+#X obj 28 117 vsl 15 128 0 127 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 21 386 hdl 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X obj 162 119 vdl 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X obj 24 343 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 59 208 vu 15 120 empty empty -1 -8 0 8 -66577 -1 1 0;
+#X obj 135 20 cnv 15 100 60 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 46 40 bng;
+#X text 46 65 toggle;
+#X text 85 89 number 2;
+#X text 45 167 Vertical Slider;
+#X text 177 166 Vertical Dial;
+#X text 40 356 Horizontal Slider;
+#X text 42 401 Horizontal Dial;
+#X text 101 260 VU Meter;
+#X text 162 39 canvas;
+#X text 256 55 The objects in this patch \, and likely many more which
+I have not included \, include their own send and receive functionality.
+This functionality can be accessed by right-clicking on the object
+and choosing "Properties" from the menu that appears.;
+#X text 269 149 EXAMPLE;
+#X text 283 170 In other words \, these objects can send and/or receive
+messages without attaching a separate [send] or [receive] object to
+them with a patch cord.;
+#X text 230 242 THE OL'FASHION WAY;
+#X floatatom 236 266 5 0 0 0 - - -;
+#X floatatom 290 293 5 0 0 0 - - -;
+#X obj 236 290 s a;
+#X obj 290 265 r a;
+#X text 230 325 USING THESE OBJECTS' INTERNAL SEND AND RECEIVE FUNCTIONALITY
+;
+#X text 335 269 As you see here \, these number boxes are linked together
+with send and receives objects.;
+#X obj 241 347 nbx 5 14 -1e+37 1e+37 0 0 b empty empty 0 -6 0 10 -262144
+-1 -1 0 256;
+#X obj 303 347 nbx 5 14 -1e+37 1e+37 0 0 empty b empty 0 -6 0 10 -262144
+-1 -1 0 256;
+#X text 250 370 These number boxes are linked together via their 'send'
+or 'receive' property.;
+#X text 258 8 Some objects in Pd contain their own internal send and
+receive functionality.;
+#X connect 23 0 25 0;
+#X connect 26 0 24 0;
+#X restore 204 483 pd special-send-and-receives;
+#X text 18 348 A [send] object is a bit like a radio station-- it broadcasts
+information throughout Pd for all the [receive]s to hear! A [receive]
+object is a little like your own AM/FM tuner-- it will receive messages
+from all the [send] objects that it is 'tuned' to. Hence \, naming
+your [send] and [receive] objects becomes very important. A [receive]
+object named "dave" (as in [receive dave]) will pick up all messages
+from [send dave] \, regardless of which patch it is in. Thus \, you
+can get messages across multiple patches \, or into abstractions or
+subpatches \, without patch cords.;
+#X connect 8 0 10 0;
+#X connect 11 0 9 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X connect 17 0 23 0;
+#X connect 18 0 16 0;
+#X connect 20 0 19 0;
+#X connect 22 0 21 0;
+#X connect 24 0 25 0;
+#X connect 26 0 27 0;
diff --git a/doc/pddp/all_about_submitting_bugs.pd b/doc/pddp/all_about_submitting_bugs.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6c6d64dfec733a0d67f00fe39871bfd7150b32cd
--- /dev/null
+++ b/doc/pddp/all_about_submitting_bugs.pd
@@ -0,0 +1,38 @@
+#N canvas 0 0 448 245 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header submitting_bugs
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 223 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION prerequisites for submitting a bug on Sourceforge
+;
+#X restore 392 225 pd META;
+#N canvas 11 113 428 117 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 All About Submitting Bugs- Related Objects;
+#X obj 22 42 print;
+#X text 19 70 Also \, have a look in the "Find" Menu for the entry
+"Find last error.";
+#X restore 103 225 pd Related_objects;
+#X obj 6 225 pddp/pddplink all_about.pd -text All About Pd;
+#X text 20 62 1) Make sure you can reproduce the bug consistently.
+Include a brief example patch to demonstrate the bug \, using the minimum
+number of objects needed to reproduce it.;
+#X obj 83 194 pddplink http://sourceforge.net/tracker/?func=add&group_id=55736&atid=478070
+-text Beam me up to the Sourceforge bug tracker...;
+#X text 20 32 0) Search the Sourceforge bug tracker to make sure the
+bug hasn't already been reported (click "Browse" to search).;
+#X text 20 106 2) Make a note of the operating system (and OS version)
+you are using \, as well as any hardware that might be relevant to
+the bug (sound card \, camera \, etc).;
+#X text 20 149 3) Specify the version of Pd you are using. You can
+find it under the "Help" menu by choosing "About Pd".;
diff --git a/doc/pddp/all_about_symbol_construction.pd b/doc/pddp/all_about_symbol_construction.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c11e550e8a0c2b19e223e75c4e18c4145f213943
--- /dev/null
+++ b/doc/pddp/all_about_symbol_construction.pd
@@ -0,0 +1,56 @@
+#N canvas 0 0 448 503 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header symbol_construction
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X text 20 36 Many times you need to dynamically create different symbols.
+For example \, if you are working with many files \, you might want
+to name them with a sequential number.;
+#X text 20 75 Below are some of the most common ways to build a symbol
+from various parts. Additionally \, there are externals which can perform
+more advanced functions \, which are listed below.;
+#X text 20 127 1) Using the [makefilename] object;
+#X floatatom 41 149 5 0 0 0 - - -;
+#X symbolatom 41 192 10 0 0 0 - - -;
+#X obj 41 170 makefilename file%d.wav;
+#X text 193 170 see help patch for more details;
+#X text 20 219 2) Using variable-substitution in a message box;
+#X symbolatom 41 351 12 0 0 0 - - -;
+#X msg 41 328 symbol \$1-\$2.wav;
+#X obj 41 306 pack;
+#X floatatom 41 241 5 1 12 1 month - -;
+#X floatatom 62 262 5 2000 2020 1 year - -;
+#X obj 62 283 t b a;
+#X text 20 379 3) Using externals;
+#X obj 1 481 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 105 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 45 KEYWORDS conversion;
+#X text 12 25 NAME makefilename gatom;
+#X text 12 65 DESCRIPTION how to handle symbols in Pd;
+#X restore 392 483 pd META;
+#N canvas 14 368 428 126 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Symbol Construction- Related Objects;
+#X obj 22 43 makefilename;
+#X msg 114 44;
+#X restore 103 483 pd Related_objects;
+#X obj 6 483 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 38 399 pddp/helplink zexy/list2symbol;
+#X obj 38 419 pddp/helplink cyclone/sprintf;
+#X obj 38 459 pddp/helplink zexy/makesymbol;
+#X obj 38 439 pddp/helplink cyclone/tosymbol;
+#X connect 5 0 7 0;
+#X connect 7 0 6 0;
+#X connect 11 0 10 0;
+#X connect 12 0 11 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X connect 15 0 12 0;
+#X connect 15 1 12 1;
diff --git a/doc/pddp/all_about_writing_help_patches.pd b/doc/pddp/all_about_writing_help_patches.pd
new file mode 100644
index 0000000000000000000000000000000000000000..16d69cce1ab0f2151eb4c99770abbd180cfa8c51
--- /dev/null
+++ b/doc/pddp/all_about_writing_help_patches.pd
@@ -0,0 +1,42 @@
+#N canvas 0 0 448 238 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header writing_help_patches
+20 10 1 18 -261106 -33289 0;
+#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 1 216 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 85 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS needs_work;
+#X text 12 45 DESCRIPTION guidelines for writing help patches;
+#X restore 392 218 pd META;
+#N canvas 10 196 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Writing Help Patches- Related Objects;
+#X obj 20 37 pddp/helplink pddp/pddplink;
+#X obj 20 57 pddp/helplink pddp/helplink;
+#X text 109 37 - link to other patches \, web pages \, or text files
+;
+#X text 109 57 - link to other objects' help patches;
+#X restore 103 218 pd Related_objects;
+#X obj 6 218 pddp/pddplink all_about.pd -text All About Pd;
+#X text 380 121 * pddplink and helplink;
+#X text 380 100 * pd META;
+#X text 383 145 This help file is unfinished.;
+#X text 19 36 Legitimate Authorities;
+#X text 19 36 ______________________;
+#X text 18 151 2) Include a short example patch. Justification: it's
+the whole reason to make help files be Pd patches!;
+#X text 18 56 1) For object help patches \, do not automatically turn
+on audio when the patch opens. Justification: there is no way to detect
+how the help patch audio will interact with whatever the user is already
+doing (such as opening several help patches simultaneously). Since
+unexpected audio signals can damage equipment (and ears) it is best
+to let the user turn on audio at his/her leisure.;
+#X text 18 181 You can use pddp/helplink and pddp/pddplink. See the
+"Related_objects" subpatch below for more info:;
diff --git a/doc/pddp/all_about_z_order.pd b/doc/pddp/all_about_z_order.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3d9272c99f5cf4d085da1d4e61a766c5ebf5c9b8
--- /dev/null
+++ b/doc/pddp/all_about_z_order.pd
@@ -0,0 +1,30 @@
+#N canvas 0 0 448 189 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header z_order 20 10 1
+18 -261106 -33289 0;
+#X obj 1 167 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -233017 -33289 0;
+#N canvas 44 246 494 344 META 0;
+#X text 12 95 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 75 LIBRARY PDDP;
+#X text 12 5 GENRE all_about_pd;
+#X text 12 25 KEYWORDS GUI needs_work;
+#X text 12 45 DESCRIPTION description of how objects are presented
+graphically in Pd;
+#X restore 392 169 pd META;
+#N canvas 10 196 428 107 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -261106 -33289 0;
+#X text 7 2 Z Order- Related Objects;
+#X restore 103 169 pd Related_objects;
+#X obj 6 169 pddp/pddplink all_about.pd -text All About Pd;
+#X obj 255 89 cnv 15 100 60 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 78 107 This comment was created after the grey [cnv] behind
+it. If you cut and paste the canvas (or delete it then choose "Undo"
+from the "Edit" menu) \, it will cover this comment.;
+#X text 19 36 Z-order refers to the way in which overlapping objects
+are displayed. Pd currently determines z-ordering in the following
+way: The last object created will get put in front.;
+#X obj 417 2 pddp/pddplink Nmop~3pIsdn~tno9V~llV.pd -text dppd;
diff --git a/doc/pddp/append-help.pd b/doc/pddp/append-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d70480f101b80aed275cb5adba44988730980b1a
--- /dev/null
+++ b/doc/pddp/append-help.pd
@@ -0,0 +1,116 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header append 3 12 0 18
+-204280 -1 0;
+#X obj 0 226 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 56 334 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Updated for Pd version 0.4. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control data_structure;
+#X text 12 105 INLET_R pointer;
+#X text 12 125 OUTLET_0 pointer;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_N float;
+#X text 12 205 RELEASE_DATE 1997;
+#X text 12 45 DESCRIPTION add a scalar to a canvas;
+#X restore 500 597 pd META;
+#X obj 0 392 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 436 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 527 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 319 cnv 17 3 35 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 235 cnv 17 3 78 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 319 float;
+#N canvas 62 491 428 101 Related_objects 0;
+#X obj 14 38 get;
+#X obj 46 38 set;
+#X obj 136 38 getsize;
+#X obj 193 38 setsize;
+#X obj 121 63 element;
+#X obj 13 64 sublist;
+#X obj 79 38 pointer;
+#X obj 69 63 struct;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [append] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 484 3 append;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/append -text
+pdpedia: append;
+#N canvas 116 162 428 109 help-append-template1 0;
+#X obj 22 69 filledpolygon z z 0 0 0 20 0 20 30 0 30;
+#X obj 22 42 struct help-append-template1 float x float y float z;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [append] Template for "help-append-template1";
+#X restore 372 196 pd help-append-template1;
+#N canvas 554 168 428 207 help-append-data 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [append] Data Window;
+#X restore 372 174 pd help-append-data;
+#X obj 281 104 pointer;
+#X msg 281 80 traverse pd-help-append-data \, bang;
+#X obj 80 152 append help-append-template1 x y z;
+#X floatatom 80 95 5 26 400 0 - - -;
+#X obj 80 115 t f f;
+#X msg 372 138 \; pd-help-append-data clear;
+#X text 98 234 float;
+#X text 98 264 list;
+#X obj 78 401 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 401 pointer;
+#X obj 78 360 cnv 17 3 27 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#X text 98 360 pointer;
+#X text 98 531 You may append objects of different templates using
+different [append] objects.;
+#X text 168 360 - the final inlet takes a pointer to a scalar (or to
+the head of a list).;
+#X text 168 234 - a float to the left inlet initializes the field(s)
+of a scalar and appends the scalar to a glist.;
+#X text 168 264 - a list to the first inlet is distributed among the
+inlets of [append]. In the example above \, you can use the message
+box to assign the values "5" \, "6" \, and "7" to fields "x" \, "y"
+\, and "z" \, respectively.;
+#X text 168 319 - an additional inlet is created for each field specified
+by the creation arguments. A float sent to one of these inlets will
+be stored for later use.;
+#X text 168 401 - after [append] receives a value at its left inlet
+\, it outputs a pointer to the new scalar that has been created.;
+#X text 15 74 2) ...then here;
+#X text 224 174 3) result is in here ->;
+#X text 279 56 1) go to (and output) "head" of the list;
+#X text 168 482 - all subsequent arguments are names of fields to initialize.
+At least one field must be specified in order to append a new scalar.
+;
+#X text 80 455 1) symbol atom;
+#X text 80 482 n) symbol atom;
+#X text 168 455 - a [struct] name that specifies the template of a
+new scalar to append.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 572 pddp/pddplink ../4.data.structures/04.append.pd -text
+doc/4.data.structures/04.append.pd;
+#X obj 98 557 pddp/pddplink all_about_z_order.pd;
+#X obj 325 557 pddp/pddplink scalar-help.pd;
+#X text 11 23 add a scalar to a canvas;
+#X msg 18 95 10 75 2;
+#X connect 15 0 17 3;
+#X connect 16 0 15 0;
+#X connect 18 0 19 0;
+#X connect 19 0 17 0;
+#X connect 19 1 17 1;
+#X connect 19 1 17 2;
+#X connect 45 0 17 0;
diff --git a/doc/pddp/array-help.pd b/doc/pddp/array-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..448cc85c76fe3fd44f5d8549de48d42820e2728e
--- /dev/null
+++ b/doc/pddp/array-help.pd
@@ -0,0 +1,146 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (array) 3 12 0 18
+-204280 -1 0;
+#X obj 0 235 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 65 LIBRARY internal;
+#X text 12 105 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 85 AUTHOR Miller Puckette;
+#X text 12 145 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS signal GUI storage array;
+#X text 12 45 DESCRIPTION graphical array from the "Put" menu;
+#X text 12 125 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 261 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 288 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 456 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 (array) Related Objects;
+#X obj 21 43 table;
+#X restore 102 598 pd Related_objects;
+#X text 80 375 1) symbol atom;
+#X text 98 238 (none);
+#X text 98 264 (none);
+#X text 80 390 2) float;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array garray 100 float 3;
+#A 0 -0.425444 -0.481432 -0.535517 -0.587484 -0.637133 -0.684269 -0.728706
+-0.770268 -0.808792 -0.844127 -0.876131 -0.904665 -0.92963 -0.950928
+-0.968475 -0.982202 -0.992055 -0.997994 -0.999998 -0.998043 -0.992148
+-0.982339 -0.968655 -0.95115 -0.929894 -0.90497 -0.876476 -0.844518
+-0.80922 -0.770731 -0.729202 -0.684796 -0.63769 -0.588068 -0.536126
+-0.482068 -0.4261 -0.368453 -0.309353 -0.249032 -0.18773 -0.125687
+-0.0631471 -0.000357709 0.0624333 0.124977 0.187027 0.248339 0.308672
+0.367787 0.425452 0.481439 0.535524 0.587491 0.63714 0.684275 0.728712
+0.770274 0.808797 0.844132 0.876135 0.904668 0.929633 0.95093 0.968477
+0.982203 0.992056 0.997995 0.999998 0.998043 0.992148 0.98234 0.968656
+0.951152 0.929896 0.904973 0.876479 0.844522 0.809224 0.770735 0.729207
+0.684802 0.637696 0.588075 0.536134 0.482076 0.426108 0.368461 0.309361
+0.249041 0.187738 0.125695 0.0631558 0.000366437 -0.0624246 -0.124968
+-0.187019 -0.248331 -0.308664 -0.367779;
+#X coords 0 1 99 -1 40 8 1;
+#X restore 485 13 graph;
+#X obj 331 66 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 451 20 pddp/pddplink http://wiki.puredata.info/en/garray -text
+pdpedia: garray;
+#X floatatom 382 66 5 0 0 0 - - -;
+#X floatatom 355 136 5 0 0 0 - - -;
+#X obj 331 89 metro 150;
+#X obj 355 158 osc~ 1000;
+#X text 93 557 For help on using graphs \, see:;
+#X obj 93 572 pddp/pddplink graph-help.pd -text graph-help;
+#X obj 93 504 pddp/pddplink all_about_arrays.pd -text all_about_arrays
+;
+#X text 167 375 - the name of the array. (Must be unique.);
+#X text 167 390 - size of the array. (Default is 100.);
+#X text 167 405 - (checkbox) save array contents with patch.;
+#X text 80 405 3) float;
+#X text 80 420 4) float;
+#X text 167 435 - (checkbox) delete the array (but not the graph).
+;
+#X text 80 435 5) float;
+#X text 167 420 - (radio) visual display style of elements.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#N canvas 70 34 428 450 Graphs_and_Garrays 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-graphs-vs-garrays 100 float 3;
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.0666666
+-0.0733333 -0.0866666 -0.106667 -0.106667 -0.106667 -0.106667 -0.0999999
+-0.0666666 -0.00666666 -0.00666666 -0.00666666 -0.00999999 -0.0133333
+-0.02 -0.0266666 -0.05 -0.0599999 -0.0733333 -0.0866666 -0.0933332
+-0.0999999 -0.106667 -0.126667 -0.133333 -0.153333 -0.156667 -0.16
+-0.16 -0.16 -0.16 -0.16 -0.16 -0.16 -0.16 -0.146667 -0.133333 -0.106667
+-0.0999999 -0.0833333 -0.0666666 -0.04 -0.0333333 -0.0266666 -0.0133333
+-0.0133333 -0.0133333 -0.0133333 -0.0133333 -0.0133333 -0.0133333 -0.0133333
+-0.0133333 -0.0133333 -0.0133333 -0.0133333 -0.0133333 -0.0133333 -0.0133333
+-0.0133333 -0.02 -0.0333333 -0.0466666 -0.0466666 0 0 0 0 0 0 0 0;
+#X coords 0 1 99 -1 200 140 1 0 0;
+#X restore 23 298 graph;
+#X text 8 2 [pd] Graphs and Graphical Arrays;
+#X text 20 37 So which part is the graph \, and which is the array?
+Below is a graphical array created from the "Put" menu. The graph that
+contains it is just a subcanvas that is partly visible in this subpatch
+(i.e. \, a true "graph on parent"). Even though you can click and drag
+elements of the graphical array \, you're interacting with it through
+the graph itself. Thus \, if you right-click anywhere on the graph
+below and choose "Help" \, you'll be taken to the help patch for graphs
+\, not arrays.;
+#X text 20 157 Now right-click on the graph and choose "Open". Once
+inside the graph you can interact directly with the graphical array
+\, which merely consists of the small black lines that represent each
+element of the array (yep \, that's it). You can click-drag them as
+you could from the parent window \, but now if you right-click on an
+element and choose "Help" \, you'll be taken to the help patch for
+graphical arrays.;
+#X text 20 253 It's hard work finding help on this!;
+#X restore 97 465 pd Graphs_and_Garrays;
+#X text 11 23 graphical array from the "Put" menu;
+#X text 80 307 You can't access "Put" menu array arguments directly
+\, but you can change the properties by right-clicking on the containing
+graph and choosing "Properties". (You can also send messages to the
+array: see "more_info" below.);
+#X text 80 360 "Put" Menu Array Properties;
+#X text 94 486 For more help on arrays in Pd \, see:;
+#X obj 93 522 pddp/pddplink ../2.control.examples/15.array.pd;
+#X obj 455 51 pddp/dsp;
+#X obj 93 540 pddp/pddplink ../2.control.examples/16.more.arrays.pd
+;
+#X text 96 213 A "Put" menu array is created inside a graph.;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 100 float 3;
+#A 0 -0.684486 -0.621979 -0.555232 -0.484682 -0.410829 -0.334176 -0.255242
+-0.174561 -0.0926915 -0.01019 0.0723822 0.154459 0.235482 0.314901
+0.392167 0.466754 0.538161 0.605901 0.669491 0.728515 0.782575 0.8313
+0.87433 0.911401 0.942262 0.96669 0.984505 0.995611 0.999933 0.997419
+0.988092 0.972032 0.949348 0.920163 0.884703 0.843214 0.795976 0.743285
+0.68553 0.623103 0.556422 0.485934 0.412136 0.335528 0.256626 0.175972
+0.0941189 0.0116234 -0.070952 -0.153042 -0.234089 -0.313542 -0.390846
+-0.465486 -0.536954 -0.604758 -0.668423 -0.727533 -0.781686 -0.830496
+-0.873631 -0.910812 -0.941787 -0.966316 -0.984251 -0.995479 -0.999924
+-0.997515 -0.988309 -0.972368 -0.949791 -0.920714 -0.885364 -0.84398
+-0.796828 -0.74423 -0.686562 -0.624215 -0.557595 -0.48717 -0.413427
+-0.336864 -0.257993 -0.177366 -0.095529 -0.0130394 0.0695391 0.151643
+0.232713 0.312195 0.389541 0.464233 0.535762 0.603626 0.667368 0.726563
+0.780808 0.829702 0.87294 0.91023;
+#X coords 0 1 99 -1 200 140 1;
+#X restore 105 62 graph;
+#X obj 331 185 tabwrite~ \$0-array;
+#X connect 13 0 17 0;
+#X connect 15 0 17 1;
+#X connect 16 0 18 0;
+#X connect 17 0 41 0;
+#X connect 18 0 41 0;
diff --git a/doc/pddp/atan-help.pd b/doc/pddp/atan-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2a0c78abe082b4329ecaa1670e8f0b5b3c4942cd
--- /dev/null
+++ b/doc/pddp/atan-help.pd
@@ -0,0 +1,68 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header atan 3 12 0 18 -204280
+-1 0;
+#X obj 0 436 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Revised by Jonathan Wilkes to conform to the PDDP template for
+Pd version 0.42.;
+#X text 12 5 KEYWORDS control trigonometry;
+#X text 12 45 DESCRIPTION arctangent function;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 501 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 537 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 542 (none);
+#N canvas 57 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 109 43 atan2;
+#X obj 149 43 exp;
+#X obj 177 43 log;
+#X obj 204 43 abs;
+#X obj 232 43 sqrt;
+#X obj 267 43 pow;
+#X obj 57 76 cos~;
+#X obj 89 76 osc~;
+#X obj 23 76 expr;
+#X obj 23 43 sin;
+#X obj 49 43 cos;
+#X obj 76 43 tan;
+#X text 8 2 [atan] Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 78 445 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 444 float;
+#X text 98 464 list;
+#X text 98 509 float;
+#X obj 78 510 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 493 3 atan;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/atan -text
+pdpedia: atan;
+#X floatatom 247 209 0 0 0 0 - - -;
+#X floatatom 247 164 0 0 0 0 - - -;
+#X obj 247 186 atan;
+#X text 96 122 The [atan] object produces the arctangent of a number
+as a numeric value between -Pi/2 and Pi/2.;
+#X text 11 23 arctangent function;
+#X text 168 464 - a list will be truncated \, and the first element
+will be used as input.;
+#X obj 3 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 17 0 18 0;
+#X connect 18 0 16 0;
diff --git a/doc/pddp/atan2-help.pd b/doc/pddp/atan2-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..72c3a2c342aef04be518cfc74f953c3feee4e5b5
--- /dev/null
+++ b/doc/pddp/atan2-help.pd
@@ -0,0 +1,122 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header atan2 3 12 0 18
+-204280 -1 0;
+#X obj 0 405 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 48 243 494 362 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control trigonometry;
+#X text 12 45 DESCRIPTION arctangent of two variables;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 492 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 528 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 557 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 533 (none);
+#N canvas 54 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 149 43 exp;
+#X obj 177 43 log;
+#X obj 204 43 abs;
+#X obj 232 43 sqrt;
+#X obj 267 43 pow;
+#X obj 57 76 cos~;
+#X obj 89 76 osc~;
+#X obj 23 76 expr;
+#X obj 23 43 sin;
+#X obj 49 43 cos;
+#X obj 76 43 tan;
+#X obj 109 43 atan;
+#X text 8 2 [atan2] Related Objects;
+#X restore 101 598 pd Related_objects;
+#X obj 78 414 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 413 float;
+#X text 98 433 list;
+#X text 98 500 float;
+#X obj 78 501 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 484 3 atan2;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/atan2 -text
+pdpedia: atan2;
+#X text 92 97 The [atan2] object produces the arctangent of the quotient
+of its two arguments. The number produced is a value between Pi and
+-Pi and represents the counterclockwise angle in radians (not degrees)
+between the positive X axis and the point (x \, y). Note that the X
+coordinate is passed to the right inlet and the Y coordinate is passed
+to the left inlet.;
+#X text 11 23 arctangent of two variables;
+#N canvas 92 356 428 204 atan2_vs_atan 0;
+#X floatatom 321 97 0 0 0 0 - - -;
+#X floatatom 112 66 0 0 0 0 - - -;
+#X floatatom 35 153 0 0 0 0 - - -;
+#X floatatom 35 65 0 0 0 0 - - -;
+#X obj 35 133 atan2;
+#X text 20 65 Y;
+#X text 101 65 X;
+#X floatatom 321 170 0 0 0 0 - - -;
+#X obj 321 130 /;
+#X obj 321 150 atan;
+#X text 147 62 This example on the;
+#X text 146 78 right is an alternative;
+#X text 146 96 of finding the arctangent;
+#X text 146 113 of two coordinates \, but;
+#X text 147 146 than [atan2].;
+#X text 344 131 Y;
+#X text 308 131 X;
+#X floatatom 352 97 0 0 0 0 - - -;
+#X text 147 130 it runs slightly slower;
+#X obj 352 43 r X;
+#X obj 321 43 r Y;
+#X obj 50 97 s Y;
+#X obj 112 97 s X;
+#X obj 321 70 swap;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [atan2] Build Your Own [atan2] with [atan];
+#X connect 0 0 8 0;
+#X connect 1 0 4 1;
+#X connect 1 0 22 0;
+#X connect 3 0 4 0;
+#X connect 3 0 21 0;
+#X connect 4 0 2 0;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 17 0 8 1;
+#X connect 19 0 23 1;
+#X connect 20 0 23 0;
+#X connect 23 0 0 0;
+#X connect 23 1 17 0;
+#X restore 101 566 pd atan2_vs_atan;
+#X floatatom 224 217 5 0 0 0 - - -;
+#X floatatom 261 217 5 0 0 0 - - -;
+#X obj 224 241 atan2;
+#X floatatom 224 268 5 0 0 0 - - -;
+#X obj 78 464 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 463 float;
+#X text 168 413 - Y coordinate;
+#X text 168 463 - X coordinate;
+#X text 168 433 - a list will be distributed between the two inlets
+of [atan2].;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 19 0 21 0;
+#X connect 20 0 21 1;
+#X connect 21 0 22 0;
diff --git a/doc/pddp/bag-help.pd b/doc/pddp/bag-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f17818c365bf4f4fc3d954c1f5d287568d5e83f7
--- /dev/null
+++ b/doc/pddp/bag-help.pd
@@ -0,0 +1,87 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header bag 3 12 0 18 -204280
+-1 0;
+#X obj 0 288 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 367 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION collection of numbers;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 65 INLET_0 float list flush clear;
+#X text 12 5 KEYWORDS control storage list_op;
+#X text 12 185 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 495 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 542 (none);
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 62 43 makenote;
+#X obj 22 43 poly;
+#X obj 123 43 list;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [bag] Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 79 297 cnv 17 3 130 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 296 float;
+#X text 98 353 list;
+#X text 98 503 float;
+#X obj 79 504 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 79 440 cnv 17 3 45 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 439 float;
+#X text 98 383 flush;
+#X text 98 413 clear;
+#X text 168 383 - output all values one by one \, in the order they
+were received \, and clear the collection.;
+#X text 168 503 - upon sending the "flush" message to the left inlet
+\, [bag] will output each value in the order it was received.;
+#X text 99 570 You can use [bag] to mimic a sustain pedal \, for example.
+;
+#X msg 162 88 60 64;
+#X msg 213 88 60 0;
+#X msg 257 88 62 64;
+#X msg 304 88 62 0;
+#X obj 162 215 print;
+#X text 207 216 Output is in the printout window.;
+#X msg 304 134 clear;
+#X msg 303 111 flush;
+#X obj 162 185 bag;
+#X text 168 353 - a (value \, flag) pair is distributed to the two
+inlets. Lists with more than two elements will be truncated.;
+#X text 11 23 collection of numbers;
+#X obj 493 3 bag;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/bag -text
+pdpedia: bag;
+#X text 168 413 - clear the collection.;
+#X text 167 439 - a float to the right inlet sets the "flag": if zero
+\, values to the left inlet will not be added to the collection. If
+nonzero \, values to the right inlet will be added to the collection.
+;
+#X text 168 296 - a float to the left inlet will be added to the collection
+if the last value the right inlet received was nonzero. If the last
+value the right inlet received was zero \, the float sent to the right
+inlet will be removed from the collection.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 21 0 29 0;
+#X connect 22 0 29 0;
+#X connect 23 0 29 0;
+#X connect 24 0 29 0;
+#X connect 27 0 29 0;
+#X connect 28 0 29 0;
+#X connect 29 0 25 0;
diff --git a/doc/pddp/bang-help.pd b/doc/pddp/bang-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c928a2ab2db78e10c83e296f2cbfffbc9763f1b9
--- /dev/null
+++ b/doc/pddp/bang-help.pd
@@ -0,0 +1,134 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header bang 3 12 0 18 -204280
+-1 0;
+#X obj 0 329 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 244 494 366 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Revised by Jonathan Wilkes to conform to the PDDP template for
+Pd version 0.42.;
+#X text 12 65 DESCRIPTION output a "bang" message whatever the input
+;
+#X text 12 85 INLET_0 anything;
+#X text 12 105 OUTLET_0 bang;
+#X text 12 5 ALIAS b;
+#X text 12 25 KEYWORDS control bang_op;
+#X text 12 185 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 373 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 409 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 338 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 413 (none);
+#N canvas 40 482 428 108 Related_objects 0;
+#X obj 21 42 trigger;
+#X obj 191 43 loadbang;
+#X msg 91 43;
+#X obj 262 43 until;
+#X obj 144 43 bang;
+#X obj 312 43 metro;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [bang] Related Objects;
+#X restore 101 598 pd Related_objects;
+#X text 98 381 bang;
+#X obj 78 381 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/bang -text
+pdpedia: bang;
+#X obj 469 3 bang;
+#X obj 139 224 print;
+#X msg 152 171 walk the cat;
+#X msg 139 145 45;
+#X obj 139 199 bang;
+#X obj 288 199 print;
+#X msg 288 147 walk the cat;
+#X obj 288 175 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 310 173 <- gui "bng" object;
+#X text 98 337 anything;
+#N canvas 57 48 428 509 More_bang_objects 0;
+#X obj 23 42 bang;
+#X obj 66 42 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 43 116 bang;
+#X text 20 115 1;
+#X text 19 172 2;
+#X obj 43 173 bng 15 250 50 0 empty empty empty 18 7 0 8 -262144 -1
+-1;
+#X text 178 42 - sending "bang" messages;
+#X obj 140 42 t b;
+#X msg 92 42 bang;
+#X text 19 288 3;
+#X msg 45 289 bang;
+#X msg 98 342 bang \, bang;
+#X obj 98 368 f;
+#X obj 131 368 + 1;
+#X floatatom 98 393 5 0 0 0 - - -;
+#X msg 46 342 bang;
+#X text 19 418 4;
+#X obj 43 419 trigger bang;
+#X text 151 419 Abbrevation:;
+#X obj 253 419 t b;
+#X obj 271 471 b;
+#X text 43 138 This version uses minimal CPU but serves essentially
+the same purpose as the GUI version below.;
+#X text 42 309 The word "bang" in a message box (CTRL+2) makes a clickable
+bang object. Use commas to send multiple messages:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [bang] Common Objects for Sending bang Messages;
+#X text 20 65 The [bang] object is one of the basic building blocks
+of PD and is normally used to activate events. The four basic ways
+to send a "bang" message are:;
+#X text 42 441 When given a single argument of "bang" \, the trigger
+object is essentially the same as #1 above \, so in this case it's
+preferable (and less typing) to use:;
+#X text 67 174 a.k.a. [bng];
+#X text 42 191 This version uses a little more CPU than its cousin
+because it lights up when it receives a message or is clicked on and
+can be coloured \, resized \, or renamed. It is sometimes 'friendlier'
+as well because it can act as its own send and receive object (see
+properties...). This object can be put in a Pd patch either by keyboard
+shortcut: ALT+SHIFT+B or by creating an object (CTRL+1) and naming
+it "bng".;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 0 14 0;
+#X connect 13 0 12 1;
+#X connect 15 0 12 0;
+#X restore 100 473 pd More_bang_objects;
+#X text 98 441 Many objects in Pd output a "bang" message. Click the
+subpatch below to read about the most common ones:;
+#X obj 100 569 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 98 498 It is important to note that "bang" is not boolean.
+It's neither a zero or a one \; it's not true or false \; it's just
+"bang". For a boolean object \, you should check out [toggle]:;
+#X text 11 23 output a "bang" message whatever the input;
+#X text 122 567 <- Right click and choose "Help" for [toggle] helpfile.
+;
+#X text 168 381 - the [bang] object always outputs a bang message.
+;
+#X text 168 337 - [bang] takes any message supplied to its inlet and
+outputs a bang message in response.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 521 3 b;
+#X text 501 3 or;
+#X connect 15 0 17 0;
+#X connect 16 0 17 0;
+#X connect 17 0 14 0;
+#X connect 19 0 20 0;
+#X connect 20 0 18 0;
diff --git a/doc/pddp/bang~-help.pd b/doc/pddp/bang~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..515eac2eb6843d427cff74a9948c3a433add63fe
--- /dev/null
+++ b/doc/pddp/bang~-help.pd
@@ -0,0 +1,76 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header bang~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 445 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 43 242 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Revised
+by Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION output a "bang" message after each DSP cycle
+;
+#X text 12 65 INLET_0;
+#X text 12 85 OUTLET_0 bang;
+#X text 12 5 KEYWORDS signal conversion bang_op;
+#X text 12 165 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 482 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 537 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 565 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 454 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 541 (none);
+#N canvas 31 477 428 114 Related_objects 0;
+#X obj 15 34 print~;
+#X obj 72 34 bang;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [bang~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X text 98 491 bang;
+#X obj 78 491 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 483 3 bang~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/bang~ -text
+pdpedia: bang~;
+#X obj 116 213 bang~;
+#X obj 116 281 print;
+#X text 228 169 click to test;
+#X obj 116 249 spigot;
+#X msg 190 253 dsp \$1;
+#X obj 190 280 s pd;
+#X msg 190 171 bang;
+#X obj 190 219 1;
+#X obj 226 219 0;
+#X obj 226 195 delay 10;
+#X obj 340 170 loadbang;
+#X msg 340 196 dsp 0;
+#X obj 340 221 s pd;
+#X text 11 23 output a "bang" message after each DSP cycle;
+#X text 168 453 - the inlet of [bang~] is not used.;
+#X text 168 491 - [bang~] outputs a bang after each DSP cycle (at the
+same logical time as the DSP cycle). This is primarily useful for sampling
+the outputs of analysis algorithms.;
+#X text 98 453 (inactive);
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 14 0 17 0;
+#X connect 17 0 15 0;
+#X connect 18 0 19 0;
+#X connect 20 0 21 0;
+#X connect 20 0 23 0;
+#X connect 21 0 17 1;
+#X connect 21 0 18 0;
+#X connect 22 0 17 1;
+#X connect 22 0 18 0;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 25 0 26 0;
diff --git a/doc/pddp/bendin-help.pd b/doc/pddp/bendin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2d00c2343b99faaffe81be36f67cdbe0f3f71457
--- /dev/null
+++ b/doc/pddp/bendin-help.pd
@@ -0,0 +1,99 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header bendin 3 12 0 18
+-204280 -1 0;
+#X obj 0 395 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 48 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION read incoming pitch bend values;
+#X text 12 65 OUTLET_0 float;
+#X text 12 85 OUTLET_1 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 430 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 495 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 560 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 439 float;
+#N canvas 50 112 428 456 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [bendin] Related Objects;
+#X obj 75 89 ctlin;
+#X obj 25 116 pgmin;
+#X obj 25 89 bendin;
+#X obj 205 116 touchin;
+#X obj 69 116 polytouchin;
+#X obj 119 89 midiin;
+#X obj 149 116 sysexin;
+#X obj 131 176 noteout;
+#X obj 25 176 ctlout;
+#X obj 25 36 bendout;
+#X obj 161 203 touchout;
+#X obj 75 203 polytouchout;
+#X obj 75 176 midiout;
+#X obj 25 203 pgmout;
+#X obj 25 258 makenote;
+#X text 22 235 MIDI note construction:;
+#X text 22 149 MIDI output:;
+#X text 22 66 MIDI input:;
+#X obj 185 258 stripnote;
+#X text 22 305 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 21 384 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X obj 169 89 notein;
+#X text 182 235 MIDI note deconstruction:;
+#X text 22 286 Externals;
+#X obj 22 335 pddp/helplink maxlib/pitch;
+#X obj 22 350 pddp/helplink maxlib/score;
+#X obj 22 365 pddp/helplink maxlib/chord;
+#X obj 22 400 pddp/helplink cyclone/midiformat;
+#X obj 22 415 pddp/helplink cyclone/midiparse;
+#X obj 22 430 pddp/helplink cyclone/midiflush;
+#X restore 101 597 pd Related_objects;
+#X obj 482 3 bendin;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/bendin -text
+pdpedia: bendin;
+#X text 98 405 (none);
+#X obj 78 439 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 467 cnv 17 3 17 empty \$0-pddp.cnv.let.0 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 467 float;
+#X floatatom 148 171 5 0 0 0 - - -;
+#X floatatom 191 171 5 0 0 0 - - -;
+#X obj 148 144 bendin;
+#X text 85 221 The [bendin] object reads incoming pitch bend values
+and reports them. If started with no arguments it reports the channel
+number through the right outlet.;
+#X obj 260 144 bendin 2;
+#X floatatom 260 171 5 0 0 0 - - -;
+#X text 311 171 <-- pitch bend values on channel 2;
+#X obj 99 564 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 11 23 read incoming pitch bend values;
+#X text 167 514 - (optional) a single MIDI channel number from which
+to read. If the argument is present \, the [bendin] object does not
+show the second (right) outlet.;
+#X text 168 405 - [bendin] reads directly from the MIDI port.;
+#X text 168 439 - pitchbend value (a 14-bit integer).;
+#X text 168 467 - MIDI channel number (available unless argument is
+given).;
+#X text 80 514 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 17 0 15 0;
+#X connect 17 1 16 0;
+#X connect 19 0 20 0;
diff --git a/doc/pddp/bendout-help.pd b/doc/pddp/bendout-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..301db515ba552eb98bf85787b42604009d86eba9
--- /dev/null
+++ b/doc/pddp/bendout-help.pd
@@ -0,0 +1,97 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header bendout 3 12 0 18
+-204280 -1 0;
+#X obj 0 377 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION send pitchbend value to the MIDI port;
+#X text 12 85 INLET_1 float;
+#X text 12 65 INLET_0 float list;
+#X text 12 165 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 458 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 486 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 561 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 387 float;
+#N canvas 60 184 441 421 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [bendout] Related Objects;
+#X obj 73 80 ctlin;
+#X obj 216 80 pgmin;
+#X obj 23 33 bendin;
+#X obj 78 107 touchin;
+#X obj 260 80 polytouchin;
+#X obj 117 80 midiin;
+#X obj 22 107 sysexin;
+#X obj 178 167 noteout;
+#X obj 75 167 ctlout;
+#X obj 23 167 bendout;
+#X obj 365 167 touchout;
+#X obj 279 167 polytouchout;
+#X obj 122 167 midiout;
+#X obj 230 167 pgmout;
+#X obj 23 221 makenote;
+#X text 20 198 MIDI note construction:;
+#X text 20 140 MIDI output:;
+#X text 20 57 MIDI input:;
+#X obj 183 221 stripnote;
+#X obj 167 80 notein;
+#X text 180 198 MIDI note deconstruction:;
+#X text 22 265 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 21 344 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 22 246 Externals;
+#X obj 22 295 pddp/helplink maxlib/pitch;
+#X obj 22 310 pddp/helplink maxlib/score;
+#X obj 22 325 pddp/helplink maxlib/chord;
+#X obj 22 360 pddp/helplink cyclone/midiformat;
+#X obj 22 375 pddp/helplink cyclone/midiparse;
+#X obj 22 390 pddp/helplink cyclone/midiflush;
+#X restore 101 598 pd Related_objects;
+#X text 98 462 (none);
+#X obj 78 387 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 430 cnv 17 3 17 empty \$0-pddp.cnv.let.0 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 430 float;
+#X obj 99 565 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X obj 470 3 bendout;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/bendout -text
+pdpedia: bendout;
+#X floatatom 111 146 5 0 0 0 - - -;
+#X floatatom 150 163 5 0 0 0 - - -;
+#X obj 111 186 bendout;
+#X floatatom 231 163 5 0 0 0 - - -;
+#X text 305 186 <-- pitch bend values on channel 2;
+#X obj 231 186 bendout 2;
+#X text 11 23 send pitchbend value to the MIDI port;
+#X text 168 505 - (optional) the MIDI channel number to be written
+to. If no argument is given \, [bendout] defaults to channel 1 . The
+channel can be changed by sending an integer to the right inlet.;
+#X text 168 387 - pitchbend value (0-127).;
+#X text 168 430 - MIDI channel number (defaults to channel 1).;
+#X text 168 462 - [bendin] writes directly to the MIDI port.;
+#X text 80 505 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 98 407 list;
+#X text 168 407 - a list is distributed to the inlets.;
+#X connect 16 0 18 0;
+#X connect 17 0 18 1;
+#X connect 19 0 21 0;
diff --git a/doc/pddp/biquad~-help.pd b/doc/pddp/biquad~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5f56c429dc92f9e792ca1487c56a76b5cff4c480
--- /dev/null
+++ b/doc/pddp/biquad~-help.pd
@@ -0,0 +1,89 @@
+#N canvas 0 0 555 619 10;
+#X obj -1 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj -1 0 cnv 15 552 40 empty \$0-pddp.cnv.header biquad~ 3 12 0
+18 -204280 -1 0;
+#X obj -1 321 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version-0.30. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filters;
+#X text 12 45 DESCRIPTION 2-pole-2-zero-filter;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 65 INLET_0 list signal set clear;
+#X text 12 165 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj -1 416 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj -1 453 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj -1 565 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8
+12 0 13 -228856 -1 0;
+#N canvas 46 487 428 102 Related_objects 0;
+#X obj 22 42 hip~;
+#X obj 62 41 lop~;
+#X obj 104 41 bp~;
+#X obj 139 41 vcf~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [biquad~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 330 cnv 17 3 75 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 471 3 biquad~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/biquad~ -text
+pdpedia: biquad~;
+#X obj 155 216 env~;
+#X floatatom 155 243 0 0 0 0 - - -;
+#X floatatom 66 98 0 0 0 0 - - -;
+#X obj 66 214 env~;
+#X floatatom 66 242 0 0 0 0 - - -;
+#X obj 155 183 biquad~ 1.41407 -0.9998 1 -1.41421 1;
+#X msg 155 99 1.41407 -0.9998 1 -1.41421 1;
+#X text 220 237 (= SR/8 = 5512.5 Hz @44.1k);
+#X text 167 77 list sets filter parameters;
+#X msg 190 129 set 0 0;
+#X msg 191 154 clear;
+#X obj 66 138 osc~ 5512.5;
+#X text 260 131 set internal state;
+#X text 258 153 ... or just clear it;
+#X text 98 350 list;
+#X text 98 330 signal;
+#X text 98 370 set;
+#X text 98 390 clear;
+#X obj 78 425 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 426 signal;
+#X text 169 503 y(n) = ff1 * w(n) + ff2 * w(n-1) + ff3 * w(n-2);
+#X text 169 519 w(n) = x(n) + fb1 * w(n-1) + fb2 * w(n-2);
+#X text 169 541 Syntax: biquad~ fb1 fb2 ff1 ff2 ff3;
+#X text 59 267 Compare the value of the straight signal on the left
+with the value of the filtered signal on the right.;
+#X text 11 23 2-pole-2-zero-filter;
+#X text 169 472 - [biquad~] takes five floats as arguments which are
+used to calculate the following difference equation:;
+#X text 168 370 - set internal state.;
+#X text 168 390 - clear the internal state.;
+#X text 85 472 5 floats;
+#X text 214 218 this [biquad~] is a notch filter for fn = Pi/4;
+#X text 168 350 - a list of 5 floats is used to set filter parameters.
+;
+#X text 168 330 - the incoming signal;
+#X text 168 426 - the outgoing signal;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 11 0 12 0;
+#X connect 13 0 22 0;
+#X connect 14 0 15 0;
+#X connect 16 0 11 0;
+#X connect 17 0 16 0;
+#X connect 20 0 16 0;
+#X connect 21 0 16 0;
+#X connect 22 0 14 0;
+#X connect 22 0 16 0;
diff --git a/doc/pddp/block~-help.pd b/doc/pddp/block~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f1778fda6abfb609fd16cf0dd73437d7e137fc7a
--- /dev/null
+++ b/doc/pddp/block~-help.pd
@@ -0,0 +1,191 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header block~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 271 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 42 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.4. Revised
+by Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 65 DESCRIPTION block \, overlap \, and resampling control
+for DSP;
+#X text 12 85 INLET_0 set;
+#X text 12 25 KEYWORDS signal block_oriented canvas_op;
+#X text 12 165 RELEASE_DATE 2009;
+#X text 12 5 ALIAS switch~;
+#X restore 500 597 pd META;
+#X obj 0 336 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 365 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 435 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 48 485 428 105 Related_objects 0;
+#X obj 83 42 fft~;
+#X obj 23 42 switch~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 1 [block~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 280 cnv 17 3 40 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/block~ -text
+pdpedia: block~;
+#X text 98 280 set;
+#X text 98 341 (none);
+#X floatatom 78 247 0 0 0 0 - - -;
+#X text 155 248 <- measured time (msec) between blocks;
+#X text 161 49 block size 4096 \, no overlap \, no resampling;
+#X text 162 71 bigger block size;
+#X text 160 92 double overlap;
+#X text 169 116 downsampled by factor of 2;
+#X text 160 139 upsampled by factor of 2;
+#X msg 78 50 set 4096 1 1;
+#X msg 78 72 set 8192 1 1;
+#X msg 78 94 set 4096 2 1;
+#X msg 78 116 set 4096 1 0.5;
+#X msg 78 138 set 4096 1 2;
+#N canvas 44 414 428 153 a-simple-block-example 0;
+#X obj 22 42 block~ 1024 4;
+#X text 19 64 This object specifies that DSP in this subwindow is to
+be computed at a block size of 1024 \, and an overlap of 4 \, i.e.
+\, every 256 samples. You may not (yet) specify a block size smaller
+than your superpatch. This is useful for writing FFT based patches
+(see the "fft examples" tutorial series.);
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [block~] A Simple Example;
+#X restore 282 556 pd a-simple-block-example;
+#N canvas 56 284 428 261 block-interactions 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [block~]/[switch~] Interactions with Other PD Objects;
+#X text 20 36 [dac~] and [adc~] don't work correctly if reblocked \,
+nor if a parent window is reblocked \, even if the window containing
+the [dac~] or [adc~] is reblocked back to the default block size and
+sample rate.;
+#X text 19 103 If using [send~] or [delwrite~] from a switched-off
+patch \, the output of corresponding [receive~] and [delread~] objects
+in other \, running patches will cycle old input (and sound like garbage).
+[throw~] may be switched with impunity \, but not [catch~].;
+#X text 21 184 Patches using [send~]/[receive~] or [throw~]/[catch~]
+to intercommunicate must have the same blocking -- and if their parents
+are blocked bigger than they are \, there might be weirdness.;
+#X restore 102 555 pd block-interactions;
+#X text 257 224 <- toggle display;
+#X text 11 23 block \, overlap \, and resampling control for DSP;
+#N canvas 22 87 428 396 visualize 0;
+#X obj 49 219 f;
+#X obj 81 219 + 1;
+#X obj 117 170 i;
+#X obj 117 243 s \$0-bng-rcv;
+#X msg 117 218 flashtime 50 \$1;
+#X obj 117 195 max 50;
+#X obj 49 139 t b a;
+#X obj 258 318 outlet;
+#X obj 258 181 t a;
+#X obj 201 315 tgl 15 0 \$0-tgl \$0-nothing empty 17 7 0 10 -204786
+-1 -1 0 1;
+#X obj 49 187 spigot;
+#X obj 110 124 r \$0-tgl;
+#X obj 49 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0 10
+-262144 -1 -1;
+#X obj 64 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0 10
+-262144 -1 -1;
+#X obj 79 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0 10
+-262144 -1 -1;
+#X obj 94 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0 10
+-262144 -1 -1;
+#X obj 109 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0
+10 -262144 -1 -1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [block~] Bang every block;
+#X text 10 347 This subpatch just triggers a series of bng objects
+to display how different "set" messages change the block size.;
+#X obj 260 114 inlet;
+#X obj 260 138 block~ 4096 1;
+#X obj 49 63 bang~;
+#X obj 49 89 t b b;
+#X obj 49 115 timer;
+#X obj 49 273 sel 0 1 2 3 4 5 6 7 8 9;
+#X obj 124 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0
+10 -262144 -1 -1;
+#X obj 139 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0
+10 -262144 -1 -1;
+#X obj 154 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0
+10 -262144 -1 -1;
+#X obj 169 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0
+10 -262144 -1 -1;
+#X obj 184 319 bng 10 92 50 0 \$0-nowhere \$0-bng-rcv empty 17 7 0
+10 -262144 -1 -1;
+#X obj 49 246 mod 10;
+#X connect 0 0 1 0;
+#X connect 0 0 31 0;
+#X connect 1 0 0 1;
+#X connect 2 0 5 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 10 0;
+#X connect 6 1 2 0;
+#X connect 6 1 8 0;
+#X connect 8 0 7 0;
+#X connect 10 0 0 0;
+#X connect 11 0 10 1;
+#X connect 20 0 21 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 23 1 24 1;
+#X connect 24 0 6 0;
+#X connect 25 0 12 0;
+#X connect 25 1 13 0;
+#X connect 25 2 14 0;
+#X connect 25 3 15 0;
+#X connect 25 4 16 0;
+#X connect 25 5 26 0;
+#X connect 25 6 27 0;
+#X connect 25 7 28 0;
+#X connect 25 8 29 0;
+#X connect 25 9 30 0;
+#X connect 31 0 25 0;
+#X coords 0 -1 1 1 175 35 1 45 300;
+#X restore 78 209 pd visualize;
+#X obj 422 3 block~;
+#X text 90 161 IMPORTANT NOTE: Since you may have at most one block~/switch~
+object in any window \, [block~] has been put in a subpatch (below)
+for this example:;
+#X text 170 384 - blocksize.;
+#X text 170 398 - (optional) overlap.;
+#X text 170 411 - (optional) resampling factor (relative to super-patch).
+;
+#X text 80 398 2) float;
+#X text 80 411 3) float;
+#X text 168 280 - [block] has a single inlet that accepts a "set" message--
+"set" followed by one to three floats-- that determines the block size
+\, overlap \, and resampling for the window (see example above).;
+#X text 80 384 1) float;
+#X text 99 439 Pd's default block size is 64 samples. The [inlet~]
+and [outlet~] objects reblock signals to adjust for differences between
+parent and subpatch \, but only power-of-two adjustments are possible.
+So for "normal" audio computations \, all blocks should also be power-of-two
+in size. HOWEVER \, if you have no [inlet~] or [outlet~] you may specify
+any other block size. This is intended for later use in video processing.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 102 576 pddp/pddplink ../3.audio.examples/J07.oversampling.pd
+-text doc/3.audio.examples/J07.oversampling.pd;
+#X text 469 3 or [switch~];
+#X connect 19 0 28 0;
+#X connect 20 0 28 0;
+#X connect 21 0 28 0;
+#X connect 22 0 28 0;
+#X connect 23 0 28 0;
+#X connect 28 0 12 0;
diff --git a/doc/pddp/bng-help.pd b/doc/pddp/bng-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c6e7cd0228d02cc60c1a78b629f36956bbec0c0b
--- /dev/null
+++ b/doc/pddp/bng-help.pd
@@ -0,0 +1,444 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header bng 3 12 0 18 -204280
+-1 0;
+#X obj 0 300 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 42 244 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Thomas Musil;
+#X text 12 155 WEBSITE;
+#X text 12 195 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 45 DESCRIPTION gui-bang;
+#X text 12 65 INLET_0 anything size flashtime init send receive label
+label_pos label_font color pos delta;
+#X text 12 95 OUTLET_0 bang;
+#X text 12 5 KEYWORDS control nonlocal GUI bang_op;
+#X text 12 175 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 408 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 445 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 547 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 309 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 28 461 428 129 Related_objects 0;
+#X obj 22 43 bang;
+#X obj 69 43 trigger;
+#X obj 145 43 until;
+#X obj 201 43 bang~;
+#X msg 257 43;
+#X obj 20 93 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 18 69 All iem-gui objects:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [bng] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 98 417 bang;
+#X obj 78 417 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 308 anything;
+#X obj 495 3 bng 15 250 50 0 foo5_rcv empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/bng -text
+pdpedia: bng;
+#X obj 144 227 print;
+#N canvas 598 330 187 198 once 0;
+#X msg 38 77 1;
+#X obj 38 51 t b b;
+#X obj 68 133 sel 0;
+#X obj 68 107 f 0;
+#X obj 38 24 inlet;
+#X obj 68 163 outlet;
+#X connect 0 0 3 1;
+#X connect 1 0 0 0;
+#X connect 1 1 3 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X restore 144 203 pd once;
+#X obj 116 228 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144
+-1 -1;
+#X obj 75 110 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 116 148 bng 50 950 50 1 foo5_snd foo5_rcv big-bang 57 25 0 12
+-262131 -260818 -143491;
+#X msg 116 49 33;
+#X msg 157 49 -3.14;
+#X msg 180 97 11 22 33.33;
+#X msg 170 73 open xxx;
+#X msg 187 121 funny;
+#X obj 292 72 s foo5_rcv;
+#X obj 292 102 r foo5_snd;
+#X obj 292 53 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 292 126 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144
+-1 -1;
+#X msg 75 49 0;
+#X text 321 142 and receive names. Right-;
+#X text 321 157 click and choose;
+#N canvas 85 201 428 309 bng_creation_arguments 0;
+#X text 12 28 "bng" can be called with 14 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X text 12 132 For example \, click the msg-box to dynamically create
+a bng:;
+#X text 12 80 bng creation arguments: Size Hold Interrupt Init sendName
+receiveName Label labelXOff labelYOff Font# fontSize bgColor foregroundColor
+lblColor;
+#X obj 13 196 s pd-bng_creation_arguments;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [bng] Creation Arguments and Dynamic Patching;
+#X msg 13 154 obj 180 240 bng 30 500 50 0 send receive Atlas -2 40
+0 12 9 2 18;
+#X connect 6 0 3 0;
+#X restore 100 519 pd bng_creation_arguments;
+#X text 320 173 "Properties" to set them \,;
+#X text 320 126 [bng] has settable send;
+#X text 110 250 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move
+a selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 321 187 or change them with messages;
+#X text 321 201 (see the subpatch below);
+#N canvas 48 5 428 610 Changing_GUI_Properties 0;
+#X text 239 33 no init;
+#X text 270 159 label position;
+#X text 167 451 delta;
+#X text 11 294 font properties;
+#X text 151 159 label;
+#X text 15 451 position;
+#X msg 13 103 size \$1;
+#X msg 104 104 flashtime \$1 \$2;
+#X msg 239 54 init 0;
+#X msg 249 104 init 1;
+#X msg 321 54 send foo5a_snd;
+#X msg 151 180 label new-label;
+#X msg 272 231 label_pos \$1 \$2;
+#X msg 13 366 label_font \$1 \$2;
+#X msg 16 558 pos \$1 \$2;
+#X msg 168 558 delta \$1 \$2;
+#X text 171 294 preset-colors;
+#X text 297 294 RGB-colors;
+#X msg 171 401 color \$1 \$2 \$3;
+#X msg 329 104 send bng-snd;
+#X obj 13 127 s bng_rcv;
+#X obj 104 128 s bng_rcv;
+#X obj 239 129 s bng_rcv;
+#X obj 321 129 s bng_rcv;
+#X obj 13 255 s bng_rcv;
+#X obj 23 230 s bng1a_rcv;
+#X obj 151 256 s bng_rcv;
+#X obj 272 256 s bng_rcv;
+#X obj 13 391 s bng_rcv;
+#X obj 171 426 s bng_rcv;
+#X obj 168 583 s bng_rcv;
+#X obj 16 583 s bng_rcv;
+#X msg 23 206 receive bng_rcv;
+#X msg 13 180 receive bng1a_rcv;
+#X msg 163 231 label myBang;
+#N canvas 375 166 160 287 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 72 \; \$1-interrupt 50 \; \$1-hold 250 \; \$1-xpos 340 \;
+\$1-ypos 500 \; \$1-xlabel 17 \; \$1-ylabel 7 \; \$1-dim 15 \; \$1-font
+0 \; \$1-font-size 10 \; \$1-bg 0 \; \$1-front 12 \; \$1-label 12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 320 583 pd init;
+#X text 320 33 change send name;
+#X text 13 159 change receive name;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-interrupt empty
+0 -8 0 12 -262144 -1 -1 50 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-hold empty 0
+-8 0 12 -262144 -1 -1 250 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 104 54 pd flash-time;
+#X text 101 33 flash-time;
+#X text 12 32 dimensions;
+#N canvas 364 205 306 317 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 33 237 pack 0 0 0;
+#X obj 120 197 t b a;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 0 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-front empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 103 144 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 2;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X coords 0 -1 1 1 48 62 2 100 100;
+#X restore 171 316 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 96 410 route 0 1 2;
+#X obj 96 497 pack 0 0 0;
+#X obj 115 456 t b a;
+#X obj 168 455 t b a;
+#X obj 104 124 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X text 120 137 2.front;
+#X text 120 153 3.label;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 10 2 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 1 11 1;
+#X connect 13 0 11 0;
+#X connect 13 1 11 2;
+#X connect 14 0 9 1;
+#X connect 18 0 5 0;
+#X connect 19 0 6 0;
+#X connect 20 0 7 0;
+#X coords 0 -1 1 1 102 74 2 100 100;
+#X restore 298 316 pd flash-time;
+#X text 248 72 init on;
+#X text 248 85 loadbang;
+#X obj 168 534 list;
+#X obj 168 473 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 310 466 cnv 15 102 102 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 311 467 cnv 15 100 100 empty empty empty 20 12 0 14 -261682
+-66577 0;
+#X obj 340 500 bng 15 250 50 1 bng-snd bng_rcv myBang 17 7 0 10 -262144
+-33289 -33289;
+#X text 62 318 1.font(0-2);
+#X text 62 339 2.height;
+#X text 220 318 1.bg;
+#X text 220 338 2.front;
+#X text 220 359 3.label;
+#X text 64 472 1.x-position;
+#X text 64 494 2.y-position;
+#X text 247 472 1.x-delta;
+#X text 247 494 2.y-delta;
+#X obj 13 53 nbx 3 14 8 200 0 0 empty \$0-dim empty 0 -8 0 12 -262144
+-1 -1 15 256;
+#X text 58 51 size;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 17 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 7 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 272 181 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 13 316 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 340 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 500 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 16 473 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 197 473 pd flash-time;
+#X text 321 203 2.y-offset;
+#X text 321 182 1.x-offset;
+#X text 153 56 1.interrupt;
+#X text 153 76 2.hold;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 2 [bng] Changing Properties through Messages;
+#X connect 6 0 20 0;
+#X connect 7 0 21 0;
+#X connect 8 0 22 0;
+#X connect 9 0 22 0;
+#X connect 10 0 23 0;
+#X connect 11 0 26 0;
+#X connect 12 0 27 0;
+#X connect 13 0 28 0;
+#X connect 14 0 31 0;
+#X connect 15 0 30 0;
+#X connect 18 0 29 0;
+#X connect 19 0 23 0;
+#X connect 32 0 25 0;
+#X connect 33 0 24 0;
+#X connect 34 0 26 0;
+#X connect 38 0 7 0;
+#X connect 41 0 18 0;
+#X connect 42 0 18 0;
+#X connect 45 0 15 0;
+#X connect 46 0 45 0;
+#X connect 59 0 6 0;
+#X connect 61 0 12 0;
+#X connect 62 0 13 0;
+#X connect 63 0 14 0;
+#X connect 64 0 45 1;
+#X restore 101 380 pd Changing_GUI_Properties;
+#X text 168 463 - creating a [bng] without any arguments will set default
+values for all gui-properties. See the subpatch below to learn how
+to dynamically instantiate a [bng] object with custom properties:;
+#X text 11 23 gui-bang;
+#N canvas 43 24 428 573 bng_properties 0;
+#X text 22 53 1 Size;
+#X obj 104 60 bng 8 250 50 0 empty empty 8 10 4 0 8 -262144 -1 -1;
+#X obj 129 53 bng 15 250 50 0 empty empty 15 17 9 0 8 -262144 -1 -1
+;
+#X obj 164 43 bng 25 250 50 0 empty empty 25 27 20 0 8 -262144 -1 -1
+;
+#X text 51 75 Default size is 15 pixels. The minimum size is 8 and
+it does not have a maximum size.;
+#X text 23 258 3 Hold;
+#X obj 93 258 bng 15 50 10 0 empty empty 50 17 8 0 8 -262144 -1 -1
+;
+#X obj 128 258 bng 15 750 50 0 empty empty 750 17 8 0 8 -262144 -1
+-1;
+#X text 23 341 4 Receive Symbol/Send Symbol;
+#X text 49 356 This object can act as its own send or receive object.
+;
+#X obj 41 391 bng 15 250 50 0 link_this_bang empty This_one_sends_a_bang
+17 8 0 10 -262144 -1 -1;
+#X obj 41 412 bng 15 250 50 0 empty link_this_bang This_one_receives_it.
+17 8 0 10 -262144 -1 -1;
+#X text 232 370 Here is the alternative method.;
+#X text 26 447 5 GUI Options;
+#X text 49 469 The other properties are 'name' \, 'x/y offset' \, 'font
+size' \, and colours (for the background \, front \, and labels [name])
+;
+#X text 48 275 The default hold is 250 milliseconds. The hold value
+controls the length of time that the bng object stays "lit". Note that
+bng sends its message immediately regardless of the hold value.;
+#X obj 233 436 s linked_bngs;
+#X obj 338 389 r linked_bngs;
+#X text 22 105 2 Interrupt (milliseconds);
+#X text 48 119 If the bng object is "lit" and holding (see "hold" below)
+\, then receives another message before the hold time has passed \,
+the bng will quickly flash again for the duration you set in this interrupt
+property.;
+#X obj 24 203 bng 15 1000 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 47 187 This bng will hold for 1000 milliseconds \, but interrupt
+for 50 milliseconds if it gets a second message during its "hold".
+Click it once...wait. Then click it multiple times rather quickly to
+see the effect.;
+#X obj 233 413 bang;
+#X obj 338 413 bang;
+#X msg 233 389 send a message;
+#X text 18 510 This document was updated for Pd version 0.35 test 24
+by Dave Sabine as part of a project called pddp proposed by Krzysztof
+Czaja to build comprehensive documentation for Pd.;
+#X obj 338 439 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [bng] Properties;
+#X connect 17 0 23 0;
+#X connect 22 0 16 0;
+#X connect 23 0 26 0;
+#X connect 24 0 22 0;
+#X restore 101 556 pd bng_properties;
+#X text 80 463 14;
+#X text 215 551 (c) musil@iem.kug.ac.at;
+#X text 257 564 IEM KUG;
+#X text 232 576 graz \, austria 2002;
+#X text 168 418 - [bng] only outputs a bang message.;
+#X text 168 308 - [bng] outputs a bang message in response to any message
+that has not been defined to affect gui-properties (see below).;
+#X text 98 346 See the following subpatch for messages that change
+the gui-properties of [bng]:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 15 0 14 0;
+#X connect 17 0 18 0;
+#X connect 18 0 16 0;
+#X connect 18 0 15 0;
+#X connect 19 0 18 0;
+#X connect 20 0 18 0;
+#X connect 21 0 18 0;
+#X connect 22 0 18 0;
+#X connect 23 0 18 0;
+#X connect 25 0 27 0;
+#X connect 26 0 24 0;
+#X connect 28 0 18 0;
diff --git a/doc/pddp/bonk~-help.pd b/doc/pddp/bonk~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c2266bf082121e4270ec409e4c5268acd034953f
--- /dev/null
+++ b/doc/pddp/bonk~-help.pd
@@ -0,0 +1,285 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header bonk~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 235 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 208 227 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS signal analysis;
+#X text 12 45 DESCRIPTION an attack detector for small percussion instruments
+;
+#X text 12 75 INLET_0 signal thresh minvel mask bang debug print debounce
+learn forget write read;
+#X text 12 105 OUTLET_0 list;
+#X text 12 125 OUTLET_1 list;
+#X text 12 205 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 300 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 460 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 559 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 244 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 45 491 428 101 Related_objects 0;
+#X obj 21 42 env~;
+#X obj 59 42 threshold~;
+#X obj 135 42 fiddle~;
+#X obj 191 42 sigmund~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [bonk~] Related Objects;
+#X restore 100 597 pd Related_objects;
+#X obj 78 308 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 483 3 bonk~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/bonk~ -text
+pdpedia: bonk~;
+#X obj 234 135 spigot;
+#X obj 151 79 bonk~;
+#X obj 151 135 spigot;
+#X obj 200 136 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 283 136 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 234 165 print cooked;
+#X obj 151 165 print raw;
+#X text 47 133 enable printout:;
+#X obj 234 109 s bonk-cooked;
+#N canvas 36 80 458 532 Messenges_to_bonk~ 0;
+#X msg 11 222 bang;
+#X msg 11 355 learn 1;
+#X msg 11 401 learn 0;
+#X msg 11 276 print;
+#X msg 11 378 learn 10;
+#X msg 11 30 thresh 6 50;
+#X msg 11 180 mask 4 0.7;
+#X msg 11 121 minvel 10;
+#X msg 11 252 debug 0;
+#X obj 11 509 outlet;
+#X obj -1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 6 1 Sending Messages to [bonk~];
+#X msg 11 424 forget;
+#X msg 11 457 write templates.txt;
+#X msg 11 484 read templates.txt;
+#X msg 11 330 debounce 0;
+#X obj 0 300 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 6 300 Messages for Managing Templates;
+#X text 94 179 - describes how energy in each frequency band masks
+later energy in the band. Here the masking is total for 4 analysis
+periods and then drops by 0.7 each period.;
+#X text 72 221 - poll the current spectrum via "raw" outlet \, You
+can set a very high threshold if you don't want attacks mixed in.;
+#X text 72 252 - turn debugging on or off.;
+#X text 72 276 - print out all settings and templates.;
+#X text 92 330 - minimum time (msec) between attacks in learn mode
+;
+#X text 92 355 - forget all templates and start learning new ones.
+The argument gives the number of times you will hit each instrument
+(10 recommended.) Turn on the output volume above for audible feedback
+as you train Bonk. "Learn 0" exits learn mode.;
+#X text 92 423 - forget the last template. In Learn mode \, use "forget"
+to erase and record over a template.;
+#X text 136 457 - write templates to a file in text-editable format.
+;
+#X text 136 484 - read templates from a file.;
+#N canvas 49 297 428 101 minvel_units 0;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [bonk~] What units are used for "minvel"?;
+#X text 17 36 "minvel" is in the units of the velocity output \, which
+is the sum of the square roots of the amplitudes of the bands \, normalized
+so that 100 is an attack of amplitude about one.;
+#X restore 97 154 pd minvel_units;
+#N canvas 56 241 428 102 thresh_units 0;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [bonk~] What units are used for "thresh"?;
+#X text 17 36 "thresh" is in "growth" units \, which is the sum of
+the proportional growth in the 11 filter bands. Proportional growth
+is essentially the logarithmic time derivative.;
+#X restore 97 96 pd thresh_units;
+#X text 94 29 - set low and high thresholds. Signal growth must exceed
+the high one and then fall to the low one to make an attack. The unit
+is the sum of the proportional growth in the 11 filter bands. Proportional
+growth is essentially the logarithmic time derivative. (See subpatch
+below for units.);
+#X text 95 121 - minimum "velocity" to output (quieter notes are ignored).
+(See subpatch below for units.);
+#X connect 0 0 9 0;
+#X connect 1 0 9 0;
+#X connect 2 0 9 0;
+#X connect 3 0 9 0;
+#X connect 4 0 9 0;
+#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 12 0 9 0;
+#X connect 13 0 9 0;
+#X connect 14 0 9 0;
+#X connect 15 0 9 0;
+#X restore 151 52 pd Messenges_to_bonk~;
+#N canvas 122 160 428 404 synth 0;
+#X obj 92 44 r bonk-cooked;
+#X obj 92 69 unpack;
+#X obj 92 119 * 12;
+#X obj 92 144 div 7;
+#X obj 92 94 + 1;
+#X obj 92 194 mtof;
+#X obj 92 244 osc~;
+#X obj 92 269 cos~;
+#X obj 92 169 + 47;
+#X obj 189 267 line~;
+#X obj 189 292 *~;
+#X obj 189 317 lop~ 500;
+#X obj 92 294 *~;
+#X obj 83 381 dac~;
+#X obj 233 185 dbtorms;
+#X obj 233 135 * 0.5;
+#X obj 233 160 + 50;
+#X obj 191 209 f;
+#X msg 153 179 bang;
+#X obj 238 103 inlet;
+#X obj 91 327 hip~ 5;
+#X msg 14 44 0 60;
+#X obj 92 219 sig~;
+#X msg 189 242 \$1 \, 0 200;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [bonk~] Demo Synthesizer;
+#X connect 0 0 1 0;
+#X connect 1 0 4 0;
+#X connect 2 0 3 0;
+#X connect 3 0 8 0;
+#X connect 4 0 2 0;
+#X connect 5 0 18 0;
+#X connect 5 0 22 0;
+#X connect 6 0 7 0;
+#X connect 7 0 12 0;
+#X connect 8 0 5 0;
+#X connect 9 0 10 0;
+#X connect 9 0 10 1;
+#X connect 10 0 11 0;
+#X connect 11 0 12 1;
+#X connect 12 0 20 0;
+#X connect 14 0 17 1;
+#X connect 15 0 16 0;
+#X connect 16 0 14 0;
+#X connect 17 0 23 0;
+#X connect 18 0 17 0;
+#X connect 19 0 15 0;
+#X connect 20 0 13 1;
+#X connect 20 0 13 0;
+#X connect 21 0 1 0;
+#X connect 22 0 6 0;
+#X connect 23 0 9 0;
+#X restore 359 145 pd synth;
+#X floatatom 359 122 0 0 0 0 - - -;
+#X msg 359 89 0;
+#X msg 390 89 90;
+#X text 392 108 output volume;
+#X text 406 123 (0-100);
+#X obj 78 350 cnv 17 3 100 empty \$0-pddp.cnv.let.0 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 308 list;
+#X text 98 350 list;
+#X text 147 187 In this patch \, after starting DSP \, you can print
+out the raw or cooked output using the two "spigots" or listen to a
+synthesizer output by raising its volume.;
+#X text 11 23 an attack detector for small percussion instruments;
+#X obj 114 52 adc~;
+#N canvas 96 417 428 145 more_info 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 10 33 The [bonk~] object takes an audio signal input and looks
+for "attacks" defined as sharp changes in the spectral envelope of
+the incoming sound. Optionally \, and less reliably \, you can have
+[bonk~] check the attack against a collection of stored templates to
+try to guess which of two or more instruments was hit. [bonk~] is described
+theoretically in the 1998 ICMC proceedings \, reprinted on crca.ucsd.edu/~msp
+.;
+#X text 7 1 [bonk~] More Info;
+#X restore 100 568 pd more_info;
+#X text 80 478 0-7;
+#X text 98 244 signal;
+#X text 168 244 - the incoming signal to analyize.;
+#X text 98 264 For all other messages see the the subpatch titled "Messenges_to_bonk~"
+in the example above.;
+#X text 168 308 - the raw spectrum of the attack \, provided as a list
+of 11 numbers giving the signal "loudness" in the 11 frequency bands
+used.;
+#X text 169 477 By default [bonk~]'s analysis is carried out on a 256-point
+window (6 msec at 44.1 kHz) and the analysis period is 128 samples.
+These and other parameters may be overridden using creation arguments
+as shown in the subpatch below:;
+#N canvas 29 64 507 520 creation_arguments 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 15 250 -npts 256;
+#X text 15 270 -hop 128;
+#X text 15 290 -nfilters 11;
+#X text 15 310 -halftones 6;
+#X text 15 430 -overlap 1;
+#X text 18 483 -firstbin 1;
+#X text 15 370 -minbandwidth 1.5;
+#X text 16 135 All frequency parameters are specified in 'bins'. One
+bin is the sample rate divided by the window size. The minimum possible
+bandwidth is 1.5 bins. Higher bandwidths give numerically more robust
+outputs.;
+#X text 17 37 [bonk~] uses a filterbank whose center frequencies are
+spaced equally at low frequencies and proportionally at high ones -
+i.e. \, they increase linearly \, then exponentially. They are determined
+by the filters' bandwidths and overlap. The bandwidths are specified
+proportionally to frequency but bounded below by a specified minimum.
+;
+#X text 7 2 [bonk~] Creation Arguments;
+#X text 16 202 Below are the creation arguments and their default values.
+Notice that all are specified as (flag \, value) pairs which may be
+given in any order:;
+#X text 137 248 - window size in points.;
+#X text 136 268 - analysis period ("hop size") in points.;
+#X text 137 288 - number of filters to use.;
+#X text 136 309 - desired bandwidth of filters in halftones \, effective
+in the exponentially spaced region. (At lower center frequencies the
+bandwidth is supported by the "minbandwidth" parameter below).;
+#X text 136 370 - minimum bandwidth in bins. If the bandwidth specified
+by "halftones" is smaller than this \, this value is used. This must
+be at least 1.5.;
+#X text 135 430 - overlap factor between filters. If 1 \, the filters
+are spaced to line up at their half-power points. Other values specify
+more or fewer filters proportionally.;
+#X text 135 483 - center frequency \, in bins \, of the lowest filter.
+The others are computed from this.;
+#X restore 100 534 pd creation_arguments;
+#X text 168 350 - the "cooked" output which gives an instrument number
+(counting up from zero) \, a "velocity" \, and a "brightness" value
+(the balancing point of the loudness distribution over the filter bank--
+nominally 11 filters). This "velocity" is the sum of the square roots
+of the amplitudes of the bands \, normalized so that 100 is an attack
+of amplitude of about 1 . The instrument number is significant only
+if [bonk~] has a "template set" in memory.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 12 0 17 0;
+#X connect 13 0 14 0;
+#X connect 13 1 12 0;
+#X connect 13 1 20 0;
+#X connect 14 0 18 0;
+#X connect 15 0 14 1;
+#X connect 16 0 12 1;
+#X connect 21 0 13 0;
+#X connect 23 0 22 0;
+#X connect 24 0 23 0;
+#X connect 25 0 23 0;
+#X connect 33 0 13 0;
diff --git a/doc/pddp/bp~-help.pd b/doc/pddp/bp~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9bcc4e621c0ebb010ac3a2aadb1474cf3dc0ae62
--- /dev/null
+++ b/doc/pddp/bp~-help.pd
@@ -0,0 +1,89 @@
+#N canvas 0 0 555 619 10;
+#X obj -1 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj -1 0 cnv 15 552 40 empty \$0-pddp.cnv.header bp~ 3 12 0 18 -204280
+-1 0;
+#X obj -1 364 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 246 494 367 META 0;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Updated for Pd version-0.30. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 145 LIBRARY internal;
+#X text 12 45 DESCRIPTION bandpass filter;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_1 float;
+#X text 12 105 INLET_2 float;
+#X text 12 125 OUTLET_0 signal;
+#X text 12 205 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj -1 472 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj -1 509 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj -1 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8
+12 0 13 -228856 -1 0;
+#X obj 78 373 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 73 487 428 102 Related_objects 0;
+#X obj 21 42 vcf~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [bp~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 481 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 492 3 bp~;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/bp~ -text
+pdpedia: bp~;
+#X obj 137 208 env~;
+#X floatatom 137 228 0 0 0 0 - - -;
+#X floatatom 166 138 0 0 0 0 - - -;
+#X obj 78 208 env~;
+#X floatatom 78 229 0 0 0 0 - - -;
+#X floatatom 78 68 0 0 0 0 - - -;
+#X obj 78 91 osc~ 100;
+#X msg 138 115 clear;
+#X obj 138 186 bp~ 100 10;
+#X text 78 258 Compare the amplitude of the original signal on the
+left with the amplitude of the filtered signal on the right.;
+#X floatatom 195 162 0 0 0 0 - - -;
+#X text 98 372 signal;
+#X obj 78 416 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 392 clear;
+#X text 98 415 float;
+#X obj 78 444 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 float;
+#X text 98 481 signal;
+#X text 11 23 bandpass filter;
+#X text 168 392 - reinitialize internal state.;
+#X text 168 415 - center frequency.;
+#X text 168 445 - Q.;
+#X text 170 528 - center frequency.;
+#X text 170 544 - Q.;
+#X text 80 528 1) float;
+#X text 80 544 2) float;
+#X text 185 209 [env~] gives the amplitude of the signal envelop in
+dB.;
+#X text 75 297 [bp~] passes a sinusoid at the center frequency at unit
+gain (approximately). Other frequencies are attenuated.;
+#X text 123 66 <- scroll to change input frequency;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/H07.measure.spectrum.pd
+-text doc/3.audio.examples/H07.measure.spectrum.pd;
+#X connect 12 0 13 0;
+#X connect 14 0 20 1;
+#X connect 15 0 16 0;
+#X connect 17 0 18 0;
+#X connect 18 0 15 0;
+#X connect 18 0 20 0;
+#X connect 19 0 20 0;
+#X connect 20 0 12 0;
+#X connect 22 0 20 2;
diff --git a/doc/pddp/canvas-help.pd b/doc/pddp/canvas-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6adc12934724dabd3fc7bf9ea48207b1425a2fc5
--- /dev/null
+++ b/doc/pddp/canvas-help.pd
@@ -0,0 +1,86 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (canvas) 3 12 0
+18 -204280 -1 0;
+#X obj 0 293 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 280 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 25 KEYWORDS signal;
+#X text 12 65 DESCRIPTION Pure Data document window;
+#X text 12 5 NAME pd table graph;
+#X text 12 145 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 508 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 556 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 1 (canvas) Related Objects;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X restore 22 42 pd;
+#X obj 52 42 table;
+#X restore 102 598 pd Related_objects;
+#X obj 78 302 cnv 17 3 85 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 328 3 (This help patch itself is a canvas);
+#X obj 451 20 pddp/pddplink http://wiki.puredata.info/en/canvas -text
+pdpedia: canvas;
+#X obj 101 560 pddp/pddplink all_about_canvas_properties.pd -text all_about_canvas_properties
+;
+#X text 72 56 This help patch is associated with several related objects:
+;
+#X text 73 142 4) root canvas (i.e. \, pd document);
+#X text 93 157 Also known simply as a "patch" \, a canvas is a window
+that contains a list of pd objects. A canvas can either be a root canvas--
+created from the "File" menu by choosing "new"-- or a subcanvas (like
+one of the objects listed above).;
+#X text 98 301 anything;
+#X obj 377 76 pddp/pddplink pd-help.pd -text See pd-help;
+#X text 73 76 1) [pd] - subcanvas \, a.k.a. subpatch or subwindow.
+;
+#X text 73 98 2) [table] - array of numbers.;
+#X obj 257 98 pddp/pddplink table-help.pd -text See table-help;
+#X text 73 120 3) graph (available from the "Put" menu).;
+#X obj 322 120 pddp/pddplink graph-help.pd -text See graph-help;
+#X text 62 122 *;
+#X text 62 229 * If you're new to Pd \, it's easy to get graphs mixed
+up with garrays (i.e. \, "Array" from the "Put" menu). For help on
+garrays \, click below:;
+#X obj 170 328 pddp/pddplink inlet-help.pd -text inlet-help;
+#X text 98 347 signal;
+#X obj 170 374 pddp/pddplink inlet~-help.pd -text inlet~-help;
+#X obj 0 398 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 78 407 cnv 17 3 90 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 406 anything;
+#X obj 170 433 pddp/pddplink outlet-help.pd -text outlet-help;
+#X text 98 453 signal;
+#X obj 170 480 pddp/pddplink outlet~-help.pd -text outlet~-help;
+#X text 168 453 - outlets for signals can be created by using [outlet~]
+objects on the canvas. See the links below for more details:;
+#X text 168 347 - inlets for signals can be created by using [inlet~]
+objects on the canvas. See the links below for more details:;
+#X text 98 512 (5);
+#X text 168 512 - canvas arguments are 5 floats which are not directly
+accessible: topLeftX topLeftY canvasWidth canvasHeight fontSize.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 101 575 pddp/pddplink ../3.audio.examples/G05.execution.order.pd
+-text doc/3.audio.examples/G05.execution.order.pd;
+#X text 11 23 Pure Data document window;
+#X text 168 301 - control inlets can be created by using [inlet] objects
+on the canvas. See the links below for more details:;
+#X text 168 406 - control outlets can be created by using [outlet]
+objects on the canvas. See the links below for more details:;
+#X obj 62 270 pddp/pddplink array-help.pd -text Help patch for "Put"
+menu array;
diff --git a/doc/pddp/catch~-help.pd b/doc/pddp/catch~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..00c086499985bef696b00566ee1a8748bd0a76fc
--- /dev/null
+++ b/doc/pddp/catch~-help.pd
@@ -0,0 +1,81 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header catch~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 423 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 243 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal nonlocal;
+#X text 12 45 DESCRIPTION summing signal bus and nonlocal connection
+;
+#X text 12 65 OUTLET_0 signal;
+#X text 12 145 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 451 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 493 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 93 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 72 43 send~;
+#X obj 119 43 receive~;
+#X obj 181 43 inlet~;
+#X obj 231 43 outlet~;
+#X obj 22 43 throw~;
+#X text 8 2 [catch~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 460 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 224 268 0 0 0 0 - - -;
+#X obj 73 243 sig~ 50;
+#X obj 224 243 snapshot~;
+#X obj 73 149 sig~ 25;
+#X obj 267 193 loadbang;
+#X obj 267 218 metro 200;
+#X floatatom 358 268 0 0 0 0 - - -;
+#X obj 358 243 snapshot~;
+#X msg 89 172 set signal2;
+#X msg 90 196 set signal1;
+#X text 98 459 signal;
+#X text 98 427 (none);
+#X text 11 23 summing signal bus and non-local connection;
+#X text 67 99 Any number of [throw~] objects can add into one [catch~]
+object (but two [catch~] objects cannot share the same name.);
+#X text 71 295 You can redirect [throw~] via a "set" message.;
+#X text 79 510 1) symbol atom;
+#X text 168 459 - the outgoing signal is the sum of all signals coming
+from [throw~] objects that share the same name as this [catch~].;
+#X text 168 510 - [catch~] takes one argument-- a symbol atom-- as
+its name. Other [throw~] objects may have the same name \, but there
+may be no other [catch~] objects that shares this name.;
+#X obj 474 3 catch~;
+#X obj 448 20 pddp/pddplink http://wiki.puredata.info/en/catch~ -text
+pdpedia: catch~;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 224 168 catch~ signal1;
+#X obj 358 168 catch~ signal2;
+#X obj 73 220 throw~ signal1;
+#X obj 73 268 throw~ signal1;
+#X connect 10 0 34 0;
+#X connect 11 0 9 0;
+#X connect 12 0 33 0;
+#X connect 13 0 14 0;
+#X connect 14 0 11 0;
+#X connect 14 0 16 0;
+#X connect 16 0 15 0;
+#X connect 17 0 33 0;
+#X connect 18 0 33 0;
+#X connect 31 0 11 0;
+#X connect 32 0 16 0;
diff --git a/doc/pddp/change-help.pd b/doc/pddp/change-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7eaa2171cdae996a4a2b18fd61f0bb0fe92c9366
--- /dev/null
+++ b/doc/pddp/change-help.pd
@@ -0,0 +1,103 @@
+#N canvas 0 0 555 619 10;
+#X obj -1 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj -1 0 cnv 15 552 40 empty \$0-pddp.cnv.header change 3 12 0 18
+-204280 -1 0;
+#X obj -1 337 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 247 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.35 test 26 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control filter;
+#X text 12 45 DESCRIPTION eliminate redundancy in a number stream;
+#X text 12 65 INLET_0 float bang set;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj -1 481 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj -1 524 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj -1 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8
+12 0 13 -228856 -1 0;
+#X obj 78 346 cnv 17 3 125 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 74 489 428 104 Related_objects 0;
+#X obj 15 31 spigot;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [change] Related Objects;
+#X obj 65 31 select;
+#X restore 101 597 pd Related_objects;
+#X obj 78 490 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 483 3 change;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/change -text
+pdpedia: change;
+#X msg 22 108 1;
+#X msg 50 108 1;
+#X msg 79 108 1;
+#X msg 112 107 0;
+#X text 20 90 Click from left to right...;
+#X obj 22 139 change;
+#X obj 22 160 print;
+#X text 61 161 watch the console;
+#X obj 22 218 change 6.5;
+#X obj 22 241 print;
+#X msg 22 189 6.5;
+#X msg 52 189 5.5;
+#X msg 88 190 bang;
+#X text 93 218 creation argument;
+#X text 98 345 bang;
+#X text 98 375 float;
+#X text 98 405 list;
+#X text 98 444 set;
+#X floatatom 210 271 0 0 0 0 - - -;
+#X floatatom 210 182 0 0 0 0 - - -;
+#X floatatom 248 198 0 0 0 0 - - -;
+#X msg 248 220 set \$1;
+#X text 293 220 set the value;
+#X text 247 179 if different from current value \, output and set;
+#X obj 210 292 print;
+#X obj 210 249 change;
+#X text 206 147 The "set" method can be used to store a number in the
+object without outputting that value.;
+#X text 98 490 float;
+#X text 11 23 eliminate redundancy in a number stream;
+#X text 167 543 - (optional) a number to specify the initial value.
+;
+#X text 168 345 - sending a bang message to the inlet will force [change]
+to output its current value.;
+#X text 168 375 - a float will be output only if it differs from the
+previous value of [change].;
+#X text 168 405 - lists will be truncated and the first element will
+be output only if it differs from the previous value of [change].;
+#X text 168 490 - if the incoming float was different than the previous
+value \, it will be sent to the outlet.;
+#X text 80 543 1) float;
+#X text 168 444 "set" followed by a value (e.g. \, "set 12") will set
+the value of [change] without outputting it.;
+#X text 18 59 The change object passes its input to the outlet only
+when it changes.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 12 0 17 0;
+#X connect 13 0 17 0;
+#X connect 14 0 17 0;
+#X connect 15 0 17 0;
+#X connect 17 0 18 0;
+#X connect 20 0 21 0;
+#X connect 22 0 20 0;
+#X connect 23 0 20 0;
+#X connect 24 0 20 0;
+#X connect 30 0 36 0;
+#X connect 31 0 37 0;
+#X connect 32 0 33 0;
+#X connect 33 0 37 0;
+#X connect 37 0 30 0;
diff --git a/doc/pddp/choice-help.pd b/doc/pddp/choice-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0ccdfa09b1e9b3fb332ddcb6dd563e544d7bf497
--- /dev/null
+++ b/doc/pddp/choice-help.pd
@@ -0,0 +1,107 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header choice 3 12 0 18
+-204280 -1 0;
+#X obj 0 288 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 247 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version-0.30. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION search for a best match to an incoming list
+;
+#X text 12 65 INLET_0 list add clear print;
+#X text 12 85 OUTLET_0 float;
+#X text 12 5 KEYWORDS control storage analysis list_op;
+#X text 12 165 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 383 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 448 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 512 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 297 cnv 17 3 75 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 103 479 428 110 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [choice] Related Objects;
+#X obj 21 41 list;
+#X restore 101 597 pd Related_objects;
+#X obj 78 391 cnv 17 3 50 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 391 float;
+#X obj 484 3 choice;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/choice -text
+pdpedia: choice;
+#X obj 98 210 choice;
+#X msg 136 101 print;
+#X msg 124 78 clear;
+#X msg 98 54 add 1 0 0 \, add 0 1 0 \, add 0 0 1 \, add 1 1 1 \, add
+1 1 0;
+#X obj 174 186 pack 0 0 0;
+#X floatatom 279 140 0 0 0 0 - - -;
+#X floatatom 245 140 0 0 0 0 - - -;
+#X floatatom 212 140 0 0 0 0 - - -;
+#X obj 174 162 f;
+#X msg 174 140 bang;
+#X floatatom 98 231 0 0 0 0 - - -;
+#X obj 174 211 choice 1;
+#X floatatom 174 232 0 0 0 0 - - -;
+#X text 166 119 tweak the numbers and hit "bang" to input a list;
+#X text 98 296 list;
+#X text 98 323 add;
+#X text 98 340 clear;
+#X text 98 357 print;
+#X text 168 391 - [choice] outputs the index of the best match \, counting
+from zero. The quality of the match is the dot product of the two vectors
+after normalizing them \, i.e. \, the vector whose direction is closest
+to that of the input wins.;
+#X text 98 516 You can use numbers other than 0 and 1 to indicate relative
+strengths of the attributes \, or even use negative numbers to indicate
+opposites \, either in the incoming lists or in the stored ones.;
+#N canvas 92 415 428 146 More_about_choice 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [choice] More Info;
+#X text 19 36 You can use [choice] to choose interactively between
+a number of behaviors depending on their attributes. For example \,
+you might have stored a number of melodies \, of which some are syncopated
+\, some chromatic \, some are more than 100 years old \, some are bugle
+calls \, and some are Christmas carols. You could then ask to find
+a syncopated bugle call (1 \, 0 \, 0 \, 1 \, 0) and you'll get the
+thing most closely matching the request.;
+#X restore 101 571 pd More_about_choice;
+#X text 11 23 search for a best match to an incoming list;
+#X text 168 296 - when sent a list of numbers \, [choice] will output
+the index of the known vector that matches most closely.;
+#X text 168 323 - add vectors.;
+#X text 168 340 - delete all stored vectors.;
+#X text 168 357 - debugging printout.;
+#X text 80 467 1) float;
+#X text 97 255 The [choice] object holds a list of vectors \, each
+having up to ten elements.;
+#X text 168 467 - (optional) if given a nonzero creation argument \,
+[choice] tries to avoid repetitious outputs by weighting less recently
+output vectors preferentially.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 13 0 23 0;
+#X connect 14 0 13 0;
+#X connect 15 0 13 0;
+#X connect 15 0 24 0;
+#X connect 16 0 13 0;
+#X connect 16 0 24 0;
+#X connect 17 0 13 0;
+#X connect 17 0 24 0;
+#X connect 18 0 17 2;
+#X connect 19 0 17 1;
+#X connect 20 0 21 1;
+#X connect 21 0 17 0;
+#X connect 22 0 21 0;
+#X connect 24 0 25 0;
diff --git a/doc/pddp/clip-help.pd b/doc/pddp/clip-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8fa4b8ad02b2ba6fb6fdbbaee80c5aac01689f23
--- /dev/null
+++ b/doc/pddp/clip-help.pd
@@ -0,0 +1,142 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header clip 3 12 0 18 -204280
+-1 0;
+#X obj 0 297 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 243 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Dave Sabine \, April 25 \, 2003 Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control filter;
+#X text 12 45 DESCRIPTION force a number to lie between two limits
+;
+#X text 12 65 INLET_0 float list;
+#X text 12 125 OUTLET_0 float;
+#X text 12 85 INLET_1 float;
+#X text 12 105 INLET_2 float;
+#X text 12 205 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 415 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 458 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 533 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 306 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 46 488 428 102 Related_objects 0;
+#X obj 234 43 int;
+#X obj 274 42 f;
+#X obj 22 42 min;
+#X obj 65 42 max;
+#X obj 105 42 clip~;
+#X obj 149 42 min~;
+#X obj 191 42 max~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [clip] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 424 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 362 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 361 float;
+#X obj 78 387 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 386 float;
+#X obj 487 3 clip;
+#X obj 460 20 pddp/pddplink http://wiki.puredata.info/en/clip -text
+pdpedia: clip;
+#X obj 306 179 clip -50 50;
+#X floatatom 306 205 5 0 0 0 - - -;
+#X floatatom 306 141 5 0 0 0 - - -;
+#X text 383 177 creation arguments;
+#X obj 128 179 clip;
+#X floatatom 138 140 5 0 0 0 - - -;
+#X floatatom 181 140 5 0 0 0 - - -;
+#X floatatom 224 140 5 0 0 0 - - -;
+#X floatatom 128 205 5 0 0 0 - - -;
+#X text 171 179 no arguments;
+#X text 205 108 list;
+#X msg 128 108 42 100 500;
+#X text 98 305 float;
+#X text 168 305 - a float at the left inlet will be clipped to the
+low and high values stored in the object.;
+#X text 98 424 float;
+#N canvas 102 355 428 206 clip_vs_min_and_max 0;
+#X text 10 70 Consider the following:;
+#X floatatom 50 96 5 0 0 0 - - -;
+#X floatatom 50 177 5 0 0 0 - - -;
+#X obj 50 151 min 50;
+#X obj 50 125 max -50;
+#X text 137 136 same as;
+#X obj 257 148 clip -50 50;
+#X floatatom 257 177 5 0 0 0 - - -;
+#X text 10 37 [clip] is a tool which combines the functionality of
+[min] and [max] into a single object.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [clip] Relationship between [clip] and [min] \, [max];
+#X connect 1 0 4 0;
+#X connect 1 0 6 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 6 0 7 0;
+#X restore 101 567 pd clip_vs_min_and_max;
+#N canvas 99 243 428 294 low_and_high_values 0;
+#X text 35 32 [clip] always assumes that the first argument (second
+inlet) is the low extreme of the range and the second argument (third
+inlet) is the high extreme. However \, strange behaviour should be
+expected if you mix these arguments up.;
+#X obj 43 155 clip -50 50;
+#X obj 169 149 clip 72 -104;
+#X floatatom 43 122 5 0 0 0 - - -;
+#X floatatom 43 184 5 0 0 0 - - -;
+#X floatatom 169 181 5 0 0 0 - - -;
+#X text 174 104 Numbers below 72 are clipped to 72;
+#X text 174 124 Numbers above -104 are clipped to -104;
+#X floatatom 311 258 5 0 0 0 - - -;
+#X obj 311 214 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 311 236 clip 1 -1024;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [clip] Low and High Values;
+#X text 114 238 This could be used effectively;
+#X text 114 253 to toggle between two numbers.;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 1 0;
+#X connect 3 0 2 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X restore 101 542 pd low_and_high_values;
+#X text 11 23 force a number to lie between two limits;
+#X text 168 424 - outputs a float which is limited to a range within
+the high and low values of the middle and last inlet.;
+#X text 167 477 - (optional) initial minimum value beyond which to
+clip the signal.;
+#X text 167 502 - (optional) initial maximum value beyond which to
+clip the signal.;
+#X text 80 477 1) float;
+#X text 80 502 2) float;
+#X text 168 386 - maximum value beyond which the incoming signal is
+clipped.;
+#X text 168 361 - minimum value beyond which the incoming signal is
+clipped.;
+#X text 98 335 list;
+#X text 168 335 - a list is distributed to the inlets of [clip].;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 16 0 17 0;
+#X connect 18 0 16 0;
+#X connect 20 0 24 0;
+#X connect 21 0 20 0;
+#X connect 22 0 20 1;
+#X connect 23 0 20 2;
+#X connect 27 0 20 0;
diff --git a/doc/pddp/clip~-help.pd b/doc/pddp/clip~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b994bf9da2c87c90b86e30ec098a122da530a750
--- /dev/null
+++ b/doc/pddp/clip~-help.pd
@@ -0,0 +1,91 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header clip~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 357 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 245 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION restrict a signal to lie between two limits
+;
+#X text 12 125 OUTLET_0 signal;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_1 float;
+#X text 12 105 INLET_2 float;
+#X text 12 205 RELEASE_DATE 2009;
+#X restore 500 597 pd META;
+#X obj 0 449 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 486 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 366 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 69 480 428 108 Related_objects 0;
+#X obj 23 36 min~;
+#X obj 70 36 max~;
+#X obj 118 36 clip;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [clip~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 98 365 signal;
+#X obj 78 458 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 458 signal;
+#X obj 486 3 clip~;
+#X obj 460 20 pddp/pddplink http://wiki.puredata.info/en/clip~ -text
+pdpedia: clip~;
+#X obj 41 177 clip~ -0.5 0.5;
+#X obj 41 117 osc~ 1000;
+#X obj 57 226 metro 500;
+#X text 209 149 inlets to reset clip range;
+#X floatatom 101 149 4 0 0 0 - - -;
+#X floatatom 162 150 4 0 0 0 - - -;
+#X text 176 177 creation arguments initialize clip range;
+#X text 183 250 <- graph the output;
+#X obj 78 396 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 395 float;
+#X obj 78 421 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 420 float;
+#X obj 57 203 loadbang;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 100 float 0;
+#X coords 0 1 100 -1 200 100 1 0 0;
+#X restore 343 238 graph;
+#X text 11 23 restrict a signal to lie between two limits;
+#X text 168 365 - an incoming signal at the left inlet will be clipped
+to lie between the two limits.;
+#X text 168 458 - outputs the clipped signal.;
+#X text 168 505 - (optional) initial minimum value beyond which to
+clip the signal.;
+#X text 168 535 - (optional) initial maximum value beyond which to
+clip the signal.;
+#X text 80 505 1) float;
+#X text 80 535 2) float;
+#X text 81 67 The [clip~] object passes its signal input to its output
+\, clipping it to lie between two limits.;
+#X text 168 395 - minimum value below which the incoming signal is
+clipped.;
+#X text 168 420 - maximum value above which the incoming signal is
+clipped.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 41 250 tabwrite~ \$0-array;
+#X connect 14 0 40 0;
+#X connect 15 0 14 0;
+#X connect 16 0 40 0;
+#X connect 18 0 14 1;
+#X connect 19 0 14 2;
+#X connect 26 0 16 0;
diff --git a/doc/pddp/closebang-abs.pd b/doc/pddp/closebang-abs.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3f3aec1b45b652a8e2a7951f5bc48edbc9762d94
--- /dev/null
+++ b/doc/pddp/closebang-abs.pd
@@ -0,0 +1,9 @@
+#N canvas 73 329 428 119 10;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheader empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [closebang-abs] Abstraction used in [closebang] help patch
+;
+#X text 19 37 This abstraction gets used in closebang-help.pd.;
+#X obj 22 62 closebang;
+#X obj 22 89 s from-closebang-abs;
+#X connect 3 0 4 0;
diff --git a/doc/pddp/closebang-help.pd b/doc/pddp/closebang-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0ad5c4b624c0b0039456caf9cf8bf593ae71467a
--- /dev/null
+++ b/doc/pddp/closebang-help.pd
@@ -0,0 +1,59 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header closebang 3 12 0
+18 -204280 -1 0;
+#X obj 0 456 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 245 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR IOhannes m zmölnig;
+#X text 12 105 WEBSITE;
+#X text 12 5 KEYWORDS control;
+#X text 12 65 OUTLET_0 bang;
+#X text 12 125 RELEASE_DATE 2006;
+#X text 12 145 HELP_PATCH_AUTHORS IOhannes m zmoelnig. Jonathan Wilkes
+revised the patch to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION send a beng when abstraction is closed;
+#X restore 500 597 pd META;
+#X obj 0 484 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 76 487 428 102 Related_objects 0;
+#X obj 25 42 initbang;
+#X obj 86 42 loadbang;
+#X obj 150 42 bang;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [closebang] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 493 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 460 3 closebang;
+#X text 99 460 (none);
+#X text 98 493 bang;
+#X text 100 570 Pd Documentation Chapter 3.6 - doc/1.manual/x3.htm
+;
+#X obj 430 20 pddp/pddplink http://wiki.puredata.info/en/closebang
+-text pdpedia: closebang;
+#X text 99 542 (none);
+#X text 11 23 send a bang when abstraction is closed;
+#X obj 112 236 r from-closebang-abs;
+#X obj 112 262 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 167 493 - a "bang" message is sent automatically when the containing
+patch is closed. It is only triggered when the patch is an embedded
+object in another patch.;
+#X obj 112 133 closebang-abs;
+#X text 109 158 Above is an abstraction that contains a [closebang]
+object connected to [send from-closebang-abs]. If you select the subpatch
+above in editmode and delete it \, the [closebang] object contained
+within will send a bang to the [receive] object below:;
+#X text 207 133 <- delete me;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 16 0 17 0;
diff --git a/doc/pddp/complex-mod~-help.pd b/doc/pddp/complex-mod~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b126c2b91241185de6acb82af58724d7fe6797ae
--- /dev/null
+++ b/doc/pddp/complex-mod~-help.pd
@@ -0,0 +1,95 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header complex-mod~ 3 12
+0 18 -204280 -1 0;
+#X obj 0 376 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 44 250 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION complex modulator;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_1 signal;
+#X text 12 105 INLET_2 float signal;
+#X text 12 125 OUTLET_0 signal;
+#X text 12 205 RELEASE_DATE 2009;
+#X text 12 5 KEYWORDS signal abstraction;
+#X restore 500 597 pd META;
+#X obj 0 480 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 542 (none);
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 hilbert~;
+#X text 8 2 [complex_mod~] Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 79 385 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 79 489 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 79 409 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 408 float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 453 3 complex-mod~;
+#X text 11 23 complex modulator;
+#X floatatom 78 64 0 0 0 0 - - -;
+#X obj 78 194 complex-mod~;
+#X obj 78 92 phasor~ 440;
+#X obj 78 123 cos~;
+#X obj 113 146 cos~;
+#X obj 113 122 -~ 0.25;
+#X floatatom 147 169 0 0 0 0 - - -;
+#X text 140 212 right outlet;
+#X text 142 228 gives the other;
+#X text 140 244 sideband;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-mod-output 882 float 0;
+#X coords 0 1 882 -1 300 170 1 0 0;
+#X restore 244 127 graph;
+#X text 98 384 signal;
+#X obj 79 434 cnv 17 3 35 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 433 float;
+#X obj 79 511 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 168 384 - real part of a complex valued signal.;
+#X text 167 408 - imaginary part of a complex valued signal.;
+#X text 167 433 - ???;
+#X text 167 453 - ???;
+#X text 98 453 signal;
+#X text 98 308 The complex modulator takes two signals in which it
+considers to be the real and imaginary part of a complex-valued signal.
+It then does a complex multiplication by a sinusoud to shift all frequencies
+up or down by any frequency shift in Hz.;
+#X text 98 488 signal;
+#X text 168 488 - ???;
+#X text 98 510 signal;
+#X text 168 510 - ???;
+#X obj 455 51 pddp/dsp;
+#X obj 416 20 pddp/pddplink http://wiki.puredata.info/en/complex-mod~
+-text pdpedia: complex-mod~;
+#X obj 79 269 tabwrite~ \$0-mod-output;
+#X obj 39 222 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X connect 16 0 18 0;
+#X connect 17 0 43 0;
+#X connect 18 0 19 0;
+#X connect 18 0 21 0;
+#X connect 19 0 17 0;
+#X connect 20 0 17 1;
+#X connect 21 0 20 0;
+#X connect 22 0 17 2;
+#X connect 44 0 43 0;
diff --git a/doc/pddp/cos-help.pd b/doc/pddp/cos-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0f68332ae3bb8b862ab49c50d111651dc93265c1
--- /dev/null
+++ b/doc/pddp/cos-help.pd
@@ -0,0 +1,93 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header cos 3 12 0 18 -204280
+-1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 39 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control trigonometry;
+#X text 12 45 DESCRIPTION cosine function;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 543 (none);
+#N canvas 46 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 48 42 tan;
+#X obj 75 42 atan;
+#X obj 108 42 atan2;
+#X obj 148 42 exp;
+#X obj 176 42 log;
+#X obj 203 42 abs;
+#X obj 231 42 sqrt;
+#X obj 266 42 pow;
+#X obj 56 75 cos~;
+#X obj 88 75 osc~;
+#X obj 22 75 expr;
+#X obj 22 42 sin;
+#X text 7 1 [cos] Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 78 446 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 float;
+#X text 98 465 list;
+#X text 98 510 float;
+#X obj 78 511 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 396 190 0 0 0 0 - - -;
+#X floatatom 303 191 0 0 0 0 - - -;
+#X obj 210 156 sin;
+#X floatatom 87 111 0 0 0 0 - - -;
+#X floatatom 210 190 0 0 0 0 - - -;
+#X obj 87 151 * 6.28319;
+#X obj 87 131 / 360;
+#X obj 303 157 cos;
+#X obj 396 156 tan;
+#X text 150 151 2 x Pi;
+#X floatatom 87 171 0 0 0 0 - - -;
+#X text 150 171 Radian;
+#X obj 87 191 s radians;
+#X obj 210 130 r radians;
+#X text 84 228 Trigonometry functions take input in Radians. To find
+a radian \, simply divide a number by 360 (to make it a fraction of
+a circle) and multiply it by 2(Pi) where Pi is equal to approximately
+3.14159265.;
+#X text 83 333 [tan] will produce a number which represents the tangent
+of an angle.;
+#X text 83 289 [sin] and [cos] will return numbers between -1 and 1:
+the sine and cosine of a number repectively.;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/cos -text
+pdpedia: cos;
+#X obj 492 3 cos;
+#X text 11 23 cosine function;
+#X text 168 467 - a list will be truncated \, and the first element
+will be used as input.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 16 0 18 0;
+#X connect 17 0 20 0;
+#X connect 19 0 24 0;
+#X connect 20 0 19 0;
+#X connect 21 0 15 0;
+#X connect 22 0 14 0;
+#X connect 24 0 26 0;
+#X connect 27 0 16 0;
+#X connect 27 0 21 0;
+#X connect 27 0 22 0;
diff --git a/doc/pddp/cos~-help.pd b/doc/pddp/cos~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..eed43f2738fd523324a4cc98178508298a548801
--- /dev/null
+++ b/doc/pddp/cos~-help.pd
@@ -0,0 +1,142 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header cos~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 440 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 48 247 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.41. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal trigonometry;
+#X text 12 45 DESCRIPTION cosine waveshaper;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 598 pd META;
+#X obj 0 477 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 532 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 560 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 105 486 428 103 Related_objects 0;
+#X obj 19 33 osc~;
+#X obj 68 33 tabread4~;
+#X obj 138 33 phasor~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [cos~] Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 78 486 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 449 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 449 signal;
+#X text 98 486 signal;
+#X text 158 486 - [cos~] outputs the cosine of two pi times its signal
+input. So -1 \, 0 \, 1 and 2 give 1 out \, 0.5 gives -1 \, and so on.
+;
+#X text 98 536 (none);
+#X obj 486 3 cos~;
+#X obj 460 20 pddp/pddplink http://wiki.puredata.info/en/cos~ -text
+pdpedia: cos~;
+#X obj 131 240 cos~;
+#X obj 131 289 snapshot~;
+#X obj 131 192 sig~;
+#X floatatom 131 315 7 0 0 0 - - -;
+#X obj 131 165 * 0.01;
+#X floatatom 131 138 0 0 0 0 - - -;
+#X obj 198 255 metro 500;
+#X obj 198 229 r metro;
+#X text 194 165 Divide by 100;
+#X text 179 193 convert to audio;
+#X text 186 140 <-- Scroll to set input value;
+#X text 205 315 <-- output of the cos~ object;
+#X obj 459 127 loadbang;
+#X obj 459 151 s metro;
+#N canvas 107 147 428 410 cos~_vs_osc~ 0;
+#X obj 63 164 cos~;
+#X obj 63 136 phasor~;
+#X text 16 146 this:;
+#X text 165 139 is the same;
+#X text 166 158 as this:;
+#X obj 251 140 osc~;
+#X text 18 28 ( from audio tutorial E08.phase.mod.pd );
+#X obj 111 206 tgl 20 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 136 206 click to visualize;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array cos~-array1 100 float 3;
+#A 0 -0.753024 -0.792766 -0.829394 -0.862767 -0.892751 -0.919226 -0.94208
+-0.961235 -0.976614 -0.988159 -0.995823 -0.999576 -0.999404 -0.995308
+-0.987303 -0.975405 -0.959676 -0.94018 -0.916991 -0.890202 -0.859916
+-0.826254 -0.789346 -0.749339 -0.70638 -0.660644 -0.612314 -0.561581
+-0.508642 -0.453706 -0.396988 -0.33871 -0.279102 -0.218395 -0.156829
+-0.0946478 -0.0320953 0.0305825 0.0931407 0.155333 0.216916 0.277648
+0.337288 0.3956 0.452358 0.507339 0.560328 0.611116 0.659504 0.705303
+0.748333 0.788423 0.825405 0.859146 0.889513 0.916386 0.939661 0.959246
+0.975064 0.987053 0.995167 0.999358 0.999623 0.995963 0.988392 0.97694
+0.961651 0.942586 0.91982 0.893441 0.863544 0.830252 0.793699 0.75403
+0.7114 0.665977 0.617938 0.567472 0.514777 0.460057 0.403526 0.345411
+0.28594 0.225346 0.163868 0.101745 0.0392234 -0.0234532 -0.0860385
+-0.148284 -0.209948 -0.270786 -0.33056 -0.389036 -0.445985 -0.501182
+-0.554412 -0.605466 -0.654132 -0.700229;
+#X coords 0 1 99 -1 100 60 1;
+#X restore 64 328 graph;
+#X obj 64 278 tabwrite~ cos~-array1;
+#X msg 63 70 440;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array osc~-array1 100 float 3;
+#A 0 0.779374 0.738588 0.694902 0.648488 0.599526 0.548211 0.494742
+0.43933 0.382189 0.323544 0.263629 0.202679 0.140933 0.0786344 0.0160266
+-0.0466445 -0.109133 -0.171193 -0.232579 -0.293051 -0.352371 -0.410307
+-0.466632 -0.521125 -0.573571 -0.623766 -0.671511 -0.71661 -0.758893
+-0.798196 -0.834364 -0.867255 -0.896741 -0.922705 -0.945047 -0.963677
+-0.978512 -0.9895 -0.996602 -0.99979 -0.999052 -0.994391 -0.985825
+-0.973388 -0.957129 -0.937102 -0.913388 -0.886088 -0.855309 -0.82117
+-0.783807 -0.743366 -0.700006 -0.653896 -0.605216 -0.554151 -0.500911
+-0.445704 -0.388748 -0.330265 -0.270485 -0.209642 -0.147975 -0.085727
+-0.0231406 0.0395359 0.102057 0.164176 0.225651 0.28624 0.345705 0.403812
+0.460335 0.515044 0.567729 0.618184 0.66621 0.711621 0.754237 0.793891
+0.830428 0.863704 0.893581 0.919942 0.942691 0.961737 0.977007 0.98844
+0.995992 0.999633 0.999348 0.995134 0.987001 0.974993 0.959156 0.939553
+0.91626 0.889369 0.858986 0.825229;
+#X coords 0 1 99 -1 100 60 1;
+#X restore 250 328 graph;
+#X floatatom 63 101 5 0 0 0 - - -;
+#X obj 250 278 tabwrite~ osc~-array1;
+#X obj 111 236 metro 250;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [cos~] What's the difference between [cos~] and [osc~]?
+;
+#X text 18 48 [phasor~] and [cos~] together are equivalent to [osc~]
+;
+#X connect 0 0 10 0;
+#X connect 1 0 0 0;
+#X connect 5 0 14 0;
+#X connect 7 0 15 0;
+#X connect 11 0 13 0;
+#X connect 13 0 1 0;
+#X connect 13 0 5 0;
+#X connect 15 0 10 0;
+#X connect 15 0 14 0;
+#X restore 102 568 pd cos~_vs_osc~;
+#X text 11 23 cosine waveshaper;
+#X obj 4 598 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 16 0 17 0;
+#X connect 17 0 19 0;
+#X connect 17 0 19 0;
+#X connect 18 0 16 0;
+#X connect 20 0 18 0;
+#X connect 21 0 20 0;
+#X connect 22 0 17 0;
+#X connect 23 0 22 0;
+#X connect 28 0 29 0;
diff --git a/doc/pddp/cpole~-help.pd b/doc/pddp/cpole~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f8083ed52cc2862a28aee60b2c798a206a0d45b7
--- /dev/null
+++ b/doc/pddp/cpole~-help.pd
@@ -0,0 +1,190 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header cpole~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 287 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 39 245 494 405 META 0;
+#X text 12 185 LIBRARY internal;
+#X text 12 225 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 205 AUTHOR Miller Puckette;
+#X text 12 265 HELP_PATCH_AUTHORS Updated for Pd version-0.38. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION complex one-pole (recursive) filter \, raw
+;
+#X text 12 65 INLET_0 signal;
+#X text 12 145 OUTLET_0 signal;
+#X text 12 85 INLET_1 signal;
+#X text 12 105 INLET_2 signal;
+#X text 12 125 INLET_3 signal;
+#X text 12 165 OUTLET_1 signal;
+#X text 12 245 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 424 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 486 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 543 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 27 280 428 309 Related_objects 0;
+#X obj 74 60 rzero~;
+#X obj 25 80 cpole~;
+#X obj 25 60 rpole~;
+#X obj 123 60 rzero_rev~;
+#X obj 74 80 czero~;
+#X obj 123 80 czero_rev~;
+#X text 201 60 real;
+#X text 200 81 complex;
+#X text 22 44 1-pole;
+#X text 71 44 1-zero;
+#X text 121 44 1-zero \, reversed;
+#X text 47 29 summary of raw filters:;
+#X text 18 184 User-friendly Filters;
+#X obj 21 213 lop~;
+#X obj 72 212 hip~;
+#X obj 124 213 bp~;
+#X obj 169 214 vcf~;
+#X obj 22 274 biquad~;
+#X text 18 250 Other Objects;
+#X text 18 113 Pd also provides a suite of user-friendly filters. This
+and other raw filters are provided for situations which the user-friendly
+ones can't handle. See Chapter 8 of http://crca.ucsd.edu/~msp/techniques
+for an introduction to the necessary theory.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [cpole~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 433 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 296 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 296 signal;
+#X text 98 433 signal;
+#X obj 478 3 cpole~;
+#X obj 450 20 pddp/pddplink http://wiki.puredata.info/en/cpole~ -text
+pdpedia: cpole~;
+#X obj 57 132 osc~ 100;
+#X msg 65 155 clear;
+#X obj 84 199 sig~;
+#X obj 121 200 sig~;
+#X obj 158 200 sig~;
+#X obj 56 230 cpole~ 0.9 0.4;
+#X msg 67 177 set 0.6 0.8;
+#X text 203 181 where y[n] is the output \, x[n] the input \, and a[n]
+the filter coefficient (all complex numbers). The filter is unstable
+if/when |a[n]|>1.;
+#X text 203 223 The transfer function is H(Z) = 1/(1 - aZ^-1).;
+#N canvas 45 205 428 355 test 0;
+#X obj 66 88 osc~;
+#X floatatom 66 65 5 0 0 0 - - -;
+#X obj 8 297 env~ 16384;
+#X floatatom 8 321 5 0 0 0 - - -;
+#X obj 94 117 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 66 115 *~;
+#X msg 75 142 set 1;
+#X floatatom 340 122 4 -1000 1000 0 - - -;
+#X obj 205 325 dac~;
+#X obj 205 289 *~;
+#X text 70 28 Stuff to test it:;
+#X obj 231 116 cos~;
+#X obj 67 237 cpole~;
+#X obj 251 75 phasor~;
+#X floatatom 251 54 5 0 0 0 - - -;
+#X floatatom 122 65 5 0 0 0 - - -;
+#X obj 150 117 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 122 115 *~;
+#X obj 122 88 phasor~;
+#X floatatom 314 52 5 0 0 0 - - -;
+#X obj 314 75 / 1000;
+#X obj 264 117 -~ 0.25;
+#X obj 264 139 cos~;
+#X obj 340 141 / 1000;
+#X obj 230 167 *~;
+#X obj 264 167 *~;
+#X obj 84 297 env~ 16384;
+#X floatatom 84 321 5 0 0 0 - - -;
+#X obj 237 285 dbtorms;
+#X floatatom 238 265 5 0 0 0 - - -;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [cpole~] Test;
+#X connect 0 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 1;
+#X connect 5 0 12 0;
+#X connect 6 0 12 0;
+#X connect 7 0 23 0;
+#X connect 9 0 8 0;
+#X connect 9 0 8 1;
+#X connect 11 0 24 0;
+#X connect 12 0 2 0;
+#X connect 12 0 9 0;
+#X connect 12 1 26 0;
+#X connect 13 0 21 0;
+#X connect 13 0 11 0;
+#X connect 14 0 13 0;
+#X connect 15 0 18 0;
+#X connect 16 0 17 1;
+#X connect 17 0 12 0;
+#X connect 18 0 17 0;
+#X connect 19 0 20 0;
+#X connect 20 0 13 1;
+#X connect 21 0 22 0;
+#X connect 22 0 25 0;
+#X connect 23 0 25 1;
+#X connect 23 0 24 1;
+#X connect 24 0 12 2;
+#X connect 25 0 12 3;
+#X connect 26 0 27 0;
+#X connect 28 0 9 1;
+#X connect 29 0 28 0;
+#X restore 102 552 pd test;
+#X text 98 311 clear;
+#X text 98 326 set;
+#X obj 78 346 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 346 signal;
+#X obj 78 371 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 371 signal;
+#X obj 78 396 cnv 17 3 17 empty \$0-pddp.cnv.let.3 3 5 9 0 16 -228856
+-162280 0;
+#X obj 78 458 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 458 signal;
+#X text 11 23 complex one-pole (recursive) filter \, raw;
+#X text 98 396 signal;
+#X text 168 296 - signal to filter (real part).;
+#X text 168 311 - clear internal state to zero.;
+#X text 168 326 - set internal state (real & imaginary parts).;
+#X text 168 346 - signal to filter ( imaginary part ).;
+#X text 168 371 - filter coefficient ( real part ).;
+#X text 168 396 - filter coefficient ( imaginary part ).;
+#X text 169 504 - (optional) coefficient (real).;
+#X text 169 519 - (optional) coefficient (imaginary).;
+#X text 80 504 1) float;
+#X text 80 519 2) float;
+#X text 202 134 The action of [cpole~] is:;
+#X text 85 68 [cpole~] filters a complex audio signal (first two inlets)
+via a one-pole filter \, whose coefficients are controlled by creation
+arguments or by another complex audio signal (remaining two inlets).
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 102 572 pddp/pddplink ../3.audio.examples/H12.peaking.pd -text
+doc/3.audio.examples/H12.peaking.pd;
+#X text 208 160 y[n] = x[n] + a[n] * y[n-1];
+#X connect 14 0 19 0;
+#X connect 15 0 19 0;
+#X connect 16 0 19 1;
+#X connect 17 0 19 2;
+#X connect 18 0 19 3;
+#X connect 20 0 19 0;
diff --git a/doc/pddp/cputime-help.pd b/doc/pddp/cputime-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8f912a186cf17cfc87bd92f736ea51e2ba82b701
--- /dev/null
+++ b/doc/pddp/cputime-help.pd
@@ -0,0 +1,169 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header cputime 3 12 0 18
+-204280 -1 0;
+#X obj 0 333 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 242 494 360 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control time;
+#X text 12 45 DESCRIPTION measure CPU time;
+#X text 12 65 INLET_0 bang;
+#X text 12 85 INLET_1 bang;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 407 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 450 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 478 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 342 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 454 (none);
+#X text 98 416 float;
+#N canvas 48 338 428 252 Related_objects 0;
+#X obj 125 35 metro;
+#X obj 62 35 realtime;
+#X obj 14 36 timer;
+#X obj 173 35 delay;
+#X text 11 170 The best places to find information about Pd's libraries
+is:;
+#X text 8 192 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 10 207 or;
+#X text 10 222 iem.kug.ac.at/pdb/;
+#X text 12 121 This object is only offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 11 71 Externals;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [cputime] Related Objects;
+#X obj 11 91 pddp/helplink iemlib/t3_timer;
+#X restore 102 597 pd Related_objects;
+#X obj 471 3 cputime;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/cputime -text
+pdpedia: cputime;
+#X msg 122 156 bang;
+#X msg 83 134 bang;
+#X floatatom 83 200 0 0 0 0 - - -;
+#X text 155 202 Output is in milliseconds;
+#X text 118 134 Click here to start or reset;
+#X text 78 57 The [cputime] object measures elapsed CPU time. CPU time
+is the amount of time your computer's CPU requires to perform a task
+-- that's a short definition.;
+#X obj 83 178 cputime;
+#X text 160 157 Click here to get elapsed CPU time. Click again...and
+again...to see periodic measurements from the start or reset time.
+Be patient.;
+#X obj 78 374 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 373 bang;
+#X text 168 416 - the elapsed time in milliseconds arrives at the outlet
+when the right inlet receives a bang.;
+#X text 80 264 NOTE: Unlike most other objects in Pd \, the right inlet
+of [cputime] is the hot one (i.e. \, a bang to it triggers the output).
+;
+#N canvas 70 46 428 538 Time_Measurements 0;
+#X obj 30 395 time_measurements;
+#X obj 30 291 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 30 437 0 0 0 0 - - -;
+#X floatatom 116 436 0 0 0 0 - - -;
+#X floatatom 183 436 0 0 0 0 - - -;
+#X text 27 208 In the example below \, I've created an abstraction
+which will force each of Pd's stop-watches \, [timer] [cputime] and
+[realtime] to measure various processes and report the elapsed time.
+Click on each [bng] to begin the process and wait for the results.
+Notice the discrepancies in the results.;
+#X text 28 455 Logical Time;
+#X text 181 455 Real Time;
+#X text 115 455 CPU Time;
+#X obj 45 327 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 50 285 1 Measures elapsed time between two "bangs" from a [trigger]
+object.;
+#X text 65 319 2 Measures the amount of time Pd requires to turn on
+DSP and start an oscillator.;
+#X obj 89 359 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 27 487 This document was updated for Pd version 0.35 test 28
+by Dave Sabine as part of a project called pddp proposed by Krzysztof
+Czaja to build comprehensive documentation for Pd.;
+#X text 110 351 3 Measures the amount of time Pd requires count to
+three...please wait for approximately 3 seconds.;
+#X text 27 35 [cputime] works like essentially like a stop-watch. Once
+it starts \, you can continue to "poll" [cputime] to view the elapsed
+time.;
+#X text 27 82 The odd aspect about comparing [cputime] to a stop-watch
+is that a stop-watch can be stopped! [cputime] can only be started
+or reset. It cannot be stopped.;
+#X text 26 132 As stated above \, [cputime] measures "CPU" time. This
+value may be slightly different than "logical" time or "real" time.
+PD offers two objects which measure "logical" time and "real" time.
+See the reference documents for those objects for more information.
+;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [cputime] Time Measurements;
+#X connect 0 0 2 0;
+#X connect 0 1 3 0;
+#X connect 0 2 4 0;
+#X connect 1 0 0 0;
+#X connect 9 0 0 1;
+#X connect 12 0 0 2;
+#X restore 102 511 pd Time_Measurements;
+#N canvas 70 77 428 430 Time_Objects 0;
+#X text 21 37 In a fantasy world \, computers could exist somehow beyond
+the restrictions of time and digital computation could be performed
+in ZERO time. However \, that is not the case. Instead \, every process
+within Pd and within your operating system requires at least a few
+nanoseconds of your CPU's time.;
+#X text 22 122 The [timer] object is like a clock that is not constrained
+to the regular laws of physics and the universal space-time continuum.
+It reports "time" measurements as only Pd can see them!;
+#X text 23 181 The [cputime] object is like a clock that measures how
+much time your CPU actually required to carry out your request. Keep
+in mind however that your CPU is busy doing many things simoultaneously
+\, so even though a process might take 5 minutes to complete \, your
+CPU does not pay full attention to that process for the entire 5 minutes.
+Instead \, it simply begins the process \, then refers back to that
+process from time to time until the it is complete. In other cases
+\, your CPU might require a full 5 minutes while Pd might report that
+merely a few milliseconds have passed. This type of discrepancy depends
+heavily on your computer's hardware and the type of processing it is
+performing.;
+#X text 24 350 The [realtime] object is as much like your own wrist
+watch as Pd can possibly manage. It measures time according to your
+operating system's internal clock.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [cputime] Why the Discrepencies Between Clocks?;
+#X restore 102 486 pd Time_Objects;
+#X obj 78 416 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 11 23 measure CPU time;
+#X text 98 341 bang;
+#X text 168 341 - an initial bang to the left inlet starts the timer.
+Subsequent bangs reset the timer.;
+#X text 168 373 - a bang to the right inlet causes the elapsed time
+to be output (in milliseconds).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 101 531 For a patch that uses [cputime] see:;
+#X obj 98 551 pddp/pddplink ../7.stuff/tools/load-meter.pd;
+#X text 101 571 (also accessible from the "Media" menu);
+#X connect 13 0 19 1;
+#X connect 14 0 19 0;
+#X connect 19 0 15 0;
diff --git a/doc/pddp/ctlin-help.pd b/doc/pddp/ctlin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a421fc183bb43bc70479d2993f16378e8a958f32
--- /dev/null
+++ b/doc/pddp/ctlin-help.pd
@@ -0,0 +1,124 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header ctlin 3 12 0 18
+-204280 -1 0;
+#X obj 0 301 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 358 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION read incoming Control Change messages;
+#X text 12 85 OUTLET_1 float;
+#X text 12 65 OUTLET_0 float;
+#X text 12 105 OUTLET_n float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 329 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 462 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 337 float;
+#N canvas 50 160 441 439 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [ctlin] Related Objects;
+#X obj 75 79 ctlin;
+#X obj 25 106 pgmin;
+#X obj 25 79 bendin;
+#X obj 205 106 touchin;
+#X obj 69 106 polytouchin;
+#X obj 119 79 midiin;
+#X obj 149 106 sysexin;
+#X obj 183 166 noteout;
+#X obj 25 166 bendout;
+#X obj 161 193 touchout;
+#X obj 75 193 polytouchout;
+#X obj 127 166 midiout;
+#X obj 25 193 pgmout;
+#X obj 25 248 makenote;
+#X text 22 225 MIDI note construction:;
+#X text 22 139 MIDI output:;
+#X text 22 56 MIDI input:;
+#X obj 185 248 stripnote;
+#X obj 169 79 notein;
+#X text 182 225 MIDI note deconstruction:;
+#X obj 25 32 ctlout;
+#X text 22 290 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 21 369 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 22 271 Externals;
+#X obj 22 320 pddp/helplink maxlib/pitch;
+#X obj 22 335 pddp/helplink maxlib/score;
+#X obj 22 350 pddp/helplink maxlib/chord;
+#X obj 22 385 pddp/helplink cyclone/midiformat;
+#X obj 22 400 pddp/helplink cyclone/midiparse;
+#X obj 22 415 pddp/helplink cyclone/midiflush;
+#X restore 101 597 pd Related_objects;
+#X obj 483 3 ctlin;
+#X text 109 66 The [ctlin] object reads control change messages directly
+from the MIDI port. See a MIDI-specification chart near you for control
+change message numbers and their meannings (MIDI implementation documents
+are freely available on the internet in c=various forms).;
+#X text 98 305 (none);
+#X obj 78 338 cnv 17 3 17 empty \$0-pddp.cnv.let.1 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 362 float;
+#X obj 78 363 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 387 float;
+#X obj 78 388 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X obj 24 69 ctlin;
+#X floatatom 24 133 5 0 0 0 - - -;
+#X floatatom 37 112 5 0 0 0 - - -;
+#X floatatom 51 91 5 0 0 0 - - -;
+#X text 168 305 - [ctlin] reads data directly from the MIDI port;
+#X obj 120 136 ctlin 64;
+#X floatatom 120 177 5 0 0 0 - - -;
+#X floatatom 165 161 5 0 0 0 - - -;
+#X text 187 134 Process only controller no. 64 on all channels;
+#X text 103 193 ctl. value;
+#X text 172 176 Chan. no.;
+#X obj 116 223 ctlin 64 1;
+#X text 193 224 Process only controller 64 on channel 1;
+#X floatatom 116 249 5 0 0 0 - - -;
+#X text 113 264 ctl. value;
+#X obj 362 570 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 100 570 for an explanation of MIDI usage in Pd see:;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/ctlin -text
+pdpedia: ctlin;
+#X text 11 23 read incoming Control Change messages;
+#X text 168 481 - (optional) controller number to process. If no arguments
+are present [ctlin] reads all controller data on all channels.;
+#X text 168 521 - (optional) channel number on which the controller
+is to be processed. If the second argument is absent [ctlin] reads
+all channels.;
+#X text 168 406 If only one argument is given \, [ctlin] provides the
+user with only 2 outlets: ctl. value and channel no. If 2 arguments
+are given (ctl. no. & chan. no.) only one outlet (ctl. value) is given.
+;
+#X text 168 337 - controller value.;
+#X text 168 362 - controller number.;
+#X text 168 387 - channel number.;
+#X text 80 481 1) float;
+#X text 80 521 2) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 17 0 18 0;
+#X connect 17 1 19 0;
+#X connect 17 2 20 0;
+#X connect 22 0 23 0;
+#X connect 22 1 24 0;
+#X connect 28 0 30 0;
diff --git a/doc/pddp/ctlout-help.pd b/doc/pddp/ctlout-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c25da93dcfb18eb8d47d2d772f3d4ea4d9823715
--- /dev/null
+++ b/doc/pddp/ctlout-help.pd
@@ -0,0 +1,127 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header ctlout 3 12 0 18
+-204280 -1 0;
+#X obj 0 353 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 29 246 494 362 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION send MIDI control messages to the MIDI port
+;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 OUTLET_0 float;
+#X text 12 105 OUTLET_1 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 471 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 361 float;
+#N canvas 43 183 441 412 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [ctlout] Related Objects;
+#X obj 23 32 ctlin;
+#X obj 216 79 pgmin;
+#X obj 23 79 bendin;
+#X obj 78 106 touchin;
+#X obj 260 79 polytouchin;
+#X obj 117 79 midiin;
+#X obj 22 106 sysexin;
+#X obj 178 166 noteout;
+#X obj 75 166 ctlout;
+#X obj 23 166 bendout;
+#X obj 365 166 touchout;
+#X obj 279 166 polytouchout;
+#X obj 122 166 midiout;
+#X obj 230 166 pgmout;
+#X obj 23 220 makenote;
+#X text 20 197 MIDI note construction:;
+#X text 20 139 MIDI output:;
+#X text 20 56 MIDI input:;
+#X obj 183 220 stripnote;
+#X obj 167 79 notein;
+#X text 180 197 MIDI note deconstruction:;
+#X text 19 263 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 18 342 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 19 244 Externals;
+#X obj 19 293 pddp/helplink maxlib/pitch;
+#X obj 19 308 pddp/helplink maxlib/score;
+#X obj 19 323 pddp/helplink maxlib/chord;
+#X obj 19 358 pddp/helplink cyclone/midiformat;
+#X obj 19 373 pddp/helplink cyclone/midiparse;
+#X obj 19 388 pddp/helplink cyclone/midiflush;
+#X restore 101 597 pd Related_objects;
+#X text 98 475 (none);
+#X obj 78 362 cnv 17 3 45 empty \$0-pddp.cnv.let.1 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 417 float;
+#X obj 78 418 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 442 float;
+#X obj 78 443 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X obj 362 571 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 100 571 for an explanation of MIDI usage in Pd see:;
+#X obj 483 3 ctlout;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/ctlout -text
+pdpedia: ctlout;
+#X floatatom 42 114 5 0 0 0 - - -;
+#X obj 42 180 ctlout;
+#X floatatom 58 135 5 0 0 0 - - -;
+#X floatatom 75 156 5 0 0 0 - - -;
+#X text 131 110 The [ctlout] objects sends control messages to the
+MIDI port. See a MIDI specification chart for various controller numbers/values
+descriptions.;
+#X text 98 381 list;
+#X obj 129 236 ctlout;
+#X obj 221 236 ctlout 64;
+#X obj 323 236 ctlout 64 2;
+#X obj 422 225 ctlout;
+#X msg 145 212 64;
+#X msg 176 213 2;
+#X msg 422 203 67 64 2;
+#X floatatom 323 192 5 0 0 0 - - -;
+#X floatatom 221 191 5 0 0 0 - - -;
+#X floatatom 129 191 5 0 0 0 - - -;
+#X msg 272 213 2;
+#X text 128 259 All these examples will transmit control no 64 on channel
+2 (remember to click the message boxes to initialize).;
+#X text 11 23 send MIDI control messages to the MIDI port;
+#X text 168 533 - (optional) channel number to transmit on. If the
+second argument is left off \, [ctlout] transmits on channel 1 .;
+#X text 168 361 - (int) control value (0-127).;
+#X text 168 417 - (int) controller number.;
+#X text 168 442 - (int) channel number.;
+#X text 168 475 - [ctlin] transmits directly to the MIDI port.;
+#X text 168 518 - (optional) controller number to transmit to.;
+#X text 80 518 1) float;
+#X text 80 533 2) float;
+#X text 168 381 - a list to the left inlet is distributed among the
+inlets of [ctlout].;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 19 0 20 0;
+#X connect 21 0 20 1;
+#X connect 22 0 20 2;
+#X connect 29 0 25 1;
+#X connect 30 0 25 2;
+#X connect 31 0 28 0;
+#X connect 32 0 27 0;
+#X connect 33 0 26 0;
+#X connect 34 0 25 0;
+#X connect 35 0 26 2;
diff --git a/doc/pddp/czero_rev~-help.pd b/doc/pddp/czero_rev~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..14dd612d51082b8ff0d8a472c164d4e1629680cd
--- /dev/null
+++ b/doc/pddp/czero_rev~-help.pd
@@ -0,0 +1,207 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header czero_rev~ 3 12
+0 18 -204280 -1 0;
+#X obj 0 303 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 228 494 384 META 0;
+#X text 12 195 LIBRARY internal;
+#X text 12 235 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 215 AUTHOR Miller Puckette;
+#X text 12 275 HELP_PATCH_AUTHORS Updated for Pd version-0.38. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 75 INLET_0 signal set clear;
+#X text 12 95 INLET_1 signal;
+#X text 12 115 INLET_2 signal;
+#X text 12 135 INLET_3 signal;
+#X text 12 155 OUTLET_0 signal;
+#X text 12 175 OUTLET_1 signal;
+#X text 12 255 RELEASE_DATE 1997;
+#X text 12 45 DESCRIPTION complex one-zero (non-recursive) "reverse"
+filter \, raw;
+#X restore 500 597 pd META;
+#X obj 0 440 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 559 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 41 281 428 309 Related_objects 0;
+#X obj 74 60 rzero~;
+#X obj 25 80 cpole~;
+#X obj 25 60 rpole~;
+#X obj 123 60 rzero_rev~;
+#X obj 74 80 czero~;
+#X obj 123 80 czero_rev~;
+#X text 201 60 real;
+#X text 200 81 complex;
+#X text 22 44 1-pole;
+#X text 71 44 1-zero;
+#X text 121 44 1-zero \, reversed;
+#X text 47 29 summary of raw filters:;
+#X text 19 184 User-friendly Filters;
+#X obj 22 213 lop~;
+#X obj 73 212 hip~;
+#X obj 125 213 bp~;
+#X obj 170 214 vcf~;
+#X obj 23 274 biquad~;
+#X text 19 250 Other Objects;
+#X text 19 113 Pd also provides a suite of user-friendly filters. This
+and other raw filters are provided for situations which the user-friendly
+ones can't handle. See Chapter 8 of http://crca.ucsd.edu/~msp/techniques
+for an introduction to the necessary theory.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [czero_rev~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 449 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 312 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 312 signal;
+#X text 98 449 signal;
+#N canvas 3 174 550 380 test 0;
+#X obj 152 296 env~ 16384;
+#X floatatom 152 320 5 0 0 0 - - -;
+#X floatatom 499 76 4 -1000 1000 0 - - -;
+#X obj 349 324 dac~;
+#X obj 349 288 *~;
+#X obj 390 70 cos~;
+#X floatatom 298 8 5 0 0 0 - - -;
+#X obj 298 31 phasor~;
+#X floatatom 398 14 5 0 0 0 - - -;
+#X obj 397 39 / 1000;
+#X obj 423 71 -~ 0.25;
+#X obj 423 93 cos~;
+#X obj 499 95 / 1000;
+#X obj 389 121 *~;
+#X obj 423 121 *~;
+#X obj 228 296 env~ 16384;
+#X floatatom 228 320 5 0 0 0 - - -;
+#X obj 381 284 dbtorms;
+#X floatatom 382 264 5 0 0 0 - - -;
+#X obj 117 89 phasor~;
+#X floatatom 115 60 5 0 0 0 - - -;
+#X text 77 13 Stuff to test it:;
+#X obj 131 149 cpole~;
+#X obj 241 262 *~ -1;
+#X obj 21 261 env~ 16384;
+#X floatatom 21 285 5 0 0 0 - - -;
+#X obj 50 312 env~ 16384;
+#X floatatom 50 336 5 0 0 0 - - -;
+#X obj 138 181 cpole~;
+#X obj 146 216 czero_rev~;
+#X obj 154 264 czero_rev~;
+#X msg 204 103 clear;
+#X obj 262 50 cos~;
+#X obj 261 83 *~ 0.02;
+#X obj 193 50 sig~ 1.1;
+#X obj 448 296 *~;
+#X connect 0 0 1 0;
+#X connect 2 0 12 0;
+#X connect 4 0 3 0;
+#X connect 5 0 13 0;
+#X connect 6 0 7 0;
+#X connect 7 0 32 0;
+#X connect 8 0 9 0;
+#X connect 9 0 7 1;
+#X connect 10 0 11 0;
+#X connect 11 0 14 0;
+#X connect 12 0 14 1;
+#X connect 12 0 13 1;
+#X connect 13 0 22 2;
+#X connect 13 0 28 2;
+#X connect 13 0 29 2;
+#X connect 13 0 30 2;
+#X connect 14 0 22 3;
+#X connect 14 0 23 0;
+#X connect 14 0 29 3;
+#X connect 15 0 16 0;
+#X connect 17 0 4 1;
+#X connect 17 0 35 1;
+#X connect 18 0 17 0;
+#X connect 19 0 22 0;
+#X connect 19 0 24 0;
+#X connect 19 0 35 0;
+#X connect 20 0 19 0;
+#X connect 22 0 28 0;
+#X connect 22 1 28 1;
+#X connect 23 0 28 3;
+#X connect 23 0 30 3;
+#X connect 24 0 25 0;
+#X connect 26 0 27 0;
+#X connect 28 0 26 0;
+#X connect 28 0 29 0;
+#X connect 28 1 29 1;
+#X connect 29 0 30 0;
+#X connect 29 1 30 1;
+#X connect 30 0 0 0;
+#X connect 30 0 4 0;
+#X connect 30 1 15 0;
+#X connect 31 0 22 0;
+#X connect 31 0 28 0;
+#X connect 32 0 33 0;
+#X connect 33 0 5 0;
+#X connect 33 0 10 0;
+#X connect 34 0 33 0;
+#X connect 35 0 3 1;
+#X restore 101 568 pd test;
+#X text 98 327 clear;
+#X text 98 342 set;
+#X obj 78 362 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 362 signal;
+#X obj 78 387 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 387 signal;
+#X obj 78 412 cnv 17 3 17 empty \$0-pddp.cnv.let.3 3 5 9 0 16 -228856
+-162280 0;
+#X text 98 412 signal;
+#X obj 78 474 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 474 signal;
+#X obj 460 3 czero_rev~;
+#X obj 430 20 pddp/pddplink http://wiki.puredata.info/en/czero_rev~
+-text pdpedia: czero_rev~;
+#X text 198 196 where y[n] is the output \, x[n] the input \, and a[n]
+the filter coefficient (all complex numbers). The filter is always
+stable.;
+#X text 261 176 y[n] = - a[n] * x[n] + x[n-1];
+#X text 199 245 The transfer function is H(Z) = -a + Z^-1.;
+#X obj 52 127 osc~ 100;
+#X msg 60 152 clear;
+#X obj 86 203 sig~;
+#X obj 120 225 sig~;
+#X obj 156 245 sig~;
+#X msg 67 178 set 0.6 0.8;
+#X obj 51 268 czero_rev~ 0.9 0.4;
+#X text 11 23 complex one-zero (non-recursive) "reverse" filter \,
+raw;
+#X text 158 312 - signal to filter (real part).;
+#X text 158 327 - clear internal state to zero.;
+#X text 158 342 - set internal state (real & imaginary parts).;
+#X text 158 362 - signal to filter ( imaginary part ).;
+#X text 158 387 - filter coefficient ( real part ).;
+#X text 158 412 - filter coefficient ( imaginary part ).;
+#X text 157 521 - (optional) filter coefficient (real part).;
+#X text 157 536 - (optional) filter coefficient (imaginary part).;
+#X text 80 521 1) float;
+#X text 80 536 2) float;
+#X text 93 57 [czero_rev~] filters a complex audio signal (first two
+inlets) via a one-zero filter \, whose coefficients are controlled
+by creation arguments or by another complex audio signal (remaining
+two inlets). The impulse response is that of "rzero" reversed in time.
+;
+#X text 201 155 The action of [czero_rev~] is:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 28 0 34 0;
+#X connect 29 0 34 0;
+#X connect 30 0 34 1;
+#X connect 31 0 34 2;
+#X connect 32 0 34 3;
+#X connect 33 0 34 0;
diff --git a/doc/pddp/czero~-help.pd b/doc/pddp/czero~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..01578af37fda87d52d063f007a6a945b6179c82a
--- /dev/null
+++ b/doc/pddp/czero~-help.pd
@@ -0,0 +1,191 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header czero~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 288 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 206 491 389 META 0;
+#X text 12 185 LIBRARY internal;
+#X text 12 225 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 205 AUTHOR Miller Puckette;
+#X text 12 265 HELP_PATCH_AUTHORS Updated for Pd version-0.38. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION complex one-zero (non-recursive) filter \,
+raw;
+#X text 12 65 INLET_0 signal clear set;
+#X text 12 85 INLET_1 signal;
+#X text 12 105 INLET_2 signal;
+#X text 12 125 INLET_3 signal;
+#X text 12 145 OUTLET_0 signal;
+#X text 12 165 OUTLET_1 signal;
+#X text 12 245 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 425 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 487 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 543 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 63 281 428 309 Related_objects 0;
+#X obj 75 61 rzero~;
+#X obj 26 81 cpole~;
+#X obj 26 61 rpole~;
+#X obj 124 61 rzero_rev~;
+#X obj 75 81 czero~;
+#X obj 124 81 czero_rev~;
+#X text 202 61 real;
+#X text 201 82 complex;
+#X text 23 45 1-pole;
+#X text 72 45 1-zero;
+#X text 122 45 1-zero \, reversed;
+#X text 48 30 summary of raw filters:;
+#X text 22 185 User-friendly Filters;
+#X obj 25 214 lop~;
+#X obj 76 213 hip~;
+#X obj 128 214 bp~;
+#X obj 173 215 vcf~;
+#X obj 26 275 biquad~;
+#X text 22 251 Other Objects;
+#X text 22 114 Pd also provides a suite of user-friendly filters. This
+and other raw filters are provided for situations which the user-friendly
+ones can't handle. See Chapter 8 of http://crca.ucsd.edu/~msp/techniques
+for an introduction to the necessary theory.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [czero~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 434 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 297 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 297 signal;
+#X text 98 434 signal;
+#N canvas 21 185 498 375 test 0;
+#X obj 88 282 env~ 16384;
+#X floatatom 88 306 5 0 0 0 - - -;
+#X floatatom 420 107 4 -1000 1000 0 - - -;
+#X obj 285 310 dac~;
+#X obj 285 274 *~;
+#X obj 311 101 cos~;
+#X floatatom 237 46 5 0 0 0 - - -;
+#X obj 265 98 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 237 96 *~;
+#X obj 237 69 phasor~;
+#X floatatom 318 52 5 0 0 0 - - -;
+#X obj 318 75 / 1000;
+#X obj 344 102 -~ 0.25;
+#X obj 344 124 cos~;
+#X obj 420 126 / 1000;
+#X obj 310 152 *~;
+#X obj 344 152 *~;
+#X obj 164 282 env~ 16384;
+#X floatatom 164 306 5 0 0 0 - - -;
+#X obj 317 270 dbtorms;
+#X floatatom 318 250 5 0 0 0 - - -;
+#X obj 181 206 czero~;
+#X floatatom 137 118 4 -1000 1000 0 - - -;
+#X obj 28 112 cos~;
+#X obj 48 71 phasor~;
+#X floatatom 51 46 5 0 0 0 - - -;
+#X obj 61 113 -~ 0.25;
+#X obj 61 135 cos~;
+#X obj 137 137 / 1000;
+#X obj 27 163 *~;
+#X obj 61 163 *~;
+#X text 150 13 Stuff to test it:;
+#X connect 0 0 1 0;
+#X connect 2 0 14 0;
+#X connect 4 0 3 0;
+#X connect 4 0 3 1;
+#X connect 5 0 15 0;
+#X connect 6 0 9 0;
+#X connect 7 0 8 1;
+#X connect 8 0 21 0;
+#X connect 9 0 8 0;
+#X connect 10 0 11 0;
+#X connect 11 0 5 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 16 0;
+#X connect 14 0 16 1;
+#X connect 14 0 15 1;
+#X connect 15 0 21 2;
+#X connect 16 0 21 3;
+#X connect 17 0 18 0;
+#X connect 19 0 4 1;
+#X connect 20 0 19 0;
+#X connect 21 0 0 0;
+#X connect 21 0 4 0;
+#X connect 21 1 17 0;
+#X connect 22 0 28 0;
+#X connect 23 0 29 0;
+#X connect 24 0 26 0;
+#X connect 24 0 23 0;
+#X connect 25 0 24 0;
+#X connect 26 0 27 0;
+#X connect 27 0 30 0;
+#X connect 28 0 30 1;
+#X connect 28 0 29 1;
+#X connect 29 0 21 0;
+#X connect 30 0 21 1;
+#X restore 102 552 pd test;
+#X text 98 312 clear;
+#X text 98 327 set;
+#X obj 78 347 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 347 signal;
+#X obj 78 372 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 372 signal;
+#X obj 78 397 cnv 17 3 17 empty \$0-pddp.cnv.let.3 3 5 9 0 16 -228856
+-162280 0;
+#X text 98 397 signal;
+#X obj 78 459 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 459 signal;
+#X obj 42 111 osc~ 100;
+#X msg 50 136 clear;
+#X obj 69 187 sig~;
+#X obj 96 209 sig~;
+#X obj 126 229 sig~;
+#X msg 57 162 set 0.6 0.8;
+#X obj 41 252 czero~ 0.9 0.4;
+#X obj 477 3 czero~;
+#X obj 450 20 pddp/pddplink http://wiki.puredata.info/en/czero~ -text
+pdpedia: czero~;
+#X text 179 152 The action of czero~ is:;
+#X text 238 173 y[n] = x[n] - a[n] * x[n-1];
+#X text 176 193 where y[n] is the output \, x[n] the input \, and a[n]
+the filter coefficient (all complex numbers). The filter is always
+stable.;
+#X text 175 248 The transfer function is H(Z) = 1 - aZ^-1.;
+#X text 11 23 complex one-zero (non-recursive) filter \, raw;
+#X text 168 297 - signal to filter (real part).;
+#X text 168 312 - clear internal state to zero.;
+#X text 168 327 - set internal state (real & imaginary parts).;
+#X text 168 347 - signal to filter ( imaginary part ).;
+#X text 168 372 - filter coefficient ( real part ).;
+#X text 168 397 - filter coefficient ( imaginary part ).;
+#X text 167 506 - (optional) filter coefficient (real part).;
+#X text 167 521 - (optional) filter coefficient (imaginary part).;
+#X text 80 506 1) float;
+#X text 80 521 2) float;
+#X text 84 53 [czero~] filters a complex audio signal (first two inlets)
+via a one-zero filter \, whose coefficients are controlled by creation
+arguments or by another complex audio signal (remaining two inlets).
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 100 572 pddp/pddplink ../3.audio.examples/H12.peaking.pd -text
+doc/3.audio.examples/H12.peaking.pd;
+#X connect 23 0 29 0;
+#X connect 24 0 29 0;
+#X connect 25 0 29 1;
+#X connect 26 0 29 2;
+#X connect 27 0 29 3;
+#X connect 28 0 29 0;
diff --git a/doc/pddp/dac~-help.pd b/doc/pddp/dac~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d2ecaeb234846d2802cb4b77943ce7a470c5ac35
--- /dev/null
+++ b/doc/pddp/dac~-help.pd
@@ -0,0 +1,147 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header dac~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 259 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 243 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Dave Sabine \, May 5 \, 2003 . Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 45 DESCRIPTION audio output;
+#X text 12 65 INLET_n signal;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 355 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 383 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 471 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 268 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#N canvas 41 417 428 171 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [dac~] Related Objects;
+#X obj 63 42 switch~;
+#X text 115 42 [block~];
+#X text 20 65 (Note: having a [block~] and a [switch~] in the same
+window causes an error \, which is why [block~] is shown above as a
+comment.);
+#X text 20 117 Externals;
+#X text 19 142 [shoutcast~];
+#X text 106 142 [oggcast~];
+#X text 181 142 [mp3cast~];
+#X obj 174 42 throw~;
+#X obj 226 42 catch~;
+#X obj 278 42 send~;
+#X obj 322 42 receive~;
+#X obj 23 42 adc~;
+#X restore 101 597 pd Related_objects;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/dac~ -text
+pdpedia: dac~;
+#X obj 492 3 dac~;
+#X text 109 133 default stereo signals: same as;
+#X text 198 221 all channels on an 8-channel device;
+#X obj 65 133 dac~;
+#X obj 367 135 dac~ 1 2;
+#X obj 65 160 dac~ 5;
+#X text 123 159 a mono signal to channel 5;
+#X obj 65 191 dac~ 1 3 8 6 11 15 19 22 23 24 36;
+#X text 280 191 11 channels of output;
+#X obj 65 221 dac~ 1 2 3 4 5 6 7 8;
+#X text 98 359 (none);
+#X text 98 267 signal;
+#X text 168 401 - the object defaults to 2 outgoing audio channels
+(usually a left and right stereo pair). Any number of arguments (integers)
+can be used to define multiple output channels - each integer corresponds
+to an output channel on your audio hardware.;
+#X text 168 267 - the number of inlets correspond with the number of
+arguments - each inlet represents an output channel on your audio hardware
+which corresponds to the argument you provide. If no arguments are
+provided \, then there are two inlets which represent audio channels
+1 and 2 on your computer's sound card.;
+#X text 98 475 [dac~] is an acronym meaning "Digital/Analog Converter
+Signal" and is Pd's interface to send audio information to the audio
+channels of your soundcard(s).;
+#N canvas 37 90 428 471 Multi-channel_audio 0;
+#X text 19 38 All sound cards are capable of at least two channels
+of audio. Pd supports these two channels by default and uses your system's
+generic audio drivers to communicate with your hardware. However \,
+for faster input/output and for more than two channels of audio \,
+PD incorporates the use of "PortAudio" which uses ASIO drivers to communicate
+with your hardware. So \, to instruct Pd to use more than two channels
+of audio \, your command line should read like below:;
+#X text 80 145 c:/pd/bin/pd.exe -pa -inchannels 8 -outchannels 8;
+#X text 19 174 The "-pa" switch means "PortAudio". This switch is new
+as of Pd version 0.37 TEST 4 and replaces the old "-asio" switch.;
+#X text 19 234 The "-inchannels" and "-outchannels" switches can be
+summarized by using "-channels 8" because currently PortAudio requires
+that the number of incoming and outgoing channels must be equal. This
+may change in the Pd's future...;
+#X text 19 314 To further optimize Pd's usage of your audio hardware
+\, you can explore the following:;
+#X text 29 355 - audiobuf;
+#X text 30 373 - blocksize;
+#X text 29 389 - audioindev;
+#X text 29 407 - audiooutdev;
+#X text 25 433 With the right hardware \, Pd can manage audio input
+and output with lower than 10 milliseconds of latency.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] Multi-channel Audio;
+#X restore 101 545 pd Multi-channel_audio;
+#X text 80 401 n) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 66 51 osc~ 880;
+#X obj 66 80 *~;
+#X obj 66 106 *~ 0.1;
+#X obj 96 80 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X obj 455 51 pddp/dsp;
+#N canvas 84 189 428 347 sample_rate 0;
+#X text 19 37 [adc~] and [dac~] always operate at the sample rate that
+is specified in Pd's command line. By default \, the sample rate is
+44100 hz. But Pd operates any sample rate supported by standard audio
+hardware. Sample rates cannot be changed at run-time in Pd \, but must
+be stated in the command line when Pd is instantiated. As well \, two
+or more instances of Pd running simoultaneously can each be using different
+sample rates! Having said that \, Pd can easily upsample or downsample
+by using the [block~] object. Here are some example of the common sample
+rates:;
+#X text 19 191 c:/pd/bin/pd.exe -r 11025;
+#X text 19 221 c:/pd/bin/pd.exe -r 22050;
+#X text 19 281 c:/pd/bin/pd.exe -r 88200;
+#X text 19 176 c:/pd/bin/pd.exe -r 8000;
+#X text 19 206 c:/pd/bin/pd.exe -r 16000;
+#X text 19 236 c:/pd/bin/pd.exe -r 32000;
+#X text 19 251 c:/pd/bin/pd.exe -r 44100 CD Quality;
+#X text 19 266 c:/pd/bin/pd.exe -r 48000 DAT Quality;
+#X text 19 311 c:/pd/bin/pd.exe -r 192000 DVD-Audio Quality;
+#X text 19 296 c:/pd/bin/pd.exe -r 96000 DVD-Video/Audio Quality;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] Sample Rate;
+#X restore 101 520 pd sample_rate;
+#N canvas 99 375 428 211 defeating_audio_computation 0;
+#X text 19 37 There may be cases when you do not want Pd to send or
+receive audio signal with your soundcard. You can manually disable
+the [dac~] and [adc~] objects separately using the "-nodac" and "-noadc"
+switch \, or disable both using the "-nosound" switch.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [dac~] -nodac and -noadc;
+#X restore 101 570 pd defeating_audio_computation;
+#X text 117 79 <- Click to test;
+#X text 11 23 audio output;
+#X connect 28 0 29 0;
+#X connect 29 0 30 0;
+#X connect 30 0 13 0;
+#X connect 31 0 29 1;
diff --git a/doc/pddp/dbtopow-help.pd b/doc/pddp/dbtopow-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5ed86d0f29932baa5e385cc0d889d53831f025e3
--- /dev/null
+++ b/doc/pddp/dbtopow-help.pd
@@ -0,0 +1,68 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header dbtopow 3 12 0 18
+-204280 -1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control conversion;
+#X text 12 45 DESCRIPTION convert dB to power units;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 446 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 543 (none);
+#N canvas 16 424 428 167 Related_objects 0;
+#X text 19 37 Control objects for conversion:;
+#X obj 232 62 powtodb;
+#X obj 22 121 mtof~;
+#X obj 67 121 ftom~;
+#X obj 110 121 dbtorms~;
+#X obj 175 121 rmstodb~;
+#X obj 241 121 dbtopow~;
+#X obj 303 121 powtodb~;
+#X text 19 98 Signal objects for conversion:;
+#X obj 22 62 mtof;
+#X obj 69 62 ftom;
+#X obj 107 62 dbtorms;
+#X obj 166 62 rmstodb;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [dbtopow] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X floatatom 239 206 0 0 0 0 - - -;
+#X floatatom 239 150 0 0 0 0 - - -;
+#X obj 78 511 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 float;
+#X text 98 511 float;
+#X obj 470 3 dbtopow;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/dbtopow -text
+pdpedia: dbtopow;
+#X obj 239 179 dbtopow;
+#X text 11 23 convert dB to power units;
+#X text 168 468 - lists will be truncated \, and the first element
+will be used as input.;
+#X text 109 242 The [dbtopow] object converts decibels to power units
+\, equal to the square of the "RMS" amplitude.;
+#X text 98 468 list;
+#X obj 99 570 pddp/pddplink all_about_acoustic_conversions.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 11 0 17 0;
+#X connect 17 0 10 0;
diff --git a/doc/pddp/dbtopow~-help.pd b/doc/pddp/dbtopow~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5fd1eb4fbda52e71b6a35f5f177c70c38868d5c2
--- /dev/null
+++ b/doc/pddp/dbtopow~-help.pd
@@ -0,0 +1,76 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header dbtopow~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 415 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 45 DESCRIPTION convert dB to power units for audio signals
+;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 65 INLET_0 signal float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 452 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 488 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 516 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 424 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 492 (none);
+#N canvas 54 440 428 149 Related_objects 0;
+#X obj 253 43 powtodb~;
+#X obj 23 102 mtof;
+#X obj 68 102 ftom;
+#X obj 111 102 dbtorms;
+#X obj 176 102 rmstodb;
+#X obj 242 102 dbtopow;
+#X obj 304 102 powtodb;
+#X text 20 79 Control objects for conversion:;
+#X obj 23 43 mtof~;
+#X obj 70 43 ftom~;
+#X obj 118 43 dbtorms~;
+#X obj 187 43 rmstodb~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [dbtopow~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 239 243 snapshot~;
+#X floatatom 239 270 0 0 0 0 - - -;
+#X floatatom 239 135 0 0 0 0 - - -;
+#X text 98 423 signal;
+#X obj 78 461 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 461 signal;
+#X obj 474 3 dbtopow~;
+#X obj 440 20 pddp/pddplink http://wiki.puredata.info/en/dbtopow~ -text
+pdpedia: dbtopow~;
+#X obj 239 162 dbtopow~;
+#X text 11 23 convert dB to power units for audio signals;
+#X text 98 297 The [dbtopow~] object converts decibels to power units
+\, equal to the square of the "RMS" amplitude.;
+#X text 99 520 This object takes an audio signal as input and output
+(and works sample by sample). Since it calls a library math function
+\, it may be much more expensive than other workaday tilde objects
+such as [*~] and [osc~] \, depending on your hardware and math library.
+;
+#X obj 263 199 loadbang;
+#X obj 263 221 metro 150;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 10 0 11 0;
+#X connect 12 0 18 0;
+#X connect 18 0 10 0;
+#X connect 22 0 23 0;
+#X connect 23 0 10 0;
diff --git a/doc/pddp/dbtorms-help.pd b/doc/pddp/dbtorms-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8569f25f31b26a43212ffdbf7c7e49409f920222
--- /dev/null
+++ b/doc/pddp/dbtorms-help.pd
@@ -0,0 +1,73 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header dbtorms 3 12 0 18
+-204280 -1 0;
+#X obj 0 425 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control conversion;
+#X text 12 45 DESCRIPTION convert dB to linear amplitude;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 491 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 527 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 553 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 434 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 530 (none);
+#N canvas 41 419 428 170 Related_objects 0;
+#X text 19 36 Control objects for conversion:;
+#X obj 107 60 rmstodb;
+#X obj 176 60 dbtopow;
+#X obj 242 60 powtodb;
+#X obj 22 119 mtof~;
+#X obj 67 119 ftom~;
+#X obj 110 119 dbtorms~;
+#X obj 175 119 rmstodb~;
+#X obj 241 119 dbtopow~;
+#X obj 303 119 powtodb~;
+#X text 19 96 Signal objects for conversion:;
+#X obj 22 60 mtof;
+#X obj 69 60 ftom;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [dbtorms] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X floatatom 239 196 0 0 0 0 - - -;
+#X floatatom 239 140 0 0 0 0 - - -;
+#X obj 78 499 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 433 float;
+#X text 98 499 float;
+#X obj 472 3 dbtorms;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/dbtorms -text
+pdpedia: dbtorms;
+#X obj 239 169 dbtorms;
+#X text 11 23 convert dB to linear amplitude;
+#X text 168 456 - lists will be truncated \, and the first element
+will be used as input.;
+#X text 109 231 The [dbtorms] object converts from decibels to linear
+("RMS") amplitude \, so that 100 dB corresponds to an "RMS" of 1 .
+Zero dB \, which should correspond to 0.0001 in "RMS" \, is instead
+rounded down to zero.;
+#X text 98 456 list;
+#X text 168 433 - the incoming value.;
+#X obj 98 556 pddp/pddplink all_about_acoustic_conversions.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 571 pddp/pddplink ../3.audio.examples/A02.amplitude.pd -text
+doc/3.audio.examples/A02.amplitude.pd;
+#X connect 11 0 17 0;
+#X connect 17 0 10 0;
diff --git a/doc/pddp/dbtorms~-help.pd b/doc/pddp/dbtorms~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..eef6c32b4e3a50bd9fb8d998853cefcf4cf48da9
--- /dev/null
+++ b/doc/pddp/dbtorms~-help.pd
@@ -0,0 +1,80 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header dbtorms~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 409 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 45 DESCRIPTION dB to linear amplitude for audio signals
+;
+#X text 12 65 INLET_0 signal float;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 446 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 483 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 510 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 418 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 487 (none);
+#N canvas 47 452 428 139 Related_objects 0;
+#X obj 116 42 rmstodb~;
+#X obj 185 42 dbtopow~;
+#X obj 251 42 powtodb~;
+#X obj 21 105 mtof;
+#X obj 66 105 ftom;
+#X obj 109 105 dbtorms;
+#X obj 174 105 rmstodb;
+#X obj 240 105 dbtopow;
+#X obj 302 105 powtodb;
+#X text 18 78 Control objects for conversion:;
+#X obj 21 42 mtof~;
+#X obj 68 42 ftom~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [dbtorms~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 209 195 snapshot~;
+#X floatatom 209 226 0 0 0 0 - - -;
+#X floatatom 209 90 0 0 0 0 - - -;
+#X obj 209 114 sig~;
+#X obj 276 169 metro 100;
+#X obj 276 139 loadbang;
+#X text 98 417 signal;
+#X obj 78 455 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 455 signal;
+#X obj 475 3 dbtorms~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/dbtorms~ -text
+pdpedia: dbtorms~;
+#X obj 209 139 dbtorms~;
+#X text 11 23 dB to linear amplitude for audio signals;
+#X text 99 251 The [dbtorms~] object converts from decibels to linear
+("RMS") amplitude \, so that 100 dB corresponds to an "RMS" of 1 .
+Zero dB \, which should correspond to 0.0001 in "RMS" \, is instead
+rounded down to zero.;
+#X text 99 514 This object takes an audio signal as input and output
+(and works sample by sample). Since it calls a library math function
+\, it may be much more expensive than other workaday tilde objects
+such as [*~] and [osc~] \, depending on your hardware and math library.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 13 0 21 0;
+#X connect 14 0 10 0;
+#X connect 15 0 14 0;
+#X connect 21 0 10 0;
diff --git a/doc/pddp/declare-help.pd b/doc/pddp/declare-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..632313a3ba7828d1191a8aec33116ba5251fdfec
--- /dev/null
+++ b/doc/pddp/declare-help.pd
@@ -0,0 +1,70 @@
+#N canvas 1 88 555 619 10;
+#X declare;
+#X declare;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header declare 3 12 0 18
+-204280 -1 0;
+#X obj 0 105 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 252 494 344 META 0;
+#X text 12 65 LIBRARY internal;
+#X text 12 105 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 85 AUTHOR Miller Puckette;
+#X text 12 145 HELP_PATCH_AUTHORS Updated for Pd version 0.41. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION set environment for loading patch;
+#X text 12 125 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS control pd_op;
+#X restore 500 597 pd META;
+#X obj 0 134 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 164 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 386 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 486 428 103 Related_objects 0;
+#X obj 15 34 import;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [declare] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/declare -text
+pdpedia: declare;
+#X obj 470 3 declare;
+#X text 98 109 (none);
+#X text 98 139 (none);
+#X text 164 291 -lib;
+#X text 164 307 -stdlib;
+#X text 164 255 -path;
+#X text 164 271 -stdpath;
+#X text 262 255 add to search path \, relative to the patch;
+#X text 262 291 load a library \, relative to the patch;
+#X text 262 308 load a library \, relative to Pd;
+#X text 161 333 (for any of these you may use a full pathname such
+as "/tmp/dir" or \, in Windows \, "C:/garbage" instead of a relative
+path).;
+#X text 262 272 add to search path \, relative to Pd;
+#X text 98 482 WARNING: you might want to avoid putting "declare" statements
+inside abstractions \, as their effects will extend to the calling
+patch. As of version 0.41 \, "declare path" is ignored inside abstractions
+\, although \, probably unwisely \, "-stdpath" takes effect (on the
+calling patch as well as the abstraction.);
+#X text 98 561 BUG: The name "-stdpath" is confusing \, as it has a
+quite different effect from "-stdpath" on the pd command line.;
+#X text 11 23 set environment for loading patch;
+#X text 139 69 NEEDS AN EXAMPLE;
+#X text 165 185 - the [declare] object adds one or more directories
+to the search path \, and/or pre-loads one or more libraries ("extensions")
+to Pd in preparation for opening the patch from a file. Usage is "declare
+[-flag value] [-flag value] ..." where the flag can be:;
+#X text 97 400 If you put abstractions and/or other supporting files
+in a subdirectory "more" \, you can put an object \, "declare -path
+more" to make sure Pd sees them when the patch is loaded. Or \, if
+you have zexy installed in the directory extra/zexy (in the Pd installation")
+you can get it using "declare -stdpath extra/zexy".;
+#X text 80 185 n) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
diff --git a/doc/pddp/delay-help.pd b/doc/pddp/delay-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e445cf94f65b883a060f11c4b14125e0b694062c
--- /dev/null
+++ b/doc/pddp/delay-help.pd
@@ -0,0 +1,186 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header delay 3 12 0 18
+-204280 -1 0;
+#X obj 0 200 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 39 180 494 386 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 65 DESCRIPTION bang after time delay;
+#X text 12 5 ALIAS del;
+#X text 12 85 INLET_0 float bang stop;
+#X text 12 105 INLET_1 float;
+#X text 12 125 OUTLET_0 bang;
+#X text 12 25 KEYWORDS control time bang_op;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 393 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 446 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 488 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 97 299 428 291 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 42 37 timer;
+#X obj 8 37 pipe;
+#X obj 80 37 metro;
+#X obj 119 37 makenote;
+#X obj 179 87 delwrite~;
+#X text 4 208 The best places to find information about Pd's libraries
+is:;
+#X text 4 230 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 4 251 iem.kug.ac.at/pdb/;
+#X text 5 112 Externals;
+#X text 5 159 Externals are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 7 62 Audio Objects;
+#X obj 10 87 vd~;
+#X obj 47 87 delread~;
+#X obj 113 87 delwrite~;
+#X text 7 1 [delay] Related Objects;
+#X text 5 133 [nop~];
+#X text 46 133 [z~];
+#X text 73 133 [t3_delay];
+#X text 137 133 [idelay~];
+#X text 194 133 [delay~];
+#X restore 101 597 pd Related_objects;
+#X obj 78 209 cnv 17 3 145 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 402 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 360 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 359 float;
+#X obj 451 3 delay;
+#X text 491 3 or;
+#X obj 517 2 del;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/delay -text
+pdpedia: delay;
+#X obj 100 102 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 100 150 delay 2000;
+#X obj 100 173 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 98 253 bang;
+#X text 98 313 stop;
+#X text 168 359 - a float to the right inlet sets the delay time (in
+milliseconds).;
+#X text 98 336 list;
+#X text 98 401 bang;
+#X msg 168 101 stop;
+#X msg 122 101 500;
+#X floatatom 157 128 0 0 0 0 - - -;
+#X text 188 129 <- scroll to change delay time in milliseconds;
+#X text 168 401 - [delay] only outputs a bang. It cannot be used like
+an "echo" or to delay messages other than bang. For that purpose \,
+you should explore [pipe].;
+#N canvas 106 287 428 250 A_delay_based_metronome 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 55 Let's assume for a moment that Miller had forgotten to
+build the [metro] object. (I know that sounds absurd \, but for the
+sake of example...);
+#X text 19 104 [delay] could be used to create a metronome as follows.
+;
+#X obj 58 197 bng 15 50 10 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 58 175 delay 1000;
+#X msg 22 135 bang;
+#X msg 58 135 stop;
+#X obj 260 176 metro 1000;
+#X obj 260 197 bng 15 50 10 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 260 157 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X floatatom 317 155 5 0 0 0 - - -;
+#X floatatom 115 154 5 0 0 0 - - -;
+#X text 152 175 is the same as;
+#X text 19 36 A makeshift [metro];
+#X text 7 1 [delay] A Metronome Built with [delay];
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X connect 7 0 8 0;
+#X connect 9 0 7 0;
+#X connect 10 0 7 1;
+#X connect 11 0 4 1;
+#X restore 101 550 pd A_delay_based_metronome;
+#N canvas 103 173 428 389 Random_Impulse_Generator 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 21 35 Some users might be familiar with SC (SuperCollider)
+by James McCartney. For more info about SC \, visit www.audiosynth.com.
+Anyways...SC has a unit generator called "DUST". Dust will produce
+random impulses at a specified "density". I believe that Dust was given
+its name because it creates a sound that is similar to actual dust
+on old vinyl LP's -- you know that old crackling sound like Rice Krispies.
+;
+#X text 20 143 The idea is quite simple. If you want a "very dusty"
+sound \, you make the density quite high...if you want a "slightly
+dusty" sound \, you make the density quite low.;
+#X obj 22 299 delay;
+#X obj 22 321 bng 15 50 10 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 235 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 20 188 Dust.ar(2) in SC will produce 2 dusty impulses randomly
+per second. In the example below \, you'll see a version of this process
+created using Pd's delay object.;
+#X obj 22 278 random 500;
+#X obj 22 257 metro 500;
+#X floatatom 92 236 5 0 0 0 - - -;
+#X text 20 343 Also note that this example merely approximates the
+output of SC's "Dust" object.;
+#X text 130 236 low numbers produce a very "dusty" output.;
+#X text 130 248 high numbers produce a slightly "dusty" output.;
+#X text 7 1 [delay] A Random Impulse Generator using [delay];
+#X connect 3 0 4 0;
+#X connect 5 0 8 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 1;
+#X connect 9 0 7 1;
+#X restore 101 572 pd Random_Impulse_Generator;
+#X text 168 313 - causes [delay] to cancel its scheduled output.;
+#X text 168 336 - a list of floats will be truncated to the first element.
+;
+#X text 80 465 1) float;
+#X text 97 54 The [delay] object sends a bang to its outlet after a
+delay (in milliseconds) \, specified by its right inlet or its creation
+argument.;
+#X text 168 253 - a bang to the left inlet will output a bang after
+the prescribed time (set either at the right inlet creation argument).
+In the above example \, you should notice a delay of 2 seconds \, then
+a bang at the outlet.;
+#X text 168 208 - if a float is sent to the left inlet \, [delay] will
+set the delay time equal to that number (milliseconds) and schedule
+the outgoing bang.;
+#X text 98 492 [delay] accepts only ONE bang at a time. It cannot process
+multiple delays. In other words \, sending a "bang" to a [delay] which
+is already set will reschedule its output \, cancelling the old one.
+;
+#X text 168 465 - (optional) initial delay time (in milliseconds).
+;
+#X text 98 208 float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 298 550 pddp/pddplink ../2.control.examples/07.time.pd;
+#X text 11 23 bang after time delay;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 24 0 17 0;
+#X connect 25 0 17 0;
+#X connect 26 0 17 1;
diff --git a/doc/pddp/delread~-help.pd b/doc/pddp/delread~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7dcfd4e793df69ea3490d1134a3fa05fcce907c4
--- /dev/null
+++ b/doc/pddp/delread~-help.pd
@@ -0,0 +1,88 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header delread~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 292 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal nonlocal time;
+#X text 12 45 DESCRIPTION read a signal from a delay line;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 65 INLET_0 float;
+#X restore 500 597 pd META;
+#X obj 0 384 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 421 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 479 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 301 cnv 17 3 75 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 93 450 428 139 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 78 Control objects for delays:;
+#X obj 22 105 delay;
+#X obj 67 105 pipe;
+#X obj 22 42 delwrite~ help;
+#X obj 127 42 vd~ help;
+#X text 7 1 [delread~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 393 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 393 signal;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/delread~ -text
+pdpedia: delread~;
+#X floatatom 299 169 0 0 0 0 - - -;
+#X text 340 168 input to delay line;
+#X obj 299 193 sig~;
+#X floatatom 112 122 0 0 0 0 - - -;
+#X text 139 122 float input (delay time in ms);
+#X obj 112 217 snapshot~;
+#X floatatom 112 241 0 0 0 0 - - -;
+#X obj 123 173 loadbang;
+#X obj 123 195 metro 200;
+#X text 98 300 float;
+#X text 98 320 list;
+#X text 98 339 Note: If the specified delay time is longer than the
+size of the delay line or less than zero it is clipped to the length
+of the delay line.;
+#X text 98 483 You can use more than one [delread~] object for the
+same delay line.;
+#X obj 466 3 delread~;
+#X obj 299 218 delwrite~ delread_ex 1000;
+#X obj 112 148 delread~ delread_ex 1000;
+#X text 11 23 read a signal from a delay line;
+#X text 168 300 - a float sets the delay time (in milliseconds).;
+#X text 168 320 - lists are truncated to the first element.;
+#X text 168 393 - the delayed signal.;
+#X text 168 440 - name of delay line.;
+#X text 168 455 - (optional) initial delay time (ms).;
+#X text 80 455 2) float;
+#X text 98 511 Note: if the [delwrite~] runs after the [delread~] the
+minimum delay is actually one DSP period \, not zero.;
+#X text 80 440 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 542 pddp/pddplink ../3.audio.examples/G01.delay.pd -text
+doc/3.audio.examples/G01.delay.pd;
+#X obj 98 557 pddp/pddplink ../3.audio.examples/G02.delay.loop.pd -text
+doc/3.audio.examples/G02.delay.loop.pd;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/G05.execution.order.pd
+-text doc/3.audio.examples/G05.execution.order.pd;
+#X connect 12 0 14 0;
+#X connect 14 0 26 0;
+#X connect 15 0 27 0;
+#X connect 17 0 18 0;
+#X connect 19 0 20 0;
+#X connect 20 0 17 0;
+#X connect 27 0 17 0;
diff --git a/doc/pddp/delwrite~-help.pd b/doc/pddp/delwrite~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..063c312f31355254bf19cfc11cadbab2f20c871e
--- /dev/null
+++ b/doc/pddp/delwrite~-help.pd
@@ -0,0 +1,97 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header delwrite~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 268 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 244 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 145 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal nonlocal;
+#X text 12 45 DESCRIPTION write a signal in a delay line;
+#X text 12 65 INLET_0 signal;
+#X restore 500 597 pd META;
+#X obj 0 321 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 350 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 429 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 277 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 73 450 428 139 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 79 Control objects for delays:;
+#X obj 22 106 delay;
+#X obj 67 106 pipe;
+#X obj 22 43 delread~ delwrite_ex;
+#X obj 157 43 vd~ delwrite_ex;
+#X text 7 2 [delwrite~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/delread~ -text
+pdpedia: delread~;
+#X floatatom 90 97 0 0 0 0 - - -;
+#X text 119 96 input to delay line;
+#X obj 90 121 sig~;
+#X floatatom 282 63 0 0 0 0 - - -;
+#X obj 282 168 snapshot~;
+#X floatatom 282 192 0 0 0 0 - - -;
+#X obj 293 112 loadbang;
+#X obj 293 134 metro 200;
+#X obj 462 3 delwrite~;
+#X obj 90 146 delwrite~ delwrite_ex 1000;
+#X obj 282 86 delread~ delwrite_ex 1000;
+#X floatatom 356 110 0 0 0 0 - - -;
+#X obj 357 168 snapshot~;
+#X floatatom 357 192 0 0 0 0 - - -;
+#X obj 356 133 delread~ delwrite_ex 500;
+#X text 98 326 (none);
+#X text 98 276 signal;
+#X text 168 276 - the signal is read by all [delread~] and [vd~] objects
+with the same delay line name (delwrite_ex in the above example).;
+#X text 169 384 - length of the delay line in milliseconds \, which
+is the maximum delay time any receiving [delread~] or [vd~] object
+may have.;
+#X text 98 224 [delwrite~] allocates memory for a delay line and writes
+an audio signal into it. [delread~] objects by the same name read from
+the delay line.;
+#X text 169 369 - name of the delay line.;
+#X text 99 433 You can use more than one [delread~] object for the
+same delay line. (See example above).;
+#X text 80 384 2) float;
+#X text 99 461 Note: if the [delwrite~] runs after the [delread~] the
+minimum delay is actually one DSP period \, not zero.;
+#X text 80 369 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 99 492 pddp/pddplink ../3.audio.examples/G01.delay.pd -text
+doc/3.audio.examples/G01.delay.pd;
+#X obj 99 512 pddp/pddplink ../3.audio.examples/G02.delay.loop.pd -text
+doc/3.audio.examples/G02.delay.loop.pd;
+#X obj 99 532 pddp/pddplink ../3.audio.examples/G03.delay.variable.pd
+-text doc/3.audio.examples/G03.delay.variable.pd;
+#X obj 99 552 pddp/pddplink ../3.audio.examples/G04.control.blocksize.pd
+-text doc/3.audio.examples/G04.control.blocksize.pd;
+#X obj 99 572 pddp/pddplink ../3.audio.examples/G05.execution.order.pd
+-text doc/3.audio.examples/G05.execution.order.pd;
+#X text 11 23 write a signal in a delay line;
+#X connect 10 0 12 0;
+#X connect 12 0 19 0;
+#X connect 13 0 20 0;
+#X connect 14 0 15 0;
+#X connect 16 0 17 0;
+#X connect 17 0 14 0;
+#X connect 17 0 22 0;
+#X connect 20 0 14 0;
+#X connect 21 0 24 0;
+#X connect 22 0 23 0;
+#X connect 24 0 22 0;
diff --git a/doc/pddp/drawnumber-help.pd b/doc/pddp/drawnumber-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8daa7379cfabc627298bedc50de892f13c202dcf
--- /dev/null
+++ b/doc/pddp/drawnumber-help.pd
@@ -0,0 +1,163 @@
+#N struct drawnumber-help-template float x float y float cat float
+dog float dog-vis;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header drawnumber 3 12
+0 18 -204280 -1 0;
+#X obj 0 119 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 243 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2009-06-12;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.39. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 25 KEYWORDS control data_structure;
+#X text 12 65 DESCRIPTION display a numberic field of a template;
+#X text 12 5 ALIAS drawsymbol;
+#X text 12 85 INLET_0 float;
+#X restore 500 597 pd META;
+#X obj 0 204 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 232 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 460 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 98 419 428 169 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 92 42 struct;
+#X obj 142 42 drawpolygon;
+#X obj 223 42 plot;
+#X obj 17 42 drawsymbol;
+#X obj 262 42 drawcurve;
+#X text 7 78 Other Data Structure Objects;
+#X obj 245 112 element;
+#X obj 76 112 get;
+#X obj 107 112 set;
+#X obj 136 112 getsize;
+#X obj 190 112 setsize;
+#X obj 22 112 pointer;
+#X text 7 1 [drawnumber] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 128 cnv 17 3 65 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 127 float;
+#X text 98 177 list;
+#X text 168 127 - [drawnumber] has a single inlet to toggle visibility
+of the number. A zero makes it invisible. Any nonzero value makes it
+visible.;
+#X text 98 208 (none);
+#N canvas 7 169 428 164 drawnumber-help-data 0;
+#X scalar drawnumber-help-template 24 61 49 17 1 \;;
+#X scalar drawnumber-help-template 174 61 41 18 1 \;;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 12 2 14 -204280 -195568
+0;
+#X text 6 1 [drawnumber] Window to Display Data Structure Instances
+;
+#X text 21 91 Each dog/cat pair is a scalar. (You can click each in
+editmode to get a bounding blue box and move them around.) When not
+in editmode you may click and scroll the values up and down for each
+field.;
+#X restore 28 61 pd drawnumber-help-data;
+#N canvas 115 43 428 526 drawnumber-help-template 0;
+#X obj 23 121 drawnumber cat 0 0 0 cat=;
+#X obj 23 92 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 22 454 struct drawnumber-help-template float x float y float
+cat float dog float dog-vis;
+#X obj 22 314 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 22 353 set drawnumber-help-template dog-vis;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [drawnumber] subpatch for data structure template;
+#N canvas 115 239 426 147 init 0;
+#X obj 14 57 pointer;
+#X msg 14 35 traverse pd-drawnumber-help-data \, next;
+#X obj 14 12 loadbang;
+#X obj 14 80 outlet;
+#X text 67 58 This just sends a pointer to the right inlet of the [set]
+object;
+#X text 257 39 the list);
+#X text 255 27 (select the first scalar in;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X restore 235 331 pd init;
+#X text 42 91 "0" makes both "cat" fields invisible;
+#X text 40 311 "0" makes a single instance of a "dog" field invisible
+;
+#X obj 23 210 drawnumber -v dog-vis dog 0 -15 900 dog=;
+#X text 20 29 [drawnumber] is used below to display the values of two
+fields- "dog" and "cat". These two fields are defined in the template
+"drawnumber-help-template" located at the bottom of this subpatch.
+;
+#X text 20 139 For the [drawnumber] object associated with "cat" above
+\, a [toggle] is connected to the inlet. This toggles visibility globally
+(i.e. \, for all existing scalars defined by the template "drawnumber-help-template").
+;
+#X text 21 229 The [drawnumber] object for "dog" above uses the -v
+flag \, which can be used to set visibility for each scalar individually.
+The (flag \, value) pair "-v dog-vis" means that the field "dog-vis"
+determines whether "dog" will be visible in a given scalar. (If you
+use the -v flag you can no longer use the inlet of this [drawsymbol]
+object.);
+#X text 19 372 With the [set] object \, we can change the value of
+"dog-vis" in order to set visibility for the "dog" field. Notice when
+you click the [toggle] \, it only affects one scalar-- the one which
+the [set] object is currently pointing to (see the "init" subpatch).
+;
+#X text 19 487 This object defines the fields for this template. (Their
+values were initialized when this help patch was created.);
+#X connect 1 0 0 0;
+#X connect 3 0 4 0;
+#X connect 7 0 4 1;
+#X restore 28 89 pd drawnumber-help-template;
+#X obj 461 3 drawnumber;
+#X obj 430 20 pddp/pddplink http://wiki.puredata.info/en/drawnumber
+-text pdpedia: drawnumber;
+#X text 99 464 When not in "edit" mode \, you can click and drag vertically
+on the numbers to change their values. (In edit mode you can move \,
+cut \, copy \, and paste the objects.);
+#X text 201 89 <- click this subpatch to see how [drawnumber] is used.
+;
+#X text 179 59 <- subpatch to display the data structures;
+#X text 11 23 display a numeric field of a template;
+#X text 98 437 Note: you cannot use both the -n and -v flag.;
+#X text 168 177 - a list will be truncated to the first element.;
+#X text 80 253 0-2 flags;
+#X text 168 304 - the field name of the number to draw.;
+#X text 168 353 - RGB color (0=black \, 999=white \, 900=red \, 90=green
+\, 9=blue \, 555=grey \, etc.).;
+#X text 168 381 - (optional) label ("cat=" for instance).;
+#X text 168 253 - "-n" flag to make the number invisible initially.
+;
+#X text 168 270 - a "-v [variable]" flag to assign a variable to make
+the number visible/invisible.;
+#X text 168 321 - relative x coordinate.;
+#X text 168 337 - relative y coordinate.;
+#X text 80 321 2) *;
+#X text 80 337 3) *;
+#X text 80 353 4) *;
+#X text 80 304 1) *;
+#X text 98 504 Keyboard entry is supported for [drawnumber] (but not
+for [drawsymbol]) when not in editmode. Click a number to enter values
+\, the click the enter key when you are finished.;
+#X text 80 270 (symbol atoms);
+#X text 80 381 5) symbol atom;
+#X text 98 405 * Any of these can be numbers (float) or field names
+(symbol atom).;
+#X obj 98 542 pddp/pddplink drawsymbol-help.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 318 542 pddp/pddplink ../4.data.structures/09.scaling.pd -text
+doc/4.data.structure/09.scaling.pd;
+#X obj 318 557 pddp/pddplink ../4.data.structures/10.onoff.pd -text
+doc/4.data.structures/10.onoff.pd;
+#X obj 98 572 pddp/pddplink all_about_z_order.pd;
+#X obj 98 557 pddp/pddplink scalar-help.pd;
diff --git a/doc/pddp/drawpolygon-help.pd b/doc/pddp/drawpolygon-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2cb8c11263fcf3c8738c3ffca159346018eef51a
--- /dev/null
+++ b/doc/pddp/drawpolygon-help.pd
@@ -0,0 +1,173 @@
+#N struct drawpolygon-help-template float x float y float weasel float
+dog float cat float vis;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header drawpolygon 3 12
+0 18 -204280 -1 0;
+#X obj 0 147 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 246 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 145 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control data_structure;
+#X text 12 45 DESCRIPTION display a polygon in a data structure instance
+;
+#X text 12 65 INLET_0 float;
+#X restore 500 597 pd META;
+#X obj 0 222 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 250 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 516 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 71 454 428 156 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 92 42 struct;
+#X obj 142 42 drawpolygon;
+#X obj 223 42 plot;
+#X obj 17 42 drawsymbol;
+#X obj 262 42 drawcurve;
+#X text 7 78 Other Data Structure Objects;
+#X obj 245 112 element;
+#X obj 76 112 get;
+#X obj 107 112 set;
+#X obj 136 112 getsize;
+#X obj 190 112 setsize;
+#X obj 22 112 pointer;
+#X text 7 1 [drawpolygon] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 156 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 99 157 float;
+#X text 168 154 - [drawnumber] has a single inlet to toggle visibility
+of the number. A zero makes it invisible. Any nonzero value makes it
+visible.;
+#X text 98 226 (none);
+#X text 179 80 <- subpatch to display the data structures;
+#X obj 449 3 drawpolygon;
+#X obj 420 20 pddp/pddplink http://wiki.puredata.info/en/drawpolygon
+-text pdpedia: drawpolygon;
+#N canvas 23 258 428 340 drawpolygon-help-data 0;
+#X scalar drawpolygon-help-template 101 41 0 60 100 1 \;;
+#X scalar drawpolygon-help-template 301 44 1 80 100 1 \;;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 12 2 14 -204280 -195568
+0;
+#X text 21 156 Three field values are used to draw these polygons.
+The field "weasel" is used for the y-value of the top of the triangle
+and the y-value of the top two points of the red "v". Fields "dog"
+and "cat" are the top left and right x-values for the red "v".;
+#X text 6 1 Window to Display Data Structures;
+#X text 21 111 Each scalar consists of a set of numbers \, one triangle
+\, and one red "v". In editmode you can click on a polygon to get a
+blue bounding box around the scalar.;
+#X text 21 226 In runmode you can click on each of these regions of
+the polygons to alter their appearance. You may also scroll the displayed
+values with the mouse to change them.;
+#X text 21 276 Additionally \, you can right-click a scalar and select
+"Properties" and edit the data in the text window that pops up.;
+#X restore 28 82 pd drawpolygon-help-data;
+#N canvas 102 75 428 563 drawpolygon-help-template 0;
+#X obj 23 115 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#N canvas 69 268 428 162 init 0;
+#X obj 20 75 pointer;
+#X obj 20 99 outlet;
+#X obj 20 30 loadbang;
+#X msg 20 53 traverse pd-drawpolygon-help-data \, next;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [drawpolygon] Initialization subpatch;
+#X text 81 80 This just locates the first scalar in the subpatch "drawpolygon-help-data"
+and outputs a pointer to it.;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X restore 217 316 pd init;
+#X obj 22 298 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [drawpolygon] subpatch;
+#X obj 23 141 drawpolygon 0 4 0 40 40 40 20 weasel 0 40;
+#X obj 22 27 struct drawpolygon-help-template float x float y float
+weasel float dog float cat float vis;
+#X text 42 114 "0" in inlet makes all instances of this polygon invisible
+;
+#X text 40 295 "0" in inlet makes a single instance of this polygon
+invisible;
+#X obj 22 340 set drawpolygon-help-template vis;
+#X obj 23 491 drawnumber weasel -60 0 0 weasel=;
+#X obj 23 511 drawnumber dog -60 15 0 dog=;
+#X obj 23 532 drawnumber cat -60 30 0 cat=;
+#X obj 23 199 drawpolygon -v vis 900 3 dog weasel 80 40 cat weasel
+;
+#X text 19 218 The next [drawpolygon] object uses the -v flag. This
+flag controls visilibility of the polygon for only one instance of
+a data structure. "-v vis" means that the value of field "vis" determines
+whether the red "v" polygon is visible or not.;
+#X text 19 360 Using the [set] object \, we can turn visibility on
+and off for an instance of this polygon by changing the value of the
+field "vis". Notice when you click the toggle above \, visibility only
+changes for the red "v" furthest to the right. Once you use the -v
+flag \, however \, you can no longer use the inlet to [drawpolygon]
+to set visibility globally.;
+#X text 19 447 Finally \, for convenience \, the following [drawnumber]
+objects display the values of each field used in the drawing instructions
+above:;
+#X text 20 159 [drawpolygon] is used above to display a black triangle
+and a red "v".;
+#X text 19 60 The [struct] object defines the fields for this template.
+You can see and edit the values by right-clicking the scalar in the
+"data" subpatch and selecting "Properties.";
+#X connect 0 0 5 0;
+#X connect 1 0 9 1;
+#X connect 2 0 9 0;
+#X restore 28 109 pd drawpolygon-help-template;
+#X text 98 471 Note: you cannot use the -n and -v flag together. When
+using the -v flag \, the polygon is initially invisible by default.
+;
+#X text 99 519 When not in "edit" mode \, you can click on regions
+of the polygon defined by template fields to stretch or alter the polygon's
+shape.;
+#X text 201 109 <- click this subpatch to see how [drawpolygon] is
+used.;
+#X text 11 23 display a polygon in a data structure instance;
+#X text 168 195 - a list will be truncated to the first element.;
+#X text 168 363 - RGB color (0=black \, 999=white \, 900=red \, 90=green
+\, 9=blue \, 555=grey \, etc.);
+#X text 168 390 - line width.;
+#X text 168 414 - two or more (x \, y) pairs giving coordinates.;
+#X text 168 270 - "-n" flag to make the polygon initially invisible.
+;
+#X text 168 289 - a "-v [variable]" flag to assign a variable to make
+the polygon visible/invisible.;
+#X text 80 390 2) *;
+#X text 80 364 1) *;
+#X text 80 414 n) *;
+#X text 98 442 * Any of these can be numbers (float) or field names
+(symbol atom).;
+#X text 98 195 list;
+#X text 80 309 (symbol atoms);
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 316 557 pddp/pddplink ../4.data.structures/09.scaling.pd -text
+doc/4.data.structure/09.scaling.pd;
+#X obj 316 572 pddp/pddplink ../4.data.structures/10.onoff.pd -text
+doc/4.data.structures/10.onoff.pd;
+#X obj 99 572 pddp/pddplink all_about_z_order.pd;
+#X obj 99 557 pddp/pddplink scalar-help.pd;
+#X text 80 270 0-3 flags;
+#X text 80 290 (optional);
+#X text 168 318 - "-x" flag to inhibit selecting the object when the
+shape is clicked on in "edit" mode or clicked-and-dragged in "run mode".
+;
diff --git a/doc/pddp/drawsymbol-help.pd b/doc/pddp/drawsymbol-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..83ed00dd6e126cc3fa55b43c66fd4fc7c09333f2
--- /dev/null
+++ b/doc/pddp/drawsymbol-help.pd
@@ -0,0 +1,160 @@
+#N struct drawsymbol-help-template float x float y symbol cat symbol
+dog float dog-vis;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header drawsymbol 3 12
+0 18 -204280 -1 0;
+#X obj 0 113 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2009-06-12;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.39. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 85 INLET_0 float;
+#X text 12 65 DESCRIPTION display a symbolic field of a template;
+#X text 12 25 KEYWORDS control data_structure symbol_op;
+#X text 12 5 ALIAS drawnumber;
+#X restore 500 597 pd META;
+#X obj 0 188 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 216 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 440 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 55 423 428 169 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 192 42 drawpolygon;
+#X obj 273 42 plot;
+#X obj 312 42 drawcurve;
+#X text 7 78 Other Data Structure Objects;
+#X obj 245 112 element;
+#X obj 76 112 get;
+#X obj 107 112 set;
+#X obj 136 112 getsize;
+#X obj 190 112 setsize;
+#X obj 22 112 pointer;
+#X obj 17 42 drawnumber;
+#X obj 92 42 struct example;
+#X text 7 1 [drawsymbol] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 122 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 121 float;
+#X text 98 161 list;
+#X text 98 192 (none);
+#X text 179 60 <- subpatch to display the data structures;
+#X obj 458 3 drawsymbol;
+#X obj 430 20 pddp/pddplink http://wiki.puredata.info/en/drawsymbol
+-text pdpedia: drawsymbol;
+#X text 98 444 Keyboard entry is not yet supported for drawsymbol.
+;
+#N canvas 32 180 428 164 drawsymbol-help-data 0;
+#X scalar drawsymbol-help-template 101 61 whiskers rex 1 \;;
+#X scalar drawsymbol-help-template 251 61 converse tinker 1 \;;
+#X obj 1 1 cnv 15 425 20 empty empty empty 20 12 2 14 -204280 -195568
+0;
+#X text 21 91 Each dog/cat pair is one scalar. You can click each in
+editmode to get a bounding blue box and move them around. You can also
+right-click on the scalar and choose "Properties" to change its field
+values (remember to click "Ok" when you are finished).;
+#X text 6 1 Window to Display Data Structures;
+#X restore 28 62 pd drawsymbol-help-data;
+#N canvas 123 102 428 537 drawsymbol-help-template 0;
+#X obj 23 101 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#N canvas 441 67 465 142 init 0;
+#X obj 24 96 outlet;
+#X obj 24 30 loadbang;
+#X msg 24 52 traverse pd-drawsymbol-help-data \, next;
+#X obj 24 74 pointer;
+#X text 88 75 This just sends a pointer to the [set] object in the
+parent patch.;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X restore 235 339 pd init;
+#X obj 22 322 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 363 set drawsymbol-help-template dog-vis;
+#X obj 22 457 struct drawsymbol-help-template float x float y symbol
+cat symbol dog float dog-vis;
+#X obj 23 200 drawsymbol -v dog-vis dog 0 -15 900 dog=;
+#X text 20 38 [drawsymbol] is used below to display the values of two
+fields- dog and cat. These two fields are defined in the template "drawnumber-help-template"
+located at the bottom of this subpatch.;
+#X text 42 100 "0" makes both "cat" fields invisible;
+#X text 20 148 This [drawsymbol] object displays the field "cat". A
+toggle is connected to the inlet- this toggles visibility globally
+(i.e. \, for all instances of the data structure).;
+#X text 40 319 "0" makes a single instance of a "dog" field invisible
+;
+#X text 19 490 This object defines the fields for this template. Their
+values were initialized when the help patch was created.;
+#X text 19 219 The [drawsymbol] object for "dog" instead uses the -v
+flag. This controls visilibility of the "dog" field for only one instance
+of the data structure. "-v dog-vis" means the value of the field "dog-vis"
+determines whether "dog" will be visible. If you use the -v flag you
+can no longer use the inlet of this [drawsymbol] object to control
+visibility globally.;
+#X text 19 382 Using the [set] object \, we can turn visibility on
+and off for an instance of the data structure by changing the value
+of "dog-vis". Notice when you click the toggle \, visibility only changes
+for one "dog"- the one which the [set] object is currently pointing
+to.;
+#X text 7 1 [drawsymbol] subpatch for data structure template;
+#X obj 23 130 drawsymbol cat 0 0 0 cat=;
+#X connect 0 0 15 0;
+#X connect 1 0 4 1;
+#X connect 2 0 4 0;
+#X restore 28 84 pd drawsymbol-help-template;
+#X text 201 84 <- click this subpatch to see how [drawsymbol] is used.
+;
+#X text 11 23 display a symbolic field of a template;
+#X text 98 460 Note: Attempting to scroll a symbol like a number will
+output the following message to the console (for each pixel scrolled!):
+drawnumber_motion: symbol;
+#X text 98 503 Unfortunately \, [append] does not accept symbols. Currently
+\, you must use [set] with the "-symbol" flag to set symbolic fields
+like those shown in the "drawsymbol-help-template" subpatch above.
+;
+#X text 168 161 - a list will be truncated to the first element.;
+#X text 98 420 Note: you cannot use both the -n and -v flag.;
+#X text 80 236 0-2 flags;
+#X text 168 341 - RGB color (0=black \, 999=white \, 900=red \, 90=green
+\, 9=blue \, 555=grey \, etc.).;
+#X text 168 369 - (optional) label ("cat=" for instance).;
+#X text 168 309 - relative x coordinate.;
+#X text 168 325 - relative y coordinate.;
+#X text 80 309 2) *;
+#X text 80 325 3) *;
+#X text 80 341 4) *;
+#X text 168 292 - the field name of the symbol to draw.;
+#X text 168 236 - "-n" flag to make the symbol invisible initially.
+;
+#X text 168 253 - a "-v [variable]" flag to assign a variable to make
+the symbol visible/invisible.;
+#X text 168 121 - [drawsymbol] has a single inlet to toggle visibility
+of the number. A zero makes it invisible. Any nonzero value makes it
+visible.;
+#X text 79 253 (symbol atoms);
+#X text 80 292 1) symbol atom;
+#X text 80 369 5) symbol atom;
+#X text 98 388 * Any of these can be numbers (float) or field names
+(symbol atom).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 326 556 pddp/pddplink ../4.data.structures/09.scaling.pd -text
+doc/4.data.structure/09.scaling.pd;
+#X obj 326 571 pddp/pddplink ../4.data.structures/10.onoff.pd -text
+doc/4.data.structures/10.onoff.pd;
+#X obj 98 571 pddp/pddplink all_about_z_order.pd;
+#X obj 98 556 pddp/pddplink scalar-help.pd;
diff --git a/doc/pddp/dynamic_sends.pd b/doc/pddp/dynamic_sends.pd
new file mode 100644
index 0000000000000000000000000000000000000000..224dcb22f520b8bb98166f80e20522252bf3195a
--- /dev/null
+++ b/doc/pddp/dynamic_sends.pd
@@ -0,0 +1,534 @@
+#N canvas 1 53 599 578 10;
+#N canvas 249 339 391 135 \$0-controlled 0;
+#X text 150 50 3I6OO9 3I6OO;
+#X restore 319 11 pd \$0-controlled;
+#N canvas 0 214 261 115 controlled 0;
+#X text 96 41 You rang?;
+#X restore 68 11 pd controlled;
+#X msg 46 99 \; pd-controlled vis \$1;
+#X obj 46 55 tgl 40 0 empty empty open_close 0 -12 1 12 -217060 -1
+-1 0 1;
+#X msg 310 107 vis \$1;
+#X obj 310 134 s pd-\$0-controlled;
+#N canvas 12 55 915 645 (subpatch) 0;
+#X obj 28 5 r pd-\$0-controlled;
+#X obj 28 27 route vis;
+#X obj 28 49 sel 1;
+#X obj 28 172 f;
+#X obj 65 172 + 1;
+#X obj 28 96 timer;
+#X obj 28 74 t b b;
+#X obj 28 150 b;
+#X msg 108 163 clear \, text 20 20 I'm not going any further if you
+refuse to take the time to read what I'm writing.;
+#X obj 28 226 route 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
+19 20;
+#X obj 209 513 s \$0-m;
+#X obj 28 558 s pd-\$0-controlled;
+#X msg 55 533 clear;
+#X obj 28 484 list trim;
+#X obj 28 508 t a b;
+#X obj 543 298 f;
+#X obj 579 298 + 1;
+#X obj 558 271 0;
+#X obj 543 325 + 1;
+#X obj 510 419 list split;
+#X obj 543 352 t b a;
+#X obj 510 391 list;
+#X obj 512 244 t b a b;
+#X obj 510 444 list prepend text 20 20;
+#X msg 549 524 clear;
+#X obj 510 498 t b a b;
+#X obj 510 471 list trim;
+#X obj 665 479 f;
+#X obj 677 273 500;
+#X obj 665 506 t a a;
+#X obj 692 532 * 0.05;
+#X obj 665 556 -;
+#X obj 649 613 t b a;
+#X obj 614 402 del;
+#X obj 194 451 del 750;
+#X floatatom 710 435 5 0 0 0 - - -;
+#X obj 28 118 moses 2500;
+#X obj 487 588 list;
+#X obj 490 554 del 1000;
+#X obj 487 611 list append LOL;
+#X obj 299 576 list prepend text 20 20;
+#X obj 301 590 list trim;
+#X obj 589 473 b;
+#X obj 488 631 list;
+#X obj 473 665 list append (call me);
+#X obj 570 563 del 1700;
+#X obj 512 154 list append Just quit looking in this window and we
+can both go back to do - ing what we were do - ing before YOU STARTED
+THIS LOOKING IN - SIDE - AH MY WIN - A - DOW P - A - N - E ! ! ! !
+! ! ! ! ! ! l ! ! 1 ! ! I ! !! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / --
+! ! ! ! ! ! ! ! ! @ ! ! ! ! ! ! ! ! ! ! ! ! ! !;
+#X msg 193 478 bng 0;
+#X obj 267 444 del 1800;
+#X obj 76 596 list trim;
+#X obj 274 488 b;
+#X obj 57 656 s pd-controlled;
+#X obj 212 615 b;
+#X obj 238 668 b;
+#X msg 161 688 vis 1 \, bng 0;
+#X obj 306 495 del 1500;
+#X obj 179 557 del 3000;
+#X obj 182 668 del 1000;
+#X obj 244 622 del 1400;
+#X obj 614 663 b;
+#X obj 726 653 b;
+#X obj 754 584 s \$0-frame-magick;
+#X obj 65 199 mod 6;
+#N canvas 0 0 450 300 many_bngs 0;
+#X obj 128 31 inlet;
+#X obj 128 97 f;
+#X obj 167 97 + 1;
+#X msg 131 166 bng 0;
+#X obj 130 215 outlet;
+#X obj 131 190 t b a;
+#X obj 69 128 del 50;
+#X obj 132 62 t a b;
+#X msg 189 62 0;
+#X obj 128 123 moses 100;
+#X connect 0 0 7 0;
+#X connect 1 0 2 0;
+#X connect 1 0 9 0;
+#X connect 2 0 1 1;
+#X connect 3 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 1 4 0;
+#X connect 6 0 1 0;
+#X connect 7 0 1 0;
+#X connect 7 1 8 0;
+#X connect 8 0 1 1;
+#X connect 9 0 3 0;
+#X restore 372 499 pd many_bngs;
+#X msg 307 520 bng 0;
+#X obj 320 619 del 800;
+#X obj 643 667 del 1400;
+#X obj 28 253 list append text 20 20 You better close this window right
+now and never open it again. I'm warning you... Yeah \, that's right.
+Just walk away \, you nosy person \, you...;
+#X obj 63 422 list append text 20 20 You know I'm a wizard \, right?
+I mean you know you just opened the window to a wizard's house \, and
+your about to get a spell put on you?;
+#X obj 86 395 list append text 20 20 Check yourself. Why \, there's
+a [bng] hanging from your little mouse pointer!;
+#X obj 268 468 list append text 20 60 Now mouse over my window \, nosy...
+;
+#X obj 309 674 del 2000;
+#N canvas 340 34 624 597 nbx 0;
+#X obj 92 26 inlet;
+#X obj 89 65 f \$0;
+#X obj 68 149 outlet;
+#X obj 177 155 del 50;
+#X obj 175 35 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 171 184 metro 1000;
+#X obj 242 147 0;
+#X obj 179 210 f;
+#X obj 211 211 + 1;
+#X obj 113 267 list prepend;
+#X obj 137 405 random 337;
+#X obj 140 432 + 1000;
+#X obj 158 363 random 37;
+#X obj 160 384 + 1300;
+#X obj 183 322 random 7;
+#X obj 184 343 + 1330;
+#X obj 121 296 route 0 1 2 3 4;
+#X msg 231 344 1337;
+#X msg 49 214 0;
+#X msg 294 71 0;
+#X obj 293 187 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 327 198 print;
+#X obj 247 239 moses 4;
+#X msg 285 269 0;
+#X obj 119 465 random 8999;
+#X obj 54 490 + 1000;
+#X obj 114 515 t a;
+#X obj 113 577 s \$0-nbx;
+#X obj 190 535 s \$0-nbx2;
+#X obj 271 535 s \$0-nbx3;
+#X obj 340 535 s \$0-nbx4;
+#X obj 410 535 s \$0-nbx5;
+#X msg 184 510 set \$1;
+#X msg 264 510 set \$1;
+#X msg 334 510 set \$1;
+#X msg 404 510 set \$1;
+#X obj 262 297 r \$0-nbxs;
+#X obj 330 295 r \$0-nbx2s;
+#X obj 401 295 r \$0-nbx3s;
+#X obj 470 295 r \$0-nbx4s;
+#X obj 540 295 r \$0-nbx5s;
+#X obj 277 385 f;
+#X obj 337 385 f;
+#X obj 407 385 f;
+#X obj 477 385 f;
+#X obj 547 385 f;
+#X obj 292 322 b;
+#X obj 306 343 del 4000;
+#X obj 362 322 b;
+#X obj 376 343 del 4000;
+#X obj 422 322 b;
+#X obj 436 343 del 4000;
+#X obj 482 322 b;
+#X obj 496 343 del 4000;
+#X obj 552 322 b;
+#X obj 566 343 del 4000;
+#X obj 254 447 line;
+#X msg 254 421 \$1 \, 1337 3.6e+06;
+#X msg 111 543 set \$1;
+#X obj 354 447 line;
+#X msg 354 421 \$1 \, 1337 3.6e+06;
+#X obj 464 447 line;
+#X msg 464 421 \$1 \, 1337 3.6e+06;
+#X obj 574 447 line;
+#X msg 574 421 \$1 \, 1337 3.6e+06;
+#X obj 584 497 line;
+#X msg 584 471 \$1 \, 1337 3.6e+06;
+#X obj 185 485 pipe 600;
+#X obj 265 485 pipe 900;
+#X obj 335 485 pipe 1500;
+#X obj 405 485 pipe 1900;
+#X msg 61 93 obj 350 160 nbx 10 35 0 1e+37 0 1 \$1-nbxs \$1-nbx empty
+15 -8 0 25 14 12 23 63 256 \, obj 350 200 nbx 10 35 0 1e+37 0 1 \$1-nbx2s
+\$1-nbx2 empty 15 -8 0 25 14 12 23 63 256 \, obj 436 120 nbx 10 35
+0 1e+37 0 1 \$1-nbx3s \$1-nbx3 empty 15 -8 0 15 14 12 23 63 256 \,
+obj 436 80 nbx 10 35 0 1e+37 0 1 \$1-nbx4s \$1-nbx4 empty 15 -8 0 15
+14 12 23 63 256 \, obj 436 40 nbx 10 35 0 1e+37 0 1 \$1-nbx5s \$1-nbx5
+empty 15 -8 0 15 14 12 23 63 256;
+#X obj 103 240 metro 60;
+#X connect 0 0 1 0;
+#X connect 0 0 6 0;
+#X connect 0 0 3 0;
+#X connect 1 0 71 0;
+#X connect 3 0 5 0;
+#X connect 3 0 72 0;
+#X connect 4 0 1 0;
+#X connect 4 0 6 0;
+#X connect 4 0 3 0;
+#X connect 5 0 7 0;
+#X connect 5 0 21 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 7 0 9 1;
+#X connect 7 0 22 0;
+#X connect 8 0 7 1;
+#X connect 9 0 16 0;
+#X connect 10 0 11 0;
+#X connect 11 0 26 0;
+#X connect 12 0 13 0;
+#X connect 13 0 26 0;
+#X connect 14 0 15 0;
+#X connect 15 0 26 0;
+#X connect 16 0 24 0;
+#X connect 16 1 10 0;
+#X connect 16 2 12 0;
+#X connect 16 3 14 0;
+#X connect 16 4 17 0;
+#X connect 17 0 26 0;
+#X connect 18 0 72 0;
+#X connect 19 0 6 0;
+#X connect 20 0 5 0;
+#X connect 22 1 23 0;
+#X connect 23 0 5 0;
+#X connect 23 0 17 0;
+#X connect 23 0 72 0;
+#X connect 24 0 25 0;
+#X connect 25 0 26 0;
+#X connect 26 0 58 0;
+#X connect 26 0 67 0;
+#X connect 26 0 68 0;
+#X connect 26 0 69 0;
+#X connect 26 0 70 0;
+#X connect 32 0 28 0;
+#X connect 33 0 29 0;
+#X connect 34 0 30 0;
+#X connect 35 0 31 0;
+#X connect 36 0 46 0;
+#X connect 36 0 41 1;
+#X connect 37 0 42 1;
+#X connect 37 0 48 0;
+#X connect 38 0 43 1;
+#X connect 38 0 50 0;
+#X connect 39 0 44 1;
+#X connect 39 0 52 0;
+#X connect 40 0 45 1;
+#X connect 40 0 54 0;
+#X connect 41 0 57 0;
+#X connect 42 0 60 0;
+#X connect 43 0 62 0;
+#X connect 44 0 64 0;
+#X connect 45 0 66 0;
+#X connect 46 0 47 0;
+#X connect 47 0 41 0;
+#X connect 48 0 49 0;
+#X connect 49 0 42 0;
+#X connect 50 0 51 0;
+#X connect 51 0 43 0;
+#X connect 52 0 53 0;
+#X connect 53 0 44 0;
+#X connect 54 0 55 0;
+#X connect 55 0 45 0;
+#X connect 56 0 58 0;
+#X connect 57 0 56 0;
+#X connect 58 0 27 0;
+#X connect 59 0 32 0;
+#X connect 60 0 59 0;
+#X connect 61 0 33 0;
+#X connect 62 0 61 0;
+#X connect 63 0 34 0;
+#X connect 64 0 63 0;
+#X connect 65 0 35 0;
+#X connect 66 0 65 0;
+#X connect 67 0 32 0;
+#X connect 68 0 33 0;
+#X connect 69 0 34 0;
+#X connect 70 0 35 0;
+#X connect 71 0 2 0;
+#X connect 72 0 9 0;
+#X restore 380 677 pd nbx;
+#X obj 242 643 list append text 20 100 I CAN BE EVERYWHERE AT ONCE...
+;
+#X obj 741 489 del 800;
+#X msg 771 528 vis 0;
+#X obj 661 581 max 20;
+#X obj 753 560 del 300;
+#X obj 230 354 list append text 20 20 You don't believe me \, do you?
+Ah \, they never do... How dreadful it must be to while away the hours
+as a hapless mortal...;
+#X obj 163 546 list append text 20 80 A wretch like you could never
+dream of doing this--;
+#X obj 712 626 list append text 150 50 3I6OO9 3I6OO;
+#N canvas 412 219 602 465 magic 0;
+#X obj 41 351 s \$0-m;
+#X obj 41 39 inlet;
+#X msg 41 165 vis 1 \, editmode 1 \, editmode 0 \, mouse 320 60 0 0
+0 \, mouseup 320 60 0 0 0;
+#X obj 296 9 inlet;
+#X msg 295 98 vis 0;
+#X obj 294 134 s pd-\$0-controlled;
+#X obj 297 70 spigot;
+#X obj 183 25 1;
+#X obj 299 41 del 0;
+#X connect 1 0 2 0;
+#X connect 1 0 7 0;
+#X connect 2 0 0 0;
+#X connect 3 0 8 0;
+#X connect 4 0 5 0;
+#X connect 6 0 4 0;
+#X connect 7 0 6 1;
+#X connect 8 0 6 0;
+#X restore 855 561 pd magic;
+#X obj 832 533 del 2000;
+#X obj 45 303 list append text 20 20 I should have guessed that a stranger
+blithely staring into my window would be less than polite. Lacking
+physical form has its upside: I'm in no physical danger from your rudeness.
+So I'll bite-- what the heck is your problem?;
+#X text 233 86 What? Wizards are messy!;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 6 0;
+#X connect 2 0 81 1;
+#X connect 3 0 4 0;
+#X connect 3 0 9 0;
+#X connect 4 0 62 0;
+#X connect 5 0 36 0;
+#X connect 6 0 5 0;
+#X connect 6 1 5 1;
+#X connect 7 0 3 0;
+#X connect 8 0 13 0;
+#X connect 9 0 67 0;
+#X connect 9 1 83 0;
+#X connect 9 2 68 0;
+#X connect 9 3 78 0;
+#X connect 9 4 34 0;
+#X connect 9 4 69 0;
+#X connect 9 5 46 0;
+#X connect 12 0 11 0;
+#X connect 13 0 14 0;
+#X connect 14 0 11 0;
+#X connect 14 1 12 0;
+#X connect 15 0 16 0;
+#X connect 15 0 18 0;
+#X connect 16 0 15 1;
+#X connect 17 0 15 1;
+#X connect 18 0 20 0;
+#X connect 19 0 23 0;
+#X connect 19 2 42 0;
+#X connect 20 0 21 0;
+#X connect 20 1 19 1;
+#X connect 21 0 19 0;
+#X connect 22 0 15 0;
+#X connect 22 1 21 1;
+#X connect 22 1 37 1;
+#X connect 22 2 17 0;
+#X connect 22 2 28 0;
+#X connect 23 0 26 0;
+#X connect 24 0 11 0;
+#X connect 25 0 27 0;
+#X connect 25 1 11 0;
+#X connect 25 2 24 0;
+#X connect 26 0 25 0;
+#X connect 27 0 29 0;
+#X connect 27 0 35 0;
+#X connect 28 0 27 1;
+#X connect 29 0 31 0;
+#X connect 29 1 30 0;
+#X connect 29 1 33 1;
+#X connect 30 0 31 1;
+#X connect 31 0 76 0;
+#X connect 32 0 33 0;
+#X connect 32 1 27 1;
+#X connect 33 0 15 0;
+#X connect 34 0 47 0;
+#X connect 34 0 48 0;
+#X connect 36 0 8 0;
+#X connect 36 1 7 0;
+#X connect 37 0 39 0;
+#X connect 38 0 37 0;
+#X connect 38 0 45 0;
+#X connect 39 0 40 0;
+#X connect 39 0 43 1;
+#X connect 40 0 41 0;
+#X connect 41 0 14 0;
+#X connect 42 0 38 0;
+#X connect 43 0 44 0;
+#X connect 44 0 40 0;
+#X connect 44 0 59 0;
+#X connect 45 0 43 0;
+#X connect 46 0 22 0;
+#X connect 47 0 10 0;
+#X connect 48 0 70 0;
+#X connect 49 0 11 0;
+#X connect 50 0 55 0;
+#X connect 52 0 58 0;
+#X connect 52 0 65 0;
+#X connect 53 0 57 0;
+#X connect 54 0 51 0;
+#X connect 55 0 56 0;
+#X connect 55 0 64 0;
+#X connect 56 0 79 0;
+#X connect 57 0 54 0;
+#X connect 58 0 73 0;
+#X connect 59 0 66 0;
+#X connect 60 0 74 0;
+#X connect 62 0 3 1;
+#X connect 63 0 11 0;
+#X connect 64 0 11 0;
+#X connect 65 0 63 0;
+#X connect 65 0 71 0;
+#X connect 66 0 80 0;
+#X connect 67 0 13 0;
+#X connect 68 0 13 0;
+#X connect 69 0 13 0;
+#X connect 70 0 49 0;
+#X connect 70 0 50 0;
+#X connect 71 0 72 0;
+#X connect 72 0 10 0;
+#X connect 73 0 49 0;
+#X connect 73 0 53 0;
+#X connect 74 0 75 0;
+#X connect 74 0 77 0;
+#X connect 75 0 11 0;
+#X connect 76 0 32 0;
+#X connect 77 0 61 0;
+#X connect 77 0 82 0;
+#X connect 78 0 13 0;
+#X connect 79 0 49 0;
+#X connect 79 0 52 0;
+#X connect 80 0 60 0;
+#X connect 80 0 13 0;
+#X connect 82 0 81 0;
+#X connect 83 0 13 0;
+#X restore 518 534 pd;
+#X obj 403 534 namecanvas \$0-m;
+#X obj 147 301 bng 15 250 50 0 empty \$0-frame-magick empty 17 7 0
+10 -262144 -1 -1;
+#N canvas 0 0 450 373 \$0-hhhhaaaannnnggggeeeerrrr 0;
+#X obj 117 66 inlet;
+#X obj 219 60 inlet;
+#X obj 219 133 del 400;
+#X obj 117 275 pack 0 \$0;
+#X msg 117 297 \; \$2-frame delta 0 \$1;
+#X obj 117 147 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 117 172 - 0.5;
+#X obj 117 194 * 16;
+#X msg 117 221 0 \, \$1 200;
+#X obj 117 248 line;
+#X msg 240 200 1;
+#X obj 117 93 spigot 1;
+#X obj 117 120 t b b;
+#X msg 181 94 0;
+#X obj 240 175 del 250;
+#X obj 219 108 t b b;
+#X obj 219 84 spigot 1;
+#X msg 284 96 0;
+#X msg 62 134 set 0;
+#X connect 0 0 11 0;
+#X connect 1 0 16 0;
+#X connect 2 0 5 0;
+#X connect 2 0 14 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 11 1;
+#X connect 10 0 16 1;
+#X connect 11 0 12 0;
+#X connect 12 0 5 0;
+#X connect 12 1 13 0;
+#X connect 13 0 11 1;
+#X connect 14 0 10 0;
+#X connect 15 0 2 0;
+#X connect 15 1 17 0;
+#X connect 16 0 15 0;
+#X connect 17 0 16 1;
+#X connect 18 0 5 0;
+#X restore 68 342 pd \$0-hhhhaaaannnnggggeeeerrrr;
+#X obj 61 336 cnv 15 200 200 empty \$0-frame empty 20 12 0 14 -66577
+-66577 0;
+#X obj 66 341 cnv 15 190 190 empty \$0-frame empty 20 12 0 14 -198977
+-66577 0;
+#X obj 71 346 cnv 15 180 180 empty \$0-frame empty 20 12 0 14 -66577
+-66577 0;
+#X obj 76 351 cnv 15 170 170 empty \$0-frame empty 20 12 0 14 -232882
+-66577 0;
+#X obj 79 394 f \$0;
+#X symbolatom 87 435 0 0 0 0 - - -;
+#X obj 79 413 makesymbol pd-%s-controlled;
+#X msg 79 485 \; \$1 vis \$2;
+#X obj 79 456 pack symbol float;
+#X obj 79 370 t b f;
+#X text 9 193 In the old days \, \$0 was only expanded if it started
+the name \, so it was necessary to use [makesymbol] in order to put
+the value of \$0 into the middle of the name (as in the patch below).
+Additionally \, the entire patch had to be drawn by hand on a punchcard
+(taking care to avoid punching any holes whatsoever) and then given
+directly to Miller \, who would file it away in a drawer for safekeeping
+through the harsh Winter months.;
+#X text 277 391 Vintage Pd Patch;
+#X text 277 411 Medium: Pixels on Canvas;
+#X text 277 431 Artist: Petey Deepea;
+#X text 277 451 Price: Less than 1k;
+#X text 9 152 Since dollarsign variables will now expand in the middle
+of a symbol \, this help patch is deprecated. Dynamic sends using the
+message box can still be handy \, however.;
+#X obj 310 57 tgl 40 0 empty empty open_close 0 -12 1 12 -217060 -1
+-1 0 1;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 1;
+#X connect 14 0 16 0;
+#X connect 16 0 15 0;
+#X connect 16 0 18 0;
+#X connect 18 0 17 0;
+#X connect 19 0 14 0;
+#X connect 19 1 18 1;
+#X connect 26 0 4 0;
diff --git a/doc/pddp/element-help.pd b/doc/pddp/element-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..dda82ecd2129ea9f764a33e898c63c488fbef385
--- /dev/null
+++ b/doc/pddp/element-help.pd
@@ -0,0 +1,137 @@
+#N struct element-help-template float x float y array array1 array1-element-help-template
+;
+#N struct array1-element-help-template float y;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header element 3 12 0 18
+-204280 -1 0;
+#X obj 0 333 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 55 244 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.4. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control data_structure array;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 pointer;
+#X text 12 105 INLET_2 pointer;
+#X text 12 45 DESCRIPTION get pointer to an element of an array;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 449 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 493 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 553 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 82 455 428 134 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 92 72 struct;
+#X obj 142 72 drawpolygon;
+#X obj 223 72 plot;
+#X obj 17 72 drawsymbol;
+#X obj 262 72 drawcurve;
+#X obj 71 37 get;
+#X obj 102 37 set;
+#X obj 131 37 getsize;
+#X obj 185 37 setsize;
+#X obj 17 37 pointer;
+#X obj 240 37 drawnumber;
+#X text 7 1 [element] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 342 cnv 17 3 70 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 99 343 float;
+#X text 98 398 list;
+#X text 228 255 <- subpatch to display the data structures;
+#X obj 475 3 element;
+#X obj 450 20 pddp/pddplink http://wiki.puredata.info/en/element -text
+pdpedia: element;
+#N canvas 80 372 428 228 element-help-data 0;
+#X scalar element-help-template 40 40 \; 19 \; 0 \; 11 \; 9 \; 41 \;
+14 \; 31 \; 38 \; 33 \; \;;
+#X obj 0 0 cnv 15 425 20 empty empty empty 20 12 2 14 -204280 -195568
+0;
+#X text 5 0 Window to Display Data Structure Instances;
+#X text 20 155 You can also click and drag each element vertically
+to change its value. When there is no "x" field specified (as in the
+template array1-element-help-template) you can click and drag horizontally
+to change multiple elements in one mouse swoop.;
+#X text 20 110 Each purple square above represents one element of the
+array. Using the [element] object in the parent window you can get
+the y-value of each element.;
+#X restore 77 257 pd element-help-data;
+#N canvas 73 89 428 189 element-help-template 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [element] subpatch;
+#X obj 21 76 struct element-help-template float x float y array array1
+array1-element-help-template;
+#X obj 21 158 filledpolygon 777 666 1 -10 -10 210 -10 210 65 -10 65
+;
+#X obj 21 120 plot -y y(0:41)(41:0) array1 500 1 0 15 25;
+#X text 18 37 This [struct] contains an array "array1." The elements
+of this array are defined by array1-element-help-template;
+#X restore 77 279 pd element-help-template;
+#N canvas 80 82 428 218 array1-element-help-template 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 6 1 [element] subpatch;
+#X obj 21 73 struct array1-element-help-template float y;
+#X obj 21 131 drawnumber y -5 -20 0;
+#X obj 21 102 filledpolygon 509 0 1 -5 0 0 5 5 0 0 -5;
+#X text 19 37 This [struct] is used in element-help-template to define
+the elements of the array "array1.";
+#X text 20 158 When "array1" is plotted \, each element will be represented
+by a purple box and a number \, as specified here by the [filledpolygon]
+and [drawnumber] objects.;
+#X restore 77 301 pd array1-element-help-template;
+#X obj 78 421 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 420 pointer;
+#X text 169 343 - [element] takes a float to its left inlet \, which
+specifies the element of an array. Indices range from zero to the number
+of elements minus one. Indices out of range are quietly replaced by
+the nearest endpoint.;
+#X obj 78 458 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 459 pointer;
+#X text 168 459 - when [element] receives a float to its left inlet
+\, it outputs a pointer to the specified element of the array.;
+#X obj 297 107 pointer;
+#X floatatom 125 209 5 0 0 0 - - -;
+#X text 130 156 outlet is pointer to single element;
+#X text 176 207 here we just get the value of y.;
+#X msg 297 83 traverse pd-element-help-data \, next;
+#X obj 125 135 element element-help-template array1;
+#X obj 125 182 get array1-element-help-template y;
+#X obj 125 112 hradio 15 1 0 9 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 155 93 index (0-8);
+#X floatatom 81 135 5 0 0 0 - - -;
+#X text 11 23 get pointer to an element of an array;
+#X text 168 527 - field name. The field name must be an array.;
+#X text 168 398 - a list will be truncated to the first element.;
+#X text 168 512 - name of the template.;
+#X text 168 420 - the right inlet of [element] takes a pointer to a
+scalar.;
+#X text 80 512 1) symbol atom;
+#X text 80 527 2) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 557 pddp/pddplink all_about_arrays.pd;
+#X obj 98 572 pddp/pddplink scalar-help.pd;
+#X text 125 75 2 ... then here;
+#X text 299 63 1 Click here first...;
+#X connect 23 0 28 1;
+#X connect 27 0 23 0;
+#X connect 28 0 29 0;
+#X connect 29 0 24 0;
+#X connect 30 0 28 0;
+#X connect 30 0 32 0;
diff --git a/doc/pddp/env~-help.pd b/doc/pddp/env~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..953ddc55105a132ade0e5b7d470f4dbab7218702
--- /dev/null
+++ b/doc/pddp/env~-help.pd
@@ -0,0 +1,77 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header env~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 343 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 243 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_1 float;
+#X text 12 45 DESCRIPTION envelope follower;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 380 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 434 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 535 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 352 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 389 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 351 signal;
+#X obj 493 3 env~;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/env~ -text
+pdpedia: env~;
+#X text 98 539 The analysis is "Hanning" (raised cosine) windowed.
+;
+#X text 98 389 float;
+#X floatatom 74 263 0 0 0 0 - - -;
+#X obj 74 140 osc~ 400;
+#X obj 74 167 *~;
+#X floatatom 166 116 3 -99 300 0 - - -;
+#X obj 166 140 dbtorms;
+#X text 194 114 <- set peak-to-peak amplitude here in dB.;
+#X text 110 264 <- the output is RMS amplitude which (for a sinusoid)
+is about 3 dB below peak-to-peak amplitude.;
+#X obj 74 200 env~ 16384 8192;
+#N canvas 97 488 428 101 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 9 38 threshold~;
+#X text 7 1 [env~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 11 23 envelope follower;
+#X text 168 452 - (optional) the analysis window size in samples (the
+default is 1024).;
+#X text 80 452 1) float;
+#X text 80 479 2) float;
+#X text 168 479 - (optional) the period (the number of samples per
+analysis-- window/2 by default). This should normally be a multiple
+of the DSP block size \, although this isn't enforced.;
+#X text 168 389 - the [env~] object takes a signal and outputs its
+RMS amplitude in dB (with 1 normalized to 100 dB.) Output is bounded
+below by zero.;
+#X text 168 351 - the incoming signal;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 557 pddp/pddplink ../3.audio.examples/C07.envelope.follower.pd
+-text doc.3.audio.examples/C07.envelope.follower.pd;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/H06.envelope.follower.pd
+-text doc.3.audio.examples/H06.envelope.follower.pd;
+#X connect 15 0 16 0;
+#X connect 16 0 21 0;
+#X connect 17 0 18 0;
+#X connect 18 0 16 1;
+#X connect 21 0 14 0;
+#X connect 21 0 14 0;
diff --git a/doc/pddp/exp-help.pd b/doc/pddp/exp-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..14e49ebe10216d6d11ba9fac4b3d927f12067a3c
--- /dev/null
+++ b/doc/pddp/exp-help.pd
@@ -0,0 +1,69 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header exp 3 12 0 18 -204280
+-1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 45 DESCRIPTION raise e to the nth power;
+#X restore 500 597 pd META;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 543 (none);
+#N canvas 104 478 428 108 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 181 42 log;
+#X obj 208 42 abs;
+#X obj 236 42 sqrt;
+#X obj 271 42 pow;
+#X obj 56 75 cos~;
+#X obj 88 75 osc~;
+#X obj 22 75 expr;
+#X obj 22 42 sin;
+#X obj 48 42 cos;
+#X obj 75 42 tan;
+#X obj 108 42 atan;
+#X text 7 1 [exp] Related Objects;
+#X obj 143 42 atan2;
+#X restore 101 597 pd Related_objects;
+#X obj 78 446 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 float;
+#X text 98 510 float;
+#X obj 78 511 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 491 3 exp;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/exp -text
+pdpedia: exp;
+#X floatatom 239 187 0 0 0 0 - - -;
+#X floatatom 239 130 0 0 0 0 - - -;
+#X obj 239 158 exp;
+#X text 296 234 n;
+#X text 103 237 [exp] will output the value of E;
+#X text 104 252 where E is Euler's constant and n is the value of the
+inlet.;
+#X text 11 23 raise e to the nth power;
+#X text 168 465 - a list will be truncated \, and the first element
+will be used as input.;
+#X text 98 465 list;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 16 0 17 0;
+#X connect 17 0 15 0;
diff --git a/doc/pddp/expr-help.pd b/doc/pddp/expr-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..883d34208412edd5bc7dd04afcf80b6af22d690b
--- /dev/null
+++ b/doc/pddp/expr-help.pd
@@ -0,0 +1,292 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header expr 3 12 0 18 -204280
+-1 0;
+#X obj 0 118 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 0 418 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 449 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 537 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 127 cnv 17 3 153 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 126 float;
+#X text 98 426 float;
+#X obj 78 426 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 286 cnv 17 3 123 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 285 float;
+#X obj 489 4 expr;
+#X obj 465 21 pddp/pddplink http://wiki.puredata.info/en/expr -text
+pdpedia: expr;
+#X floatatom 87 50 0 0 0 0 - - -;
+#X floatatom 21 96 0 0 0 0 - - -;
+#X msg 21 50 bang;
+#X floatatom 87 96 0 0 0 0 - - -;
+#X floatatom 432 48 0 0 0 0 - - -;
+#X floatatom 432 95 0 0 0 0 - - -;
+#X obj 432 73 expr $f1 * $f2;
+#X floatatom 513 48 0 0 0 0 - - -;
+#X floatatom 185 49 0 0 0 0 - - -;
+#X floatatom 185 96 0 0 0 0 - - -;
+#X obj 185 74 expr sin(2 * 3.14159 * $f1 / 360);
+#X text 98 205 symbol;
+#X text 98 398 symbol;
+#X text 98 242 bang;
+#X obj 87 74 expr 2 + $f1;
+#N canvas 96 45 428 436 expr_and_symbols 0;
+#X floatatom 24 177 0 0 0 0 - - -;
+#X floatatom 24 232 0 0 0 0 - - -;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-expr-array 515 float 3;
+#A 0 -0.0122715 0 0.0122715 0.0245412 0.0368072 0.0490676 0.0613207
+0.0735645 0.0857972 0.0980171 0.110222 0.122411 0.134581 0.14673 0.158858
+0.170962 0.18304 0.19509 0.207111 0.219101 0.231058 0.24298 0.254865
+0.266713 0.278519 0.290284 0.302006 0.313681 0.32531 0.33689 0.348418
+0.359895 0.371317 0.382683 0.393992 0.405241 0.416429 0.427555 0.438616
+0.449611 0.460538 0.471396 0.482183 0.492898 0.503538 0.514102 0.524589
+0.534997 0.545325 0.55557 0.565731 0.575808 0.585797 0.595699 0.605511
+0.615231 0.624859 0.634393 0.643831 0.653172 0.662415 0.671558 0.680601
+0.68954 0.698376 0.707106 0.71573 0.724247 0.732654 0.740951 0.749136
+0.757208 0.765167 0.77301 0.780737 0.788346 0.795836 0.803207 0.810457
+0.817584 0.824589 0.831469 0.838224 0.844853 0.851355 0.857728 0.863972
+0.870087 0.87607 0.881921 0.887639 0.893224 0.898674 0.903989 0.909168
+0.914209 0.919113 0.923879 0.928506 0.932992 0.937339 0.941544 0.945607
+0.949528 0.953306 0.95694 0.96043 0.963776 0.966976 0.970031 0.97294
+0.975702 0.978317 0.980785 0.983105 0.985277 0.987301 0.989176 0.990902
+0.992479 0.993907 0.995185 0.996312 0.99729 0.998118 0.998795 0.999322
+0.999699 0.999925 1 0.999925 0.999699 0.999322 0.998796 0.998118 0.997291
+0.996313 0.995185 0.993907 0.99248 0.990903 0.989177 0.987302 0.985278
+0.983106 0.980786 0.978318 0.975702 0.97294 0.970032 0.966977 0.963776
+0.960431 0.956941 0.953306 0.949529 0.945608 0.941545 0.93734 0.932993
+0.928507 0.92388 0.919115 0.91421 0.909169 0.90399 0.898675 0.893225
+0.88764 0.881922 0.876071 0.870088 0.863974 0.85773 0.851356 0.844855
+0.838226 0.831471 0.82459 0.817586 0.810458 0.803209 0.795838 0.788348
+0.780738 0.773012 0.765168 0.75721 0.749138 0.740952 0.732656 0.724248
+0.715732 0.707108 0.698378 0.689542 0.680602 0.67156 0.662417 0.653174
+0.643833 0.634395 0.624861 0.615233 0.605513 0.595701 0.5858 0.57581
+0.565734 0.555572 0.545327 0.534999 0.524592 0.514105 0.50354 0.4929
+0.482186 0.471399 0.460541 0.449613 0.438618 0.427557 0.416432 0.405243
+0.393994 0.382686 0.371319 0.359897 0.348421 0.336892 0.325313 0.313684
+0.302008 0.290287 0.278522 0.266715 0.254868 0.242983 0.231061 0.219104
+0.207114 0.195093 0.183042 0.170964 0.158861 0.146733 0.134583 0.122413
+0.110225 0.0980197 0.0857999 0.0735671 0.0613233 0.0490703 0.0368098
+0.0245439 0.0122742 2.65359e-06 -0.0122689 -0.0245386 -0.0368045 -0.049065
+-0.061318 -0.0735619 -0.0857946 -0.0980144 -0.110219 -0.122408 -0.134578
+-0.146728 -0.158855 -0.170959 -0.183037 -0.195088 -0.207109 -0.219098
+-0.231055 -0.242977 -0.254863 -0.26671 -0.278517 -0.290282 -0.302003
+-0.313679 -0.325308 -0.336887 -0.348416 -0.359892 -0.371314 -0.382681
+-0.393989 -0.405239 -0.416427 -0.427552 -0.438614 -0.449609 -0.460536
+-0.471394 -0.482181 -0.492896 -0.503536 -0.5141 -0.524587 -0.534995
+-0.545322 -0.555568 -0.565729 -0.575806 -0.585795 -0.595697 -0.605509
+-0.615229 -0.624857 -0.634391 -0.643829 -0.65317 -0.662413 -0.671557
+-0.680599 -0.689538 -0.698374 -0.707104 -0.715729 -0.724245 -0.732652
+-0.740949 -0.749134 -0.757207 -0.765165 -0.773008 -0.780735 -0.788344
+-0.795835 -0.803205 -0.810455 -0.817583 -0.824587 -0.831468 -0.838223
+-0.844852 -0.851353 -0.857727 -0.863971 -0.870085 -0.876068 -0.88192
+-0.887638 -0.893223 -0.898673 -0.903988 -0.909166 -0.914208 -0.919112
+-0.923878 -0.928505 -0.932992 -0.937338 -0.941543 -0.945606 -0.949527
+-0.953305 -0.956939 -0.960429 -0.963775 -0.966976 -0.97003 -0.972939
+-0.975701 -0.978317 -0.980785 -0.983105 -0.985277 -0.987301 -0.989176
+-0.990902 -0.992479 -0.993907 -0.995184 -0.996312 -0.99729 -0.998118
+-0.998795 -0.999322 -0.999699 -0.999925 -1 -0.999925 -0.999699 -0.999323
+-0.998796 -0.998118 -0.997291 -0.996313 -0.995185 -0.993907 -0.99248
+-0.990903 -0.989177 -0.987302 -0.985278 -0.983106 -0.980786 -0.978318
+-0.975703 -0.972941 -0.970032 -0.966978 -0.963777 -0.960432 -0.956942
+-0.953307 -0.94953 -0.945609 -0.941545 -0.93734 -0.932994 -0.928508
+-0.923881 -0.919116 -0.914212 -0.90917 -0.903991 -0.898676 -0.893226
+-0.887642 -0.881923 -0.876072 -0.870089 -0.863975 -0.857731 -0.851358
+-0.844856 -0.838227 -0.831472 -0.824592 -0.817587 -0.81046 -0.80321
+-0.79584 -0.788349 -0.78074 -0.773013 -0.76517 -0.757212 -0.749139
+-0.740954 -0.732657 -0.72425 -0.715734 -0.70711 -0.69838 -0.689544
+-0.680604 -0.671562 -0.662419 -0.653176 -0.643835 -0.634397 -0.624863
+-0.615235 -0.605515 -0.595703 -0.585802 -0.575812 -0.565736 -0.555574
+-0.545329 -0.535002 -0.524594 -0.514107 -0.503543 -0.492902 -0.482188
+-0.471401 -0.460543 -0.449616 -0.438621 -0.42756 -0.416434 -0.405246
+-0.393997 -0.382688 -0.371322 -0.3599 -0.348423 -0.336895 -0.325315
+-0.313687 -0.302011 -0.29029 -0.278525 -0.266718 -0.254871 -0.242985
+-0.231063 -0.219106 -0.207116 -0.195095 -0.183045 -0.170967 -0.158863
+-0.146736 -0.134586 -0.122416 -0.110227 -0.0980223 -0.0858025 -0.0735698
+-0.061326 -0.0490729 -0.0368125 -0.0245465 -0.0122768 -5.30718e-06
+0.0122662;
+#X coords 0 1 515 -1 200 140 1;
+#X restore 24 279 graph;
+#X obj 240 366 loadbang;
+#X msg 240 388 \; expr-array2 sinesum 512 1;
+#X obj 99 156 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 99 176 symbol \$0-expr-array;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 24 204 expr $s2[$f1];
+#X text 21 37 Symbolic arguments like $s1 \, $s2 \, and so on are currently
+used in [expr] to get the name of an array or table. You can also type
+the name of an array directly into [expr] \, but this is limited since
+\, for example \, a dash ("e.g. \, my-table") will get interpreted
+as an operator ("e.g. \, my minus table").;
+#X text 113 219 of the array will be clipped;
+#X text 113 204 index values outside the range;
+#X text 20 116 The following syntax outputs the y-value for the element
+specified by the left inlet.;
+#X text 118 154 click here first;
+#X text 8 2 [expr] Using Symbolic Arguments;
+#X connect 0 0 8 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 6 0 8 1;
+#X connect 8 0 1 0;
+#X restore 169 397 pd expr_and_symbols;
+#X obj 21 74 expr 1;
+#X text 168 426 - float is the only type of output.;
+#X obj 273 577 pddplink http://crca.ucsd.edu/~syadegar/expr.html;
+#X text 273 563 Expr family of objects by Shahrokh Yadegari;
+#N canvas 91 55 428 501 expr_weirdness 0;
+#X obj 42 98 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 42 143 5 0 0 0 - - -;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 42 119 expr 8 / 6;
+#X obj 42 254 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 42 302 5 0 0 0 - - -;
+#X obj 42 331 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 42 379 5 0 0 0 - - -;
+#X text 19 166 This gets tricky \, because Pd strips unnecessary characters
+from a floating point number. Hence \, if you try to type "8.0 / 6.0"
+in the [expr] object above \, the decimal point and the following zero
+will be removed once you click outside the object (try it).;
+#X text 19 230 There are several work-arounds for this problem:;
+#X text 19 253 1;
+#X text 19 330 2;
+#X obj 42 278 expr (8.0) / (6.0);
+#X text 79 143 "8" and "6" above are interpreted as integers;
+#X text 65 248 Putting parentheses next to the number forces Pd to
+interpret it as a symbol \, so no characters are stripped.;
+#X obj 42 355 expr 8.0/6.0;
+#X text 65 324 Removing the space between the numbers and the operator
+achieves the same thing.;
+#X obj 42 411 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 42 459 5 0 0 0 - - -;
+#X text 19 410 3;
+#X text 65 410 Using the "float" function makes the float type explicit.
+;
+#X obj 42 435 expr float(8) / 6;
+#X text 7 2 [expr] Weirdness with Floats vs. Ints;
+#X text 19 38 Numbers used in [expr~] follow the Max/MSP paradigm \,
+where numbers without a decimal point are interpreted as integers.
+This can be the source of some confusion in Pd \, which uses floating
+point numbers exclusively.;
+#X obj 22 576 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 22 618 5 0 0 0 - - -;
+#X text 19 486 Since float has priority over int \, the integer in
+example 3 is automatically converted to a float. Likewise \, using
+"6" instead of "6.0" in examples 1 and 2 would still give a floating
+point result.;
+#X text 19 539 These details come in handy if you want to use an integer
+to specify a large number:;
+#X text 166 595 What happens if you put a space;
+#X obj 22 596 expr 123456789%10;
+#X text 167 610 between the "%" sign and these integers?;
+#X text 19 704 Unfortunately \, [expr] doesn't understand scientific
+notation. But even if it did \, a float will lose precision in this
+calculation:;
+#X text 165 625 (Scroll down for the answer);
+#X obj 22 747 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 22 789 5 0 0 0 - - -;
+#X obj 22 767 expr int(123456789.0)%10;
+#X connect 0 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 12 0;
+#X connect 6 0 15 0;
+#X connect 12 0 5 0;
+#X connect 15 0 7 0;
+#X connect 17 0 21 0;
+#X connect 21 0 18 0;
+#X connect 24 0 29 0;
+#X connect 29 0 25 0;
+#X connect 33 0 35 0;
+#X connect 35 0 34 0;
+#X restore 275 546 pd expr_weirdness;
+#X text 11 24 expression evaluation of control data;
+#X text 98 269 list;
+#X msg 395 48 3 4;
+#X text 183 350 1) a dollar-sign ($);
+#X text 166 285 - an extra inlet is added for each additional dollar-sign
+variable specified as a creation argument ($v2 \, $f3 \, etc.). Each
+inlet accepts only one of the following: signal \, float \, or symbol.
+There may be at most nine variables in one [expr~] object. Each variable
+consists of:;
+#X text 183 363 2) "v" \, "f" \, "i" or "s" (signal \, float \, integer
+or symbol);
+#X text 183 376 3) an inlet number (Note: inlet numbers start from
+one);
+#X text 168 205 - if the variable $s1 is used as an argument \, it
+will be replaced by the incoming symbol. (If $f1 \, $i1 \, and $s1
+are not used as arguments \, the symbol will trigger the output.);
+#X text 168 126 - if the variable $f1 (float) or $i1 (integer) is specified
+as an argument \, it will be replaced in the expression by the incoming
+value. The expression will then be evaluated and output. (Notes: You
+cannot use $f1 and $i1 in the same [expr] object. If $f1 \, $i1 \,
+and $s1 are not used as arguments \, an incoming float will trigger
+the output.);
+#X text 168 243 - a bang will evaluate the expression with the last
+received values and trigger the output.;
+#X text 167 463 - the arguments themselves form the expression to evaluate.
+They may be floats or symbols \, including the special variables noted
+above ($i1 \, $f2 \, etc.). The operators and functions available for
+use in [expr~] are listed below:;
+#X text 168 269 - a list will be distributed to the inlets of [expr].
+;
+#X obj 170 516 pddp/pddplink all_about_expr_functions.pd -text all_about_expr_operators_and_functions
+;
+#X text 80 463 n) float;
+#X text 98 475 symbol atom;
+#X text 98 489 comma;
+#X text 98 502 semicolon;
+#X obj 101 546 pddp/pddplink all_about_expr_if.pd -text expr_if;
+#X obj 101 561 pddp/pddplink all_about_expr_and_value.pd -text expr_and_value
+;
+#X obj 101 578 pddp/pddplink all_about_expr_multiline.pd -text expr_multiline
+;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#N canvas 52 244 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 145 AUTHOR Shahrokh Yadegari;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd 0.35 test 26 and expr*
+0.4. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control nonlocal trigonometry;
+#X text 12 65 INLET_0 float bang symbol list;
+#X text 12 85 INLET_N float symbol;
+#X text 12 105 OUTLET_N float;
+#X text 12 45 DESCRIPTION expression evaluation of control data;
+#X text 12 185 RELEASE_DATE 1989;
+#X text 12 25 LICENSE GPL v2;
+#X restore 500 598 pd META;
+#N canvas 102 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 expr~;
+#X obj 62 43 fexpr~;
+#X text 7 2 [expr] Related Objects;
+#X restore 101 598 pd Related_objects;
+#X obj 4 598 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 13 0 27 0;
+#X connect 15 0 29 0;
+#X connect 17 0 19 0;
+#X connect 19 0 18 0;
+#X connect 20 0 19 1;
+#X connect 21 0 23 0;
+#X connect 23 0 22 0;
+#X connect 27 0 16 0;
+#X connect 29 0 14 0;
+#X connect 36 0 19 0;
diff --git a/doc/pddp/expr~-help.pd b/doc/pddp/expr~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0f8fa3c3be26daf2c913be0422d21e37fea04172
--- /dev/null
+++ b/doc/pddp/expr~-help.pd
@@ -0,0 +1,199 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header expr~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 185 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 145 AUTHOR Shahrokh Yadegari;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd 0.35 test 26 and expr*
+0.4. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS signal nonlocal trigonometry;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_N float symbol signal;
+#X text 12 105 OUTLET_N signal;
+#X text 12 45 DESCRIPTION expression evaluation of signal data (vector)
+;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~syadegar/expr.html;
+#X text 12 185 RELEASE_DATE 1999;
+#X text 12 25 LICENSE GPL v2;
+#X restore 500 597 pd META;
+#X obj 0 368 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 405 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 500 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 105 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 61 42 fexpr~;
+#X obj 21 42 expr;
+#X text 7 1 [expr~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 194 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 377 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 235 cnv 17 3 125 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 252 float;
+#X text 98 343 symbol;
+#X obj 273 572 pddplink http://crca.ucsd.edu/~syadegar/expr.html;
+#X text 273 555 Expr family of objects by Shahrokh Yadegari;
+#X obj 483 3 expr~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/expr~ -text
+pdpedia: expr~;
+#X obj 18 159 print~;
+#X msg 31 138 bang;
+#X obj 18 94 sig~ 440;
+#X floatatom 93 94 0 0 0 0 - - -;
+#X floatatom 18 71 0 0 0 0 - - -;
+#X obj 18 117 expr~ $v1*$f2;
+#X obj 163 149 print~;
+#X msg 175 128 bang;
+#X floatatom 163 84 0 0 0 0 - - -;
+#X floatatom 238 84 0 0 0 0 - - -;
+#X floatatom 363 109 0 0 0 0 - - -;
+#X floatatom 307 84 0 0 0 0 - - -;
+#X obj 307 109 osc~;
+#X text 16 52 vector times scalar;
+#X text 161 53 vector;
+#X obj 306 159 dac~;
+#X text 304 54 frequency;
+#X obj 163 107 expr~ $v1*$v2;
+#X obj 306 130 expr~ $v1*$f2/128;
+#X text 98 193 signal;
+#X text 98 235 signal;
+#X obj 366 78 hsl 50 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X text 98 377 signal;
+#N canvas 117 43 428 483 More_expr~_examples 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X floatatom 237 101 5 0 0 0 - - -;
+#X obj 24 150 tabsend~ a1;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array a1 64 float 0;
+#X coords 0 1 63 -1 100 70 1;
+#X restore 25 192 graph;
+#X obj 24 127 expr~ max(min($v1 \, $f2/10) \, -$f2/10);
+#X text 22 40 A simple limiter example;
+#X obj 24 103 osc~ 2756.25;
+#X text 152 66 Move the value below between 0 and 10;
+#X text 156 81 to change the limiter threshold;
+#X obj 25 344 tabsend~ a2;
+#X obj 167 344 tabsend~ a3;
+#X obj 25 275 osc~ 2756.25;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array a2 64 float 1;
+#A 0 0.549579 0.537788 0.441331 0.271876 0.0531549 -0.182367 -0.398338
+-0.56015 -0.640495 -0.623948 -0.509821 -0.31276 -0.0608986 0.208152
+0.45295 0.634629 0.72309 0.702001 0.571703 0.349599 0.0678645 -0.231227
+-0.501668 -0.700852 -0.796298 -0.770949 -0.626166 -0.381895 -0.0739361
+0.251307 0.543884 0.757993 0.859183 0.829905 0.672509 0.409237 0.0790617
+-0.268115 -0.579036 -0.805301 -0.910919 -0.87807 -0.710105 -0.431258
+-0.0831469 0.281461 0.606691 0.842151 0.950817 0.914845 0.738504 0.447701
+0.0861703 -0.291136 -0.626444 -0.868064 -0.978385 -0.939756 -0.757318
+-0.458317 -0.0880561 0.297047 0.638088 0.882729;
+#X coords 0 1 63 -1 100 70 1;
+#X restore 25 394 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array a3 64 float 0;
+#X coords 0 1 63 -1 100 70 1;
+#X restore 147 394 graph;
+#X obj 167 275 osc~ 100;
+#X obj 25 303 expr~ $v1*$v2 \; if ($v2 > 0 \, 0 \, $v1*$v2);
+#X text 8 2 [expr~] More examples;
+#X connect 1 0 4 1;
+#X connect 4 0 2 0;
+#X connect 6 0 4 0;
+#X connect 11 0 15 0;
+#X connect 14 0 15 1;
+#X connect 15 0 9 0;
+#X connect 15 1 10 0;
+#X restore 101 569 pd More_expr~_examples;
+#N canvas 56 89 428 436 expr_and_symbols 0;
+#X floatatom 24 177 0 0 0 0 - - -;
+#X floatatom 24 232 0 0 0 0 - - -;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-expr-array 515 float 2;
+#X coords 0 1 515 -1 200 140 1;
+#X restore 24 279 graph;
+#X obj 240 338 loadbang;
+#X obj 99 156 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 99 176 symbol \$0-expr-array;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 24 204 expr $s2[$f1];
+#X text 113 219 of the array will be clipped;
+#X text 113 204 index values outside the range;
+#X text 20 116 The following syntax outputs the y-value for the element
+specified by the left inlet.;
+#X text 118 154 click here first;
+#X text 8 2 [expr~] Using Symbolic Arguments;
+#X obj 240 362 f \$0;
+#X msg 240 388 \; \$1-expr-array sinesum 512 1;
+#X text 21 37 Symbolic arguments like $s1 \, $s2 \, and so on are currently
+used in [expr] \, [expr~] \, and [fexpr~] to get the name of an array
+or table. You can also type the name of an array directly into [expr]
+\, but this is limited since \, for example \, a dash (e.g. \, "my-table")
+will get interpreted as an operator (e.g. \, "my minus table").;
+#X connect 0 0 7 0;
+#X connect 3 0 13 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 1;
+#X connect 7 0 1 0;
+#X connect 13 0 14 0;
+#X restore 170 343 pd expr_and_symbols;
+#X text 11 23 expression evaluation of signal data (vector);
+#X text 384 93 amplitude;
+#X text 183 298 1) a dollar-sign ($);
+#X text 166 234 - an extra inlet is added for each additional dollar-sign
+variable specified as a creation argument ($v2 \, $f3 \, etc.). Each
+inlet accepts only one of the following: signal \, float \, or symbol.
+There may be at most nine variables in one [expr~] object. Each variable
+consists of:;
+#X text 168 193 - the left inlet of [expr~] only accepts signals (i.e.
+\, $f1 and $s1 variables will not work). Use the variable $v1 as a
+creation argument to use this signal in an expression.;
+#X text 183 311 2) "v" \, "f" \, "i" or "s" (signal \, float \, integer
+or symbol);
+#X text 183 324 3) an inlet number (Note: inlet numbers start from
+one);
+#X text 167 422 - the arguments themselves form the expression to evaluate.
+They may be floats or symbols \, including the special variables noted
+above ($v1 \, $f2 \, etc.). Follow the link below for all availabel
+operators and functions in [expr~]:;
+#X obj 170 476 pddp/pddplink all_about_expr_functions.pd -text all_about_expr_operators_and_functions
+;
+#X text 80 422 n) float;
+#X text 98 434 symbol atom;
+#X text 98 448 comma;
+#X text 98 461 semicolon;
+#X obj 101 506 pddp/pddplink all_about_expr_if.pd -text expr_if;
+#X obj 101 526 pddp/pddplink all_about_expr_and_value.pd -text expr_and_value
+;
+#X obj 101 546 pddp/pddplink all_about_expr_multiline.pd -text expr_multiline
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 18 0 17 0;
+#X connect 19 0 22 0;
+#X connect 20 0 22 1;
+#X connect 21 0 19 0;
+#X connect 22 0 17 0;
+#X connect 24 0 23 0;
+#X connect 25 0 34 0;
+#X connect 26 0 34 1;
+#X connect 28 0 29 0;
+#X connect 29 0 35 0;
+#X connect 34 0 23 0;
+#X connect 35 0 32 0;
+#X connect 35 0 32 1;
+#X connect 38 0 35 1;
+#X connect 38 0 27 0;
diff --git a/doc/pddp/fexpr~-help.pd b/doc/pddp/fexpr~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1805d28a0a828b3a92a7a720a1d879720cc1c99d
--- /dev/null
+++ b/doc/pddp/fexpr~-help.pd
@@ -0,0 +1,454 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header fexpr~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 195 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 140 LIBRARY internal;
+#X text 12 160 AUTHOR Shahrokh Yadegari;
+#X text 12 180 WEBSITE http://crca.ucsd.edu/~syadegar/expr.html;
+#X text 13 220 HELP_PATCH_AUTHORS Updated for Pd 0.35 test 26 and expr*
+0.4. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS signal nonlocal trigonometry;
+#X text 12 100 INLET_N float symbol signal;
+#X text 12 80 INLET_0 signal;
+#X text 12 120 OUTLET_N signal;
+#X text 12 45 DESCRIPTION expression evaluation of signal data (sample
+level);
+#X text 12 200 RELEASE_DATE 2000;
+#X text 12 25 LICENSE GPL v2;
+#X restore 500 597 pd META;
+#X obj 0 369 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 401 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 489 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 107 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 expr;
+#X text 8 2 [fexpr~] Related Objects;
+#X obj 62 43 expr~;
+#X restore 101 597 pd Related_objects;
+#X obj 78 204 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 378 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 245 cnv 17 3 115 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 265 float;
+#X text 98 344 symbol;
+#X obj 143 577 pddplink http://crca.ucsd.edu/~syadegar/expr.html;
+#X text 143 563 Expr family of objects by Shahrokh Yadegari;
+#X text 98 203 signal;
+#X text 98 245 signal;
+#X text 98 377 signal;
+#X obj 480 3 fexpr~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/fexpr~ -text
+pdpedia: fexpr~;
+#X floatatom 240 67 0 0 0 0 - - -;
+#X floatatom 287 100 0 0 0 0 - - -;
+#X msg 287 69 -10;
+#X obj 152 167 dac~;
+#X text 141 45 Simple FIR filter;
+#X msg 108 66 start;
+#X msg 47 85 stop;
+#X obj 47 65 loadbang;
+#X msg 354 68 -20;
+#X obj 152 102 osc~ 2205;
+#X msg 189 67 1102.5;
+#X msg 152 67 2205;
+#X msg 321 68 0;
+#X text 316 95 If you change this;
+#X text 318 107 value you hear a click;
+#X obj 151 145 *~ 0.1;
+#N canvas 118 43 428 526 More_fexpr~_examples 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X floatatom 87 236 0 0 0 0 - - -;
+#X floatatom 247 257 0 0 0 0 - - -;
+#X obj 83 306 dac~;
+#X obj 84 277 fexpr~ ($x1[$f2/1000]+$x1)/2;
+#X msg 316 187 0 10000;
+#X obj 247 238 line 0;
+#X msg 250 188 -10000;
+#X text 20 38 Simple FIR filter using fractional offset;
+#X msg 156 188 -10000 10000;
+#X obj 87 257 osc~ 2205;
+#X msg 96 213 1102.5;
+#X msg 314 212 0 10000;
+#X msg 248 213 -20000;
+#X msg 154 213 -20000 10000;
+#X msg 87 188 2205;
+#X msg 30 182 start;
+#X msg 31 228 stop;
+#X obj 31 206 loadbang;
+#X text 69 161 frequency;
+#X text 159 170 of the simple filter;
+#X text 158 158 index defining the frequency;
+#X text 20 106 Thus \, the offset -10000 will filter audio at frequency
+of 2205 and the offset value -20000 will filter the audio at frequency
+of 1102.5.;
+#X text 21 55 When fractional offset is used \, fexpr~ determines indexed
+by linear interpolation. In the following example the offset value
+is divided by 1000 \, thus we can continuously change the offset without
+an audible click in the output.;
+#X obj 90 495 print~;
+#X msg 220 461 bang;
+#X floatatom 90 388 0 0 0 0 - - -;
+#X obj 90 456 fexpr~ $x1+$y[-1];
+#X msg 23 383 start;
+#X msg 23 431 stop;
+#X obj 23 409 loadbang;
+#X text 128 359 simple accumulator defined as and an IIR filter;
+#X msg 219 389 set 4000;
+#X obj 90 410 sig~ 0.001;
+#X msg 220 412 clear;
+#X text 27 356 comment;
+#X text 19 345 1 first click the start button;
+#X text 8 2 [fexpr~] More examples;
+#X text 273 429 the clear button;
+#X text 262 413 2 click the set or;
+#X text 260 462 3 click bang to see how;
+#X text 272 477 set and clear work;
+#X connect 1 0 10 0;
+#X connect 2 0 4 1;
+#X connect 4 0 3 0;
+#X connect 4 0 3 1;
+#X connect 5 0 6 0;
+#X connect 6 0 2 0;
+#X connect 7 0 6 0;
+#X connect 9 0 6 0;
+#X connect 10 0 4 0;
+#X connect 11 0 1 0;
+#X connect 12 0 6 0;
+#X connect 13 0 6 0;
+#X connect 14 0 6 0;
+#X connect 15 0 1 0;
+#X connect 16 0 4 0;
+#X connect 17 0 4 0;
+#X connect 18 0 17 0;
+#X connect 25 0 24 0;
+#X connect 26 0 33 0;
+#X connect 27 0 24 0;
+#X connect 28 0 27 0;
+#X connect 29 0 27 0;
+#X connect 30 0 29 0;
+#X connect 32 0 27 0;
+#X connect 33 0 27 0;
+#X connect 34 0 27 0;
+#X restore 281 503 pd More_fexpr~_examples;
+#N canvas 9 72 545 449 lorenz 0;
+#X obj 166 117 v pr;
+#X obj 297 118 v r;
+#X obj 223 119 v b;
+#X floatatom 166 88 5 0 0 0 - - -;
+#X floatatom 297 90 5 0 0 0 - - -;
+#X msg 167 63 10;
+#X obj 221 60 expr 8./3;
+#X msg 118 186 set 1.2 2.3 4.4;
+#X floatatom 223 89 7 0 0 0 - - -;
+#X msg 65 96 stop;
+#X msg 65 117 start;
+#X floatatom 359 90 5 0 0 0 - - -;
+#X obj 359 119 v dt;
+#X msg 300 62 18;
+#X msg 355 63 0.01;
+#X obj 58 346 dac~;
+#X obj 118 9 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X text 191 9 <- turn audio on and bang here;
+#X text 162 142 if you hear a buzz \, you have probably gone unstable
+bang on the top again;
+#X obj 399 65 line;
+#X obj 118 291 /~ 20;
+#X obj 224 288 /~ 20;
+#X obj 330 287 /~ 20;
+#X msg 399 39 0.01 \, 0.04 5000;
+#X obj 118 235 fexpr~ $y1+(pr*$y2-pr*$y1)*dt \; $y2 +(-$y1*$y3 + r*$y1-$y2)*dt
+\; $y3+($y1*$y2 - b*$y3)*dt;
+#X obj 4 115 loadbang;
+#X text 113 -50 This is an example of how fexpr~ could be used for
+solving differential equations \, in this case the lorenz equations
+which generate chotic signals;
+#X text 311 232 Note the following shorthands:;
+#X text 218 186 the 'set' commands sets the initial previous values
+;
+#X obj 118 348 tabsend~ lorenz1a;
+#X obj 224 328 tabsend~ lorenz2a;
+#X obj 329 309 tabsend~ lorenz3a;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array lorenz1a 64 float 0;
+#X coords 0 1 63 -1 100 60 1;
+#X restore 13 417 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array lorenz2a 64 float 0;
+#X coords 0 1 63 -1 100 60 1;
+#X restore 183 417 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array lorenz3a 64 float 0;
+#X coords 0 1 63 -1 100 60 1;
+#X restore 363 417 graph;
+#X text 191 365 You can see the graphs if you scroll down;
+#X text 191 378 but the redrawings may cause clicks in the audio;
+#X text 414 101 these numbers;
+#X text 395 89 <- experiment with;
+#X text 310 248 $y1 -> $y1[-1] \, $y2 -> $y2[-1] \, ...;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 8 0;
+#X connect 7 0 24 0;
+#X connect 8 0 2 0;
+#X connect 9 0 24 0;
+#X connect 10 0 24 0;
+#X connect 11 0 12 0;
+#X connect 13 0 4 0;
+#X connect 14 0 11 0;
+#X connect 16 0 5 0;
+#X connect 16 0 6 0;
+#X connect 16 0 13 0;
+#X connect 16 0 14 0;
+#X connect 16 0 7 0;
+#X connect 16 0 10 0;
+#X connect 19 0 11 0;
+#X connect 20 0 29 0;
+#X connect 20 0 15 0;
+#X connect 20 0 15 1;
+#X connect 21 0 30 0;
+#X connect 22 0 31 0;
+#X connect 23 0 19 0;
+#X connect 24 0 20 0;
+#X connect 24 1 21 0;
+#X connect 24 2 22 0;
+#X connect 25 0 9 0;
+#X restore 281 524 pd lorenz equations for audition;
+#N canvas 12 59 536 519 lorenz 0;
+#X obj 166 67 v pr;
+#X obj 297 68 v r;
+#X obj 223 69 v b;
+#X floatatom 166 38 5 0 0 0 - - -;
+#X floatatom 297 40 5 0 0 0 - - -;
+#X msg 167 13 10;
+#X obj 221 10 expr 8./3;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array lorenz1 2048 float 0;
+#X coords 0 -1 2047 1 100 60 1;
+#X restore 72 447 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array lorenz2 2048 float 0;
+#X coords 0 -1 2047 1 100 60 1;
+#X restore 217 447 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array lorenz3 2048 float 0;
+#X coords 0 -1 2047 1 100 60 1;
+#X restore 370 447 graph;
+#X msg 118 136 set 1.2 2.3 4.4;
+#X floatatom 223 39 7 0 0 0 - - -;
+#X msg 65 46 stop;
+#X msg 65 67 start;
+#X floatatom 349 40 5 0 0 0 - - -;
+#X obj 349 69 v dt;
+#X msg 300 12 18;
+#X msg 345 13 0.01;
+#X obj 118 -41 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X text 191 -41 <- turn audio on and bang here;
+#X text 142 92 if you hear a buzz \, you have probably gone unstable
+bang on the top again;
+#X obj 389 15 line;
+#X obj 118 241 /~ 20;
+#X obj 224 238 /~ 20;
+#X obj 330 237 /~ 20;
+#X msg 389 -11 0.01 \, 0.04 5000;
+#X obj 4 65 loadbang;
+#X text 103 -100 This is an example of how fexpr~ could be used for
+solving differential equations \, in this case the lorenz equations
+which generate chotic signals;
+#X text 312 184 Note the following shorthands:;
+#X text 218 136 the 'set' commands sets the initial previous values
+;
+#X obj 118 298 tabsend~ lorenz1;
+#X obj 224 278 tabsend~ lorenz2;
+#X obj 329 259 tabsend~ lorenz3;
+#X obj 447 280 block~ 2048;
+#X text 136 333 Lorenz Equations;
+#X obj 118 185 fexpr~ $y1+pr * ($y2-$y1)*dt \; $y2 +(-$y1*$y3 + r*$y1-$y2)*dt
+\; $y3+($y1*$y2 - b*$y3)*dt;
+#X text 139 397 dZ/dt = -bZ;
+#X text 136 367 dX/dt = pr * (X - Y);
+#X text 135 347 written with 3 state variable X \, Y \, and Z;
+#X text 137 382 dY/dt = -XZ + rX - y;
+#X text 404 52 these numbers;
+#X text 385 39 <- experiment with;
+#X text 311 200 $y1 -> $y1[-1] \, $y2 -> $y2[-1] \, ...;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 11 0;
+#X connect 10 0 35 0;
+#X connect 11 0 2 0;
+#X connect 12 0 35 0;
+#X connect 13 0 35 0;
+#X connect 14 0 15 0;
+#X connect 16 0 4 0;
+#X connect 17 0 14 0;
+#X connect 18 0 5 0;
+#X connect 18 0 6 0;
+#X connect 18 0 16 0;
+#X connect 18 0 17 0;
+#X connect 18 0 10 0;
+#X connect 18 0 13 0;
+#X connect 21 0 14 0;
+#X connect 22 0 30 0;
+#X connect 23 0 31 0;
+#X connect 24 0 32 0;
+#X connect 25 0 21 0;
+#X connect 26 0 12 0;
+#X connect 35 0 22 0;
+#X connect 35 1 23 0;
+#X connect 35 2 24 0;
+#X restore 281 545 pd lorenz equations for visualization;
+#X text 195 145 -10 offset will fully filter audio frequency of 2205
+\, and -20 offset will filter audio at frequency of 1102.5;
+#N canvas 9 230 428 130 CPU_usage 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [fexpr~] CPU Usage;
+#X text 19 37 NOTE: fexpr~ could use lots of CPU power. By default
+fexpr~ is on when it is loaded. In this help patch we are turning them
+off with loadbang \, so to hear them you have to turn them on explicitly.
+You can use the "start" and "stop" messages to start and stop fexpr~
+;
+#X restore 8 167 pd CPU_usage;
+#X text 6 147 below:;
+#X text 6 111 Note: [fexpr~];
+#X text 6 123 can use lots;
+#X text 6 135 of CPU. Read;
+#X obj 152 124 fexpr~ ($x1[$f2]+$x1)/2;
+#X text 158 203 - the first inlet of [expr~] only accepts signals.
+For this reason \, you can't specify the $f1 or $s1 variables- only
+$x and $y variables are accepted.;
+#N canvas 39 43 508 524 $x_and_$y_variables 0;
+#X text 92 198 $y -> $y1[-1];
+#X text 20 167 Shorthands: $x -> $x1[0];
+#X text 92 183 $x1 -> $x1[0] $x2 -> $x2[0] .....;
+#X text 92 213 $y1 -> $y1[-1] $y2 -> $y2[-1] .....;
+#X text 45 403 e.g. \, set x2 3.4 0.4 sets x2[-1]=3.4 and x2[-2]=0.4
+;
+#X text 45 436 e.g. \, set y3 1.1 3.3 4.5 sets y3[-1]=1.1 y3[-2]=3.3
+and y3[-3]=4.5;
+#X text 45 361 e.g. \, set 0.1 2.2 0.4 sets y1[-1]=0.1 y2[-1]=2.2 \,
+and y3[-1]=0.4;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [fexpr~] $x and $y Variables;
+#X text 20 38 The following dollarsign variables are only used for
+fexpr~:;
+#X text 20 61 $x#[n];
+#X text 20 91 $x#;
+#X text 70 91 - $x# is a shorthand for $x#[0] \, specifying the current
+sample;
+#X text 70 61 - the sample from inlet # indexed by n where n has to
+satisfy 0 => n >= -vector size;
+#X text 20 121 $y[n];
+#X text 70 121 - the output value indexed by n where n has to satisfy
+0 > n >= -vector size. (The vector size can be changed by the "block~"
+object.);
+#X text 19 238 [fexpr~] responds to the following methods:;
+#X text 21 303 clear;
+#X text 81 303 - clears all the previous input and output buffers;
+#X text 21 318 clear x#;
+#X text 81 318 - clears the previous values of the #th input;
+#X text 21 333 clear y#;
+#X text 81 333 - clears the previous values of the #th output;
+#X text 21 348 set val val ...;
+#X text 121 348 - sets the first past values of each output;
+#X text 21 391 set x# val-1 val-2 ...;
+#X text 161 391 - sets the as many supplied values of the #th input
+;
+#X text 21 423 set y# val-1 val-2 ...;
+#X text 161 424 - sets the as many supplied values of the #th input
+;
+#X text 21 481 Note: The inlet number starts from one. There may be
+at most nine variables in one [fexpr~] object.;
+#X text 21 258 start;
+#X text 81 258 - start computation for a [fexpr~] object;
+#X text 81 273 - stop computation for a [fexpr~] object;
+#X text 21 273 stop;
+#X text 21 288 verbose;
+#X text 81 288 - toggle verbose mode;
+#X restore 160 321 pd $x_and_$y_variables;
+#X text 158 244 - an extra inlet is added for each dollar-sign variable
+used in the expression ($s2 \, $f3 \, etc.). Extra inlets accept only
+one of the following: signals \, floats \, or symbols. Each variable
+is denoted by a dollarsign \, an "f" for float \, "s" for symbol \,
+or an "x" or "y" as specified in the following subpatch:;
+#N canvas 118 44 428 479 fexpr~_and_symbols 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-expr-array 515 float 2;
+#X coords 0 1 515 -1 200 140 1;
+#X restore 24 329 graph;
+#X obj 240 386 loadbang;
+#X obj 105 176 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 117 239 of the array will be clipped;
+#X text 117 224 index values outside the range;
+#X text 20 116 The following syntax outputs the y-value for the element
+specified by the left inlet.;
+#X text 124 174 click here first;
+#X obj 105 196 symbol \$0-expr~-array;
+#X floatatom 24 266 5 0 0 0 - - -;
+#X text 21 37 Symbolic arguments like $s1 \, $s2 \, and so on are currently
+used in [expr] \, [expr~] \, and [fexpr~] to get the name of an array
+or table. You can also type the name of an array directly into [expr~]
+\, but this is limited since \, for example \, a dash ("e.g. \, my-table")
+will get interpreted as an operator ("e.g. \, my minus table").;
+#X text 8 2 [fexpr~] Using Symbolic Arguments;
+#X obj 24 224 expr $s2[$f1];
+#X floatatom 24 177 5 0 0 0 - - -;
+#X obj 240 412 f \$0;
+#X msg 240 438 \; \$1-expr-array sinesum 512 1;
+#X connect 1 0 14 0;
+#X connect 2 0 8 0;
+#X connect 8 0 12 1;
+#X connect 12 0 9 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X restore 160 344 pd fexpr~_and_symbols;
+#X text 11 23 expression evaluation of signal data (sample level);
+#X text 80 416 n) float;
+#X text 167 416 - the arguments themselves form the expression to evaluate.
+They may be floats or symbols \, including the special variables noted
+above ($x1 \, $f2 \, etc.). The operators and functions available for
+use in [fexpr~] are listed below:;
+#X text 98 428 symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 498 pddp/pddplink all_about_expr_if.pd -text expr_if;
+#X obj 98 518 pddp/pddplink all_about_expr_and_value.pd -text expr_and_value
+;
+#X obj 98 540 pddp/pddplink all_about_expr_multiline.pd -text expr_multiline
+;
+#X obj 167 468 pddp/pddplink all_about_expr_functions.pd -text all_about_expr_operators_and_functions
+;
+#X connect 20 0 29 0;
+#X connect 21 0 45 1;
+#X connect 22 0 21 0;
+#X connect 25 0 45 0;
+#X connect 26 0 45 0;
+#X connect 27 0 26 0;
+#X connect 28 0 21 0;
+#X connect 29 0 45 0;
+#X connect 30 0 29 0;
+#X connect 31 0 29 0;
+#X connect 32 0 21 0;
+#X connect 35 0 23 0;
+#X connect 35 0 23 1;
+#X connect 45 0 35 0;
diff --git a/doc/pddp/fft~-help.pd b/doc/pddp/fft~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d9a37cccdc91f1fd2285c0366e64d52051973f77
--- /dev/null
+++ b/doc/pddp/fft~-help.pd
@@ -0,0 +1,113 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header fft~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 399 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 254 507 361 META 0;
+#X text 12 150 LIBRARY internal;
+#X text 12 190 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 210 RELEASE_DATE 2009-06-12;
+#X text 12 30 LICENSE SIBSD;
+#X text 12 170 AUTHOR Miller Puckette;
+#X text 12 230 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 70 INLET_0 signal;
+#X text 12 90 INLET_1 signal;
+#X text 12 110 OUTLET_0 signal;
+#X text 12 130 OUTLET_1 signal;
+#X text 12 50 DESCRIPTION Fourier analyses;
+#X text 12 5 KEYWORDS signal block_oriented analysis;
+#X restore 500 597 pd META;
+#X obj 0 460 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 523 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 551 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 527 (none);
+#N canvas 103 483 428 107 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [fft~] Related Objects;
+#X obj 22 42 ifft~;
+#X obj 68 42 rfft~;
+#X obj 114 42 rifft~;
+#X obj 163 42 block~;
+#X text 211 42 [switch~];
+#X restore 101 597 pd Related_objects;
+#X obj 78 408 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 469 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 433 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 491 3 fft~;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/fft~ -text
+pdpedia: fft~;
+#X floatatom 15 124 0 0 0 0 - - -;
+#X obj 15 75 * 44100;
+#X floatatom 15 53 0 0 0 0 - - -;
+#X obj 15 180 osc~;
+#X obj 15 205 rfft~;
+#X obj 15 99 / 64;
+#X obj 15 261 rifft~;
+#X obj 60 261 print~ real;
+#X obj 74 236 print~ imaginary;
+#X obj 15 298 /~ 64;
+#X obj 15 364 print~ resynthesized;
+#X msg 25 337 bang;
+#X msg 60 192 bang;
+#X msg 36 150 0.25;
+#X msg 77 150 0;
+#X text 42 125 frequency in Hz.;
+#X text 43 52 frequency in bins;
+#X text 55 298 <- renormalize;
+#X text 61 337 <- print resynthesis;
+#X text 98 407 signal;
+#X text 98 432 signal;
+#X obj 78 496 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 495 signal;
+#X text 98 468 signal;
+#X text 11 23 Fourier analyses;
+#X text 183 313 There is no normalization \, so that an FFT followed
+by an IFFT has a gain of N.;
+#X text 182 352 See the FFT examples to see how to use these in practice.
+;
+#X text 184 243 The real FFT outputs N/2+1 real parts and N/2-1 imaginary
+parts. The other outputs are zero. At DC and at the Nyquist there is
+no imaginary part \, but the second through Nth output is as a real
+and imaginary pair \, which can be thought of as the cosine and sin
+component strengths.;
+#X text 104 151 <- bash phase;
+#X text 92 193 <- print analysis;
+#X text 184 118 The FFT objects do Fourier analyses and resyntheses
+of incoming real or complex signals. Complex signals are handled as
+pairs of signals (real and imaginary part.) The analysis size is one
+block (you can use the [block~] or [switch~] objects to control block
+size).;
+#X obj 5 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 98 555 pddp/pddplink ../3.audio.examples/I01.Fourier.analysis.pd
+-text doc/3.audio.examples/I01.Fourier.analysis.pd;
+#X text 98 573 also see examples I02-I10 in doc/3.audio.examples;
+#X connect 14 0 17 0;
+#X connect 15 0 19 0;
+#X connect 16 0 15 0;
+#X connect 17 0 18 0;
+#X connect 18 0 21 0;
+#X connect 18 0 20 0;
+#X connect 18 1 22 0;
+#X connect 18 1 20 1;
+#X connect 19 0 14 0;
+#X connect 20 0 23 0;
+#X connect 23 0 24 0;
+#X connect 25 0 24 0;
+#X connect 26 0 21 0;
+#X connect 26 0 22 0;
+#X connect 27 0 17 1;
+#X connect 28 0 17 1;
diff --git a/doc/pddp/fiddle~-help.pd b/doc/pddp/fiddle~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4c5c9cb189015c07553bcd1102b09cc1a13f3de9
--- /dev/null
+++ b/doc/pddp/fiddle~-help.pd
@@ -0,0 +1,234 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header fiddle~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 313 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 180 494 407 META 0;
+#X text 12 195 LIBRARY internal;
+#X text 12 235 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 255 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 215 AUTHOR Miller Puckette;
+#X text 12 275 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS signal analysis;
+#X text 12 65 INLET_0 signal amp-range vibrato reattack npartial auto
+npoints bang print;
+#X text 12 95 OUTLET_0 float;
+#X text 12 115 OUTLET_1 bang;
+#X text 12 135 OUTLET_2 list;
+#X text 12 155 OUTLET_3 float;
+#X text 12 175 OUTLET_4 list;
+#X text 12 45 DESCRIPTION pitch estimator and sinusoidal peak finder
+;
+#X restore 500 597 pd META;
+#X obj 0 363 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 479 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 562 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 322 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 104 488 428 103 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 21 42 sigmund~;
+#X obj 88 42 bonk~;
+#X text 7 1 [fiddle~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 98 321 signal;
+#X obj 78 372 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 472 3 fiddle~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/fiddle~ -text
+pdpedia: fiddle~;
+#N canvas 62 43 489 501 Messages_to_fiddle~ 0;
+#X msg 22 416 print;
+#X msg 22 54 amp-range 40 50;
+#X msg 22 174 reattack 100 10;
+#X msg 22 229 npartial 7;
+#X msg 22 117 vibrato 50 0.5;
+#X text 125 38 a low and high amplitude threshold: if signal amplitude
+is below the low threshold \, no pitches or peaks are output. The high
+threshold is a minimum at which "cooked" outputs may appear.;
+#X text 125 99 A period in milliseconds (50) over which the raw pitch
+may not deviate more than an interval in half-tones (0.5) from the
+average pitch to report it as a note to the "cooked" pitch outlet.
+;
+#X text 125 160 A period in milliseconds (100) over which a re-attack
+is reported if the amplitude rises more than (1) dB. The re-attack
+will result in a "bang" in the attack outlet and may give rise to repeated
+notes in the cooked pitch output.;
+#X msg 22 278 auto 1;
+#X msg 22 300 auto 0;
+#X msg 22 385 bang;
+#X text 126 383 poll current values --- useful if not in auto mode
+\,;
+#X text 125 221 Higher partials are weighed less strongly than lower
+ones in determining the pitch. This specifies the number of the partial
+(7) which will be weighted half as strongly as the fundamental.;
+#X text 125 282 start and stop "auto" mode (on by default.) If off
+\, output only appears on "bang" (poll mode).;
+#X text 126 415 print out all settings;
+#X msg 22 332 npoints 2048;
+#X text 127 341 number of points in analysis window (power of 2 \,
+128-2048);
+#X msg 22 353 npoints 1024;
+#X obj 22 462 outlet;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 Messages to [fiddle~];
+#X connect 0 0 18 0;
+#X connect 1 0 18 0;
+#X connect 2 0 18 0;
+#X connect 3 0 18 0;
+#X connect 4 0 18 0;
+#X connect 8 0 18 0;
+#X connect 9 0 18 0;
+#X connect 10 0 18 0;
+#X connect 15 0 18 0;
+#X connect 17 0 18 0;
+#X restore 133 116 pd Messages_to_fiddle~;
+#X obj 324 203 unpack;
+#X floatatom 324 253 0 0 0 0 - - -;
+#X floatatom 338 230 0 0 0 0 - - -;
+#X obj 324 173 route 1 2 3 4;
+#X obj 387 203 unpack;
+#X floatatom 387 253 0 0 0 0 - - -;
+#X floatatom 401 230 0 0 0 0 - - -;
+#X obj 451 203 unpack;
+#X floatatom 451 253 0 0 0 0 - - -;
+#X floatatom 465 230 0 0 0 0 - - -;
+#X obj 192 203 unpack;
+#X floatatom 192 253 0 0 0 0 - - -;
+#X floatatom 205 230 0 0 0 0 - - -;
+#X floatatom 259 253 0 0 0 0 - - -;
+#X obj 104 253 print attack;
+#X obj 23 253 print pitch;
+#X obj 123 142 fiddle~ 1024 1 20 3;
+#X text 331 277 individual sinusoidal components;
+#X text 259 275 amplitude;
+#X text 269 290 (dB);
+#X text 192 273 raw pitch;
+#X text 110 273 bang on;
+#X text 110 288 attack;
+#X text 18 273 cooked pitch;
+#X text 18 288 output;
+#N canvas 54 154 428 270 test_input_pitch 0;
+#X obj 77 168 phasor~;
+#X obj 77 146 sig~;
+#X floatatom 77 124 0 0 0 0 - - -;
+#X obj 77 102 mtof;
+#X obj 149 191 *~;
+#X obj 137 40 loadbang;
+#X obj 168 168 sig~;
+#X msg 137 124 1;
+#X msg 77 58 57;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 6 58 inlet;
+#X obj 213 70 inlet;
+#X text 7 1 Test Input for [fiddle~];
+#X obj 150 225 outlet~;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 13 0;
+#X connect 5 0 8 0;
+#X connect 5 0 7 0;
+#X connect 6 0 4 1;
+#X connect 7 0 6 0;
+#X connect 8 0 3 0;
+#X connect 10 0 3 0;
+#X connect 11 0 6 0;
+#X restore 124 90 pd test_input_pitch;
+#X text 272 64 test input;
+#X text 272 77 amplitude;
+#X floatatom 124 65 5 0 0 0 - - -;
+#X msg 170 65 1;
+#X msg 201 65 0;
+#X floatatom 235 65 5 0 0 0 - - -;
+#X text 20 64 test input pitch;
+#X obj 78 392 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 78 412 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X obj 78 432 cnv 17 3 17 empty \$0-pddp.cnv.let.3 3 5 9 0 16 -228856
+-162280 0;
+#X obj 78 452 cnv 17 3 17 empty \$0-pddp.cnv.let.4 4 5 9 0 16 -228856
+-162280 0;
+#N canvas 89 215 428 349 More_info 0;
+#X text 19 38 The Fiddle object estimates the pitch and amplitude of
+an incoming sound \, both continuously and as a stream of discrete
+"note" events. Fiddle optionally outputs a list of detected sinusoidal
+peaks used to make the pitch determination. Fiddle is described theoretically
+in the 1998 ICMC proceedings \, reprinted on http://man104nfs.ucsd.edu/~mpuckett.
+;
+#X text 19 138 Fiddle's creation arguments specify an analysis window
+size \, the maximum polyphony (i.e. \, the number of simultaneous "pitches"
+to try to find) \, the number of peaks in the spectrum to consider
+\, and the number of peaks \, if any \, to output "raw." The outlets
+give discrete pitch (a number) \, detected attacks in the amplitude
+envelope (a bang) \, one or more voices of continuous pitch and amplitude
+\, overall amplitude \, and optionally a sequence of messages with
+the peaks.;
+#X text 18 253 The analysis hop size is half the window size so in
+the example shown here \, one analysis is done every 512 samples (11.6
+msec at 44K1) \, and the analysis uses the most recent 1024 samples
+(23.2 msec at 44K1). The minimum frequency that Fiddle will report
+is 2-1/2 cycles per analysis windows \, or about 108 Hz. (just below
+MIDI 45.);
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [fiddle~] More Info;
+#X restore 101 571 pd More_info;
+#X text 98 372 float;
+#X text 98 392 bang;
+#X text 98 412 list;
+#X text 98 432 float;
+#X text 98 452 list;
+#X text 11 23 pitch estimator and sinusoidal peak finder;
+#X text 168 372 - cooked pitch output.;
+#X text 168 392 - bang on attack.;
+#X text 168 412 - raw pitch.;
+#X text 168 432 - amplitude (dB).;
+#X text 168 452 - individual sinusoidal components.;
+#X text 167 497 - window size (128-2048 \, default 1024).;
+#X text 167 511 - number of pitch outlets (1-3 \, default 1).;
+#X text 167 525 - number of peaks to find (1-100 \, default 20).;
+#X text 167 539 - number of peaks to output (default 0.).;
+#X text 80 497 1) float;
+#X text 80 511 2) float;
+#X text 80 525 3) float;
+#X text 80 539 4) float;
+#X text 98 338 See "Messages_to_fiddle~" subpatch in the example above.
+;
+#X text 168 321 - the incoming signal.;
+#X obj 5 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 13 0 30 0;
+#X connect 14 0 15 0;
+#X connect 14 1 16 0;
+#X connect 17 0 14 0;
+#X connect 17 1 18 0;
+#X connect 17 2 21 0;
+#X connect 18 0 19 0;
+#X connect 18 1 20 0;
+#X connect 21 0 22 0;
+#X connect 21 1 23 0;
+#X connect 24 0 25 0;
+#X connect 24 1 26 0;
+#X connect 30 0 29 0;
+#X connect 30 1 28 0;
+#X connect 30 2 24 0;
+#X connect 30 3 27 0;
+#X connect 30 4 17 0;
+#X connect 39 0 30 0;
+#X connect 42 0 39 0;
+#X connect 43 0 39 1;
+#X connect 44 0 39 1;
+#X connect 45 0 39 1;
diff --git a/doc/pddp/float-help.pd b/doc/pddp/float-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..82947badfea19f8477164d0dcbdaaafb66db88f3
--- /dev/null
+++ b/doc/pddp/float-help.pd
@@ -0,0 +1,201 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header float 3 12 0 18
+-204280 -1 0;
+#X obj 0 339 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 63 256 482 332 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 25 KEYWORDS control storage;
+#X text 12 5 ALIAS f;
+#X text 12 85 INLET_0 float bang;
+#X text 12 105 INLET_1 float;
+#X text 12 125 OUTLET_0 float;
+#X text 12 65 DESCRIPTION store a number;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 78 144 cnv 10 50 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 341 145 cnv 10 23 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X floatatom 379 117 5 0 0 0 - - -;
+#X floatatom 340 169 5 0 0 0 - - -;
+#X obj 359 117 bng 15 250 50 0 empty empty empty 20 7 0 12 -4034 -1
+-1;
+#X floatatom 80 169 5 0 0 0 - - -;
+#X msg 80 61 bang;
+#X msg 320 61 7 3 4;
+#X obj 340 144 f;
+#X obj 80 144 float 7;
+#X obj 0 436 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 473 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 523 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 408 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 78 347 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 460 21 pddp/pddplink http://wiki.puredata.info/en/float -text
+pdpedia: float;
+#X obj 462 3 float;
+#X obj 522 3 f;
+#X text 501 4 or;
+#X msg 119 115 12;
+#X msg 152 115 -0.02;
+#X msg 94 90 555;
+#X msg 340 84 list one 2 3;
+#X text 424 83 does not work!;
+#X obj 100 543 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.1
+-text Pd manual 2.3.1: anatomy of a message;
+#N canvas 106 185 428 374 float/list 0;
+#X msg 51 111 float 1 2 3;
+#X msg 71 165 list 1 2 3;
+#X text 68 142 A list with multiple elements remains a list.;
+#X text 19 37 A float with one element remains a float.;
+#X text 75 196 A list with one float element is converted to a float.
+;
+#X obj 27 286 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 76 286 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 118 286 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X obj 166 286 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 211 286 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X obj 26 264 route bang float symbol list;
+#X obj 67 327 print FLOAT;
+#X msg 26 59 float 3;
+#X msg 82 217 list 2;
+#X obj 149 327 print LIST;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [float] Conversion To/From a List;
+#X text 48 81 A float with multiple elements remains a float but is
+truncated to one element.;
+#X connect 0 0 10 0;
+#X connect 1 0 10 0;
+#X connect 10 0 5 0;
+#X connect 10 1 6 0;
+#X connect 10 1 11 0;
+#X connect 10 2 7 0;
+#X connect 10 3 8 0;
+#X connect 10 3 14 0;
+#X connect 10 4 9 0;
+#X connect 12 0 10 0;
+#X connect 13 0 10 0;
+#X restore 386 556 pd float/list conversion;
+#N canvas 111 59 428 526 More_Info 0;
+#X text 19 37 All numbers in Pd are kept in 32-bit floating point and
+can represent real numbers between -8 \, 388608 and 8.388.608.00;
+#X text 19 233 The following are examples of floating point numbers:
+;
+#X text 49 253 3;
+#X text 50 294 -111.5;
+#X text 49 273 0.5;
+#X text 20 126 According to Webopedia.com \, "computers are integer
+machines and are capable of representing real numbers only by using
+complex codes." Hence \, real numbers must be 'approximated' by computers
+using the "floating point standard". In such a number \, the decimal
+point can "float" meaning that there is no fixed number of digits preceding
+or following the decimal. A floating point number is therefore a computer's
+approximation of a real number.;
+#X text 50 318 10000 to 1e-16;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [float] More Info;
+#X obj 1 91 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 7 91 What is a floating point number?;
+#X obj 1 411 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 7 411 An Interesting Side-Note;
+#X text 19 443 In the early 1990's \, the Intel 80486 was shipped with
+a math coprocessor to help accelerate the process of computing floating
+point numbers (which previously required a considerable amount of CPU
+power). Math coprocessors have since found there way into nearly every
+graphics card and CPU available today.;
+#X text 49 343 3e-05 : This example is a computer shorthand for scientific
+notation. It means 3*10^-5 (or 10 to the negative 5th power multiplied
+by 3).;
+#X restore 385 532 pd More_Info;
+#X text 115 60 outputs argument;
+#X text 123 89 overrides argument;
+#X text 133 145 stores value;
+#X text 98 346 bang;
+#X text 98 366 float;
+#X text 98 386 list;
+#X text 98 408 float;
+#N canvas 102 481 428 108 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [float] Related Objects;
+#X obj 22 36 int;
+#X obj 54 36 value;
+#X obj 101 36 list;
+#X floatatom 142 37 5 0 0 0 - - -;
+#X msg 185 36;
+#X restore 101 597 pd Related_objects;
+#X text 99 445 float;
+#X text 11 20 store a number;
+#X obj 78 445 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 168 386 - truncates to the first element \, outputs it \, and
+stores it.;
+#X text 168 408 - a float received on the right inlet is stored.;
+#X text 169 445 - outputs the stored value as a float message.;
+#X text 81 490 1) float;
+#X text 168 346 - outputs the currently stored value.;
+#X text 168 366 - outputs the incoming number and stores it.;
+#X text 171 490 - [float] accepts a single number as a creation argument
+which sets the value that is stored.;
+#X obj 80 226 21;
+#X obj 80 206 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 80 248 5 0 0 0 - - -;
+#X text 122 204 As an additional shortcut \, you can leave off the
+class name "float" altogether and just use a single number in an object
+box to create a [float] object (with the value initialized to that
+number).;
+#X text 20 225 [float];
+#X text 21 239 object;
+#X text 21 210 implicit;
+#X obj 441 280 1 2 3;
+#X obj 441 260 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 441 302 print;
+#X text 483 264 implicit;
+#X text 482 293 object;
+#X text 482 279 [list];
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 100 575 pddp/pddplink http://en.wikipedia.org/wiki/Floating_point
+;
+#X obj 99 527 pddp/pddplink all_about_messages.pd;
+#X obj 100 560 pddp/pddplink ../2.control.examples/05.counter.pd -text
+doc/2.control.examples/05.counter.pd;
+#X text 77 277 (If you add additional arguments after this number you
+will create an implicit [list] object.);
+#X connect 6 0 12 1;
+#X connect 8 0 12 0;
+#X connect 10 0 13 0;
+#X connect 11 0 12 0;
+#X connect 12 0 7 0;
+#X connect 13 0 9 0;
+#X connect 23 0 13 1;
+#X connect 24 0 13 1;
+#X connect 25 0 13 0;
+#X connect 26 0 12 0;
+#X connect 49 0 51 0;
+#X connect 50 0 49 0;
+#X connect 56 0 58 0;
+#X connect 57 0 56 0;
diff --git a/doc/pddp/framp~-help.pd b/doc/pddp/framp~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d03ec859ce7920299fa47818e9bf05fcca6aa594
--- /dev/null
+++ b/doc/pddp/framp~-help.pd
@@ -0,0 +1,88 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header framp~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 417 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 253 507 362 META 0;
+#X text 12 155 LIBRARY internal;
+#X text 12 195 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 175 AUTHOR Miller Puckette;
+#X text 12 235 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 75 INLET_0 signal;
+#X text 12 95 INLET_1 signal;
+#X text 12 115 OUTLET_0 signal;
+#X text 12 135 OUTLET_1 signal;
+#X text 12 45 DESCRIPTION estimate frequency and amplitude of FFT components
+;
+#X text 12 215 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS signal block_oriented;
+#X restore 500 597 pd META;
+#X obj 0 478 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 543 (none);
+#N canvas 105 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 fft~;
+#X text 8 2 [framp~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 78 426 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 486 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 451 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 479 3 framp~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/framp~ -text
+pdpedia: framp~;
+#X text 147 127 frequency;
+#X floatatom 78 142 0 0 0 0 - - -;
+#X obj 78 92 * 44100;
+#X floatatom 78 67 0 0 0 0 - - -;
+#X text 150 65 frequency;
+#X text 153 83 in bins;
+#X text 147 144 in Hz.;
+#X obj 79 193 rfft~;
+#X obj 78 117 / 64;
+#X msg 165 214 bang;
+#X obj 78 220 framp~;
+#X obj 165 269 print~ frequency;
+#X obj 180 244 print~ amplitude;
+#X obj 78 168 osc~;
+#X text 201 214 <- print analysis;
+#X text 98 425 signal;
+#X text 98 450 signal;
+#X text 98 485 signal;
+#X obj 78 511 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 510 signal;
+#X text 11 23 estimate frequency and amplitude of FFT components;
+#X text 75 309 [framp~] takes as input a rectangular-windowed FFT and
+outputs \, for each FFT channel \, the estimated amplitude and frequency
+of any component feedinf that channel. A sinusoidal component should
+appear in four components (or three in the special case of a sinusoid
+exactly tuned to a bin.) Frequency output is in bins \, i.e. \, units
+of SR/N.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X connect 15 0 27 0;
+#X connect 16 0 22 0;
+#X connect 17 0 16 0;
+#X connect 21 0 24 0;
+#X connect 21 1 24 1;
+#X connect 22 0 15 0;
+#X connect 23 0 25 0;
+#X connect 23 0 26 0;
+#X connect 24 0 25 0;
+#X connect 24 1 26 0;
+#X connect 27 0 21 0;
diff --git a/doc/pddp/ftom-help.pd b/doc/pddp/ftom-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..388fc0022aaf47300c13bbd4d2c394add6d95967
--- /dev/null
+++ b/doc/pddp/ftom-help.pd
@@ -0,0 +1,73 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header ftom 3 12 0 18 -204280
+-1 0;
+#X obj 0 421 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 242 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION frequency to MIDI conversion;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS control conversion MIDI;
+#X restore 500 597 pd META;
+#X obj 0 491 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 524 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 553 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 430 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 528 (none);
+#N canvas 71 422 428 163 Related_objects 0;
+#X text 19 37 Control objects for conversion:;
+#X obj 59 66 dbtorms;
+#X obj 113 66 rmstodb;
+#X obj 167 66 dbtopow;
+#X obj 222 66 powtodb;
+#X obj 22 125 mtof~;
+#X obj 67 125 ftom~;
+#X obj 110 125 dbtorms~;
+#X obj 175 125 rmstodb~;
+#X obj 241 125 dbtopow~;
+#X obj 303 125 powtodb~;
+#X text 19 102 Signal objects for conversion:;
+#X obj 22 66 mtof;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [ftom] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X floatatom 249 186 0 0 0 0 - - -;
+#X floatatom 249 130 0 0 0 0 - - -;
+#X obj 78 500 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 429 float;
+#X text 98 456 list;
+#X text 98 500 float;
+#X obj 492 3 ftom;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/ftom -text
+pdpedia: ftom;
+#X obj 249 159 ftom;
+#X text 11 23 frequency to MIDI conversion;
+#X text 158 456 - lists will be truncated \, and the first element
+will be used as input.;
+#X text 99 215 The [ftom] object transposes a frequency in Hertz into
+a MIDI value \, so that "440" goes to "69". A frequency of zero Hertz
+is given a MIDI value of -1500 (strictly speaking \, it is negative
+infinity.);
+#X obj 98 557 pddp/pddplink all_about_acoustic_conversions.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/A06.frequency.pd -text
+doc/3.audio.examples/A06.frequency.pd;
+#X connect 11 0 18 0;
+#X connect 18 0 10 0;
diff --git a/doc/pddp/ftom~-help.pd b/doc/pddp/ftom~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a372a705a53e0331ed303b2cab5042fec2dcc85b
--- /dev/null
+++ b/doc/pddp/ftom~-help.pd
@@ -0,0 +1,81 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header ftom~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 417 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion MIDI;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 45 DESCRIPTION frequency to MIDI conversion for audio signals
+;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 454 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 491 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 521 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 426 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 495 (none);
+#N canvas 104 452 428 138 Related_objects 0;
+#X obj 70 37 dbtorms~;
+#X obj 138 37 rmstodb~;
+#X obj 207 37 dbtopow~;
+#X obj 273 37 powtodb~;
+#X obj 23 96 mtof;
+#X obj 68 96 ftom;
+#X obj 111 96 dbtorms;
+#X obj 176 96 rmstodb;
+#X obj 242 96 dbtopow;
+#X obj 304 96 powtodb;
+#X obj 23 37 mtof~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 73 Control objects for conversion:;
+#X text 8 2 [ftom~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X obj 209 205 snapshot~;
+#X floatatom 209 236 0 0 0 0 - - -;
+#X floatatom 209 100 0 0 0 0 - - -;
+#X obj 209 124 sig~;
+#X obj 256 179 metro 100;
+#X obj 256 149 loadbang;
+#X text 98 425 signal;
+#X obj 78 463 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 463 signal;
+#X obj 481 3 ftom~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/ftom~ -text
+pdpedia: ftom~;
+#X obj 209 149 ftom~;
+#X text 99 264 The ftom~ object transposes a frequency into a midi
+value in Hertz \, so that "440" goes to "69". A frequency of zero Hertz
+is given a MIDI value of -1500 (strictly speaking \, it is negative
+infinity.);
+#X text 11 23 frequency to MIDI conversion for audio signals;
+#X text 98 524 This object takes an audio signal as input and output
+(and works sample by sample). Since it calls a library math function
+\, it may be much more expensive than other workaday tilde objects
+such as *~ and osc~ \, depending on your hardware and math library.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 13 0 21 0;
+#X connect 14 0 10 0;
+#X connect 15 0 14 0;
+#X connect 21 0 10 0;
diff --git a/doc/pddp/gatom-help.pd b/doc/pddp/gatom-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3786bcae51a3dcb9d3b725a27bb77c830508d369
--- /dev/null
+++ b/doc/pddp/gatom-help.pd
@@ -0,0 +1,160 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header gatom 3 12 0 18
+-204280 -1 0;
+#X obj 0 231 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 255 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 35 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS Updated for Pd version 0.34. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 75 INLET_0 float bang symbol set;
+#X text 12 95 OUTLET_0 float;
+#X text 12 175 RELEASE_DATE 1997;
+#X text 12 55 DESCRIPTION atom (number box and symbol box);
+#X text 12 5 KEYWORDS control storage GUI nonlocal symbol_op;
+#X restore 500 597 pd META;
+#X obj 0 396 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 470 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 474 (none);
+#N canvas 89 496 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 47 1 Related Objects;
+#X floatatom 9 3 5 0 0 0 - - -;
+#X obj 21 42 float;
+#X obj 61 42 list;
+#X obj 102 45 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-262144 -1 -1 0 256;
+#X obj 169 42 drawnumber;
+#X restore 102 597 pd Related_objects;
+#X obj 78 240 cnv 17 3 145 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 404 float;
+#X obj 78 405 cnv 17 3 52 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 396 3 5 0 0 0 - - -;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/gatom -text
+pdpedia: gatom;
+#X floatatom 25 58 0 0 0 0 - - -;
+#X floatatom 25 96 0 0 0 0 - - -;
+#X msg 469 76 set 45;
+#X floatatom 469 104 0 0 0 0 - - -;
+#X text 98 239 bang;
+#X text 98 259 float;
+#X text 98 289 list;
+#X text 98 309 symbol;
+#X text 98 339 set;
+#N canvas 98 96 430 514 Number_box_properties 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X floatatom 70 102 12 0 0 0 - - -;
+#X floatatom 71 223 1 0 0 0 - - -;
+#X text 50 2 Properties for gatom;
+#X text 20 38 Right click on a number box and choose "Properties" to
+change the following:;
+#X text 19 69 width;
+#X text 69 69 - width of the number box (in characters). By default
+the width is 5 characters.;
+#X text 148 102 width = 12 characters;
+#X floatatom 70 123 2 0 0 0 - - -;
+#X text 148 123 width = 2 characters;
+#X text 69 164 If you select a width of 0 \, the number box will grow
+as needed to hold the number--BUT BEWARE \, THIS IS EXPENSIVE IN CPU
+TIME. In a production patch \, you'll want to set a specific width.
+;
+#X floatatom 70 143 0 0 0 0 - - -;
+#X text 148 143 width = 0 characters (read below);
+#X text 69 240 A width of one gives a clickable toggle switch ala Max.
+;
+#X text 88 223 width = 1 character: toggle between 0 and 1;
+#X text 19 260 limits;
+#X floatatom 71 282 5 0 127 0 - - -;
+#X text 109 281 numbers between 0 and 127;
+#X text 69 260 - set lower and upper limits for scrolling the number
+box;
+#X text 68 300 This only affects scrolling- you can still send values
+to the number box that are outside these limits.;
+#X floatatom 71 353 5 0 127 1 my_number_box - -;
+#X text 19 331 label;
+#X text 69 331 - give the number box a visible name;
+#X text 68 371 Use the radio buttons to reposition the label to the
+left \, right \, top \, or bottom of the number box. Spaces in the
+label will automatically be converted to underscores.;
+#X text 19 413 messages;
+#X text 69 413 - nonlocal send and receive;
+#X floatatom 193 532 5 0 0 2 Number_box_7 gatom-help-rcv gatom-help-snd
+;
+#X obj 276 540 r gatom-help-snd;
+#X obj 71 516 s gatom-help-rcv;
+#X msg 71 490 28;
+#X text 68 433 As an alternative to using wires \, you can set send
+and receive names to send messages through the number box. "Number-box-7"
+below is set to receive messages to "gatom-help-rcv" \, and send messages
+to "gatom-help-snd";
+#X floatatom 276 563 5 0 0 0 - - -;
+#X text 68 583 Notice that you cannot make local connections with wires
+to "Number_box_7" when using non-local send and receive names. If you
+want to use both \, see the [nbx] object:;
+#X obj 71 626 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-262144 -1 -1 0 256;
+#X floatatom 13 3 5 0 0 0 - - -;
+#X connect 27 0 31 0;
+#X connect 29 0 28 0;
+#X restore 102 571 pd Number_box_properties;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X symbolatom 25 138 10 0 0 0 - - -;
+#X text 11 23 atom (number box and symbol box);
+#X symbolatom 476 3 10 0 0 0 - - -;
+#X text 440 3 and;
+#X symbolatom 25 174 10 0 0 0 - - -;
+#X text 61 52 A number box allows you to display a number or enter
+a number using the mouse and keyboard. When a number arrives at the
+number box's inlet \, it is displayed and sent to the outlet. You can
+click on a number box and drag upward or downward to change the value
+continuously.;
+#X text 97 134 A symbol box allows you to display a single symbol-atom
+or enter one using the mouse and keyboard. Unlike a number box you
+cannot change the value by clicking and dragging.;
+#X text 96 172 The symbol box is called "Symbol" in the "Put" menu.
+;
+#X text 168 239 - sends the current value to the outlet.;
+#X msg 469 156 set foo;
+#X symbolatom 469 180 10 0 0 0 - - -;
+#X text 168 309 - symbol box only: an incoming symbol is displayed
+and output. (Number box will display and output zero.);
+#X text 168 259 - number box only: sets the current value and outputs
+it. (Symbol box will display 'float' and output 'symbol float'.);
+#X text 168 289 - a list will be truncated to the first item.;
+#X text 168 339 - displays the incoming value without outputting it
+(e.g. \, "set 23" will cause a number box to display 23). Sending a
+set message without a value does not change the current value of a
+number box or symbol box.;
+#X text 168 404 - number box only: outputs a float for each message
+it receives (except set).;
+#X text 98 434 symbol;
+#X text 168 434 - symbol box only: outputs a symbol message for each
+message it receives (except set).;
+#X text 100 537 Control-clicking (or command-clicking on a mac) toggles
+the value between 0 and the last nonzero value.;
+#X floatatom 59 545 5 0 0 0 - - -;
+#X text 100 503 You can shift-click a number box and drag to change
+the number by hundredths instead of ones.;
+#X text 62 112 The number box is called "Number" in the "Put" menu.
+;
+#X text 67 197 To enter data simply click a number box or symbol box
+and begin typing. Then click "Enter" to finish and output it.;
+#X connect 14 0 15 0;
+#X connect 16 0 17 0;
+#X connect 25 0 29 0;
+#X connect 34 0 35 0;
diff --git a/doc/pddp/get-help.pd b/doc/pddp/get-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3c2206e236b18e7873c7e0b07b25606329b40ab7
--- /dev/null
+++ b/doc/pddp/get-help.pd
@@ -0,0 +1,124 @@
+#N struct get-help-template float x float y symbol s;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header get 3 12 0 18 -204280
+-1 0;
+#X obj 0 338 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.39. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control data_structure;
+#X text 12 45 DESCRIPTION get values from a scalar;
+#X text 12 65 INLET_0 pointer;
+#X text 12 85 OUTLET_N float symbol;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 375 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 438 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 506 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 102 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 72 34 set;
+#X obj 104 34 append;
+#X obj 163 34 getsize;
+#X obj 14 59 setsize;
+#X obj 72 59 element;
+#X obj 184 59 sublist;
+#X obj 14 34 pointer;
+#X obj 132 59 struct;
+#X text 7 1 [get] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 347 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 383 float;
+#X obj 78 384 cnv 17 3 48 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 493 3 get;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/get -text
+pdpedia: get;
+#X msg 121 139 next;
+#X floatatom 106 234 5 0 0 0 - - -;
+#X floatatom 185 234 5 0 0 0 - - -;
+#X obj 106 162 pointer;
+#X text 302 115 output first scalar in list;
+#X text 164 138 output next item;
+#X text 102 250 x output;
+#X text 183 250 y output;
+#X text 261 251 s output;
+#X symbolatom 265 234 18 0 0 0 - - -;
+#X obj 145 186 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 98 346 pointer;
+#X text 168 346 - [get] takes a pointer to a scalar.;
+#X text 98 398 symbol;
+#X text 166 183 bang when there are no more items;
+#X text 11 23 get values from a scalar;
+#X text 221 283 <- Click here to see the data;
+#N canvas 111 75 428 272 get-help-data 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [get] Data Window;
+#X scalar get-help-template 22 43 guten_tag \;;
+#X scalar get-help-template 79 87 jo_napot_kivanok \;;
+#X text 62 42 Each blue rectangle is a scalar. Their appearance and
+data structure are defined by the template "get-help-template".;
+#X text 27 187 In addition to using the [get] object \, you can right-click
+on a rectangle and choose "Properties" to view the field values of
+the scalar. (You can also change them-- once you are finished \, click
+"Ok" to update the values.);
+#X text 27 124 The "x" and "y" fields in a [struct] are special: they
+always specify the screen coordinates for the top left corner of each
+rectangle. In editmode you can click and drag each rectangle to change
+these values.;
+#X restore 106 283 pd get-help-data;
+#X msg 106 116 traverse pd-get-help-data \, next;
+#X obj 106 208 get get-help-template x y s;
+#N canvas 105 219 428 175 get-help-template 0;
+#X obj 23 118 filledpolygon 9 0 1 0 0 20 0 20 30 0 30;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [get] Template subpatch;
+#X text 19 69 This [struct] just defines a simple data structure. The
+values for the fields were set when this help patch was created.;
+#X obj 21 42 struct get-help-template float x float y symbol s;
+#X text 21 137 Draw a blue rectangle with a black border.;
+#X restore 106 305 pd get-help-template;
+#X text 168 383 - one outlet is created for each field specified in
+the creation arguments. When [get] receives a pointer at its inlet
+\, the value of each field is output to the corresponding outlet.;
+#X text 168 472 - the name of a field or fields in that template. An
+outlet is created for each field specified.;
+#X text 103 56 [get] \, when sent a pointer to a scalar \, retrieves
+fields from it by name. The fields can be a float or symbol. (In the
+future this will also allow access to sublists of scalars.);
+#X text 168 457 - a struct name to specify the template of a scalar.
+;
+#X text 97 510 If you have data whose templates vary (from a heterogeneous
+list \, for example) you can use [pointer] to select according to template
+before sending to [get]. (See pointer-help.pd for more information.)
+;
+#X text 80 457 1) symbol atom;
+#X text 80 472 n) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 97 563 pddp/pddplink ../04.data.structures/02.getting.data.pd
+-text doc/04.data.structures/02.getting.data.pd;
+#X obj 97 578 pddp/pddplink scalar-help.pd;
+#X connect 13 0 16 0;
+#X connect 16 0 32 0;
+#X connect 16 1 23 0;
+#X connect 31 0 16 0;
+#X connect 32 0 14 0;
+#X connect 32 1 15 0;
+#X connect 32 2 22 0;
diff --git a/doc/pddp/getsize-help.pd b/doc/pddp/getsize-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7feb3ec0ec00a0b227a490e94e75e634f72acd43
--- /dev/null
+++ b/doc/pddp/getsize-help.pd
@@ -0,0 +1,104 @@
+#N struct help-getsize-template float x float y array array1 help-getsize-array1-template
+;
+#N struct help-getsize-array1-template float y float x;
+#N canvas 0 0 555 619 10;
+#X scalar help-getsize-template 89 279 \; 7 -6 \; 7 35 \; 26 57 \;
+45 85 \; 74 90 \; 79 137 \; 48 150 \; \;;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header getsize 3 12 0 18
+-204280 -1 0;
+#X obj 0 406 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.4. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control data_structure array;
+#X text 12 45 DESCRIPTION get the number of elements in an array;
+#X text 12 65 INLET_0 pointer;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 443 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 485 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 553 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 78 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 71 34 pointer;
+#X obj 205 34 setsize;
+#X obj 138 34 element;
+#X obj 14 34 struct;
+#X text 7 1 [getsize] Related Objects;
+#X obj 14 70 get;
+#X obj 51 70 set;
+#X obj 84 70 append;
+#X obj 138 70 sublist;
+#X restore 102 597 pd Related_objects;
+#X obj 78 415 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 451 float;
+#X obj 78 452 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 473 3 getsize;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/getsize -text
+pdpedia: getsize;
+#X obj 78 135 pointer;
+#X floatatom 78 190 5 0 0 0 - - -;
+#X obj 78 161 getsize help-getsize-template array1;
+#N canvas 83 204 428 227 help-getsize-template 0;
+#X obj 21 42 struct help-getsize-template float x float y array array1
+help-getsize-array1-template;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [getsize] Data Structure;
+#X obj 21 138 filledpolygon 11 527 1 -10 0 175 0 175 110 -10 110;
+#X obj 21 85 plot array1 770 2 10 15 20;
+#X text 18 107 An array plotted with a yellow trace 2 pixels wide.
+;
+#X text 18 157 A black rectangle for the background.;
+#X restore 78 223 pd help-getsize-template;
+#N canvas 76 167 428 138 help-getsize-array1-template 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [getsize] Data Structure;
+#X obj 21 42 struct help-getsize-array1-template float y float x;
+#X obj 21 69 filledpolygon 999 5 1 -5 0 0 5 5 0 0 -5;
+#X text 18 91 This is the template for the elements of the array "array1"
+\, which is defined in [pd help-getsize-template].;
+#X restore 78 244 pd help-getsize-array1-template;
+#X text 98 414 pointer;
+#X text 11 23 get the number of elements in an array;
+#X text 168 414 - a pointer to a scalar that contains an array.;
+#X text 168 451 - the output of [getsize] is the number of elements
+in the array. The smallest possible size is one.;
+#X text 81 504 1) symbol;
+#X text 81 520 2) symbol;
+#X text 77 55 When sent a pointer \, [getsize] looks up a field \,
+which should be an array \, and outputs the number of elements of the
+array.;
+#X text 168 504 - a struct name to specify the the template of a scalar.
+;
+#X text 119 190 here we just get the size of the array "array1".;
+#X text 168 519 - the name of a field within that template. (The field
+must be an array.);
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 557 pddp/pddplink all_about_arrays.pd;
+#X obj 98 572 pddp/pddplink scalar-help.pd;
+#X msg 78 109 traverse pd-getsize-help.pd \, next;
+#X text 278 303 To the left is a scalar that contains;
+#X text 278 333 diamond represents one element. (The;
+#X text 278 318 an array of 7 elements. Each white;
+#X text 278 348 black background is just a reference.);
+#X connect 14 0 16 0;
+#X connect 16 0 15 0;
+#X connect 32 0 14 0;
diff --git a/doc/pddp/glossary.pd b/doc/pddp/glossary.pd
new file mode 100644
index 0000000000000000000000000000000000000000..553e43fd106b8bca6e204531bdf4525bd6d8d01a
--- /dev/null
+++ b/doc/pddp/glossary.pd
@@ -0,0 +1,424 @@
+#N canvas 0 0 448 379 10;
+#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header glossary 20 10 1
+18 -261106 -33289 0;
+#N canvas 296 26 376 539 generate 0;
+#X obj 71 238 list-drip;
+#X msg 71 282 0;
+#X msg 115 282 1;
+#X msg 159 282 2;
+#X msg 203 282 3;
+#X obj 248 381 list prepend;
+#X obj 203 309 t a;
+#X obj 248 403 route 0 1 2 3;
+#X obj 71 189 t a b;
+#X obj 98 216 s \$0-r;
+#X obj 203 337 b;
+#X obj 177 364 s \$0-trig;
+#N canvas 453 126 463 493 TERM 0;
+#X obj 112 92 t a;
+#X obj 33 167 list;
+#X obj 181 43 r \$0-r;
+#X obj 33 189 route bang;
+#X obj 33 117 spigot;
+#X obj 66 73 r \$0-r;
+#X obj 66 95 1;
+#X obj 112 20 inlet;
+#X obj 157 176 0;
+#X obj 33 40 r \$0-trig;
+#X obj 112 68 list prepend;
+#X obj 78 160 r \$0-r;
+#X text 162 240 x;
+#X obj 109 308 list append;
+#X obj 90 406 list prepend;
+#X obj 90 428 list trim;
+#X obj 217 237 value \$0-line;
+#X obj 188 238 + 1;
+#X text 252 262 y;
+#X obj 217 262 * 10;
+#X obj 90 211 t a b b b b;
+#X obj 90 382 list prepend cyclone/comment 0 14 .;
+#X msg 90 333 symbol \$1;
+#X obj 90 355 symbol2list _;
+#X obj 90 450 s \$0-glossary;
+#X msg 109 243 obj 30;
+#X connect 0 0 1 1;
+#X connect 0 0 10 1;
+#X connect 1 0 3 0;
+#X connect 2 0 10 1;
+#X connect 3 1 20 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 1;
+#X connect 7 0 10 0;
+#X connect 8 0 4 1;
+#X connect 9 0 4 0;
+#X connect 10 0 0 0;
+#X connect 11 0 1 1;
+#X connect 13 0 14 1;
+#X connect 14 0 15 0;
+#X connect 15 0 24 0;
+#X connect 16 0 17 0;
+#X connect 16 0 19 0;
+#X connect 17 0 16 0;
+#X connect 19 0 13 1;
+#X connect 20 0 22 0;
+#X connect 20 1 25 0;
+#X connect 20 2 8 0;
+#X connect 20 2 16 0;
+#X connect 20 3 16 0;
+#X connect 20 4 16 0;
+#X connect 21 0 14 0;
+#X connect 22 0 23 0;
+#X connect 23 0 21 0;
+#X connect 25 0 13 0;
+#X restore 248 506 pd TERM;
+#X obj 248 329 list prepend list;
+#X obj 317 358 r \$0-r;
+#N canvas 466 154 450 512 DEF 0;
+#X obj 152 92 t a;
+#X obj 73 167 list;
+#X obj 221 43 r \$0-r;
+#X obj 73 189 route bang;
+#X obj 73 117 spigot;
+#X obj 106 73 r \$0-r;
+#X obj 106 95 1;
+#X obj 152 20 inlet;
+#X obj 197 176 0;
+#X obj 73 40 r \$0-trig;
+#X obj 152 68 list prepend;
+#X obj 118 160 r \$0-r;
+#X text 219 350 x;
+#X obj 164 418 list append;
+#X obj 147 445 list prepend;
+#X obj 147 467 list trim;
+#X obj 264 364 value \$0-line;
+#X text 352 362 y;
+#X obj 283 141 s2l;
+#X obj 298 97 loadbang;
+#X msg 298 119 symbol;
+#X obj 283 163 list length;
+#X obj 283 190 +;
+#X obj 382 138 r \$0-r;
+#X obj 382 160 0;
+#X obj 317 190 t a;
+#X obj 202 202 list length;
+#X obj 268 227 +;
+#X obj 268 249 div 60;
+#X obj 268 331 until;
+#X obj 130 231 t a a b b;
+#X text 322 233 <-- unattach later;
+#X obj 275 43 r \$0-dr;
+#X obj 25 72 r \$0-dr;
+#X obj 351 117 r \$0-dr;
+#X obj 149 134 r \$0-dr;
+#X obj 192 251 t b b;
+#X obj 268 272 t a a;
+#X obj 268 300 +;
+#X obj 264 389 * 10;
+#X obj 307 272 div 6;
+#X obj 225 365 + 1.1;
+#X obj 147 489 s \$0-glossary;
+#X msg 164 353 text 50;
+#X connect 0 0 1 1;
+#X connect 0 0 10 1;
+#X connect 1 0 3 0;
+#X connect 2 0 10 1;
+#X connect 3 1 30 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 1;
+#X connect 7 0 10 0;
+#X connect 7 0 18 0;
+#X connect 8 0 4 1;
+#X connect 9 0 4 0;
+#X connect 10 0 0 0;
+#X connect 11 0 1 1;
+#X connect 13 0 14 1;
+#X connect 14 0 15 0;
+#X connect 15 0 42 0;
+#X connect 16 0 39 0;
+#X connect 16 0 41 0;
+#X connect 18 0 21 0;
+#X connect 19 0 20 0;
+#X connect 20 0 18 1;
+#X connect 21 0 22 0;
+#X connect 22 0 25 0;
+#X connect 22 0 27 1;
+#X connect 23 0 24 0;
+#X connect 24 0 22 1;
+#X connect 25 0 22 1;
+#X connect 26 0 27 0;
+#X connect 27 0 28 0;
+#X connect 28 0 37 0;
+#X connect 29 0 16 0;
+#X connect 30 0 26 0;
+#X connect 30 1 14 0;
+#X connect 30 2 43 0;
+#X connect 30 3 8 0;
+#X connect 30 3 36 0;
+#X connect 32 0 10 1;
+#X connect 33 0 6 0;
+#X connect 34 0 24 0;
+#X connect 35 0 1 1;
+#X connect 36 0 16 0;
+#X connect 36 1 16 0;
+#X connect 37 0 38 0;
+#X connect 37 1 40 0;
+#X connect 38 0 29 0;
+#X connect 39 0 13 1;
+#X connect 40 0 38 1;
+#X connect 41 0 16 0;
+#X connect 43 0 13 0;
+#X restore 266 484 pd DEF;
+#N canvas 380 26 498 522 OBJECTS 0;
+#X obj 102 82 t a;
+#X obj 23 157 list;
+#X obj 171 33 r \$0-r;
+#X obj 23 179 route bang;
+#X obj 23 107 spigot;
+#X obj 56 63 r \$0-r;
+#X obj 56 85 1;
+#X obj 102 10 inlet;
+#X obj 147 166 0;
+#X obj 23 30 r \$0-trig;
+#X obj 102 58 list prepend;
+#X obj 68 150 r \$0-r;
+#X text 141 324 x;
+#X obj 97 370 list append;
+#X obj 80 417 list prepend;
+#X obj 80 439 list trim;
+#X obj 186 321 value \$0-line;
+#X obj 157 322 + 1;
+#X text 221 346 y;
+#X obj 80 261 list-drip;
+#X obj 99 392 list append pddp/helplink;
+#X obj 186 346 * 10;
+#X obj 271 392 list append;
+#X obj 80 283 t a b b b;
+#X obj 80 202 t a b;
+#X obj 197 250 t b b b;
+#X obj 226 424 list append Related Objects;
+#X obj 226 446 list trim;
+#X obj 306 451 list append _______________;
+#X obj 80 461 s \$0-glossary;
+#X msg 97 325 obj 50;
+#X msg 271 370 text 50;
+#X connect 0 0 1 1;
+#X connect 0 0 10 1;
+#X connect 1 0 3 0;
+#X connect 2 0 10 1;
+#X connect 3 1 24 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 1;
+#X connect 7 0 10 0;
+#X connect 8 0 4 1;
+#X connect 9 0 4 0;
+#X connect 10 0 0 0;
+#X connect 11 0 1 1;
+#X connect 13 0 20 0;
+#X connect 14 0 15 0;
+#X connect 15 0 29 0;
+#X connect 16 0 17 0;
+#X connect 16 0 21 0;
+#X connect 17 0 16 0;
+#X connect 19 0 23 0;
+#X connect 20 0 14 1;
+#X connect 21 0 13 1;
+#X connect 21 0 22 1;
+#X connect 22 0 26 0;
+#X connect 22 0 28 0;
+#X connect 23 0 14 0;
+#X connect 23 1 30 0;
+#X connect 23 2 8 0;
+#X connect 23 2 16 0;
+#X connect 23 3 16 0;
+#X connect 24 0 19 0;
+#X connect 24 1 25 0;
+#X connect 25 0 31 0;
+#X connect 25 1 16 0;
+#X connect 25 2 16 0;
+#X connect 26 0 27 0;
+#X connect 27 0 29 0;
+#X connect 28 0 27 0;
+#X connect 30 0 13 0;
+#X connect 31 0 22 0;
+#X restore 285 457 pd OBJECTS;
+#X obj 115 331 s \$0-dr;
+#X obj 248 283 route float;
+#X obj 248 304 makefilename %d;
+#X obj 115 304 t b a;
+#N canvas 322 26 589 535 LINKS 0;
+#X obj 152 92 t a;
+#X obj 73 167 list;
+#X obj 221 43 r \$0-r;
+#X obj 73 189 route bang;
+#X obj 73 117 spigot;
+#X obj 106 73 r \$0-r;
+#X obj 106 95 1;
+#X obj 152 20 inlet;
+#X obj 197 176 0;
+#X obj 73 40 r \$0-trig;
+#X obj 152 68 list prepend;
+#X obj 118 160 r \$0-r;
+#X text 202 300 x;
+#X obj 149 368 list append;
+#X obj 130 415 list prepend;
+#X obj 130 437 list trim;
+#X obj 257 297 value \$0-line;
+#X obj 228 298 + 1;
+#X text 292 322 y;
+#X obj 257 322 * 10;
+#X obj 130 271 t a b b b;
+#X obj 149 390 list append pddp/pddplink;
+#X obj 130 218 t a b;
+#X obj 321 387 list append;
+#X obj 247 245 t b b b;
+#X obj 276 441 list trim;
+#X obj 276 419 list append Links;
+#X obj 356 446 list append _____;
+#X obj 130 246 list-drip;
+#X obj 130 459 s \$0-glossary;
+#X msg 149 303 obj 50;
+#X msg 321 365 text 50;
+#X connect 0 0 1 1;
+#X connect 0 0 10 1;
+#X connect 1 0 3 0;
+#X connect 2 0 10 1;
+#X connect 3 1 22 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 1;
+#X connect 7 0 10 0;
+#X connect 8 0 4 1;
+#X connect 9 0 4 0;
+#X connect 10 0 0 0;
+#X connect 11 0 1 1;
+#X connect 13 0 21 0;
+#X connect 14 0 15 0;
+#X connect 15 0 29 0;
+#X connect 16 0 17 0;
+#X connect 16 0 19 0;
+#X connect 17 0 16 0;
+#X connect 19 0 13 1;
+#X connect 19 0 23 1;
+#X connect 20 0 14 0;
+#X connect 20 1 30 0;
+#X connect 20 2 8 0;
+#X connect 20 2 16 0;
+#X connect 20 3 16 0;
+#X connect 21 0 14 1;
+#X connect 22 0 28 0;
+#X connect 22 1 24 0;
+#X connect 23 0 26 0;
+#X connect 23 0 27 0;
+#X connect 24 0 31 0;
+#X connect 24 1 16 0;
+#X connect 24 2 16 0;
+#X connect 25 0 29 0;
+#X connect 26 0 25 0;
+#X connect 27 0 25 0;
+#X connect 28 0 20 0;
+#X connect 30 0 13 0;
+#X connect 31 0 23 0;
+#X restore 304 430 pd LINKS;
+#X obj 71 154 textfile;
+#X obj 20 14 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 197 65 v \$0-line;
+#X obj 71 117 until;
+#X obj 197 43 3;
+#X obj 54 393 s \$0-glossary;
+#X msg 54 366 vis 0 \, vis 1;
+#X obj 54 22 loadbang;
+#N canvas 0 0 446 477 sort-terms 0;
+#X obj 88 155 textfile;
+#X obj 88 101 t b b;
+#X obj 88 128 until;
+#X obj 88 181 t a b;
+#X obj 115 220 f;
+#X obj 127 190 1;
+#X obj 153 220 + 1;
+#X obj 88 252 list prepend;
+#X obj 88 332 coll;
+#C restore;
+#X msg 51 279 sort -1 2 \, dump;
+#X msg 236 230 clear;
+#X obj 51 52 t b b b;
+#X obj 236 365 list prepend add;
+#X obj 236 389 list trim;
+#X obj 51 25 inlet;
+#X obj 236 420 outlet;
+#X msg 133 128 read glossary.txt \, rewind;
+#X connect 0 0 3 0;
+#X connect 0 1 2 1;
+#X connect 1 0 2 0;
+#X connect 1 1 16 0;
+#X connect 1 1 5 0;
+#X connect 2 0 0 0;
+#X connect 3 0 7 0;
+#X connect 3 1 4 0;
+#X connect 4 0 6 0;
+#X connect 4 0 7 1;
+#X connect 5 0 4 1;
+#X connect 6 0 4 1;
+#X connect 7 0 8 0;
+#X connect 8 0 12 0;
+#X connect 9 0 8 0;
+#X connect 10 0 8 0;
+#X connect 10 0 15 0;
+#X connect 11 0 9 0;
+#X connect 11 1 1 0;
+#X connect 11 2 10 0;
+#X connect 12 0 13 0;
+#X connect 13 0 15 0;
+#X connect 14 0 11 0;
+#X connect 16 0 0 0;
+#X restore 105 71 pd sort-terms;
+#X obj 54 49 t b b b b;
+#X msg 88 96 rewind;
+#X obj 71 260 sel @TERM @DEF @OBJECTS @LINKS;
+#X connect 0 0 33 0;
+#X connect 0 1 6 0;
+#X connect 1 0 6 0;
+#X connect 2 0 20 0;
+#X connect 3 0 6 0;
+#X connect 4 0 6 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 1;
+#X connect 6 0 10 0;
+#X connect 7 0 12 0;
+#X connect 7 1 15 0;
+#X connect 7 2 16 0;
+#X connect 7 3 21 0;
+#X connect 8 0 0 0;
+#X connect 8 1 9 0;
+#X connect 10 0 11 0;
+#X connect 13 0 5 0;
+#X connect 14 0 5 1;
+#X connect 18 0 19 0;
+#X connect 18 1 13 0;
+#X connect 19 0 13 0;
+#X connect 20 0 17 0;
+#X connect 20 1 6 0;
+#X connect 22 0 8 0;
+#X connect 22 1 25 1;
+#X connect 23 0 31 0;
+#X connect 25 0 22 0;
+#X connect 26 0 24 0;
+#X connect 28 0 27 0;
+#X connect 29 0 31 0;
+#X connect 30 0 22 0;
+#X connect 31 0 28 0;
+#X connect 31 1 25 0;
+#X connect 31 2 32 0;
+#X connect 31 3 26 0;
+#X connect 31 3 30 0;
+#X connect 32 0 22 0;
+#X connect 33 0 1 0;
+#X connect 33 1 2 0;
+#X connect 33 2 3 0;
+#X connect 33 3 4 0;
+#X connect 33 4 18 0;
+#X restore 185 27 pd generate;
+#X obj 265 27 namecanvas \$0-glossary;
diff --git a/doc/pddp/glossary.txt b/doc/pddp/glossary.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fdd52b373e136c27791075254f07ee1f4863b95c
--- /dev/null
+++ b/doc/pddp/glossary.txt
@@ -0,0 +1,117 @@
+@TERM abstraction @DEF n. a patch created as an object within another patch
+(optionally with creation arguments). @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s7.1
+;
+@TERM anything @DEF 1) n. any message in Pd that has a valid selector \, or is an implicit float or list message. @DEF 2) a keyword in certain objects which matches any valid Pd message \, sometimes written as 'a' or 'any'. @DEF 3) any message other than Pd's built-in messages (float \, symbol \, list \, bang \, or pointer) @OBJECTS list iemlib/iem_anything
+cyclone/prepend @LINKS all_about_lists_vs_anythings.pd all_about_messages.pd
+;
+@TERM array @DEF 1) n. a collection of data that can be selected and stored by indices. @DEF 2) a graphical array created by choosing
+'Array' from the 'Put' menu. @DEF 3) a field of a data structure that
+may be used to plot/store values. @OBJECTS array @LINKS all_about_arrays.pd
+;
+@TERM atom @DEF n. the most basic element of data in Pd. @OBJECTS gatom float
+symbol @LINKS all_about_atoms.pd;
+@TERM canvas @DEF 1) n. the blank area of the window where you write your
+patches. @DEF 2) the object [my_canvas]. @OBJECTS my_canvas pd @LINKS all_about_canvas_properties.pd
+;
+@TERM cold_inlet @DEF n. an inlet on an object that does not trigger output
+when it receives a message. @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.3
+;
+@TERM control_object @DEF n. objects which carry out their function sporadically
+\, as a result of one or more type of event. @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.2
+;
+@TERM creation_arguments @DEF n. atoms that follow the selector in an object
+box that are used to initialize the object upon creation. @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.2
+;
+@TERM data_structure @DEF n. not sure yet... @OBJECTS struct pointer;
+@TERM edit_mode @DEF n. patch state in which you can creat \, edit \, move
+\, and delete objects. @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s2.1
+;
+@TERM float @DEF 1) n. a special selector to tell an object to receive a numeric
+atom as data. @DEF 2) the object [float]. @OBJECTS float gatom value list @LINKS all_about_atoms.pd
+all_about_messages.pd;
+@TERM gop @DEF see 'graph on parent'.;
+@TERM graph_on_parent @DEF a. an attribute of an abstraction or subpatch
+that allows part of a patch to be displayed on the parent patch. @LINKS
+all_about_canvas_properties.pd;
+@TERM gui @DEF acronym for 'graphical user interface'. @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.3
+;
+@TERM hot_inlet @DEF n. an inlet on an object that triggers output when
+it receives a message. (Usually this is the leftmost inlet.) @LINKS
+http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.3;
+@TERM main_Pd_window @DEF n. the window that pops up
+when you start Pd. It includes the peak level and clip indicators \,
+as well as the audio processing checkbutton and the printout area. Synonyms: console window.
+@OBJECTS print @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.1
+;
+@TERM message @DEF 1) n. data in any form sent to an object which causes
+the object to do something specific. @DEF 2) n. short name for 'message
+box'-- see 'message' object. @OBJECTS message @LINKS all_about_messages.pd
+;
+@TERM message_box @DEF n. a GUI object in which you can type text and trigger
+output with the mouse. @OBJECTS message flatspace/entry @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.4
+;
+@TERM nonlocal_connection @DEF n. a connection between two objects without
+using wires. @OBJECTS send receive send~ receive~ bng;
+@TERM number_box @DEF aka numbox \, gatom. GUI object that displays a
+single numeric value. @OBJECTS gatom nbx @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.3
+;
+@TERM numeric_atom @DEF n. any atom which functions as a number \, i.e.
+53 \, 3.1 \, 1e-25 @OBJECTS float int value list @LINKS all_about_atoms.pd
+;
+@TERM object_box @DEF n. rectangle in which Pd objects get created. @LINKS
+http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.2;
+@TERM patch @DEF 1) n. a program written in Pd. @DEF 2) v. the act of writing a Pd program;
+@TERM pointer @DEF n. a reference to a position in a scalar used to manipulate
+and read data from it. @OBJECTS pointer;
+@TERM properties_dialogue @DEF n. dialogue window (usually accessed by right-clicking
+a GUI object) used to set the object's attributes. @OBJECTS bng cnv hradio hslider nbx tgl vradio vslider vu
+@LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s2.7;
+@TERM run_mode @DEF n. patch mode in which
+number boxes \, message boxes \, and other GUI objects can be used
+as controls and objects/text cannot be moved \, changed \, or deleted. @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s2.1
+;
+@TERM runmode @DEF see 'run mode'.;
+@TERM non_editmode @DEF see 'run mode'.;
+@TERM scalar @DEF n. a graphical instance of a struct @OBJECTS scalar;
+@TERM selector @DEF n. a symbolic atom that serves as an instruction to
+the receiving object as how to handle the message @LINKS all_about_messages.pd
+;
+@TERM selector_series @DEF 1) n. a series of 2 or more atoms whose first
+atom is neither the selector 'list' \, 'symbol' \, nor a numeric atom.
+@DEF 2) n. see 'anything'. @OBJECTS list @LINKS all_about_lists_vs_anythings.pd
+;
+@TERM series @DEF n. a collection of zero or more atoms;
+@TERM signal_object @DEF n. an object that computes audio samples. Also
+referred to as 'tilde objects' because they usually have a tilde (
+'~' ) after the name of the object. @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.2
+;
+@TERM subpatch @DEF n. a patch contained within another patch. @OBJECTS pd table
+graph @LINKS http://www.crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s7
+;
+@TERM symbol @DEF n. a special selector to tell an object to receive a symbolic
+atom as data. @OBJECTS symbol makefilename @LINKS all_about_messages.pd
+;
+@TERM symbolic_atom @DEF n. any atom that is not a numeric atom \, i.e.
+\, word \, 3.1.1 \, 1two. Synonym: symbol atom. @OBJECTS gatom symbol makefilename @LINKS all_about_atoms.pd
+;
+@TERM tilde_object @DEF see 'signal object'.;
+@TERM inlet @DEF 1) n. a small rectangle drawn at the top of an object that allows the object to receive data through a connection from another object. Note: in Pd \, the leftmost inlet is often synonymous with the object itself-- only subsidiary inlets are referred to explicitly in the source code and \, consequently \, in error messages. For example \, if the left inlet of object [foo] doesn't accept the message 'bar' \, Pd will respond with 'error: foo: no method for 'bar''. However \, if the right inlet of [foo] doesn't accept 'bar' Pd will respond \, 'error: inlet: no method for 'bar''. @DEF 2) The object named [inlet]. See also: 'outlet' \, 'signal inlet'. @OBJECTS inlet outlet inlet~ outlet~ receive
+;
+@TERM xlet @DEF n. an abbreviation for 'inlet or outlet'.
+;
+@TERM outlet @DEF 1) n. a small rectangle drawn at the bottom of an object that allows the object to send data somewhere else. @DEF 2) the object [outlet]. @OBJECTS inlet outlet inlet~ outlet~ send
+;
+@TERM connection @DEF n. the thin line that connects the outlet of one object to the inlet of another. @OBJECTS inlet outlet
+;
+@TERM wire @DEF see 'connection'.
+;
+@TERM cord @DEF see 'connection'.
+;
+@TERM patch_cord @DEF see 'connection'.
+;
+@TERM implicit_float @DEF a message that consists of a single float atom and can be understood as having an implicit selector 'float'. @OBJECTS float @LINKS all_about_messages.pd
+;
+@TERM implicit_list @DEF  a multi-element message that starts with a float and can be understood as having an implicit selector 'list'. @OBJECTS list @LINKS all_about_messages.pd
+;
+@TERM iolet @DEF an abbreviation for 'inlet or outlet'.
+;
diff --git a/doc/pddp/graph-help.pd b/doc/pddp/graph-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a77e495ce80cdff3ca37433e4a92a2a3a77bb4ac
--- /dev/null
+++ b/doc/pddp/graph-help.pd
@@ -0,0 +1,60 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (graph) 3 12 0 18
+-204280 -1 0;
+#X obj 0 453 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 65 LIBRARY internal;
+#X text 12 105 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 85 AUTHOR Miller Puckette;
+#X text 12 145 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS signal GUI;
+#X text 12 45 DESCRIPTION container canvas for a garray;
+#X text 12 125 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 483 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 513 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 43 table;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X restore 70 43 pd;
+#X text 8 2 (graph) Related Objects;
+#X restore 102 598 pd Related_objects;
+#X text 80 532 1) symbol atom;
+#X text 98 461 (none);
+#X text 98 491 (none);
+#N canvas 0 0 450 300 (subpatch) 0;
+#X coords 0 1 100 -1 40 20 1;
+#X restore 481 2 graph;
+#X obj 456 20 pddp/pddplink http://wiki.puredata.info/en/graph -text
+pdpedia: graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X coords 0 1 100 -1 200 140 1;
+#X restore 165 188 graph;
+#X text 100 56 A graph in Pd is a rectangular subregion of the window
+in which you can store numeric arrays.;
+#X text 99 133 You can change the array values by redrawing it in the
+graph. See also "11.arrays" and passim in the "control examples".;
+#X text 99 88 If you create a new array Pd will usually make a new
+graph to put it in (you can change this using the "array" dialog that
+pops up.);
+#X text 99 345 You can put a garray in the graph above by choosing
+"Array" from the "Put" menu. Just choose "in last graph" from the dialog
+window. For more help on garrays \, see below under the heading "more_info".
+;
+#X text 167 532 - (optional) the name of the graph. When using the
+"Put" menu \, the name is created automatically.;
+#X text 11 23 container canvas for a garray;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 572 pddp/pddplink array-help.pd -text array-help;
diff --git a/doc/pddp/hdial-help.pd b/doc/pddp/hdial-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d1dfe77d5da3c5296915e805dc750f3922a51d7b
--- /dev/null
+++ b/doc/pddp/hdial-help.pd
@@ -0,0 +1,283 @@
+#N canvas 106 314 612 281 10;
+#X obj 1 1 cnv 8 100 60 empty empty hdial=hdl 20 20 1 18 -262144 -1109
+0;
+#X text 16 213 (c) musil@iem.kug.ac.at;
+#X text 58 226 IEM KUG;
+#X text 289 52 click properties to;
+#X text 277 63 modify geometry \, colors \, etc.;
+#X obj 356 172 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144
+-1 -1;
+#X obj 21 54 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 355 124 s foo8_rcv;
+#X obj 356 150 r foo8_snd;
+#X obj 44 100 hdl 25 1 1 10 foo8_snd foo8_rcv hdial_0_9 156 -8 192
+10 -99865 -262144 -260818 2;
+#X msg 44 142 \$1;
+#X floatatom 44 164 4 0 0 0 - - -;
+#X obj 44 186 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 89 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 89 140 route 0 1 2 3 4 5 6 7 8 9;
+#X msg 176 64 set \$1;
+#X floatatom 176 43 4 0 9 0 - - -;
+#X floatatom 44 54 4 0 9 0 - - -;
+#X msg 91 41 7 0 -5.44;
+#X msg 95 63 3 3 4.55;
+#X obj 106 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 123 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 1
+1;
+#X obj 140 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 157 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 174 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 191 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 208 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 225 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 242 161 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 82 178 print;
+#X floatatom 380 198 4 0 0 0 - - -;
+#X msg 380 172 \$1;
+#X msg 355 103 set \$1;
+#X floatatom 355 82 4 0 9 0 - - -;
+#X text 128 178 UP- \, DOWN- \, LEFT- or RIGHT-key;
+#X text 127 189 for moving selected gui-objects;
+#N canvas 226 227 699 530 edit 0;
+#X obj 42 198 f;
+#X msg 20 177 bang;
+#X floatatom 58 176 3 63 156 0 - - -;
+#X floatatom 93 198 3 -20 37 0 - - -;
+#X obj 42 221 pack 0 0;
+#X text 120 198 y-label;
+#X text 86 176 x-label;
+#X floatatom 270 187 3 8 50 0 - - -;
+#X text 297 187 size;
+#X obj 286 293 f;
+#X msg 264 272 bang;
+#X floatatom 302 271 3 -10 10 0 - - -;
+#X floatatom 337 293 3 -10 10 0 - - -;
+#X obj 286 316 pack 0 0;
+#X obj 300 412 f;
+#X msg 278 391 bang;
+#X floatatom 316 390 3 20 60 0 - - -;
+#X floatatom 351 412 3 100 200 0 - - -;
+#X obj 300 435 pack 0 0;
+#X text 330 271 x-delta;
+#X text 364 293 y-delta;
+#X text 344 390 x-position;
+#X text 378 412 y-position;
+#X obj 62 313 f;
+#X msg 40 292 bang;
+#X floatatom 78 291 3 0 2 0 - - -;
+#X floatatom 113 313 3 4 36 0 - - -;
+#X obj 62 336 pack 0 0;
+#X text 106 291 font;
+#X text 142 313 height;
+#X text 504 293 no init;
+#X text 475 348 init value on loadbang;
+#X floatatom 482 228 5 2 20 0 - - -;
+#X msg 47 125 \; foo8_rcv color \$1 \$2 \$3;
+#X msg 42 246 \; foo8_rcv label_pos \$1 \$2;
+#X msg 62 361 \; foo8_rcv label_font \$1 \$2;
+#X msg 34 423 \; foo8_rcv label blabla;
+#X msg 300 460 \; foo8_rcv pos \$1 \$2;
+#X msg 286 341 \; foo8_rcv delta \$1 \$2;
+#X msg 270 216 \; foo8_rcv size \$1;
+#X msg 482 171 \; foo8a_rcv receive foo8_rcv;
+#X msg 483 133 \; foo8_rcv receive foo8a_rcv;
+#X msg 483 88 \; foo8_rcv send foo8_snd;
+#X msg 483 50 \; foo8_rcv send foo8a_snd;
+#X msg 483 312 \; foo8_rcv init 0;
+#X msg 485 366 \; foo8_rcv init 1;
+#X msg 490 436 \; foo8_rcv single_change;
+#X msg 490 470 \; foo8_rcv double_change;
+#X text 491 417 changing-behavior;
+#X msg 482 254 \; foo8_rcv number \$1;
+#X text 526 228 number of buttons;
+#X obj 47 104 pack 0 0 0;
+#X obj 47 76 f;
+#X msg 24 28 bang;
+#X floatatom 63 26 3 0 29 0 - - -;
+#X floatatom 79 46 3 0 29 0 - - -;
+#X floatatom 112 62 3 0 29 0 - - -;
+#X text 91 26 background;
+#X text 106 46 front-color;
+#X text 140 63 label-color;
+#X msg 285 25 back;
+#X msg 285 45 front;
+#X msg 285 65 label;
+#X msg 247 25 bang;
+#N canvas 15 207 606 448 RGB_____________ 0;
+#X obj 97 56 inlet;
+#X obj 262 53 inlet;
+#X obj 339 55 inlet;
+#X obj 405 56 inlet;
+#X obj 97 270 bang;
+#X msg 77 295 0;
+#X msg 104 295 1;
+#X obj 146 268 bang;
+#X msg 132 295 0;
+#X msg 160 295 1;
+#X obj 196 269 bang;
+#X msg 187 295 0;
+#X msg 214 295 1;
+#X obj 265 313 spigot;
+#X obj 312 313 spigot;
+#X obj 359 313 spigot;
+#X obj 249 385 outlet;
+#X text 93 33 select;
+#X text 267 28 red;
+#X text 337 30 green;
+#X text 409 30 blue;
+#X obj 405 102 t b f;
+#X obj 339 160 +;
+#X obj 339 185 t b f;
+#X obj 339 216 +;
+#X obj 296 385 outlet;
+#X obj 343 385 outlet;
+#X obj 28 180 loadbang;
+#X obj 97 135 route back front label bang;
+#X obj 343 362 f;
+#X obj 296 361 f;
+#X obj 249 361 f;
+#X obj 262 79 * -65536;
+#X obj 339 80 * -256;
+#X obj 405 80 * -1;
+#X obj 339 247 - 1;
+#X obj 235 168 t b b b b;
+#X connect 0 0 28 0;
+#X connect 1 0 32 0;
+#X connect 2 0 33 0;
+#X connect 3 0 34 0;
+#X connect 4 0 5 0;
+#X connect 4 0 6 0;
+#X connect 5 0 14 1;
+#X connect 5 0 15 1;
+#X connect 6 0 13 1;
+#X connect 7 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 13 1;
+#X connect 8 0 15 1;
+#X connect 9 0 14 1;
+#X connect 10 0 11 0;
+#X connect 10 0 12 0;
+#X connect 11 0 13 1;
+#X connect 11 0 14 1;
+#X connect 12 0 15 1;
+#X connect 13 0 31 1;
+#X connect 14 0 30 1;
+#X connect 15 0 29 1;
+#X connect 21 0 22 0;
+#X connect 21 1 22 1;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 23 1 24 1;
+#X connect 24 0 35 0;
+#X connect 27 0 6 0;
+#X connect 28 0 4 0;
+#X connect 28 1 7 0;
+#X connect 28 2 10 0;
+#X connect 28 3 36 0;
+#X connect 29 0 26 0;
+#X connect 30 0 25 0;
+#X connect 31 0 16 0;
+#X connect 32 0 24 0;
+#X connect 33 0 22 0;
+#X connect 34 0 21 0;
+#X connect 35 0 15 0;
+#X connect 35 0 14 0;
+#X connect 35 0 13 0;
+#X connect 36 0 31 0;
+#X connect 36 1 30 0;
+#X connect 36 2 29 0;
+#X connect 36 3 35 0;
+#X restore 285 86 pd RGB_____________;
+#X floatatom 327 55 3 0 255 0 - - -;
+#X floatatom 370 55 3 0 255 0 - - -;
+#X floatatom 413 56 3 0 255 0 - - -;
+#X text 34 0 preset-colors;
+#X text 296 -3 RGB-colors;
+#X text 327 37 red;
+#X text 363 36 green;
+#X text 411 36 blue;
+#X msg 34 459 \; foo8_rcv label hdial_0_9;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 1;
+#X connect 3 0 4 1;
+#X connect 4 0 34 0;
+#X connect 7 0 39 0;
+#X connect 9 0 13 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 1;
+#X connect 12 0 13 1;
+#X connect 13 0 38 0;
+#X connect 14 0 18 0;
+#X connect 15 0 14 0;
+#X connect 16 0 14 1;
+#X connect 17 0 18 1;
+#X connect 18 0 37 0;
+#X connect 23 0 27 0;
+#X connect 24 0 23 0;
+#X connect 25 0 23 1;
+#X connect 26 0 27 1;
+#X connect 27 0 35 0;
+#X connect 32 0 49 0;
+#X connect 51 0 33 0;
+#X connect 52 0 51 0;
+#X connect 53 0 52 0;
+#X connect 54 0 52 1;
+#X connect 55 0 51 1;
+#X connect 56 0 51 2;
+#X connect 60 0 64 0;
+#X connect 61 0 64 0;
+#X connect 62 0 64 0;
+#X connect 63 0 64 0;
+#X connect 64 0 51 0;
+#X connect 64 1 51 1;
+#X connect 64 2 51 2;
+#X connect 65 0 64 1;
+#X connect 66 0 64 2;
+#X connect 67 0 64 3;
+#X restore 469 108 pd edit;
+#X obj 346 35 hdl 15 1 0 8 eee eee empty 20 8 192 8 -262144 -1 -1 0
+;
+#X obj 260 11 x_all_guis aaa bbb ccc ddd eee fff ggg hhh iii;
+#X text 183 11 gui-hdial:;
+#X text 33 238 graz \, austria 2002;
+#X text 251 232 updated for Pd version 0.35;
+#X text 279 254 KEYWORDS deprecated;
+#X connect 6 0 9 0;
+#X connect 8 0 5 0;
+#X connect 8 0 31 0;
+#X connect 9 0 10 0;
+#X connect 9 0 14 0;
+#X connect 9 0 29 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 14 0 13 0;
+#X connect 14 1 20 0;
+#X connect 14 2 21 0;
+#X connect 14 3 22 0;
+#X connect 14 4 23 0;
+#X connect 14 5 24 0;
+#X connect 14 6 25 0;
+#X connect 14 7 26 0;
+#X connect 14 8 27 0;
+#X connect 14 9 28 0;
+#X connect 15 0 9 0;
+#X connect 16 0 15 0;
+#X connect 17 0 9 0;
+#X connect 18 0 9 0;
+#X connect 19 0 9 0;
+#X connect 31 0 30 0;
+#X connect 32 0 7 0;
+#X connect 33 0 32 0;
diff --git a/doc/pddp/hilbert~-help.pd b/doc/pddp/hilbert~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..66c7bfa906e8de7f44c621a9618e2075a6a3e4b7
--- /dev/null
+++ b/doc/pddp/hilbert~-help.pd
@@ -0,0 +1,81 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header hilbert~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 397 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS signal abstraction filter;
+#X text 12 45 DESCRIPTION Hilbert transform;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_1 bang;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 125 OUTLET_1 signal;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 457 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 514 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 542 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 518 (none);
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [hilbert~] Related Objects;
+#X obj 22 43 complex-mod~;
+#X restore 102 598 pd Related_objects;
+#X obj 78 406 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 466 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 429 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 468 3 hilbert~;
+#X obj 442 20 pddp/pddplink http://wiki.puredata.info/en/hilbert~ -text
+pdpedia: hilbert~;
+#X text 11 23 Hilbert transform;
+#X obj 37 225 hilbert~;
+#X obj 36 196 osc~ 440;
+#X floatatom 36 168 0 0 0 0 - - -;
+#X text 98 405 signal;
+#X text 168 405 - the incoming signal;
+#X text 98 428 bang;
+#X text 167 428 - clear the internal state;
+#X text 76 86 The Hilbert transform (the name is abused here according
+to computer music tradition) puts out a phase quadrature version of
+the input signal suitable for signal sideband modulation via [complex-mod~].
+;
+#X text 98 465 signal;
+#X text 98 546 The [hilbert~] object is an abstraction \, so you can
+click on the object to bring up the subpatch to see how it works.;
+#X msg 102 259 bang;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/H09.ssb.modulation.pd
+-text doc/3.audio.examples/H09.ssb.modulation.pd;
+#X obj 78 489 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 488 signal;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-right 882 float 2;
+#X array \$0-left 882 float 2;
+#X coords 0 1 881 -1 300 170 1;
+#X restore 217 183 graph;
+#X obj 37 345 tabwrite~ \$0-left;
+#X obj 83 319 tabwrite~ \$0-right;
+#X connect 15 0 32 0;
+#X connect 15 1 33 0;
+#X connect 16 0 15 0;
+#X connect 17 0 16 0;
+#X connect 25 0 32 0;
+#X connect 25 0 33 0;
diff --git a/doc/pddp/hip~-help.pd b/doc/pddp/hip~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2134407b6d2ed1d5d3cdd7c989921fba40edcc92
--- /dev/null
+++ b/doc/pddp/hip~-help.pd
@@ -0,0 +1,96 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header hip~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 381 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 244 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.37. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION one-pole high pass filter;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 65 INLET_0 signal clear;
+#X text 12 85 INLET_1 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 488 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 390 cnv 17 3 37 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 100 425 428 166 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [hip~] Related Objects;
+#X obj 22 43 lop~;
+#X obj 69 43 bp~;
+#X obj 117 43 vcf~;
+#X text 22 81 Raw Filters;
+#X obj 73 108 rzero~;
+#X obj 195 108 cpole~;
+#X obj 24 108 rpole~;
+#X obj 122 108 rzero_rev~;
+#X obj 244 108 czero~;
+#X obj 293 108 czero_rev~;
+#X restore 101 597 pd Related_objects;
+#X text 98 389 signal;
+#X obj 78 497 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 497 signal;
+#X obj 491 3 hip~;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/hip~ -text
+pdpedia: hip~;
+#X obj 146 270 env~;
+#X floatatom 146 293 0 0 0 0 - - -;
+#X floatatom 195 215 0 0 0 0 - - -;
+#X obj 146 243 hip~ 5;
+#X obj 88 270 env~;
+#X floatatom 88 292 0 0 0 0 - - -;
+#X floatatom 88 144 0 0 0 0 - - -;
+#X text 89 105 The left inlet is the incoming audio signal. The right
+inlet is the cutoff frequency in Hz.;
+#X obj 88 167 osc~ 100;
+#X text 133 142 <-- scroll to change input frequency;
+#X msg 146 191 clear;
+#X text 198 190 <-- reinitialize internal state;
+#X text 227 216 <-- set cutoff frequency;
+#X text 168 389 - incoming audio signal.;
+#X obj 78 432 cnv 17 3 45 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 431 float;
+#X text 98 449 list;
+#X text 98 409 clear;
+#X text 84 312 Compare the strength of the original signal on the left
+with that of the filtered signal on the right.;
+#X text 11 23 one-pole high pass filter;
+#X text 168 543 - initial rolloff frequency.;
+#X text 168 409 - reinitialize internal state.;
+#X text 168 431 - cutoff frequency in Hz.;
+#X text 168 449 - a list to the right inlet is truncated \, and the
+first element is used as the cutoff frequency.;
+#X text 88 68 [hip~] is a one-pole high pass filter with a specified
+rolloff frequency.;
+#X text 191 272 [env~] gives the amplitude of the signal envelop in
+dB.;
+#X text 168 497 - the output is the filtered audio signal.;
+#X text 80 543 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 14 0 15 0;
+#X connect 16 0 17 1;
+#X connect 17 0 14 0;
+#X connect 18 0 19 0;
+#X connect 20 0 22 0;
+#X connect 22 0 18 0;
+#X connect 22 0 17 0;
+#X connect 24 0 17 0;
diff --git a/doc/pddp/hradio-help.pd b/doc/pddp/hradio-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..28a836c0905f180ca0754ecab9dbbf43f74a7125
--- /dev/null
+++ b/doc/pddp/hradio-help.pd
@@ -0,0 +1,401 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header hradio 3 12 0 18
+-204280 -1 0;
+#X obj 0 295 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 54 246 494 344 META 0;
+#X text 12 135 LIBRARY internal;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 155 AUTHOR Thomas Musil;
+#X text 12 175 WEBSITE;
+#X text 12 215 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 25 KEYWORDS control storage GUI nonlocal;
+#X text 12 65 DESCRIPTION horizontal row of gui-radio buttons;
+#X text 12 85 INLET_0 float bang list size init number send receive
+label label_pos label_font color pos delta;
+#X text 12 115 OUTLET_0 float;
+#X text 12 195 RELEASE_DATE 2002;
+#X text 12 5 ALIAS rdb radiobut radiobutton;
+#X restore 500 597 pd META;
+#X obj 0 412 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 464 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 547 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 304 cnv 17 3 90 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 78 462 428 129 Related_objects 0;
+#X obj 22 43 bang;
+#X obj 69 43 trigger;
+#X obj 145 43 until;
+#X obj 201 43 bang~;
+#X msg 257 43;
+#X obj 20 93 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 18 69 All iem-gui objects:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [hradio] Related Objects;
+#X restore 100 597 pd Related_objects;
+#X obj 78 421 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 291 165 and receive names. Right-;
+#X text 291 180 click and choose;
+#X text 290 196 "Properties" to set them \,;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/hradio -text
+pdpedia: hradio;
+#X obj 424 45 hradio 15 1 0 8 hradio-help-rcv empty empty 0 -8 0 10
+-262144 -1 -1 0;
+#X obj 27 50 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X floatatom 27 207 4 0 0 0 - - -;
+#X obj 27 229 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 72 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 72 154 route 0 1 2 3 4 5 6 7 8 9;
+#X msg 172 71 set \$1;
+#X floatatom 172 50 4 0 9 0 - - -;
+#X floatatom 50 50 4 0 9 0 - - -;
+#X obj 91 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 111 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 131 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 150 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 170 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 190 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 209 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 229 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 249 179 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 75 207 print;
+#X obj 27 118 hradio 25 1 0 10 hradio-help-snd hradio-help-rcv hradio
+150 -8 0 12 -128992 -204786 -1 0;
+#X msg 107 76 3;
+#X msg 107 50 7;
+#X floatatom 292 59 5 0 0 0 - - -;
+#X floatatom 292 128 5 0 0 0 - - -;
+#X obj 292 80 s hradio-help-rcv;
+#X obj 292 105 r hradio-help-snd;
+#X text 98 303 float;
+#X text 98 367 list;
+#X text 98 421 float;
+#N canvas 109 230 428 285 hradio-creation-arguments 0;
+#X obj 25 202 s pd-hradio-creation-arguments;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [hradio] Creation Arguments and Dynamic Patching;
+#X text 22 38 [hradio] can be called with 15 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X text 22 80 [hradio] creation arguments: Size Unknown Init Number
+sendName receiveName Label labelXOff labelYOff font# fontSize bgColor
+foregroundColor labelColor initValue;
+#X text 22 123 For example \, click the msg-box to dynamically create
+a [hradio]:;
+#X msg 25 160 obj 160 245 hradio 25 1 0 3 empty empty Sterope 12 -8
+0 12 3 27 13 0 \;;
+#X connect 6 0 0 0;
+#X restore 170 522 pd hradio-creation-arguments;
+#X text 291 210 or change them with messages (see below);
+#N canvas 79 8 428 608 Setting_hradio_properties_through_messages 0
+;
+#X text 105 23 no init;
+#X text 161 155 label;
+#X msg 162 175 label blabla;
+#X msg 115 94 init 1;
+#X msg 105 42 init 0;
+#X text 114 61 init value;
+#X text 115 75 on loadbang;
+#X text 307 23 change send name;
+#X text 10 155 change receive name;
+#X obj 28 228 s z_rcv;
+#X msg 11 177 receive z_rcv;
+#N canvas 378 326 146 263 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 73 \; \$1-xpos 290 \; \$1-ypos 550 \; \$1-xlabel 0 \; \$1-ylabel
+-8 \; \$1-number 8 \; \$1-font-size 10 \; \$1-size 15 \; \$1-font-size
+10 \; \$1-font 0 \; \$1-bg 0 \; \$1-front 12 \; \$1-label 12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 370 491 pd init;
+#X text 105 23 no init;
+#X msg 115 94 init 1;
+#X msg 105 42 init 0;
+#X text 114 61 init value;
+#X text 115 75 on loadbang;
+#X floatatom 198 42 3 0 20 0 - #0-number -;
+#X msg 198 94 number \$1;
+#X msg 322 92 send vradio_snd;
+#X msg 11 94 size \$1;
+#X text 10 23 dimensions;
+#X obj 11 44 nbx 3 14 8 200 0 0 empty \$0-size empty 0 -8 0 12 -262144
+-1 -1 15 256;
+#X text 61 41 size;
+#X text 300 155 label position;
+#X text 9 289 font properties;
+#X msg 302 229 label_pos \$1 \$2;
+#X msg 11 396 label_font \$1 \$2;
+#X text 60 313 1.font(0-2);
+#X text 60 334 2.height;
+#X text 351 178 1.x-offset;
+#X text 351 199 2.y-offset;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 -8 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 302 177 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 11 311 pd flash-time;
+#X text 162 289 preset-colors;
+#X text 301 289 RGB-colors;
+#X msg 162 396 color \$1 \$2 \$3;
+#N canvas 364 205 306 317 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 33 237 pack 0 0 0;
+#X obj 120 197 t b a;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 0 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-front empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 103 144 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 2;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X coords 0 -1 1 1 48 62 2 100 100;
+#X restore 162 311 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 96 410 route 0 1 2;
+#X obj 96 497 pack 0 0 0;
+#X obj 115 456 t b a;
+#X obj 168 455 t b a;
+#X obj 104 124 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X text 120 137 2.front;
+#X text 120 153 3.label;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 10 2 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 1 11 1;
+#X connect 13 0 11 0;
+#X connect 13 1 11 2;
+#X connect 14 0 9 1;
+#X connect 18 0 5 0;
+#X connect 19 0 6 0;
+#X connect 20 0 7 0;
+#X coords 0 -1 1 1 102 74 2 100 100;
+#X restore 302 311 pd flash-time;
+#X text 211 313 1.bg;
+#X text 211 333 2.front;
+#X text 211 354 3.label;
+#X text 162 452 delta;
+#X text 10 452 position;
+#X msg 11 559 pos \$1 \$2;
+#X msg 163 559 delta \$1 \$2;
+#X obj 163 535 list;
+#X obj 163 474 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 59 473 1.x-position;
+#X text 59 495 2.y-position;
+#X text 242 473 1.x-delta;
+#X text 242 495 2.y-delta;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 290 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 550 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 11 474 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 192 474 pd flash-time;
+#X obj 269 525 cnv 15 147 77 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 270 526 cnv 15 145 75 empty empty empty 20 12 0 14 -261682 -66577
+0;
+#X floatatom 291 580 5 0 0 0 - - -;
+#X obj 290 550 hradio 15 1 0 8 hradio_snd hradio_rcv myHradio 0 -8
+0 10 -262144 -33289 -33289 0;
+#X obj 11 118 s hradio_rcv;
+#X obj 105 118 s hradio_rcv;
+#X obj 198 118 s hradio_rcv;
+#X obj 308 118 s hradio_rcv;
+#X obj 11 254 s hradio_rcv;
+#X obj 162 254 s hradio_rcv;
+#X obj 302 254 s hradio_rcv;
+#X obj 11 421 s hradio_rcv;
+#X obj 162 421 s hradio_rcv;
+#X obj 11 584 s hradio_rcv;
+#X obj 163 584 s hradio_rcv;
+#X msg 28 203 receive hradio_rcv;
+#X msg 308 46 send hradio1_snd;
+#X msg 172 229 label myHradio;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [hradio] Set Properties through Messages;
+#X text 198 23 number of cells;
+#X connect 2 0 63 0;
+#X connect 3 0 59 0;
+#X connect 4 0 59 0;
+#X connect 10 0 62 0;
+#X connect 17 0 18 0;
+#X connect 18 0 60 0;
+#X connect 19 0 61 0;
+#X connect 20 0 58 0;
+#X connect 22 0 20 0;
+#X connect 26 0 64 0;
+#X connect 27 0 65 0;
+#X connect 32 0 26 0;
+#X connect 33 0 27 0;
+#X connect 36 0 66 0;
+#X connect 37 0 36 0;
+#X connect 38 0 36 0;
+#X connect 44 0 67 0;
+#X connect 45 0 68 0;
+#X connect 46 0 45 0;
+#X connect 47 0 46 0;
+#X connect 52 0 44 0;
+#X connect 53 0 46 1;
+#X connect 57 0 56 0;
+#X connect 69 0 9 0;
+#X connect 70 0 61 0;
+#X connect 71 0 63 0;
+#X restore 171 388 pd Setting_hradio_properties_through_messages;
+#X text 168 421 - output the number of the cell that has been clicked
+or sent to the inlet of [hradio]. Cell's are numbered from right to
+left \, in increasing order \, starting from zero.;
+#X text 24 246 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move a
+selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 11 21 horizontal row of gui-radio buttons;
+#X text 290 149 [hradio] has settable send;
+#X text 168 303 - a float highlights the corresponding button and outputs
+the button number. Buttons are numbered from left to right \, starting
+from zero. For incoming numbers that are out of range \, the nearest
+button number is selected.;
+#X text 168 468 - creating an [hradio] without any arguments sets default
+values for its gui-properties. See the subpatch below to learn how
+to dynamically instantiate a [hradio] object with custom properties:
+;
+#X text 99 468 15;
+#X text 215 552 (c) musil@iem.kug.ac.at;
+#X text 257 565 IEM KUG;
+#X text 232 577 graz \, austria 2002;
+#X text 168 367 - a list is truncated to the first element.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 98 351 bang;
+#X text 168 351 - output the last selected value.;
+#X text 329 2 [rdb] or [radiobut] or [radiobutton];
+#X connect 15 0 33 0;
+#X connect 16 0 17 0;
+#X connect 19 0 18 0;
+#X connect 19 1 23 0;
+#X connect 19 2 24 0;
+#X connect 19 3 25 0;
+#X connect 19 4 26 0;
+#X connect 19 5 27 0;
+#X connect 19 6 28 0;
+#X connect 19 7 29 0;
+#X connect 19 8 30 0;
+#X connect 19 9 31 0;
+#X connect 20 0 33 0;
+#X connect 21 0 20 0;
+#X connect 22 0 33 0;
+#X connect 33 0 16 0;
+#X connect 33 0 19 0;
+#X connect 33 0 32 0;
+#X connect 34 0 33 0;
+#X connect 35 0 33 0;
+#X connect 36 0 38 0;
+#X connect 39 0 37 0;
diff --git a/doc/pddp/hslider-help.pd b/doc/pddp/hslider-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..10a75fced8ca56028977de6e807de8a4bf5d3580
--- /dev/null
+++ b/doc/pddp/hslider-help.pd
@@ -0,0 +1,440 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header hslider 3 12 0 18
+-204280 -1 0;
+#X obj 0 291 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 344 META 0;
+#X text 12 135 LIBRARY internal;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 155 AUTHOR Thomas Musil;
+#X text 12 175 WEBSITE;
+#X text 12 215 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 25 KEYWORDS control storage GUI nonlocal;
+#X text 12 65 DESCRIPTION horizontal gui-slider;
+#X text 12 5 ALIAS hsl;
+#X text 12 85 INLET_0 float bang size range log init steady receive
+send label label_pos label_font color pos delta;
+#X text 12 115 OUTLET_0 float;
+#X text 12 195 RELEASE_DATE 2002;
+#X restore 500 597 pd META;
+#X obj 0 410 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 461 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 546 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 300 cnv 17 3 105 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 90 479 428 112 Related_objects 0;
+#X obj 19 52 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 17 28 All iem-gui objects:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [hslider] Related Objects;
+#X restore 100 597 pd Related_objects;
+#X obj 78 419 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 291 175 and receive names. Right-;
+#X text 291 190 click and choose;
+#X text 290 206 "Properties" to set them \,;
+#X text 98 299 float;
+#X text 98 340 list;
+#X text 98 419 float;
+#X text 291 220 or change them with messages (see below);
+#X text 430 3 abbreviation: [hsl];
+#X obj 414 45 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/hsl -text
+pdpedia: hsl;
+#X floatatom 135 116 4 0 0 0 - - -;
+#X msg 199 69 set \$1;
+#X floatatom 155 48 4 0 0 0 - - -;
+#X obj 135 138 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144
+-1 -1;
+#X obj 135 49 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 138 94 hsl 101 15 25 75 0 1 foo1_snd foo1_rcv empty 8 -8 0 10
+-225280 -1109 -1 3900 1;
+#X floatatom 199 48 4 0 0 0 - - -;
+#X floatatom 292 141 4 0 0 0 - - -;
+#X floatatom 292 48 4 0 0 0 - - -;
+#X obj 179 140 print;
+#N canvas 276 200 290 224 once 0;
+#X obj 38 47 t b b f;
+#X msg 56 85 1;
+#X obj 31 108 f 0;
+#X obj 31 131 pack 0 0;
+#X obj 31 156 route 0;
+#X obj 38 24 inlet;
+#X obj 31 180 outlet;
+#X connect 0 0 1 0;
+#X connect 0 1 2 0;
+#X connect 0 2 3 1;
+#X connect 1 0 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 0 0;
+#X restore 179 116 pd once;
+#X obj 59 177 hsl 73 15 55 3520 1 1 goo2_snd goo2_rcv log.freq. 8 7
+0 10 -204800 -260818 -90133 1618 1;
+#X obj 56 203 ftom;
+#X floatatom 56 227 4 0 0 0 - - -;
+#X floatatom 143 215 9 0 0 0 - - -;
+#X floatatom 56 132 4 0 0 0 - - -;
+#X obj 56 153 mtof;
+#X obj 292 92 s foo1_rcv;
+#X obj 292 117 r foo1_snd;
+#X msg 292 68 set \$1;
+#X text 139 193 (0.01 pixels);
+#X text 142 163 shift-click & drag;
+#X text 142 178 for fine-tuning;
+#X text 54 248 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move a
+selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 290 159 hslider has settable send;
+#X text 98 356 Special messages can be sent to [hslider] to change
+its properties:;
+#X text 168 419 - when the slider value is changed by clicking \, dragging
+\, or sending a float to the inlet \, the new slider value is sent
+to the outlet.;
+#N canvas 94 219 428 370 hsl-creation-arguments 0;
+#X obj 22 289 s pd-hsl-creation-arguments;
+#X text 20 37 "hsl" can be called with 18 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X text 21 225 For example \, click the msg-box to dynamically create
+a hsl:;
+#X text 20 84 hsl creation arguments: xSize ySize rangeBtm rangeTop
+Logarithmic Init sendName receiveName Label labelXOff labelYOff Font#
+fontSize bgColor foregroundColor lblColor sliderPosition steadyOnClick
+;
+#X text 21 142 note: sliderPosition is not the same as the initialization
+value. To dynamically instantiate an hsl that initializes with a desired
+value \, save an hsl in a patch and view it in a text editor to get
+the right value for sliderPosition. Or \, refer to hslider_set in g_hslider.c
+for conversion between sliderPosition and slider value.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [hslider] Creation Arguments and Dynamic Patching;
+#X msg 22 247 obj 150 335 hsl 75 20 -1 1 0 1 send receive Celaeno 12
+-9 0 12 7 13 21 4400 0;
+#X connect 7 0 0 0;
+#X restore 170 521 pd hsl-creation-arguments;
+#N canvas 66 11 463 602 Setting_slider_properties_through_messages
+0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X floatatom 11 188 1 0 1 0 - #0-soc -;
+#X text 323 34 no init;
+#X text 8 169 steady-on-click;
+#X text 339 169 label;
+#X msg 339 191 label blabla;
+#X msg 323 53 init 0;
+#X msg 11 221 steady \$1;
+#X msg 234 73 lin;
+#X msg 244 105 log;
+#X text 230 34 linear/;
+#X text 230 49 logarithmical;
+#X text 332 73 init value;
+#X text 333 88 on loadbang;
+#X text 231 169 change send name;
+#X text 106 169 change receive name;
+#X obj 120 244 s z_rcv;
+#X msg 108 191 receive z_rcv;
+#X msg 347 243 label mySlider;
+#X obj 234 134 s hsl_rcv;
+#X obj 323 134 s hsl_rcv;
+#X obj 11 269 s hsl_rcv;
+#X obj 233 269 s hsl_rcv;
+#X obj 108 269 s hsl_rcv;
+#X msg 120 221 receive hsl_rcv;
+#X msg 233 192 send hsl1_snd;
+#X msg 242 221 send hsl_snd;
+#X obj 339 271 s hsl_rcv;
+#N canvas 382 136 161 310 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 73 \; \$1-xpos 300 \; \$1-ypos 350 \; \$1-xlabel -2 \; \$1-ylabel
+-8 \; \$1-soc 1 \; \$1-font-size 10 \; \$1-width 128 \; \$1-height
+15 \; \$1-bottom 0 \; \$1-top 127 \; \$1-bg 0 \; \$1-front 12 \; \$1-label
+12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 384 415 pd init;
+#X msg 333 109 init 1;
+#X msg 11 105 size \$1 \$2;
+#X text 60 56 1.width;
+#X text 60 77 2.height;
+#X obj 11 134 s hsl_rcv;
+#X obj 123 134 s hsl_rcv;
+#X text 172 56 1.bottom;
+#X text 172 77 2.top;
+#X text 120 34 output-range;
+#X msg 123 105 range \$1 \$2;
+#X text 136 307 font properties;
+#X msg 138 379 label_font \$1 \$2;
+#X text 187 329 1.font(0-2);
+#X text 187 350 2.height;
+#X text 9 308 label position;
+#X msg 11 380 label_pos \$1 \$2;
+#X text 60 330 1.x-offset;
+#X text 60 351 2.y-offset;
+#X obj 11 405 s hsl_rcv;
+#X obj 138 404 s hsl_rcv;
+#X obj 273 325 cnv 15 157 82 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 274 326 cnv 15 155 80 empty empty empty 20 12 0 14 -261682 -66577
+0;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-width empty
+0 -8 0 12 -262144 -1 -1 128 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-height empty
+0 -8 0 12 -262144 -1 -1 15 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 11 55 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-bottom empty
+0 -8 0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-top empty 0
+-8 0 12 -262144 -1 -1 127 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 123 55 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 -2 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 -8 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 11 329 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 138 328 pd flash-time;
+#X text 8 448 preset-colors;
+#X text 104 448 RGB-colors;
+#X msg 11 554 color \$1 \$2 \$3;
+#N canvas 364 205 306 317 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 33 237 pack 0 0 0;
+#X obj 120 197 t b a;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 0 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-front empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 103 144 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 2;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X coords 0 -1 1 1 48 62 2 100 100;
+#X restore 11 469 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 96 410 route 0 1 2;
+#X obj 96 497 pack 0 0 0;
+#X obj 115 456 t b a;
+#X obj 168 455 t b a;
+#X obj 104 124 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X text 120 137 2.front;
+#X text 120 153 3.label;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 10 2 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 1 11 1;
+#X connect 13 0 11 0;
+#X connect 13 1 11 2;
+#X connect 14 0 9 1;
+#X connect 18 0 5 0;
+#X connect 19 0 6 0;
+#X connect 20 0 7 0;
+#X coords 0 -1 1 1 102 74 2 100 100;
+#X restore 108 469 pd flash-time;
+#X text 60 471 1.bg;
+#X text 60 491 2.front;
+#X text 60 512 3.label;
+#X text 317 448 delta;
+#X text 217 448 position;
+#X msg 218 540 pos \$1 \$2;
+#X msg 318 540 delta \$1 \$2;
+#X obj 318 517 list;
+#X obj 318 470 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 397 469 1.x-delta;
+#X text 397 491 2.y-delta;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 300 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 350 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 218 470 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 347 470 pd flash-time;
+#X floatatom 329 384 5 0 0 0 - - -;
+#X obj 11 579 s hsl_rcv;
+#X obj 318 565 s hsl_rcv;
+#X obj 218 565 s hsl_rcv;
+#X text 10 35 dimensions;
+#X text 7 1 [hslider] Set Properties through Messages;
+#X text 266 469 1.x-pos;
+#X text 266 491 2.y-pos;
+#X obj 289 356 hsl 128 15 0 127 0 0 hsl-snd hsl-rcv mySlider -2 -8
+0 10 -262144 -1 -1 0 1;
+#X connect 1 0 7 0;
+#X connect 5 0 27 0;
+#X connect 6 0 20 0;
+#X connect 7 0 21 0;
+#X connect 8 0 19 0;
+#X connect 9 0 19 0;
+#X connect 17 0 23 0;
+#X connect 18 0 27 0;
+#X connect 24 0 16 0;
+#X connect 25 0 22 0;
+#X connect 26 0 22 0;
+#X connect 29 0 20 0;
+#X connect 30 0 33 0;
+#X connect 38 0 34 0;
+#X connect 40 0 48 0;
+#X connect 44 0 47 0;
+#X connect 51 0 30 0;
+#X connect 52 0 38 0;
+#X connect 53 0 44 0;
+#X connect 54 0 40 0;
+#X connect 57 0 74 0;
+#X connect 58 0 57 0;
+#X connect 59 0 57 0;
+#X connect 65 0 76 0;
+#X connect 66 0 75 0;
+#X connect 67 0 66 0;
+#X connect 68 0 67 0;
+#X connect 71 0 65 0;
+#X connect 72 0 67 1;
+#X connect 81 0 73 0;
+#X restore 101 388 pd Setting_slider_properties_through_messages;
+#X text 11 21 horizontal gui-slider;
+#X text 98 466 18;
+#X text 168 466 - creating an [hslider] object without arguments sets
+default values for its gui-properties. See the subpatch below to learn
+how to dynamically instantiate a [bng] object with custom properties:
+;
+#X text 215 551 (c) musil@iem.kug.ac.at;
+#X text 257 564 IEM KUG;
+#X text 232 576 graz \, austria 2002;
+#X text 168 299 - a float updates the slider value and is sent to the
+outlet.;
+#X text 168 340 - a list is truncated to the first element.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 98 323 bang;
+#X text 168 323 - output the current slider value.;
+#X connect 20 0 23 0;
+#X connect 21 0 25 0;
+#X connect 22 0 25 0;
+#X connect 24 0 25 0;
+#X connect 25 0 20 0;
+#X connect 25 0 30 0;
+#X connect 26 0 21 0;
+#X connect 28 0 39 0;
+#X connect 30 0 29 0;
+#X connect 31 0 34 0;
+#X connect 31 0 32 0;
+#X connect 32 0 33 0;
+#X connect 35 0 36 0;
+#X connect 36 0 31 0;
+#X connect 38 0 27 0;
+#X connect 39 0 37 0;
diff --git a/doc/pddp/import-help.pd b/doc/pddp/import-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cb9c190db97ef610161bbc546759e28ffda0e57f
--- /dev/null
+++ b/doc/pddp/import-help.pd
@@ -0,0 +1,84 @@
+#N canvas 57 22 555 619 10;
+#X declare;
+#X declare;
+#X declare -lib cyclone -lib osc;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header import 3 12 0 18
+-204280 -1 0;
+#X obj 0 294 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Hans-Christoph Steiner;
+#X text 12 205 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION load libraries from a patch;
+#X text 12 65 INLET_0 bang rewind;
+#X text 12 85 OUTLET_0 symbol;
+#X text 12 105 OUTLET_1 bang;
+#X text 12 185 RELEASE_DATE 2005;
+#X restore 500 597 pd META;
+#X obj 0 369 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 455 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 505 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 105 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [import] Related Objects;
+#X obj 22 42 declare;
+#X restore 102 597 pd Related_objects;
+#X obj 78 303 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 378 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 411 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 482 3 import;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/import -text
+pdpedia: import;
+#X msg 91 114 bang;
+#X symbolatom 102 188 0 0 0 0 - - -;
+#X obj 91 214 print;
+#X text 138 113 get next item in list of loaded libs;
+#X text 150 137 start at the top of the list again;
+#X msg 103 138 rewind;
+#X text 97 509 [import] loads libraries from the patch. On Pd 0.40.
+or greater \, it loads the library into the patch's local namespace.
+On older versions \, it loads the libraries into the global namespace.
+;
+#X text 98 302 bang;
+#X text 98 332 rewind;
+#X text 98 377 symbol;
+#X text 98 410 bang;
+#X obj 262 184 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 283 183 bang after the end of the list is reached;
+#X text 11 23 load libraries from a patch;
+#X text 168 377 - a "bang" to the inlet of [import] sends a symbol
+to the left outlet which the name of a loaded library.;
+#X text 168 332 - the "rewind" message starts at the top of the list
+of libraries.;
+#X text 168 302 - sending a "bang" to [import] makes it output the
+loaded libraries one at a time (i.e. \, one per bang).;
+#X text 167 410 - once [import] has output the last library in the
+list \, sending another "bang" to its inlet will cause a "bang" to
+be sent out its right outlet.;
+#X text 80 471 n) symbol atom;
+#X text 167 471 - the arguments to [import] specify the libraries to
+load for patch.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 97 568 pddp/pddplink all_about_libraries.pd;
+#X obj 91 162 import cyclone osc;
+#X connect 13 0 35 0;
+#X connect 18 0 35 0;
+#X connect 35 0 14 0;
+#X connect 35 0 15 0;
+#X connect 35 1 24 0;
diff --git a/doc/pddp/initbang-help-ex1-loadbang.pd b/doc/pddp/initbang-help-ex1-loadbang.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8cfaf0c88e26549a3afe85597708b9b0a89b1237
--- /dev/null
+++ b/doc/pddp/initbang-help-ex1-loadbang.pd
@@ -0,0 +1,26 @@
+#N canvas 735 240 543 348 10;
+#X obj 10 10 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 17 11 [initbang] Abstraction Example No 1;
+#X msg 17 285 obj 20 50 outlet;
+#X obj 17 228 loadbang;
+#X text 91 142 This poses a problem if you want to save the patch with
+a connection from this abstraction's outlet in the parent patch to
+the [print from_loadbang] object below it. The next time you open the
+patch \, Pd will attempt to connect those objects BEFORE the [outlet]
+gets created \, and you will get an error.;
+#X obj 17 252 trigger bang bang;
+#X obj 250 308 print initbang-help.pd;
+#X text 91 72 This abstraction uses [loadbang] below to create the
+[outlet] seen at left. The [loadbang] object sends its bang after everything
+is done loading \, that means after all objects \, connections \, etc.
+in the parent patch have been created.;
+#X msg 138 265 the error above shows that loadbang creates the outlet
+too late;
+#X text 71 50 <- dynamically created [outlet];
+#X obj 17 308 send pd-initbang-help-ex1-loadbang.pd;
+#X connect 2 0 10 0;
+#X connect 3 0 5 0;
+#X connect 5 0 2 0;
+#X connect 5 1 8 0;
+#X connect 8 0 6 0;
diff --git a/doc/pddp/initbang-help-ex2-initbang.pd b/doc/pddp/initbang-help-ex2-initbang.pd
new file mode 100644
index 0000000000000000000000000000000000000000..93bb2c47817cecbc3ae78617a038ac5863fa095d
--- /dev/null
+++ b/doc/pddp/initbang-help-ex2-initbang.pd
@@ -0,0 +1,15 @@
+#N canvas 87 221 428 300 10;
+#X obj 1 9 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 10 [initbang] Abstraction Example No 2;
+#X obj 126 166 initbang;
+#X text 64 129 <- dynamically created [outlet];
+#X text 20 45 This abstraction just shows a simple example of how [initbang]
+works. Since [initbang] is used below (instead of [loadbang]) \, the
+outlet gets created before the parent patch initializes. This ensures
+that connections get created properly when the parent patch is opened.
+;
+#X msg 126 189 obj 20 130 outlet;
+#X obj 126 212 send pd-initbang-help-ex2-initbang.pd;
+#X connect 2 0 5 0;
+#X connect 5 0 6 0;
diff --git a/doc/pddp/initbang-help.pd b/doc/pddp/initbang-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..58e7a0cdacc4d957e80dabb2c877aebdb59f8a94
--- /dev/null
+++ b/doc/pddp/initbang-help.pd
@@ -0,0 +1,75 @@
+#N canvas 1 88 556 621 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header initbang 3 12 0
+18 -204280 -1 0;
+#X obj 1 425 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 95 LIBRARY internal;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 WEBSITE;
+#X text 12 45 DESCRIPTION send "bang" automatically when abstraction
+starts to load;
+#X text 12 75 OUTLET_0 bang;
+#X text 12 5 KEYWORDS control bang_op;
+#X text 12 155 RELEASE_DATE 2006;
+#X text 12 175 HELP_PATCH_AUTHORS IOhannes m zmoelnig. Jonathan Wilkes
+revised the patch to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 115 AUTHOR IOhannes m zmoelnig;
+#X restore 502 597 pd META;
+#X obj 1 452 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 1 505 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 1 532 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 100 509 (none);
+#N canvas 95 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 21 42 closebang;
+#X text 7 1 [initbang] Related Objects;
+#X obj 101 42 loadbang;
+#X restore 104 597 pd Related_objects;
+#X obj 80 461 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 442 22 pddp/pddplink http://wiki.puredata.info/en/initbang -text
+pdpedia: initbang;
+#X obj 468 5 initbang;
+#X text 100 429 (none);
+#X text 100 460 bang;
+#X obj 95 352 print from_initbang;
+#X obj 95 207 print from_loadbang;
+#X text 102 536 [initbang] is useful if you want to build abstractions
+that have a variable number of inlets or outlets.;
+#X text 13 21 send "bang" automatically when abstraction starts to
+load;
+#X obj 6 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 92 231 To solve this problem \, the abstraction below uses
+[initbang] instead of [loadbang]. [initbang] will send a bang before
+Pd initializes the parent patch \, so that the [outlet] is created
+before the connection between objects is made. Thus \, you can see
+below that the objects are connected successfully.;
+#X text 112 118 The above outlet is supposed to be connected to [print]
+object below but [loadbang] sends its bang too late. Pd will try to
+connect the abstraction's outlet to the inlet of [print] \, but this
+will happen before [loadbang] is executed (i.e. \, before the outlet
+exists). The result is the an error in the Pd window \, and connection
+fails.;
+#X text 92 372 Careful \, [initbang] sends its bang when the patch
+is starting to load \, so things like GUI objects will not have created
+their visual elements yet.;
+#X text 102 569 Pd Documentation Chapter 3.6 -;
+#X obj 289 569 pddp/pddplink ../1.manual/x3.htm;
+#X obj 95 99 initbang-help-ex1-loadbang;
+#X obj 95 321 initbang-help-ex2-initbang;
+#X text 160 460 - a bang message is sent when the containing parent
+patch first opens the abstraction as an embedded object. If the patch
+is a top-most patch \, no bang will ever be sent.;
+#X text 93 51 The abstraction below dynamically creates an outlet using
+[loadbang]. The [loadbang] object sends a bang after this help patch
+has loaded.;
+#X connect 25 0 14 0;
diff --git a/doc/pddp/inlet-help.pd b/doc/pddp/inlet-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5a07884c712a10f10bc4220f607bbd5d176c42ff
--- /dev/null
+++ b/doc/pddp/inlet-help.pd
@@ -0,0 +1,96 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header inlet 3 12 0 18
+-204280 -1 0;
+#X obj 0 397 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 145 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION control inlet for a subpatch;
+#X text 12 65 OUTLET_0 anything;
+#X text 12 5 KEYWORDS control nonlocal canvas_op;
+#X restore 500 597 pd META;
+#X obj 0 426 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 511 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 55 507 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 inlet;
+#X obj 67 43 outlet;
+#X obj 118 43 inlet~;
+#X obj 168 43 outlet;
+#X text 8 2 [inlet] Related Objects;
+#X obj 217 43 block~;
+#X text 266 43 [switch~];
+#X restore 102 598 pd Related_objects;
+#X obj 78 435 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 434 anything;
+#X obj 493 3 inlet;
+#X obj 461 20 pddp/pddplink http://wiki.puredata.info/en/inlet -text
+pdpedia: inlet;
+#X text 11 23 control inlet for a subpatch;
+#X obj 373 259 print~;
+#X obj 373 199 sig~ 12;
+#X floatatom 130 203 0 0 0 0 - - -;
+#X floatatom 130 255 0 0 0 0 - - -;
+#X text 100 182 messages in and out;
+#X text 343 176 audio in and out;
+#X obj 373 237 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#N canvas 50 247 428 293 subpatch-with-inlets-and-outlets 0;
+#X obj 68 68 inlet;
+#X text 20 38 control inlet for receiving messages;
+#X floatatom 68 96 0 0 0 0 - - -;
+#X floatatom 68 218 0 0 0 0 - - -;
+#X obj 68 250 outlet;
+#X text 20 188 control outlet for sending message;
+#X obj 340 84 inlet~;
+#X obj 340 135 print~;
+#X msg 355 109 bang;
+#X obj 340 243 outlet~;
+#X obj 340 217 sig~ 34;
+#X text 333 38 same for;
+#X text 334 57 signals.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [inlet] Creating Inlets/Outlets on Subpatches;
+#X connect 0 0 2 0;
+#X connect 3 0 4 0;
+#X connect 6 0 7 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X restore 130 229 pd subpatch-with-inlets-and-outlets;
+#X text 98 402 (none);
+#X text 98 515 (none);
+#X text 167 515 - a symbolic argument to an [inlet] object which will
+be ignored. However \, [inlet] will not create if you give it a float
+argument.;
+#X text 98 127 The subpatch below shows how to use [inlet] \, [inlet~]
+\, [outlet] \, and [outlet~] objects to get data into and out of a
+subpatch:;
+#X text 98 77 The [inlet] object allows messages to be sent to a subpatch
+from an object on the parent canvas.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 168 434 - passes any message that is sent to the subpatch's
+inlet in the parent patch. When multiple [inlet~] or [inlet] objects
+are in one subpatch \, their horizontal order corresponds with the
+inlets drawn on the containing object in the parent patch.;
+#X connect 14 0 20 1;
+#X connect 15 0 20 0;
+#X connect 19 0 13 0;
+#X connect 20 0 16 0;
+#X connect 20 1 13 0;
diff --git a/doc/pddp/inlet~-help.pd b/doc/pddp/inlet~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ceb7bb9c3bf6c6e9a6f3747498bf82a2957cc1ce
--- /dev/null
+++ b/doc/pddp/inlet~-help.pd
@@ -0,0 +1,181 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header inlet~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 350 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION signal inlet for a subpatch;
+#X text 12 65 OUTLET_0 signal;
+#X text 12 5 KEYWORDS signal nonlocal canvas_op;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 377 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 459 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 inlet;
+#X obj 67 43 outlet;
+#X obj 118 43 inlet~;
+#X obj 168 43 outlet;
+#X obj 225 43 block~;
+#X text 8 2 [inlet~] Related Objects;
+#X text 275 42 [switch~];
+#X restore 102 598 pd Related_objects;
+#X obj 78 386 cnv 17 3 60 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 369 259 print~;
+#X obj 369 199 sig~ 12;
+#X floatatom 126 203 0 0 0 0 - - -;
+#X floatatom 126 255 0 0 0 0 - - -;
+#X text 96 182 messages in and out;
+#X text 339 176 audio in and out;
+#X obj 369 237 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#N canvas 50 247 428 293 subpatch-with-inlets-and-outlets 0;
+#X obj 68 68 inlet;
+#X text 20 38 control inlet for receiving messages;
+#X floatatom 68 96 0 0 0 0 - - -;
+#X floatatom 68 218 0 0 0 0 - - -;
+#X obj 68 250 outlet;
+#X text 20 188 control outlet for sending message;
+#X obj 340 84 inlet~;
+#X obj 340 135 print~;
+#X msg 355 109 bang;
+#X obj 340 243 outlet~;
+#X obj 340 217 sig~ 34;
+#X text 333 38 same for;
+#X text 334 57 signals.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [inlet~] Creating Inlets/Outlets on Subpatches;
+#X connect 0 0 2 0;
+#X connect 3 0 4 0;
+#X connect 6 0 7 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X restore 126 229 pd subpatch-with-inlets-and-outlets;
+#X text 98 353 (none);
+#X text 11 23 signal inlet for a subpatch;
+#X obj 477 3 inlet~;
+#X obj 451 20 pddp/pddplink http://wiki.puredata.info/en/inlet~ -text
+pdpedia: inlet~;
+#X text 98 385 signal;
+#N canvas 61 152 428 466 up/downsampling 0;
+#X obj 30 396 print~;
+#X obj 48 370 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 112 396 print~;
+#X obj 130 372 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 195 396 print~;
+#X obj 213 370 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-tab 64 float 3;
+#A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
+#X coords 0 1 64 -1 200 140 1;
+#X restore 216 181 graph;
+#X obj 274 368 s \$0-tab;
+#X msg 274 341 const 0 \, 0 0 1;
+#X obj 145 233 print~;
+#X obj 145 208 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 23 181 tabreceive~ \$0-tab;
+#N canvas 81 269 585 267 test-subpatch-upsampled 0;
+#X obj 40 17 block~ 128 1 2;
+#X obj 209 149 inlet~ hold;
+#X obj 367 153 inlet~ lin;
+#X obj 23 202 print~;
+#X obj 41 176 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 209 209 print~;
+#X obj 227 183 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 366 213 print~;
+#X obj 383 187 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 42 49 Upsampling methods:;
+#X text 206 114 sample/hold;
+#X text 337 111 linear interpolation;
+#X text 16 114 interleaved zeros;
+#X obj 23 146 inlet~;
+#X connect 1 0 5 0;
+#X connect 2 0 7 0;
+#X connect 4 0 3 0;
+#X connect 6 0 5 0;
+#X connect 8 0 7 0;
+#X connect 13 0 3 0;
+#X restore 23 285 pd test-subpatch-upsampled;
+#N canvas 46 43 585 267 test-subpatch-downsampled 0;
+#X obj 23 146 outlet~;
+#X obj 209 149 outlet~ hold;
+#X obj 367 153 outlet~ lin;
+#X text 206 173 sample/hold;
+#X text 364 177 linear interpolation;
+#X text 197 19 upsampling methods:;
+#X obj 40 17 block~ 32 1 0.5;
+#X text 18 169 interleaved zeros;
+#X obj 21 83 tabreceive~ \$0-tab;
+#X connect 8 0 0 0;
+#X connect 8 0 1 0;
+#X connect 8 0 2 0;
+#X restore 29 340 pd test-subpatch-downsampled;
+#X text 20 38 When a subpatch is reblocked to a higher or lower sample
+rate \, the inlet~ and outlet~ objects offer a choice of three upsampling
+methods. (The inlet~ upsamples when entering a subpatch with a higher
+sample rate \; the outlet~ upsamples when leaving a subpatch of _lower_
+sample rate \, as demonstrated below.) There is no corresponding choice
+of downsampling method - downsampling is done simply by dropping the
+extra samples.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [inlet~] Up/downsampling;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 5 0 4 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X connect 11 0 12 1;
+#X connect 11 0 12 2;
+#X connect 11 0 9 0;
+#X connect 11 0 12 0;
+#X connect 13 0 0 0;
+#X connect 13 1 2 0;
+#X connect 13 2 4 0;
+#X restore 171 538 pd up/downsampling;
+#X text 80 477 1) symbol atom;
+#X text 98 127 The subpatch below shows how to use [inlet] \, [inlet~]
+\, [outlet] \, and [outlet~] objects to get data into and out of a
+subpatch:;
+#X text 168 477 - (optional) The word "hold" will cause sample/hold
+upsampling/downsampling \, and the word "lin" will cause linear upsampling/downsampling.
+See the subpatch below for more details:;
+#X text 98 77 The [inlet~] object allows signals to be sent to a subpatch
+from objects on the parent canvas.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 168 385 - the [inlet~] object outputs the signal sent to the
+inlet of the subpatch in which it is found. When multiple [inlet~]
+or [inlet] objects are in one subpatch \, their horizontal order corresponds
+with the inlets drawn on the containing object in the parent patch.
+;
+#X connect 10 0 16 1;
+#X connect 11 0 16 0;
+#X connect 15 0 9 0;
+#X connect 16 0 12 0;
+#X connect 16 1 9 0;
diff --git a/doc/pddp/int-help.pd b/doc/pddp/int-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b11e92c245af51566e1786b8a10f1a9e9dfcf556
--- /dev/null
+++ b/doc/pddp/int-help.pd
@@ -0,0 +1,139 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 550 21 empty empty empty 20 12 0 14 -228856 -66577
+0;
+#X obj 0 0 cnv 15 550 40 empty empty int 3 12 0 18 -204280 -1 0;
+#X obj 0 234 cnv 3 550 3 empty empty inlets 8 12 0 13 -228856 -1 0
+;
+#N canvas 49 212 482 395 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 24 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 25 KEYWORDS control storage;
+#X text 12 65 DESCRIPTION store an integer;
+#X text 12 5 ALIAS i;
+#X text 12 85 INLET_0 bang float;
+#X text 12 105 INLET_1 float;
+#X text 12 125 OUTLET_0 float;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 375 cnv 3 550 3 empty empty outlets 8 12 0 13 -228856 -1 0
+;
+#X obj 0 412 cnv 3 550 3 empty empty arguments 8 12 0 13 -228856 -1
+0;
+#X obj 0 475 cnv 3 550 3 empty empty more_info 8 12 0 13 -228856 -1
+0;
+#X obj 78 334 cnv 17 3 30 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 78 243 cnv 17 3 82 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 501 4 or;
+#X obj 100 524 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.1
+-text Pd manual 2.3.1: anatomy of a message;
+#N canvas 107 165 428 375 More_Info 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 36 Integers are "whole" numbers - numbers which do not contain
+fractions. The following are examples of whole numbers:;
+#X text 20 66 1;
+#X text 20 81 -544;
+#X text 20 110 10024;
+#X text 19 95 420;
+#X obj 1 161 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 7 1 [int] What is an integer;
+#X text 7 161 [int] Note;
+#X text 21 231 -8 \,;
+#X text 39 231 388 \,;
+#X text 63 231 608;
+#X text 22 248 and:;
+#X text 33 267 388 \,;
+#X text 57 267 608;
+#X text 22 267 8 \,;
+#X text 21 290 Hence \, the [int] object takes about as much CPU as
+the [float] object \; but is useful when numbers need to be truncated
+and/or when patches are being designed to be compatible with Pd and
+MAX/MSP.;
+#X text 21 206 All numbers in Pd are kept in 32-bit floating point
+and can represent real numbers between:;
+#X restore 102 545 pd More_Info;
+#X text 101 508 all_about_data-types.pd;
+#X text 98 242 bang;
+#X text 98 262 float;
+#X text 98 302 list;
+#X text 98 334 float;
+#N canvas 93 484 428 108 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 64 36 value;
+#X obj 111 36 list;
+#X floatatom 152 37 5 0 0 0 - - -;
+#X msg 195 36;
+#X obj 22 36 float;
+#X obj 22 66 symbol;
+#X obj 71 66 random;
+#X text 7 1 [int] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 99 382 float;
+#X obj 474 3 int;
+#X obj 522 3 i;
+#X obj 470 21 pddp/pddplink http://wiki.puredata.info/en/int -text
+pdpedia: int;
+#X msg 115 122 bang;
+#X floatatom 105 205 0 0 0 0 - - -;
+#X floatatom 105 100 0 0 0 0 - - -;
+#X floatatom 144 153 0 0 0 0 - - -;
+#X text 153 122 You can force the object to output the stored number.
+;
+#X text 150 100 You can set and output the value simoultaneously.;
+#X text 172 153 You can store the number \, without outputting it.
+;
+#X text 100 52 Tip: Press and hold SHIFT while click-n-dragging these
+number boxes to see how the [int] object truncates the number - drops
+decimal places.;
+#X obj 105 179 int 6.5;
+#X text 100 479 Note: [int] does not 'rounded off' floats. It discards
+everything to the right of the decimal point.;
+#X obj 78 384 cnv 17 3 17 empty empty 0 5 9 0 16 -228856 -162280 0
+;
+#N canvas 108 391 428 173 Building_a_counter 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 37 The [int] object can be used as a basis for building
+simple counter mechanisms in Pd. In the example below \, the [int]
+object's stored value is incremented by 1 with each "bang".;
+#X msg 164 84 bang;
+#X obj 164 113 int;
+#X obj 192 113 + 1;
+#X floatatom 164 139 5 0 0 0 - - -;
+#X text 7 1 [int] Example: Building a Counter;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 1;
+#X restore 102 567 pd Building_a_counter;
+#X text 11 20 store an integer;
+#X text 169 430 - initializes the object and stores the number until
+the value is reset. The creation argument is optional. If no creation
+argument is provided \, the object defaults to zero.;
+#X text 169 382 - outputs the stored value as a float message.;
+#X text 168 242 - output the currently stored integer.;
+#X text 168 262 - [int] will convert an incoming float to an integer--
+all numerals to the right of the decimal place are truncated (dropped).
+This value is then sent to the outlet.;
+#X text 168 302 - a list is truncated to the first element \, which
+is then output and stored.;
+#X text 168 334 - a float received at the right inlet is converted
+to an integer and stored for later use.;
+#X text 81 430 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 22 0 30 0;
+#X connect 24 0 30 0;
+#X connect 25 0 30 1;
+#X connect 30 0 23 0;
diff --git a/doc/pddp/intro-help.pd b/doc/pddp/intro-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b387764466bc1e52a355c75de680624255989eb6
--- /dev/null
+++ b/doc/pddp/intro-help.pd
@@ -0,0 +1,360 @@
+#N canvas 14 5 569 440 12;
+#X declare;
+#X obj 24 150 bang;
+#X text 124 150 - output a bang message;
+#X obj 24 180 float;
+#X text 124 180 - store and recall a number;
+#X obj 24 210 symbol;
+#X text 124 210 - store and recall a symbol;
+#X obj 24 240 int;
+#X text 124 240 - store and recall an integer;
+#X obj 24 270 send;
+#X text 124 270 - send a message to a named object;
+#X obj 24 300 receive;
+#X text 124 300 - catch "sent" messages;
+#X obj 24 330 select;
+#X text 124 330 - test for matching numbers or symbols;
+#X obj 24 360 route;
+#X text 124 360 - route messages according to first element;
+#X obj 24 390 pack;
+#X text 124 390 - make compound messages;
+#X obj 24 420 unpack;
+#X text 124 420 - get elements of compound messages;
+#X obj 24 450 trigger;
+#X text 124 450 - sequence and convert messagess;
+#X obj 24 480 spigot;
+#X text 124 480 - interruptible message connection;
+#X obj 24 510 moses;
+#X text 124 510 - part a numeric stream;
+#X obj 24 540 until;
+#X text 124 540 - looping mechanism;
+#X obj 24 570 print;
+#X text 124 570 - print out messages;
+#X obj 24 600 makefilename;
+#X text 145 601 - format a symbol with a variable field;
+#X obj 24 630 change;
+#X text 124 630 - remove repeated numbers from a stream;
+#X obj 24 660 swap;
+#X text 124 660 - swap two numbers;
+#X obj 24 690 value;
+#X text 124 690 - shared numeric value;
+#X obj 19 751 delay;
+#X text 119 751 - send a message after a time delay;
+#X obj 19 781 metro;
+#X text 119 781 - send a message periodically;
+#X obj 19 811 line;
+#X text 119 811 - send a series of linearly stepped numbers;
+#X obj 19 841 timer;
+#X text 119 841 - measure time intervals;
+#X obj 19 871 cputime;
+#X text 119 871 - measure CPU time;
+#X obj 19 901 realtime;
+#X text 119 901 - measure real time;
+#X obj 19 931 pipe;
+#X text 119 931 - dynamically growable delay line for numbers;
+#X text 209 990 - arithmetic;
+#X text 210 1013 - relational tests;
+#X text 189 1037 - bit twiddling;
+#X obj 20 1066 mtof;
+#X obj 20 1088 ftom;
+#X obj 61 1066 powtodb;
+#X obj 129 1065 rmstodb;
+#X obj 61 1087 dbtopow;
+#X obj 129 1087 dbtorms;
+#X text 211 1079 - convert acoustical units;
+#X obj 19 1111 mod;
+#X obj 50 1111 div;
+#X obj 81 1111 sin;
+#X obj 112 1111 cos;
+#X obj 143 1111 tan;
+#X obj 19 1132 atan;
+#X obj 59 1132 atan2;
+#X obj 108 1132 sqrt;
+#X obj 148 1132 log;
+#X obj 179 1132 exp;
+#X obj 210 1132 abs;
+#X text 250 1123 - higher math;
+#X obj 19 1155 random;
+#X text 119 1155 - lower math;
+#X obj 19 1178 max;
+#X obj 51 1178 min;
+#X text 119 1178 - greater or lesser of 2 numbers;
+#X obj 19 1201 clip;
+#X text 119 1201 - force a number into a range;
+#X obj 16 1251 notein;
+#X obj 75 1251 ctlin;
+#X obj 126 1251 pgmin;
+#X obj 176 1251 bendin;
+#X obj 235 1251 touchin;
+#X obj 16 1274 polytouchin;
+#X obj 120 1274 midiin;
+#X obj 179 1274 sysexin;
+#X text 318 1263 - MIDI input;
+#X obj 19 1317 noteout;
+#X obj 87 1317 ctlout;
+#X obj 147 1317 pgmout;
+#X obj 206 1317 bendout;
+#X obj 19 1338 touchout;
+#X obj 97 1338 polytouchout;
+#X obj 210 1338 midiout;
+#X text 318 1327 - MIDI output;
+#X obj 20 1370 makenote;
+#X text 109 1368 - schedule a delayed "note off" message corresponding
+to a note-on;
+#X obj 19 1402 stripnote;
+#X text 112 1403 - strip "note off" messages;
+#X obj 17 1441 tabread;
+#X text 117 1441 - read a number from a table;
+#X obj 17 1463 tabread4;
+#X text 117 1463 - read a number from a table;
+#X obj 17 1485 tabwrite;
+#X text 117 1485 - write a number to a table;
+#X obj 17 1508 soundfiler;
+#X text 117 1508 - read and write tables to soundfiles;
+#X obj 19 1558 loadbang;
+#X text 119 1558 - bang on load;
+#X obj 19 1584 serial;
+#X text 119 1584 - serial device control for NT only;
+#X obj 19 1612 netsend;
+#X text 119 1612 - send messages over the internet;
+#X obj 19 1633 netreceive;
+#X text 119 1633 - receive them;
+#X obj 19 1663 qlist;
+#X text 119 1663 - message sequencer;
+#X obj 19 1693 textfile;
+#X text 119 1693 - file to message converter;
+#X obj 19 1723 openpanel;
+#X text 119 1723 - "Open" dialog;
+#X obj 19 1746 savepanel;
+#X text 119 1746 - "Save as" dialog;
+#X obj 19 1783 bag;
+#X text 119 1783 - set of numbers;
+#X obj 19 1813 poly;
+#X text 119 1813 - polyphonic voice allocation;
+#X obj 19 1843 key;
+#X obj 53 1843 keyup;
+#X text 119 1843 - numeric key values from keyboard;
+#X obj 19 1866 keyname;
+#X text 119 1866 - symbolic key name;
+#X text 144 1960 - arithmetic on audio signals;
+#X text 116 1992 - maximum or minimum of 2 inputs;
+#X obj 16 2022 clip~;
+#X text 116 2022 - constrict signal to lie between two bounds;
+#X obj 16 2052 q8_rsqrt~;
+#X text 116 2052 - cheap reciprocal square root (beware -- 8 bits!)
+;
+#X obj 16 2082 q8_sqrt~;
+#X text 116 2082 - cheap square root (beware -- 8 bits!);
+#X obj 16 2112 wrap~;
+#X text 116 2112 - wraparound (fractional part;
+#X obj 16 2142 fft~;
+#X text 116 2142 - complex forward discrete Fourier transform;
+#X obj 16 2172 ifft~;
+#X text 116 2172 - complex inverse discrete Fourier transform;
+#X obj 16 2202 rfft~;
+#X text 116 2202 - real forward discrete Fourier transform;
+#X obj 16 2232 rifft~;
+#X text 116 2232 - real inverse discrete Fourier transform;
+#X obj 16 2262 framp~;
+#X text 116 2262 - estimate frequency and amplitude of FFT components;
+#X obj 16 2292 mtof~;
+#X obj 67 2292 ftom~;
+#X obj 117 2292 rmstodb~;
+#X obj 195 2292 dbtorms~;
+#X obj 273 2292 rmstopow~;
+#X obj 359 2292 powtorms~;
+#X text 448 2293 - acoustic conversions;
+#X obj 20 2355 dac~;
+#X text 120 2355 - audio output;
+#X obj 20 2385 adc~;
+#X text 120 2385 - audio input;
+#X obj 20 2415 sig~;
+#X text 120 2415 - convert numbers to audio signals;
+#X obj 20 2445 line~;
+#X text 120 2445 - generate audio ramps;
+#X obj 20 2475 vline~;
+#X text 120 2475 - deluxe line~;
+#X obj 20 2535 snapshot~;
+#X text 120 2535 - sample a signal (convert it back to a number);
+#X obj 20 2565 vsnapshot~;
+#X text 120 2565 - deluxe snapshot~;
+#X obj 20 2595 bang~;
+#X text 120 2595 - send a bang message after each DSP block;
+#X obj 20 2625 samplerate~;
+#X text 120 2625 - get the sample rate;
+#X obj 20 2655 send~;
+#X text 120 2655 - nonlocal signal connection with fanout;
+#X obj 20 2685 receive~;
+#X text 120 2685 - get signal from send~;
+#X obj 20 2715 throw~;
+#X text 120 2715 - add to a summing bus;
+#X obj 20 2745 catch~;
+#X text 120 2745 - define and read a summing bus;
+#X obj 20 2775 block~;
+#X text 120 2775 - specify block size and overlap;
+#X obj 20 2805 switch~;
+#X text 120 2805 - switch DSP computation on and off;
+#X obj 20 2835 readsf~;
+#X text 120 2835 - soundfile playback from disk;
+#X obj 20 2865 writesf~;
+#X text 120 2865 - record sound to disk;
+#X obj 17 2927 phasor~;
+#X text 117 2927 - sawtooth oscillator;
+#X obj 17 2957 cos~;
+#X text 117 2957 - cosine;
+#X obj 17 2987 osc~;
+#X text 117 2987 - cosine oscillator;
+#X obj 17 3017 tabwrite~;
+#X text 117 3017 - write to a table;
+#X obj 17 3047 tabplay~;
+#X text 117 3047 - play back from a table (non-transposing);
+#X obj 17 3077 tabread~;
+#X text 117 3077 - non-interpolating table read;
+#X obj 17 3107 tabread4~;
+#X text 117 3107 - four-point interpolating table read;
+#X obj 17 3137 tabosc4~;
+#X text 117 3137 - wavetable oscillator;
+#X obj 17 3167 tabsend~;
+#X text 117 3167 - write one block continuously to a table;
+#X obj 17 3197 tabreceive~;
+#X text 117 3197 - read one block continuously from a table;
+#X text 18 3228 -------------------- AUDIO FILTERS ------------------------
+;
+#X obj 18 3258 vcf~;
+#X text 118 3258 - voltage controlled filter;
+#X obj 18 3288 noise~;
+#X text 118 3288 - white noise generator;
+#X obj 18 3318 env~;
+#X text 118 3318 - envelope follower;
+#X obj 18 3348 hip~;
+#X text 118 3348 - high pass filter;
+#X obj 18 3378 lop~;
+#X text 118 3378 - low pass filter;
+#X obj 18 3408 bp~;
+#X text 118 3408 - band pass filter;
+#X obj 18 3438 biquad~;
+#X text 118 3438 - raw filter;
+#X obj 18 3468 samphold~;
+#X text 118 3468 - sample and hold unit;
+#X obj 18 3498 print~;
+#X text 118 3498 - print out one or more "blocks";
+#X obj 18 3528 rpole~;
+#X text 118 3528 - raw real-valued one-pole filter;
+#X obj 18 3558 rzero~;
+#X text 118 3558 - raw real-valued one-zero filter;
+#X obj 18 3588 rzero_rev~;
+#X text 121 3588 - time-reversed;
+#X obj 18 3618 cpole~;
+#X obj 77 3618 czero~;
+#X text 214 3618 - corresponding complex-valued filters;
+#X text 18 3648 -------------------- AUDIO DELAY ------------------------
+;
+#X obj 18 3678 delwrite~;
+#X text 118 3678 - write to a delay line;
+#X obj 18 3708 delread~;
+#X text 118 3708 - read from a delay line;
+#X obj 18 3738 vd~;
+#X text 118 3738 - read from a delay line at a variable delay time
+;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X restore 18 3798 pd;
+#X text 118 3798 - define a subwindow;
+#X obj 18 3828 table;
+#X text 118 3828 - array of numbers in a subwindow;
+#X obj 18 3858 inlet;
+#X text 118 3858 - add an inlet to a pd;
+#X obj 18 3888 outlet;
+#X text 118 3888 - add an outlet to a pd;
+#X obj 18 3918 inlet~;
+#X obj 78 3918 outlet~;
+#X obj 18 3978 struct;
+#X text 118 3978 - define a data structure;
+#X obj 18 4008 drawcurve;
+#X obj 106 4008 filledcurve;
+#X text 219 4008 - draw a curve;
+#X obj 18 4038 drawpolygon;
+#X obj 123 4038 filledpolygon;
+#X text 253 4038 - draw a polygon;
+#X obj 18 4068 plot;
+#X text 118 4068 - plot an array field;
+#X obj 18 4098 drawnumber;
+#X text 118 4098 - print a numeric value;
+#X obj 18 4158 pointer;
+#X text 118 4158 - point to an object belonging to a template;
+#X obj 18 4188 get;
+#X text 118 4188 - get numeric fields;
+#X obj 18 4218 set;
+#X text 118 4218 - change numeric fields;
+#X obj 18 4248 element;
+#X text 118 4248 - get an array element;
+#X obj 18 4278 getsize;
+#X text 118 4278 - get the size of an array;
+#X obj 18 4308 setsize;
+#X text 118 4308 - change the size of an array;
+#X obj 18 4338 append;
+#X text 118 4338 - add an element to a list;
+#X obj 18 4368 sublist;
+#X obj 14 4449 scalar;
+#X text 104 4448 - draw a scalar on parent;
+#X obj 15 4479 scope~;
+#X text 115 4479 (use tabwrite~ now);
+#X obj 15 4509 namecanvas;
+#X obj 15 4539 template;
+#X text 115 4539 (use struct now);
+#X obj 136 3618 czero_rev~;
+#X text 20 2324 ------------- AUDIO GLUE ----------------------------
+;
+#X obj 20 2505 threshold~;
+#X text 120 2505 - detect signal thresholds;
+#X text 16 1930 ---------------------- AUDIO MATH -----------------------
+;
+#X text 17 1419 --------------------- TABLES -------------------------
+;
+#X text 18 1539 --------------------- MISC ----------------------;
+#X text 20 961 ------------------------- MATH -----------------;
+#X text 19 721 ------------------------- TIME --------------------------
+;
+#X text 17 1232 ------------------------ MIDI -------------------------
+;
+#X text 24 120 --------------- GLUE ----------------;
+#X text 18 3768 ------------------------ SUBWINDOWS ------------------------
+;
+#X text 18 3948 ---------------------- DATA TEMPLATES ----------------------
+;
+#X text 18 4128 ---------------------- ACCESSING DATA ----------------------
+;
+#X text 17 2897 ------------ AUDIO OSCILLATORS AND TABLES -------------
+;
+#X obj 57 1992 min~;
+#X obj 16 1992 max~;
+#X obj 19 1014 ==;
+#X obj 51 1014 !=;
+#X obj 83 1014 >;
+#X obj 115 1014 <;
+#X obj 146 1014 >=;
+#X obj 177 1014 <=;
+#X text 18 4410 ------------------------ OBSOLETE --------------------------
+;
+#X obj 51 991 -;
+#X obj 84 991 *;
+#X obj 116 991 /;
+#X obj 149 991 pow;
+#X obj 19 991 +;
+#X obj 19 1037 &;
+#X obj 47 1037 &&;
+#X obj 74 1038 |;
+#X obj 102 1038 ||;
+#X obj 129 1038 %;
+#X obj 16 1960 +~;
+#X obj 48 1960 -~;
+#X obj 79 1960 *~;
+#X obj 111 1960 /~;
+#X obj 19 1895 declare;
+#X text 119 1895 - set search path and/or load libraries;
+#X text 156 3919 - signal versions;
+#X text 23 22 The following is a list of built-in objects in Pd. (Not
+included in this list are messages \, atoms \, graphs \, etc. which
+aren't typed into object boxes but come straight off the "add" menu.)
+Right-click (or double-click on a Macintosh) on any object to get its
+"help window".;
+#X text 118 4368 - get a pointer into a list within a scalar;
diff --git a/doc/pddp/key-help.pd b/doc/pddp/key-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7faf0092a30b0c35277ec06915388cd8728361c4
--- /dev/null
+++ b/doc/pddp/key-help.pd
@@ -0,0 +1,131 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header key 3 12 0 18 -204280
+-1 0;
+#X obj 0 257 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Dave Sabine \, July 11 \, 2003 Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION get input from the keyboard;
+#X text 12 65 OUTLET_0 float;
+#X text 12 5 KEYWORDS control user_input;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 285 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 445 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 473 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 449 (none);
+#N canvas 92 446 428 145 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 21 42 keyup;
+#X obj 61 42 keyname;
+#X text 19 72 Externals and other object libraries;
+#X text 7 1 [key] Related Objects;
+#X obj 18 94 pddp/helplink Gem/gemkeyboard;
+#X obj 18 114 pddp/helplink Gem/gemkeyname;
+#X restore 102 598 pd Related_objects;
+#X text 98 293 float;
+#X obj 78 294 cnv 17 3 140 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 489 3 key;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/key -text
+pdpedia: key;
+#X text 98 261 (none);
+#X text 98 411 Also note that key combinations \, such as SHIFT+7 produce
+a different result than SHIFT or 7 alone.;
+#X text 168 346 Some keys \, such as SHIFT or the F1-F12 series all
+produce a zero \, but we can see by the [bng] that the event is not
+ignored completely...but the numeric "ID" of the key is not captured
+successfully. (This may produce different results on different systems.)
+;
+#X text 168 293 - the number received at the outlet represents the
+numeric "ID" of a key on the computer's keyboard. This event occurs
+when the key is pressed down. Only one event is captured at a time.
+;
+#X obj 103 137 key;
+#X obj 83 174 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 103 174 5 0 0 0 - - -;
+#X text 132 137 Type something on the keyboard to send input to Pd
+;
+#X text 100 95 [key] reports the (system dependent) numbers of "printing"
+keys of the keyboard.;
+#X text 99 477 Caveat - this only works if Pd actually gets the key
+events which can depend on the stacking order of windows and/or the
+pointer location. This is dependent on the system.;
+#N canvas 105 161 428 356 reacting_to_user_input 0;
+#X text 19 37 Most \, if not all \, programming environments provide
+us with tools to capture 'user initiated' events from the operating
+system. Keyboard input \, mouse clicks \, and mouse movements are the
+most common events in this 'user event' category.;
+#X text 19 103 Pd's [key] \, [keyup] \, and [keyname] are complimented
+by the externals such as [gemmouse] and [nimouse] to provide us with
+a full range of tools to gleen a user's activities at the computer.
+;
+#X text 33 240 onKeyUp;
+#X text 33 221 onKeyDown;
+#X text 33 259 onKeyPress;
+#X text 20 290 hmmm...wouldn't it be great if Pd also gave us onChange
+\, onBlur \, onFocus \, onClick \, onDblClick \, onDragDrop \, onLoad
+\, onMouseDown \, onMouseOver \, onMouseOut \, onMouseMove \, onUnload...?
+;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [key] Reacing to User Input;
+#X text 20 169 It's interesting to note that with these tools \, PD
+can mimic some of the functions in other languages - Javascript for
+example has:;
+#X restore 102 524 pd reacting_to_user_input;
+#N canvas 105 31 345 511 some_keyboard_fun 0;
+#X obj 52 75 loadbang;
+#X msg 23 16 bang;
+#X obj 33 158 qlist;
+#X floatatom 33 185 5 0 0 0 - - -;
+#X obj 228 30 r keyboard_fun;
+#X msg 52 105 read keyboard_fun.txt;
+#X msg 45 51 rewind;
+#X obj 228 112 symbol add2;
+#X obj 228 83 t b s;
+#X obj 228 138 pack s s;
+#X obj 228 164 route list;
+#X msg 47 245 set;
+#X msg 47 278;
+#X obj 228 57 symbol;
+#X text 71 17 Click here to start...;
+#X msg 62 131 tempo 0.8;
+#X obj 47 217 loadbang;
+#X connect 0 0 5 0;
+#X connect 0 0 15 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 13 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 1 9 1;
+#X connect 9 0 10 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 13 0 8 0;
+#X connect 15 0 2 0;
+#X connect 16 0 11 0;
+#X restore 102 548 pd some_keyboard_fun;
+#X obj 245 571 pddp/pddplink all_about_hid.pd -text all_about_hid;
+#X text 100 572 for more on HIDs:;
+#X text 11 23 get input from the keyboard;
+#X text 168 261 - [key] gets input directly from the keyboard.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 17 0 18 0;
+#X connect 17 0 19 0;
diff --git a/doc/pddp/keyboard_fun.txt b/doc/pddp/keyboard_fun.txt
new file mode 100644
index 0000000000000000000000000000000000000000..076768f9b57318fe7e7a8e5c38194f23db486a4a
--- /dev/null
+++ b/doc/pddp/keyboard_fun.txt
@@ -0,0 +1,294 @@
+keyboard_fun I;
+193.016 keyboard_fun _;
+245.261 keyboard_fun t;
+34.8299 keyboard_fun y;
+91.4286 keyboard_fun p;
+214.785 keyboard_fun e;
+177.052 keyboard_fun d;
+134.966 keyboard_fun _;
+100.136 keyboard_fun t;
+47.8912 keyboard_fun h;
+172.698 keyboard_fun i;
+47.8912 keyboard_fun s;
+134.966 keyboard_fun _;
+291.701 keyboard_fun m;
+7.25624 keyboard_fun e;
+301.859 keyboard_fun s;
+190.113 keyboard_fun s;
+26.1224 keyboard_fun a;
+133.515 keyboard_fun g;
+74.0136 keyboard_fun e;
+232.2 keyboard_fun _;
+245.22 keyboard_fun i;
+191.565 keyboard_fun n;
+441.179 keyboard_fun _;
+224.943 keyboard_fun J;
+222.041 keyboard_fun u;
+153.832 keyboard_fun l;
+119.002 keyboard_fun y;
+216.236 keyboard_fun .;
+303.311 keyboard_fun _;
+399.093 keyboard_fun Y;
+165.442 keyboard_fun e;
+59.5011 keyboard_fun s;
+245.8299 keyboard_fun ,;
+134.966 keyboard_fun _;
+181.406 keyboard_fun I;
+222.041 keyboard_fun ';
+91.4286 keyboard_fun m;
+224.943 keyboard_fun _;
+326.531 keyboard_fun u;
+13.0612 keyboard_fun p;
+224.943 keyboard_fun _;
+253.968 keyboard_fun l;
+11.61 keyboard_fun a;
+203.175 keyboard_fun t;
+58.0499 keyboard_fun e;
+152.381 keyboard_fun _;
+168.345 keyboard_fun a;
+29.0249 keyboard_fun g;
+229.297 keyboard_fun a;
+62.4036 keyboard_fun i;
+94.5624 keyboard_fun n;
+245.5261 keyboard_fun _;
+75.4649 keyboard_fun p;
+195.918 keyboard_fun l;
+62.4036 keyboard_fun a;
+92.8798 keyboard_fun y;
+44.9887 keyboard_fun i;
+153.832 keyboard_fun n;
+62.4036 keyboard_fun g;
+152.381 keyboard_fun _;
+62.4036 keyboard_fun w;
+95.7823 keyboard_fun i;
+26.1224 keyboard_fun t;
+152.381 keyboard_fun h;
+166.893 keyboard_fun _;
+142.222 keyboard_fun P;
+123.356 keyboard_fun D;
+639.592 keyboard_fun .;
+366.893 keyboard_fun _;
+104.49 keyboard_fun I;
+161.088 keyboard_fun _;
+14.5125 keyboard_fun w;
+200.272 keyboard_fun r;
+242.358 keyboard_fun o;
+60.9524 keyboard_fun t;
+127.71 keyboard_fun e;
+162.54 keyboard_fun _;
+169.796 keyboard_fun t;
+75.4649 keyboard_fun h;
+132.063 keyboard_fun i;
+32.063 keyboard_fun s;
+100.136 keyboard_fun _;
+21.7687 keyboard_fun m;
+137.868 keyboard_fun e;
+261.224 keyboard_fun s;
+20.3175 keyboard_fun s;
+207.528 keyboard_fun a;
+171.247 keyboard_fun g;
+36.2812 keyboard_fun e;
+188.662 keyboard_fun _;
+97.2336 keyboard_fun a;
+46.4399 keyboard_fun n;
+101.587 keyboard_fun d;
+79.8186 keyboard_fun _;
+296.054 keyboard_fun s;
+59.5011 keyboard_fun e;
+198.821 keyboard_fun n;
+110.295 keyboard_fun t;
+79.8186 keyboard_fun _;
+423.764 keyboard_fun k;
+92.8798 keyboard_fun e;
+29.0249 keyboard_fun y;
+79.8186 keyboard_fun _;
+242.358 keyboard_fun s;
+117.551 keyboard_fun t;
+7.25624 keyboard_fun r;
+168.345 keyboard_fun o;
+341.043 keyboard_fun k;
+88.5261 keyboard_fun e;
+319.274 keyboard_fun s;
+208.98 keyboard_fun _;
+36.2812 keyboard_fun t;
+120.454 keyboard_fun o;
+84.1723 keyboard_fun _;
+776.417 keyboard_fun q;
+59.5011 keyboard_fun l;
+168.345 keyboard_fun i;
+47.8912 keyboard_fun s;
+541.315 keyboard_fun t;
+210.431 keyboard_fun _;
+30.4762 keyboard_fun a;
+126.259 keyboard_fun n;
+92.8798 keyboard_fun d;
+79.8186 keyboard_fun _;
+236.553 keyboard_fun n;
+33.3787 keyboard_fun o;
+71.1111 keyboard_fun w;
+79.8186 keyboard_fun _;
+220.59 keyboard_fun P;
+126.259 keyboard_fun D;
+217.687 keyboard_fun _;
+208.98 keyboard_fun i;
+43.5374 keyboard_fun s;
+79.8186 keyboard_fun _;
+84.1723 keyboard_fun r;
+208.98 keyboard_fun e;
+211.882 keyboard_fun -;
+285.896 keyboard_fun w;
+113.197 keyboard_fun r;
+146.576 keyboard_fun i;
+134.966 keyboard_fun t;
+53.6961 keyboard_fun i;
+116.1 keyboard_fun n;
+34.8299 keyboard_fun g;
+137.868 keyboard_fun _;
+39.1837 keyboard_fun t;
+159.637 keyboard_fun h;
+24.6712 keyboard_fun i;
+165.442 keyboard_fun s;
+137.868 keyboard_fun _;
+2.90249 keyboard_fun m;
+265.578 keyboard_fun e;
+294.603 keyboard_fun s;
+410.703 keyboard_fun s;
+47.8912 keyboard_fun a;
+377.324 keyboard_fun g;
+81.2698 keyboard_fun e;
+240.907 keyboard_fun _;
+161.088 keyboard_fun f;
+24.6712 keyboard_fun o;
+95.7823 keyboard_fun r;
+68.2086 keyboard_fun _;
+29.0249 keyboard_fun m;
+203.175 keyboard_fun e;
+88.5261 keyboard_fun _;
+37.7324 keyboard_fun o;
+242.358 keyboard_fun n;
+89.9773 keyboard_fun _;
+214.785 keyboard_fun y;
+39.1837 keyboard_fun o;
+71.1111 keyboard_fun u;
+33.3787 keyboard_fun r;
+142.222 keyboard_fun _;
+39.1837 keyboard_fun c;
+245.261 keyboard_fun o;
+50.7937 keyboard_fun m;
+119.002 keyboard_fun p;
+72.5624 keyboard_fun u;
+195.918 keyboard_fun t;
+55.1474 keyboard_fun e;
+74.0136 keyboard_fun r;
+142.222 keyboard_fun _;
+252.517 keyboard_fun s;
+155.283 keyboard_fun c;
+37.7324 keyboard_fun r;
+206.077 keyboard_fun e;
+219.138 keyboard_fun e;
+132.063 keyboard_fun n;
+137.868 keyboard_fun .;
+559.637 keyboard_fun _;
+588.662 keyboard_fun _;
+530.612 keyboard_fun D;
+56.5986 keyboard_fun o;
+220.59 keyboard_fun n;
+168.345 keyboard_fun ';
+220.59 keyboard_fun  t;
+220.59 keyboard_fun _;
+161.088 keyboard_fun w;
+121.905 keyboard_fun o;
+100.136 keyboard_fun r;
+161.088 keyboard_fun r;
+2.90249 keyboard_fun y;
+119.002 keyboard_fun _;
+34.8299 keyboard_fun i;
+278.639 keyboard_fun t;
+220.59 keyboard_fun ';
+94.3311 keyboard_fun s;
+193.016 keyboard_fun _;
+249.615 keyboard_fun n;
+44.9887 keyboard_fun o;
+104.49 keyboard_fun t;
+113.197 keyboard_fun _;
+2.90249 keyboard_fun a;
+113.197 keyboard_fun _;
+238.005 keyboard_fun l;
+44.9887 keyboard_fun o;
+146.576 keyboard_fun n;
+177.052 keyboard_fun g;
+105.941 keyboard_fun _;
+159.637 keyboard_fun m;
+114.649 keyboard_fun e;
+211.882 keyboard_fun s;
+216.236 keyboard_fun s;
+185.76 keyboard_fun a;
+76.9161 keyboard_fun g;
+17.415 keyboard_fun e;
+294.603 keyboard_fun .;
+528.254 keyboard_fun .;
+827.211 keyboard_fun .;
+24.6712 keyboard_fun i;
+669.025 keyboard_fun t;
+207.528 keyboard_fun ';
+110.295 keyboard_fun s;
+105.941 keyboard_fun _;
+303.311 keyboard_fun a;
+529.705 keyboard_fun l;
+129.161 keyboard_fun m;
+34.8299 keyboard_fun o;
+108.844 keyboard_fun s;
+139.32 keyboard_fun t;
+150.93 keyboard_fun _;
+15.9637 keyboard_fun o;
+140.771 keyboard_fun v;
+63.8549 keyboard_fun e;
+216.236 keyboard_fun r;
+203.175 keyboard_fun .;
+737.234 keyboard_fun _;
+1034.74 keyboard_fun I;
+185.76 keyboard_fun _;
+169.796 keyboard_fun h;
+40.6349 keyboard_fun a;
+101.587 keyboard_fun v;
+60.9524 keyboard_fun e;
+177.052 keyboard_fun _;
+39.1837 keyboard_fun o;
+240.907 keyboard_fun n;
+62.4036 keyboard_fun l;
+179.955 keyboard_fun y;
+84.1723 keyboard_fun _;
+60.9524 keyboard_fun o;
+179.955 keyboard_fun n;
+79.8186 keyboard_fun e;
+84.1723 keyboard_fun _;
+232.2 keyboard_fun m;
+15.9637 keyboard_fun o;
+137.868 keyboard_fun r;
+58.0499 keyboard_fun e;
+84.1723 keyboard_fun _;
+26.1224 keyboard_fun t;
+172.698 keyboard_fun h;
+55.1474 keyboard_fun i;
+174.15 keyboard_fun n;
+97.2336 keyboard_fun g;
+95.7823 keyboard_fun _;
+75.4649 keyboard_fun t;
+229.297 keyboard_fun o;
+95.7823 keyboard_fun _;
+2.90249 keyboard_fun s;
+177.052 keyboard_fun a;
+108.844 keyboard_fun y;
+130.612 keyboard_fun :;
+607.528 keyboard_fun _;
+448.299 keyboard_fun g;
+114.649 keyboard_fun o;
+195.918 keyboard_fun o;
+92.8798 keyboard_fun d;
+507.528 keyboard_fun _;
+262.676 keyboard_fun n;
+245.125 keyboard_fun i;
+229.161 keyboard_fun g;
+207.392 keyboard_fun h;
+262.54 keyboard_fun t;
+233.651 keyboard_fun .;
\ No newline at end of file
diff --git a/doc/pddp/keyname-help.pd b/doc/pddp/keyname-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ef1d57fa9a1bca38ac3ef48f285c2faf87977837
--- /dev/null
+++ b/doc/pddp/keyname-help.pd
@@ -0,0 +1,137 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header keyname 3 12 0 18
+-204280 -1 0;
+#X obj 0 338 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 5 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Dave Sabine \, July 11 \, 2003 Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION get input and key name from the keyboard
+;
+#X text 12 65 OUTLET_0 float;
+#X text 12 85 OUTLET_1 symbol;
+#X text 12 5 KEYWORDS control symbol_op user_input;
+#X restore 500 597 pd META;
+#X obj 0 365 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 5 12 0
+13 -228856 -1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 5 12
+0 13 -228856 -1 0;
+#X obj 0 464 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 5 12
+0 13 -228856 -1 0;
+#X text 98 441 (none);
+#N canvas 105 474 428 145 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 20 73 Externals and other object libraries;
+#X text 19 100 [gemkeyboard];
+#X text 102 100 [gemkeyname];
+#X obj 22 43 key;
+#X text 8 2 [keyup] Related Objects;
+#X obj 53 43 keyup;
+#X restore 102 597 pd Related_objects;
+#X text 98 373 float;
+#X obj 78 374 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 342 (none);
+#X obj 103 221 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 104 188 428 356 reacting_to_user_input 0;
+#X text 20 38 Most \, if not all \, programming environments provide
+us with tools to capture 'user initiated' events from the operating
+system. Keyboard input \, mouse clicks \, and mouse movements are the
+most common events in this 'user event' category.;
+#X text 20 104 Pd's [key] \, [keyup] \, and [keyname] are complimented
+by the externals such as [gemmouse] and [nimouse] to provide us with
+a full range of tools to gleen a user's activities at the computer.
+;
+#X text 34 241 onKeyUp;
+#X text 34 222 onKeyDown;
+#X text 34 260 onKeyPress;
+#X text 21 291 hmmm...wouldn't it be great if Pd also gave us onChange
+\, onBlur \, onFocus \, onClick \, onDblClick \, onDragDrop \, onLoad
+\, onMouseDown \, onMouseOver \, onMouseOut \, onMouseMove \, onUnload...?
+;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 21 170 It's interesting to note that with these tools \, PD
+can mimic some of the functions in other languages - Javascript for
+example has:;
+#X text 8 2 [keyup] Reacing to User Input;
+#X restore 102 523 pd reacting_to_user_input;
+#X obj 472 3 keyname;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/keyname -text
+pdpedia: keyname;
+#X obj 103 167 keyname;
+#X symbolatom 142 195 10 0 0 0 - - -;
+#X floatatom 103 195 5 0 0 0 - - -;
+#X obj 142 221 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 155 167 When you type on the keyboard \, [keyname] sends data
+to Pd;
+#X text 100 115 [keyname] reports the (system dependent) names of "printing"
+keys of the keyboard. It captures both the "keydown" and "keyup" events.
+;
+#X text 168 373 - the left inlet produces a 1 when a key goes down
+\, and a zero when the key goes up.;
+#X obj 78 404 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 403 symbol;
+#X text 168 403 - the right outlet produces a symbol which represents
+the name of the key.;
+#X text 99 467 Caveat - this object only works if Pd actually gets
+the key events which can depend on the stacking order of windows and/or
+the pointer location. This is dependent on the system.;
+#X obj 275 572 pddp/pddplink all_about_hid.pd -text all_about_hid;
+#X text 100 573 for more on HIDs:;
+#N canvas 108 160 327 410 some_keyboard_fun 0;
+#X obj 52 75 loadbang;
+#X msg 23 16 bang;
+#X obj 33 158 qlist;
+#X floatatom 33 185 5 0 0 0 - - -;
+#X obj 218 30 r keyboard_fun;
+#X msg 52 105 read keyboard_fun.txt;
+#X msg 45 51 rewind;
+#X obj 218 112 symbol add2;
+#X obj 218 83 t b s;
+#X obj 218 138 pack s s;
+#X obj 218 164 route list;
+#X msg 47 245 set;
+#X msg 47 278;
+#X obj 218 57 symbol;
+#X text 71 17 Click here to start...;
+#X msg 62 131 tempo 0.8;
+#X obj 47 217 loadbang;
+#X connect 0 0 5 0;
+#X connect 0 0 15 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 13 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 1 9 1;
+#X connect 9 0 10 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 13 0 8 0;
+#X connect 15 0 2 0;
+#X connect 16 0 11 0;
+#X restore 102 549 pd some_keyboard_fun;
+#X text 11 23 get input and key name from the keyboard;
+#X text 168 342 - [keyname] gets input directly from the keyboard.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 16 0 18 0;
+#X connect 16 1 17 0;
+#X connect 17 0 19 0;
+#X connect 18 0 12 0;
diff --git a/doc/pddp/keyup-help.pd b/doc/pddp/keyup-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..02a93f91a207b99a67164fc774b506cd86700097
--- /dev/null
+++ b/doc/pddp/keyup-help.pd
@@ -0,0 +1,135 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header keyup 3 12 0 18
+-204280 -1 0;
+#X obj 0 218 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 245 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 145 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Dave Sabine \, July 11 \, 2003 Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION get input from the keyboard on key release
+;
+#X text 12 65 INLET_0 float;
+#X text 12 5 KEYWORDS control user_input;
+#X restore 500 597 pd META;
+#X obj 0 245 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 395 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 422 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 399 (none);
+#N canvas 107 446 428 145 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 52 42 keyname;
+#X text 19 72 Externals and other object libraries;
+#X obj 21 42 key;
+#X text 7 1 [keyup] Related Objects;
+#X obj 18 93 pddp/helplink Gem/gemkeyboard;
+#X obj 18 113 pddp/helplink Gem/gemkeyname;
+#X restore 102 597 pd Related_objects;
+#X text 98 253 float;
+#X obj 78 254 cnv 17 3 130 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 222 (none);
+#X text 98 361 Also note that key combinations \, such as SHIFT+7 produce
+a different result than SHIFT or 7 alone.;
+#X text 168 296 Some keys \, such as SHIFT or the F1-F12 series all
+produce a zero \, but we can see by the [bng] that the event is not
+ignored completely...but the numeric "ID" of the key is not captured
+successfully. (This may produce different results on different systems.)
+;
+#X obj 83 162 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 103 162 5 0 0 0 - - -;
+#N canvas 107 160 428 356 reacting_to_user_input 0;
+#X text 19 37 Most \, if not all \, programming environments provide
+us with tools to capture 'user initiated' events from the operating
+system. Keyboard input \, mouse clicks \, and mouse movements are the
+most common events in this 'user event' category.;
+#X text 19 103 Pd's [key] \, [keyup] \, and [keyname] are complimented
+by the externals such as [gemmouse] and [nimouse] to provide us with
+a full range of tools to gleen a user's activities at the computer.
+;
+#X text 33 240 onKeyUp;
+#X text 33 221 onKeyDown;
+#X text 33 259 onKeyPress;
+#X text 20 290 hmmm...wouldn't it be great if Pd also gave us onChange
+\, onBlur \, onFocus \, onClick \, onDblClick \, onDragDrop \, onLoad
+\, onMouseDown \, onMouseOver \, onMouseOut \, onMouseMove \, onUnload...?
+;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 20 169 It's interesting to note that with these tools \, PD
+can mimic some of the functions in other languages - Javascript for
+example has:;
+#X text 7 1 [keyup] Reacing to User Input;
+#X restore 102 525 pd reacting_to_user_input;
+#X obj 483 3 keyup;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/keyup -text
+pdpedia: keyup;
+#X text 100 83 [keyup] reports the (system dependent) numbers of "printing"
+keys of the keyboard.;
+#X obj 103 125 keyup;
+#X text 142 125 When you release a key \, [keyup] sends data to Pd
+;
+#X text 168 253 - the number at this outlets represents the numeric
+"ID" of a key on the computer's keyboard. This even occurs when the
+key is released. Only one event is captured at a time.;
+#X text 98 426 The [key] and [keyup] objects can mimic the functionality
+of the [noteon] and [noteoff] objects. A key combination such as SHIFT+7
+could be considered a 'chord'!;
+#X text 99 466 Caveat - this object only works if Pd actually gets
+the key events which can depend on the stacking order of windows and/or
+the pointer location. This is dependent on the system.;
+#X obj 276 572 pddp/pddplink all_about_hid.pd -text all_about_hid;
+#X text 101 573 for more on HIDs:;
+#N canvas 107 163 330 381 some_keyboard_fun 0;
+#X obj 52 75 loadbang;
+#X msg 23 16 bang;
+#X obj 33 158 qlist;
+#X floatatom 33 185 5 0 0 0 - - -;
+#X obj 218 30 r keyboard_fun;
+#X msg 52 105 read keyboard_fun.txt;
+#X msg 45 51 rewind;
+#X obj 218 112 symbol add2;
+#X obj 218 83 t b s;
+#X obj 218 138 pack s s;
+#X obj 218 164 route list;
+#X msg 47 245 set;
+#X msg 47 278;
+#X obj 218 57 symbol;
+#X text 71 17 Click here to start...;
+#X msg 62 131 tempo 0.8;
+#X obj 47 217 loadbang;
+#X connect 0 0 5 0;
+#X connect 0 0 15 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 4 0 13 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 1 9 1;
+#X connect 9 0 10 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 13 0 8 0;
+#X connect 15 0 2 0;
+#X connect 16 0 11 0;
+#X restore 102 550 pd some_keyboard_fun;
+#X text 11 23 get input from the keyboard on key release;
+#X text 168 222 - [keyup] gets input directly from the keyboard.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 20 0 14 0;
+#X connect 20 0 15 0;
diff --git a/doc/pddp/line-help.pd b/doc/pddp/line-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7317f92987eff576b4921619f742b7081e40c246
--- /dev/null
+++ b/doc/pddp/line-help.pd
@@ -0,0 +1,254 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header line 3 12 0 18 -204280
+-1 0;
+#X obj 0 267 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 364 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 45 DESCRIPTION ramp generator;
+#X text 12 65 INLET_0 float list stop;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS control time;
+#X restore 500 598 pd META;
+#X obj 0 375 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 439 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 498 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 59 376 428 230 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 line~;
+#X obj 62 43 vline~;
+#X text 8 2 [line] Related Objects;
+#X text 19 102 Externals;
+#X obj 19 142 pddp/helplink markex/tripleLine;
+#X obj 19 162 pddp/helplink iemlib/t3_line~;
+#X obj 19 182 pddp/helplink iemlib/fade~;
+#X obj 19 122 pddp/helplink maxlib/step;
+#X restore 101 598 pd Related_objects;
+#X obj 78 276 cnv 17 3 63 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 275 float;
+#X text 98 301 list;
+#X text 98 383 float;
+#X obj 78 384 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 347 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 346 float;
+#X obj 493 3 line;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/line -text
+pdpedia: line;
+#X obj 137 180 line;
+#X msg 137 87 1000 1000;
+#X floatatom 137 201 5 0 0 0 - - -;
+#X text 203 86 ramp up.;
+#X msg 146 110 0 1000;
+#X text 193 110 ramp down.;
+#X msg 158 154 stop;
+#X msg 154 133 42;
+#X text 180 134 jumps to this value immediately.;
+#X text 195 154 stops the current ramp.;
+#N canvas 106 115 428 446 continuous_ramps 0;
+#X text 19 98 In other words \, if [line] receives a message specifying
+some new target and time before reaching the previous target \, it
+takes off from its current value.;
+#X obj 26 247 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X msg 56 205 stop;
+#X msg 49 185 42;
+#X obj 23 226 line;
+#X msg 23 144 127 5000;
+#X msg 41 165 0 5000;
+#X text 16 271 Due to this unique behavior \, a common construct found
+in Pd patches includes the [pack] object as follows:;
+#X obj 30 392 line;
+#X floatatom 30 413 10 0 0 0 - - -;
+#X floatatom 30 306 5 0 0 0 - - -;
+#X obj 30 372 pack f 500;
+#X msg 41 325 50;
+#X msg 49 346 2000;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [line] Continuous Ramps;
+#X text 21 37 [line] does not schedule its incoming messages. What
+this means is that if you send [line] a new target value mid-way through
+a ramp \, a new ramp is immediately created to the new target value
+starting from the "current" value.;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X connect 8 0 9 0;
+#X connect 10 0 11 0;
+#X connect 11 0 8 0;
+#X connect 12 0 11 0;
+#X connect 13 0 11 0;
+#X restore 101 551 pd continuous_ramps;
+#N canvas 107 25 428 516 grain_rate_and_creation_arguments 0;
+#X text 21 39 The "grain rate" of [line] is the rate at which it will
+output its values. The faster the grain is \, the smoother the ramp
+will appear. While slower grain rates will produce a more disjunct
+ramp. Of course this setting will alter the amount of CPU that the
+[line] object will require. Higher rates require more computation.
+;
+#X text 22 145 This means simply that [line] will output a new value
+between its current value and your new value once every 20 milliseconds.
+;
+#X text 22 126 The default grain rate is 20 milliseconds.;
+#X text 19 193 [line]'s optional creation arguments can be used to
+reset the grain rate. However \, the grain rate cannot be reset dynamically.
+;
+#X text 21 248 First creation argument is the initial value: the starting
+point of the first ramp.;
+#X text 20 287 The second creation argument sets the grain rate. Observe
+the following two examples to see how the grain rate effects the output.
+;
+#X obj 33 403 line 0 5;
+#X obj 36 436 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X msg 136 332 127;
+#X msg 168 340 0;
+#X obj 135 368 pack f 5000;
+#X obj 203 436 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 200 403 line 0 500;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [line] Grain Rate;
+#X text 31 469 You can check the default grain rate in the subpatch
+below:;
+#N canvas 398 136 429 326 default_grain_rate 0;
+#X obj 22 87 line;
+#X obj 22 226 timer;
+#X obj 22 111 t b b;
+#X obj 49 137 spigot;
+#X obj 101 169 0;
+#X obj 22 193 spigot;
+#X obj 22 64 t a b;
+#X obj 65 87 1;
+#X obj 71 226 1;
+#X obj 22 251 print Pd's_default_grain_rate;
+#X msg 22 42 0 200;
+#X text 19 274 Here we assume the grain rate is less than 200 ms. For
+a more comprehensive test we could start with a time value of 1 ms
+and step up until the output ceases to increase.;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header empty 3 12 0 14
+-204280 -1 0;
+#X text 7 1 [line] Pd's Default Grain Rate;
+#X text 60 42 Click here to output pd's default grain rate to the console
+;
+#X connect 0 0 2 0;
+#X connect 1 0 9 0;
+#X connect 2 0 5 0;
+#X connect 2 1 3 0;
+#X connect 3 0 4 0;
+#X connect 3 0 1 1;
+#X connect 4 0 3 1;
+#X connect 4 0 5 1;
+#X connect 5 0 1 0;
+#X connect 5 0 8 0;
+#X connect 6 0 0 0;
+#X connect 6 1 7 0;
+#X connect 7 0 5 1;
+#X connect 8 0 3 1;
+#X connect 10 0 6 0;
+#X restore 34 491 pd default_grain_rate;
+#X connect 6 0 7 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 0;
+#X connect 10 0 6 0;
+#X connect 10 0 12 0;
+#X connect 12 0 11 0;
+#X restore 101 529 pd grain_rate_and_creation_arguments;
+#X text 11 23 ramp generator;
+#X text 98 325 stop;
+#X text 168 325 - stop the current ramp.;
+#X text 167 346 - time to reach the target value (in milliseconds).
+;
+#X text 168 275 - target value. This value is stored and used as the
+starting value for the next ramp.;
+#X text 168 301 - a (target \, time) pair is distributed between the
+two inlets.;
+#X text 168 474 - grain rate in milliseconds (default: 20 ms).;
+#X text 168 383 - [line] outputs a linear ramp \, reaching the target
+value within the time value specified by the right inlet and at a grain
+rate specified by the second creation argument (default 20 ms).;
+#N canvas 106 32 428 493 tips_on_using_line 0;
+#X text 20 39 [line]'s left inlet defines the "target" value. The right
+inlet defines the "time" value. The "target \, time" pair of numbers
+inform [line] to produce a numeric "ramp" from its current value (whatever
+that might be at any given moment) to the new value within the alloted
+time which is defined at the right inlet.;
+#X obj 25 242 line;
+#X msg 59 218 1000;
+#X msg 25 218 1000;
+#X obj 25 175 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 25 195 t b b;
+#X floatatom 25 264 5 0 0 0 - - -;
+#X obj 150 260 line;
+#X msg 150 236 1000;
+#X obj 150 216 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 150 282 5 0 0 0 - - -;
+#X text 20 309 If [line] receives a new target value without an accompanying
+"time" \, it simply jumps to the new value...as in the example above
+on the right. In the example above on the left \, you'll see that [line]
+will create a numeric ramp from 0 to 1000 over 1000 milliseconds. You
+should also note that if you click that [bng] again a second time \,
+nothing happens. This is because [line] is already at 1000 \, so sending
+it new instructions to ramp to 1000 is meaningless and has no effect.
+;
+#X text 20 425 Having said all of that \, let's just reiterate that
+it's important to send a "time" value to [line] before sending it a
+new "target" value...unless of course you WANT it to jump immediately
+to the new target.;
+#X text 149 182 While this does NOT work unless;
+#X text 149 196 you click "500" first.;
+#X msg 184 236 500;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [line] Tips;
+#X text 20 118 It is important to realize that [line] stores only the
+current value...it does not remember the defined "time" (duration of
+the ramp). Hence \, the example to the left works:;
+#X connect 1 0 6 0;
+#X connect 2 0 1 1;
+#X connect 3 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X connect 5 1 2 0;
+#X connect 7 0 10 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 15 0 7 1;
+#X restore 101 507 pd tips_on_using_line;
+#X text 80 459 1) float;
+#X text 80 474 2) float;
+#X text 168 459 - initial value \, i.e. \, the starting point of the
+first ramp.;
+#X obj 3 598 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 571 pddp/pddplink ../3.audio.examples/C03.zipper.noise.pd
+-text doc/3.audio.examples/C03.zipper.noise.pd;
+#X connect 17 0 19 0;
+#X connect 18 0 17 0;
+#X connect 21 0 17 0;
+#X connect 23 0 17 0;
+#X connect 24 0 17 0;
diff --git a/doc/pddp/line~-help.pd b/doc/pddp/line~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9a4dca639c93ecbdc7d9df539f338cf75dab9e1b
--- /dev/null
+++ b/doc/pddp/line~-help.pd
@@ -0,0 +1,107 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header line~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 271 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 245 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal time conversion;
+#X text 12 45 DESCRIPTION audio ramp generator;
+#X text 12 85 INLET_1 list;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 65 INLET_0 float list stop;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 452 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 489 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 516 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 493 (none);
+#N canvas 62 373 428 230 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 vline~;
+#X obj 82 43 line;
+#X text 8 2 [line~] Related Objects;
+#X text 20 100 Externals;
+#X obj 20 180 pddp/helplink markex/tripleLine;
+#X obj 20 120 pddp/helplink iemlib/t3_line~;
+#X obj 20 140 pddp/helplink iemlib/fade~;
+#X obj 20 160 pddp/helplink maxlib/step;
+#X restore 101 597 pd Related_objects;
+#X obj 78 280 cnv 17 3 90 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 279 float;
+#X text 98 305 list;
+#X obj 78 461 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 381 cnv 17 3 65 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 380 float;
+#X obj 478 3 line~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/line~ -text
+pdpedia: line~;
+#X obj 66 210 snapshot~;
+#X obj 66 164 line~;
+#X floatatom 66 233 0 0 0 0 - - -;
+#X obj 108 187 metro 100;
+#X msg 66 66 1 1000;
+#X text 121 65 a pair of numbers starts a ramp;
+#X msg 126 113 2;
+#X text 158 113 a single number jumps to value;
+#X msg 124 138 stop;
+#X text 167 137 "stop" message freezes line~ at its current value;
+#X msg 93 113 0;
+#X msg 76 88 0 5000;
+#X obj 108 164 loadbang;
+#X text 98 359 stop;
+#X text 98 460 signal;
+#X text 167 380 - stores a duration in milliseconds until the next
+target value is sent to the left inlet. Unlike most other objects in
+Pd \, the value is only stored until it is used with this target value
+to start the ramp-- after that point the right inlet is reset (to zero).
+;
+#X text 11 23 audio ramp generator;
+#X text 168 305 - [line~] takes a two-element list to start a new ramp.
+The first element specifies the target value \, and the second one
+sets the duration in milliseconds. (Lists with more than two elements
+will be truncated.);
+#X text 168 279 - a float to the left inlet of [line~] will cause the
+output to jump immediately to the target value.;
+#X text 168 359 - the stop message freezes [line~] at its current value.
+;
+#X text 168 460 - the outgoing signal is the linear ramp.;
+#X text 179 191 The [line~] object generates linear ramps whose levels
+and timing are determined by messages you send it. The messages may
+be a single target value (causing the output to jump to the target)
+or a target and a time in milliseconds (to start a new ramp).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 98 547 pddp/pddplink ../3.audio.examples/A03.line.pd/ -text
+doc/3.audio.examples/A03.line.pd;
+#X obj 98 562 pddp/pddplink ../3.audio.examples/A04.line2.pd/ -text
+doc/3.audio.examples/A04.line2.pd;
+#X text 98 521 More information about [line] can be found in the Pure
+Documentation folder doc/3.audio.examples:;
+#X obj 98 577 pddp/pddplink ../3.audio.examples/C05.sampler.oneshot.pd
+-text doc/3.audio.examples/C05.sampler.oneshot.pd;
+#X connect 17 0 19 0;
+#X connect 18 0 17 0;
+#X connect 20 0 17 0;
+#X connect 21 0 18 0;
+#X connect 23 0 18 0;
+#X connect 25 0 18 0;
+#X connect 27 0 18 0;
+#X connect 28 0 18 0;
+#X connect 29 0 20 0;
diff --git a/doc/pddp/list-help.pd b/doc/pddp/list-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ac2f6e3d5f942b209505f5fffb2220467ec889c2
--- /dev/null
+++ b/doc/pddp/list-help.pd
@@ -0,0 +1,676 @@
+#N canvas 398 77 555 619 10;
+#X obj 0 635 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header list 3 12 0 18 -204280
+-1 0;
+#X obj 0 144 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 244 494 344 META 0;
+#X text 12 90 LIBRARY internal;
+#X text 12 130 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 50 LICENSE SIBSD;
+#X text 12 110 AUTHOR Miller Puckette;
+#X text 12 170 HELP_PATCH_AUTHORS Updated for Pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 70 DESCRIPTION building and using variable-length messages
+;
+#X text 12 5 NAME list append list prepend list trim list split list
+length;
+#X text 12 30 KEYWORDS control storage needs_work list_op symbol_op
+;
+#X text 12 150 RELEASE_DATE 2005;
+#X restore 500 638 pd META;
+#X obj 0 237 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 288 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 546 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 92 536 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [list] Related Objects;
+#X obj 21 42 float;
+#X obj 61 42 symbol;
+#X obj 112 42 pack;
+#X obj 152 42 unpack;
+#X restore 102 639 pd Related_objects;
+#X obj 78 246 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 153 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 517 4 list;
+#N canvas 1 112 555 502 append 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header empty 3 12 0 14
+-204280 -1 0;
+#X obj 13 3 list append;
+#X text 18 24 append (concatenate) the second list to the first;
+#X obj 0 294 cnv 3 520 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 0 377 cnv 3 520 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 78 386 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 303 cnv 17 3 40 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 353 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 304 anything;
+#X text 98 354 anything;
+#X obj 0 421 cnv 3 520 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X text 80 456 n);
+#X text 98 471 float;
+#X text 80 440 1);
+#X text 170 440 - the symbol "append".;
+#X text 170 456 - an arbitrary number of additional floats or symbols
+may be specified to initialize the list stored at the right inlet.
+;
+#X obj 158 219 list append 1 2;
+#X floatatom 168 165 5 0 0 0 - - -;
+#X msg 158 140 1 2 3;
+#X msg 178 190 bang;
+#X msg 285 189 bang;
+#X obj 158 241 print append;
+#X msg 285 163 4 5 6 and 7;
+#X msg 285 80 4 5 6;
+#X msg 285 139 four 5 6;
+#X msg 285 110 list four 5 6;
+#X text 178 354 - all input is converted to a list and stored.;
+#X text 178 304 - all input is converted to a list. The list stored
+at the right inlet is appended to it \, and the resulting list is sent
+to the outlet.;
+#X text 98 387 list;
+#X text 168 387 - the output is always a message with the selector
+"list" (see subpatch "list_conversion" for more info).;
+#X text 98 440 symbol atom;
+#X text 98 456 symbol atom;
+#X connect 16 0 21 0;
+#X connect 17 0 16 0;
+#X connect 18 0 16 0;
+#X connect 19 0 16 0;
+#X connect 20 0 16 1;
+#X connect 22 0 16 1;
+#X connect 23 0 16 1;
+#X connect 24 0 16 1;
+#X connect 25 0 16 1;
+#X restore 102 365 pd append;
+#N canvas 89 83 428 592 about-lists 0;
+#X obj 22 567 print message;
+#X msg 22 380 list x.wav 44100;
+#X msg 22 538 read \$1 \$2;
+#X msg 22 409 set x.wav 44100;
+#X msg 39 509 set \, add2 read \, adddollar 1 \, adddollar 2;
+#X msg 22 439 x.wav 44100;
+#X obj 39 483 loadbang;
+#X text 127 486 reset message as it was;
+#X text 139 380 good;
+#X text 128 411 bad;
+#X text 94 439 ugly;
+#X msg 223 403 list 44100 x.wav;
+#X msg 236 428 44100 x.wav;
+#X obj 223 454 print number-first;
+#X text 217 375 these two are equivalent:;
+#X text 19 266 In the example below \, the top message sets \$1 to
+"x.wav" and \$2 to 44100 in the "read" message. The lower message box
+outputs the message "read x.wav 44100". The "set" message changes the
+content of the message box itself (click on the longer message box
+below to repair the damage.) The "ugly" message \, since it is neither
+"list" nor "set" \, gets interpreted in an arbitrary (and probably
+inappropriate!) way.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [list] About lists in Pd;
+#X text 19 37 Messages in Pd are somewhat artificially divided into
+two classes. First are data-holding messages (bang \, float \, symbol
+\, list) which are the primary way of communicating between objects.
+Second is "everything else" (you could call them out-of-band messages
+or metamessages) that describe changes in configuration \, read and
+write files \, quit Pd \, etc. These are provided so that complex objects
+don't need to have 100 separate inlets for every possible functionality.
+It's not clear whether this was a good design choice \, but it's entrenched.
+;
+#X text 19 170 The distinction becomes visible \, and ugly \, when
+the leading item in a data-holding message is a symbol. In this case
+\, to disambiguate it from the other sort \, the printed form of the
+message has a selector \, "list" or "symbol" prepended to it. Underneath
+\, there is always a selector in front of data messages \, but it is
+implied if the first data item is a number.;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 2 0;
+#X connect 6 0 4 0;
+#X connect 11 0 13 0;
+#X connect 12 0 13 0;
+#X restore 101 586 pd about-lists;
+#X text 11 23 building and using variable-length messages;
+#X text 80 307 1);
+#X text 80 514 n);
+#X text 180 365 append - append the second list to the first;
+#X text 180 409 split - split a list in two;
+#X text 180 387 prepend - prepend the second list to the first;
+#X text 180 453 length - output the number of items in a list;
+#X text 180 431 trim - trim the "list" selector off;
+#X obj 212 98 list;
+#X msg 233 68 rice;
+#X msg 212 46 beans;
+#X obj 212 120 print groceries;
+#X msg 276 68 cornbread;
+#X text 98 550 Here are some examples showing how to use these objects
+to compose and/or use variable length messages:;
+#N canvas 20 53 525 646 simple_sequencer 0;
+#X obj 23 173 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 232 176 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 227 154 clear;
+#X text 20 153 send;
+#X msg 71 175 250;
+#X msg 103 175 500;
+#X msg 136 175 750;
+#X msg 169 175 1000;
+#X obj 23 258 list append;
+#X obj 188 220 t l;
+#X obj 71 214 list prepend;
+#X obj 23 426 t l l;
+#X obj 74 426 print start;
+#X obj 129 257 print stored;
+#X obj 23 451 list split 1;
+#X obj 23 575 del;
+#X obj 23 607 print bang;
+#X obj 55 542 list append;
+#X msg 35 403 0 250 250 500;
+#X text 98 150 -- add --;
+#X text 37 20 example 1: simple rhythmic sequencer;
+#X text 29 53 The top part of this patch demonstrates building up a
+message from a variable number of elements provided sequentially. The
+"list prepend" object stores the list and \, each time a number arrives
+\, prepends the previous list to it.;
+#X text 216 237 "list prepend" to its own inlet.;
+#X text 213 220 "trigger list" is needed only to connect outlet of
+;
+#X text 254 258 printout shows the growing message.;
+#X text 47 279 "list append" stores the growing message which is output
+by the "send" button above. "list prepend" would have been equivalent.
+;
+#X text 165 403 <-- test message;
+#X text 39 354 The bottom part of the patch takes numbers off the beginning
+of the list \, one by one \, to use as delays.;
+#X text 190 426 printout shows the sequence as it starts.;
+#X text 169 543 The rest of the list is stored for next time.;
+#X obj 141 505 print done;
+#X text 150 450 Split off the first item. If there is none \, nothing
+comes out the first or second outlet \, but instead we get a "bang"
+from the third one.;
+#X text 64 575 After delay \, output a bang and recall the rest of
+the list.;
+#X connect 0 0 8 0;
+#X connect 1 0 10 1;
+#X connect 4 0 10 0;
+#X connect 5 0 10 0;
+#X connect 6 0 10 0;
+#X connect 7 0 10 0;
+#X connect 8 0 11 0;
+#X connect 9 0 10 1;
+#X connect 10 0 9 0;
+#X connect 10 0 8 1;
+#X connect 10 0 13 0;
+#X connect 11 0 14 0;
+#X connect 11 1 12 0;
+#X connect 14 0 15 0;
+#X connect 14 1 17 1;
+#X connect 14 2 30 0;
+#X connect 15 0 16 0;
+#X connect 15 0 17 0;
+#X connect 17 0 14 0;
+#X connect 18 0 11 0;
+#X restore 401 586 pd simple_sequencer;
+#N canvas 127 68 397 569 another_sequencer 0;
+#X obj 66 263 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 292 266 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 287 244 clear;
+#X text 63 243 send;
+#X obj 66 342 list append;
+#X obj 213 317 t l;
+#X obj 94 303 list prepend;
+#X obj 66 410 t l l;
+#X obj 121 410 print start;
+#X obj 171 340 print stored;
+#X obj 66 486 del;
+#X obj 105 486 list append;
+#X msg 94 264 250 57;
+#X msg 154 264 500 52;
+#X msg 215 264 750 55;
+#X obj 66 461 unpack;
+#X obj 66 435 list split 2;
+#X text 80 38 example 2: sequencer with pitch;
+#X text 147 242 -- add --;
+#X obj 185 438 print done;
+#X obj 115 517 print pitch;
+#X text 13 69 This example is a slight modification of example 1 showing
+how to build up lists with more than one item per iteration. We regard
+pairs of numbers as specifying a delay time and a pitch. Unlike the
+previous example \, the delay here is interpreted as teh delay until
+the next event \, not the delay since the previous one. This is done
+by taking the "pitch" output before the delay object (previously the
+"output" was taken from the delay object's output.);
+#X connect 0 0 4 0;
+#X connect 1 0 6 1;
+#X connect 4 0 7 0;
+#X connect 5 0 6 1;
+#X connect 6 0 5 0;
+#X connect 6 0 4 1;
+#X connect 6 0 9 0;
+#X connect 7 0 16 0;
+#X connect 7 1 8 0;
+#X connect 10 0 11 0;
+#X connect 11 0 16 0;
+#X connect 12 0 6 0;
+#X connect 13 0 6 0;
+#X connect 14 0 6 0;
+#X connect 15 0 10 0;
+#X connect 15 1 20 0;
+#X connect 16 0 15 0;
+#X connect 16 1 11 1;
+#X connect 16 2 19 0;
+#X restore 401 608 pd another_sequencer;
+#N canvas 48 176 447 426 serializer 0;
+#X obj 19 287 list split 1;
+#X obj 19 378 print;
+#X obj 19 204 until;
+#X obj 19 242 list append;
+#X obj 45 171 t b l;
+#X obj 149 287 bang;
+#X msg 45 148 1 2 3 4 a b c;
+#X text 34 21 example 3: serializing a message without delays;
+#X text 17 55 The "until" object can be used as shown to iterate through
+all the items of a list.;
+#X text 178 147 <- click to test;
+#X text 101 171 First store list \, then start the loop;
+#X text 88 199 "until" bangs its output until told to stop by a "bang"
+to its right inlet.;
+#X text 107 241 Store the remaining list.;
+#X text 184 286 third outlet of "split" tells us to stop.;
+#X text 37 318 Second outlet of "split" becomes the new list for "list
+append" above.;
+#X text 75 377 First outlet is the output.;
+#X connect 0 0 1 0;
+#X connect 0 1 3 1;
+#X connect 0 2 5 0;
+#X connect 2 0 3 0;
+#X connect 3 0 0 0;
+#X connect 4 0 2 0;
+#X connect 4 1 3 1;
+#X connect 5 0 2 1;
+#X connect 6 0 4 0;
+#X restore 241 608 pd serializer;
+#N canvas 101 244 428 350 lists_vs_non-lists 0;
+#X obj 23 290 list append 1 2;
+#X floatatom 23 120 5 0 0 0 - - -;
+#X msg 23 95 1 2 3;
+#X msg 23 68 list cis boom bah;
+#X msg 23 145 bang;
+#X msg 162 260 bang;
+#X obj 23 319 print append;
+#X msg 23 43 walk the dog;
+#X msg 162 210 list x y z;
+#X msg 161 184 go dog go;
+#X msg 160 234 4 5 6 and 7;
+#X text 119 43 non-list message converted to list;
+#X text 144 68 list starting with symbol;
+#X text 75 118 number is one-element list;
+#X text 75 95 numeric list;
+#X text 75 145 bang is zero-element list;
+#X text 226 184 same for right inlet...;
+#X text 235 233 (note: only the first item;
+#X text 238 252 need be a number to make this;
+#X text 238 270 a list.);
+#X text 121 290 <- creation args initialize the list to append;
+#X obj 2 2 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [list] Lists vs. Non-lists;
+#X connect 0 0 6 0;
+#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 connect 5 0 0 1;
+#X connect 7 0 0 0;
+#X connect 8 0 0 1;
+#X connect 9 0 0 1;
+#X connect 10 0 0 1;
+#X restore 101 608 pd lists_vs_non-lists;
+#N canvas 0 82 555 506 prepend 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header empty 3 12 0 14
+-204280 -1 0;
+#X obj 0 299 cnv 3 520 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 0 377 cnv 3 520 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 78 386 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 308 cnv 17 3 40 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 354 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 309 anything;
+#X text 98 355 anything;
+#X obj 0 421 cnv 3 520 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X text 80 456 n);
+#X text 98 471 float;
+#X text 80 440 1);
+#X text 170 456 - an arbitrary number of additional floats or symbols
+may be specified to initialize the list stored at the right inlet.
+;
+#X floatatom 198 160 5 0 0 0 - - -;
+#X msg 188 135 1 2 3;
+#X msg 208 185 bang;
+#X msg 315 184 bang;
+#X msg 315 158 4 5 6 and 7;
+#X msg 315 75 4 5 6;
+#X msg 315 134 four 5 6;
+#X msg 315 105 list four 5 6;
+#X text 178 355 - all input is converted to a list and stored.;
+#X text 18 24 prepend the second list to the first;
+#X obj 13 3 list prepend;
+#X obj 188 214 list prepend 1 2;
+#X obj 188 236 print prepend;
+#X text 178 309 - all input is converted to a list. The list stored
+at the right inlet is prepended to it \, and the resulting list is
+sent to the outlet.;
+#X text 170 440 - the symbol "prepend".;
+#X text 98 387 list;
+#X text 168 387 - the output is always a message with the selector
+"list" (see subpatch "list_conversion" for more info).;
+#X text 98 440 symbol atom;
+#X text 98 456 symbol atom;
+#X connect 13 0 24 0;
+#X connect 14 0 24 0;
+#X connect 15 0 24 0;
+#X connect 16 0 24 1;
+#X connect 17 0 24 1;
+#X connect 18 0 24 1;
+#X connect 19 0 24 1;
+#X connect 20 0 24 1;
+#X connect 24 0 25 0;
+#X restore 102 387 pd prepend;
+#N canvas 1 82 555 530 split 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header empty 3 12 0 14
+-204280 -1 0;
+#X obj 0 277 cnv 3 520 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 0 371 cnv 3 520 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 78 380 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 286 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 314 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 287 anything;
+#X obj 0 458 cnv 3 520 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X text 80 477 1);
+#X msg 200 145 bang;
+#X obj 159 173 list split 2;
+#X floatatom 262 148 3 0 5 0 - - -;
+#X msg 159 57 1 2;
+#X msg 124 57 1;
+#X text 156 228 first n;
+#X text 245 228 rest of list;
+#X text 337 228 shorter than n;
+#X text 18 24 cut a list into smaller ones;
+#X obj 13 3 list split;
+#X msg 173 79 one 2 3;
+#X msg 183 101 list one 2 3;
+#X msg 193 123 1 2 three;
+#X obj 159 211 print split0;
+#X obj 248 211 print split1;
+#X obj 340 211 print split2;
+#X text 178 287 - all input is converted to a list.;
+#X text 98 315 float;
+#X text 98 381 list;
+#X obj 78 403 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 404 list;
+#X obj 78 425 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 426 list;
+#X text 178 315 - split point. A value of n will send the first n elements
+to the left outlet \, and the rest of the list to the middle outlet.
+Incoming lists shorter than n are sent to the rightmost outlet.;
+#X text 168 381 - the first n elements of the incoming list.;
+#X text 168 404 - the remaining elements of the incoming list.;
+#X text 168 426 - if the incoming list has fewer than n elements \,
+it is sent in its entirety to the rightmost outlet.;
+#X text 170 477 - the symbol "split".;
+#X text 98 493 float;
+#X text 80 493 2);
+#X text 98 477 symbol atom;
+#X text 170 493 - (optional) an integer to initialize the split point.
+;
+#X connect 9 0 10 0;
+#X connect 10 0 22 0;
+#X connect 10 1 23 0;
+#X connect 10 2 24 0;
+#X connect 11 0 10 1;
+#X connect 12 0 10 0;
+#X connect 13 0 10 0;
+#X connect 19 0 10 0;
+#X connect 20 0 10 0;
+#X connect 21 0 10 0;
+#X restore 102 409 pd split;
+#N canvas 1 82 555 481 trim 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header empty 3 12 0 14
+-204280 -1 0;
+#X obj 0 330 cnv 3 520 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 0 385 cnv 3 520 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 78 394 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 339 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 340 anything;
+#X obj 0 429 cnv 3 520 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X text 80 448 1);
+#X msg 49 139 1 2 3;
+#X msg 49 90 list cis boom bah;
+#X msg 49 195 bang;
+#X msg 49 63 walk the dog;
+#X obj 49 276 list trim;
+#X obj 49 298 print trim;
+#X msg 49 222 1 x y;
+#X msg 49 248 x 1 y;
+#X msg 49 113 55;
+#X text 98 395 anything;
+#X text 170 448 - the symbol "trim".;
+#X obj 13 3 list trim;
+#X text 18 24 remove the list selector;
+#X text 128 230 The [list trim] object inputs lists (or makes lists
+out of incoming non-list messages) and outputs a message whose selector
+is the first item of the list \, and whose arguments \, if any \, are
+the remainder of the list. If the list has no items \, or if its first
+item is numeric \, the selector is "list" (which might print out as
+list \, float \, or bang.);
+#X text 98 448 symbol atom;
+#X text 178 340 - all input is converted to a list. A bang message
+is converted to an empty list. A symbol message like "symbol blah"
+is converted to "list blah".;
+#X text 134 63 non-list messages remain non-list messages;
+#X text 97 139 implicit list remains a list;
+#X msg 49 167 symbol x;
+#X text 86 195 becomes message "list" (interpreted by most objects
+as bang);
+#X text 166 90 "list" selector gets trimmed off;
+#X text 79 113 becomes "list 55" (interpreted by most objects as float)
+;
+#X text 112 167 "symbol" selector gets trimmed off.;
+#X text 168 395 - after the incoming message is converted to a list
+\, the "list" selector is removed and the message is output.;
+#X connect 8 0 12 0;
+#X connect 9 0 12 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 14 0 12 0;
+#X connect 15 0 12 0;
+#X connect 16 0 12 0;
+#X connect 26 0 12 0;
+#X restore 102 431 pd trim;
+#N canvas 2 128 555 490 length 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header empty 3 12 0 14
+-204280 -1 0;
+#X obj 0 374 cnv 3 520 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 0 411 cnv 3 520 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 78 420 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 383 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 384 anything;
+#X obj 0 448 cnv 3 520 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X text 80 467 1);
+#X obj 13 3 list length;
+#X msg 226 161 1 2 3;
+#X msg 226 112 list cis boom bah;
+#X msg 227 187 bang;
+#X msg 226 85 walk the dog;
+#X msg 227 209 1 x y;
+#X msg 226 235 x 1 y;
+#X msg 226 135 55;
+#X obj 201 263 list length;
+#X floatatom 201 289 5 0 0 0 - - -;
+#X text 18 24 number of elements in a list;
+#X text 98 421 float;
+#X text 170 467 - the symbol "length".;
+#X text 98 467 symbol atom;
+#X text 168 384 - any message type is accepted and converted to a list.
+;
+#X text 168 421 - [list length] outputs the number of elements in the
+list.;
+#X connect 9 0 16 0;
+#X connect 10 0 16 0;
+#X connect 11 0 16 0;
+#X connect 12 0 16 0;
+#X connect 13 0 16 0;
+#X connect 14 0 16 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X restore 102 453 pd length;
+#X text 98 307 symbol atom;
+#X text 98 322 float;
+#N canvas 51 146 428 419 list_conversion_in_Pd 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [list] Conversion;
+#X text 19 168 In brief:;
+#X text 19 188 "list" -> bang;
+#X text 19 208 "list 1" -> "float 1";
+#X text 19 228 "list hello" -> "symbol hello";
+#X text 19 37 Most objects in Pd handle zero- and one-element lists
+in the following way:;
+#X text 19 67 * an incoming zero-element list (i.e. \, a message consisting
+onf the selector "list") is treated as a bang.;
+#X text 19 97 * an incoming one-element list that contains a float
+is treated as a float.;
+#X obj 22 331 route list float;
+#X obj 22 304 list;
+#X obj 22 358 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 68 358 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X msg 22 277 12;
+#X text 55 277 implicit float-- same as "float 12";
+#X text 55 304 output as "list 12";
+#X floatatom 68 387 5 0 0 0 - - -;
+#X text 130 331 [route] converts "list 12" to "float 12";
+#X text 19 127 * an incoming one-element list that contains a symbol
+atom is treated as a symbol.;
+#X connect 9 0 11 0;
+#X connect 9 1 12 0;
+#X connect 9 1 16 0;
+#X connect 10 0 9 0;
+#X connect 13 0 10 0;
+#X restore 241 586 pd list_conversion_in_Pd;
+#X text 170 307 - (optional) if no creation argument is given \, or
+if the first creation argument is a number \, [list] will behave like
+[list append]. Otherwise \, one of the following symbols may be given
+as arguments (see subpatches for more info):;
+#X text 98 245 [list] family objects always output a list. See the
+"list_conversion_in_Pd" subpatch below for how lists are interpreted
+by other objects.;
+#X text 98 514 depending on what the first creation argument is \,
+other creation arguments may be specified.;
+#X text 98 154 See subpatches under the heading "arguments" for more
+details. With the exception of the right inlet of [list split] \, All
+[list] objects will convert incoming non-list messages to lists (e.g.
+\, "set 5" will become "list set 5"). A bang message is converted to
+an empty list (i.e. \, "list") \, and "symbol foo" is converted to
+"list foo".;
+#X obj 4 638 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 180 475 cat - build a list by accumulating elements;
+#N canvas 1 112 555 488 cat 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header empty 3 12 0 14
+-204280 -1 0;
+#X obj 0 304 cnv 3 520 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 0 387 cnv 3 520 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 78 396 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 313 cnv 17 3 40 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 363 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 314 anything;
+#X obj 0 431 cnv 3 520 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X text 80 450 1);
+#X floatatom 189 166 5 0 0 0 - - -;
+#X msg 179 143 1 2 3;
+#X msg 196 189 bang;
+#X msg 170 120 4 5 6 and 7;
+#X msg 128 51 4 5 6;
+#X msg 158 98 four 5 6;
+#X msg 144 74 list four 5 6;
+#X text 98 397 list;
+#X text 168 397 - the output is always a message with the selector
+"list" (see subpatch "list_conversion" for more info).;
+#X text 98 450 symbol atom;
+#X obj 13 3 list cat;
+#X text 18 24 append (concatenate) list to the previously entered list(s)
+;
+#X msg 203 225 clear;
+#X obj 158 271 print cat;
+#X obj 158 249 list cat;
+#X text 98 364 clear;
+#X text 178 364 - empties the stored list.;
+#X text 178 314 - all input is converted to a list. The list is appended
+to the list(s) previously entered in the left inlet \, and the resulting
+list is sent to the outlet.;
+#X text 170 450 - the symbol "cat".;
+#X connect 9 0 23 0;
+#X connect 10 0 23 0;
+#X connect 11 0 23 0;
+#X connect 12 0 23 0;
+#X connect 13 0 23 0;
+#X connect 14 0 23 0;
+#X connect 15 0 23 0;
+#X connect 21 0 23 1;
+#X connect 23 0 22 0;
+#X restore 102 475 pd cat;
+#X connect 21 0 24 0;
+#X connect 22 0 21 1;
+#X connect 23 0 21 0;
+#X connect 25 0 21 1;
diff --git a/doc/pddp/loadbang-help.pd b/doc/pddp/loadbang-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e65cdb66ccc86ba626e00b4198bcc1059a7e62db
--- /dev/null
+++ b/doc/pddp/loadbang-help.pd
@@ -0,0 +1,129 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header loadbang 3 12 0
+18 -204280 -1 0;
+#X obj 0 422 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 244 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Dave Sabine \, November 12 \, 2002
+Jonathan Wilkes revised the patch to conform to the PDDP template for
+Pd version 0.42.;
+#X text 12 45 DESCRIPTION send "bang" automatically when patch loads
+;
+#X text 12 65 OUTLET_0 bang;
+#X text 12 5 KEYWORDS control bang_op;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 450 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 492 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 520 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 495 (none);
+#N canvas 89 493 428 100 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 21 42 bang;
+#X obj 61 42 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 92 42 trigger;
+#X obj 160 42 initbang;
+#X text 7 1 [loadbang] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 459 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 loadbang;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/loadbang -text
+pdpedia: loadbang;
+#X obj 89 264 loadbang;
+#X obj 89 312 f 1;
+#X obj 132 312 f 4;
+#X obj 89 337 +;
+#X floatatom 89 361 5 0 0 0 - - -;
+#X obj 89 287 t b b;
+#X obj 87 122 loadbang;
+#X obj 87 147 metro 1000;
+#X obj 87 171 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 86 216 In this example \, [loadbang] was used to process a
+simple mathematic equation when this patch was loaded. In this case:
+1 + 4 = 5;
+#X text 86 86 In this example \, [loadbang] was used simply to start
+a process automatically when this patch was loaded.;
+#X text 98 426 (none);
+#X text 98 458 bang;
+#N canvas 96 135 428 388 More_Info 0;
+#X obj 15 149 print foo;
+#X obj 15 101 loadbang;
+#X text 13 177 As well \, the following [float]s were set with a group
+of numbers. Click the [bng] below to verify that the numbers were stored
+in the [float] objects.;
+#X obj 25 327 f;
+#X floatatom 25 352 2 0 0 0 - - -;
+#X obj 64 327 f;
+#X floatatom 64 352 2 0 0 0 - - -;
+#X obj 104 327 f;
+#X floatatom 103 352 2 0 0 0 - - -;
+#X obj 25 235 bng 15 250 50 0 empty empty Click_here_to_see_the_numbers_stored_in_the_float_objects.
+0 -6 0 8 -262144 -1 -1;
+#X obj 194 288 random 10;
+#X obj 103 289 random 10;
+#X text 14 30 The loadbang object will send a "bang" message when a
+canvas/patch loads and is used most often to 'initialize' or set default
+values in a patch. For example \, when you opened this patch \, the
+message below was immediately printed in the terminal window.;
+#X obj 103 255 loadbang;
+#X obj 287 289 random 10;
+#X msg 15 124 you have opened the [loadbang] help document;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [loadbang] More Info;
+#X connect 1 0 15 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 7 0 8 0;
+#X connect 9 0 3 0;
+#X connect 9 0 5 0;
+#X connect 9 0 7 0;
+#X connect 10 0 5 1;
+#X connect 11 0 3 1;
+#X connect 13 0 11 0;
+#X connect 13 0 10 0;
+#X connect 13 0 14 0;
+#X connect 14 0 7 1;
+#X connect 15 0 0 0;
+#X restore 102 529 pd More_Info;
+#X text 11 23 send "bang" automatically when patch loads;
+#X text 168 458 - a "bang" message is sent automatically when the containing
+patch is loaded.;
+#N canvas 100 356 428 191 Important_Note 0;
+#X text 49 159 c:/pd/pd.exe -noloadbang;
+#X text 19 37 Loadbangs are a useful tool to set initial values in
+a patch - however \, there are times when it might be necessary to
+debug a patch and "turn off" all the loadbang objects. This can be
+accomplished by opening Pd with the -noloadbang flag.;
+#X text 19 102 For example \, to suppress all loadbangs \, your command
+line might look something like this: (more info about Pd's command
+line can be found in Chapter 3.6 of the HTML documentation.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [loadbang] Important Note;
+#X restore 102 551 pd Important_Note;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 101 572 pddp/pddplink ../1.manual/x3.htm -text Pd Manual Chapter
+3.6 - doc/1.manual/x3.htm;
+#X connect 12 0 17 0;
+#X connect 13 0 15 0;
+#X connect 14 0 15 1;
+#X connect 15 0 16 0;
+#X connect 17 0 13 0;
+#X connect 17 1 14 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
diff --git a/doc/pddp/log-help.pd b/doc/pddp/log-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..88d4e6cf24511694e511ac8ebdbc14995a2b7c76
--- /dev/null
+++ b/doc/pddp/log-help.pd
@@ -0,0 +1,69 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header log 3 12 0 18 -204280
+-1 0;
+#X obj 0 439 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION natural logarithm of a number;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 504 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 541 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 545 (none);
+#N canvas 86 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 208 42 abs;
+#X obj 236 42 sqrt;
+#X obj 271 42 pow;
+#X obj 56 75 cos~;
+#X obj 88 75 osc~;
+#X obj 22 75 expr;
+#X obj 22 42 sin;
+#X obj 48 42 cos;
+#X obj 75 42 tan;
+#X obj 108 42 atan;
+#X obj 143 42 atan2;
+#X text 7 1 [log] Related Objects;
+#X obj 181 42 exp;
+#X restore 101 597 pd Related_objects;
+#X obj 78 448 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 447 float;
+#X text 98 467 list;
+#X text 98 512 float;
+#X obj 78 513 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 239 217 0 0 0 0 - - -;
+#X floatatom 239 160 0 0 0 0 - - -;
+#X text 94 274 [log] will output the natural logarithm (base E) of
+a number. The value of zero will produce "-1000" which represents "negative
+infinity".;
+#X obj 239 190 log;
+#X obj 493 3 log;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/log -text
+pdpedia: log;
+#X text 11 23 natural logarithm of a number;
+#X text 168 467 - a list will be truncated \, and the first element
+will be used as input.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 15 0 17 0;
+#X connect 17 0 14 0;
diff --git a/doc/pddp/loop~-help.pd b/doc/pddp/loop~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4415a8a2e0a8cf4103a2731a4c28c7f1b6f2065b
--- /dev/null
+++ b/doc/pddp/loop~-help.pd
@@ -0,0 +1,168 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header loop~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 343 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 243 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION phase generator for looping samplers;
+#X text 12 65 INLET_0 float signal bang set;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 85 INLET_1 signal float;
+#X text 12 125 OUTLET_1 signal;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 497 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 544 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 569 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 352 cnv 17 3 95 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 548 (none);
+#N canvas 81 440 428 149 Related_objects 0;
+#X obj 253 43 powtodb~;
+#X obj 23 102 mtof;
+#X obj 68 102 ftom;
+#X obj 111 102 dbtorms;
+#X obj 176 102 rmstodb;
+#X obj 242 102 dbtopow;
+#X obj 304 102 powtodb;
+#X text 20 79 Control objects for conversion:;
+#X obj 23 43 mtof~;
+#X obj 70 43 ftom~;
+#X obj 118 43 dbtorms~;
+#X obj 187 43 rmstodb~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [loop~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X text 98 351 signal;
+#X obj 78 504 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 504 signal;
+#X obj 481 3 loop~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/loop~ -text
+pdpedia: loop~;
+#X obj 78 456 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 379 float;
+#X text 98 407 bang;
+#X text 98 425 set;
+#X text 98 455 signal;
+#X text 98 475 float;
+#X text 11 23 phase generator for looping samplers;
+#X text 168 351 - signal input sets the transposition level (1 is normal
+\, 2 is up an octave \, etc.).;
+#X text 168 379 - a float sets the transposition level (1 is normal
+\, 2 is up an octave \, etc.).;
+#X text 168 407 - reset the phase to zero.;
+#X text 168 425 - the set message followed by a number sets the phase
+(e.g. \, "set 0.5").;
+#X text 168 455 - set the window size in samples.;
+#X text 168 475 - set the window size in samples.;
+#X floatatom 33 46 0 0 0 0 - - -;
+#X obj 270 210 print~;
+#X msg 270 180 bang;
+#X obj 33 171 loop~;
+#X floatatom 60 117 0 0 0 0 - - -;
+#X msg 47 93 bang;
+#X obj 199 210 print~;
+#X msg 199 180 bang;
+#X obj 32 210 *~;
+#X obj 32 321 dac~;
+#X obj 32 298 hip~ 5;
+#X obj 78 214 samphold~;
+#X obj 32 233 +~;
+#X floatatom 78 139 0 0 0 0 - - -;
+#X obj 78 162 *~ 1000;
+#X msg 39 70 set 0.5;
+#X text 96 69 set phase (0 to 1);
+#X text 96 94 reset phase to 0;
+#X text 96 116 right signal input is window size in samples;
+#X text 116 138 here's how to handle onsets;
+#X obj 32 277 *~;
+#X floatatom 158 244 0 0 0 0 - - -;
+#X obj 158 313 line~;
+#X obj 158 267 dbtorms;
+#X obj 158 290 pack 0 50;
+#X text 184 243 output level 0-100;
+#X text 203 159 print outputs;
+#X text 61 45 transposition (1 is normal \, 2 is up an octave \, etc)
+;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 150000 float 0;
+#X coords 0 1 150000 -1 100 75 1;
+#X restore 390 127 graph;
+#X obj 308 321 soundfiler;
+#N canvas 100 385 428 186 About_[loop~] 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [loop~] More info;
+#X text 20 108 You can send "bang" or "set" message to force the phase
+to zero--you should mute the output before doing so. This may be desirable
+if you've set a large window size but then want to decrease it without
+waiting for the next phase crossing.;
+#X text 20 38 [loop~] takes input signals to set a window size and
+transposition \, and outputs a phase and a sampled window size. The
+window size only changes at phase zero crossings and the phase output
+is adjusted so that changing window size doesn't change the transposition.
+;
+#X restore 102 575 pd About_[loop~];
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 78 524 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 524 signal;
+#X obj 32 256 tabread4~ \$0-array;
+#X msg 390 210 resize 150000;
+#X obj 390 232 s \$0-array;
+#X obj 308 235 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 308 255 f \$0;
+#X msg 308 277 read ../doc/sound/bell.aiff \$1-array;
+#X obj 338 235 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 338 255 f \$0;
+#X msg 318 299 read ../doc/sound/vocal.aiff \$1-array;
+#X connect 28 0 31 0;
+#X connect 30 0 29 0;
+#X connect 31 0 34 0;
+#X connect 31 0 36 0;
+#X connect 31 0 39 1;
+#X connect 31 1 29 0;
+#X connect 31 1 36 1;
+#X connect 32 0 31 1;
+#X connect 33 0 31 0;
+#X connect 35 0 34 0;
+#X connect 36 0 40 0;
+#X connect 38 0 37 0;
+#X connect 38 0 37 1;
+#X connect 39 0 40 1;
+#X connect 40 0 63 0;
+#X connect 41 0 42 0;
+#X connect 42 0 39 0;
+#X connect 43 0 31 0;
+#X connect 48 0 38 0;
+#X connect 49 0 51 0;
+#X connect 50 0 48 1;
+#X connect 51 0 52 0;
+#X connect 52 0 50 0;
+#X connect 63 0 48 0;
+#X connect 64 0 65 0;
+#X connect 66 0 67 0;
+#X connect 67 0 68 0;
+#X connect 68 0 57 0;
+#X connect 69 0 70 0;
+#X connect 70 0 71 0;
+#X connect 71 0 57 0;
diff --git a/doc/pddp/lop~-help.pd b/doc/pddp/lop~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f164e255d04df6d0f37e59e98e1da7a9c36c3be8
--- /dev/null
+++ b/doc/pddp/lop~-help.pd
@@ -0,0 +1,92 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header lop~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 381 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 245 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version-0.38. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION one-pole low pass filter;
+#X text 12 65 INLET_0 signal clear;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 488 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 390 cnv 17 3 37 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 94 426 428 166 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 69 43 bp~;
+#X obj 117 43 vcf~;
+#X text 22 81 Raw Filters;
+#X obj 73 108 rzero~;
+#X obj 195 108 cpole~;
+#X obj 24 108 rpole~;
+#X obj 122 108 rzero_rev~;
+#X obj 244 108 czero~;
+#X obj 293 108 czero_rev~;
+#X obj 22 43 hip~;
+#X text 8 2 [lop~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 98 389 signal;
+#X obj 78 497 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 497 signal;
+#X obj 147 240 env~;
+#X floatatom 147 263 0 0 0 0 - - -;
+#X floatatom 180 185 0 0 0 0 - - -;
+#X obj 88 240 env~;
+#X floatatom 88 262 0 0 0 0 - - -;
+#X floatatom 88 114 0 0 0 0 - - -;
+#X obj 88 137 osc~ 100;
+#X msg 147 161 clear;
+#X text 168 389 - incoming audio signal.;
+#X obj 78 432 cnv 17 3 45 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 431 float;
+#X text 98 449 list;
+#X text 98 409 clear;
+#X obj 490 3 lop~;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/lop~ -text
+pdpedia: lop~;
+#X text 133 112 <- scroll to change input frequency;
+#X obj 147 213 lop~ 5;
+#X text 84 291 Compare the strength of the original signal on the left
+with that of the filtered signal on the right.;
+#X text 11 23 one-pole low pass filter;
+#X text 168 544 - initial rolloff frequency.;
+#X text 168 409 - reinitialize internal state.;
+#X text 168 431 - cutoff frequency in Hz.;
+#X text 168 449 - a list to the right inlet is truncated \, and the
+first element is used as the cutoff frequency.;
+#X text 168 497 - output is the filtered audio signal.;
+#X text 80 544 1) float;
+#X text 191 240 [env~] gives the amplitude of the signal envelop in
+dB.;
+#X text 88 68 [lop~] is a one-pole low pass filter with a specified
+rolloff frequency.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 12 0 13 0;
+#X connect 14 0 28 1;
+#X connect 15 0 16 0;
+#X connect 17 0 18 0;
+#X connect 18 0 15 0;
+#X connect 18 0 28 0;
+#X connect 19 0 28 0;
+#X connect 28 0 12 0;
diff --git a/doc/pddp/lrshift~-help.pd b/doc/pddp/lrshift~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ff6ac47eb736c6218799ed0cbdd6fd07c195389c
--- /dev/null
+++ b/doc/pddp/lrshift~-help.pd
@@ -0,0 +1,84 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header lrshift~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 374 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd 0.31. Jonathan Wilkes
+revised the patch to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS signal block_oriented;
+#X text 12 45 DESCRIPTION shift signal vector elements left or right
+;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 411 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 496 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 110 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [lrshift~] Related Objects;
+#X obj 21 41 fft~;
+#X restore 101 597 pd Related_objects;
+#X obj 78 383 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 420 cnv 17 3 60 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 469 3 lrshift~;
+#X obj 441 20 pddp/pddplink http://wiki.puredata.info/en/lrshift~ -text
+pdpedia: lrshift~;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-shiftin 64 float 0;
+#X coords 0 1 63 0 100 70 1;
+#X restore 418 158 graph;
+#X msg 418 264 1 1;
+#X obj 418 241 loadbang;
+#X msg 270 275 bang;
+#X obj 246 301 print~;
+#X msg 187 276 bang;
+#X obj 163 302 print~;
+#X msg 94 265 bang;
+#X obj 74 302 print~;
+#X text 167 210 shift left;
+#X text 247 210 shift right;
+#X obj 163 250 lrshift~ 1;
+#X obj 246 249 lrshift~ -1;
+#X text 98 382 signal;
+#X text 98 419 signal;
+#X text 168 419 - acting at whatever vector size the window is running
+at \, lrshift~ shifts samples to the left (toward the beginning sample)
+or to the right. The argument gives the direction and the amount of
+the shift. The rightmost (or leftmost) samples are set to zero.;
+#X text 11 23 shift signal vector elements left or right;
+#X text 168 382 - an incoming signal.;
+#X text 80 514 1) float;
+#X text 168 514 - (integer) sets the direction and amount to shift
+the samples. Negative numbers shift samples the left \, and positive
+numbers shift to the right.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 73 182 tabreceive~ \$0-shiftin;
+#X obj 418 286 s \$0-shiftin;
+#X connect 13 0 35 0;
+#X connect 14 0 13 0;
+#X connect 15 0 16 0;
+#X connect 17 0 18 0;
+#X connect 19 0 20 0;
+#X connect 23 0 18 0;
+#X connect 24 0 16 0;
+#X connect 34 0 20 0;
+#X connect 34 0 23 0;
+#X connect 34 0 24 0;
diff --git a/doc/pddp/makefilename-help.pd b/doc/pddp/makefilename-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3a30c19c9152be7483b209513c8f70cbef7310ac
--- /dev/null
+++ b/doc/pddp/makefilename-help.pd
@@ -0,0 +1,363 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header makefilename 3 12
+0 18 -204280 -1 0;
+#X obj 0 179 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 252 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Dave Sabine \, Hans-Christoph Steiner.
+Jonathan Wilkes revised the patch to conform to the PDDP template for
+Pd version 0.42.;
+#X text 12 45 DESCRIPTION format a string with a variable field;
+#X text 12 65 INLET_0 float symbol;
+#X text 12 85 OUTLET_0 symbol;
+#X text 12 165 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS control conversion symbol_op;
+#X restore 500 597 pd META;
+#X obj 0 319 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 356 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 479 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 75 446 428 187 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [makefilename] Related Objects;
+#X obj 21 42 symbol;
+#X obj 71 42 int;
+#X obj 102 42 float;
+#X obj 152 42 openpanel;
+#X obj 19 96 pddp/helplink zexy/makesymbol;
+#X obj 19 116 pddp/helplink cyclone/sprintf;
+#X obj 19 136 pddp/helplink cxc/ascseq;
+#X text 19 74 Externals;
+#X restore 101 597 pd Related_objects;
+#X obj 78 188 cnv 17 3 120 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 187 float;
+#X obj 78 328 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 444 3 makefilename;
+#X obj 415 20 pddp/pddplink http://wiki.puredata.info/en/makefilename
+-text pdpedia: makefilename;
+#X floatatom 49 64 0 0 0 0 - - -;
+#X text 81 143 numbered filenames;
+#X symbolatom 49 122 0 0 0 0 - - -;
+#X obj 49 91 makefilename soundfile%d.aif;
+#X obj 304 102 symbol;
+#X msg 304 54 dave;
+#X msg 343 54 drums;
+#X msg 400 54 Pd;
+#X msg 437 55 cool;
+#X obj 304 126 makefilename %s_PD.aif;
+#X symbolatom 304 150 0 0 0 0 - - -;
+#X text 168 187 - if a number (integer) is sent to the inlet \, the
+argument should be written with a "%c" \, "%d" \, or "%X" which represents
+the location of the incoming variable number in the outgoing symbol.
+Floats will be converted to integers.;
+#X text 98 237 symbol;
+#X text 98 278 list;
+#X text 98 327 symbol;
+#X text 169 374 - this object generates symbols according to a format
+string (the argument) \, for use as a series of filenames \, table
+names \, etc. Variables for numbers can be specified by using "%s"
+\, "%c" \, "%d" \, or "%X" in the string (see subpatch below). For
+variable symbols \, use "%s". No checking is done. Each [makefilename]
+object can have only one variable.;
+#X text 168 237 - if a symbol is sent to the inlet \, the argument
+should be written with a "%s" which represents the location of the
+incoming variable symbol in the outgoing symbol.;
+#N canvas 74 23 428 594 More_Info 0;
+#X text 20 33 I believe that this object was developed first to allow
+PD to generate sequential file names - perhaps to be used in conjunction
+with [soundfiler] or [openpanel]. For example \, an audio loop recorder
+might generate a continuous series of sound files to be saved on a
+hard drive...like below:;
+#X obj 23 127 f;
+#X symbolatom 23 168 0 0 0 0 - - -;
+#X obj 52 127 + 1;
+#X obj 23 147 makefilename file-%d.aif;
+#X obj 23 104 bng 18 250 50 0 empty empty start 22 9 1 12 -90049 -1
+-1;
+#X symbolatom 61 358 0 0 0 0 - - -;
+#X obj 64 309 hsl 150 18 0 122 0 1 empty empty ASCII_range 2 9 1 12
+-262131 -1 -1 6800 0;
+#X floatatom 30 360 3 0 0 0 - - -;
+#X text 19 514 - only one printf pattern can be used at once;
+#X text 19 476 - This object does not provide advanced formatting and
+parsing abilities. For example \, you cannot use spaces or odd characters
+in the argument.;
+#X text 19 567 - non-printable ASCII characters show up as a little
+box.;
+#X symbolatom 264 358 0 0 0 0 - - -;
+#X obj 267 309 hsl 150 18 0 255 0 1 empty empty 0_to_FF 2 9 1 12 -262131
+-1 -1 5100 0;
+#X obj 264 338 makefilename hex=%X;
+#X floatatom 233 360 3 0 0 0 - - -;
+#X obj 61 338 makefilename ASCII=%c;
+#X text 29 381 Watch out! ASCII characters 123 and 125 (curly braces)
+lock up Pd. Also \, reserved characters that Pd uses show up with a
+backslash in front of them (comma \, semi-colon \, and backslash).
+;
+#X text 19 530 - currently \, floats are not supported via the printf
+%f pattern. You can only display the integer part of the float using
+%d or %X.;
+#X text 20 189 This file name could be used when saving the audio to
+disk.;
+#X text 20 251 The %c pattern allows you to convert ASCII numbers to
+the respective character. The %X converts the decimal number to hexadecimal.
+Both %c and %X only use integers. For floats \, everything to the right
+of the decimal is discarded.;
+#X obj 2 2 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [makefilename] Common Uses;
+#X obj 2 216 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 8 216 Conversions;
+#X obj 2 442 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 8 442 Limitations;
+#X connect 1 0 3 0;
+#X connect 1 0 4 0;
+#X connect 3 0 1 1;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 7 0 16 0;
+#X connect 7 0 8 0;
+#X connect 13 0 14 0;
+#X connect 13 0 15 0;
+#X connect 14 0 12 0;
+#X connect 16 0 6 0;
+#X restore 100 488 pd More_Info;
+#N canvas 105 144 428 318 all_possible_patterns 0;
+#X text 33 86 %c;
+#X text 110 86 character;
+#X text 33 106 %d or %i;
+#X text 110 106 signed decimal integer;
+#X text 33 126 %e;
+#X text 110 126 scientific notation using "e" character;
+#X text 33 146 %E;
+#X text 110 146 scientific notation using "e" character;
+#X text 33 166 %f;
+#X text 33 186 %o;
+#X text 110 186 signed octal;
+#X text 33 206 %s;
+#X text 110 206 symbol;
+#X text 33 226 %u;
+#X text 110 226 unsigned integer;
+#X text 33 246 %x;
+#X text 110 246 unsigned hexadecimal in lowercase;
+#X text 33 266 %X;
+#X text 110 266 unsigned hexadecimal in CAPS;
+#X text 33 286 %p;
+#X text 110 286 unsigned hexadecimal in lowercase preceeded by "0x"
+;
+#X text 20 37 This is a listing of all possible printf patterns used
+in Pd's [makefilename]:;
+#X text 110 166 decimal floating point (currently broken);
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [makefilename] All Possible Patterns;
+#X restore 100 456 pd all_possible_patterns;
+#N canvas 80 12 428 594 spaces_and_multiple_variables 0;
+#X obj 223 71 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 223 90 f;
+#X symbolatom 223 135 0 0 0 0 - - -;
+#X obj 256 90 + 1;
+#X obj 223 112 makefilename I_am_%d_years_old.;
+#X text 20 197 With careful planning \, multiple variables can be incorporated
+using a stack of [makefilename]s. In the example below \, let's assume
+that this tool is used to generate file names for an audio loop recorder
+which operates 24 hours per day \, every day.;
+#X obj 25 265 loadbang;
+#X obj 25 305 metro 200;
+#X obj 25 286 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 58 330 + 1;
+#X obj 153 369 route 0 1 2 3 4 5 6;
+#X obj 25 379 mod 24;
+#X floatatom 25 404 5 0 0 0 - - -;
+#X floatatom 25 354 0 0 0 0 - - -;
+#X obj 25 330 f;
+#X obj 47 430 sel 0;
+#X obj 162 289 f;
+#X obj 194 289 + 1;
+#X obj 162 314 mod 7;
+#X obj 162 342 pack f f;
+#X obj 168 518 makefilename Monday_%d.wav;
+#X symbolatom 29 568 0 0 0 0 - - -;
+#X obj 248 394 makefilename Saturday_%d.wav;
+#X obj 232 419 makefilename Friday_%d.wav;
+#X obj 234 346 t b f;
+#X obj 216 444 makefilename Thursday_%d.wav;
+#X obj 200 469 makefilename Wednesday_%d.wav;
+#X obj 184 494 makefilename Tuesday_%d.wav;
+#X obj 153 542 makefilename Sunday_%d.wav;
+#X text 65 402 hour of day;
+#X text 63 355 total hours;
+#X text 153 569 Crude...but effective.;
+#X obj 25 480 s dayHour;
+#X obj 47 455 s weekDay;
+#X obj 162 266 r weekDay;
+#X obj 234 320 r dayHour;
+#X text 228 291 loop through weekdays;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [makefilename] Spaces and Multiple Variables;
+#X symbolatom 22 115 0 0 0 0 - - -;
+#X obj 22 93 makefilename one%ctwo;
+#X msg 22 71 32;
+#X text 51 70 ascii character 32 (space);
+#X text 19 37 A symbol that includes a space will not be saved. An
+underscore will often produce a tolerable compromise.;
+#X obj 22 151 route symbol;
+#X obj 22 172 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 72 115 this symbol won't load;
+#X text 72 130 properly if saved.;
+#X text 41 171 but it's a valid symbol;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 1 0 4 0;
+#X connect 3 0 1 1;
+#X connect 4 0 2 0;
+#X connect 6 0 8 0;
+#X connect 7 0 14 0;
+#X connect 8 0 7 0;
+#X connect 9 0 14 1;
+#X connect 10 0 28 0;
+#X connect 10 1 20 0;
+#X connect 10 2 27 0;
+#X connect 10 3 26 0;
+#X connect 10 4 25 0;
+#X connect 10 5 23 0;
+#X connect 10 6 22 0;
+#X connect 11 0 12 0;
+#X connect 12 0 15 0;
+#X connect 12 0 32 0;
+#X connect 13 0 11 0;
+#X connect 14 0 9 0;
+#X connect 14 0 13 0;
+#X connect 15 0 33 0;
+#X connect 16 0 17 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 1;
+#X connect 18 0 19 0;
+#X connect 19 0 10 0;
+#X connect 20 0 21 0;
+#X connect 22 0 21 0;
+#X connect 23 0 21 0;
+#X connect 24 0 19 0;
+#X connect 24 1 19 1;
+#X connect 25 0 21 0;
+#X connect 26 0 21 0;
+#X connect 27 0 21 0;
+#X connect 28 0 21 0;
+#X connect 34 0 16 0;
+#X connect 35 0 24 0;
+#X connect 39 0 44 0;
+#X connect 40 0 39 0;
+#X connect 41 0 40 0;
+#X connect 44 0 45 0;
+#X restore 100 511 pd spaces_and_multiple_variables;
+#N canvas 58 29 463 530 help_with_interfaces 0;
+#X text 21 32 Building user interfaces in Pd is a difficult balance
+between usability and performance. Pd is not winning any awards for
+usability - let's face it: it's powerful \, it's cool \, and that's
+the way we like it. You're not here because you want a colourful \,
+bevelled interface...you want the raw power that object oriented languages
+provide mixed with a few of the conveniences that a graphic environment
+affords.;
+#X obj 6 221 cnv 15 450 300 empty empty empty 20 12 0 14 -261681 -66577
+0;
+#X obj 34 331 tgl 15 0 s_dsp empty DSP 18 7 0 8 -262144 -1 -1 0 1;
+#X obj 34 376 vsl 15 128 0 127 0 0 v_slider empty Volume 18 7 0 8 -262144
+-1 -1 0 1;
+#X obj 34 353 bng 15 250 50 0 b_panel empty Open_File 18 7 0 8 -262144
+-1 -1;
+#X obj 29 232 cnv 15 400 20 empty d_canvas DSP:OFF 20 12 0 8 -233017
+-66577 0;
+#X obj 29 254 cnv 15 400 20 empty f_canvas FILE_OPEN:/Users/hans/cvs/pure-data/doc/pddp/all_about_lists_vs_anythings.pd
+20 12 0 8 -233017 -66577 0;
+#X obj 29 276 cnv 15 400 20 empty v_canvas VOLUME:42/100 20 12 0 8
+-233017 -66577 0;
+#X text 176 313 The grey canvases above could;
+#X text 178 335 be used like "status bars" to;
+#X text 178 356 write relevant information to;
+#X text 175 412 [makefilename] helps to format;
+#X text 177 436 the information in a meaningful;
+#X text 178 457 way.;
+#X text 176 378 the screen.;
+#N canvas 57 187 430 328 look_inside 0;
+#X obj 199 14 r b_panel;
+#X obj 235 166 r v_slider;
+#X obj 36 236 s d_canvas;
+#X obj 199 114 s f_canvas;
+#X obj 235 263 s v_canvas;
+#X obj 36 80 sel 0;
+#X obj 71 152 symbol ON;
+#X obj 36 128 symbol OFF;
+#X obj 71 103 bang;
+#X msg 36 210 label \$1;
+#X obj 36 184 makefilename DSP:%s;
+#X obj 36 13 r s_dsp;
+#X msg 45 38 \; pd dsp \$1;
+#X obj 199 40 openpanel;
+#X obj 199 65 makefilename FILE_OPEN:%s;
+#X msg 199 90 label \$1;
+#X msg 235 240 label \$1;
+#X obj 235 192 expr ($f1/128)*100;
+#X obj 235 217 makefilename VOLUME:%d/100;
+#X connect 0 0 13 0;
+#X connect 1 0 17 0;
+#X connect 5 0 7 0;
+#X connect 5 1 8 0;
+#X connect 6 0 10 0;
+#X connect 7 0 10 0;
+#X connect 8 0 6 0;
+#X connect 9 0 2 0;
+#X connect 10 0 9 0;
+#X connect 11 0 5 0;
+#X connect 11 0 12 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 15 0 3 0;
+#X connect 16 0 4 0;
+#X connect 17 0 18 0;
+#X connect 18 0 16 0;
+#X restore 29 302 pd look_inside;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [makefilename] Help with Interfaces;
+#X text 21 137 However \, there are times when sacrifices must be made
+in the area of performance to provide users with on-screen reporting
+\, record keeping \, and sometimes even a few 'pleasantries'. Consider
+the following examples - but always weigh the pros and cons when incorporating
+these types of interfaces. Performance vs. Usability.;
+#X restore 100 534 pd help_with_interfaces;
+#X text 11 23 format a string with a variable field;
+#X text 168 278 - if the first element of the list matches the variable
+type used \, then the list will be truncated.;
+#X text 168 327 - the output of [makefilename] is always a symbol.
+;
+#X text 80 374 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 572 pddp/pddplink all_about_symbol_construction.pd;
+#X obj 98 554 pddp/pddplink ../1.manual/x3.htm -text Pd Manual Chapter
+3.6 - doc/1.manual/x3.htm;
+#X connect 13 0 16 0;
+#X connect 16 0 15 0;
+#X connect 17 0 22 0;
+#X connect 18 0 17 0;
+#X connect 19 0 17 0;
+#X connect 20 0 17 0;
+#X connect 21 0 17 0;
+#X connect 22 0 23 0;
diff --git a/doc/pddp/makenote-help.pd b/doc/pddp/makenote-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c3f025db695501ee9a7afb0b436db6f23ffda283
--- /dev/null
+++ b/doc/pddp/makenote-help.pd
@@ -0,0 +1,129 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header makenote 3 12 0
+18 -204280 -1 0;
+#X obj 0 281 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 246 494 367 META 0;
+#X text 12 175 LIBRARY internal;
+#X text 12 215 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 235 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 195 AUTHOR Miller Puckette;
+#X text 12 255 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 75 INLET_0 float list;
+#X text 12 95 INLET_1 float;
+#X text 12 115 INLET_2 float;
+#X text 12 135 OUTLET_0 float;
+#X text 12 155 OUTLET_1 float;
+#X text 12 45 DESCRIPTION send note-on messages and schedule note-off
+for later;
+#X restore 500 597 pd META;
+#X obj 0 443 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 508 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 108 179 428 410 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [makenote] Related Objects;
+#X obj 74 80 ctlin;
+#X obj 217 80 pgmin;
+#X obj 24 80 bendin;
+#X obj 79 107 touchin;
+#X obj 261 80 polytouchin;
+#X obj 118 80 midiin;
+#X obj 23 107 sysexin;
+#X obj 179 167 noteout;
+#X obj 76 167 ctlout;
+#X obj 24 167 bendout;
+#X obj 366 167 touchout;
+#X obj 280 167 polytouchout;
+#X obj 123 167 midiout;
+#X obj 231 167 pgmout;
+#X obj 24 221 makenote;
+#X text 21 198 MIDI note construction:;
+#X text 21 140 MIDI output:;
+#X text 21 57 MIDI input:;
+#X obj 184 221 stripnote;
+#X obj 168 80 notein;
+#X text 181 198 MIDI note deconstruction:;
+#X obj 24 33 stripnote;
+#X text 21 265 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 20 344 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 21 246 Externals;
+#X obj 21 295 pddp/helplink maxlib/pitch;
+#X obj 21 310 pddp/helplink maxlib/score;
+#X obj 21 325 pddp/helplink maxlib/chord;
+#X obj 21 360 pddp/helplink cyclone/midiformat;
+#X obj 21 375 pddp/helplink cyclone/midiparse;
+#X obj 21 390 pddp/helplink cyclone/midiflush;
+#X restore 101 597 pd Related_objects;
+#X obj 78 290 cnv 17 3 95 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 289 float;
+#X text 98 329 list;
+#X text 98 451 float;
+#X obj 78 452 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 391 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 390 float;
+#X obj 470 3 makenote;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/makenote -text
+pdpedia: makenote;
+#X text 80 59 Makenote makes MIDI-style note-on/note-off pairs \, which
+you can use for MIDI output or to drive note-like processes within
+Pd.;
+#X floatatom 276 163 0 0 0 0 - - -;
+#X floatatom 276 142 0 0 0 0 - - -;
+#X msg 194 119 60;
+#X obj 183 218 print x1;
+#X obj 276 218 print x2;
+#X floatatom 183 97 0 0 0 0 - - -;
+#X msg 234 123 60.5;
+#X text 302 142 "velocity";
+#X text 311 166 duration in milliseconds;
+#X obj 183 191 makenote 3.2 500;
+#X text 168 289 - numbers to the left inlet are "pitches" (MIDI pitch
+numbers) which may be integers or floating point numbers (for microtonal
+pitches).;
+#X msg 130 121 12 2;
+#X text 11 23 send note-on messages and schedule note-off for later
+;
+#X text 168 329 - a list with three elements (pitch \, velocity \,
+duration) will be distributed to the three inlets. You can also send
+a two-element list to use the last duration supplied to [makenote].
+Lists with more than three elements are truncated.;
+#X obj 78 415 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 414 float;
+#X text 158 544 - (optional) initial duration.;
+#X text 158 529 - (optional) initial velocity.;
+#X text 98 474 float;
+#X obj 78 475 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 168 474 - velocity (in milliseconds). After the specified duration
+\, a zero is output.;
+#X text 167 390 - velocity.;
+#X text 167 414 - duration (in milliseconds).;
+#X text 80 529 1) float;
+#X text 80 544 2) float;
+#X text 168 451 - pitch. (It is output again after the specified duration.)
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 18 0 27 2;
+#X connect 19 0 27 1;
+#X connect 20 0 27 0;
+#X connect 23 0 27 0;
+#X connect 24 0 27 0;
+#X connect 27 0 21 0;
+#X connect 27 1 22 0;
+#X connect 29 0 27 0;
diff --git a/doc/pddp/math-help.pd b/doc/pddp/math-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2507d01b6b947cde68b43c0022f5ba626caf5fac
--- /dev/null
+++ b/doc/pddp/math-help.pd
@@ -0,0 +1,101 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (math_functions)
+3 12 0 18 -204280 -1 0;
+#X obj 0 325 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Revised by Jonathan Wilkes to conform to the PDDP template.;
+#X text 12 65 DESCRIPTION higher math in Pd;
+#X text 12 5 NAME sin cos tan atan atan2 exp log abs sqrt pow;
+#X text 12 145 RELEASE_DATE 1997;
+#X text 12 25 KEYWORDS control trigonometry;
+#X restore 500 597 pd META;
+#X obj 0 448 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 484 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 532 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 (math) Related Objects;
+#X obj 22 42 osc~;
+#X obj 58 42 cos~;
+#X obj 96 42 exp~;
+#X obj 134 42 log~;
+#X obj 172 42 abs~;
+#X obj 210 42 sqrt~;
+#X obj 254 42 pow~;
+#X restore 102 598 pd Related_objects;
+#X obj 78 334 cnv 17 3 60 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 333 float;
+#X text 98 352 list;
+#X text 98 456 float;
+#X obj 78 457 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 11 23 higher math in Pd;
+#X obj 252 3 sin;
+#X obj 278 3 cos;
+#X obj 304 3 tan;
+#X obj 331 3 atan;
+#X obj 364 3 atan2;
+#X obj 404 3 exp;
+#X obj 432 3 log;
+#X obj 459 3 abs;
+#X obj 487 3 sqrt;
+#X obj 522 3 pow;
+#X obj 464 20 pddp/pddplink http://wiki.puredata.info/en/math -text
+pdpedia: math;
+#X text 123 139 For individual help patches \, follow the links below:
+;
+#X obj 252 87 sin;
+#X floatatom 252 61 5 0 0 0 - - -;
+#X floatatom 252 114 5 0 0 0 - - -;
+#X text 168 333 - the incoming value;
+#X text 168 352 - a list will be truncated.;
+#X obj 124 171 sin;
+#X obj 124 201 cos;
+#X obj 124 231 tan;
+#X obj 124 261 atan;
+#X obj 124 291 atan2;
+#X obj 314 171 exp;
+#X obj 314 201 log;
+#X obj 314 231 abs;
+#X obj 314 261 sqrt;
+#X obj 314 291 pow;
+#X obj 169 171 pddp/pddplink sin-help.pd;
+#X obj 169 201 pddp/pddplink cos-help.pd;
+#X obj 169 231 pddp/pddplink tan-help.pd;
+#X obj 169 261 pddp/pddplink atan-help.pd;
+#X obj 169 291 pddp/pddplink atan2-help.pd;
+#X obj 359 171 pddp/pddplink exp-help.pd;
+#X obj 359 201 pddp/pddplink log-help.pd;
+#X obj 359 231 pddp/pddplink abs-help.pd;
+#X obj 359 261 pddp/pddplink sqrt-help.pd;
+#X obj 359 291 pddp/pddplink pow-help.pd;
+#X text 168 456 - the outgoing value.;
+#X text 98 488 The [pow] object accepts one float argument to initialize
+the right inlet. All other math functions listed here take no arguments.
+;
+#X text 217 551 - binary arithmetic operators;
+#X obj 98 551 pddp/pddplink operators-help.pd;
+#X text 217 571 - relational and logical operators;
+#X obj 98 571 pddp/pddplink otherbinops-help.pd;
+#X text 98 369 (The [pow] object takes a bang \, which will output
+the previous value.);
+#X text 97 403 (Note: The [atan2] and [pow] objects have a right inlet.
+See their respective help patches (links above) for more info.);
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 26 0 28 0;
+#X connect 27 0 26 0;
diff --git a/doc/pddp/max-help.pd b/doc/pddp/max-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0b1d0434d49f5042bc43db9e74b0a81199dc321f
--- /dev/null
+++ b/doc/pddp/max-help.pd
@@ -0,0 +1,77 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header max 3 12 0 18 -204280
+-1 0;
+#X obj 0 364 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 368 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION choose the greater of two values;
+#X text 12 65 INLET_0 float list bang;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 482 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 524 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 94 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 42 min;
+#X text 8 3 [max] Related Objects;
+#X obj 63 42 clip;
+#X restore 102 597 pd Related_objects;
+#X obj 78 373 cnv 17 3 70 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 426 list;
+#X text 98 490 float;
+#X obj 78 491 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 454 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 453 float;
+#X text 78 544 1) float;
+#X text 98 372 bang;
+#X text 98 397 float;
+#X text 168 544 - initializes the value of the right inlet.;
+#X floatatom 186 168 5 0 0 0 - - -;
+#X floatatom 186 222 5 0 0 0 - - -;
+#X floatatom 228 168 5 0 0 0 - - -;
+#X floatatom 316 168 5 0 0 0 - - -;
+#X floatatom 316 223 5 0 0 0 - - -;
+#X text 11 23 choose the greater of two values;
+#X obj 497 3 max;
+#X obj 469 20 pddp/pddplink http://wiki.puredata.info/en/max -text
+pdpedia: max;
+#X obj 159 168 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 168 372 - output the last value.;
+#X obj 186 195 max;
+#X obj 316 195 max 5;
+#X text 168 397 - the incoming value is output if it is greater than
+the value at the right inlet.;
+#X text 168 424 - a list will be distributed to the inlets.;
+#X text 168 453 - a float to the right inlet is stored.;
+#X text 168 490 - the two values at each inlet are compared \, and
+the greater value is output.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 18 0 28 0;
+#X connect 20 0 28 1;
+#X connect 21 0 29 0;
+#X connect 26 0 28 0;
+#X connect 28 0 19 0;
+#X connect 29 0 22 0;
diff --git a/doc/pddp/message-help.pd b/doc/pddp/message-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e979d2a655c5250f7ffbd6d5b89ff6fdb30916bc
--- /dev/null
+++ b/doc/pddp/message-help.pd
@@ -0,0 +1,265 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header message 3 12 0 18
+-204280 -1 0;
+#X obj 0 189 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 45 260 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 35 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.39. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 75 INLET_0 anything set add add2 addcomma addsemi adddollar
+adddollsym;
+#X text 12 105 OUTLET_0 anything;
+#X text 12 55 DESCRIPTION clickable message box;
+#X text 12 5 KEYWORDS control GUI nonlocal symbol_op list_op anything_op
+bang_op;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 334 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 385 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 555 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 98 489 428 109 Related_objects 0;
+#X obj 116 43 list;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X msg 12 3;
+#X text 40 2 Related Objects;
+#X obj 22 43 symbol;
+#X obj 72 43 float;
+#X restore 102 597 pd Related_objects;
+#X obj 78 198 cnv 17 3 127 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 343 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X msg 512 3;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/message -text
+pdpedia: message;
+#X msg 101 141 walk the dog;
+#X obj 101 164 print;
+#N canvas 85 15 428 600 dollarsign_variables 0;
+#X obj 23 156 print;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X msg 12 3;
+#X text 40 2 Dollarsign Variables in Message Boxes;
+#X text 20 38 You can use "dollarsign variables" to make variable messages.
+Just use a dollarsign followed by a number-- "\$1" \, "\$2" \, etc.
+The numbers (starting from one) specify which element of the incoming
+message should replace the variable in the outgoing message.;
+#X msg 23 131 pitch \$3;
+#X text 115 106 a list with three numbers;
+#X msg 23 106 list 24 48 72;
+#X text 83 131 replace "\$3" with the third element;
+#X text 84 145 of the incoming message ("72");
+#X msg 23 236 24 48 72;
+#X text 83 236 implicit list with three numbers;
+#X msg 23 259 pitch \$3;
+#X obj 23 281 print;
+#X text 83 259 third element is still "72";
+#X text 20 303 It's important to note that you can't access the selector
+of the message using the dollarsign variables. (In the patch above
+\, "list" is the selector \, "24" is the first element \, and so on.)
+Keep this in mind when using custom selectors \, as in the following:
+;
+#X msg 23 373 melody 67 67 67 63;
+#X text 153 374 In this message \, "melody" is the selector \,;
+#X text 153 389 and there are four elements (not five).;
+#X msg 23 407 pitch \$4;
+#X obj 23 490 print;
+#X text 85 407 replace "\$4" with the fourth element ("63");
+#X msg 41 459 pitch \$5;
+#X msg 41 433 melody 65 65 65 62;
+#X text 163 438 this will output an error--;
+#X text 163 452 there is no 5th element!;
+#X text 20 180 Remember that the selectors "list" and "float" can be
+omitted when the first atom in a message is a float. For example \,
+the following still works exactly as the patch above:;
+#X text 21 514 Multiple dollarsign variables may be used together:
+;
+#X obj 25 576 print;
+#X msg 25 533 22 8 1791;
+#X msg 25 555 \$1-\$2-\$3.wav;
+#X connect 5 0 0 0;
+#X connect 7 0 5 0;
+#X connect 10 0 12 0;
+#X connect 12 0 13 0;
+#X connect 16 0 19 0;
+#X connect 19 0 20 0;
+#X connect 22 0 20 0;
+#X connect 23 0 22 0;
+#X connect 29 0 30 0;
+#X connect 30 0 28 0;
+#X restore 171 457 pd dollarsign_variables;
+#X text 11 23 clickable message box;
+#X text 98 197 bang;
+#X text 98 211 float;
+#X text 98 225 symbol;
+#X text 98 239 pointer;
+#X text 98 254 anything;
+#X text 168 197 - these message types will cause the message box to
+send its message as output.;
+#N canvas 50 89 428 405 messages_for_changing_the_content_of_a_message_box
+0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X msg 12 3;
+#X text 40 2 Changing Messages;
+#X msg 23 76 set dog;
+#X msg 43 150 add monkey;
+#X msg 48 195 add2 bird;
+#X msg 37 124 set;
+#X msg 31 99 set 1 2 3 skidoo;
+#X text 71 124 "set" with no arguments clears it;
+#X text 85 77 "set" to set contents (numbers and/or symbols);
+#X msg 52 229 addcomma;
+#X msg 56 255 addsemi;
+#X msg 60 312 adddollsym 4-foo;
+#X msg 59 282 adddollar 3;
+#X text 118 229 add a comma;
+#X text 118 254 add a semicolon;
+#X text 137 282 add a dollar-sign argument;
+#X text 167 312 add a dollar-sign-plus-symbol argument;
+#X text 20 37 The following messages may be used to change contents
+of messages boxes:;
+#X text 118 165 plus a terminating semicolon;
+#X text 117 151 "add" to add numbers and/or symbols \,;
+#X text 118 209 the terminating semicolon;
+#X text 117 195 "add2" to add contents without;
+#X msg 23 357;
+#X connect 3 0 23 0;
+#X connect 4 0 23 0;
+#X connect 5 0 23 0;
+#X connect 6 0 23 0;
+#X connect 7 0 23 0;
+#X connect 10 0 23 0;
+#X connect 11 0 23 0;
+#X connect 12 0 23 0;
+#X connect 13 0 23 0;
+#X restore 101 308 pd messages_for_changing_the_content_of_a_message_box
+;
+#X text 98 342 anything;
+#X text 168 342 - a message box will output its message (replacing
+any dollar-sign variables with the relevant elements of the incoming
+message).;
+#X text 100 476 comma;
+#X text 100 513 semicolon;
+#N canvas 88 49 428 453 Using_Commas_in_Message_Boxes 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X msg 12 3;
+#X text 40 2 About Commas and Semicolons;
+#X obj 23 136 list length;
+#X floatatom 23 164 5 0 0 3 No_of_atoms - -;
+#X obj 23 94 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 23 114 list append one \, 3;
+#X text 141 115 This list actually contains three atoms:;
+#X text 141 135 1) The symbol "one";
+#X text 141 165 3) The float "3";
+#X text 20 37 Even though they are not be separated by whitespace \,
+semicolons and commas are actually atoms in Pd-- just like float- and
+symbol-atoms. You can see this clearly in the example below:;
+#X text 43 92 <- Click to test;
+#X msg 22 281 Because I do not hope to turn again \, Because I do not
+hope;
+#X obj 22 303 print from_Ash_Wednesday;
+#X text 20 210 In message boxes \, commas and semicolons are used to
+separate one message from another. For example \, there are two messages
+in the message box below. Each is sent separately to the [print] object
+(in the order they were written):;
+#X msg 23 376 1 \, 2 \, 3;
+#X obj 23 398 + 10;
+#X obj 23 422 print sum;
+#X text 20 329 Notice that the comma itself is not included as part
+of the message-- it simply tells Pd where one message ends \, and the
+next begins.;
+#X text 141 150 2) A comma;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 12 0 13 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X restore 172 495 pd Using_Commas_in_Message_Boxes;
+#N canvas 82 29 428 495 Using_Semicolons_In_Message_Boxes 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X msg 12 3;
+#X obj 24 362 print;
+#X obj 228 291 receive my-receiver-name;
+#X floatatom 228 315 0 0 0 0 - - -;
+#X floatatom 227 362 0 0 0 0 - - -;
+#X obj 227 338 receive another-receiver;
+#X obj 23 191 receive msg2r;
+#X obj 23 217 print after_semi;
+#X obj 23 159 print before_semi;
+#X msg 24 291 \; my-receiver-name 858 \; another-receiver -45;
+#X text 40 2 About Semicolons and Nonlocal Sends;
+#X msg 23 118 this msg comes out the outlet \; msg2r this msg comes
+out of [receive msg2r];
+#X msg 201 441 \; pd dsp 1;
+#X msg 25 441 dsp 1;
+#X obj 25 468 s dsp;
+#X text 85 451 is the same as;
+#X text 22 396 For messages to a single named-object \, however \,
+it is probably clearer to use a message box and a [send] object \,
+but you can judge for yourself:;
+#X text 20 37 Like commas \, semicolons may be used to send multiple
+messages from a single message box. When using a semicolon \, however
+\, the message following the semicolon is re-routed to a named object
+\, such as [receive] \, an array \, or a canvas. The named object is
+specified by the selector of the message ("msg2r" in this example):
+;
+#X text 22 246 To send messages to named objects without first sending
+a message to the outlet \, put an initial semicolon in the message
+box:;
+#X connect 3 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 10 0 2 0;
+#X connect 12 0 9 0;
+#X connect 14 0 15 0;
+#X restore 172 532 pd Using_Semicolons_In_Message_Boxes;
+#X text 168 254 - other messages will cause the message box to send
+its message as output \, except for the "special messages" that are
+used to change the content of a message box. Click the subpatch below
+to view these "special messages":;
+#X text 168 476 - a comma may be used to separate multiple messages:
+;
+#X text 178 513 - a semicolon may be used to send messages nonlocally:
+;
+#X text 168 402 - message boxes can contain any number of float and/or
+symbol arguments. Message boxes may also contain special "dollar-sign
+variables" \, used to grab data from an incoming message. Click the
+subpatch below for more info:;
+#X text 98 97 Clicking on a message also sends it \, so you can use
+messsage boxes as push buttons. For instance \, click here while watching
+the printout window:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 100 559 pddp/pddplink all_about_messages.pd -text all_about_messages
+;
+#X obj 100 574 pddp/pddplink all_about_symbol_construction.pd -text
+all_about_symbol_construction;
+#X obj 286 559 pddp/pddplink ../2.control.examples/04.messages.pd -text
+doc/2.control.examples/04.messages.pd;
+#X obj 286 574 pddp/pddplink ../2.control.examples/10.more.messages.pd
+-text doc/2.control.examples/10.more.messages.pd;
+#X text 329 2 To create \, click <Control-2>;
+#X text 98 57 Message boxes hold one or more messages. Anytime the
+message box receives any message at all \, the messages in the box
+are all sent to their destinations.;
+#X text 188 141 <- message box;
+#X text 141 164 <- object box (notice the different border);
+#X text 81 402 n) symbol atom;
+#X text 100 417 float;
+#X connect 12 0 13 0;
diff --git a/doc/pddp/metro-help.pd b/doc/pddp/metro-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2ed7b2532b7f049a0c5840077635b1e2e0b0b453
--- /dev/null
+++ b/doc/pddp/metro-help.pd
@@ -0,0 +1,98 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header metro 3 12 0 18
+-204280 -1 0;
+#X obj 0 327 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 507 361 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed to build comprehensive documentation for Pd. Jonathan Wilkes
+revised the patch to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION send a bang periodically ala metronome;
+#X text 12 105 OUTLET_0 bang;
+#X text 12 85 INLET_1 float;
+#X text 12 65 INLET_0 float bang list stop;
+#X text 12 5 KEYWORDS control time bang_op;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 483 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 96 378 428 249 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [metro] Related Objects;
+#X text 20 101 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 19 150 The best places to find information about Pd's libraries
+is:;
+#X text 19 172 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 20 188 or;
+#X text 21 202 iem.kug.ac.at/pdb/;
+#X obj 24 35 pddp/helplink mjlib/metroplus;
+#X obj 24 55 pddp/helplink iemlib/t3_metro;
+#X obj 24 75 pddp/helplink maxlib/pulse;
+#X restore 102 597 pd Related_objects;
+#X obj 78 336 cnv 17 3 75 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 335 float;
+#X text 98 395 list;
+#X obj 78 492 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 417 cnv 17 3 55 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 416 float;
+#X obj 483 3 metro;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/metro -text
+pdpedia: metro;
+#X obj 109 224 metro 500;
+#X floatatom 160 201 4 0 0 0 - - -;
+#X msg 109 125 1;
+#X text 177 124 nonzero number or "bang" to start;
+#X msg 150 158 0;
+#X msg 141 125 bang;
+#X msg 182 158 stop;
+#X obj 109 247 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 219 158 zero or "stop" to stop;
+#X text 168 335 - sending a nonzero number to the left inlet starts
+the metronome. Sending a zero stops it.;
+#X text 98 361 bang;
+#X text 98 378 stop;
+#X text 98 446 list;
+#X text 167 446 - a list to the right inlet will be truncated to the
+first item.;
+#X text 143 247 The metro object sends a series of bangs at a constant
+rate.;
+#X text 98 491 bang;
+#X text 168 544 - (optional) sets the initial rate in milliseconds.
+;
+#X text 168 361 - start the metronome.;
+#X text 168 378 - the "stop" message turns off the metronome.;
+#X text 167 416 - the right inlet sets the interval in milliseconds
+between each "bang" that is sent to the outlet of [metro].;
+#X text 168 491 - [metro] outputs a bang at a constant rate \, defined
+by the creation argument or a value sent to its right inlet.;
+#X text 80 544 1) float;
+#X text 11 23 send a bang periodically ala metronome;
+#X text 168 395 - a list will be distributed to the inlets of [metro].
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 16 0 23 0;
+#X connect 17 0 16 1;
+#X connect 18 0 16 0;
+#X connect 20 0 16 0;
+#X connect 21 0 16 0;
+#X connect 22 0 16 0;
diff --git a/doc/pddp/midi-help.pd b/doc/pddp/midi-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ef9089137b121f6cb893a5ff6a2e92bb27f462a6
--- /dev/null
+++ b/doc/pddp/midi-help.pd
@@ -0,0 +1,101 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (MIDI) 3 12 0 18
+-204280 -1 0;
+#X obj 0 288 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 65 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 KEYWORDS control MIDI;
+#X text 12 85 DESCRIPTION MIDI input/output objects;
+#X text 12 5 NAME bendin ctlin midiin notein pgmin polytouchin sysexin
+touchin bendout ctlout midiout noteout pgmout polytouchout touchout
+;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 495 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 542 (none);
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 62 43 makenote;
+#X obj 22 43 poly;
+#X obj 123 43 list;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 (MIDI) Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 79 297 cnv 17 3 130 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 296 float;
+#X text 98 353 list;
+#X text 98 503 float;
+#X obj 79 504 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 79 440 cnv 17 3 45 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 439 float;
+#X text 98 383 flush;
+#X text 98 413 clear;
+#X text 168 383 - output all values one by one \, in the order they
+were received \, and clear the collection.;
+#X text 168 503 - upon sending the "flush" message to the left inlet
+\, [bag] will output each value in the order it was received.;
+#X text 168 353 - a (value \, flag) pair is distributed to the two
+inlets. Lists with more than two elements will be truncated.;
+#X text 168 413 - clear the collection.;
+#X text 167 439 - a float to the right inlet sets the "flag": if zero
+\, values to the left inlet will not be added to the collection. If
+nonzero \, values to the right inlet will be added to the collection.
+;
+#X text 168 296 - a float to the left inlet will be added to the collection
+if the last value the right inlet received was nonzero. If the last
+value the right inlet received was zero \, the float sent to the right
+inlet will be removed from the collection.;
+#X text 11 23 MIDI input/output objects;
+#X obj 86 86 bendin;
+#X obj 86 123 bendout;
+#X obj 131 86 ctlin;
+#X obj 137 123 ctlout;
+#X obj 215 86 notein;
+#X obj 233 123 noteout;
+#X obj 260 86 pgmin;
+#X obj 284 123 pgmout;
+#X obj 425 86 touchin;
+#X obj 299 86 polytouchin;
+#X obj 170 86 midiin;
+#X obj 374 86 sysexin;
+#X obj 182 123 midiout;
+#X obj 329 123 polytouchout;
+#X obj 410 123 touchout;
+#X text 10 86 MIDI input:;
+#X text 10 123 MIDI output:;
+#X obj 320 185 pddp/pddplink touchin-help.pd;
+#X obj 243 185 touchin;
+#X obj 243 210 polytouchin;
+#X obj 320 210 pddp/pddplink polytouchin-help.pd;
+#X obj 243 235 touchout;
+#X obj 320 235 pddp/pddplink touchout-help.pd;
+#X obj 243 260 polytouchout;
+#X obj 320 260 pddp/pddplink polytouchout-help.pd;
+#X obj 80 185 midiin;
+#X obj 80 235 sysexin;
+#X obj 80 210 midiout;
+#X obj 135 185 pddp/pddplink midiin-help.pd;
+#X obj 135 235 pddp/pddplink sysexin-help.pd;
+#X obj 135 210 pddp/pddplink midiout-help.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/MIDI -text
+pdpedia: MIDI;
+#X text 77 151 Right-click the objects above and choose "Help" \, or
+follow the links below for help on these objects:;
diff --git a/doc/pddp/midiin-help.pd b/doc/pddp/midiin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..53840e80bcbbb6211225b386900a2c5fea4f80f1
--- /dev/null
+++ b/doc/pddp/midiin-help.pd
@@ -0,0 +1,91 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header midiin 3 12 0 18
+-204280 -1 0;
+#X obj 0 441 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 253 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.35. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION;
+#X text 12 65 OUTLET_0 float;
+#X text 12 85 OUTLET_1 float;
+#X text 12 5 KEYWORDS control MIDI;
+#X restore 500 597 pd META;
+#X obj 0 469 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 441 414 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 78 80 ctlin;
+#X obj 221 80 pgmin;
+#X obj 28 80 bendin;
+#X obj 83 107 touchin;
+#X obj 265 80 polytouchin;
+#X obj 122 80 midiin;
+#X obj 27 32 sysexin;
+#X obj 183 167 noteout;
+#X obj 80 167 ctlout;
+#X obj 28 167 bendout;
+#X obj 370 167 touchout;
+#X obj 284 167 polytouchout;
+#X obj 127 167 midiout;
+#X obj 235 167 pgmout;
+#X obj 28 221 makenote;
+#X text 25 198 MIDI note construction:;
+#X text 25 140 MIDI output:;
+#X text 25 57 MIDI input:;
+#X obj 188 221 stripnote;
+#X obj 172 80 notein;
+#X text 185 198 MIDI note deconstruction:;
+#X text 8 2 [midiin] Related Objects;
+#X text 26 260 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 25 339 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 26 241 Externals;
+#X obj 26 290 pddp/helplink maxlib/pitch;
+#X obj 26 305 pddp/helplink maxlib/score;
+#X obj 26 320 pddp/helplink maxlib/chord;
+#X obj 26 355 pddp/helplink cyclone/midiformat;
+#X obj 26 370 pddp/helplink cyclone/midiparse;
+#X obj 26 385 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 477 float;
+#X obj 78 478 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 (none);
+#X obj 78 503 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X obj 484 3 midiin;
+#X obj 454 20 pddp/pddplink http://wiki.puredata.info/en/midiin -text
+pdpedia: midiin;
+#X obj 225 153 midiin;
+#X floatatom 225 184 0 0 0 0 - - -;
+#X floatatom 258 184 0 0 0 0 - - -;
+#X text 164 230 This object is always omni and;
+#X text 163 246 outputs the port number instead;
+#X text 11 23 needs a description;
+#X text 168 477 - port number;
+#X text 98 502 ???;
+#X text 168 502 - ???;
+#X text 80 545 1) ???;
+#X text 168 545 - ???;
+#X text 164 264 of the channel (Linux only).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 16 0 17 0;
+#X connect 16 1 18 0;
diff --git a/doc/pddp/midiout-help.pd b/doc/pddp/midiout-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a4d4baadf28aab3739fb9d254203cb3cb254e053
--- /dev/null
+++ b/doc/pddp/midiout-help.pd
@@ -0,0 +1,93 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header midiout 3 12 0 18
+-204280 -1 0;
+#X obj 0 421 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 253 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was created for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 45 DESCRIPTION read incoming stream of MIDI notes;
+#X text 12 65 INLET_0 float;
+#X text 12 85 INLET_1 float;
+#X text 12 5 KEYWORDS control MIDI;
+#X restore 500 597 pd META;
+#X obj 0 449 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 506 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 428 435 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 78 80 ctlin;
+#X obj 221 80 pgmin;
+#X obj 28 80 bendin;
+#X obj 83 107 touchin;
+#X obj 265 80 polytouchin;
+#X obj 28 33 midiin;
+#X obj 77 33 sysexin;
+#X obj 183 167 noteout;
+#X obj 80 167 ctlout;
+#X obj 28 167 bendout;
+#X obj 370 167 touchout;
+#X obj 284 167 polytouchout;
+#X obj 127 167 midiout;
+#X obj 235 167 pgmout;
+#X obj 28 221 makenote;
+#X text 25 198 MIDI note construction:;
+#X text 25 140 MIDI output:;
+#X text 25 57 MIDI input:;
+#X obj 188 221 stripnote;
+#X obj 172 80 notein;
+#X text 185 198 MIDI note deconstruction:;
+#X text 8 2 [midiout] Related Objects;
+#X text 25 275 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 24 354 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 25 256 Externals;
+#X obj 25 305 pddp/helplink maxlib/pitch;
+#X obj 25 320 pddp/helplink maxlib/score;
+#X obj 25 335 pddp/helplink maxlib/chord;
+#X obj 25 370 pddp/helplink cyclone/midiformat;
+#X obj 25 385 pddp/helplink cyclone/midiparse;
+#X obj 25 400 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 457 float;
+#X obj 78 458 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 425 (none);
+#X text 98 482 float;
+#X obj 78 483 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X text 11 23 read incoming stream of MIDI notes;
+#X text 80 525 1) float;
+#X obj 220 244 midiout;
+#X text 168 268 use this to output raw MIDI;
+#X text 163 288 (the second inlet is the port;
+#X floatatom 220 212 5 0 0 0 - - -;
+#X floatatom 259 212 5 0 0 0 - - -;
+#X obj 477 3 midiout;
+#X obj 447 20 pddp/pddplink http://wiki.puredata.info/en/midiout -text
+pdpedia: midiout;
+#X text 168 482 - port number;
+#X text 168 457 - ???;
+#X text 168 525 - ???;
+#X text 166 306 number.) (Linux Only).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 20 0 17 0;
+#X connect 21 0 17 1;
diff --git a/doc/pddp/min-help.pd b/doc/pddp/min-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c6230f91126e07b022332123b57880beefd849f6
--- /dev/null
+++ b/doc/pddp/min-help.pd
@@ -0,0 +1,76 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header min 3 12 0 18 -204280
+-1 0;
+#X obj 0 369 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 361 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION choose the lesser (minimum) of two values
+;
+#X text 12 65 INLET_0 float bang list;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 487 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 524 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 94 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [min] Related Objects;
+#X obj 23 43 max;
+#X obj 53 43 clip;
+#X restore 102 597 pd Related_objects;
+#X obj 78 378 cnv 17 3 70 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 431 list;
+#X text 98 495 float;
+#X obj 78 496 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 459 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 458 float;
+#X text 78 544 1) float;
+#X obj 497 3 min;
+#X text 98 377 bang;
+#X text 98 402 float;
+#X text 168 458 - a float to the right inlet is stored.;
+#X text 168 544 - initializes the value of the right inlet.;
+#X obj 469 20 pddp/pddplink http://wiki.puredata.info/en/min -text
+pdpedia: min;
+#X floatatom 186 168 5 0 0 0 - - -;
+#X floatatom 186 222 5 0 0 0 - - -;
+#X obj 186 195 min;
+#X floatatom 228 168 5 0 0 0 - - -;
+#X obj 316 195 min 5;
+#X floatatom 316 168 5 0 0 0 - - -;
+#X floatatom 316 223 5 0 0 0 - - -;
+#X text 168 377 - output the last value.;
+#X text 168 402 - the incoming float is compared to the value at the
+right inlet \, and the greater of the two is output.;
+#X text 168 429 - a pair of floats will be distributed to the inlets.
+;
+#X text 168 495 - the two values at the inlets are compared \, and
+the greater one is output.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 11 23 choose the lesser (minimum) of two values;
+#X connect 21 0 23 0;
+#X connect 23 0 22 0;
+#X connect 24 0 23 1;
+#X connect 25 0 27 0;
+#X connect 26 0 25 0;
diff --git a/doc/pddp/moses-help.pd b/doc/pddp/moses-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3fc103b9771898914d11321e35d24f4d33771d75
--- /dev/null
+++ b/doc/pddp/moses-help.pd
@@ -0,0 +1,121 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header moses 3 12 0 18
+-204280 -1 0;
+#X obj 0 302 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 211 494 384 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 205 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 26 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control filter;
+#X text 12 45 DESCRIPTION part a stream of numbers;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 125 OUTLET_1 float;
+#X restore 500 597 pd META;
+#X obj 0 410 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 498 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 106 297 428 256 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [moses] Related Objects;
+#X text 19 168 The best places to find information about Pd's libraries
+is:;
+#X text 19 190 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 20 206 or;
+#X text 19 221 iem.kug.ac.at/pdb/;
+#X text 20 119 Externals are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X obj 22 42 list split;
+#X text 20 80 Externals;
+#X obj 20 98 pddp/helplink cyclone/split;
+#X restore 102 597 pd Related_objects;
+#X obj 78 311 cnv 17 3 65 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 310 float;
+#X text 98 350 list;
+#X text 98 418 float;
+#X obj 78 419 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 382 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 381 float;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/moses -text
+pdpedia: moses;
+#X obj 483 3 moses;
+#X floatatom 68 143 4 0 0 0 - - -;
+#X floatatom 124 142 4 0 0 0 - - -;
+#X floatatom 68 196 4 0 0 0 - - -;
+#X floatatom 121 196 4 0 0 0 - - -;
+#X text 65 66 Moses takes numbers and outputs them at left if they're
+less than a control value \, and at right if they're greater or equal
+to it. The creation argument initializes the control value (10 in this
+example) and the right inlet changes it.;
+#N canvas 103 360 428 202 More_info 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 146 moses 0;
+#X floatatom 22 170 5 0 0 0 - - -;
+#X floatatom 65 170 5 0 0 0 - - -;
+#X floatatom 22 124 5 0 0 0 - - -;
+#X text 20 38 One way to think of [moses] is as a filter. For the following
+example \, imagine that [moses] works as a low pass and high pass filter
+simoultaneously -- for non-audio signals. Below you will see that negative
+numbers will pass through the left outlet while positive numbers will
+pass through the right outlet.;
+#X text 8 2 [moses] More Info;
+#X connect 1 0 2 0;
+#X connect 1 1 3 0;
+#X connect 4 0 1 0;
+#X restore 102 548 pd More_info;
+#X text 167 381 - a float to the right inlet sets the control value.
+;
+#X text 98 453 float;
+#X obj 78 454 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 168 453 - incoming values (to the left inlet) will pass at
+the right outlet if they are greater than or equal to the control value.
+;
+#X obj 68 169 moses 10;
+#X text 224 179 The control value may be a float or integer. Try shift-scrolling:
+;
+#X floatatom 327 221 5 0 0 0 - - -;
+#X floatatom 327 267 5 0 0 0 - - -;
+#X obj 327 244 moses 1.5;
+#X floatatom 378 267 5 0 0 0 - - -;
+#X text 11 23 part a stream of numbers;
+#X text 168 350 - a two element list is distributed to the two inlets.
+Lists with more than two elements will be truncated.;
+#X text 168 516 - (optional) initializes the control value.;
+#X text 168 418 - incoming values (to the left inlet) will pass at
+the left outlet if they are less than the control value.;
+#X text 81 516 1) float;
+#X text 168 310 - if the float the left inlet is less than the control
+value \, it passes at the left inlet. If it is greater than or equal
+to the control value it passes at the right inlet.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 100 568 pddp/pddplink ../2.control.examples/18.conditional.pd
+-text doc/2.control.examples/18.conditional.pd;
+#X connect 17 0 27 0;
+#X connect 18 0 27 1;
+#X connect 27 0 19 0;
+#X connect 27 1 20 0;
+#X connect 29 0 31 0;
+#X connect 31 0 30 0;
+#X connect 31 1 32 0;
diff --git a/doc/pddp/mtof-help.pd b/doc/pddp/mtof-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4339402eb859943649ebaf2a2a0819168855c4d1
--- /dev/null
+++ b/doc/pddp/mtof-help.pd
@@ -0,0 +1,72 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header mtof 3 12 0 18 -204280
+-1 0;
+#X obj 0 429 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 246 495 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control conversion MIDI;
+#X text 12 45 DESCRIPTION MIDI to frequency conversion;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 491 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 527 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 553 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 438 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 530 (none);
+#N canvas 107 405 428 182 Related_objects 0;
+#X text 21 38 Control objects for conversion:;
+#X obj 24 67 ftom;
+#X obj 71 67 dbtorms;
+#X obj 139 67 rmstodb;
+#X obj 208 67 dbtopow;
+#X obj 274 67 powtodb;
+#X obj 24 126 mtof~;
+#X obj 69 126 ftom~;
+#X obj 112 126 dbtorms~;
+#X obj 177 126 rmstodb~;
+#X obj 243 126 dbtopow~;
+#X obj 305 126 powtodb~;
+#X text 21 103 Signal objects for conversion:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [mtof] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X floatatom 239 196 0 0 0 0 - - -;
+#X floatatom 239 140 0 0 0 0 - - -;
+#X obj 78 500 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/mtof -text
+pdpedia: mtof;
+#X obj 489 3 mtof;
+#X text 99 235 The mtof object transposes a midi value into a frequency
+in Hertz \, so that "69" goes to "440". You can specify microtonal
+pitches as in "69.5" (a quarter tone higher than 69).;
+#X obj 239 169 mtof;
+#X text 98 437 float;
+#X text 98 457 list;
+#X text 98 500 float;
+#X text 11 23 MIDI to frequency conversion;
+#X text 158 457 - lists will be truncated \, and the first element
+used as input.;
+#X text 158 437 - the incoming value.;
+#X obj 98 557 pddp/pddplink all_about_acoustic_conversions.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/A06.frequency.pd -text
+doc/3.audio.examples/A06.frequency.pd;
+#X connect 11 0 16 0;
+#X connect 16 0 10 0;
diff --git a/doc/pddp/mtof~-help.pd b/doc/pddp/mtof~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..477163bf60de1610899a8bbe5b224f69e9271df3
--- /dev/null
+++ b/doc/pddp/mtof~-help.pd
@@ -0,0 +1,79 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header mtof~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 418 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 243 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion MIDI;
+#X text 12 45 DESCRIPTION MIDI to frequency conversion for audio signals
+;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 455 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 492 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 520 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 427 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 496 (none);
+#N canvas 107 445 428 145 Related_objects 0;
+#X obj 23 43 ftom~;
+#X obj 70 43 dbtorms~;
+#X obj 138 43 rmstodb~;
+#X obj 207 43 dbtopow~;
+#X obj 273 43 powtodb~;
+#X obj 23 102 mtof;
+#X obj 68 102 ftom;
+#X obj 111 102 dbtorms;
+#X obj 176 102 rmstodb;
+#X obj 242 102 dbtopow;
+#X obj 304 102 powtodb;
+#X text 20 79 Control objects for conversion:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [mtof~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 482 3 mtof~;
+#X obj 209 149 mtof~;
+#X obj 209 205 snapshot~;
+#X floatatom 209 236 0 0 0 0 - - -;
+#X floatatom 209 100 0 0 0 0 - - -;
+#X obj 209 124 sig~;
+#X obj 256 179 metro 100;
+#X obj 256 149 loadbang;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/mtof~ -text
+pdpedia: mtof~;
+#X text 98 426 signal;
+#X obj 78 464 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 464 signal;
+#X text 99 524 This object takes an audio signal as input and output
+(and works sample by sample.) Since it calls a library math function
+\, it may be much more expensive than other workaday tilde objects
+such as *~ and osc~ \, depending on your hardware and math library.
+;
+#X text 11 23 MIDI to frequency conversion for audio signals;
+#X text 99 265 The [mtof~] object transposes a midi value into a frequency
+in Hertz \, so that "69" goes to "440". You can specify microtonal
+pitches as in "69.5" (a quarter tone higher than 69).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 14 0 15 0;
+#X connect 15 0 11 0;
+#X connect 16 0 12 0;
+#X connect 17 0 16 0;
diff --git a/doc/pddp/my_canvas-help.pd b/doc/pddp/my_canvas-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..dd80953020c0d6fbceaf80b4514a3d13c3f551fb
--- /dev/null
+++ b/doc/pddp/my_canvas-help.pd
@@ -0,0 +1,725 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header my_canvas 3 12 0
+18 -204280 -1 0;
+#X obj 0 352 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 245 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Thomas Musil;
+#X text 12 125 WEBSITE;
+#X text 12 165 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 65 DESCRIPTION gui-rectangle;
+#X text 12 5 ALIAS cnv;
+#X text 12 145 RELEASE_DATE 2002;
+#X text 12 25 KEYWORDS control GUI nonlocal;
+#X restore 500 597 pd META;
+#X obj 0 430 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 459 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 546 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 80 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [cnv] Related Objects;
+#X obj 22 43 drawpolygon;
+#X obj 112 43 filledpolygon;
+#X obj 22 73 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X restore 102 597 pd Related_objects;
+#X text 11 23 gui-rectangle;
+#X text 418 3 [my_canvas] or [cnv];
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/cnv -text
+pdpedia: cnv;
+#X text 98 356 (none);
+#X text 98 435 (none);
+#X text 98 374 See the following subpatch for messages that change
+the gui-properties of [cnv]:;
+#N canvas 80 25 428 604 Changing_GUI_Properties 0;
+#X obj 27 393 unpack 0 0;
+#X text 12 301 get position on canvas;
+#X msg 13 109 size \$1;
+#X obj 13 72 nbx 3 14 8 200 0 0 empty \$0-dim empty 0 -8 0 12 -262144
+-1 -1 15 256;
+#X obj 13 133 s cnv_rcv;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-width empty
+0 -8 0 12 -262144 -1 -1 100 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-height empty
+0 -8 0 12 -262144 -1 -1 60 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 89 59 pd flash-time;
+#X text 86 38 visible size;
+#X text 138 61 1.width;
+#X text 138 81 2.height;
+#X msg 89 109 vis_size \$1 \$2;
+#X obj 89 133 s cnv_rcv;
+#X text 195 38 change send name;
+#X text 310 38 change receive name;
+#X obj 196 134 s cnv_rcv;
+#X obj 310 134 s cnv_rcv;
+#X msg 196 59 send cnv5a_snd;
+#X msg 310 59 receive cnv1a_rcv;
+#X obj 320 109 s cnv1a_rcv;
+#X msg 320 85 receive cnv_rcv;
+#X text 132 173 label position;
+#X text 274 173 font properties;
+#X text 13 173 label;
+#X msg 13 194 label new-label;
+#X msg 134 245 label_pos \$1 \$2;
+#X msg 276 245 label_font \$1 \$2;
+#X text 325 197 1.font(0-2);
+#X text 325 218 2.height;
+#X text 183 196 1.x-offset;
+#X text 183 217 2.y-offset;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 20 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 12 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 134 195 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 14 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 276 195 pd flash-time;
+#X text 164 461 delta;
+#X text 12 461 position;
+#X msg 13 558 pos \$1 \$2;
+#X msg 165 558 delta \$1 \$2;
+#X text 165 301 preset-colors;
+#X text 264 301 RGB-colors;
+#N canvas 364 205 169 292 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 10 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 33 237 pack 0 0;
+#X connect 0 0 4 0;
+#X connect 0 1 4 1;
+#X connect 2 0 4 0;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 165 323 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 115 456 t b a;
+#X obj 104 124 vradio 15 1 0 2 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X text 120 137 2.label;
+#X obj 96 410 route 0 1;
+#X obj 96 497 pack 0 0;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 17 0;
+#X connect 10 0 18 0;
+#X connect 10 1 18 1;
+#X connect 11 0 9 1;
+#X connect 13 0 5 0;
+#X connect 14 0 6 0;
+#X connect 15 0 7 0;
+#X connect 17 0 18 0;
+#X connect 17 1 10 0;
+#X connect 18 0 0 0;
+#X coords 0 -1 1 1 102 58 2 100 100;
+#X restore 265 323 pd flash-time;
+#X obj 165 534 list;
+#X obj 165 483 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 214 325 1.bg;
+#X text 61 482 1.x-position;
+#X text 61 504 2.y-position;
+#X text 244 482 1.x-delta;
+#X text 244 504 2.y-delta;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 310 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 500 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 13 483 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 194 483 pd flash-time;
+#X msg 27 322 get_pos;
+#X obj 27 347 s cnv_rcv;
+#X obj 165 433 s cnv_rcv;
+#X obj 13 583 s cnv_rcv;
+#X obj 165 583 s cnv_rcv;
+#X obj 276 270 s cnv_rcv;
+#X obj 134 270 s cnv_rcv;
+#X obj 13 270 s cnv_rcv;
+#X text 214 345 2.label;
+#N canvas 375 166 157 260 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 72 \; \$1-width 100 \; \$1-height 60 \; \$1-xpos 310 \; \$1-ypos
+500 \; \$1-xlabel 20 \; \$1-ylabel 12 \; \$1-dim 15 \; \$1-font 0 \;
+\$1-font-size 14 \; \$1-bg 10 \; \$1-label 12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 265 408 pd init;
+#X obj 310 500 cnv 15 100 60 cnv_snd cnv_rcv my_canvas 20 12 0 14 -233017
+-33289 0;
+#X obj 27 370 r cnv_snd;
+#X msg 165 408 color \$1 \$2;
+#X obj 27 421 nbx 3 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 90 421 nbx 3 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X msg 25 245 label my_canvas;
+#X msg 204 109 send cnv_snd;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [cnv] Changing Properties through Messages;
+#X text 12 51 size;
+#X text 12 38 selectable;
+#X text 14 417 x;
+#X text 76 418 y;
+#X connect 0 0 61 0;
+#X connect 0 1 62 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 5 0 9 0;
+#X connect 9 0 10 0;
+#X connect 15 0 13 0;
+#X connect 16 0 14 0;
+#X connect 18 0 17 0;
+#X connect 22 0 55 0;
+#X connect 23 0 54 0;
+#X connect 24 0 53 0;
+#X connect 29 0 23 0;
+#X connect 30 0 24 0;
+#X connect 33 0 51 0;
+#X connect 34 0 52 0;
+#X connect 37 0 60 0;
+#X connect 38 0 60 0;
+#X connect 39 0 34 0;
+#X connect 40 0 39 0;
+#X connect 46 0 33 0;
+#X connect 47 0 39 1;
+#X connect 48 0 49 0;
+#X connect 59 0 0 0;
+#X connect 60 0 50 0;
+#X connect 63 0 55 0;
+#X connect 64 0 13 0;
+#X restore 170 407 pd Changing_GUI_Properties;
+#N canvas 103 143 428 369 canvas-creation-arguments 0;
+#X msg 23 43 canvas: cnv selectableSize xSize ySize sendName recieveName
+Label labelXOff labelYOff Font# fontSize bgColor lblColor 0;
+#X text 20 80 Canvas can be called with 13 creation arguments. These
+are not "optional" - all parameters must be filled or the canvas will
+not instantiate correctly.;
+#X text 20 125 The function of the final "0" is unknown to me (it is
+found in the textual entry for a canvas object in a .pd file) but can
+be safely left off without ill effects.;
+#X text 20 167 For example \, click the msg-box to dynamically create
+a cnv:;
+#X obj 23 237 s pd-canvas-creation-arguments;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [cnv] Creation Arguments and Dynamic Patching;
+#X msg 23 195 obj 110 260 cnv 15 200 100 myCanvas myCanvasR Alcyone
+75 12 2 14 -261441 12;
+#X connect 7 0 4 0;
+#X restore 171 518 pd canvas-creation-arguments;
+#X text 168 463 - creating a [cnv] without any arguments will set default
+values for all gui-properties. See the subpatch below to learn how
+to dynamically instantiate a [cnv] object with custom properties:;
+#X floatatom 338 318 4 0 0 0 - - -;
+#X floatatom 382 318 4 0 0 0 - - -;
+#X text 349 334 x;
+#X text 393 334 y;
+#X obj 435 170 metro 100;
+#X obj 435 150 tgl 15 1 empty empty empty 20 8 0 10 -262144 -1 -1 1
+1;
+#X obj 338 270 r from_K1;
+#X floatatom 435 318 4 0 0 0 - - -;
+#X floatatom 479 318 4 0 0 0 - - -;
+#X text 445 334 x;
+#X text 490 334 y;
+#X obj 435 270 r from_K2;
+#N canvas 8 328 313 315 room 0;
+#X obj 6 7 cnv 15 300 300 empty empty type...ctrl+e 100 140 2 17 -33289
+-24198 0;
+#X obj 26 27 cnv 1 1 264 empty empty move_K1_and_K2 65 160 2 17 -166441
+-24198 0;
+#X obj 287 30 cnv 1 1 261 empty empty empty 20 12 2 20 -99865 -66577
+0;
+#X obj 27 27 cnv 1 260 1 empty empty empty 20 12 2 20 -166441 -66577
+0;
+#X obj 28 291 cnv 1 260 1 empty empty empty 20 12 2 20 -99865 -66577
+0;
+#X obj 38 40 cnv 25 25 25 from_K1 to_K K1 1 13 2 14 -261681 -123526
+0;
+#X obj 251 255 cnv 25 25 25 from_K2 to_K K2 1 13 2 14 -225280 -1109
+0;
+#X restore 128 171 pd room;
+#X obj 338 294 unpack;
+#X obj 435 294 unpack;
+#X text 17 147 Click the subwindow below to use a cnv as a control
+surface:;
+#X obj 20 61 cnv 15 100 60 empty empty label 20 12 0 14 -233017 -66577
+0;
+#X text 128 58 Colored rectangle with a label. Right-click in the top-left
+corner of the gray rectangle to the left and click "properties" to
+change the object's appearance.;
+#X text 127 110 The blue rectangle at the top of each help patch is
+a [cnv] \, as are the horizontal dividers below.;
+#X text 98 463 13;
+#X text 207 564 IEM KUG;
+#X text 182 576 graz \, austria 2002;
+#X msg 435 192 get_pos;
+#X obj 435 214 send to_K;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#N canvas 405 89 483 507 (subpatch) 0;
+#X msg 144 296 bang;
+#X msg 144 321 1 30;
+#X obj 144 409 line~;
+#X obj 202 301 del 30;
+#X obj 61 433 *~;
+#X obj 62 485 dac~;
+#X obj 62 359 osc~ 880;
+#X obj 62 403 clip~ -1 1;
+#X obj 35 220 list split 1;
+#X obj 15 311 list;
+#X obj 35 244 t b a;
+#X obj 62 334 mtof;
+#X obj 62 457 *~ 0.07;
+#X obj 207 128 metro 50;
+#X obj 207 202 s \$0-cnv;
+#X obj 207 106 0;
+#X obj 207 84 del 3000;
+#X obj 310 170 f;
+#X obj 342 170 + 1;
+#X obj 35 12 r \$0-bng;
+#X obj 106 14 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 310 197 div 13;
+#X msg 310 314 color \$1 0;
+#X obj 242 105 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 279 86 sel 0;
+#X obj 279 107 -1;
+#X obj 279 130 t a;
+#X obj 207 155 f -1;
+#X msg 207 180 delta 0 \$1;
+#X obj 35 44 spigot 1;
+#X obj 35 76 t a b;
+#X obj 96 55 0;
+#X obj 130 55 1;
+#X obj 310 220 sel 3 4;
+#X msg 371 246 5 \$1;
+#X obj 371 268 -;
+#X msg 310 246 1;
+#X obj 340 245 f 2;
+#X obj 383 170 sel 1;
+#X msg 377 198 0;
+#X msg 411 199 2;
+#X obj 62 311 + 68;
+#X obj 15 284 del 170;
+#X text 167 14 IT'S A SECRET TO EVERYBODY.;
+#X obj 56 106 loadbang;
+#X obj 35 174 list;
+#X obj 114 217 s \$0-randomize;
+#X obj 71 149 r \$0-new-secret;
+#X msg 56 128 7 1 0 8 12 16;
+#X obj 35 197 list prepend 11 10;
+#X obj 62 381 *~ 1.4;
+#X msg 202 323 0 400;
+#X connect 0 0 1 0;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 1;
+#X connect 3 0 51 0;
+#X connect 4 0 12 0;
+#X connect 6 0 50 0;
+#X connect 7 0 4 0;
+#X connect 8 0 10 0;
+#X connect 8 1 9 1;
+#X connect 9 0 8 0;
+#X connect 10 0 42 0;
+#X connect 10 1 0 0;
+#X connect 10 1 41 0;
+#X connect 11 0 6 0;
+#X connect 12 0 5 0;
+#X connect 12 0 5 1;
+#X connect 13 0 17 0;
+#X connect 13 0 27 0;
+#X connect 15 0 13 0;
+#X connect 15 0 17 1;
+#X connect 16 0 15 0;
+#X connect 16 0 23 0;
+#X connect 16 0 32 0;
+#X connect 17 0 18 0;
+#X connect 17 0 21 0;
+#X connect 18 0 17 1;
+#X connect 19 0 29 0;
+#X connect 20 0 29 0;
+#X connect 21 0 33 0;
+#X connect 22 0 14 0;
+#X connect 23 0 24 0;
+#X connect 23 0 38 0;
+#X connect 24 0 25 0;
+#X connect 24 1 26 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 1;
+#X connect 27 0 28 0;
+#X connect 28 0 14 0;
+#X connect 29 0 30 0;
+#X connect 30 0 13 0;
+#X connect 30 0 16 0;
+#X connect 30 0 45 0;
+#X connect 30 1 31 0;
+#X connect 31 0 29 1;
+#X connect 32 0 29 1;
+#X connect 33 0 36 0;
+#X connect 33 1 37 0;
+#X connect 33 2 34 0;
+#X connect 34 0 35 0;
+#X connect 35 0 22 0;
+#X connect 36 0 22 0;
+#X connect 37 0 22 0;
+#X connect 38 0 39 0;
+#X connect 38 1 40 0;
+#X connect 39 0 37 1;
+#X connect 40 0 37 1;
+#X connect 41 0 11 0;
+#X connect 42 0 9 0;
+#X connect 44 0 48 0;
+#X connect 45 0 46 0;
+#X connect 45 0 49 0;
+#X connect 47 0 45 1;
+#X connect 48 0 45 1;
+#X connect 49 0 8 0;
+#X connect 50 0 7 0;
+#X connect 51 0 2 0;
+#X coords 0 -1 1 1 15 15 2 100 100;
+#X restore 71 330 pd;
+#X obj 169 553 bng 14 250 50 0 \$0-bng empty empty 4 7 0 12 -262144
+-262144 -1;
+#X text 66 275 You can also use a white [cnv] to;
+#X text 66 290 conceal parts of a patch (use;
+#X text 66 305 with care);
+#N canvas 93 78 450 511 let's-play-pong! 0;
+#X obj 148 128 cnv 15 100 25 empty \$0-score Score:0 5 12 0 14 -233017
+-66577 0;
+#X obj 14 29 cnv 15 5 60 \$0-ps \$0-pr empty 20 12 0 14 -1 -66577 0
+;
+#X obj 257 19 key;
+#X msg 257 112 delta 0 \$1;
+#X msg 257 87 -5;
+#X obj 68 48 tgl 16 0 empty empty Go! 19 8 0 10 -4034 -1 -1 0 1;
+#X obj 337 158 r \$0-ps;
+#X obj 337 180 unpack;
+#X obj 370 202 v py;
+#X obj 68 117 t b b b;
+#X msg 107 169 \; \$1-br get_pos \; \$1-pr get_pos \;;
+#X obj 425 6 cnv 5 5 500 empty empty empty 20 12 0 14 -1 -66577 0;
+#X obj 257 158 r \$0-bs;
+#X obj 290 202 v by;
+#X obj 68 447 pack;
+#X msg 145 340 1;
+#X msg 178 340 -1;
+#X obj 68 491 s \$0-br;
+#X obj 87 297 sel 0 1 2 3 4 5;
+#X msg 101 361 1;
+#N canvas 574 158 450 300 drift 0;
+#X obj 55 40 inlet;
+#X obj 136 40 inlet;
+#X obj 205 45 inlet;
+#X obj 55 117 f;
+#X obj 93 142 mod;
+#X obj 55 164 sel 1;
+#X obj 55 231 f 1;
+#X obj 55 266 outlet;
+#X msg 90 231 0;
+#X obj 136 61 b;
+#X obj 136 88 random 8;
+#X obj 136 115 sel 0;
+#X msg 130 137 1e+37;
+#X obj 205 155 t a;
+#X floatatom 13 147 5 0 0 0 - - -;
+#X obj 93 118 + 1;
+#X connect 0 0 3 0;
+#X connect 1 0 9 0;
+#X connect 2 0 13 0;
+#X connect 3 0 5 0;
+#X connect 3 0 14 0;
+#X connect 3 0 15 0;
+#X connect 4 0 3 1;
+#X connect 5 0 6 0;
+#X connect 5 1 8 0;
+#X connect 6 0 7 0;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 11 1 4 1;
+#X connect 12 0 4 1;
+#X connect 13 0 6 1;
+#X connect 15 0 4 0;
+#X restore 95 427 pd drift;
+#X obj 68 405 t a b;
+#X obj 68 383 f 1;
+#X msg 134 18 10 SLOW;
+#X msg 134 35 7 MEDIUM;
+#X obj 257 43 spigot;
+#X obj 77 71 s \$0-k;
+#X obj 310 10 r \$0-k;
+#N canvas 0 0 450 300 score 0;
+#X obj 84 59 inlet;
+#X obj 84 113 f;
+#X obj 120 113 + 1;
+#X obj 84 86 b;
+#X msg 84 152 label Score:\$1;
+#X obj 84 179 s \$0-score;
+#X obj 165 51 sel 0;
+#X obj 165 78 0;
+#X obj 210 92 loadbang;
+#X msg 210 114 0;
+#X obj 165 24 r play;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 1 1;
+#X connect 3 0 1 0;
+#X connect 4 0 5 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 1;
+#X connect 8 0 9 0;
+#X connect 9 0 4 0;
+#X connect 10 0 6 0;
+#X restore 101 386 pd score;
+#X obj 68 95 metro 10;
+#N canvas 0 0 450 300 once 0;
+#X obj 26 21 inlet;
+#X obj 26 102 outlet;
+#X obj 26 75 t a b;
+#X msg 89 48 0;
+#X obj 26 48 spigot 1;
+#X connect 0 0 4 0;
+#X connect 2 0 1 0;
+#X connect 2 1 3 0;
+#X connect 3 0 4 1;
+#X connect 4 0 2 0;
+#X restore 310 32 pd once;
+#X obj 257 65 select 97 122 32;
+#X msg 336 89 1;
+#X obj 87 277 t a;
+#X obj 256 442 cnv 15 100 40 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 256 439 a = up \; z = down \; <space> = replay;
+#X msg 134 69 1.5 WTF;
+#X text 216 318 0 - die at left wall \; 1 - richochet off left wall
+\; 2 - die at right wall (not yet) \; 3 - richochet off right wall
+\; 4 - richochet off top \; 5 - richochet of bottom \;;
+#X obj 87 225 expr if(bx<=20 \, py<=by && py+60>=by \, -1) \; if (bx>=415
+\, 3 \, -1) \; if (by<=0 \, 4 \, if (by>=500 \, 5 \, -1));
+#X obj 68 18 r play;
+#X obj 336 111 s play;
+#X msg 87 319 0;
+#X obj 71 51 cnv 10 10 10 \$0-bs \$0-br empty 20 12 0 14 -1 -66577
+0;
+#X obj 257 202 v bx;
+#X obj 337 202 v px;
+#X obj 257 180 unpack;
+#X obj 257 134 s \$0-pr;
+#X msg 294 87 5;
+#X msg 134 52 4 FAST;
+#X obj 107 139 f \$0;
+#X msg 130 361 -1;
+#X msg 68 469 delta \$1 \$2;
+#X obj 87 341 s play;
+#N canvas 528 152 450 386 sfx 0;
+#X obj 21 169 noise~;
+#X obj 22 201 *~;
+#X obj 102 176 vline~;
+#X obj 23 249 +~;
+#X obj 174 146 delread~ \$0-b;
+#X obj 36 278 delwrite~ \$0-b 500;
+#X obj 22 302 *~ 0.1;
+#X obj 23 330 dac~;
+#X obj 135 120 del;
+#X msg 102 120 1;
+#X msg 135 145 0;
+#X obj 174 120 * 10;
+#X obj 175 176 *~ 0.8;
+#X msg 174 81 2;
+#X obj 117 9 inlet;
+#X obj 174 54 change;
+#X obj 117 31 sel -1 0 2;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 1;
+#X connect 3 0 5 0;
+#X connect 3 0 6 0;
+#X connect 4 0 12 0;
+#X connect 6 0 7 0;
+#X connect 6 0 7 1;
+#X connect 8 0 10 0;
+#X connect 9 0 2 0;
+#X connect 10 0 2 0;
+#X connect 11 0 4 0;
+#X connect 12 0 3 1;
+#X connect 13 0 9 0;
+#X connect 13 0 8 0;
+#X connect 13 0 11 0;
+#X connect 14 0 16 0;
+#X connect 15 0 13 0;
+#X connect 16 3 15 0;
+#X restore 211 294 pd sfx;
+#X connect 2 0 25 0;
+#X connect 3 0 46 0;
+#X connect 4 0 3 0;
+#X connect 5 0 26 0;
+#X connect 5 0 29 0;
+#X connect 6 0 7 0;
+#X connect 7 0 44 0;
+#X connect 7 1 8 0;
+#X connect 9 0 22 0;
+#X connect 9 1 38 0;
+#X connect 9 2 49 0;
+#X connect 12 0 45 0;
+#X connect 14 0 51 0;
+#X connect 15 0 20 2;
+#X connect 16 0 20 2;
+#X connect 18 0 41 0;
+#X connect 18 1 19 0;
+#X connect 18 2 41 0;
+#X connect 18 3 50 0;
+#X connect 18 4 15 0;
+#X connect 18 5 16 0;
+#X connect 19 0 20 1;
+#X connect 19 0 22 1;
+#X connect 19 0 28 0;
+#X connect 20 0 14 1;
+#X connect 21 0 14 0;
+#X connect 21 1 20 0;
+#X connect 22 0 21 0;
+#X connect 23 0 29 1;
+#X connect 24 0 29 1;
+#X connect 25 0 31 0;
+#X connect 27 0 30 0;
+#X connect 29 0 9 0;
+#X connect 30 0 25 1;
+#X connect 31 0 4 0;
+#X connect 31 1 47 0;
+#X connect 31 2 32 0;
+#X connect 32 0 40 0;
+#X connect 33 0 18 0;
+#X connect 33 0 53 0;
+#X connect 36 0 29 1;
+#X connect 38 0 33 0;
+#X connect 38 1 33 0;
+#X connect 38 2 33 0;
+#X connect 39 0 5 0;
+#X connect 41 0 52 0;
+#X connect 45 0 43 0;
+#X connect 45 1 13 0;
+#X connect 47 0 3 0;
+#X connect 48 0 29 1;
+#X connect 49 0 10 0;
+#X connect 50 0 20 1;
+#X connect 50 0 22 1;
+#X connect 51 0 17 0;
+#X restore 136 312 pd let's-play-pong!;
+#X text 185 551 musil@iem.kug.ac.at;
+#X text 171 550 c;
+#X obj 60 267 cnv 15 210 70 empty \$0-cnv empty 20 12 0 14 -262144
+-262144 0;
+#X obj 69 329 cnv 15 17 17 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X text 244 191 send it a "get_pos" message ->;
+#X text 244 176 To get a cnv position \,;
+#X text 325 551 Note: [cnv] is not to be confused;
+#X text 325 564 with the Pd canvas \, or [pd] \,;
+#X text 325 577 [table] \, etc.;
+#X connect 21 0 39 0;
+#X connect 22 0 21 0;
+#X connect 23 0 30 0;
+#X connect 28 0 31 0;
+#X connect 30 0 17 0;
+#X connect 30 1 18 0;
+#X connect 31 0 24 0;
+#X connect 31 1 25 0;
+#X connect 39 0 40 0;
diff --git a/doc/pddp/namecanvas-help.pd b/doc/pddp/namecanvas-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..aacc7b0a96f6a6cc5cb5d6b587c84079ef1d0a15
--- /dev/null
+++ b/doc/pddp/namecanvas-help.pd
@@ -0,0 +1,54 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header namecanvas 3 12
+0 18 -204280 -1 0;
+#X obj 0 450 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 65 LIBRARY internal;
+#X text 12 105 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 85 AUTHOR Miller Puckette;
+#X text 12 145 HELP_PATCH_AUTHORS Updated for Pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION attach a canvas to a name;
+#X text 12 5 KEYWORDS control canvas_op;
+#X text 12 125 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 478 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 505 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 102 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [namecanvas] Related Objects;
+#X obj 19 43 pddp/helplink iemguts/sendcanvas;
+#X restore 102 597 pd Related_objects;
+#X obj 455 3 namecanvas;
+#X obj 425 20 pddp/pddplink http://wiki.puredata.info/en/namecanvas
+-text pdpedia: namecanvas;
+#X obj 120 153 namecanvas \$0-bonzo;
+#X obj 120 210 s \$0-bonzo;
+#X text 98 454 (none);
+#X text 98 482 (none);
+#X obj 120 366 s pd-namecanvas-help.pd;
+#X text 11 23 attach a canvas to a name;
+#X text 168 523 - sets the name to associate with this canvas. Any
+messages sent to this name will be forwarded to the canvas containing
+this [namecanvas] object.;
+#X msg 120 186 msg 50 50 Hi there. This works locally.;
+#X msg 120 338 msg 50 70 This works globally.;
+#X text 78 523 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 120 240 If you open another instance of this help patch \,
+you'll see that clicking the message box above will create an object
+on the canvas where you click.;
+#X text 119 294 The following is similar \, but it will create an object
+in each "namecanvas-help.pd" patch that you have open:;
+#X connect 17 0 11 0;
+#X connect 18 0 14 0;
diff --git a/doc/pddp/netreceive-help.pd b/doc/pddp/netreceive-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9124f167fac09582e7271cc156805344d5688ba4
--- /dev/null
+++ b/doc/pddp/netreceive-help.pd
@@ -0,0 +1,96 @@
+#N canvas 398 77 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header netreceive 3 12
+0 18 -204280 -1 0;
+#X obj 0 311 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS control network;
+#X text 12 45 DESCRIPTION listen for incoming messages from a network
+;
+#X text 12 65 OUTLET_0 anything;
+#X text 12 85 OUTLET_1 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 338 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 419 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 558 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [netreceive] Related Objects;
+#X obj 16 35 netsend;
+#X obj 70 35 disis_netsend;
+#X obj 160 35 disis_netreceive;
+#X restore 102 598 pd Related_objects;
+#X obj 78 347 cnv 17 3 25 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 80 439 1) float;
+#X obj 463 3 netreceive;
+#X obj 430 20 pddp/pddplink http://wiki.puredata.info/en/netreceive
+-text pdpedia: netreceive;
+#X floatatom 226 82 0 0 0 0 - - -;
+#X obj 139 145 netreceive 3001 1;
+#X obj 139 82 print tcp;
+#X obj 139 166 print udp;
+#N canvas 57 331 428 261 About_netreceive 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [netreceive] More Info;
+#X text 21 38 The [netreceive] object opens a socket for TCP ("stream")
+or UDP ("datagram") network reception on a specified port. If using
+TCP \, an outlet gives you the number of [netsend] objects (or other
+compatible clients) have opened connections here.;
+#X text 20 170 There are some possibilities for intercommunication
+with other programs... see the help for [netsend].;
+#X text 19 104 Incoming network messages appear at the left inlet of
+the [netreceive] object. (They used to be received by [receive] objects
+\, in which case it was up to the sender to select which one). To test
+the object you can send messages from the [netsend] help window.;
+#X text 18 208 SECURITY ALERT: the port that netreceive opens has no
+access restrictions \, so anyone can connect to it and send messages.
+;
+#X restore 102 567 pd About_netreceive;
+#X text 11 23 listen for incoming messages from a network;
+#X text 168 454 - (optional) 0 for TCP \, nonzero for UDP. (Default
+is TCP.);
+#X text 168 439 - (optional) port number.;
+#X text 80 454 2) float;
+#X text 168 469 - if you set the third argument to the word "old" \,
+everything sent to the specified port is received into the global message
+space. This is the original behavior of [netreceive]. This can be VERY
+INSECURE since it gives someone full access to your computer \, allowing
+them to do anything that Pd can via the network.;
+#X text 98 270 Old behavior: [netreceive 4567 0 old] (see argument
+3 below);
+#X text 80 469 3) symbol atom;
+#X text 98 346 anything;
+#X obj 78 383 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 382 float;
+#X text 264 60 <- TCP \, port 3000;
+#X text 261 144 <- UDP \, port 3001;
+#X text 98 205 You can send messages from the [netsend] objects in
+the help patch for [netsend].;
+#X text 168 346 - any message received by this [netreceive] object
+will be sent to the left outlet.;
+#X text 98 314 (none);
+#X obj 139 61 netreceive 3000;
+#X text 168 382 - when using TCP \, the [netreceive] object has a right
+inlet which shows the number of open connections.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 13 0 15 0;
+#X connect 32 0 14 0;
+#X connect 32 1 12 0;
diff --git a/doc/pddp/netsend-help.pd b/doc/pddp/netsend-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ab06e603838a55ee06a476f562af2f1eba013a59
--- /dev/null
+++ b/doc/pddp/netsend-help.pd
@@ -0,0 +1,113 @@
+#N canvas 398 77 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header netsend 3 12 0 18
+-204280 -1 0;
+#X obj 0 348 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS control network;
+#X text 12 45 DESCRIPTION send Pd messages over a network;
+#X text 12 65 INLET_0 connect disconnect send;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 478 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 515 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 558 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [netsend] Related Objects;
+#X obj 11 34 netreceive;
+#X obj 83 34 disis_netsend;
+#X obj 173 34 disis_netreceive;
+#X restore 102 598 pd Related_objects;
+#X obj 78 357 cnv 17 3 110 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 486 float;
+#X obj 78 487 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 11 23 send Pd messages over a network;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/netsend -text
+pdpedia: netsend;
+#X obj 473 3 netsend;
+#X obj 15 238 netsend;
+#X msg 15 79 connect localhost 3000;
+#X msg 23 213 send foo \$1;
+#X floatatom 23 186 0 0 0 0 - - -;
+#X msg 15 160 disconnect;
+#X msg 186 213 send foo \$1;
+#X floatatom 186 186 0 0 0 0 - - -;
+#X msg 178 160 disconnect;
+#X obj 178 238 netsend 1;
+#X msg 178 79 connect localhost 3001;
+#X floatatom 15 265 0 0 0 0 - - -;
+#X floatatom 178 265 0 0 0 0 - - -;
+#X text 66 58 TCP;
+#X text 253 55 UDP;
+#X text 325 79 Connect to "localhost" port 3000/3001;
+#X text 253 161 Close the connection;
+#X text 215 188 Send messages to "foo" on remote machine;
+#X text 12 294 Outlet is nonzero if connection is open \, zero otherwise.
+;
+#X msg 15 106 connect molloy 3000;
+#X msg 178 106 connect molloy 3001;
+#X msg 15 133 connect bug 3000;
+#X msg 178 133 connect bug 3000;
+#X text 98 356 connect;
+#X text 98 413 disconnect;
+#X text 98 443 send;
+#X text 168 486 - nonzero if the connection is open \, zero otherwise.
+;
+#N canvas 55 339 428 233 About_netsend 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [netsend] More Info;
+#X text 20 39 The [netsend] object connects to another machine over
+the network for sending TCP ("stream") or UDP ("datagram") messages.
+An outlet reports whether the connection is open or not. A connection
+request should specify the name or IP address of the other host and
+the port number. There should be a [netreceive] object on the remote
+host with a matching port number.;
+#X text 20 148 The Linux version of Pd comes with "pdsend" and "pdreceive"
+standalone programs. These haven't been tested in Windows yet (but
+the source is included in the Pd distribution).;
+#X restore 102 567 pd About_netsend;
+#X text 80 535 1) float;
+#X text 168 535 - (optional) 0 for TCP \, nonzero for UDP. (Default
+is TCP.);
+#X text 168 413 - disconnect from the remote machine. When it is disconnected
+\, a "0" is sent to the outlet.;
+#X text 168 443 - after successfully connecting \, use the "send" message
+to forward data to the remote machine.;
+#X text 168 356 - use the "connect" message to connect to the specified
+remote machine-- providing its name or IP address-- on the specified
+port (e.g. \, "connect localhost 3000"). A "1" is output if the connection
+is successful.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 14 0 24 0;
+#X connect 15 0 14 0;
+#X connect 16 0 14 0;
+#X connect 17 0 16 0;
+#X connect 18 0 14 0;
+#X connect 19 0 22 0;
+#X connect 20 0 19 0;
+#X connect 21 0 22 0;
+#X connect 22 0 25 0;
+#X connect 23 0 22 0;
+#X connect 32 0 14 0;
+#X connect 33 0 22 0;
+#X connect 34 0 14 0;
+#X connect 35 0 22 0;
diff --git a/doc/pddp/noise~-help.pd b/doc/pddp/noise~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a1c8c5e12d745459d3abbbcdb577dcb9d1882a89
--- /dev/null
+++ b/doc/pddp/noise~-help.pd
@@ -0,0 +1,63 @@
+#N canvas 0 22 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header noise~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 466 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION uniformly distributed white noise;
+#X text 12 65 INLET_0;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS signal random;
+#X restore 500 597 pd META;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 544 (none);
+#N canvas 107 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [noise~] Related Objects;
+#X obj 22 43 random;
+#X restore 102 597 pd Related_objects;
+#X obj 78 475 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 512 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 482 3 noise~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/noise~ -text
+pdpedia: noise~;
+#X floatatom 218 284 4 0 0 0 - - -;
+#X obj 218 217 noise~;
+#X obj 284 256 print~;
+#X obj 218 256 env~ 4096;
+#X text 216 192 the output range is -1 to 1...;
+#X obj 152 256 snapshot~;
+#X floatatom 152 283 0 0 0 0 - - -;
+#X msg 152 229 bang;
+#X msg 284 229 bang;
+#X text 168 474 - the inlet to [noise~] is not used.;
+#X text 98 511 signal;
+#X text 11 23 uniformly distributed white noise;
+#X text 98 474 (inactive);
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 14 0 15 0;
+#X connect 14 0 16 0;
+#X connect 14 0 18 0;
+#X connect 16 0 13 0;
+#X connect 18 0 19 0;
+#X connect 20 0 18 0;
+#X connect 21 0 15 0;
diff --git a/doc/pddp/notein-help.pd b/doc/pddp/notein-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a6ee8de7d026339d0f816487b47edf025c7dc5c2
--- /dev/null
+++ b/doc/pddp/notein-help.pd
@@ -0,0 +1,126 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header notein 3 12 0 18
+-204280 -1 0;
+#X obj 0 391 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 245 494 360 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was created for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION read incoming stream of MIDI notes;
+#X text 12 65 OUTLET_0 float;
+#X text 12 85 OUTLET_1 float;
+#X text 12 105 OUTLET_2 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 419 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 506 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 428 390 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [notein] Related Objects;
+#X obj 78 60 ctlin;
+#X obj 221 60 pgmin;
+#X obj 28 60 bendin;
+#X obj 83 87 touchin;
+#X obj 265 60 polytouchin;
+#X obj 122 60 midiin;
+#X obj 27 87 sysexin;
+#X obj 183 147 noteout;
+#X obj 80 147 ctlout;
+#X obj 28 147 bendout;
+#X obj 370 147 touchout;
+#X obj 284 147 polytouchout;
+#X obj 127 147 midiout;
+#X obj 235 147 pgmout;
+#X obj 28 201 makenote;
+#X text 25 178 MIDI note construction:;
+#X text 25 120 MIDI output:;
+#X text 25 37 MIDI input:;
+#X obj 188 201 stripnote;
+#X obj 172 60 notein;
+#X text 185 178 MIDI note deconstruction:;
+#X text 25 245 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 24 324 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 25 226 Externals;
+#X obj 25 275 pddp/helplink maxlib/pitch;
+#X obj 25 290 pddp/helplink maxlib/score;
+#X obj 25 305 pddp/helplink maxlib/chord;
+#X obj 25 340 pddp/helplink cyclone/midiformat;
+#X obj 25 355 pddp/helplink cyclone/midiparse;
+#X obj 25 370 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 427 float;
+#X obj 78 428 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 484 3 notein;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/notein -text
+pdpedia: notein;
+#X obj 43 107 notein;
+#X floatatom 43 175 5 0 0 0 - - -;
+#X floatatom 59 154 5 0 0 0 - - -;
+#X floatatom 76 133 5 0 0 0 - - -;
+#X text 40 56 The [notein] object reads incoming MIDI notes and reports
+their note number \, velocity and channel number. Without the argument
+it reads from all MIDI channels (omni).;
+#X text 98 395 (none);
+#X text 98 452 float;
+#X obj 78 453 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 477 float;
+#X obj 78 478 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X floatatom 188 282 5 0 0 0 - - -;
+#X floatatom 233 282 5 0 0 0 - - -;
+#X obj 188 249 notein 1;
+#X text 251 248 notein listening only to channel 1;
+#X text 153 295 note number;
+#X text 243 295 velocity;
+#X obj 159 182 stripnote;
+#X text 224 182 is one of the ways to deal with this situation;
+#X text 159 211 Arguments: the MIDI channel number from which to read
+(with no argument it listens to all channels):;
+#X text 157 113 Note: remember that a 'note-off' is a note with velocity=0.
+Therefore [notein] reports each note twice (note-on when a key on your
+keyboard is pressed and note-off when the key is released). This could
+be sometimes misleading when tracking notes.;
+#X floatatom 190 355 5 0 0 0 - - -;
+#X floatatom 241 355 5 0 0 0 - - -;
+#X text 155 368 note number;
+#X text 251 368 velocity;
+#X obj 190 322 notein 17;
+#X text 253 321 notein listening only to channel 1 on port 2;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X text 11 23 read incoming stream of MIDI notes;
+#X text 168 427 - MIDI note number.;
+#X text 168 452 - velocity.;
+#X text 80 525 1) float;
+#X text 168 477 - MIDI channel number. This inlet is available only
+if no creation argument is specified.;
+#X text 168 525 - the MIDI channel number from which to read. If no
+argument is provided [notein] reads from all channels (and sprouts
+a third inlet).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 12 0 13 0;
+#X connect 12 1 14 0;
+#X connect 12 2 15 0;
+#X connect 24 0 22 0;
+#X connect 24 1 23 0;
+#X connect 36 0 32 0;
+#X connect 36 1 33 0;
diff --git a/doc/pddp/noteout-help.pd b/doc/pddp/noteout-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..082c248289e7644ee0bf0e675e9441b4fb5f88cb
--- /dev/null
+++ b/doc/pddp/noteout-help.pd
@@ -0,0 +1,118 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header noteout 3 12 0 18
+-204280 -1 0;
+#X obj 0 352 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 244 494 369 META 0;
+#X text 12 65 PLATFORM windows macosx gnulinux;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION transmit MIDI notes;
+#X text 12 85 INLET_0 float list;
+#X text 12 125 INLET_2 float;
+#X text 12 105 INLET_1 float;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 475 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 107 157 428 430 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [noteout] Related Objects;
+#X obj 74 80 ctlin;
+#X obj 217 80 pgmin;
+#X obj 24 80 bendin;
+#X obj 79 107 touchin;
+#X obj 261 80 polytouchin;
+#X obj 118 80 midiin;
+#X obj 23 107 sysexin;
+#X obj 179 167 noteout;
+#X obj 76 167 ctlout;
+#X obj 24 167 bendout;
+#X obj 366 167 touchout;
+#X obj 280 167 polytouchout;
+#X obj 123 167 midiout;
+#X obj 231 167 pgmout;
+#X obj 24 221 makenote;
+#X text 21 198 MIDI note construction:;
+#X text 21 140 MIDI output:;
+#X text 21 57 MIDI input:;
+#X obj 184 221 stripnote;
+#X obj 24 33 notein;
+#X text 181 198 MIDI note deconstruction:;
+#X text 22 265 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 21 344 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 22 246 Externals;
+#X obj 22 295 pddp/helplink maxlib/pitch;
+#X obj 22 310 pddp/helplink maxlib/score;
+#X obj 22 325 pddp/helplink maxlib/chord;
+#X obj 22 360 pddp/helplink cyclone/midiformat;
+#X obj 22 375 pddp/helplink cyclone/midiparse;
+#X obj 22 390 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X obj 78 361 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 360 float;
+#X text 98 380 list;
+#X obj 78 422 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 421 float;
+#X obj 473 3 noteout;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/noteout -text
+pdpedia: noteout;
+#X obj 78 447 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 446 float;
+#X text 98 479 (none);
+#X obj 123 197 noteout;
+#X msg 123 176 60 100 2;
+#X obj 215 197 noteout 2;
+#X msg 215 176 60 100;
+#X obj 338 123 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 338 174 60;
+#X msg 372 174 100;
+#X obj 338 142 t b b b;
+#X obj 338 200 noteout;
+#X msg 405 174 2;
+#X text 108 228 (all three above) middle-c with velocity 100 sent to
+channel 2;
+#X obj 367 571 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 570 for an explanation of MIDI usage in Pd see:;
+#X text 11 23 transmit MIDI notes;
+#X text 168 380 - a three-element list (MIDI note \, velocity \, channel)
+is distributed among the three inlets. Lists with more than two elements
+will be truncated.;
+#X text 168 521 - the MIDI channel number to which a note-on message
+is to be sent. If no argument is provided [noteout] transmits on channel
+1 (default).;
+#X text 168 360 - (integer) MIDI note number (0-127).;
+#X text 167 421 - (integer) velocity.;
+#X text 167 446 - (integer) channel number.;
+#X text 80 521 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 19 0 18 0;
+#X connect 21 0 20 0;
+#X connect 22 0 25 0;
+#X connect 23 0 26 0;
+#X connect 24 0 26 1;
+#X connect 25 0 23 0;
+#X connect 25 1 24 0;
+#X connect 25 2 27 0;
+#X connect 27 0 26 2;
diff --git a/doc/pddp/numbox2-help.pd b/doc/pddp/numbox2-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..06a6bc60d622e5717d129f025ef114d062d98445
--- /dev/null
+++ b/doc/pddp/numbox2-help.pd
@@ -0,0 +1,426 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header nbx 3 12 0 18 -204280
+-1 0;
+#X obj 0 260 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 155 LIBRARY internal;
+#X text 12 65 LICENSE SIBSD;
+#X text 12 175 AUTHOR Thomas Musil;
+#X text 12 195 WEBSITE;
+#X text 12 235 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 45 KEYWORDS control storage GUI nonlocal;
+#X text 12 85 DESCRIPTION gui-number box;
+#X text 12 5 NAME nbx;
+#X text 12 25 ALIAS my_numbox;
+#X text 12 135 OUTLET_0 float;
+#X text 12 105 INLET_0 float bang set size range log init log_height
+send receive label label_pos label_font color pos delta;
+#X text 12 215 RELEASE_DATE 2002;
+#X restore 500 597 pd META;
+#X obj 0 425 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 462 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 547 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 73 462 428 128 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [nbx] Related Objects;
+#X floatatom 22 43 5 0 0 0 - - -;
+#X obj 62 43 float;
+#X obj 106 43 int;
+#X obj 20 90 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 18 66 All iem-gui objects:;
+#X restore 102 597 pd Related_objects;
+#X obj 78 269 cnv 17 3 140 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 268 float;
+#X text 98 338 list;
+#X text 98 433 float;
+#X obj 78 434 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 28 175 6 0 0 0 - - -;
+#X msg 57 94 set \$1;
+#X floatatom 48 49 6 0 0 0 - - -;
+#X obj 28 199 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 28 49 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X floatatom 57 71 4 0 0 0 - - -;
+#X floatatom 108 49 6 0 0 0 - - -;
+#X floatatom 366 48 7 0 0 0 - - -;
+#X obj 241 159 ftom;
+#X floatatom 241 183 4 0 0 0 - - -;
+#X floatatom 287 159 9 0 0 0 - - -;
+#X floatatom 366 120 9 0 0 0 - - -;
+#X floatatom 241 63 4 0 0 0 - - -;
+#X obj 241 85 mtof;
+#X text 104 151 (0.01 pixels);
+#X msg 108 71 set \$1;
+#X text 106 120 shift-click & drag;
+#X text 107 135 for fine-tuning;
+#X obj 77 199 print;
+#N canvas 133 180 290 126 once 0;
+#X obj 38 24 inlet;
+#X obj 38 80 outlet;
+#X obj 38 53 spigot 1;
+#X msg 102 53 0;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 1;
+#X restore 77 175 pd once;
+#X obj 108 93 s foo13_rcv;
+#X obj 366 71 s goo14_rcv;
+#X obj 366 96 r goo14_snd;
+#X obj 28 135 nbx 6 15 -1e+37 1e+37 0 0 foo13_snd foo13_rcv empty 45
+7 0 10 -225280 -1109 -1 0 256;
+#X obj 241 128 nbx 5 18 55 3520 1 0 goo14_snd goo14_rcv log.freq. 10
+-10 0 14 -261234 -159808 -90881 55 72;
+#X text 363 157 and receive names. Right-;
+#X text 363 172 click and choose;
+#X text 362 141 [nbx] has settable send;
+#X obj 466 48 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-262144 -1 -1 0 256;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/nbx -text
+pdpedia: nbx;
+#X text 168 268 - a float to the left inlet will be displayed \, stored
+\, and sent to the outlet.;
+#X text 168 338 - a list will be truncated to the first item.;
+#X text 98 311 set;
+#X text 168 311 - sending a set message followed by a value (e.g. \,
+"set 14") will display and store the value without outputting it.;
+#X text 97 360 see the following subpatch for messages that change
+the gui-properties of [nbx]:;
+#N canvas 49 27 446 599 Changing_GUI_Properties 0;
+#X text 17 152 log height;
+#X text 340 24 no init;
+#X msg 350 94 init 1;
+#X msg 340 43 init 0;
+#X msg 242 64 lin;
+#X msg 252 94 log;
+#X text 238 24 linear/;
+#X text 238 39 logarithmical;
+#X text 349 58 init value;
+#X text 350 73 on loadbang;
+#X obj 242 119 s nbx_rcv;
+#X obj 340 119 s nbx_rcv;
+#X msg 17 175 log_height 256;
+#X obj 17 245 s nbx_rcv;
+#X text 346 152 label;
+#X msg 346 172 label blabla;
+#X text 115 153 change send name;
+#X text 220 152 change receive name;
+#X obj 117 245 s nbx_rcv;
+#X obj 223 245 s nbx_rcv;
+#X obj 346 245 s nbx_rcv;
+#X msg 117 175 send nbx1_snd;
+#X msg 127 200 send nbx_snd;
+#X obj 231 222 s z_rcv;
+#X msg 223 174 receive z_rcv;
+#X msg 231 199 receive nbx_rcv;
+#N canvas 372 228 161 250 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 73 \; \$1-xpos 320 \; \$1-ypos 330 \; \$1-xlabel 0 \; \$1-ylabel
+-8 \; \$1-font-size 10 \; \$1-width 5 \; \$1-height 14 \; \$1-bg 0
+\; \$1-front 12 \; \$1-label 12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 360 400 pd init;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-bottom empty
+0 -8 0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-top empty 0
+-8 0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 124 44 pd flash-time;
+#X text 121 23 output-range;
+#X text 173 46 1.bottom;
+#X text 173 66 2.top;
+#X msg 124 94 range \$1 \$2;
+#X obj 124 118 s nbx_rcv;
+#X text 15 280 label position;
+#X text 137 280 font properties;
+#X msg 17 387 label_pos \$1 \$2;
+#X msg 139 387 label_font \$1 \$2;
+#X text 188 304 1.font(0-2);
+#X text 188 325 2.height;
+#X text 66 303 1.x-offset;
+#X text 66 324 2.y-offset;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 -8 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 17 302 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 139 302 pd flash-time;
+#X text 18 445 preset-colors;
+#X text 119 445 RGB-colors;
+#X msg 18 552 color \$1 \$2 \$3;
+#N canvas 364 205 306 317 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 33 237 pack 0 0 0;
+#X obj 120 197 t b a;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 0 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-front empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 103 144 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 2;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X coords 0 -1 1 1 48 62 2 100 100;
+#X restore 18 467 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 96 410 route 0 1 2;
+#X obj 96 497 pack 0 0 0;
+#X obj 115 456 t b a;
+#X obj 168 455 t b a;
+#X obj 104 124 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X text 120 137 2.front;
+#X text 120 153 3.label;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 10 2 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 1 11 1;
+#X connect 13 0 11 0;
+#X connect 13 1 11 2;
+#X connect 14 0 9 1;
+#X connect 18 0 5 0;
+#X connect 19 0 6 0;
+#X connect 20 0 7 0;
+#X coords 0 -1 1 1 102 74 2 100 100;
+#X restore 120 467 pd flash-time;
+#X text 67 469 1.bg;
+#X text 67 489 2.front;
+#X text 67 510 3.label;
+#X text 348 445 delta;
+#X text 236 445 position;
+#X msg 237 540 pos \$1 \$2;
+#X msg 349 540 delta \$1 \$2;
+#X obj 349 516 list;
+#X obj 349 467 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 320 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 330 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 237 467 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 378 467 pd flash-time;
+#X obj 304 291 cnv 15 92 92 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 305 292 cnv 15 90 90 empty empty empty 20 12 0 14 -261682 -66577
+0;
+#X obj 320 330 nbx 5 14 -1e+37 1e+37 0 0 nbx_snd nbx_rcv my_nbx 0 -8
+0 10 -262144 -33289 -33289 0 256;
+#X obj 17 412 s nbx_rcv;
+#X obj 139 412 s nbx_rcv;
+#X obj 18 577 s nbx_rcv;
+#X obj 349 577 s nbx_rcv;
+#X obj 237 577 s nbx_rcv;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-width empty
+0 -8 0 12 -262144 -1 -1 5 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-height empty
+0 -8 0 12 -262144 -1 -1 14 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 17 44 pd flash-time;
+#X obj 17 118 s nbx_rcv;
+#X text 66 46 1.width;
+#X text 66 66 2.height;
+#X text 14 23 dimensions;
+#X msg 17 94 size \$1 \$2;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [nbx] Changing GUI Properties through Messages;
+#X msg 356 197 label my_nbx;
+#X text 285 466 1.x-pos;
+#X text 285 488 2.y-pos;
+#X connect 2 0 11 0;
+#X connect 3 0 11 0;
+#X connect 4 0 10 0;
+#X connect 5 0 10 0;
+#X connect 12 0 13 0;
+#X connect 15 0 20 0;
+#X connect 21 0 18 0;
+#X connect 22 0 18 0;
+#X connect 24 0 19 0;
+#X connect 25 0 23 0;
+#X connect 27 0 31 0;
+#X connect 31 0 32 0;
+#X connect 35 0 62 0;
+#X connect 36 0 63 0;
+#X connect 41 0 35 0;
+#X connect 42 0 36 0;
+#X connect 45 0 64 0;
+#X connect 46 0 45 0;
+#X connect 47 0 45 0;
+#X connect 53 0 66 0;
+#X connect 54 0 65 0;
+#X connect 55 0 54 0;
+#X connect 56 0 55 0;
+#X connect 57 0 53 0;
+#X connect 58 0 55 1;
+#X connect 67 0 72 0;
+#X connect 72 0 68 0;
+#X connect 75 0 20 0;
+#X restore 170 394 pd Changing_GUI_Properties;
+#N canvas 73 200 428 314 nbx-creation-arguments 0;
+#X text 21 37 "nbx" can be called with 18 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X text 21 171 For example \, click the msg-box to dynamically create
+an nbx:;
+#X obj 22 235 s pd-nbx-creation-arguments;
+#X text 22 97 nbx creation arguments: xSize ySize rangeBtm rangeTop
+Logarithmic Init sendName receiveName Label labelXOff labelYOff Font#
+fontsize bgColor foregroundColor lblColor initValue logHeight;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [nbx] Creation Arguments;
+#X msg 22 193 obj 150 280 nbx 5 14 0 127 0 1 send receive Maia 15 -8
+0 13 14 12 23 63 256;
+#X connect 6 0 2 0;
+#X restore 170 524 pd nbx-creation-arguments;
+#X text 168 465 - if you create an [nbx] object without arguments \,
+default values are chosen for the GUI-properties. See the subpatch
+below to learn how to dynamically instantiate a [nbx] with custom properties:
+;
+#X text 115 208 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move
+a selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 362 188 "Properties" to set them.;
+#X text 11 23 gui-number box;
+#X text 97 466 18;
+#X text 215 551 (c) musil@iem.kug.ac.at;
+#X text 257 564 IEM KUG;
+#X text 232 576 graz \, austria 2002;
+#X text 425 4 [my_numbox] or [nbx];
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 98 295 bang;
+#X text 168 295 - output the current value;
+#X connect 13 0 16 0;
+#X connect 14 0 36 0;
+#X connect 15 0 36 0;
+#X connect 17 0 36 0;
+#X connect 18 0 14 0;
+#X connect 19 0 28 0;
+#X connect 20 0 34 0;
+#X connect 21 0 22 0;
+#X connect 25 0 26 0;
+#X connect 26 0 37 0;
+#X connect 28 0 33 0;
+#X connect 32 0 31 0;
+#X connect 35 0 24 0;
+#X connect 36 0 32 0;
+#X connect 36 0 13 0;
+#X connect 37 0 21 0;
+#X connect 37 0 23 0;
diff --git a/doc/pddp/openpanel-help.pd b/doc/pddp/openpanel-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b6cca59053b77cd5936e65c38b4dfa35f7e8e8a3
--- /dev/null
+++ b/doc/pddp/openpanel-help.pd
@@ -0,0 +1,73 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header openpanel 3 12 0
+18 -204280 -1 0;
+#X obj 0 310 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 243 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control GUI;
+#X text 12 45 DESCRIPTION query the user for a filename;
+#X text 12 65 INLET_0 bang symbol;
+#X text 12 85 OUTLET_0 symbol;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 432 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 475 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 479 (none);
+#N canvas 101 483 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 savepanel;
+#X obj 92 43 soundfiler;
+#X text 8 2 [openpanel] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 319 cnv 17 3 105 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 441 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 openpanel;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/openpanel
+-text pdpedia: openpanel;
+#X msg 171 104 bang;
+#X obj 171 217 print;
+#X text 211 104 Starts open panel in current directory;
+#X msg 187 130 symbol /tmp;
+#X msg 187 159 symbol C:/;
+#X text 265 130 Starts in a specified directory;
+#X text 98 318 bang;
+#X text 98 364 symbol;
+#X text 98 398 list;
+#X text 168 318 - a "bang" to the inlet causes an "Open file" browser
+to appear on the screen. If you select a file \, the filename appears
+at the outet.;
+#X text 168 364 - sending a symbol will start the "Open file" browser
+in the specified directory.;
+#X text 98 440 symbol;
+#X obj 171 192 openpanel;
+#X text 167 440 - the filename of the selected file is output from
+the outlet.;
+#X text 99 507 Unlike other symbol-handling objects in Pd \, [openpanel]
+can output a symbol that contains spaces \, which will get handled
+propertly by an object like [soundfiler]. However \, if you set this
+filename to a message box and save the patch \, the symbol will be
+converted to a list the next time you open the patch.;
+#X text 11 23 query the user for a filename;
+#X text 168 398 - a list starting with a symbol will be truncated to
+the first element.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 13 0 25 0;
+#X connect 16 0 25 0;
+#X connect 17 0 25 0;
+#X connect 25 0 14 0;
diff --git a/doc/pddp/operators-help.pd b/doc/pddp/operators-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3000480c72f5acb36b562382d08bc73eeed18ad7
--- /dev/null
+++ b/doc/pddp/operators-help.pd
@@ -0,0 +1,106 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (binops1) 3 12 0
+18 -204280 -1 0;
+#X obj 0 324 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 507 358 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 85 DATATYPE_IN bang float list;
+#X text 12 105 DATATYPE_OUT float;
+#X text 12 65 DESCRIPTION binary arithmetic operators;
+#X text 12 5 NAME + - * / pow max min;
+#X text 12 25 KEYWORDS control trigonometry;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 442 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 479 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 523 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 94 481 428 109 Related_objects 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 56 75 cos~;
+#X obj 88 75 osc~;
+#X obj 22 75 expr;
+#X obj 22 42 sin;
+#X obj 48 42 cos;
+#X obj 75 42 tan;
+#X obj 108 42 atan;
+#X obj 143 42 atan2;
+#X obj 181 42 exp;
+#X obj 208 42 log;
+#X obj 236 42 abs;
+#X obj 265 42 sqrt;
+#X text 7 1 (arithmetic_operators) Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 333 cnv 17 3 70 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 386 list;
+#X text 98 450 float;
+#X obj 78 451 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 414 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 413 float;
+#X text 78 499 1) float;
+#X obj 363 3 +;
+#X obj 388 3 -;
+#X obj 414 3 *;
+#X obj 440 3 /;
+#X obj 466 3 pow;
+#X obj 491 3 max;
+#X obj 517 3 min;
+#X obj 429 20 pddp/pddplink http://wiki.puredata.info/en/operators
+-text pdpedia: operators;
+#X obj 128 166 +;
+#X msg 94 124 3 4;
+#X floatatom 128 124 5 0 0 0 - - -;
+#X floatatom 169 124 5 0 0 0 - - -;
+#X floatatom 128 193 5 0 0 0 - - -;
+#X msg 54 124 bang;
+#X text 98 332 bang;
+#X text 98 357 float;
+#X text 168 413 - a float to the right inlet is stored.;
+#X text 168 332 - perform the operation using the last values stored
+at the inlets.;
+#X text 168 357 - store the incoming value at the left inlet and perform
+the operation.;
+#X text 168 384 - a pair of floats will be distributed to the two inlets.
+;
+#X floatatom 259 124 5 0 0 0 - - -;
+#X floatatom 259 193 5 0 0 0 - - -;
+#X obj 259 168 * 2;
+#X text 118 239 All of these objects share the same behavior.;
+#X obj 364 170 pow 4;
+#X floatatom 364 193 0 0 0 0 - - -;
+#X floatatom 403 126 5 0 0 0 - - -;
+#X floatatom 364 126 5 0 0 0 - - -;
+#X obj 98 542 pddp/pddplink pow-help.pd;
+#X text 168 499 - initializes the value of the right inlet.;
+#X text 98 527 Click below for individual help patches:;
+#X obj 98 557 pddp/pddplink min-help.pd;
+#X obj 98 572 pddp/pddplink max-help.pd;
+#X text 11 23 binary arithmetic operators;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 23 0 27 0;
+#X connect 24 0 23 0;
+#X connect 25 0 23 0;
+#X connect 26 0 23 1;
+#X connect 28 0 23 0;
+#X connect 35 0 37 0;
+#X connect 37 0 36 0;
+#X connect 39 0 40 0;
+#X connect 41 0 39 1;
+#X connect 42 0 39 0;
diff --git a/doc/pddp/osc~-help.pd b/doc/pddp/osc~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f6542ee2ca83db5b53cf1184715fcb3bcbbbac71
--- /dev/null
+++ b/doc/pddp/osc~-help.pd
@@ -0,0 +1,98 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header osc~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 358 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal trigonometry;
+#X text 12 45 DESCRIPTION cosine wave oscillator;
+#X text 12 65 INLET_0 signal float;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 456 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 493 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 107 477 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [osc~] Related Objects;
+#X obj 83 42 cos~;
+#X obj 127 42 tabread4~;
+#X obj 23 42 phasor~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 367 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 366 float;
+#X obj 78 465 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 410 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 409 float;
+#X obj 492 3 osc~;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/osc~ -text
+pdpedia: osc~;
+#X obj 229 253 dac~ 1;
+#X obj 229 223 *~;
+#X floatatom 65 126 0 0 0 0 - - -;
+#X obj 243 195 line~;
+#X msg 243 139 0.1 100;
+#X msg 262 164 0 100;
+#X text 314 134 on;
+#X text 311 163 off;
+#X text 280 188 envelope;
+#X text 280 201 generator;
+#X text 227 114 amplitude controls:;
+#X text 226 270 audio output;
+#X obj 83 228 metro 500;
+#X text 65 270 graph the output;
+#X text 89 132 change frequency;
+#X text 91 120 incoming numbers;
+#X obj 65 155 osc~ 1000;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 100 float 0;
+#X coords 0 -1 100 1 150 100 1;
+#X restore 374 172 graph;
+#X text 98 386 signal;
+#X text 98 464 signal;
+#X obj 83 203 loadbang;
+#X text 98 429 list;
+#X text 11 23 cosine wave oscillator;
+#X text 168 511 - sets the initial frequency. If the argument is supplied
+\, [osc~] takes floating-point messages to change frequency. If no
+argument is supplied \, the input is taken to be an audio signal.;
+#X text 168 366 - an incoming float changes the frequency.;
+#X text 168 386 - an incoming signal changes the frequency.;
+#X text 167 409 - a float to the right inlet resets the phase.;
+#X text 167 429 - a list will be truncated to the first element.;
+#X text 80 511 1) float;
+#X text 167 464 - the outgoing cosine wave.;
+#X text 22 60 The [osc~] object outputs a cosine wave. With a floating-point
+argument \, [osc~] takes floating-point messages to change frequency.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 66 253 tabwrite~ \$0-array;
+#X connect 16 0 15 0;
+#X connect 17 0 31 0;
+#X connect 18 0 16 1;
+#X connect 19 0 18 0;
+#X connect 20 0 18 0;
+#X connect 27 0 48 0;
+#X connect 31 0 16 0;
+#X connect 31 0 48 0;
+#X connect 35 0 27 0;
+#X connect 35 0 27 0;
diff --git a/doc/pddp/otherbinops-help.pd b/doc/pddp/otherbinops-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..70aafe32e79724983eb2ac157162644014be8e65
--- /dev/null
+++ b/doc/pddp/otherbinops-help.pd
@@ -0,0 +1,521 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (binops2-3) 3 12
+0 18 -204280 -1 0;
+#X obj 0 178 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.35 test 29 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Revised by Jonathan Wilkes to conform to the PDDP template.;
+#X text 12 25 KEYWORDS control;
+#X text 12 65 DESCRIPTION relational and logical operators;
+#X text 12 5 NAME > >= == != <= < mod div & | << >> && || %;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 301 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 338 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 381 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 69 435 428 156 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 (binops2-3) Related Objects;
+#X text 138 57 - binary arithmetic operators;
+#X obj 19 57 pddp/pddplink operators-help.pd;
+#X obj 19 77 pddp/pddplink math-help.pd;
+#X text 138 77 - higher math in Pd;
+#X text 19 37 Links to other control operators;
+#X text 19 107 Links to signal operators;
+#X obj 19 127 pddp/pddplink sigbinops-help.pd;
+#X restore 102 598 pd Related_objects;
+#X obj 79 187 cnv 17 3 75 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 309 float;
+#X obj 79 310 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 79 273 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 272 float;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/bag -text
+pdpedia: bag;
+#X text 11 23 relational and logical operators;
+#X obj 127 4 >;
+#X obj 154 4 >=;
+#X obj 182 4 ==;
+#X obj 236 4 <=;
+#X obj 264 4 <;
+#X obj 209 4 !=;
+#X obj 290 4 mod;
+#X obj 317 4 div;
+#X obj 366 4 &;
+#X obj 394 4 |;
+#X obj 474 4 &&;
+#X obj 501 4 ||;
+#X obj 421 4 <<;
+#X obj 448 4 >>;
+#X obj 527 4 %;
+#X text 341 4 and;
+#X floatatom 254 51 5 0 0 0 - - -;
+#X floatatom 296 51 5 0 0 0 - - -;
+#X obj 254 88 >;
+#X floatatom 254 125 5 0 0 0 - - -;
+#X msg 219 51 bang;
+#X text 98 186 bang;
+#X text 168 186 - a bang outputs the last value computed by the object.
+;
+#X text 98 206 list;
+#X text 168 206 - a pair of floats is distributed to the two inlets.
+Lists with more than two elements will be truncated.;
+#X text 98 236 float;
+#X text 168 236 - a float will be stored at the left inlet and used
+to evaluate and output a value.;
+#X text 167 272 - a float to the right inlet will be stored.;
+#X text 168 309 - all relational and logical operators output a float
+value.;
+#X text 80 358 1) float;
+#X text 167 358 - (optional) initial value for the right inlet.;
+#X text 142 154 All these objects share similar behavior.;
+#X msg 183 51 2 1;
+#N canvas 49 53 428 611 understanding_MOD_and_DIV 0;
+#X text 24 35 [mod] and [div] are helpful objects to determine whether
+or not a fraction produces a remainder \, or to determine the value
+of the remainder.;
+#X floatatom 28 195 0 0 0 0 - - -;
+#X floatatom 28 237 0 0 0 0 - - -;
+#X floatatom 140 197 0 0 0 0 - - -;
+#X text 60 196 divided by;
+#X text 175 198 has a remainder of;
+#X floatatom 302 198 0 0 0 0 - - -;
+#X obj 28 216 mod;
+#X text 25 108 [mod] takes a number in its left inlet and will divide
+that number by either the creation argument or the number given at
+its left inlet and will produce the value of the remainder at its outlet.
+If no creation argument is given \, then the default value is 1;
+#X obj 80 178 loadbang;
+#X msg 140 178 1;
+#X text 25 260 [div] takes a number in its left inlet and will divide
+that number by either the creation argument or the number given at
+its left inlet and will produce the result without a remainder. If
+no creation argument is given \, then the default value is 1;
+#X floatatom 28 341 0 0 0 0 - - -;
+#X floatatom 28 383 0 0 0 0 - - -;
+#X floatatom 140 343 0 0 0 0 - - -;
+#X text 60 342 divided by;
+#X floatatom 256 344 0 0 0 0 - - -;
+#X obj 80 324 loadbang;
+#X msg 140 324 1;
+#X obj 28 362 div;
+#X text 176 343 is equal to;
+#X text 294 343 with no remainder.;
+#X obj 257 371 /;
+#X floatatom 257 391 0 0 0 0 - - -;
+#X text 227 389 or;
+#X text 297 392 with a remainder.;
+#X text 25 413 In the following example \, I've built a metronome which
+counts bar numbers and beat numbers: default time signature is 4/4
+(Common Time).;
+#X obj 28 474 metro 500;
+#X obj 28 455 tgl 15 0 empty empty Start-Stop 20 8 0 8 -262144 -1 -1
+0 1;
+#X obj 53 495 + 1;
+#X floatatom 28 515 0 0 0 0 - - -;
+#X text 57 513 Total Beat Count;
+#X obj 28 539 div 4;
+#X obj 139 540 mod 4;
+#X floatatom 224 581 0 0 0 0 - - -;
+#X floatatom 113 580 0 0 0 0 - - -;
+#X obj 28 495 f 1;
+#X msg 112 453 1;
+#X obj 28 559 + 1;
+#X obj 139 559 + 1;
+#X text 136 453 Reset;
+#X text 39 579 Bar number;
+#X text 152 581 Beat Count;
+#X floatatom 344 491 0 0 0 0 - - -;
+#X text 181 491 How many beats per bar?;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (binops2-3) [mod] and [div];
+#X text 25 76 For example \, 3 / 3 = 1 with a remainder of zero (i.e.
+no remainder) \, while \, 4 / 3 = 1 with a remainder of one.;
+#X connect 1 0 7 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 1;
+#X connect 7 0 2 0;
+#X connect 9 0 10 0;
+#X connect 10 0 3 0;
+#X connect 12 0 19 0;
+#X connect 12 0 22 0;
+#X connect 13 0 16 0;
+#X connect 14 0 19 1;
+#X connect 14 0 22 1;
+#X connect 17 0 18 0;
+#X connect 18 0 14 0;
+#X connect 19 0 13 0;
+#X connect 22 0 23 0;
+#X connect 27 0 36 0;
+#X connect 28 0 27 0;
+#X connect 29 0 36 1;
+#X connect 30 0 32 0;
+#X connect 30 0 33 0;
+#X connect 32 0 38 0;
+#X connect 33 0 39 0;
+#X connect 36 0 29 0;
+#X connect 36 0 30 0;
+#X connect 37 0 36 1;
+#X connect 38 0 35 0;
+#X connect 39 0 34 0;
+#X connect 43 0 33 1;
+#X connect 43 0 32 1;
+#X restore 101 430 pd understanding_MOD_and_DIV;
+#N canvas 61 337 428 254 understanding_%_modulus 0;
+#X floatatom 21 184 0 0 0 0 - - -;
+#X text 18 36 - this object has nothing to do with percentage!;
+#X text 18 56 - a modulus is a number by which two given numbers can
+be divided and produce the same remainder.;
+#X text 18 86 - in the example below: 9 / 2 = 4.5 \, and 7 / 2 = 3.5.
+Hence if 7 and 9 are divided by 2 \, then the remainder of both equations
+is .5. Therefore \, the modulus of 7 and 9 is "2".;
+#X msg 21 135 9;
+#X obj 21 163 % 7;
+#X floatatom 55 135 5 0 0 0 - - -;
+#X text 18 214 Note that the modulus operator is not a "bitwise" operator
+\, but a math function.;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (binops2-3) Modulus [%];
+#X connect 4 0 5 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X restore 281 562 pd understanding_%_modulus;
+#N canvas 87 181 428 280 understanding_&_AND 0;
+#X obj 174 221 &;
+#X floatatom 228 187 5 0 0 0 - - -;
+#X floatatom 270 188 5 0 0 0 - - -;
+#X msg 174 164 13;
+#X msg 203 165 9;
+#X text 26 119 13 = "1101";
+#X text 32 131 9 = "1001";
+#X text 19 144 Hence:"1001";
+#X obj 174 124 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 174 142 t b b;
+#X floatatom 174 243 0 0 0 0 - - -;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 18 35 [&] -- This is the bitwise AND operator which returns
+a "1" for each bit position where the corresponding bits of both its
+operands are "1".;
+#X text 19 77 When comparing the binary codes for 13 and 9 (below)
+\, we can see that the first and fourth digits of both codes are "1".
+Hence the result will be "1001" -- in other words "9".;
+#X text 7 1 (binops2-3) The [&] Object;
+#X connect 0 0 10 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 0 1;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 9 1 4 0;
+#X restore 281 430 pd understanding_&_AND;
+#N canvas 92 219 428 293 understanding_|_OR 0;
+#X floatatom 137 261 0 0 0 0 - - -;
+#X floatatom 191 205 5 0 0 0 - - -;
+#X floatatom 233 206 5 0 0 0 - - -;
+#X msg 137 177 13;
+#X msg 166 178 9;
+#X text 26 131 13 = "1101";
+#X text 32 143 9 = "1001";
+#X obj 137 137 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 137 155 t b b;
+#X text 19 156 Hence:"1101";
+#X obj 137 239 |;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (binops2-3) Related Objects;
+#X text 17 35 [|] -- This is the bitwise OR operator which returns
+a "1" for each bit position where one OR both of the corresponding
+bits of both its operands is a "1".;
+#X text 18 77 When comparing the binary codes for 13 and 9 (below)
+\, we can see that the first and fourth digits of both codes are both
+1 and the second position of 13 is a one. Hence the result will be
+"1101" -- in other words "13".;
+#X connect 1 0 10 0;
+#X connect 2 0 10 1;
+#X connect 3 0 10 0;
+#X connect 4 0 10 1;
+#X connect 7 0 8 0;
+#X connect 8 0 3 0;
+#X connect 8 1 4 0;
+#X connect 10 0 0 0;
+#X restore 281 452 pd understanding_|_OR;
+#N canvas 94 256 428 294 understanding_<<_LEFT-SHIFT 0;
+#X obj 21 149 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 21 167 t b b;
+#X msg 21 188 13;
+#X obj 21 229 <<;
+#X floatatom 21 251 5 0 0 0 - - -;
+#X msg 49 188 2;
+#X floatatom 87 200 5 0 0 0 - - -;
+#X floatatom 135 200 5 0 0 0 - - -;
+#X text 18 35 [<<] -- This is the left shift operator and it works
+by shifting the digits of the binary representation of the first operand
+(left inlet) to the left by the number of places specified by the second
+operand (right inlet). The spaces created to the right are filled by
+zeros \, and any digits falling off the left are discarded. The following
+code returns 52 as the binary of 13 ("1101") is shifted two places
+to the left giving "110100":;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (binops2-3) Left-shift;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 1 5 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 3 1;
+#X connect 6 0 3 0;
+#X connect 7 0 3 1;
+#X restore 281 474 pd understanding_<<_LEFT-SHIFT;
+#N canvas 82 206 428 348 understanding_>>_RIGHT-SHIFT 0;
+#X obj 21 162 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 21 180 t b b;
+#X floatatom 21 264 5 0 0 0 - - -;
+#X floatatom 87 213 5 0 0 0 - - -;
+#X floatatom 135 213 5 0 0 0 - - -;
+#X msg 21 201 13;
+#X obj 21 242 >>;
+#X msg 49 201 2;
+#X text 18 35 [>>] -- This is the sign-propagating right shift operator
+which shifts the digits of the binary representation of the first operand
+(left inlet) to the right by the number of places specified by the
+second operand (right inlet) \, discarding any shifted off to the right.
+The copies of the leftmost bit are added on from the left \, thereby
+preserving the sign of the number. This next examples returns 3 ("11")
+as the two right-most bits of 13 ("1101") are shifted off to the right
+and discarded.;
+#X text 13 291 Note that this object preserves negative values for
+negative operands. ("sign-propagating").;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (binops2-3) Right-shift;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 1 1 7 0;
+#X connect 3 0 6 0;
+#X connect 4 0 6 1;
+#X connect 5 0 6 0;
+#X connect 6 0 2 0;
+#X connect 7 0 6 1;
+#X restore 281 496 pd understanding_>>_RIGHT-SHIFT;
+#N canvas 94 222 428 418 understanding_&&_LOGICAL-AND 0;
+#X msg 52 259 5;
+#X obj 21 309 &&;
+#X floatatom 21 329 5 0 0 0 - - -;
+#X floatatom 190 267 5 0 0 0 - - -;
+#X text 18 36 [&&] - This is the logical AND operator \, which returns
+a Boolean true (a one) if both operands are true. Logically it follows
+that if the first operand is false \, then the whole expression is
+false \, and this is how the objects works: It first evaluates the
+left hand operand (left inlet) and if this returns false (zero) then
+\, without going any further \, it returns a false (a zero). Otherwise
+it returns the value of the second operand (right inlet).;
+#X floatatom 233 267 5 0 0 0 - - -;
+#X text 18 354 Note that this is not a bitwise operator. It compares
+floats.;
+#X obj 21 217 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 21 235 t b b;
+#X msg 21 259 17;
+#X text 18 145 In other words \, IF the left inlet is zero \, THEN
+output zero. ELSEIF the left inlet is non-zero AND the right inlet
+is zero \, then output zero. ELSEIF the left inlet is non-zero AND
+the right inlet is non-zero \, THEN output non-zero!;
+#X obj 87 217 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 87 235 t b b;
+#X msg 87 259 17;
+#X msg 118 259 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (binops2-3) Logical-and;
+#X connect 0 0 1 1;
+#X connect 1 0 2 0;
+#X connect 3 0 1 0;
+#X connect 5 0 1 1;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 1 0 0;
+#X connect 9 0 1 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 14 0;
+#X connect 13 0 1 0;
+#X connect 14 0 1 1;
+#X restore 281 518 pd understanding_&&_LOGICAL-AND;
+#N canvas 105 196 428 400 understanding_||_LOGICAL-OR 0;
+#X msg 52 250 5;
+#X floatatom 21 320 5 0 0 0 - - -;
+#X floatatom 192 251 5 0 0 0 - - -;
+#X floatatom 235 251 5 0 0 0 - - -;
+#X text 18 345 Note that this is not a bitwise operator. It compares
+floats.;
+#X obj 21 208 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 21 226 t b b;
+#X msg 21 250 17;
+#X text 18 35 [||] -- This is the logical OR operator and it returns
+a value of true (non-zero) if one or both of the operands is true.
+It works by first evaluating the left-hand operand (left inlet) and
+\, if this is true \, diregarding the right-hand operand (right inlet)
+and returning a non-zero. If \, however \, the left-hand operand (left
+inlet) is false \, then it returns the value of the right-hand operand
+(right inlet).;
+#X text 18 146 In other words \, IF the left inlet is non-zero \, THEN
+output non-zero. ELSEIF the left inlet is zero AND the right inlet
+is zero \, then output zero. ELSEIF the left inlet is zero AND the
+right inlet is non-zero \, THEN output non-zero!;
+#X obj 21 300 ||;
+#X obj 92 207 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 92 225 t b b;
+#X msg 92 249 0;
+#X msg 123 249 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 (binops2-3) Logical-or;
+#X connect 0 0 10 1;
+#X connect 2 0 10 0;
+#X connect 3 0 10 1;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 1 0 0;
+#X connect 7 0 10 0;
+#X connect 10 0 1 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 14 0;
+#X connect 13 0 10 0;
+#X connect 14 0 10 1;
+#X restore 281 540 pd understanding_||_LOGICAL-OR;
+#X text 98 385 Relational Operators;
+#X text 278 385 Logical Operators;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#N canvas 76 63 428 577 Relational_Operators 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X floatatom 227 354 0 0 0 0 - - -;
+#X floatatom 277 433 0 0 0 0 - - -;
+#X obj 227 333 >;
+#X obj 277 412 ==;
+#X obj 64 130 == 42;
+#X floatatom 64 109 5 0 0 0 - - -;
+#X floatatom 38 156 2 0 0 0 - - -;
+#X obj 63 155 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 34 105 42;
+#X text 19 87 For example: IF 42 is equal to x \, then "1" (True);
+#X text 83 147 Note that the object outputs 1 or 0 with every incoming
+message.;
+#X text 20 179 All of these objects operate the same way. The right
+inlet or creation argument sets the "condition" to which the incoming
+messages are compared. The left inlet accepts numbers or a "bang" --
+a number will reset the value and output a true or false (1 or 0) depending
+on whether or not the incoming value meets the necessary condition.
+A "bang" will force the object to output a true or false (1 or 0) based
+on the value that is already stored in the left inlet.;
+#X floatatom 35 280 5 0 0 0 - - -;
+#X floatatom 73 280 5 0 0 0 - - -;
+#X text 20 278 a;
+#X text 113 279 b;
+#X text 98 355 Is a greater than b?;
+#X floatatom 252 394 0 0 0 0 - - -;
+#X text 52 394 Is a greater than or equal to b?;
+#X obj 252 373 >=;
+#X text 171 433 Is a equal to b?;
+#X obj 305 450 !=;
+#X floatatom 305 470 0 0 0 0 - - -;
+#X obj 335 283 r a_b;
+#X obj 335 302 unpack f f;
+#X obj 35 334 pack f f;
+#X obj 35 354 s a_b;
+#X text 177 471 Is a NOT equal to b?;
+#X floatatom 331 508 0 0 0 0 - - -;
+#X text 220 508 Is a less than b?;
+#X obj 331 488 <;
+#X floatatom 356 547 0 0 0 0 - - -;
+#X obj 356 527 <;
+#X text 173 547 Is a less than or equal to b?;
+#X text 18 36 Most relational operators output a boolean value: true
+or false (1 or 0) depending on the relation between the input (left
+inlet) and the condition (right inlet or creation argument).;
+#X obj 73 306 t b a;
+#X text 7 1 (binops2-3) Relational Operators;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 7 0;
+#X connect 5 0 8 0;
+#X connect 6 0 5 0;
+#X connect 9 0 5 0;
+#X connect 13 0 26 0;
+#X connect 14 0 36 0;
+#X connect 20 0 18 0;
+#X connect 22 0 23 0;
+#X connect 24 0 25 0;
+#X connect 25 0 3 0;
+#X connect 25 0 20 0;
+#X connect 25 0 4 0;
+#X connect 25 0 22 0;
+#X connect 25 0 31 0;
+#X connect 25 0 33 0;
+#X connect 25 1 3 1;
+#X connect 25 1 20 1;
+#X connect 25 1 4 1;
+#X connect 25 1 22 1;
+#X connect 25 1 31 1;
+#X connect 25 1 33 1;
+#X connect 26 0 27 0;
+#X connect 31 0 29 0;
+#X connect 33 0 32 0;
+#X connect 36 0 26 0;
+#X connect 36 1 26 1;
+#X restore 101 408 pd Relational_Operators;
+#N canvas 79 189 428 247 Logical_Operators 0;
+#X obj -1 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 7 1 (binops2-3) Logical Operators-- a.k.a. "Bit Twiddling"
+;
+#X text 24 26 These objects are adopted from the mother of all object
+oriented languages: C. They are "bitwise" operators which perform logical
+and shift operations on 32-bit numbers.;
+#X text 17 194 Hence \, performing "bitwise" relational tests means
+that Pd can compare "1101" to "1001" instead of operating with the
+integers that are represented by those binary codes.;
+#X text 17 116 Well \, these objects perform "relational" tests on
+the binary forms of 32-bit numbers. For example \, the number 13 is
+represented in your computer's operating system in binary code by "1101"
+and the number 9 is "1001". Each of those binary digits is an 8-bit
+word: 8 bits * 4 digits = 32-bits!;
+#X obj -1 80 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 7 81 What does "bitwise" mean?;
+#X restore 281 408 pd Logical_Operators;
+#X connect 31 0 33 0;
+#X connect 32 0 33 1;
+#X connect 33 0 34 0;
+#X connect 35 0 33 0;
+#X connect 47 0 33 0;
diff --git a/doc/pddp/outlet-help.pd b/doc/pddp/outlet-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9192e4ebb656e4f1cff2372db8b0556911460975
--- /dev/null
+++ b/doc/pddp/outlet-help.pd
@@ -0,0 +1,97 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header outlet 3 12 0 18
+-204280 -1 0;
+#X obj 0 399 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION control outlet for a subpatch;
+#X text 12 65 INLET_0 anything;
+#X text 12 5 KEYWORDS control nonlocal canvas_op;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 483 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 511 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 2 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 44 inlet;
+#X obj 67 44 outlet;
+#X obj 118 44 inlet~;
+#X obj 168 44 outlet;
+#X obj 216 44 block~;
+#X text 266 44 [switch~];
+#X text 8 3 [outlet] Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 78 408 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 407 anything;
+#X text 98 487 (none);
+#X text 98 515 (none);
+#X text 11 23 control outlet for a subpatch;
+#X obj 477 3 outlet;
+#X obj 451 20 pddp/pddplink http://wiki.puredata.info/en/outlet -text
+pdpedia: outlet;
+#X text 167 515 - a symbolic argument to an [outlet] object which will
+be ignored. However \, [outlet] will not create if you give it an initial
+float argument.;
+#X obj 373 259 print~;
+#X obj 373 199 sig~ 12;
+#X floatatom 130 203 0 0 0 0 - - -;
+#X floatatom 130 255 0 0 0 0 - - -;
+#X text 100 182 messages in and out;
+#X text 343 176 audio in and out;
+#X obj 373 237 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#N canvas 50 247 428 293 subpatch-with-inlets-and-outlets 0;
+#X obj 67 68 inlet;
+#X text 19 38 control inlet for receiving messages;
+#X floatatom 67 96 0 0 0 0 - - -;
+#X floatatom 67 218 0 0 0 0 - - -;
+#X obj 67 250 outlet;
+#X text 19 188 control outlet for sending message;
+#X obj 339 84 inlet~;
+#X obj 339 135 print~;
+#X msg 354 109 bang;
+#X obj 339 243 outlet~;
+#X obj 339 217 sig~ 34;
+#X text 332 38 same for;
+#X text 333 57 signals.;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [outlet] Creating Inlets/Outlets on Subpatches;
+#X connect 0 0 2 0;
+#X connect 3 0 4 0;
+#X connect 6 0 7 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X restore 130 229 pd subpatch-with-inlets-and-outlets;
+#X text 98 127 The subpatch below shows how to use [inlet] \, [inlet~]
+\, [outlet] \, and [outlet~] objects to get data into and out of a
+subpatch:;
+#X text 98 77 The [outlet] object allows messages to be sent from objects
+in a subpatch to objects on the parent canvas.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 168 407 - the inlet passes any message sent to [outlet] to
+the outlet of canvas in which it is contained. When multiple [outlet~]
+and/or [outlet] objects are in one subpatch \, their horizontal order
+corresponds to the outlets drawn on the containing object in the parent
+patch.;
+#X connect 17 0 23 1;
+#X connect 18 0 23 0;
+#X connect 22 0 16 0;
+#X connect 23 0 19 0;
+#X connect 23 1 16 0;
diff --git a/doc/pddp/outlet~-help.pd b/doc/pddp/outlet~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e86d6729c0f8216b156e3ee672e086d1d3ea6cbc
--- /dev/null
+++ b/doc/pddp/outlet~-help.pd
@@ -0,0 +1,181 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header outlet~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 347 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION signal outlet for a subpatch;
+#X text 12 65 INLET_0 signal;
+#X text 12 5 KEYWORDS signal nonlocal canvas_op;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 429 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 459 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 inlet;
+#X obj 67 43 outlet;
+#X obj 118 43 inlet~;
+#X obj 168 43 outlet;
+#X obj 225 43 block~;
+#X text 8 2 [outlet~] Related Objects;
+#X text 274 43 [switch~];
+#X restore 102 598 pd Related_objects;
+#X text 98 436 (none);
+#X text 11 23 signal outlet for a subpatch;
+#X obj 477 3 outlet~;
+#X obj 446 20 pddp/pddplink http://wiki.puredata.info/en/outlet~ -text
+pdpedia: outlet~;
+#X obj 369 259 print~;
+#X obj 369 199 sig~ 12;
+#X floatatom 126 203 0 0 0 0 - - -;
+#X floatatom 126 255 0 0 0 0 - - -;
+#X text 96 182 messages in and out;
+#X text 339 176 audio in and out;
+#X obj 369 237 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#N canvas 50 247 428 293 subpatch-with-inlets-and-outlets 0;
+#X obj 67 68 inlet;
+#X text 19 38 control inlet for receiving messages;
+#X floatatom 67 96 0 0 0 0 - - -;
+#X floatatom 67 218 0 0 0 0 - - -;
+#X obj 67 250 outlet;
+#X text 19 188 control outlet for sending message;
+#X obj 339 84 inlet~;
+#X obj 339 135 print~;
+#X msg 354 109 bang;
+#X obj 339 243 outlet~;
+#X obj 339 217 sig~ 34;
+#X text 332 38 same for;
+#X text 333 57 signals.;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [outlet~] Creating Inlets/Outlets on Subpatches;
+#X connect 0 0 2 0;
+#X connect 3 0 4 0;
+#X connect 6 0 7 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X restore 126 229 pd subpatch-with-inlets-and-outlets;
+#X text 98 127 The subpatch below shows how to use [inlet] \, [inlet~]
+\, [outlet] \, and [outlet~] objects to get data into and out of a
+subpatch:;
+#X obj 78 356 cnv 17 3 60 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 355 signal;
+#X text 98 77 The [outlet~] object allows signals to be sent from a
+subpatch to objects on the parent canvas.;
+#N canvas 60 123 428 466 up/downsampling 0;
+#X obj 30 396 print~;
+#X obj 48 370 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 112 396 print~;
+#X obj 130 372 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 195 396 print~;
+#X obj 213 370 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-tab 64 float 3;
+#A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
+#X coords 0 1 64 -1 200 140 1;
+#X restore 216 181 graph;
+#X obj 274 368 s \$0-tab;
+#X msg 274 341 const 0 \, 0 0 1;
+#X obj 145 233 print~;
+#X obj 145 208 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 23 181 tabreceive~ \$0-tab;
+#N canvas 81 269 585 267 test-subpatch-upsampled 0;
+#X obj 40 17 block~ 128 1 2;
+#X obj 209 149 inlet~ hold;
+#X obj 367 153 inlet~ lin;
+#X obj 23 202 print~;
+#X obj 41 176 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 209 209 print~;
+#X obj 227 183 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 366 213 print~;
+#X obj 383 187 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 42 49 Upsampling methods:;
+#X text 206 114 sample/hold;
+#X text 337 111 linear interpolation;
+#X text 16 114 interleaved zeros;
+#X obj 23 146 inlet~;
+#X connect 1 0 5 0;
+#X connect 2 0 7 0;
+#X connect 4 0 3 0;
+#X connect 6 0 5 0;
+#X connect 8 0 7 0;
+#X connect 13 0 3 0;
+#X restore 23 285 pd test-subpatch-upsampled;
+#N canvas 46 43 585 267 test-subpatch-downsampled 0;
+#X obj 23 146 outlet~;
+#X obj 209 149 outlet~ hold;
+#X obj 367 153 outlet~ lin;
+#X text 206 173 sample/hold;
+#X text 364 177 linear interpolation;
+#X text 197 19 upsampling methods:;
+#X obj 40 17 block~ 32 1 0.5;
+#X text 18 169 interleaved zeros;
+#X obj 21 83 tabreceive~ \$0-tab;
+#X connect 8 0 0 0;
+#X connect 8 0 1 0;
+#X connect 8 0 2 0;
+#X restore 29 340 pd test-subpatch-downsampled;
+#X text 20 38 When a subpatch is reblocked to a higher or lower sample
+rate \, the inlet~ and outlet~ objects offer a choice of three upsampling
+methods. (The inlet~ upsamples when entering a subpatch with a higher
+sample rate \; the outlet~ upsamples when leaving a subpatch of _lower_
+sample rate \, as demonstrated below.) There is no corresponding choice
+of downsampling method - downsampling is done simply by dropping the
+extra samples.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [outlet~] Up/downsampling;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 5 0 4 0;
+#X connect 8 0 7 0;
+#X connect 10 0 9 0;
+#X connect 11 0 12 1;
+#X connect 11 0 12 2;
+#X connect 11 0 9 0;
+#X connect 11 0 12 0;
+#X connect 13 0 0 0;
+#X connect 13 1 2 0;
+#X connect 13 2 4 0;
+#X restore 171 538 pd up/downsampling;
+#X text 80 477 1) symbol atom;
+#X text 168 477 - (optional) The word "hold" will cause sample/hold
+upsampling/downsampling \, and the word "lin" will cause linear upsampling/downsampling.
+See the subpatch below for more details:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 168 355 - the [outlet~] object passes a signal to the outlet
+of the subpatch in the parent canvas. When multiple [outlet~] and/or
+[outlet] objects are in one subpatch \, their horizontal order corresponds
+with the outlets drawn on the containing object in the parent patch.
+;
+#X connect 13 0 19 1;
+#X connect 14 0 19 0;
+#X connect 18 0 12 0;
+#X connect 19 0 15 0;
+#X connect 19 1 12 0;
diff --git a/doc/pddp/output~-help.pd b/doc/pddp/output~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4de09ddef9accf731d6d45ea4d060b07dcf8cdb2
--- /dev/null
+++ b/doc/pddp/output~-help.pd
@@ -0,0 +1,89 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header output~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 307 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 368 META 0;
+#X text 12 225 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 265 HELP_PATCH_AUTHORS Jonathan Wilkes;
+#X text 12 205 AUTHOR Hans Christoph Steiner;
+#X text 12 5 KEYWORDS signal abstraction;
+#X text 12 25 LICENSE GPL;
+#X text 12 45 DESCRIPTION gui volume and DSP control;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_1 signal;
+#X text 12 105 INLET_2 float;
+#X text 12 125 OUTLET_0 signal;
+#X text 12 145 OUTLET_1 signal;
+#X text 12 165 OUTLET_2 float;
+#X text 12 245 RELEASE_DATE 2009;
+#X text 12 185 LIBRARY PDDP;
+#X restore 500 597 pd META;
+#X obj 0 401 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 498 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 502 (none);
+#N canvas 103 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 29 38 dac~;
+#X text 8 2 [output~] Related Objects;
+#X obj 26 61 pddp/helplink pddp/dsp;
+#X restore 102 597 pd Related_objects;
+#X obj 78 316 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 410 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 342 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/output~ -text
+pdpedia: output~;
+#X obj 107 167 osc~ 200;
+#X obj 377 170 noise~;
+#X obj 106 205 output~;
+#X obj 376 205 output~;
+#X text 174 227 <- mute;
+#X text 176 208 <- dsp toggle (green = on );
+#X text 98 315 signal;
+#X text 98 341 signal;
+#X obj 78 367 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 366 float;
+#X text 167 366 - the right inlet can be used to set the volume (range
+is 0-1).;
+#X text 98 409 signal;
+#X obj 78 440 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 439 signal;
+#X obj 78 470 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 469 float;
+#X text 90 101 The [output~] abstraction is a user-friendly GUI substitute
+for [dac~] \, with controls for "compute audio" \, volume \, and a
+mute button.;
+#X text 99 530 This object is used in the audio tutorials \, and can
+be used in any patch to quickly hear and control the level of an audio
+signal.;
+#X text 11 23 GUI- volume and DSP control;
+#X text 168 315 - incoming signal which will be routed to the left
+channel.;
+#X text 167 341 - incoming signal which will be routed to the right
+channel.;
+#X text 168 469 - current volume level (range is from 0-1).;
+#X text 168 439 - the incoming signal from the middle inlet filtered
+and passed unchanged to this outlet.;
+#X text 168 409 - the incoming signal from the leftmost inlet is filtered
+and passed to this outlet.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 99 572 pddp/pddplink ../3.audio.examples/A05.output.subpatch.pd
+-text doc/3.audio.examples/A05.output.subpatch.pd;
+#X connect 13 0 15 0;
+#X connect 13 0 15 1;
+#X connect 14 0 16 1;
+#X connect 14 0 16 0;
diff --git a/doc/pddp/pack-help.pd b/doc/pddp/pack-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..013cce5c0de220fde052faa88c6f70860d729f3b
--- /dev/null
+++ b/doc/pddp/pack-help.pd
@@ -0,0 +1,210 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pack 3 12 0 18 -204280
+-1 0;
+#X obj 0 113 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 245 494 370 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 26 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 45 DESCRIPTION combine several atoms into one message;
+#X text 12 65 INLET_0 anything;
+#X text 12 85 INLET_N float symbol pointer;
+#X text 12 105 OUTLET_0 list symbol pointer float;
+#X text 12 5 KEYWORDS control needs_work list_op;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 394 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 459 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 565 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 98 318 428 296 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pack] Related Objects;
+#X text 20 163 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 19 212 The best places to find information about Pd's libraries
+is:;
+#X text 16 234 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 17 250 or;
+#X text 18 264 iem.kug.ac.at/pdb/;
+#X obj 20 36 pddp/helplink zexy/pack~;
+#X obj 20 51 pddp/helplink zexy/unpack~;
+#X obj 20 66 pddp/helplink zexy/tabdump;
+#X obj 20 81 pddp/helplink zexy/niagara;
+#X obj 20 96 pddp/helplink zexy/packel;
+#X obj 20 111 pddp/helplink zexy/repack;
+#X obj 20 126 pddp/helplink zexy/drip;
+#X obj 20 141 pddp/helplink zexy/sort;
+#X restore 102 597 pd Related_objects;
+#X obj 78 120 cnv 17 3 225 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 266 list;
+#X obj 78 401 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 350 cnv 17 3 37 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 493 3 pack;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/pack -text
+pdpedia: pack;
+#X text 98 186 symbol;
+#X text 98 119 bang;
+#X text 98 147 float;
+#X text 98 226 pointer;
+#X text 98 400 list;
+#N canvas 82 45 428 551 pack_peculiarities 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X msg 25 103 bang;
+#X obj 25 123 pack 100 0 s 42;
+#X text 25 162 In the same example \, this [pack] object will recognize
+floats in the first \, second \, and fourth inlet \; it will recognize
+symbols in the third inlet. If it receives anything else \, then you'll
+see the "no method for ___" error message in the terminal window.;
+#X obj 26 282 pack 100 0 s 42;
+#X msg 26 238 400 1 cat 38;
+#X text 111 238 This works.;
+#X msg 38 260 cat dog 42 earth;
+#X obj 31 448 pack cat;
+#X text 25 333 So \, if [pack] understands that "100" is a float and
+can therefore understand all incoming numbers to that inlet...then
+you might assume that the word "cat" could be written as a creation
+argument and [pack] should understand all incoming symbols. But that's
+NOT the case. If you try to define a [pack] symbol with the word "cat"
+in a creation argument \, you'll get a "bad type" error.;
+#X text 39 430 WRONG;
+#X obj 143 452 pack symbol;
+#X text 223 442 CORRECT;
+#X obj 143 473 print this_package;
+#X msg 143 431 cat;
+#X text 41 298 Note that the "s" above is an abbreviation for "symbol".
+;
+#X obj 31 525 pack bang;
+#X text 30 492 Same problem with bangs! This [pack] object creates
+an error.;
+#X obj 25 144 print package_1;
+#X obj 26 315 print package_2;
+#X text 145 261 This doesn't work - the data types;
+#X text 144 278 don't correspond with the arguments.;
+#X text 20 32 In the example below \, the creation arguments are "100"
+\, "0" \, a "symbol" \, and "42". Hence \, when [pack] receives a bang
+\, it will send that information to its outlet as a list - or 'package'
+- which will be printed in your terminal window.;
+#X text 8 2 [pack] Peculiarities;
+#X connect 1 0 2 0;
+#X connect 2 0 18 0;
+#X connect 4 0 19 0;
+#X connect 5 0 4 0;
+#X connect 7 0 4 0;
+#X connect 11 0 13 0;
+#X connect 14 0 11 0;
+#X restore 171 545 pd pack_peculiarities;
+#X text 168 400 - [pack] will output its package (i.e. \, the list
+of values) when it receives a message to its left inlet.;
+#N canvas 72 44 466 546 Another_example_using_pack 0;
+#X text 181 97 is the same as;
+#X obj 23 517 print my_package;
+#X msg 46 285 1 2 dog;
+#X obj 23 211 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 55 390 5 0 0 0 - - -;
+#X floatatom 53 343 5 0 0 0 - - -;
+#X msg 129 450 100 earth me 42;
+#X text 19 38 Perhaps the best way to build creation arguments is to
+define the data types that [pack] should expect at each inlet: (i.e.
+floats \, symbols \, or pointers -- or their abbreviations f \, s \,
+or p);
+#X obj 22 97 pack float symbol pointer;
+#X obj 276 98 pack f s p;
+#X msg 36 261 42 24 dog cat 1 2;
+#X obj 23 497 pack f f s s f f;
+#X text 42 205 Any message to the first inlet will force [pack] to
+output its package - its list of values. A bang to the first inlet
+will force [pack] to output the current values without resetting any
+of them.;
+#X text 101 380 This number box will update each of the 'float' values
+and will NOT output the package - because the first inlet is not receiving
+a message - to change this behavior \, you should explore the [trigger]
+object.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pack] Another Example;
+#X text 20 124 [pack] can be created with any number of creation arguments.
+There will be one inlet created for each argument and the values of
+each [pack]ed element can be updated at any time using the separate
+inlets \; or they can be updated simoultaneously with a list of messages
+to its first inlet.;
+#X text 151 261 This list contains new values for each item.;
+#X text 97 280 This list doesn't contain enough items \; so it resets
+only the first three items \, uses the previous values for the other
+three items \, and then outputs the entire package.;
+#X text 99 340 A new value for the first item will reset the it and
+force [pack] to output the entire package of stored values.;
+#X text 129 481 this list will cause an error.;
+#X text 128 467 Lists can only be sent to the first inlet --;
+#X connect 2 0 11 0;
+#X connect 3 0 11 0;
+#X connect 4 0 11 1;
+#X connect 4 0 11 4;
+#X connect 4 0 11 5;
+#X connect 5 0 11 0;
+#X connect 6 0 11 1;
+#X connect 10 0 11 0;
+#X connect 11 0 1 0;
+#X restore 101 573 pd Another_example_using_pack;
+#X obj 394 69 pack;
+#X obj 394 91 print;
+#X msg 432 46 2;
+#X floatatom 394 46 5 0 0 0 - - -;
+#X text 98 427 Note: [pack] may output a float \, symbol \, or pointer
+if only one argument is specified.;
+#X text 11 23 combine several atoms into one message;
+#X text 23 46 The [pack] object takes a series of inputs and then outputs
+a concatenated list. By default \, [pack] has two inlets \, each of
+which will accept a float.;
+#X text 168 147 - if the first argument is "float" \, "f" \, or a numeric
+value (e.g. \, "12" \, "3.4") the first element in the list will be
+set to the incoming value \, and [pack] will output its list.;
+#X text 168 266 - a list is distributed to among the inlets of [pack].
+Each element must match the atom-type specified by the creation arguments.
+Lists with more items than the total number of inlets will be truncated.
+;
+#X text 168 226 - if the first argument is "pointer" or "p" \, an incoming
+pointer will be set to the first item in the list \, and [pack] will
+output its list.;
+#X text 98 491 float;
+#X text 168 476 - the number of arguments determines the number of
+inlets (default is two). The symbols described under the "inlets" heading
+specify the atom-type of each inlet. You can also use a float to specify
+float-type while also initializing that inlet's value. Some peculiarities
+described below:;
+#X text 80 476 n) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 168 186 - if the first argument is "symbol" or "s" \, an incoming
+symbol will be set to the first item in the list \, and [pack] will
+output its list.;
+#X text 98 319 anything;
+#X text 168 119 - a "bang" to the first inlet will force [pack] to
+output the current package (i.e. \, the list of values).;
+#X text 168 319 - an anything will be converted to a list and distributed
+in the same manner as a list.;
+#X text 98 348 An inlet is created for each argument given. Each may
+store a float \, symbol \, or pointer \, depending on the argument
+given. These inlets will not accept lists/anythings.;
+#X connect 22 0 23 0;
+#X connect 24 0 22 1;
+#X connect 25 0 22 0;
diff --git a/doc/pddp/parazit-help.pd b/doc/pddp/parazit-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..44219d9c9f8e02d2efd0f5922f3c777e619ec8c9
--- /dev/null
+++ b/doc/pddp/parazit-help.pd
@@ -0,0 +1,5 @@
+#N canvas 365 216 454 304 12;
+#X obj 17 35 parazit;
+#X obj 17 64 s pd-name_of_your_patch.pd;
+#X text 15 6 Turned on from inside for maximum stealth;
+#X connect 0 0 1 0;
diff --git a/doc/pddp/path-help.pd b/doc/pddp/path-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..118b094e123101e9e4360c33fa8c17e4f9b2a1ed
--- /dev/null
+++ b/doc/pddp/path-help.pd
@@ -0,0 +1,84 @@
+#N canvas 252 22 555 619 10;
+#X declare;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header path 3 12 0 18 -204280
+-1 0;
+#X obj 0 294 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 344 META 0;
+#X text 12 125 PATH internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION load paths from a patch;
+#X text 12 65 INLET_0 bang rewind;
+#X text 12 85 OUTLET_0 symbol;
+#X text 12 105 OUTLET_1 bang;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 399 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 485 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 535 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 105 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [path] Related Objects;
+#X obj 22 42 declare;
+#X restore 102 597 pd Related_objects;
+#X obj 78 303 cnv 17 3 80 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 408 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 441 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 482 3 path;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/path -text
+pdpedia: path;
+#X msg 91 84 bang;
+#X symbolatom 102 188 0 0 0 0 - - -;
+#X obj 91 214 print;
+#X text 138 83 get next item in list of loaded libs;
+#X text 150 137 start at the top of the list again;
+#X msg 103 138 rewind;
+#X text 97 539 [path] appends directories to the canvas-local path.
+;
+#X text 98 302 bang;
+#X text 98 407 symbol;
+#X text 98 440 bang;
+#X obj 262 184 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 283 183 bang after the end of the list is reached;
+#X text 11 23 load paths from a patch;
+#X text 168 407 - a "bang" to the inlet of [path] sends a symbol to
+the left outlet which the name of a loaded path.;
+#X text 168 302 - sending a "bang" to [path] makes it output the loaded
+paths one at a time (i.e. \, one per bang).;
+#X text 167 440 - once [path] has output the last path in the list
+\, sending another "bang" to its inlet will cause a "bang" to be sent
+out its right outlet.;
+#X text 80 501 n) symbol atom;
+#X text 167 501 - the arguments to [path] specify the paths to load
+for patch.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 91 162 path ../lib abs;
+#X msg 98 111 append lib/extrahiddenstuff;
+#X text 274 109 add another path to the list;
+#X text 98 362 rewind;
+#X text 98 336 append;
+#X text 168 362 - resets to output at the top of the list of paths.
+;
+#X text 168 336 - add a path to the end of the list of paths.;
+#X connect 13 0 32 0;
+#X connect 18 0 32 0;
+#X connect 32 0 14 0;
+#X connect 32 0 15 0;
+#X connect 32 1 23 0;
+#X connect 33 0 32 0;
diff --git a/doc/pddp/pd-help.pd b/doc/pddp/pd-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8866f5dba4889727e8c94eee9c13d40a8400231b
--- /dev/null
+++ b/doc/pddp/pd-help.pd
@@ -0,0 +1,163 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pd 3 12 0 18 -204280
+-1 0;
+#X obj 0 175 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 271 494 344 META 0;
+#X text 12 105 PLATFORM windows macosx gnulinux;
+#X text 12 165 LIBRARY internal;
+#X text 12 205 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 225 RELEASE_DATE 2009-06-12;
+#X text 12 65 LICENSE SIBSD;
+#X text 12 185 AUTHOR Miller Puckette;
+#X text 12 245 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 NAME pd;
+#X text 12 25 ALIAS page;
+#X text 12 125 INLET_N anything signal;
+#X text 12 145 OUTLET_N anything signal;
+#X text 12 85 DESCRIPTION subwindow (subpatch);
+#X text 12 45 KEYWORDS signal canvas_op;
+#X restore 500 597 pd META;
+#X obj 0 302 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 432 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 78 289 428 356 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pd] Related Objects;
+#X obj 22 43 inlet;
+#X obj 22 73 outlet;
+#X obj 68 43 inlet~;
+#X obj 68 73 outlet;
+#X obj 128 43 table;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X coords 0 1 100 -1 200 140 1 0 0;
+#X restore 182 44 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 100 float 3;
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0;
+#X coords 0 1 100 -1 200 140 1;
+#X restore 23 203 graph;
+#X restore 102 598 pd Related_objects;
+#X obj 78 184 cnv 17 3 110 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X restore 394 3 pd;
+#X obj 431 20 pddp/pddplink http://wiki.puredata.info/en/pd -text pdpedia:
+pd;
+#X text 11 23 subwindow (subpatch);
+#X text 98 183 anything;
+#X text 98 242 signal;
+#X text 80 451 1) symbol atom;
+#X obj 78 311 cnv 17 3 110 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 310 anything;
+#X text 98 369 signal;
+#X obj 101 543 pddp/pddplink all_about_canvas_properties.pd -text all_about_canvas_properties
+;
+#X text 97 130 You can also change the graphical properties of the
+object so that part of the subwindow is visible on the parent (referred
+to as "graph on parent" or "gop").;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X restore 513 3 page;
+#X text 419 3 or (deprecated);
+#X floatatom 242 86 5 0 0 0 - - -;
+#X text 309 80 For help on inlets/outlets \, see:;
+#X obj 308 95 pddp/pddplink inlet-help.pd -text inlet-help;
+#X obj 308 110 pddp/pddplink inlet~-help.pd -text inlet~-help;
+#X obj 398 95 pddp/pddplink outlet-help.pd -text outlet-help;
+#X obj 398 110 pddp/pddplink outlet~-help.pd -text outlet~-help;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 100 560 pddp/pddplink ../2.control.examples/12.PART2.subpatch.pd
+-text doc/2.control.examples/12.PART2.subpatch.pd;
+#X obj 100 575 pddp/pddplink ../3.audio.examples/G05.execution.order.pd
+-text doc/3.audio.examples/G05.execution.order.pd;
+#N canvas 559 53 296 107 window_position 1;
+#X text 19 8 If you leave open a [pd] subwindow like;
+#X text 19 53 patch.;
+#X text 19 38 visible the next time you load the;
+#X text 19 23 this one and save the patch \, it will be;
+#X restore 382 550 pd window_position;
+#X text 97 42 The [pd] object provides a way to nest canvases. You
+can click on the object to open the subwindow and see the objects inside.
+;
+#N canvas 1 53 450 300 click_me 0;
+#X obj 26 50 inlet;
+#X obj 26 209 outlet;
+#X text 47 109 Use the [inlet] and [outlet] objects to add inlets and
+outlets to your subpatch.;
+#X obj 341 52 inlet;
+#X floatatom 341 79 5 0 0 0 - - -;
+#X text 46 147 The horizontal order of the [inlet]/[outlet] objects
+corresponds to the placement of the inlets/outlets on the [pd] object
+itself. I.e. \, the leftmost inlet -> leftmost [inlet] \, rightmost
+inlet -> rightmost [inlet] \, and so on.;
+#X obj 342 205 outlet;
+#X connect 0 0 1 0;
+#X connect 3 0 4 0;
+#X restore 179 107 pd click_me;
+#X text 168 242 - you can create a signal inlet by placing an [inlet~]
+object inside the subpatch. If there are multiple [inlet~] objects
+\, their horizontal order corresponds to the inlets drawn on the [pd]
+object.;
+#X text 168 183 - for sending control messages \, you can create an
+inlet by placing an [inlet] object inside the subpatch. If there are
+multiple [inlet] objects \, their horizontal order corresponds to the
+inlets drawn on the [pd] object.;
+#X text 168 369 - you can create a signal outlet by placing an [outlet~]
+object inside the subpatch. If there are multiple [outlet~] objects
+\, their horizontal order corresponds to the outlets drawn on the [pd]
+object.;
+#X text 168 310 - for sending control messages you can create one by
+placing an [outlet] object inside the subpatch. If there are multiple
+[outlet] objects \, their horizontal order corresponds to the outlets
+drawn on the [pd] object.;
+#X text 167 451 - (optional) specify a name for the subwindow \, which
+you can use with the prefix "pd-" to send messages to the subpatch
+itself. Duplicate names are allowed (named messages will be passed
+to both subpatches). For ease of use \, Pd allows you to edit and change
+this argument without destroying the data inside the subpatch.;
+#N canvas 250 475 296 200 nesting 0;
+#N canvas 258 420 264 105 (subpatch) 0;
+#N canvas 252 328 240 113 (subpatch) 0;
+#N canvas 203 263 309 126 (subpatch) 0;
+#N canvas 240 228 264 118 thats-enough 0;
+#X text 84 38 Ok \, that's it.;
+#X text 70 53 For real this time.;
+#N canvas 264 187 272 64 Really? 0;
+#X text 2 27 Seriously \,;
+#N canvas 227 161 266 81 What? 0;
+#X text 3 58 You're being obsessive.;
+#N canvas 89 146 450 72 Who? 0;
+#N canvas 160 252 341 101 I 0;
+#X text 16 16 Third base!;
+#X restore 5 5 pd I don't know.;
+#X text 2 39 Who's on first.;
+#X restore 7 4 pd Who?;
+#X restore 7 0 pd What?;
+#X text 2 41 Stop.;
+#X restore 197 98 pd Really?;
+#X restore 2 102 pd thats-enough;
+#X text 44 24 Ok that's enough. These;
+#X text 44 39 windows will all go away when;
+#X text 44 53 you close the main patch.;
+#X restore 138 46 pd;
+#X text 70 46 Or this:;
+#X restore 105 60 pd;
+#X text 91 33 Or this:;
+#X restore 130 97 pd;
+#X text 19 23 You can of course nest [pd] objects;
+#X text 19 38 inside other [pd] objects \, like this:;
+#X restore 382 572 pd nesting;
+#X connect 22 0 33 1;
diff --git a/doc/pddp/pddp-style-guide.pd b/doc/pddp/pddp-style-guide.pd
new file mode 100644
index 0000000000000000000000000000000000000000..63f13eb9d96abf58827f9a73cea930a9451daec3
--- /dev/null
+++ b/doc/pddp/pddp-style-guide.pd
@@ -0,0 +1,36 @@
+#N canvas 102 76 462 561 10;
+#X text 15 30 design principles;
+#X text 50 50 - Make states visible and visibly distinguished;
+#X text 50 65 - Teach by example \, not by formalism;
+#X text 50 80 - Communicate visually;
+#X text 50 95 - Offer informative feedback;
+#X text 50 110 - Strive for consistency;
+#X text 50 125 - Avoid arbitrary syntax;
+#X text 50 140 - Use standard language;
+#X text 50 155 - Use the application's terminology;
+#X text 50 170 - Support clear conceptual models for documentation
+;
+#X text 50 185 - Respect the rules of human conversation;
+#X text 50 200 - Respond with an appropriate amount of information
+;
+#X obj 2 2 cnv 15 450 20 empty empty pddp-style-guide 2 11 1 18 -233017
+-66577 0;
+#X obj 418 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp
+;
+#X obj 101 522 pddp/pddplink standard_gui_elements.pd -text standard_gui_elements
+;
+#X text 15 230 Here are various text conventions for discussing various
+aspects of Pd in text:;
+#X text 30 300 "anything" \, "bang" \, "float" \, "list" \, "pointer"
+\, "symbol";
+#X text 15 330 objects:;
+#X text 30 349 [route] \, [set] \, [float] \, [symbol] \, [trigger]
+\, etc.;
+#X text 15 383 messages:;
+#X text 30 406 [send 1( \, [set 0( \,;
+#X text 17 280 reserved words:;
+#X text 15 441 Though an old term in the realm of the Max family of
+languages \, "abstraction" is a misleading term. Pd patches are either
+applications or objects. If a Pd patch is meant to be reused in other
+patches \, it is an object just like any other.;
+#X text 12 521 For more info:;
diff --git a/doc/pddp/pddp_open.pd b/doc/pddp/pddp_open.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c872aac54197c559543e3d69538b425046a59b6d
--- /dev/null
+++ b/doc/pddp/pddp_open.pd
@@ -0,0 +1,30 @@
+#N canvas 416 398 124 30 10;
+#X obj 107 2 inlet;
+#X msg 86 225 \; pd open \$1.pd \$2;
+#X obj 86 192 pack s s;
+#X obj 86 137 symbol;
+#X obj 108 111 t a b;
+#X obj 46 0 bng 18 250 50 0 \$0- \$0- empty 0 -6 0 8 -44926 -1 -1;
+#X obj 0 61 symbol \$1;
+#X obj 58 40 symbol;
+#X text 313 346 released under the GNU GPL;
+#X text 98 318 (C) Copyright 2005 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 90 63 <-- store the last value so that the GOP bang will open
+it;
+#X text 20 287 This patch opens a patch either from the first argument
+or sent in as a message.;
+#X obj 0 0 cnv 16 45 18 empty empty open: 6 9 0 14 -233017 -1 0;
+#X text 279 176 GOP: 168x18;
+#X obj 137 166 getdir;
+#X connect 0 0 4 0;
+#X connect 0 0 7 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 0;
+#X connect 4 1 14 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 7 0 6 1;
+#X connect 14 0 2 1;
+#X coords 0 0 1 1 124 18 1;
diff --git a/doc/pddp/pgmin-help.pd b/doc/pddp/pgmin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..db4df5f88ab96999eb71a5907360b9102f2a31cd
--- /dev/null
+++ b/doc/pddp/pgmin-help.pd
@@ -0,0 +1,101 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pgmin 3 12 0 18
+-204280 -1 0;
+#X obj 0 402 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 245 507 371 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION read incoming program change messages from
+the MIDI port;
+#X text 12 75 OUTLET_0 float;
+#X text 12 95 OUTLET_1 float;
+#X text 12 175 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 431 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 493 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 109 170 428 419 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pgmin] Related Objects;
+#X obj 74 80 ctlin;
+#X obj 217 80 pgmin;
+#X obj 24 80 bendin;
+#X obj 79 107 touchin;
+#X obj 261 80 polytouchin;
+#X obj 118 80 midiin;
+#X obj 23 107 sysexin;
+#X obj 179 167 noteout;
+#X obj 76 167 ctlout;
+#X obj 24 167 bendout;
+#X obj 366 167 touchout;
+#X obj 280 167 polytouchout;
+#X obj 123 167 midiout;
+#X obj 24 33 pgmout;
+#X obj 24 221 makenote;
+#X text 21 198 MIDI note construction:;
+#X text 21 140 MIDI output:;
+#X text 21 57 MIDI input:;
+#X obj 184 221 stripnote;
+#X obj 168 80 notein;
+#X text 181 198 MIDI note deconstruction:;
+#X text 21 265 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 20 344 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 21 246 Externals;
+#X obj 21 295 pddp/helplink maxlib/pitch;
+#X obj 21 310 pddp/helplink maxlib/score;
+#X obj 21 325 pddp/helplink maxlib/chord;
+#X obj 21 360 pddp/helplink cyclone/midiformat;
+#X obj 21 375 pddp/helplink cyclone/midiparse;
+#X obj 21 390 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X obj 78 440 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 483 3 pgmin;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/pgmin -text
+pdpedia: pgmin;
+#X text 95 134 The [pgmin] object reads incoming program change messages.
+;
+#X obj 231 162 pgmin;
+#X floatatom 231 212 5 0 0 0 - - -;
+#X floatatom 258 189 5 0 0 0 - - -;
+#X obj 230 245 pgmin 2;
+#X floatatom 230 267 5 0 0 0 - - -;
+#X text 98 407 (none);
+#X text 98 439 float;
+#X obj 78 465 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 464 float;
+#X text 168 407 - [pgmin] receives data directly from the MIDI port.
+;
+#X obj 371 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 571 for an explanation of MIDI usage in Pd see:;
+#X text 11 23 read incoming program change messages from the MIDI port
+;
+#X text 168 511 - with one (optional) argument (the MIDI channel number)
+[pgmin] creates only one outlet (for program change number received).
+The channel cannot be changed dynamically. With no argument \, [pgmin]
+accepts all channels.;
+#X text 168 439 (integer) program change number.;
+#X text 168 464 (integer) channel number.;
+#X text 80 511 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 12 0 13 0;
+#X connect 12 1 14 0;
+#X connect 15 0 16 0;
diff --git a/doc/pddp/pgmout-help.pd b/doc/pddp/pgmout-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..203934a185e33daa49c7c7d81487b7b3cfa14088
--- /dev/null
+++ b/doc/pddp/pgmout-help.pd
@@ -0,0 +1,103 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pgmout 3 12 0 18
+-204280 -1 0;
+#X obj 0 410 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION send program change messages to the MIDI
+port;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 477 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 504 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 110 171 428 419 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pgmout] Related Objects;
+#X obj 74 80 ctlin;
+#X obj 24 33 pgmin;
+#X obj 24 80 bendin;
+#X obj 79 107 touchin;
+#X obj 261 80 polytouchin;
+#X obj 118 80 midiin;
+#X obj 23 107 sysexin;
+#X obj 179 167 noteout;
+#X obj 76 167 ctlout;
+#X obj 24 167 bendout;
+#X obj 366 167 touchout;
+#X obj 280 167 polytouchout;
+#X obj 123 167 midiout;
+#X obj 231 167 pgmout;
+#X obj 24 221 makenote;
+#X text 21 198 MIDI note construction:;
+#X text 21 140 MIDI output:;
+#X text 21 57 MIDI input:;
+#X obj 184 221 stripnote;
+#X obj 168 80 notein;
+#X text 181 198 MIDI note deconstruction:;
+#X text 22 265 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 21 344 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 22 246 Externals;
+#X obj 22 295 pddp/helplink maxlib/pitch;
+#X obj 22 310 pddp/helplink maxlib/score;
+#X obj 22 325 pddp/helplink maxlib/chord;
+#X obj 22 360 pddp/helplink cyclone/midiformat;
+#X obj 22 375 pddp/helplink cyclone/midiparse;
+#X obj 22 390 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X obj 78 419 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 481 (none);
+#X text 98 418 float;
+#X obj 78 444 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 443 float;
+#X obj 371 571 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 570 for an explanation of MIDI usage in Pd see:;
+#X obj 477 3 pgmout;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/pgmout -text
+pdpedia: pgmout;
+#X obj 215 148 pgmout;
+#X floatatom 215 105 5 0 0 0 - - -;
+#X floatatom 248 126 5 0 0 0 - - -;
+#X obj 145 251 pgmout 2;
+#X floatatom 145 223 5 0 0 0 - - -;
+#X text 144 280 Send program change message on MIDI channel 2;
+#X floatatom 313 223 5 0 0 0 - - -;
+#X msg 358 222 2;
+#X obj 313 251 pgmout;
+#X text 11 23 send program change messages to the MIDI port;
+#X text 168 481 - [pgmin] sends data directly to the MIDI port.;
+#X text 80 522 1) float;
+#X text 168 418 - (integer) program change value.;
+#X text 168 443 - (integer) MIDI channel to send the program change
+message on.;
+#X text 168 522 - (optional) integer representing the MIDI channel
+to which the program change should be sent. Without an argument it
+will send on channel 1 by default.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 18 0 17 0;
+#X connect 19 0 17 1;
+#X connect 21 0 20 0;
+#X connect 23 0 25 0;
+#X connect 24 0 25 1;
diff --git a/doc/pddp/phasor~-help.pd b/doc/pddp/phasor~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8a5c0eadccb285bcb89183d2447486d5bf0198df
--- /dev/null
+++ b/doc/pddp/phasor~-help.pd
@@ -0,0 +1,86 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header phasor~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 339 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION sawtooth generator;
+#X text 12 65 INLET_0 float signal;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 438 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 474 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 547 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 109 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 osc~;
+#X obj 62 43 cos~;
+#X obj 103 43 tabread4~;
+#X text 8 2 [phasor~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 348 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 447 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 392 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 391 float;
+#X obj 471 3 phasor~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/phasor~ -text
+pdpedia: phasor~;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 100 float 0;
+#X coords 0 1 100 -1 200 100 1;
+#X restore 279 200 graph;
+#X obj 84 197 metro 500;
+#X floatatom 68 114 0 0 0 0 - - -;
+#X text 86 238 graph the output;
+#X text 97 114 <- specify frequency;
+#X obj 68 142 phasor~ 440;
+#X text 145 136 invoked with argument for non-signal input. Incoming
+messages override the initial value.;
+#X obj 84 172 loadbang;
+#X text 98 347 float;
+#X text 98 367 signal;
+#X text 98 411 list;
+#X text 98 446 signal;
+#X text 11 23 sawtooth generator;
+#X text 168 347 - a float sets the frequency of the sawtooth.;
+#X text 168 367 - incoming signal sets the frequency of the sawtooth.
+;
+#X text 167 391 - resets the phase (range is 0 to 1).;
+#X text 167 411 - a list will be truncated to the first element.;
+#X text 80 492 1) float;
+#X text 63 66 The [phasor~] object outputs a sawtooth signal \, traditionally
+used for table lookup via [cos~] or [tabread4~].;
+#X text 168 492 - (optional) with a floating-point argument \, [phasor~]
+takes floating-point messages to change frequency. If no argument is
+supplied \, the input is taken to be an audio signal.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 551 pddp/pddplink ../3.audio.examples/C02.sawtooth-foldover.pd
+-text doc/3.audio.exampmles/C02.sawtooth-foldover.pd;
+#X obj 98 566 pddp/pddplink ../3.audio.examples/J09.bandlimited.pd
+-text doc/3.audio.exampmles/J09.bandlimited.pd;
+#X obj 68 221 tabwrite~ \$0-array;
+#X connect 15 0 38 0;
+#X connect 16 0 19 0;
+#X connect 19 0 38 0;
+#X connect 21 0 15 0;
+#X connect 21 0 15 0;
diff --git a/doc/pddp/pipe-help.pd b/doc/pddp/pipe-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e6622a612ad12d18cbbaea315ce33659b6e69e2c
--- /dev/null
+++ b/doc/pddp/pipe-help.pd
@@ -0,0 +1,224 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pipe 3 12 0 18 -204280
+-1 0;
+#X obj 0 148 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 202 494 386 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control time;
+#X text 12 45 DESCRIPTION delay a message - a message "delay line"
+;
+#X text 12 65 INLET_0 float list symbol pointer bang flush clear;
+#X text 12 105 INLET_R float;
+#X text 12 85 INLET_N float list symbol pointer bang;
+#X text 12 125 OUTLET_N float symbol pointer;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 401 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 456 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 563 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 104 322 428 267 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 43 delay;
+#X obj 67 43 timer;
+#X text 8 2 [pipe] Related Objects;
+#X text 20 181 The best places to find information about Pd's libraries
+is:;
+#X text 21 203 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 22 218 or;
+#X text 21 233 iem.kug.ac.at/pdb/;
+#X text 20 132 This object is offered in Pd only if you have downloaded
+and properly installed the appropriate library. It may or may not exist
+in a single library.;
+#X obj 17 105 pddp/helplink iemlib/t3_delay;
+#X restore 102 597 pd Related_objects;
+#X obj 78 157 cnv 17 3 160 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 181 float;
+#X obj 78 410 cnv 17 3 40 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 374 cnv 17 3 17 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#X obj 492 3 pipe;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/pipe -text
+pdpedia: pipe;
+#X text 98 206 symbol;
+#X text 98 232 pointer;
+#X text 98 259 list;
+#X text 98 156 bang;
+#X text 98 286 flush;
+#X text 98 304 clear;
+#X obj 78 328 cnv 17 3 40 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 373 float;
+#N canvas 78 30 428 522 Creation_arguments 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pipe] Related Objects;
+#X obj 23 61 pipe 1000;
+#X obj 20 189 pipe s 1000;
+#X text 93 189 A pipe for symbols.;
+#X obj 20 282 pipe f s 1000;
+#X text 115 282 A pipe for one float \, and one symbol.;
+#X msg 20 159 symbol cat;
+#X msg 92 159 symbol dog;
+#X symbolatom 20 210 10 0 0 0 - - -;
+#X symbolatom 95 303 10 0 0 0 - - -;
+#X floatatom 20 303 5 0 0 0 - - -;
+#X msg 31 261 100 dog;
+#X msg 20 240 42 cat;
+#X floatatom 21 386 0 0 0 0 - - -;
+#X floatatom 21 494 0 0 0 0 - - -;
+#X obj 21 412 t f f f;
+#X obj 49 443 + 1;
+#X obj 77 443 + 2;
+#X floatatom 64 493 0 0 0 0 - - -;
+#X floatatom 108 494 0 0 0 0 - - -;
+#X obj 21 469 pipe f f f 1000;
+#X text 19 329 Miller's original example shows how a list of floats
+can be delayed by [pipe]. Note that the [trigger] object is used to
+ensure that [pipe] receives the messages from right to left order.
+;
+#X text 18 25 1) If only one creation argument is used \, it defines
+the initial length of delay. [pipe] will then expect a float.;
+#X text 17 87 2) If two or more arguments are provided \, then all
+except for the last will define the data type to be expected at the
+corresponding inlet. The delay time is initialized by the LAST creation
+argument \, which can be changed by sending a new delay time to the
+rightmost inlet.;
+#X text 72 240 Messages can be sent as lists like this example.;
+#X connect 3 0 9 0;
+#X connect 5 0 11 0;
+#X connect 5 1 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 3 0;
+#X connect 12 0 5 0;
+#X connect 13 0 5 0;
+#X connect 14 0 16 0;
+#X connect 16 0 21 0;
+#X connect 16 1 17 0;
+#X connect 16 2 18 0;
+#X connect 17 0 21 1;
+#X connect 18 0 21 2;
+#X connect 21 0 15 0;
+#X connect 21 1 19 0;
+#X connect 21 2 20 0;
+#X restore 170 543 pd Creation_arguments;
+#X text 168 304 - forces [pipe] to forget all stored messages.;
+#X text 168 259 - a list to the left inlet will be distributed among
+[pipe]'s inlets.;
+#X obj 95 104 pipe 1000;
+#X floatatom 126 53 5 0 0 0 - - -;
+#X msg 95 53 1;
+#X floatatom 95 126 5 0 0 0 - - -;
+#X floatatom 162 53 5 0 0 0 - - -;
+#N canvas 80 25 428 536 More_info 0;
+#X obj 1 451 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X text 20 80 Like water running through a pipe \, it goes in one end...runs
+the length of the pipe...then comes out the other end.;
+#X floatatom 23 127 5 0 0 0 - - -;
+#X obj 23 148 pipe 20;
+#X floatatom 23 170 5 0 0 0 - - -;
+#X text 20 38 The left inlet accepts numbers \, symbols \, pointers
+\, messages \, and lists. The right inlet adjusts the delay time (the
+length of the pipe).;
+#X floatatom 69 127 5 0 0 0 - - -;
+#X text 111 126 Adjust the length of the pipe.;
+#X floatatom 23 298 0 0 0 0 - - -;
+#X obj 23 391 pipe 2000;
+#X text 62 296 numbers to store and output later;
+#X text 88 319 output all stored messages immediately;
+#X msg 34 323 flush;
+#X msg 51 369 clear;
+#X text 99 369 forget all stored messages;
+#X text 19 199 [pipe] accepts two very important methods.;
+#X text 20 219 1 "flush": forces [pipe] to output all stored messages
+immediately.;
+#X text 20 248 2 "clear": forces [pipe] to forget all stored messages.
+;
+#X obj 23 412 print;
+#X msg 44 344 bang;
+#X text 80 344 output the most recently stored message;
+#X text 20 267 3 "bang": repeat the most recently stored message again.
+;
+#X text 20 473 [pipe] schedules its output immediately after storing
+the incoming messages. This means that the delay time can be changed
+at runtime without effecting the messages that have already been scheduled
+for output.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 449 Rescheduling;
+#X text 8 2 [pipe] More Info;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 6 0 3 1;
+#X connect 8 0 9 0;
+#X connect 9 0 18 0;
+#X connect 12 0 9 0;
+#X connect 13 0 9 0;
+#X connect 19 0 9 0;
+#X restore 101 572 pd More_info;
+#X text 11 23 delay a message - a message "delay line";
+#X text 169 93 The [pipe] object stores a sequence of messages and
+outputs them after a specified delay time in milliseconds. You can
+change the delay time as you wish. The outputs are sorted automatically.
+;
+#X text 80 475 1) float;
+#X text 98 490 symbol atom;
+#X text 168 156 - a bang will send the most recently stored message
+to the outlet after the specified delay time.;
+#X text 168 181 - a float to the left inlet will be stored \, then
+sent to the outlet after the specified delay.;
+#X text 168 232 - if the first argument to [pipe] is "p" \, an incoming
+pointer will be output after the specified delay.;
+#X text 168 206 - if the first argument to [pipe] is "s" \, an incoming
+symbol will be output after the specified delay.;
+#X msg 51 53 flush;
+#X msg 9 53 clear;
+#X text 168 286 - forces [pipe] to immediately output all stored messages.
+;
+#X text 168 373 - the rightmost inlet takes a float value that specifies
+the length of the delay (in milliseconds).;
+#X text 168 327 - an additional inlet is created for each argument
+provided to [pipe] besides the delay time. This makes it possible to
+send lists through [pipe].;
+#X text 98 422 symbol;
+#X text 98 409 float;
+#X text 98 435 pointer;
+#X text 168 409 - pipe can output symbols \, floats \, pointers. One
+outlet is created for each argument provided (besides the final argument
+to specify delay time).;
+#X text 167 475 - (optional) creation arguments define the data type
+to be expected at each inlet: "f" for float (or a float \, like "41"
+\, to initialize the value) \, "s" for symbol \, and "p" for pointer.
+The final argument defines the initial length of delay. See the subpatch
+below for more about the arguments:;
+#X obj 9 79 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 98 327 float;
+#X text 98 340 symbol;
+#X text 98 353 pointer;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 25 0 28 0;
+#X connect 26 0 25 0;
+#X connect 27 0 25 0;
+#X connect 29 0 25 1;
+#X connect 39 0 25 0;
+#X connect 40 0 25 0;
+#X connect 49 0 25 0;
diff --git a/doc/pddp/pique-help.pd b/doc/pddp/pique-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fbfc19851180ad1860ca44a5d4120908b4a7a849
--- /dev/null
+++ b/doc/pddp/pique-help.pd
@@ -0,0 +1,85 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pique 3 12 0 18
+-204280 -1 0;
+#X obj 0 422 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd 0.31. Jonathan Wilkes
+revised the patch to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS control analysis;
+#X text 12 45 DESCRIPTION find peaks in an FFT spectrum;
+#X text 12 65 INLET_0 list;
+#X text 12 85 OUTLET_0 list;
+#X restore 500 597 pd META;
+#X obj 0 487 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 108 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pique] Related Objects;
+#X obj 23 43 fft~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 431 cnv 17 3 50 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 496 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 482 3 pique;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/pique -text
+pdpedia: pique;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-fft-real 64 float 0;
+#X coords 0 64 63 -64 200 140 1;
+#X restore 21 85 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-fft-imag 64 float 0;
+#X coords 0 64 63 -64 200 140 1;
+#X restore 21 250 graph;
+#X text 98 495 list;
+#X obj 316 252 rfft~;
+#X obj 315 210 osc~ 2000;
+#X obj 368 265 metro 1000;
+#X obj 368 243 loadbang;
+#X obj 389 210 osc~ 5000;
+#X obj 244 171 pique;
+#X obj 244 198 print;
+#X text 98 430 list;
+#X text 168 430 - [pique] takes unwindowed FFT analyses as input. The
+message is made up of the following four items: the number of FFT points
+\, FFT real part (array name) \, FFT imaginary part (array name) \,
+and the maximum number of peaks to report;
+#X text 98 543 (none);
+#X text 11 23 find peaks in an FFT spectrum;
+#X text 168 495 - [pique] outputs a list of peaks \, giving their peak
+number \, frequency \, amplitude \, and phase (as a cosine/sine pair).
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 316 303 tabwrite~ \$0-fft-real;
+#X obj 344 338 tabwrite~ \$0-fft-imag;
+#X obj 244 117 f \$0;
+#X obj 244 92 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X msg 244 144 64 \$1-fft-real \$1-fft-imag 10;
+#X connect 15 0 29 0;
+#X connect 15 1 30 0;
+#X connect 16 0 15 0;
+#X connect 17 0 29 0;
+#X connect 17 0 30 0;
+#X connect 18 0 17 0;
+#X connect 19 0 15 0;
+#X connect 20 0 21 0;
+#X connect 31 0 33 0;
+#X connect 32 0 31 0;
+#X connect 33 0 20 0;
diff --git a/doc/pddp/plot-help.pd b/doc/pddp/plot-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..15667312149723aa5e4f7f5e53f95b36fe466d6c
--- /dev/null
+++ b/doc/pddp/plot-help.pd
@@ -0,0 +1,192 @@
+#N struct plot-help-template float x float y array array1 plot-help-array1-template
+array array2 plot-help-array2-template array array3 plot-help-array3-template
+;
+#N struct plot-help-array1-template float y;
+#N struct plot-help-array2-template float x float y;
+#N struct plot-help-array3-template float y float w;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header plot 3 12 0 18 -204280
+-1 0;
+#X obj 0 121 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 107 245 436 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd version 0.35. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control GUI data_structure array;
+#X text 12 45 DESCRIPTION draw array elements of scalars;
+#X text 12 65 INLET_0 float;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 205 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 229 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 109 428 428 163 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [plot] Related Objects;
+#X obj 172 53 struct;
+#X obj 222 53 drawpolygon;
+#X obj 97 53 drawsymbol;
+#X obj 302 53 drawcurve;
+#X text 17 89 Other Data Structure Objects;
+#X obj 255 123 element;
+#X obj 86 123 get;
+#X obj 117 123 set;
+#X obj 146 123 getsize;
+#X obj 200 123 setsize;
+#X obj 32 123 pointer;
+#X obj 26 53 drawnumber;
+#X restore 102 597 pd Related_objects;
+#X obj 78 130 cnv 17 3 65 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 129 float;
+#X text 98 183 list;
+#X obj 491 3 plot;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/plot -text
+pdpedia: plot;
+#N canvas 92 134 428 403 plot-help-data 0;
+#X scalar plot-help-template 32 98 \; 2 \; -32 \; 12 \; -54 \; -9 \;
+\; 0 0 \; 7 14 \; 27 -10 \; 0 -30 \; -40 0 \; 0 50 \; 60 0 \; \; 11
+7 \; 20 5 \; 22 14 \; -20 5 \; 20 11 \; -11 8 \; -17 16 \; \;;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 206 Above is a scalar defined by "plot-help-template". It
+contains three arrays \, each of which has an associated [plot] object
+that determines how they will be displayed.;
+#X text 7 1 [plot] Window to Display Data Structures;
+#X text 19 256 You can click and drag control points that correspond
+to the elements of an array.;
+#X text 19 286 If the [struct] that defines the array elements has
+a "y" field but no "x" field \, then you can click on one control point
+\, then drag horizontally to change multiple elements in one swipe
+(as you can with the "Put" menu array).;
+#X text 19 345 To see/edit the data itself \, select "properties" for
+the scalar by right clicking on the purple square.;
+#X restore 371 58 pd plot-help-data;
+#N canvas 96 163 428 436 plot-help-template 0;
+#X obj 22 42 plot array1 500 1 10 15 20;
+#X text 19 67 This first example plots the red trace (500) \, width
+1 \, at point (10 \, 15) \, with horizontal spacing 20 The black diamonds
+come from the template of the array1 element itself.;
+#X text 19 228 If a "w" variable is present in the template as for
+array3 \, it is added to the line width.;
+#X obj 21 374 filledpolygon 509 509 0 -10 -10 10 -10 10 10 -10 10;
+#X obj 22 292 struct plot-help-template float x float y array array1
+plot-help-array1-template array array2 plot-help-array2-template array
+array3 plot-help-array3-template;
+#X obj 22 127 plot curve array2 70 3 100 0;
+#X obj 22 208 plot curve array3 9 1 120 50 20;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [plot] plot-help-template;
+#X text 19 269 Here is the [struct] for all this:;
+#X text 19 149 This is the green spiral (color 70 \, line width 3 \,
+location (100 \, 0). Since the template for array2 contains an "x"
+variable \, play ignores x spacing requests and takes x from the data
+itself.;
+#X text 18 397 Purple square to mark the left upper corner of the scalar
+;
+#X restore 371 81 pd plot-help-template;
+#N canvas 25 161 428 241 plot-help-array1-template 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [plot] Element of "array1" in "plot-help-template";
+#X obj 24 198 filledpolygon 0 0 0 -5 0 0 5 5 0 0 -5;
+#X obj 23 168 struct plot-help-array1-template float y;
+#X text 20 38 The following data structure is defined as an element
+of "array1" in the data structure "plot-help-template". It defines
+one "y" field \, which is a reserved field that controls the y-value
+of GUI objects associated with this template. Notice there is no "x"
+field defined-- this means that when the array is plotted \, you can
+click on one of the elements (i.e. \, the small black squares defined
+by [filledpolygon]) and drag horizontally to change the y-value for
+other elements as well.;
+#X restore 12 51 pd plot-help-array1-template;
+#N canvas 18 155 428 183 plot-help-array2-template 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [plot] Element of "array2" in "plot-help-template";
+#X obj 22 134 struct plot-help-array2-template float x float y;
+#X text 20 36 This data structure is defined as an element for "array2"
+in "plot-help-template". No drawing instructions are associated with
+this [struct]. The only graphic visible in the "plot-help-data" subwindow
+is the trace itself. The thickness and color of the line are defined
+solely using the 2nd [plot] object in the "plot-help-template" subwindow.
+;
+#X restore 12 73 pd plot-help-array2-template;
+#N canvas 19 222 428 285 plot-help-array3-template 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [plot] Element of "array3" in "plot-help-template";
+#X obj 22 223 struct plot-help-array3-template float y float w;
+#X text 19 36 This data structure is defined as the element for "array3"
+in "plot-help-template". Since the reserved "w" field is defined here
+\, you can adjust the width of the line at each element (the mouse
+pointer will change to two vertical arrows when you hover over an area
+that allows you to change the width). The graphical result is the wavy
+blue line in the "plot-help-data" window. For both width and y-value
+\, you can click an element and drag horizontally to select and adjust
+other elements.;
+#X text 19 174 For both width and y-value \, you can click an element
+and drag horizontally to select and adjust other elements.;
+#X restore 12 94 pd plot-help-array3-template;
+#X text 202 82 explanation is in here-->;
+#X text 168 129 - sending a zero to the inlet of [plot] will turn off
+visibility for the drawing. A nonzero value will turn it back on. By
+default the drawing is visible \, unless the -v flag is given as an
+argument.;
+#X text 98 210 (none);
+#X text 11 23 draw array elements of scalars;
+#X text 168 183 - a list will be truncated to the first element.;
+#X text 80 414 2) float;
+#X text 80 442 3) float;
+#X text 80 459 4) float;
+#X text 80 477 5) float;
+#X text 80 493 6) float;
+#X text 168 397 - the field to plot.;
+#X text 168 414 - RGB color for the trace (0=black \, 999=white \,
+900=red \, 90=green \, 9=blue \, 555=grey \, etc.).;
+#X text 168 442 - line width of the trace.;
+#X text 168 459 - relative x location.;
+#X text 168 477 - relative y location.;
+#X text 168 493 - x spacing (ignored if the template for the array
+contains an "x" variable).;
+#X text 80 247 0-6 flags;
+#X text 168 248 - "-n" flag to make the drawing invisible initially.
+;
+#X text 168 264 - "-v [variable]" flag to assign a variable to make
+the number visible/invisible.;
+#X text 168 292 - "-vs [constant or variable]" flag to set visibility
+of scalars along the path of the plot.;
+#X text 168 319 - "-x [variable]" flag to use a different x variable.
+;
+#X text 168 339 - "-y [variable]" flag to use a different y variable.
+;
+#X text 168 359 - "-w [variable]" flag to use a different w variable.
+;
+#X text 168 376 - word "curve" to specify bezier.;
+#X text 80 397 1) symbol atom;
+#X text 79 263 (symbols atoms);
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 545 pddp/pddplink all_about_arrays.pd;
+#X obj 98 575 pddp/pddplink ../4.data.structures/05.array.pd -text
+doc/4.data.structures/05.array.pd;
+#X obj 288 530 pddp/pddplink ../4.data.structures/09.scaling.pd -text
+doc/4.data.structure/09.scaling.pd;
+#X obj 288 545 pddp/pddplink ../4.data.structures/10.onoff.pd -text
+doc/4.data.structures/10.onoff.pd;
+#X obj 288 560 pddp/pddplink ../4.data.structures/11.array.controls.pd
+-text doc/4.data.structures/11.array.controls.pd;
+#X obj 98 530 pddp/pddplink all_about_z_order.pd;
+#X obj 98 560 pddp/pddplink scalar-help.pd;
diff --git a/doc/pddp/pointer-help.pd b/doc/pddp/pointer-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9088c7377c110d496a6970eb68646ff8db105cee
--- /dev/null
+++ b/doc/pddp/pointer-help.pd
@@ -0,0 +1,186 @@
+#N struct template2 float x float y float z float q float zz;
+#N struct template1 float x float y float z float q;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pointer 3 12 0 18
+-204280 -1 0;
+#X obj 0 142 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 48 245 496 366 META 0;
+#X text 12 165 LIBRARY internal;
+#X text 12 205 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 185 AUTHOR Miller Puckette;
+#X text 12 245 HELP_PATCH_AUTHORS Updated for Pd version 0.35. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control data_structure storage nonlocal;
+#X text 12 45 DESCRIPTION remember the location of a scalar in a list
+;
+#X text 12 85 INLET_1 pointer;
+#X text 12 105 OUTLET_0 bang pointer;
+#X text 12 125 OUTLET_N pointer;
+#X text 12 145 OUTLET_R bang;
+#X text 12 65 INLET_0 bang pointer traverse next vnext rewind send-window
+;
+#X text 12 225 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 355 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 491 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 54 483 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pointer] Related Objects;
+#X obj 12 34 get;
+#X obj 45 34 set;
+#X obj 80 34 append;
+#X obj 130 34 getsize;
+#X obj 186 34 setsize;
+#X obj 246 34 element;
+#X obj 12 59 sublist;
+#X obj 70 59 struct;
+#X restore 102 597 pd Related_objects;
+#X obj 78 150 cnv 17 3 175 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 360 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 336 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 469 3 pointer;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/pointer -text
+pdpedia: pointer;
+#X text 98 149 bang;
+#X text 98 176 traverse;
+#X text 98 227 next;
+#X text 98 252 vnext;
+#X text 98 335 pointer;
+#X text 98 303 rewind;
+#X text 98 163 pointer;
+#X obj 78 398 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 359 pointer;
+#X text 98 473 bang;
+#X obj 78 471 cnv 17 3 17 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#X text 98 397 pointer;
+#X text 168 397 - an additional outlet is created for each argument
+(a template name) provided to [pointer]. This makes it possible to
+route outgoing pointers to different outlets according to the class
+of the scalar being output. Pointers to objects that do not match any
+of the specified templates are sent to the second to last outlet.;
+#X text 168 303 - reset the pointer to the head of the list.;
+#X text 167 335 - stores the value of the pointer without outputting
+it.;
+#X text 168 163 - an incoming pointer is stored and send to the left
+outlet.;
+#X text 168 252 - the message "vnext 0" behaves exactly as the "next"
+message. "vnext 1" will move to the next selected object. The window
+must be visible for the "selection" to make sense (i.e. \, you will
+get an error if it is not visible).;
+#X text 168 359 - the current value of the pointer. If one or more
+arguments are provided \, the first outlet will only output a pointer
+to the template specified by the first argument.;
+#X obj 78 99 pointer;
+#X msg 87 66 bang;
+#X msg 126 66 next;
+#X obj 78 121 print out1;
+#X msg 165 66 vnext 1;
+#X msg 224 66 rewind;
+#X obj 181 121 print out2:end_of_list;
+#N canvas 86 344 428 221 More_on_pointers 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pointer] More info;
+#X text 20 38 [pointer] is a storage object like [float] \, except
+that the thing stored is the location of a scalar somewhere. You can
+send a pointer a value (perhaps from another [pointer] object). The
+right inlet takes pointers and simply stores them. A bang in the left
+outputs the [pointer] \, and a [pointer] in the left both sets and
+outputs the value.;
+#X text 20 120 The value of a [pointer] can either indicate a real
+scalar \, or else the "head" (before the first element) of the list.
+This allows you to point to an empty list \, and also \, to "append"
+a scalar to the beginning of the list.;
+#X text 21 175 Pointers are "safe": if you delete a scalar \, pointers
+to it are marked invalid.;
+#X restore 101 575 pd More_on_pointers;
+#N canvas 103 349 428 192 Arguments_with_pointer 0;
+#X text 20 38 Optional arguments to pointer allow you to select according
+to the class of the scalar being output:;
+#X msg 37 102 next;
+#X obj 23 130 pointer help-pointer-template1 help-pointer-template2
+;
+#X obj 23 156 print template1;
+#X obj 128 156 print template2;
+#X obj 233 156 print other;
+#X obj 338 156 print bangout;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pointer] Specifying Creation Arguments;
+#X msg 23 79 traverse pd-pointer-help-data;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 2 2 5 0;
+#X connect 2 3 6 0;
+#X connect 9 0 2 0;
+#X restore 171 549 pd Arguments_with_pointer;
+#N canvas 114 187 428 210 pointer-help-data 0;
+#X scalar template2 48 120 -32 0 0 \;;
+#X scalar template1 163 36 90 0 \;;
+#X scalar template1 248 147 9 0 \;;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pointer] Window to Display Scalars;
+#X restore 395 81 pd pointer-help-data;
+#X msg 78 44 traverse pd-pointer-help-data;
+#N canvas 118 187 428 109 pointer-help-template1 0;
+#X obj 24 58 filledpolygon z 0 1 0 0 20 0 20 30 0 30;
+#X obj 11 32 struct template1 float x float y float z;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pointer] template1;
+#X restore 365 101 pd pointer-help-template1;
+#N canvas 107 187 428 106 pointer-help-template2 0;
+#X obj 45 65 filledcurve 909 0 0 0 0 30 30 60 0 30 -30 0 0;
+#X obj 24 35 struct template2 float x float y;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [pointer] template2;
+#X restore 365 121 pd pointer-help-template2;
+#X text 11 23 remember the location of a scalar in a list;
+#X text 168 227 - move forward one element and output the pointer.
+When the end of the list is reached \, a bang goes to the right outlet.
+;
+#X text 168 176 - "traverse" \, followed by a subwindow name (or patch
+filename) sets the value of [pointer] to the "head" of the list. The
+"pd-" prefix must be used with the subwindow name \, e.g. \, "traverse
+pd-pointer-help-data".;
+#X text 98 318 send-window;
+#X text 168 473 - a bang at the right outlet signals the end of the
+list.;
+#X text 168 495 - [pointer] takes (optional) arguments \, each of which
+is the name of a template. An additional outlet is created for each
+argument \, so that pointers are routed to different outlets based
+on the class of scalar being output.;
+#X msg 273 65 send-window vis 1;
+#X text 168 318 - send a message to the canvas that contains the scalar.
+;
+#X text 168 149 - outputs the current value of the pointer.;
+#X text 98 495 n) float;
+#X text 93 510 symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 245 575 pddp/pddplink scalar-help.pd;
+#X connect 31 0 34 0;
+#X connect 31 1 37 0;
+#X connect 32 0 31 0;
+#X connect 33 0 31 0;
+#X connect 35 0 31 0;
+#X connect 36 0 31 0;
+#X connect 41 0 31 0;
+#X connect 50 0 31 0;
diff --git a/doc/pddp/poly-help.pd b/doc/pddp/poly-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7183d34f72c8cea4d429a4cc09a2b24f8d1a354c
--- /dev/null
+++ b/doc/pddp/poly-help.pd
@@ -0,0 +1,102 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header poly 3 12 0 18 -204280
+-1 0;
+#X obj 0 287 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 187 494 405 META 0;
+#X text 12 165 LIBRARY internal;
+#X text 12 205 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 185 AUTHOR Miller Puckette;
+#X text 12 245 HELP_PATCH_AUTHORS Updated for Pd version 0.25. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION MIDI-style polyphonic voice allocator;
+#X text 12 85 INLET_1 float;
+#X text 12 125 OUTLET_1 float;
+#X text 12 145 OUTLET_2 float;
+#X text 12 65 INLET_0 float list stop clear;
+#X text 12 105 OUTLET_0 float;
+#X text 12 225 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 435 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 512 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 107 480 428 109 Related_objects 0;
+#X obj 62 43 makenote;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 route;
+#X obj 122 43 pack;
+#X text 8 2 [poly] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 296 cnv 17 3 100 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 295 float;
+#X text 98 323 list;
+#X obj 78 444 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 407 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 406 float;
+#X text 98 381 clear;
+#X obj 491 3 poly;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/poly -text
+pdpedia: poly;
+#X obj 102 190 poly 4 1;
+#X msg 153 144 60 0;
+#X msg 197 144 62 64;
+#X msg 244 144 62 0;
+#X obj 102 216 pack 0 0 0;
+#X obj 102 242 print;
+#X text 147 241 Output is in the printout window.;
+#X msg 304 145 stop;
+#X msg 346 145 clear;
+#X msg 102 144 60 64;
+#X text 98 353 stop;
+#X text 168 353 - output all values one by one \, ordered according
+to voice number \, and clear the memory of [poly].;
+#X text 168 381 - clear all stored values.;
+#X text 167 406 - the right inlet stores the velocity.;
+#X text 11 23 MIDI-style polyphonic voice allocator;
+#X text 168 323 - a (pitch \, velocity) pair is distributed to the
+two inlets. Lists with more than two elements will be truncated.;
+#X text 168 545 - a "1" sets voice stealing \, which is off by default.
+;
+#X text 168 530 - the first argument sets the number of voices.;
+#X text 80 530 1) float;
+#X text 80 545 2) float;
+#X text 48 56 The [poly] object takes a stream of pitch/velocity pairs
+and outputs triples containing voice number \, pitch and velocity.
+You can pack the output and use the route object to route messages
+among a bank of voices depending on the first outlet. [poly] can be
+configured to do voice stealing or not (the default.);
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 78 467 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 78 490 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 443 float;
+#X text 98 466 float;
+#X text 98 489 float;
+#X text 168 295 - a float to the left inlet sets the pitch and triggers
+the output.;
+#X text 168 443 - voice number;
+#X text 168 466 - pitch;
+#X text 168 489 - velocity;
+#X connect 17 0 21 0;
+#X connect 17 1 21 1;
+#X connect 17 2 21 2;
+#X connect 18 0 17 0;
+#X connect 19 0 17 0;
+#X connect 20 0 17 0;
+#X connect 21 0 22 0;
+#X connect 24 0 17 0;
+#X connect 25 0 17 0;
+#X connect 26 0 17 0;
diff --git a/doc/pddp/polytouch-out.pd b/doc/pddp/polytouch-out.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3cf4b0a4a2ba67c364bbfe0afc75735322a8d121
--- /dev/null
+++ b/doc/pddp/polytouch-out.pd
@@ -0,0 +1,96 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header polytouchout 3 12
+0 18 -204280 -1 0;
+#X obj 0 412 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 245 494 367 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was created for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI unfinished orphan;
+#X text 12 65 INLET_0 float;
+#X text 12 85 INLET_1;
+#X text 12 105 INLET_2;
+#X text 12 45 DESCRIPTION needs a description;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 428 421 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 78 80 ctlin;
+#X obj 221 80 pgmin;
+#X obj 28 80 bendin;
+#X obj 167 33 touchin;
+#X obj 27 33 polytouchin;
+#X obj 122 80 midiin;
+#X obj 27 107 sysexin;
+#X obj 183 167 noteout;
+#X obj 80 167 ctlout;
+#X obj 28 167 bendout;
+#X obj 106 33 touchout;
+#X obj 283 167 polytouchout;
+#X obj 127 167 midiout;
+#X obj 235 167 pgmout;
+#X obj 28 221 makenote;
+#X text 25 198 MIDI note construction:;
+#X text 25 140 MIDI output:;
+#X text 25 57 MIDI input:;
+#X obj 188 221 stripnote;
+#X obj 172 80 notein;
+#X text 185 198 MIDI note deconstruction:;
+#X text 8 2 [polytouchout] Related Objects;
+#X text 25 270 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 24 349 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 25 251 Externals;
+#X obj 25 300 pddp/helplink maxlib/pitch;
+#X obj 25 315 pddp/helplink maxlib/score;
+#X obj 25 330 pddp/helplink maxlib/chord;
+#X obj 25 365 pddp/helplink cyclone/midiformat;
+#X obj 25 380 pddp/helplink cyclone/midiparse;
+#X obj 25 395 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 420 float;
+#X obj 78 421 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 503 (none);
+#X text 98 445 float;
+#X obj 78 446 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X text 80 545 1) float;
+#X text 11 23 needs a description;
+#X text 168 420 - MIDI channel.;
+#X text 168 445 - ???;
+#X text 168 545 - ???;
+#X floatatom 226 173 5 0 0 0 - - -;
+#X floatatom 260 173 5 0 0 0 - - -;
+#X obj 226 202 polytouchout;
+#X floatatom 295 173 5 0 0 0 - - -;
+#X obj 452 3 polytouchout;
+#X obj 419 20 pddp/pddplink http://wiki.puredata.info/en/polytouchout
+-text pdpedia: polytouchout;
+#X text 98 470 float;
+#X obj 78 471 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 168 470 - ???;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 20 0 22 0;
+#X connect 21 0 22 1;
+#X connect 23 0 22 2;
diff --git a/doc/pddp/polytouchin-help.pd b/doc/pddp/polytouchin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c2883479ddc3931abbd2e98f8d885e436259a4de
--- /dev/null
+++ b/doc/pddp/polytouchin-help.pd
@@ -0,0 +1,96 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header polytouchin 3 12
+0 18 -204280 -1 0;
+#X obj 0 411 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 116 213 494 375 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was created for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 65 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X text 12 45 DESCRIPTION needs a description;
+#X text 12 85 OUTLET_1 float;
+#X text 12 105 OUTLET_2 float;
+#X restore 500 597 pd META;
+#X obj 0 439 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 428 421 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 78 80 ctlin;
+#X obj 221 80 pgmin;
+#X obj 28 80 bendin;
+#X obj 113 33 touchin;
+#X obj 265 80 polytouchin;
+#X obj 122 80 midiin;
+#X obj 27 107 sysexin;
+#X obj 183 167 noteout;
+#X obj 80 167 ctlout;
+#X obj 28 167 bendout;
+#X obj 170 33 touchout;
+#X obj 28 33 polytouchout;
+#X obj 127 167 midiout;
+#X obj 235 167 pgmout;
+#X obj 28 221 makenote;
+#X text 25 198 MIDI note construction:;
+#X text 25 140 MIDI output:;
+#X text 25 57 MIDI input:;
+#X obj 188 221 stripnote;
+#X obj 172 80 notein;
+#X text 185 198 MIDI note deconstruction:;
+#X text 8 2 [polytouchin] Related Objects;
+#X text 26 275 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 25 354 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 26 256 Externals;
+#X obj 26 305 pddp/helplink maxlib/pitch;
+#X obj 26 320 pddp/helplink maxlib/score;
+#X obj 26 335 pddp/helplink maxlib/chord;
+#X obj 26 370 pddp/helplink cyclone/midiformat;
+#X obj 26 385 pddp/helplink cyclone/midiparse;
+#X obj 26 400 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 447 float;
+#X obj 78 448 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 415 (none);
+#X text 98 472 float;
+#X obj 78 473 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 497 float;
+#X obj 78 498 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X text 80 545 1) float;
+#X obj 455 3 polytouchin;
+#X obj 423 20 pddp/pddplink http://wiki.puredata.info/en/polytouchin
+-text pdpedia: polytouchin;
+#X text 11 23 needs a description;
+#X floatatom 257 208 0 0 0 0 - - -;
+#X floatatom 226 208 0 0 0 0 - - -;
+#X floatatom 289 208 0 0 0 0 - - -;
+#X obj 226 182 polytouchin;
+#X text 168 447 - MIDI channel.;
+#X text 168 472 - ???;
+#X text 168 497 - ???;
+#X text 168 545 - ???;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 24 0 22 0;
+#X connect 24 1 21 0;
+#X connect 24 2 23 0;
diff --git a/doc/pddp/pow-help.pd b/doc/pddp/pow-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..88e2ef8f8e732e36942fdef0d96f24e64bcdf2c3
--- /dev/null
+++ b/doc/pddp/pow-help.pd
@@ -0,0 +1,85 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header pow 3 12 0 18 -204280
+-1 0;
+#X obj 0 401 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 368 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION exponential function;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 487 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 524 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 94 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 57 76 cos~;
+#X obj 89 76 osc~;
+#X obj 23 76 expr;
+#X obj 23 43 sin;
+#X obj 49 43 cos;
+#X obj 76 43 tan;
+#X obj 109 43 atan;
+#X obj 144 43 atan2;
+#X obj 182 43 exp;
+#X obj 209 43 log;
+#X obj 237 43 abs;
+#X text 8 2 [pow] Related Objects;
+#X obj 266 43 sqrt;
+#X restore 102 597 pd Related_objects;
+#X obj 78 410 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 409 float;
+#X text 98 429 list;
+#X text 98 495 float;
+#X obj 78 496 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 179 187 0 0 0 0 - - -;
+#X floatatom 179 130 0 0 0 0 - - -;
+#X obj 179 160 pow;
+#X text 103 221 [pow] is used to exponentiate a number. 2 to the power
+of 2 = 4 . The right inlet or creation argument is the exponent while
+the left inlet is the base.;
+#X obj 78 460 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 459 float;
+#X obj 495 3 pow;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/pow -text
+pdpedia: pow;
+#X text 11 23 exponential function;
+#X text 168 407 - base.;
+#X text 168 459 - exponent.;
+#X text 78 544 1) float;
+#X text 168 544 - initializes the right inlet (exponent).;
+#X text 168 427 - a (base \, exponent) pair will be distributed to
+the two inlets.;
+#X floatatom 229 130 0 0 0 0 - - -;
+#X obj 332 161 pow 3;
+#X msg 332 130 3;
+#X floatatom 332 188 5 0 0 0 - - -;
+#X floatatom 367 131 5 0 0 0 - - -;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 14 0 15 0;
+#X connect 15 0 13 0;
+#X connect 27 0 15 1;
+#X connect 28 0 30 0;
+#X connect 29 0 28 0;
+#X connect 31 0 28 0;
diff --git a/doc/pddp/powtodb-help.pd b/doc/pddp/powtodb-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0aabf2de8904ada5134ba04206c549bd2ff78a18
--- /dev/null
+++ b/doc/pddp/powtodb-help.pd
@@ -0,0 +1,68 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header powtodb 3 12 0 18
+-204280 -1 0;
+#X obj 0 428 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 243 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control conversion acoustic_units;
+#X text 12 45 DESCRIPTION convert from power units to dB;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 497 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 534 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 562 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 437 cnv 17 3 53 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 538 (none);
+#N canvas 98 440 428 151 Related_objects 0;
+#X text 11 28 Control objects for conversion:;
+#X obj 23 116 mtof~;
+#X obj 68 116 ftom~;
+#X obj 111 116 dbtorms~;
+#X obj 176 116 rmstodb~;
+#X obj 242 116 dbtopow~;
+#X obj 304 116 powtodb~;
+#X text 20 93 Signal objects for conversion:;
+#X obj 23 57 mtof;
+#X obj 70 57 ftom;
+#X obj 108 57 dbtorms;
+#X obj 167 57 rmstodb;
+#X obj 233 57 dbtopow;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [powtodb] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X floatatom 239 216 0 0 0 0 - - -;
+#X floatatom 239 160 0 0 0 0 - - -;
+#X obj 78 506 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 436 float;
+#X text 98 463 list;
+#X text 98 506 float;
+#X obj 474 3 powtodb;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/powtodb -text
+pdpedia: powtodb;
+#X text 11 23 convert from power units to dB;
+#X text 158 463 - lists will be truncated \, and the first element
+used as input.;
+#X obj 239 189 powtodb;
+#X text 109 252 The [powtodb] object converts power units \, equal
+to the square of the "RMS" amplitude \, to decibels.;
+#X obj 98 566 pddp/pddplink all_about_acoustic_conversions.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 11 0 20 0;
+#X connect 20 0 10 0;
diff --git a/doc/pddp/powtodb~-help.pd b/doc/pddp/powtodb~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..997f53d674b6deb915949d3c23079d8ad4d5f103
--- /dev/null
+++ b/doc/pddp/powtodb~-help.pd
@@ -0,0 +1,79 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header powtodb~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 412 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion acoustic_units;
+#X text 12 45 DESCRIPTION convert power units to dB for audio signals
+;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 449 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 486 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 8 12
+0 13 -228856 -1 0;
+#X obj 0 514 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 421 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 490 (none);
+#N canvas 102 446 428 141 Related_objects 0;
+#X obj 23 102 mtof;
+#X obj 68 102 ftom;
+#X obj 111 102 dbtorms;
+#X obj 176 102 rmstodb;
+#X obj 242 102 dbtopow;
+#X obj 304 102 powtodb;
+#X text 20 79 Control objects for conversion:;
+#X obj 23 43 mtof~;
+#X obj 70 43 ftom~;
+#X obj 118 43 dbtorms~;
+#X obj 187 43 rmstodb~;
+#X obj 253 43 dbtopow~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [powtodb~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 209 225 snapshot~;
+#X floatatom 209 256 0 0 0 0 - - -;
+#X floatatom 209 120 0 0 0 0 - - -;
+#X obj 209 144 sig~;
+#X obj 276 199 metro 100;
+#X obj 276 169 loadbang;
+#X text 98 420 signal;
+#X obj 78 458 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 458 signal;
+#X text 99 518 This object takes an audio signal as input and output
+(and works sample by sample.) Since it calls a library math function
+\, it may be much more expensive than other workaday tilde objects
+such as *~ and osc~ \, depending on your hardware and math library.
+;
+#X obj 209 169 dbtopow~;
+#X text 99 292 The powtodb~ object converts power units \, equal to
+the square of the "RMS" amplitude \, to decibels.;
+#X obj 471 3 powtodb~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/powtodb~ -text
+pdpedia: powtodb~;
+#X text 11 23 convert power units to dB for audio signals;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 13 0 20 0;
+#X connect 14 0 10 0;
+#X connect 15 0 14 0;
+#X connect 20 0 10 0;
diff --git a/doc/pddp/print-help.pd b/doc/pddp/print-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..32adb7b5787ec9b7be59d911433efc21737c2ded
--- /dev/null
+++ b/doc/pddp/print-help.pd
@@ -0,0 +1,154 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header print 3 12 0 18
+-204280 -1 0;
+#X obj 0 324 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 244 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS This document was updated for Pd
+version 0.38.4 by Dave Sabine and Hans-Christoph Steiner as part of
+a project called pddp proposed by Krzysztof Czaja to build comprehensive
+documentation for Pd. Jonathan Wilkes revised the patch to conform
+to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION print messages to the terminal window;
+#X text 12 65 INLET_0 anything;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 424 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 452 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 535 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 98 483 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [print] Related Objects;
+#X obj 22 43 print~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 333 cnv 17 3 80 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 483 3 print;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/print -text
+pdpedia: print;
+#X text 98 428 (none);
+#N canvas 103 75 428 487 print_oddities 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [print] Oddities;
+#X obj 33 189 print;
+#X msg 33 73 1;
+#X msg 42 97 float 1;
+#X obj 65 161 symbol test;
+#X msg 60 120 symbol this;
+#X obj 65 142 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 121 310 one 2 three;
+#X obj 53 394 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 121 395 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 130 371 print STRAIGHT;
+#X msg 105 290 list 1 two 3;
+#X msg 88 270 1 two 3;
+#X msg 130 331 list one 2 three;
+#X obj 56 371 route list;
+#X text 20 222 [print] only interprets the "list" selector when the
+following body of the message is an implied list \, i.e. a set of atoms
+that starts with a float.;
+#X text 20 428 This document was updated for Pd version 0.38.4 by Dave
+Sabine and Hans-Christoph Steiner as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd.;
+#X text 138 114 "symbols" are not interpreted;
+#X text 140 129 (i.e. "symbol" is also printed);
+#X text 20 38 floats are interpreted (i.e. it doesn't show the word
+"float" before the number):;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 7 0 5 0;
+#X connect 8 0 11 0;
+#X connect 8 0 15 0;
+#X connect 12 0 11 0;
+#X connect 12 0 15 0;
+#X connect 13 0 11 0;
+#X connect 13 0 15 0;
+#X connect 14 0 11 0;
+#X connect 14 0 15 0;
+#X connect 15 0 9 0;
+#X connect 15 1 10 0;
+#X restore 101 569 pd print_oddities;
+#X text 98 332 anything;
+#X text 168 331 - the [print] object takes any message and prints it
+to the console window. When the print object receives a message \,
+its output will appear in the console window following the name of
+the print object and a colon (:). If the print object does not have
+a name (which you can supply as an argument within the print object
+itself) then the word "print" appears followed by a colon (:) and your
+message.;
+#X text 168 428 - [print] routes output directly to the console window.
+;
+#X msg 159 64 walk the dog;
+#X msg 85 64 bang;
+#X msg 126 64 234;
+#X obj 85 99 print;
+#X msg 158 151 walk the dog;
+#X msg 85 151 bang;
+#X msg 125 151 234;
+#X obj 85 188 print myPrintObject;
+#X text 209 188 A print object with a name.;
+#X text 132 92 A print object without a name. Be sure you can see the
+terminal window as you click on these messages.;
+#N canvas 105 232 428 300 print_and_lists 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [print] Lists;
+#X text 23 38 When the print object receives a list \, it will output
+the entire list as a single message. Like below:;
+#X obj 25 98 print print_this_list;
+#X msg 25 75 10 20 30 foo;
+#X msg 26 180 10 20 30 foo;
+#X obj 26 233 unpack f f f s;
+#X obj 26 266 print unpack_this_list;
+#X text 23 127 To output the list as separate elements \, the list
+needs to be unpacked first. Note that [unpack]'s outlets are triggered
+from right to left. Like below:;
+#X text 37 200 The arguments here are used to tell Pd what type of
+atom to expect: (f = float \, s = symbol).;
+#X connect 4 0 3 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 1 7 0;
+#X connect 6 2 7 0;
+#X connect 6 3 7 0;
+#X restore 101 544 pd print_and_lists;
+#X text 82 219 Use the "-n" flag to suppress "print:" in the output
+to the console:;
+#X msg 85 253 test;
+#X obj 207 286 print;
+#X msg 207 254 test;
+#X text 159 286 vs.;
+#X obj 85 286 print -n;
+#X text 168 470 - if you provide a symbol as an argument \, the symbol--
+followed by a colon-- will precede the output when it is sent to the
+console. Or you may use the "-n" flag to only print the incoming message
+(see example above).;
+#X text 78 469 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 11 23 print messages to the terminal window;
+#X connect 16 0 19 0;
+#X connect 17 0 19 0;
+#X connect 18 0 19 0;
+#X connect 20 0 23 0;
+#X connect 21 0 23 0;
+#X connect 22 0 23 0;
+#X connect 28 0 32 0;
+#X connect 30 0 29 0;
diff --git a/doc/pddp/print~-help.pd b/doc/pddp/print~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2ba77132ce8fcc756c855acd384915f5c380abed
--- /dev/null
+++ b/doc/pddp/print~-help.pd
@@ -0,0 +1,64 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header print~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 427 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION print out raw values of a signal;
+#X text 12 65 INLET_0 float bang signal;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 512 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 544 (none);
+#N canvas 105 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 print;
+#X obj 62 43 bang~;
+#X text 8 2 [print~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 436 cnv 17 3 65 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 477 3 print~;
+#X obj 452 20 pddp/pddplink http://wiki.puredata.info/en/print~ -text
+pdpedia: print~;
+#X obj 138 274 print~;
+#X msg 150 215 bang;
+#X obj 138 189 phasor~ 1000;
+#X text 198 216 bang prints one vector;
+#X text 190 239 print two or more successive vectors;
+#X msg 155 240 2;
+#X text 98 435 signal;
+#X text 98 456 bang;
+#X text 98 476 float;
+#X text 168 476 - sending a value of "2" or greater to [print~] will
+print the specified number of vectors to the console.;
+#X text 98 516 (none);
+#X text 11 23 print out raw values of a signal;
+#X text 168 435 - an incoming signal.;
+#X text 168 456 - outputs one vector to the console.;
+#X text 95 141 The [print~] object takes a signal input and prints
+one or more vectors out when you send it a bang or a number. By default
+a vector is 64 samples.;
+#X text 168 516 - [print~] sends its output to the console window.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 13 0 12 0;
+#X connect 14 0 12 0;
+#X connect 17 0 12 0;
diff --git a/doc/pddp/qlist-help.pd b/doc/pddp/qlist-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d9d0c1521c40a128e7a5514ec46a3c340f4c3519
--- /dev/null
+++ b/doc/pddp/qlist-help.pd
@@ -0,0 +1,145 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header qlist 3 12 0 18
+-204280 -1 0;
+#X obj 0 351 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 304 171 494 366 META 0;
+#X text 12 135 LIBRARY internal;
+#X text 12 175 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 155 AUTHOR Miller Puckette;
+#X text 12 215 HELP_PATCH_AUTHORS Updated for Pd version 0.35. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION text-based sequencer;
+#X text 12 65 INLET_0 bang print tempo rewind next clear add add2 read
+write;
+#X text 12 95 OUTLET_0 list;
+#X text 12 115 OUTLET_1 bang;
+#X text 12 5 KEYWORDS control storage nonlocal filesystem list_op;
+#X text 12 195 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 393 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 529 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 506 (none);
+#N canvas 89 483 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [qlist] Related Objects;
+#X obj 22 43 textfile;
+#X obj 85 43 receive;
+#X restore 102 597 pd Related_objects;
+#X obj 78 360 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 403 cnv 17 3 37 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 480 3 qlist;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/qlist -text
+pdpedia: qlist;
+#N canvas 72 97 428 339 messages_to_qlist 0;
+#X msg 23 115 rewind;
+#X msg 23 139 next;
+#X msg 23 67 bang;
+#X msg 23 91 tempo 1;
+#X text 76 66 sequence automatically;
+#X text 76 91 set relative tempo;
+#X text 77 114 go to beginning (and stop);
+#X text 78 138 single-step forward;
+#X text 120 258 read a file;
+#X msg 23 259 read qlist.txt;
+#X msg 23 282 write /tmp/qlist.txt;
+#X msg 23 187 clear;
+#X msg 23 211 add 500 this is another message;
+#X msg 23 235 add2 that;
+#X text 80 186 empty the qlist;
+#X text 96 234 add a message to a qlist but don't terminate it;
+#X text 78 161 single-step forward SUPRESSING MESSAGE-SENDING;
+#X msg 23 163 next 1;
+#X msg 23 43 print;
+#X text 77 42 print contents to Pd window;
+#X obj 23 312 outlet;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [qlist] Messages Accepted by [qlist];
+#X text 156 281 write a file;
+#X text 217 210 add a message to a qlist;
+#X connect 0 0 20 0;
+#X connect 1 0 20 0;
+#X connect 2 0 20 0;
+#X connect 3 0 20 0;
+#X connect 9 0 20 0;
+#X connect 10 0 20 0;
+#X connect 11 0 20 0;
+#X connect 12 0 20 0;
+#X connect 13 0 20 0;
+#X connect 17 0 20 0;
+#X connect 18 0 20 0;
+#X restore 76 89 pd messages_to_qlist;
+#X obj 76 115 qlist;
+#X floatatom 76 163 0 0 0 0 - - -;
+#X obj 103 140 print done;
+#X text 112 165 This outlet gets a list of leading numbers for the
+next message \, for you to use in designing your own sequencer.;
+#X text 210 89 <- Click to see messages to qlist;
+#X obj 135 276 r this;
+#X obj 238 276 r that;
+#X obj 135 305 print this;
+#X obj 238 305 print that;
+#X text 73 231 These receives are invoked in the file "qlist.txt" in
+this directory.;
+#N canvas 82 159 428 398 More_Info 0;
+#X text 20 38 The qlist object reads text files containing time-tagged
+Pd messages. You can have them sequenced automatically (by sending
+a "bang" message \, possibly changing speed via "tempo" messages) or
+manually via the "rewind" and "next" messages.;
+#X text 20 228 To run it manually \, send "rewind" followed by "next".
+All messages not preceeded by numbers are sent. As soon as a message
+starting with one or more numbers is encountered \, the numbers are
+output as a list. There are many ways you could design a sequencer
+around this.;
+#X text 20 298 You can also record textual messages and save them to
+a file. Send "clear" to empty the qlist and "add" to add messages (terminated
+with semicolons.) The message \, "add2" adds a list of atoms without
+finishing with a semicolon in case you want to make variable-length
+messages.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [qlist] More Info;
+#X text 20 108 To run the qlist automatically \, send it a "read" message
+(the filename is relative to the directory the patch is in) and later
+a "bang." Messages in the file are separated by semicolons. Optional
+leading numbers are delay times in milliseconds. If the tempo is different
+from 1 the messages are sent faster or slower accordingly. Messages
+should start with a symbol giving the destination object. In the file
+"qlist.q" used here \, the messages go to objects "this" and "that"
+which are receives below.;
+#X restore 101 538 pd More_Info;
+#X text 98 402 list;
+#X obj 78 446 cnv 17 3 47 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 bang;
+#X text 168 445 - this outlet gets a bang when you hit the end of the
+sequence. In the file "qlist.txt" used in the example above \, the
+end is delayed 1000 milliseconds after the last message.;
+#X text 11 23 text-based sequencer;
+#X text 98 359 See the subpatch "messages_to_qlist" in the example
+above for a complete list of messages and their functionalities.;
+#X text 168 402 - if you run [qlist] manually (using the "next" message)
+\, messages starting with one or more numbers are are output as a list.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 557 pddp/pddplink ../2.control.examples/23.sequencing.pd
+-text doc/2.control.examples/23.sequencing.pd;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/D13.additive.qlist.pd
+-text doc/3.audio.examples/D13.additive.qlist.pd;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 14 1 16 0;
+#X connect 19 0 21 0;
+#X connect 20 0 22 0;
diff --git a/doc/pddp/random-help.pd b/doc/pddp/random-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b5de1cb5242f8902d8fc208c6879c9135658a3a6
--- /dev/null
+++ b/doc/pddp/random-help.pd
@@ -0,0 +1,577 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header random 3 12 0 18
+-204280 -1 0;
+#X obj 0 252 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 247 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 29 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 45 DESCRIPTION pseudorandom integer generator;
+#X text 12 5 KEYWORDS control random;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 float;
+#X text 12 65 INLET_0 bang seed;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 389 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 426 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 476 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 87 265 428 374 Related_objects 0;
+#X text 20 255 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 20 297 The best places to find information about Pd's libraries
+is:;
+#X text 21 314 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 23 328 or;
+#X text 20 343 iem.kug.ac.at/pdb/;
+#X obj 20 95 pddp/helplink markex/randomF;
+#X obj 20 115 pddp/helplink markex/tripleRand;
+#X obj 20 135 pddp/helplink motex/shuffle;
+#X obj 20 155 pddp/helplink cxc/utime;
+#X obj 20 175 pddp/helplink mjlib/pin~;
+#X obj 20 195 pddp/helplink iemmatrix/mtx_rand;
+#X obj 20 215 pddp/helplink iemlib/randomblock~;
+#X obj 20 235 pddp/helplink cyclone/drunk;
+#X text 20 75 Externals;
+#N canvas 404 60 483 507 (subpatch) 0;
+#X msg 144 296 bang;
+#X msg 144 321 1 30;
+#X obj 144 409 line~;
+#X obj 202 301 del 30;
+#X obj 61 433 *~;
+#X obj 62 485 dac~;
+#X obj 62 359 osc~ 880;
+#X obj 62 403 clip~ -1 1;
+#X obj 35 220 list split 1;
+#X obj 15 311 list;
+#X obj 35 244 t b a;
+#X obj 62 334 mtof;
+#X obj 62 457 *~ 0.07;
+#X obj 207 128 metro 50;
+#X obj 207 202 s \$0-cnv;
+#X obj 207 106 0;
+#X obj 207 84 del 3000;
+#X obj 310 170 f;
+#X obj 342 170 + 1;
+#X obj 35 12 r \$0-bng;
+#X obj 106 14 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 310 197 div 13;
+#X msg 310 314 color \$1 0;
+#X obj 242 105 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 279 86 sel 0;
+#X obj 279 107 -1;
+#X obj 279 130 t a;
+#X obj 207 155 f -1;
+#X msg 207 180 delta 0 \$1;
+#X obj 35 44 spigot 1;
+#X obj 35 76 t a b;
+#X obj 96 55 0;
+#X obj 130 55 1;
+#X obj 310 220 sel 3 4;
+#X msg 371 246 5 \$1;
+#X obj 371 268 -;
+#X msg 310 246 1;
+#X obj 340 245 f 2;
+#X obj 383 170 sel 1;
+#X msg 377 198 0;
+#X msg 411 199 2;
+#X obj 62 311 + 68;
+#X obj 15 284 del 170;
+#X text 167 14 IT'S A SECRET TO EVERYBODY.;
+#X obj 100 100 cnv 15 15 15 empty empty empty 20 12 0 14 -262144 -66577
+0;
+#X obj 56 106 loadbang;
+#X obj 35 174 list;
+#X obj 114 217 s \$0-randomize;
+#X obj 71 149 r \$0-new-secret;
+#X msg 56 128 7 1 0 8 12 16;
+#X obj 35 197 list prepend 11 10;
+#X obj 62 381 *~ 1.4;
+#X msg 202 323 0 400;
+#X connect 0 0 1 0;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 1;
+#X connect 3 0 52 0;
+#X connect 4 0 12 0;
+#X connect 6 0 51 0;
+#X connect 7 0 4 0;
+#X connect 8 0 10 0;
+#X connect 8 1 9 1;
+#X connect 9 0 8 0;
+#X connect 10 0 42 0;
+#X connect 10 1 0 0;
+#X connect 10 1 41 0;
+#X connect 11 0 6 0;
+#X connect 12 0 5 0;
+#X connect 12 0 5 1;
+#X connect 13 0 17 0;
+#X connect 13 0 27 0;
+#X connect 15 0 13 0;
+#X connect 15 0 17 1;
+#X connect 16 0 15 0;
+#X connect 16 0 23 0;
+#X connect 16 0 32 0;
+#X connect 17 0 18 0;
+#X connect 17 0 21 0;
+#X connect 18 0 17 1;
+#X connect 19 0 29 0;
+#X connect 20 0 29 0;
+#X connect 21 0 33 0;
+#X connect 22 0 14 0;
+#X connect 23 0 24 0;
+#X connect 23 0 38 0;
+#X connect 24 0 25 0;
+#X connect 24 1 26 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 1;
+#X connect 27 0 28 0;
+#X connect 28 0 14 0;
+#X connect 29 0 30 0;
+#X connect 30 0 13 0;
+#X connect 30 0 16 0;
+#X connect 30 0 46 0;
+#X connect 30 1 31 0;
+#X connect 31 0 29 1;
+#X connect 32 0 29 1;
+#X connect 33 0 36 0;
+#X connect 33 1 37 0;
+#X connect 33 2 34 0;
+#X connect 34 0 35 0;
+#X connect 35 0 22 0;
+#X connect 36 0 22 0;
+#X connect 37 0 22 0;
+#X connect 38 0 39 0;
+#X connect 38 1 40 0;
+#X connect 39 0 37 1;
+#X connect 40 0 37 1;
+#X connect 41 0 11 0;
+#X connect 42 0 9 0;
+#X connect 45 0 49 0;
+#X connect 46 0 47 0;
+#X connect 46 0 50 0;
+#X connect 48 0 46 1;
+#X connect 49 0 46 1;
+#X connect 50 0 8 0;
+#X connect 51 0 7 0;
+#X connect 52 0 2 0;
+#X coords 0 -1 1 1 15 15 2 100 100;
+#X restore 266 222 pd;
+#X obj 8 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 23 42 noise~;
+#X obj 23 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 38 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 53 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 68 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 83 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 98 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 113 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 128 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 173 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 254 180 cnv 15 40 24 empty empty empty 20 12 0 14 -179689 -66577
+0;
+#N canvas 271 87 451 558 (subpatch) 0;
+#X obj 27 181 t a b;
+#X obj 54 203 f;
+#X obj 54 228 + 1;
+#X obj 27 282 list prepend;
+#X obj 84 203 mod 3;
+#X msg 27 255 \$1\$2\$3\$4\$5\$6;
+#X obj 179 115 0;
+#X obj 27 358 list append;
+#X obj 48 331 list append;
+#X obj 27 40 t a b;
+#X obj 27 304 route 3 2 1;
+#X obj 24 119 cnv 15 110 24 empty empty empty 20 12 0 14 -179689 -66577
+0;
+#N canvas 222 70 378 565 list-scramble 0;
+#X obj 148 213 list;
+#X obj 205 294 sel;
+#X obj 148 181 t b a;
+#X obj 104 372 f;
+#X obj 205 267 list split 1;
+#X obj 294 267 t a;
+#X obj 77 318 spigot;
+#X obj 116 291 1;
+#X obj 128 318 0;
+#X obj 77 98 t b b b;
+#X obj 148 240 route bang;
+#X msg 152 415 adddollar \$1;
+#X msg 152 479 list \$2 \$4 \$1 \$3 \$6 \$5;
+#X obj 104 415 s \$0-l;
+#X obj 274 153 r \$0-l;
+#X obj 77 345 t b b;
+#X obj 40 373 f;
+#X obj 68 372 + 1;
+#X obj 18 442 moses;
+#X obj 45 415 r \$0-len;
+#X obj 159 -31 inlet;
+#X obj 193 60 list length;
+#X obj 236 95 s \$0-len;
+#X obj 45 468 b;
+#X obj 45 495 s \$0-end;
+#X obj 77 71 until;
+#X obj 120 71 r \$0-end;
+#X obj 210 38 s \$0-r;
+#X obj 25 318 r \$0-r;
+#X obj 223 138 r \$0-r;
+#X obj 25 345 0;
+#X obj 148 158 + 1;
+#X obj 252 395 r \$0-r;
+#X obj 159 -4 t a b a b;
+#X obj 3 73 s \$0-in;
+#X obj 96 450 r \$0-in;
+#X obj 152 506 outlet;
+#X obj 3 46 list;
+#X msg 252 417 set list;
+#X obj 274 190 list;
+#X obj 274 215 t a;
+#X obj 134 131 cnv 15 70 24 empty empty empty 20 12 0 14 -179689 -66577
+0;
+#X obj 148 134 random;
+#X connect 0 0 10 0;
+#X connect 1 0 8 0;
+#X connect 2 0 0 0;
+#X connect 2 1 1 1;
+#X connect 2 1 3 1;
+#X connect 3 0 11 0;
+#X connect 3 0 13 0;
+#X connect 4 0 1 0;
+#X connect 4 1 5 0;
+#X connect 5 0 4 0;
+#X connect 6 0 15 0;
+#X connect 7 0 6 1;
+#X connect 8 0 6 1;
+#X connect 9 0 6 0;
+#X connect 9 1 42 0;
+#X connect 9 2 7 0;
+#X connect 10 1 4 0;
+#X connect 11 0 12 0;
+#X connect 12 0 36 0;
+#X connect 14 0 39 0;
+#X connect 15 0 16 0;
+#X connect 15 1 3 0;
+#X connect 16 0 17 0;
+#X connect 17 0 16 1;
+#X connect 17 0 18 0;
+#X connect 18 1 23 0;
+#X connect 19 0 18 1;
+#X connect 20 0 33 0;
+#X connect 21 0 22 0;
+#X connect 21 0 42 1;
+#X connect 23 0 24 0;
+#X connect 25 0 9 0;
+#X connect 26 0 25 1;
+#X connect 28 0 30 0;
+#X connect 29 0 0 1;
+#X connect 29 0 39 1;
+#X connect 30 0 16 1;
+#X connect 31 0 2 0;
+#X connect 32 0 38 0;
+#X connect 33 0 37 0;
+#X connect 33 1 25 0;
+#X connect 33 2 21 0;
+#X connect 33 3 27 0;
+#X connect 35 0 12 0;
+#X connect 37 0 34 0;
+#X connect 38 0 12 0;
+#X connect 39 0 40 0;
+#X connect 39 0 0 1;
+#X connect 40 0 39 1;
+#X connect 42 0 31 0;
+#X restore 27 121 pd list-scramble;
+#X obj 27 464 t a b;
+#X obj 27 539 s pd-\$0-random-header;
+#X msg 72 489 clear \, donecanvasdialog 0 0 2 0 -1 1 1 200 18 0 0 \,
+obj 0 0 cnv 15 200 18 empty \$0-pddp.cnv.random-subheading empty 3
+12 0 14 -204280 -1 0;
+#X obj 112 20 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X msg 27 67 b j e c t s \, e l a t e d \, r a n d o m;
+#X obj 27 17 r \$0-bng;
+#X obj 43 409 loadbang;
+#X msg 43 436 text 8 0 [random] Related Objects;
+#X msg 27 381 text 8 0 [\$1] R\$2 O\$3;
+#X text 98 408 <- triggers a dirty flag;
+#X obj 56 90 r \$0-randomize;
+#N canvas 0 0 450 300 filter-numbers 0;
+#X obj 121 55 inlet;
+#X obj 121 82 list trim;
+#X obj 121 109 route list;
+#X obj 178 136 list;
+#X obj 178 163 outlet;
+#X obj 121 190 s \$0-new-secret;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X connect 2 1 3 0;
+#X connect 3 0 4 0;
+#X restore 27 153 pd filter-numbers;
+#X connect 0 0 5 0;
+#X connect 0 1 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 2 0 3 1;
+#X connect 3 0 10 0;
+#X connect 4 0 1 1;
+#X connect 5 0 3 0;
+#X connect 6 0 1 1;
+#X connect 7 0 21 0;
+#X connect 8 0 7 1;
+#X connect 9 0 17 0;
+#X connect 9 1 6 0;
+#X connect 10 0 7 0;
+#X connect 10 1 8 0;
+#X connect 10 2 8 1;
+#X connect 12 0 24 0;
+#X connect 13 0 14 0;
+#X connect 13 1 15 0;
+#X connect 15 0 14 0;
+#X connect 16 0 9 0;
+#X connect 17 0 12 0;
+#X connect 18 0 9 0;
+#X connect 20 0 13 0;
+#X connect 21 0 13 0;
+#X connect 23 0 12 0;
+#X connect 24 0 0 0;
+#X restore 263 183 pd;
+#X obj 158 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 143 3 bng 15 250 50 0 \$0-bng empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#N canvas 0 0 450 300 \$0-random-header 0;
+#X obj 0 0 cnv 15 200 18 empty 0-pddp.cnv.random-subheading empty 3
+12 0 14 -204280 -1 0;
+#X text 8 0 [random] Related Objects;
+#X coords 0 -1 1 1 200 18 2 0 0;
+#X restore 11 1 pd \$0-random-header;
+#X obj 180 171 cnv 3 210 60 empty \$0-cnv empty 20 12 0 14 -262144
+-262144 0;
+#X restore 102 597 pd Related_objects;
+#X obj 78 261 cnv 17 3 85 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 397 float;
+#X obj 78 398 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 356 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 355 float;
+#X obj 481 3 random;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/random -text
+pdpedia: random;
+#X text 81 56 [random] outputs pseudorandom integers between 0 and
+N-1 where N is the creation argument or the value of the right inlet.
+;
+#X obj 84 122 random 100;
+#X obj 84 102 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 84 144 3 0 0 0 - - -;
+#X text 154 122 Generates random numbers between 0 and 99;
+#X obj 84 187 random 100;
+#X obj 84 167 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 84 210 3 0 0 0 - - -;
+#X floatatom 141 162 5 0 0 0 - - -;
+#X text 181 162 Changes the 'range' of random numbers.;
+#X text 98 260 bang;
+#X text 98 299 seed;
+#X text 168 299 - to specify the seed \, use the seed message followed
+by a float ( "seed 42" ).;
+#N canvas 65 83 428 454 About_seeds 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [random] About seeds;
+#X text 21 158 However \, "seeds" can be inputted into [random] by
+sending a message \, like below:;
+#X msg 24 221 seed 42;
+#X obj 90 227 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 90 245 random 1000;
+#X floatatom 90 265 3 0 0 0 - - -;
+#X obj 24 201 loadbang;
+#X text 21 294 Seeds are kept locally so that if two [random]s are
+seeded the same \, they will have the same output - as demonstrated
+below. Furthermore \, you can seed the same one twice to repeat the
+output.;
+#X msg 180 363 seed 42;
+#X obj 106 366 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 106 398 random 1000;
+#X floatatom 106 418 3 0 0 0 - - -;
+#X obj 180 343 loadbang;
+#X obj 180 398 random 1000;
+#X floatatom 180 418 3 0 0 0 - - -;
+#X text 233 363 Click again to repeat output.;
+#X text 20 38 Random numbers are generated via a complex equation which
+produces a pseudo-predictable sequence of numbers. Each [random] object's
+equation is provided with a "seed" which is really just one of the
+variables in the equation which produces the sequence. The "seed" is
+generated by Pd based on specific parameters in each patch which contains
+a [random] object. If more than one [random] object is contained within
+a single patch \, each gets a different "seed".;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 7 0 3 0;
+#X connect 9 0 11 0;
+#X connect 9 0 14 0;
+#X connect 10 0 11 0;
+#X connect 10 0 14 0;
+#X connect 11 0 12 0;
+#X connect 13 0 9 0;
+#X connect 14 0 15 0;
+#X restore 171 332 pd About_seeds;
+#N canvas 91 66 428 441 More_about_seeds 0;
+#X text 20 39 While the "default" seed for each [random] is usually
+very effective \, it may be necessary to find better - more unpredictable
+- more indeterminate ways to seed the object to produce a more pleasing
+result.;
+#X text 20 96 Here are some ideas that may improve the implementation
+of [random]:;
+#X floatatom 202 211 0 0 0 0 - - -;
+#X obj 44 138 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 202 182 / 100;
+#X floatatom 44 208 0 0 0 0 - - -;
+#X text 64 137 Both methods here produce random numbers between 0 and
+5;
+#X obj 202 157 random 501;
+#X obj 44 179 random 6;
+#X text 269 157 0 - 500;
+#X text 41 239 between 0 and 5;
+#X text 41 226 Produces whole numbers;
+#X text 20 136 1;
+#X text 20 283 2;
+#X obj 44 284 loadbang;
+#X obj 44 317 timer;
+#X obj 106 297 bng 15 250 50 0 empty empty Click_to_seed 0 -8 0 10
+-262144 -1 -1;
+#X msg 44 343 seed \$1;
+#X obj 106 381 bng 15 250 50 0 empty empty Click_for_output 0 -8 0
+10 -262144 -1 -1;
+#X floatatom 106 421 5 0 0 0 - - -;
+#X obj 106 400 random 42;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 240 226 between 0 and 5;
+#X text 240 212 produces fractional results;
+#X text 240 195 within range.;
+#X text 240 182 divide by 100 to keep output;
+#X text 206 298 "Time is on your side". Using the;
+#X text 206 314 [timer] object here (which is;
+#X text 206 343 interesting trick.;
+#X text 207 329 started via loadbang) is an;
+#X text 8 2 [random] More Info on Seeds;
+#X connect 3 0 7 0;
+#X connect 3 0 8 0;
+#X connect 4 0 2 0;
+#X connect 7 0 4 0;
+#X connect 8 0 5 0;
+#X connect 14 0 15 0;
+#X connect 15 0 17 0;
+#X connect 16 0 15 1;
+#X connect 17 0 20 0;
+#X connect 18 0 20 0;
+#X connect 20 0 19 0;
+#X restore 102 485 pd More_about_seeds;
+#N canvas 107 145 428 418 weighted_random_numbers 0;
+#X msg 23 118 bang;
+#X text 20 58 You can generate weighted random numbers from uniformly
+distributed ones. If you just want two possible outcomes with a varying
+probability for each one \, you can do as shown:;
+#X obj 23 144 random 100;
+#X obj 23 202 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 89 202 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 125 151 3 0 100 0 - - -;
+#X obj 23 177 moses 80;
+#X text 20 230 This outputs a number at left 80% of the time \, otherwise
+at right \, unless you override the "80" using the number box. You
+may extend this to more than two possible outcomes \, for instance
+like this:;
+#X msg 24 293 bang;
+#X obj 24 319 random 100;
+#X obj 24 372 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 114 373 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 24 347 moses 10;
+#X obj 114 348 moses 30;
+#X obj 182 373 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 22 388 10%;
+#X text 112 389 20%;
+#X text 184 388 70%;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [random] Weighted Random Numbers;
+#X text 62 117 <- click to test;
+#X text 156 150 <- change probablilty;
+#X text 64 293 <- click to test;
+#X text 20 25 There are many ways that [random] can be incorporated
+into other structures that change the qualities of the results.;
+#X connect 0 0 2 0;
+#X connect 2 0 6 0;
+#X connect 5 0 6 1;
+#X connect 6 0 3 0;
+#X connect 6 1 4 0;
+#X connect 8 0 9 0;
+#X connect 9 0 12 0;
+#X connect 12 0 10 0;
+#X connect 12 1 13 0;
+#X connect 13 0 11 0;
+#X connect 13 1 14 0;
+#X restore 102 507 pd weighted_random_numbers;
+#X text 11 23 pseudorandom integer generator;
+#X text 168 397 - the output is an integer between 0 and N-1.;
+#X text 168 442 - sets the initial value of N \, where the output ranges
+between 0 and N-1.;
+#X text 168 260 - a bang to [random] will output an integer between
+0 and N-1 \, where N is the creation argument or the value to the right
+inlet.;
+#X text 167 355 - a float to the right inlet sets N \, where the output
+ranges between 0 and N-1.;
+#X text 78 442 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 102 527 pddp/pddplink ../2.control.examples/19.random.pd -text
+doc/2.control.examples/19.random.pd;
+#X obj 102 542 pddp/pddplink ../2.control.examples/20.weighted-random.pd
+-text doc/2.control.examples/20.weighted-random.pd;
+#X obj 102 557 pddp/pddplink ../2.control.examples/21.markov.chain.pd
+-text doc/2.control.examples/21.markov.chain.pd;
+#X obj 102 572 pddp/pddplink ../2.control.examples/22.random-walk.pd
+-text doc/2.control.examples/22.random-walk.pd;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 20 0 22 0;
+#X connect 21 0 20 0;
+#X connect 23 0 20 1;
diff --git a/doc/pddp/readsf~-help.pd b/doc/pddp/readsf~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1a41ee6ede324eafa79b26126f16bc21dd63b468
--- /dev/null
+++ b/doc/pddp/readsf~-help.pd
@@ -0,0 +1,127 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header readsf~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 283 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for version 0.42-4. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION read a soundfile;
+#X text 12 65 INLET_0 float open start stop print;
+#X text 12 85 INLET_N signal;
+#X text 12 105 OUTLET_R bang;
+#X text 12 185 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS signal soundfile;
+#X restore 500 597 pd META;
+#X obj 0 428 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 510 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 76 483 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 44 soundfiler;
+#X obj 103 44 writesf~;
+#X text 8 2 [readsf~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 292 cnv 17 3 125 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 437 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 readsf~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/readsf~ -text
+pdpedia: readsf~;
+#X text 165 149 The wave \, aiff \, and nextstep formats are parsed
+automatically \, although only 2- 3- and 4- byte samples are accepted
+(4 bytes implies floating point and is not available in aiff format.)
+;
+#X text 98 318 open;
+#X text 168 318 - the open message is followed by a filename \, an
+onset in sample frames \, and \, as an override \, you may also supply
+a header size to skip \, a number of channels \, bytes per channel
+\, and endianness (see example above).;
+#X text 98 367 start;
+#X text 98 385 stop;
+#X text 98 402 print;
+#X text 168 402 - send statistics to the console for debugging.;
+#X obj 78 477 cnv 17 3 17 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#X text 98 476 bang;
+#X text 98 436 signal;
+#X text 168 436 - [readsf~] defaults to one signal outlet for a single
+channel of audio output. An additional inlet is added for each channel
+specified by the first creation argument.;
+#X text 168 476 - the rightmost inlet sends a bang when the soundfile
+is done.;
+#X msg 80 124 0;
+#X obj 446 231 print didit;
+#X obj 120 233 env~ 16384;
+#X floatatom 120 252 0 0 0 0 - - -;
+#X msg 81 146 print;
+#X obj 11 260 dac~;
+#X obj 204 232 env~ 16384;
+#X floatatom 204 251 0 0 0 0 - - -;
+#X obj 11 176 readsf~ 4 1e+06;
+#X obj 283 231 env~ 16384;
+#X floatatom 283 250 0 0 0 0 - - -;
+#X obj 367 231 env~ 16384;
+#X floatatom 367 251 0 0 0 0 - - -;
+#X msg 11 80 open ../sound/bell.aiff 0 200 4 2 b;
+#X obj 71 234 *~ 0.1;
+#X obj 12 235 *~ 0.1;
+#X msg 11 59 open ../sound/bell.aiff;
+#X msg 20 102 start;
+#X msg 20 125 stop;
+#X text 207 107 The object immediately starts reading from the file
+\, but output will only appear after you send a "1" to start playback.
+A "0" stops it.;
+#X text 109 101 start playback;
+#X text 109 123 stop it;
+#X text 11 23 read a soundfile;
+#X text 168 545 - buffer size per channel in bytes.;
+#X text 168 528 - an integer that specifies the number of channels.
+;
+#X text 79 528 1) float;
+#X text 79 545 2) float;
+#X msg 80 103 1;
+#X text 168 367 - start playback.;
+#X text 168 385 - stop playback.;
+#X text 98 292 float;
+#X text 168 292 - "1" (or any nonzero value) has the same effect as
+"start" \, and "0" has the same effect as "stop".;
+#X text 195 41 The [readsf~] object reads a soundfile into its signal
+outputs. You must open the soundfile in advance (a couple of seconds
+before you'll need it) using the "open" message.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 24 0 32 0;
+#X connect 26 0 27 0;
+#X connect 28 0 32 0;
+#X connect 30 0 31 0;
+#X connect 32 0 26 0;
+#X connect 32 0 39 0;
+#X connect 32 1 30 0;
+#X connect 32 1 38 0;
+#X connect 32 2 33 0;
+#X connect 32 2 38 0;
+#X connect 32 3 35 0;
+#X connect 32 3 39 0;
+#X connect 32 4 25 0;
+#X connect 33 0 34 0;
+#X connect 35 0 36 0;
+#X connect 37 0 32 0;
+#X connect 38 0 29 1;
+#X connect 39 0 29 0;
+#X connect 40 0 32 0;
+#X connect 41 0 32 0;
+#X connect 42 0 32 0;
+#X connect 51 0 32 0;
diff --git a/doc/pddp/realtime-help.pd b/doc/pddp/realtime-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cc1d9503f79a41900a75cecc0c509568d19ecca9
--- /dev/null
+++ b/doc/pddp/realtime-help.pd
@@ -0,0 +1,160 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header realtime 3 12 0
+18 -204280 -1 0;
+#X obj 0 376 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 243 494 372 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 185 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control time;
+#X text 12 45 DESCRIPTION ask operating system for elapsed real time
+;
+#X text 12 65 INLET_0 bang;
+#X text 12 85 INLET_1 bang;
+#X text 12 105 OUTLET_0 float;
+#X restore 500 597 pd META;
+#X obj 0 473 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 510 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 537 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 514 (none);
+#N canvas 107 323 428 268 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [realtime] Related Objects;
+#X obj 126 43 metro;
+#X obj 23 43 cputime;
+#X obj 81 43 timer;
+#X text 20 134 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 19 183 The best places to find information about Pd's libraries
+is:;
+#X text 20 202 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 21 216 or;
+#X text 20 231 iem.kug.ac.at/pdb/;
+#X text 20 85 Related External Objects;
+#X obj 20 110 pddp/helplink iemlib/t3_timer;
+#X restore 102 597 pd Related_objects;
+#X obj 78 385 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 481 float;
+#X obj 78 482 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 429 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 realtime;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/realtime -text
+pdpedia: realtime;
+#X msg 119 160 bang;
+#X msg 94 138 bang;
+#X floatatom 94 204 0 0 0 0 - - -;
+#X text 166 206 Output is in milliseconds;
+#X text 129 138 Click here to start or reset;
+#X text 89 91 The [realtime] object measures elapsed "real" time as
+measured by your operating system.;
+#X obj 94 182 realtime;
+#X text 157 161 Click here to get elapsed real time. Click again...and
+again...to see periodic measurements from the start or reset time.
+;
+#X text 90 234 [realtime] works like essentially like a stop-watch.
+Once it starts \, you can continue to "poll" [realtime] to view the
+elapsed time.;
+#X text 90 281 The odd aspect about comparing [realtime] to a stop-watch
+is that a stop-watch can be stopped! [realtime] can only be started
+or reset. It cannot be stopped.;
+#N canvas 108 160 428 429 About_clocks 0;
+#X text 20 60 In a fantasy world \, computers could exist somehow beyond
+the restrictions of time and digital computation could be performed
+in ZERO time. However \, that is not the case. Instead \, every process
+within Pd and within your operating system requires at least a few
+nanoseconds of your CPU's time.;
+#X text 21 145 The [timer] object is like a clock that is not constrained
+to the regular laws of physics and the universal space-time continuum.
+It reports "time" measurements as only Pd can see them!;
+#X text 22 205 The [cputime] object is like a clock that measures how
+much time your CPU actually required to carry out your request. Keep
+in mind however that your CPU is busy doing many things simoultaneously
+\, so even though a process might take 5 minutes to complete \, your
+CPU does not pay full attention to that process for the entire 5 minutes.
+Instead \, it simply begins the process \, then refers back to that
+process from time to time until the it is complete. In other cases
+\, your CPU might require a full 5 minutes while Pd might report that
+merely a few milliseconds have passed. This type of discrepancy depends
+heavily on your computer's hardware and the type of processing it is
+performing.;
+#X text 21 369 The [realtime] object is as much like your own wrist
+watch as Pd can possibly manage. It measures time according to your
+operating system's internal clock.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [realtime] About Clocks;
+#X text 21 38 Why the discrepancies between clocks?;
+#X restore 102 569 pd About_clocks;
+#N canvas 105 140 428 400 Comparing_timers 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [realtime] Comparing timers in Pd;
+#X obj 45 296 time_measurements;
+#X obj 45 192 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 45 353 0 0 0 0 - - -;
+#X floatatom 114 353 0 0 0 0 - - -;
+#X floatatom 184 353 0 0 0 0 - - -;
+#X text 20 108 In the example below \, I've created an abstraction
+which will force each of Pd's stop-watches \, [timer] [cputime] and
+[realtime] to measure various processes and report the elapsed time.
+Click on each [bng] to begin the process and wait for the results.
+Notice the discrepancies in the results.;
+#X text 20 371 Logical Time;
+#X text 170 371 Real Time;
+#X text 104 371 CPU Time;
+#X obj 57 228 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 65 186 1 Measures elapsed time between two "bangs" from a [trigger]
+object.;
+#X text 77 220 2 Measures the amount of time Pd requires to turn on
+DSP and start an oscillator.;
+#X obj 97 260 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 118 252 3 Measures the amount of time Pd requires count to
+three...please wait for approximately 3 seconds.;
+#X text 20 39 As stated above \, [realtime] measures "real" or actual
+time. This value may be slightly different that CPU time or "logical"
+time. Pd offers two objects which measure CPU time and "logical" time.
+See the reference documents for those objects for more information.
+;
+#X connect 2 0 4 0;
+#X connect 2 1 5 0;
+#X connect 2 2 6 0;
+#X connect 3 0 2 0;
+#X connect 11 0 2 1;
+#X connect 14 0 2 2;
+#X restore 102 547 pd Comparing_timers;
+#X text 98 384 bang;
+#X text 98 428 bang;
+#X text 167 428 - a bang to the right inlet sends the elapsed time
+to the outlet. Unlike most other objects in pd \, this is the "hot"
+inlet \, i.e. \, it triggers the output.;
+#X text 168 384 - a bang to the left inlet resets the timer. Unlike
+most other objects in pd \, the left inlet of [realtime] is a "cold"
+inlet \, i.e. \, it does not trigger the output.;
+#X text 11 23 ask operating system for elapsed real time;
+#X text 168 481 - elapsed time in milliseconds.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 15 0 21 1;
+#X connect 16 0 21 0;
+#X connect 21 0 17 0;
diff --git a/doc/pddp/receive-help.pd b/doc/pddp/receive-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ab1151153626dc538c9397014100e337bab9466b
--- /dev/null
+++ b/doc/pddp/receive-help.pd
@@ -0,0 +1,186 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header receive 3 12 0 18
+-204280 -1 0;
+#X obj 0 271 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Dave Sabine \, September 9 \, 2003
+. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 25 KEYWORDS control nonlocal;
+#X text 12 65 DESCRIPTION receive messages without patch cords;
+#X text 12 85 OUTLET_0 anything;
+#X text 12 5 ALIAS r;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 331 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 373 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 434 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 93 310 428 292 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [receive] Related Objects;
+#X text 20 109 Externals and other object libraries;
+#X obj 115 43 receive~;
+#X obj 177 43 send~;
+#X obj 23 43 send;
+#X obj 278 43 throw~;
+#X obj 333 43 catch~;
+#X obj 23 73 tabreceive~;
+#X obj 121 73 tabsend~;
+#X obj 193 73 netsend;
+#X obj 259 73 netreceive;
+#X obj 225 43 value;
+#X obj 70 43 qlist;
+#X obj 20 128 pddp/helplink ggee/streamin~;
+#X obj 20 148 pddp/helplink ext13/receive13~;
+#X obj 20 168 pddp/helplink maxlib/remote;
+#X obj 20 188 pddp/helplink receivelocal;
+#X obj 20 208 pddp/helplink maxlib/dist;
+#X text 106 188 <- which library? (No help patch exists);
+#X obj 20 228 pddp/helplink receiveOSC;
+#X text 106 227 <- which library?;
+#X text 106 247 <- which library?;
+#X obj 20 248 pddp/helplink shoutamp~;
+#X obj 20 268 pddp/helplink maxlib/netdist;
+#X restore 102 597 pd Related_objects;
+#X obj 78 340 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 516 3 r;
+#X obj 442 3 receive;
+#X text 492 3 or;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/receive -text
+pdpedia: receive;
+#X obj 47 107 s;
+#X floatatom 47 83 5 0 0 0 - - -;
+#X floatatom 149 112 5 0 0 0 - - -;
+#X obj 149 83 r;
+#X floatatom 204 112 5 0 0 0 - - -;
+#X obj 204 83 r;
+#X floatatom 255 112 5 0 0 0 - - -;
+#X obj 255 83 r;
+#X floatatom 51 166 5 0 0 0 - - -;
+#X floatatom 306 192 5 0 0 0 - - -;
+#X floatatom 377 192 5 0 0 0 - - -;
+#X floatatom 452 192 5 0 0 0 - - -;
+#X text 50 146 with creation argument;
+#X obj 51 190 s dave;
+#X obj 306 163 r dave;
+#X obj 377 163 r dave;
+#X floatatom 151 167 5 0 0 0 - - -;
+#X floatatom 383 82 5 0 0 0 - - -;
+#X msg 383 105 \; dave \$1;
+#X floatatom 461 80 5 0 0 0 - - -;
+#X msg 461 105 \; hans \$1;
+#X obj 452 163 r hans;
+#X obj 151 191 s hans;
+#X text 98 275 (none);
+#X text 98 339 anything;
+#X text 168 339 - [receive] outputs the message(s) sent from a corresponding
+[send] of the same name.;
+#N canvas 100 55 428 469 Messages_and_Data_Types 0;
+#X floatatom 23 177 5 0 0 0 - - -;
+#X floatatom 22 288 5 0 0 0 - - -;
+#X obj 23 234 s a_float;
+#X obj 22 262 r a_float;
+#X obj 33 205 s whatever;
+#X obj 170 204 s whatever;
+#X obj 158 233 s a_symbol;
+#X obj 158 262 r a_symbol;
+#X symbolatom 158 176 10 0 0 0 - - -;
+#X text 62 176 click-n-drag;
+#X text 228 176 type something;
+#X text 318 200 click this;
+#X obj 305 307 s whatever;
+#X obj 295 277 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 295 336 s a_bang;
+#X text 317 275 click this too;
+#X obj 295 379 r a_bang;
+#X obj 295 407 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 72 313 r whatever;
+#X floatatom 72 443 5 0 0 0 - - -;
+#X symbolatom 113 424 10 0 0 0 - - -;
+#X obj 161 381 print;
+#X obj 195 363 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X symbolatom 158 291 10 0 0 0 - - -;
+#X obj 154 404 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 295 217 \; whatever 1 2 3 4 \;;
+#X obj 72 338 route float symbol list bang;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [receive] More Info;
+#X text 20 38 Pd's [send] and [receive] objects can communicate any
+message that is supported by Pd: floats \, anythings \, lists \, symbols
+\, and bangs. However \, you will need to plan ahead in your patch
+to ensure that a symbol doesn't accidently arrive at a [float] object
+\, or that a list doesn't arrive at a [symbol] object. Consider the
+following: I have been very careful to keep [send] and [receive] groups
+isolated to specific data types - and in the last case \, I have incorporated
+a [route] object to properly receive the various data types at a single
+[receive] object.;
+#X connect 0 0 2 0;
+#X connect 0 0 4 0;
+#X connect 3 0 1 0;
+#X connect 7 0 23 0;
+#X connect 8 0 6 0;
+#X connect 8 0 5 0;
+#X connect 13 0 12 0;
+#X connect 13 0 14 0;
+#X connect 16 0 17 0;
+#X connect 18 0 26 0;
+#X connect 26 0 19 0;
+#X connect 26 1 20 0;
+#X connect 26 2 21 0;
+#X connect 26 2 24 0;
+#X connect 26 3 22 0;
+#X restore 101 569 pd Messages_and_Data_Types;
+#X text 11 23 receive messages without patch cords;
+#X text 168 391 - [receive] accepts a single argument which is a 'name'.
+All [receive]s of the same name correspond to a [send] object of that
+name.;
+#X text 168 275 - data can be inputted to the [receive] object using
+the [send] object or by using the nonlocal send functionality of a
+message box. The [receive] object accepts any message as input.;
+#X text 334 99 Using;
+#X text 334 110 message;
+#X text 334 122 boxes;
+#X text 80 391 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 439 pddp/pddplink all_about_send_n_receive.pd -text all_about_send_n_receive
+;
+#X obj 98 454 pddp/pddplink all_about_scope_and_locality.pd -text all_about_scope_and_locality
+;
+#X obj 97 512 pddp/pddplink ../2.control.examples/09.send_receive.pd
+-text doc/2.control.examples/09.send_receive.pd;
+#X obj 97 527 pddp/pddplink ../2.control.examples/10.more.messages.pd
+-text doc/2.control.examples/10.more.messages.pd;
+#X obj 97 542 pddp/pddplink ../2.control.examples/13.locality.pd -text
+doc/2.control.examples/13.locality.pd;
+#X obj 98 475 pddp/pddplink ../1.manual/x2.htm -text doc/1.manual/x2.htm
+;
+#X obj 98 490 pddp/pddplink ../1.manual/x5.htm -text doc/1.manual/x5.htm
+;
+#X connect 14 0 13 0;
+#X connect 16 0 15 0;
+#X connect 18 0 17 0;
+#X connect 20 0 19 0;
+#X connect 21 0 26 0;
+#X connect 27 0 22 0;
+#X connect 28 0 23 0;
+#X connect 29 0 35 0;
+#X connect 30 0 31 0;
+#X connect 32 0 33 0;
+#X connect 34 0 24 0;
diff --git a/doc/pddp/rev1~-help.pd b/doc/pddp/rev1~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a4416a15829fabd01ecfc30d3e3446e92c41475d
--- /dev/null
+++ b/doc/pddp/rev1~-help.pd
@@ -0,0 +1,120 @@
+#N canvas 16 21 1008 526 12;
+#X obj 148 439 dac~;
+#X obj 58 72 line~;
+#X msg 58 49 0 \, 10000 5;
+#X obj 58 118 cos~;
+#X msg 146 70 1;
+#X obj 146 47 loadbang;
+#X obj 58 95 clip~ 0 0.25;
+#X floatatom 173 264 0 0 0 0 - - -;
+#X obj 251 134 line~;
+#X obj 251 157 cos~;
+#X msg 324 54 -0.25 \, 0.25 100;
+#X obj 251 8 loadbang;
+#X msg 251 31 -0.25;
+#X obj 251 203 *~;
+#X obj 58 140 hip~ 5;
+#X floatatom 162 328 0 0 0 0 - - -;
+#X obj 162 373 pack 0 100;
+#X obj 162 396 line~;
+#X obj 148 416 *~;
+#X obj 162 350 dbtorms;
+#X msg 324 77 -0.25 \, 0.25 400;
+#X floatatom 324 145 0 0 0 0 - - -;
+#X obj 324 191 osc~ 440;
+#X obj 324 168 mtof;
+#X msg 324 31 -0.25 \, 0.25 20;
+#X obj 251 180 *~ 0.1;
+#X msg 324 100 -0.25 \, 0.25 1000;
+#X msg 324 122 -0.25 \, 0.25 2000;
+#X obj 324 226 *~;
+#X obj 342 252 *~;
+#X obj 58 439 dac~;
+#X floatatom 68 323 0 0 0 0 - - -;
+#X obj 68 368 pack 0 100;
+#X obj 68 391 line~;
+#X obj 58 416 *~;
+#X obj 68 346 dbtorms;
+#X msg 324 8 0;
+#X obj 308 257 *~;
+#X obj 58 26 metro 2000;
+#X floatatom 58 4 0 0 0 0 - - -;
+#X msg 220 265 bang;
+#X obj 284 322 env~ 32768;
+#X floatatom 284 344 0 0 0 0 - - -;
+#X text 166 244 1 sec;
+#X text 143 226 dB after;
+#X text 220 245 clear;
+#X text 1 51 impulse;
+#X text 362 7 tone;
+#X text 484 31 beeps;
+#X text 428 147 This is an experimental reverberator design composed
+of a series of allpass filters with exponentially growing delay times.
+Each allpass filter has a gain of 0.7. The reverb time is adjusted
+by adjusting the input gains of the allpass filters. The last unit
+is modified so that its first two "echos" mimic those of an allpass
+but its loop gain depends on reverb time.;
+#X text 430 279 Reverb time is controlled by specifying the dB gain
+(100 normal) after one second \, so that 100 corresponds to infinite
+reverb time \, 70 to two seconds \, 40 to one second \, and 0 to 0
+;
+#X text 671 499 modified for Pd version 0.30.;
+#X msg 560 34 \; pd dsp 1;
+#X text 427 455 The rev1~ module eats about 18% of my 300mHz P2 machine.
+;
+#X obj 148 289 rev1~;
+#X text 428 361 The "clear" button impolitely clears out all the delay
+lines \, You may immediately resume pumping the reverberator \, but
+the input signal should be cleanly enveloped. The output \, too \,
+must be enveloped and may not be opened until 5 msec after the "clear"
+message is sent.;
+#X text 670 482 KEYWORDS unfinished;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 14 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 54 1;
+#X connect 8 0 9 0;
+#X connect 9 0 25 0;
+#X connect 10 0 8 0;
+#X connect 11 0 12 0;
+#X connect 12 0 8 0;
+#X connect 13 0 14 0;
+#X connect 14 0 34 0;
+#X connect 14 0 54 0;
+#X connect 15 0 19 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 1;
+#X connect 18 0 0 0;
+#X connect 19 0 16 0;
+#X connect 20 0 8 0;
+#X connect 21 0 23 0;
+#X connect 22 0 13 1;
+#X connect 22 0 28 0;
+#X connect 22 0 28 1;
+#X connect 22 0 29 0;
+#X connect 23 0 22 0;
+#X connect 24 0 8 0;
+#X connect 25 0 13 0;
+#X connect 26 0 8 0;
+#X connect 27 0 8 0;
+#X connect 28 0 29 1;
+#X connect 28 0 13 1;
+#X connect 28 0 37 0;
+#X connect 28 0 37 1;
+#X connect 29 0 13 1;
+#X connect 31 0 35 0;
+#X connect 32 0 33 0;
+#X connect 33 0 34 1;
+#X connect 34 0 30 0;
+#X connect 35 0 32 0;
+#X connect 36 0 8 0;
+#X connect 37 0 13 1;
+#X connect 38 0 2 0;
+#X connect 39 0 38 0;
+#X connect 40 0 54 2;
+#X connect 41 0 42 0;
+#X connect 54 0 18 0;
+#X connect 54 0 41 0;
diff --git a/doc/pddp/rev2~-help.pd b/doc/pddp/rev2~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f7b1e6d69abf9209f5357520c283a72c1e19570d
--- /dev/null
+++ b/doc/pddp/rev2~-help.pd
@@ -0,0 +1,135 @@
+#N canvas 167 160 766 354 12;
+#X floatatom 73 185 0 0 120 0 - - -;
+#X floatatom 106 323 0 0 120 0 - - -;
+#N canvas 0 0 539 448 tests 0;
+#X obj 67 33 inlet;
+#X obj 309 189 inlet;
+#X obj 235 207 line~;
+#X obj 235 230 cos~;
+#X obj 235 68 loadbang;
+#X msg 235 91 -0.25;
+#X obj 235 276 *~;
+#X obj 186 309 hip~ 5;
+#X floatatom 308 218 0 0 0 0 - - -;
+#X obj 308 264 osc~ 440;
+#X obj 308 241 mtof;
+#X obj 235 253 *~ 0.1;
+#X obj 308 299 *~;
+#X obj 326 325 *~;
+#X obj 292 330 *~;
+#X msg 279 150 -0.25 \, 0.25 \$1;
+#X obj 41 148 biquad~ 0 0 1 -1 0;
+#X obj 63 70 t b;
+#X obj 104 72 del 3;
+#X obj 57 101 1;
+#X obj 96 101 0;
+#X obj 41 355 outlet~;
+#X obj 279 126 inlet;
+#X obj 40 175 *~;
+#X connect 0 0 17 0;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 3 0 11 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 21 0;
+#X connect 8 0 10 0;
+#X connect 9 0 6 1;
+#X connect 9 0 12 0;
+#X connect 9 0 12 1;
+#X connect 9 0 13 0;
+#X connect 10 0 9 0;
+#X connect 11 0 6 0;
+#X connect 12 0 13 1;
+#X connect 12 0 6 1;
+#X connect 12 0 14 0;
+#X connect 12 0 14 1;
+#X connect 13 0 6 1;
+#X connect 14 0 6 1;
+#X connect 15 0 2 0;
+#X connect 16 0 23 0;
+#X connect 17 0 18 0;
+#X connect 17 0 19 0;
+#X connect 18 0 20 0;
+#X connect 19 0 16 0;
+#X connect 19 0 23 1;
+#X connect 20 0 16 0;
+#X connect 20 0 23 1;
+#X connect 22 0 15 0;
+#X connect 23 0 21 0;
+#X restore 17 154 pd tests;
+#X msg 56 35 10;
+#X msg 54 62 20;
+#X msg 53 90 100;
+#X msg 52 115 500;
+#X obj 17 15 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 37 9 impulse;
+#N canvas 0 0 450 300 output 0;
+#X obj 54 202 dac~;
+#X obj 132 119 pack 0 100;
+#X obj 132 142 line~;
+#X obj 54 165 *~;
+#X obj 132 97 dbtorms;
+#X obj 33 42 inlet~;
+#X obj 177 42 inlet;
+#X obj 177 74 clip 0 120;
+#X msg 257 133 \; pd dsp 1;
+#X obj 98 42 inlet~;
+#X obj 94 168 *~;
+#X connect 1 0 2 0;
+#X connect 2 0 3 1;
+#X connect 2 0 10 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 4 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 1;
+#X restore 18 324 pd output;
+#X floatatom 97 127 0 0 0 0 - - -;
+#X text 136 96 tone;
+#X text 135 112 pitch;
+#X text 114 185 level \, dB;
+#X floatatom 117 209 0 0 100 0 - - -;
+#X text 158 209 liveness \, 0-100;
+#X text 505 330 modified for Pd version 0.37;
+#X floatatom 161 235 0 0 120 0 - - -;
+#X floatatom 205 259 0 0 120 0 - - -;
+#X text 192 235 crossover frequency \, Hz.;
+#X text 238 260 HF damping \, percent;
+#X obj 30 290 rev2~ 100 90 3000 20;
+#X text 141 324 output level \, dB;
+#X text 281 8 REV2~ - a simple 1-in \, 4-out reverberator;
+#X text 95 35 tone;
+#X text 96 52 bursts;
+#X text 231 37 The creation arguments (level \, liveness \, crossover
+frequency \, HF damping) may also be supplied in four inlets as shown.
+The "liveness" (actually the internal feedback percentage) should be
+100 for infinite reverb \, 90 for longish \, and 80 for short. The
+crossover frequency and HF damping work together: at frequencies above
+crossover \, the feedback is diminished by the "damping" as a percentage.
+So zero HF damping means equal reverb time at all frequencies \, and
+100% damping means almost nothing above the crossover frequency gets
+through.;
+#X text 132 130 (60 for;
+#X text 115 150 middle C);
+#X text 504 313 KEYWORDS unfinished;
+#X connect 0 0 21 1;
+#X connect 1 0 9 2;
+#X connect 2 0 9 0;
+#X connect 2 0 21 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 1;
+#X connect 6 0 2 1;
+#X connect 7 0 2 0;
+#X connect 10 0 2 2;
+#X connect 14 0 21 2;
+#X connect 17 0 21 3;
+#X connect 18 0 21 4;
+#X connect 21 0 9 0;
+#X connect 21 1 9 1;
diff --git a/doc/pddp/rev3~-help.pd b/doc/pddp/rev3~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9f1e30ce660709f66ad2edeb7ce10b439fd8e1b0
--- /dev/null
+++ b/doc/pddp/rev3~-help.pd
@@ -0,0 +1,137 @@
+#N canvas 70 263 765 380 12;
+#X floatatom 99 212 0 0 120 0 - - -;
+#X floatatom 105 340 0 0 120 0 - - -;
+#N canvas 0 0 539 448 tests 0;
+#X obj 67 33 inlet;
+#X obj 309 189 inlet;
+#X obj 235 207 line~;
+#X obj 235 230 cos~;
+#X obj 235 68 loadbang;
+#X msg 235 91 -0.25;
+#X obj 235 276 *~;
+#X obj 186 309 hip~ 5;
+#X floatatom 308 218 0 0 0 0 - - -;
+#X obj 308 264 osc~ 440;
+#X obj 308 241 mtof;
+#X obj 235 253 *~ 0.1;
+#X obj 308 299 *~;
+#X obj 326 325 *~;
+#X obj 292 330 *~;
+#X msg 279 150 -0.25 \, 0.25 \$1;
+#X obj 41 148 biquad~ 0 0 1 -1 0;
+#X obj 63 70 t b;
+#X obj 104 72 del 3;
+#X obj 57 101 1;
+#X obj 96 101 0;
+#X obj 41 355 outlet~;
+#X obj 279 126 inlet;
+#X obj 51 192 *~;
+#X connect 0 0 17 0;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 3 0 11 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 21 0;
+#X connect 8 0 10 0;
+#X connect 9 0 6 1;
+#X connect 9 0 12 0;
+#X connect 9 0 12 1;
+#X connect 9 0 13 0;
+#X connect 10 0 9 0;
+#X connect 11 0 6 0;
+#X connect 12 0 13 1;
+#X connect 12 0 6 1;
+#X connect 12 0 14 0;
+#X connect 12 0 14 1;
+#X connect 13 0 6 1;
+#X connect 14 0 6 1;
+#X connect 15 0 2 0;
+#X connect 16 0 23 0;
+#X connect 17 0 18 0;
+#X connect 17 0 19 0;
+#X connect 18 0 20 0;
+#X connect 19 0 16 0;
+#X connect 19 0 23 1;
+#X connect 20 0 16 0;
+#X connect 20 0 23 1;
+#X connect 22 0 15 0;
+#X connect 23 0 21 0;
+#X restore 16 171 pd tests;
+#X msg 55 52 10;
+#X msg 53 79 20;
+#X msg 52 107 100;
+#X msg 51 132 500;
+#X obj 16 32 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 36 26 impulse;
+#N canvas 0 0 450 300 output 0;
+#X obj 54 202 dac~;
+#X obj 132 119 pack 0 100;
+#X obj 132 142 line~;
+#X obj 54 165 *~;
+#X obj 132 97 dbtorms;
+#X obj 33 42 inlet~;
+#X obj 177 42 inlet;
+#X obj 177 74 clip 0 120;
+#X msg 257 133 \; pd dsp 1;
+#X obj 98 42 inlet~;
+#X obj 94 168 *~;
+#X connect 1 0 2 0;
+#X connect 2 0 3 1;
+#X connect 2 0 10 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 4 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 1;
+#X restore 17 340 pd output;
+#X floatatom 96 144 0 0 0 0 - - -;
+#X text 135 113 tone;
+#X text 134 129 pitch;
+#X text 140 212 level \, dB;
+#X floatatom 134 234 0 0 100 0 - - -;
+#X text 175 234 liveness \, 0-100;
+#X floatatom 169 258 4 0 5000 0 - - -;
+#X floatatom 204 281 0 0 100 0 - - -;
+#X text 217 256 crossover frequency \, Hz.;
+#X text 240 283 HF damping \, percent;
+#X text 140 341 output level \, dB;
+#X text 94 52 tone;
+#X text 95 69 bursts;
+#X text 131 147 (60 for;
+#X text 114 167 middle C);
+#X obj 29 307 rev3~ 100 90 3000 20;
+#X text 263 4 REV3~ - hard-core \, 2-in \, 4-out reverberator;
+#X text 236 56 The creation arguments (level \, liveness \, crossover
+frequency \, HF damping) may also be supplied in four inlets as shown.
+The "liveness" (actually the internal feedback percentage) should be
+100 for infinite reverb \, 90 for longish \, and 80 for short. The
+crossover frequency and HF damping work together: at frequencies above
+crossover \, the feedback is diminished by the "damping" as a percentage.
+So zero HF damping means equal reverb time at all frequencies \, and
+100% damping means almost nothing above the crossover frequency gets
+through.;
+#X text 236 29 (A more expensive \, presumably better \, one than rev2~.)
+;
+#X text 470 352 modified for Pd version 0.37-1;
+#X text 470 335 KEYWORDS abstraction unfinished;
+#X connect 0 0 25 2;
+#X connect 1 0 9 2;
+#X connect 2 0 9 0;
+#X connect 2 0 25 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 1;
+#X connect 6 0 2 1;
+#X connect 7 0 2 0;
+#X connect 10 0 2 2;
+#X connect 14 0 25 3;
+#X connect 16 0 25 4;
+#X connect 17 0 25 5;
+#X connect 25 0 9 0;
+#X connect 25 1 9 1;
diff --git a/doc/pddp/rmstodb-help.pd b/doc/pddp/rmstodb-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..32e086a1a51bf096a6475a3da49122ddf3d658e3
--- /dev/null
+++ b/doc/pddp/rmstodb-help.pd
@@ -0,0 +1,69 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header rmstodb 3 12 0 18
+-204280 -1 0;
+#X obj 0 430 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control conversion acoustical_units;
+#X text 12 45 DESCRIPTION convert linear amplitude to dB;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 439 cnv 17 3 53 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 542 (none);
+#N canvas 76 440 428 149 Related_objects 0;
+#X text 11 28 Control objects for conversion:;
+#X obj 167 57 dbtopow;
+#X obj 233 57 powtodb;
+#X obj 23 116 mtof~;
+#X obj 68 116 ftom~;
+#X obj 111 116 dbtorms~;
+#X obj 176 116 rmstodb~;
+#X obj 242 116 dbtopow~;
+#X obj 304 116 powtodb~;
+#X text 20 93 Signal objects for conversion:;
+#X obj 23 57 mtof;
+#X obj 70 57 ftom;
+#X obj 108 57 dbtorms;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [rmstodb] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X floatatom 239 216 0 0 0 0 - - -;
+#X floatatom 239 160 0 0 0 0 - - -;
+#X obj 78 510 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 438 float;
+#X text 98 465 list;
+#X text 98 510 float;
+#X obj 474 3 rmstodb;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/rmstodb -text
+pdpedia: rmstodb;
+#X obj 239 189 rmstodb;
+#X text 109 241 The rmstodb object converts from linear ("RMS") amplitude
+to decibels \, so that an "RMS" of 1 corresponds to 100 dB. Zero amplitude
+(strictly speaking \, minus infinity dB) is clipped to zero dB;
+#X text 11 23 convert linear amplitude to dB;
+#X text 158 465 - lists will be truncated \, and the first element
+used as input.;
+#X obj 98 569 pddp/pddplink all_about_acoustic_conversions.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 11 0 18 0;
+#X connect 18 0 10 0;
diff --git a/doc/pddp/rmstodb~-help.pd b/doc/pddp/rmstodb~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2df4619f61cd2a1650512cb22bd5d4e144925cd4
--- /dev/null
+++ b/doc/pddp/rmstodb~-help.pd
@@ -0,0 +1,79 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header rmstodb~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 414 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion acoustical_units;
+#X text 12 45 DESCRIPTION linear amplitude to dB for audio signals
+;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 451 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 487 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 514 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 423 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 491 (none);
+#N canvas 107 461 428 130 Related_objects 0;
+#X obj 187 37 dbtopow~;
+#X obj 253 37 powtodb~;
+#X obj 23 96 mtof;
+#X obj 68 96 ftom;
+#X obj 111 96 dbtorms;
+#X obj 176 96 rmstodb;
+#X obj 242 96 dbtopow;
+#X obj 304 96 powtodb;
+#X text 20 73 Control objects for conversion:;
+#X obj 23 37 mtof~;
+#X obj 70 37 ftom~;
+#X obj 118 37 dbtorms~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [rmstodb~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 209 225 snapshot~;
+#X floatatom 209 256 0 0 0 0 - - -;
+#X floatatom 209 120 0 0 0 0 - - -;
+#X obj 209 144 sig~;
+#X obj 276 199 metro 100;
+#X obj 276 169 loadbang;
+#X text 98 422 signal;
+#X obj 78 460 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 460 signal;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/dbtorms~ -text
+pdpedia: dbtorms~;
+#X obj 209 169 rmstodb~;
+#X obj 474 3 rmstodb~;
+#X text 11 23 linear amplitude to dB for audio signals;
+#X text 99 281 The [rmstodb~] object converts from linear ("RMS") amplitude
+to decibels \, so that an "RMS" of 1 corresponds to 100 dB. Zero amplitude
+(strictly speaking \, minus infinity dB) is clipped to zero dB.;
+#X text 99 518 This object takes an audio signal as input and output
+(and works sample by sample). Since it calls a library math function
+\, it may be much more expensive than other workaday tilde objects
+such as [*~] and [osc~] \, depending on your hardware and math library.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 13 0 20 0;
+#X connect 14 0 10 0;
+#X connect 15 0 14 0;
+#X connect 20 0 10 0;
diff --git a/doc/pddp/route-help.pd b/doc/pddp/route-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2572412ad72e47f35a7873db9e63767b8d15e22e
--- /dev/null
+++ b/doc/pddp/route-help.pd
@@ -0,0 +1,542 @@
+#N canvas 237 28 555 685 10;
+#X obj 0 697 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header route 3 12 0 18
+-204280 -1 0;
+#X obj 0 240 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 229 494 392 META 0;
+#X text 12 85 PLATFORM windows macosx gnulinux;
+#X text 12 165 LIBRARY internal;
+#X text 12 205 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 35 LICENSE SIBSD;
+#X text 12 185 AUTHOR Miller Puckette;
+#X text 12 245 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.38.4 by Dave Sabine and Hans-Christoph Steiner as part of
+a project called pddp proposed by Krzysztof Czaja to build comprehensive
+documentation for Pd. Jonathan Wilkes revised the patch to conform
+to the PDDP template for Pd version 0.42.;
+#X text 12 105 INLET_0 anything;
+#X text 12 125 OUTLET_N anything;
+#X text 12 145 OUTLET_R anything;
+#X text 12 5 KEYWORDS control needs_work list_op symbol_op list_op
+anything_op;
+#X text 12 225 RELEASE_DATE 1997;
+#X text 12 55 DESCRIPTION route a message according to the selector
+or first element;
+#X restore 500 699 pd META;
+#X obj 0 447 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 576 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 672 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 74 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [route] Related Objects;
+#X obj 22 43 select;
+#X obj 72 43 spigot;
+#X obj 123 43 moses;
+#X restore 102 699 pd Related_objects;
+#X obj 78 249 cnv 17 3 125 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 456 cnv 17 3 17 empty \$0-pddp.cnv.let.0 n 5 9 0 16 -228856
+-162280 0;
+#X obj 512 4 route;
+#X obj 459 20 pddp/pddplink http://wiki.puredata.info/en/route -text
+pdpedia: route;
+#X obj 27 113 route 0 1;
+#X msg 27 61 0 12;
+#X msg 65 61 1 13;
+#X msg 103 61 2 14;
+#X obj 78 156 print rejection_outlet;
+#X obj 27 200 print left_outlet;
+#X obj 78 136 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 52 178 print middle_outlet;
+#X obj 52 136 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 27 136 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X msg 140 61 7 17;
+#N canvas 11 63 516 509 float_mode 0;
+#X text 89 271 float;
+#X text 89 365 list;
+#X text 89 325 symbol;
+#X text 89 455 pointer;
+#X text 139 455 - a pointer is always sent to the rightmost outlet.
+;
+#X text 89 438 bang;
+#X text 139 271 - the incoming value is compared to the creation argument(s).
+If there is a match \, a bang is sent to the outlet corresponding to
+the matching creation argument. If there is no match the input is sent
+to the rightmost outlet.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [route] Message Handling in "Float Mode";
+#X obj 1 261 cnv 3 500 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 70 270 cnv 17 3 225 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 138 438 - a bang will be sent to the rightmost inlet.;
+#X text 88 481 All other messages will be sent to the rightmost outlet.
+;
+#X msg 141 50 2;
+#X msg 148 72 1 2 3;
+#X obj 141 167 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 162 167 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 169 116 something else;
+#X obj 204 167 print rejection_outlet;
+#X obj 141 233 print out0;
+#X obj 162 211 print out1;
+#X text 50 26 For "float mode" \, the first argument must be a float.
+;
+#X obj 141 142 route 1 2 3;
+#X obj 183 189 print out2;
+#X obj 183 167 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 158 94 3 dog night;
+#X text 139 325 - the symbol is compared to the creation arguments
+\, and a bang is sent to the corresponding outlet if there is a match.
+;
+#X text 139 365 - the first element of the list is compared to the
+creation argument(s). If there is a match \, the first element is removed
+from the list \, and the remaining list is sent to the outlet corresponding
+to the matching creation argument. If there is no match the input is
+sent to the rightmost outlet.;
+#X connect 13 0 22 0;
+#X connect 14 0 22 0;
+#X connect 17 0 22 0;
+#X connect 22 0 15 0;
+#X connect 22 0 19 0;
+#X connect 22 1 16 0;
+#X connect 22 1 20 0;
+#X connect 22 2 23 0;
+#X connect 22 2 24 0;
+#X connect 22 3 18 0;
+#X connect 25 0 22 0;
+#X restore 171 306 pd float_mode;
+#X text 98 249 anything;
+#X text 168 249 - [route] handles its input in 3 different "modes"
+\, depending on what the creation arguments are. Click the subpatches
+below to see how message types are handled under each mode.;
+#N canvas 15 22 516 599 selector_mode 0;
+#X text 88 548 pointer;
+#X text 138 548 - a pointer is always sent to the rightmost outlet.
+;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 0 389 cnv 3 500 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 69 398 cnv 17 3 255 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 68 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 101 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 203 262 print rejection_outlet;
+#X msg 68 59 der;
+#X obj 68 349 print out0;
+#X obj 101 327 print out1;
+#X text 7 1 [route] Message Handling in "Selector Mode";
+#X msg 92 690 foo;
+#X msg 101 718 symbol foo;
+#X obj 169 283 print out3;
+#X obj 92 840 print out0;
+#X obj 133 818 print out1;
+#X text 120 690 the selector "foo" matches the first argument;
+#X text 171 718 the selector "symbol" matches the second argument;
+#X text 88 398 bang;
+#X text 138 398 - if one of the creation arguments is "bang" \, then
+a bang will be sent out the corresponding outlet.;
+#X text 138 428 - if one of the creation arguments is "float" \, then
+an incoming float will be sent out the corresponding outlet.;
+#X text 88 428 float;
+#X text 88 458 list;
+#X text 138 458 - if one of the creation arguments is "list" \, then
+two behaviors are possible:;
+#X text 138 484 a) if the first element is a float \, the list is sent
+out the corresponding outlet.;
+#X text 138 509 b) if the first element is a symbol \, the "list" selector
+is removed \, and the remaining message is sent out the corresponding
+outlet.;
+#X text 88 568 symbol;
+#X text 138 568 - if one of the creation arguments is "symbol" \, then
+an incoming symbol will be sent out the corresponding outlet.;
+#X text 87 596 All other messages - the selector of the incoming message
+is compared to the creation argument(s). If there is a match \, the
+selector is stripped and the remaining message is sent to the corresponding
+outlet. If there is no match the input is sent to the rightmost outlet.
+;
+#X text 91 667 Beware! All this can be confusing at times...;
+#X msg 84 103 das;
+#X obj 135 305 print out2;
+#X obj 135 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 169 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 108 182 doh;
+#X obj 203 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 74 81 die 41;
+#X text 49 36 In selector mode \, all creation arguments should be
+symbols.;
+#X obj 68 221 route der die das float;
+#X msg 93 125 float 41;
+#X msg 103 153 41;
+#X text 135 147 (Remember: a single float "n" in a message or object
+box is shorthand for "float n");
+#X text 134 181 sent to the rightmost outlet (the "rejection outlet")
+;
+#X obj 92 774 route foo symbol list;
+#X obj 174 796 print out2;
+#X msg 128 744 2 3 four;
+#X text 189 744 an implicit list-- matches the third argument;
+#X connect 8 0 39 0;
+#X connect 12 0 44 0;
+#X connect 13 0 44 0;
+#X connect 31 0 39 0;
+#X connect 35 0 39 0;
+#X connect 37 0 39 0;
+#X connect 39 0 5 0;
+#X connect 39 0 9 0;
+#X connect 39 1 6 0;
+#X connect 39 1 10 0;
+#X connect 39 2 32 0;
+#X connect 39 2 33 0;
+#X connect 39 3 14 0;
+#X connect 39 3 34 0;
+#X connect 39 4 7 0;
+#X connect 39 4 36 0;
+#X connect 40 0 39 0;
+#X connect 41 0 39 0;
+#X connect 44 0 15 0;
+#X connect 44 1 16 0;
+#X connect 44 2 45 0;
+#X connect 46 0 44 0;
+#X restore 171 331 pd selector_mode;
+#X obj 78 496 cnv 17 3 17 empty \$0-pddp.cnv.let.0 r 5 9 0 16 -228856
+-162280 0;
+#X text 98 497 anything;
+#X text 80 594 1) float;
+#X text 168 594 - [route] can take symbols or floats as arguments.
+(Note: the first argument determines which "mode" below.) If floats
+are used \, [route] operates in "float mode"-- if symbols are used
+\, float operates in "selector mode." See the subpatches above to see
+how incoming data is handled in each mode.;
+#X obj 4 699 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 100 675 pddp/pddplink ../2.control.examples/18.conditional.pd
+-text doc/2.control.examples/18.conditional.pd;
+#X msg 140 85 Grizabella;
+#X text 11 23 route a message according to the selector or first element
+;
+#N canvas 592 32 442 587 type_mode 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [route] Message Handling in "Type Mode";
+#X msg 84 304 bang;
+#X msg 96 348 symbol pie;
+#X msg 99 368 pie;
+#X msg 78 265 1 2 3;
+#X text 102 225 a float;
+#X text 126 264 a list (of floats);
+#X text 121 304 a bang;
+#X text 175 348 a symbol;
+#X text 133 369 none of the above!;
+#X text 196 285 a list of symbols;
+#X floatatom 109 425 5 0 0 0 - - -;
+#X symbolatom 157 424 10 0 0 0 - - -;
+#X obj 62 445 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X msg 72 225 89;
+#X msg 75 245 float 7;
+#X obj 62 401 route bang float symbol list;
+#X obj 109 445 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 157 445 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 205 445 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 253 445 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X msg 81 285 list moon earth;
+#X text 130 245 definitely a float!;
+#X text 49 482 [trigger]-style shortcuts don't work:;
+#X text 162 501 !=;
+#X obj 63 502 route b f s l;
+#X obj 184 502 route bang float symbol list;
+#N canvas 0 22 466 633 routing_data_types 0;
+#X obj 334 314 route symbol;
+#X obj 336 334 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 413 335 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 331 361 route symbol;
+#X obj 333 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 410 382 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 318 269 test;
+#X msg 357 269 symbol test;
+#X obj 58 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 135 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 55 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 132 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 89 266 bang;
+#X obj 56 311 route bang;
+#X obj 53 358 route bang;
+#X text 14 5 routing based on reserved words:;
+#X obj 188 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 265 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 185 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 262 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 186 311 route float;
+#X obj 183 358 route float;
+#X msg 170 266 1;
+#X msg 209 266 float 12;
+#X obj 181 542 route list;
+#X obj 181 561 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 249 562 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 168 580 route list;
+#X obj 168 599 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 236 600 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 184 493 list 1 two 3;
+#X msg 167 473 1 two 3;
+#X msg 200 513 list one 2 three;
+#X msg 365 289 symbol;
+#X msg 113 484 list;
+#X msg 224 287 float test;
+#X text 26 245 These all output the as same atom type that is routed:
+;
+#X msg 15 266 bang test;
+#X obj 71 131 route 1;
+#X msg 71 183 2 3 4;
+#X obj 71 164 prepend set;
+#X msg 71 100 1 2 3 4;
+#X msg 218 183 is not a list;
+#X obj 218 164 prepend set;
+#X obj 218 131 route this;
+#X msg 218 100 this is not a list;
+#X text 21 50 [route] has three modes \, first is float \, second is
+symbol \, and third is data type. In the first two modes \, the first
+element of the set is stripped off by [route].;
+#X text 26 206 In the third mode \, [route] outputs the same atom type
+(bang->bang \, float->float \, symbol->symbol).;
+#X text 26 419 Lists do not behave the same with [route list] even
+though it is interpreting incoming lists \, not just routing by keyword
+\, as in the second symbol mode.;
+#X msg 174 164 set;
+#X text 157 164 re;
+#X text 164 24 "bang" \, "float" \, "symbol" \, and "list";
+#X connect 0 0 1 0;
+#X connect 0 0 3 0;
+#X connect 0 1 2 0;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 6 0 0 0;
+#X connect 7 0 0 0;
+#X connect 12 0 13 0;
+#X connect 13 0 8 0;
+#X connect 13 0 14 0;
+#X connect 13 1 9 0;
+#X connect 14 0 10 0;
+#X connect 14 1 11 0;
+#X connect 20 0 16 0;
+#X connect 20 0 21 0;
+#X connect 20 1 17 0;
+#X connect 21 0 18 0;
+#X connect 21 1 19 0;
+#X connect 22 0 20 0;
+#X connect 23 0 20 0;
+#X connect 24 0 25 0;
+#X connect 24 0 27 0;
+#X connect 24 1 26 0;
+#X connect 27 0 28 0;
+#X connect 27 1 29 0;
+#X connect 30 0 24 0;
+#X connect 31 0 24 0;
+#X connect 32 0 24 0;
+#X connect 33 0 0 0;
+#X connect 34 0 24 0;
+#X connect 35 0 20 0;
+#X connect 37 0 13 0;
+#X connect 38 0 40 0;
+#X connect 40 0 39 0;
+#X connect 41 0 38 0;
+#X connect 43 0 42 0;
+#X connect 44 0 43 0;
+#X connect 45 0 44 0;
+#X connect 49 0 42 0;
+#X connect 49 0 39 0;
+#X restore 71 549 pd routing_data_types;
+#X text 47 529 More info:;
+#X text 20 37 In type mode \, the arguments are zero or one of the
+four reserved words: "bang" \, "float" \, "symbol" \, and "list". Instead
+of matching the 'value' of a message \, the [route] object will match
+'data type': i.e. lists will be sent through the first outlet \, floats
+will be sent through the second outlet \, symbols through the third
+outlet \, bangs through the fourth outlet. The fifth outlet will then
+output anything that does not match one of the previously defined data
+types (i.e. the "pie" message below is a text message that hasn't been
+defined as a 'symbol' - hence \, Pd cannot determine which data type
+it is and it will be output through the right-most outlet).;
+#N canvas 0 22 450 300 special_cases_of_lists 0;
+#X msg 87 54 list;
+#X msg 88 87 list 5;
+#X text 65 23 SPECIAL CASES OF LISTS.;
+#X floatatom 107 188 5 0 0 0 - - -;
+#X symbolatom 155 187 10 0 0 0 - - -;
+#X obj 60 208 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 -1
+-1;
+#X msg 88 124 list not-a-list;
+#X obj 60 164 route bang float symbol list;
+#X obj 107 208 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 155 208 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 203 208 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 251 208 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X text 86 40 An empty list is translated into a bang;
+#X text 86 73 A list with only one float is translated to a float;
+#X text 86 109 A list with only one symbol is translated to a symbol
+;
+#X connect 0 0 7 0;
+#X connect 1 0 7 0;
+#X connect 3 0 8 0;
+#X connect 4 0 9 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 7 1 3 0;
+#X connect 7 2 4 0;
+#X connect 7 3 10 0;
+#X connect 7 4 11 0;
+#X restore 211 549 pd special_cases_of_lists;
+#X obj 91 328 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 108 326 also a bang;
+#X connect 2 0 17 0;
+#X connect 3 0 17 0;
+#X connect 4 0 17 0;
+#X connect 5 0 17 0;
+#X connect 12 0 18 0;
+#X connect 13 0 19 0;
+#X connect 15 0 17 0;
+#X connect 16 0 17 0;
+#X connect 17 0 14 0;
+#X connect 17 1 12 0;
+#X connect 17 2 13 0;
+#X connect 17 3 20 0;
+#X connect 17 4 21 0;
+#X connect 22 0 17 0;
+#X connect 32 0 17 0;
+#X restore 171 356 pd type_mode;
+#X text 277 356 match the type of the message;
+#X text 277 331 match first symbol in the message;
+#X text 261 306 match first float in the message;
+#X text 98 457 anything;
+#X text 168 540 An incoming pointer will never match and so will always
+be sent to the rejection outlet.;
+#X text 168 456 - an outlet is added for each argument. Messages that
+match are output from the respective outlet with its first element
+stripped off.;
+#X text 168 497 - the rightmost outlet of [route] is always the "rejection
+outlet." Incoming messages which do not match any of the arguments
+are sent to the rightmost outlet unchanged.;
+#X text 97 608 symbol;
+#X obj 78 387 cnv 17 3 45 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 386 float;
+#N canvas 79 52 428 344 second_inlet 0;
+#X floatatom 68 278 5 0 0 0 - - -;
+#X floatatom 31 232 5 0 0 0 - - -;
+#X floatatom 80 234 5 0 0 0 - - -;
+#X obj 217 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 203 206 symbol word;
+#X msg 217 228 symbol other;
+#X msg 315 240 symbol other;
+#X obj 274 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 312 216 symbol word;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [route] The Second Inlet;
+#X text 20 38 The right inlet is used to reset the argument's value
+as in the patch below. This feature is available only on [route] objects
+with only ONE creation argument (or no creation arguments in which
+case it takes on the default value of 0). In the other examples with
+multiple creation arguments \, you'll notice that this second inlet
+is absent.;
+#X obj 23 256 route 42;
+#X obj 217 276 route word;
+#X floatatom 23 278 5 0 0 0 - - -;
+#X msg 23 210 42;
+#X obj 217 255 list trim;
+#X text 20 128 Also notice in the right example how symbols need to
+be truncated of its symbol prefix using [list trim] or using a message.
+Otherwise \, route will not recognize the value correctly.;
+#X msg 164 206 word;
+#X msg 125 182 symbol word;
+#X connect 1 0 12 0;
+#X connect 2 0 12 1;
+#X connect 4 0 16 0;
+#X connect 5 0 16 0;
+#X connect 6 0 13 1;
+#X connect 8 0 13 1;
+#X connect 12 0 14 0;
+#X connect 12 1 0 0;
+#X connect 13 0 3 0;
+#X connect 13 1 7 0;
+#X connect 15 0 12 0;
+#X connect 16 0 13 0;
+#X connect 18 0 13 0;
+#X connect 19 0 13 0;
+#X restore 171 416 pd second_inlet;
+#X text 98 400 symbol;
+#X text 167 386 - the right inlet is available if there is only one
+creation argument. See the subpatch below for details:;
+#X msg 269 85 symbol other;
+#X obj 258 145 route word;
+#X obj 269 110 list trim;
+#X msg 258 60 other;
+#X obj 315 168 print rejection_outlet;
+#X obj 258 192 print left_outlet;
+#X symbolatom 355 86 10 0 0 0 - - -;
+#X symbolatom 334 119 10 0 0 0 - - -;
+#X text 398 119 This one doesn't work;
+#X connect 12 0 17 0;
+#X connect 12 0 21 0;
+#X connect 12 1 19 0;
+#X connect 12 1 20 0;
+#X connect 12 2 16 0;
+#X connect 12 2 18 0;
+#X connect 13 0 12 0;
+#X connect 14 0 12 0;
+#X connect 15 0 12 0;
+#X connect 22 0 12 0;
+#X connect 33 0 12 0;
+#X connect 49 0 51 0;
+#X connect 50 0 54 0;
+#X connect 50 1 53 0;
+#X connect 51 0 50 0;
+#X connect 52 0 50 0;
+#X connect 55 0 51 0;
+#X connect 56 0 50 0;
diff --git a/doc/pddp/rpole~-help.pd b/doc/pddp/rpole~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..94d534ccd94e55bd8fe62ac62a2e1c1f18e97f66
--- /dev/null
+++ b/doc/pddp/rpole~-help.pd
@@ -0,0 +1,142 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header rpole~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 338 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 246 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version-0.38. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION real one-pole (recursive) filter \, raw;
+#X text 12 85 INLET_1 float signal;
+#X text 12 65 INLET_0 signal clear set;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 454 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 486 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 528 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 347 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 463 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 413 cnv 17 3 30 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 479 3 rpole~;
+#X obj 452 20 pddp/pddplink http://wiki.puredata.info/en/rpole~ -text
+pdpedia: rpole~;
+#X floatatom 152 194 0 0 0 0 - - -;
+#X obj 96 107 osc~ 100;
+#X msg 111 139 clear;
+#X msg 113 165 set 1;
+#X text 163 165 <-- set internal state;
+#X text 163 108 <-- signal to filter;
+#X text 182 195 <-- filter coefficient (may be a signal);
+#X text 182 217 <-- creation argument initializes filter coefficient
+;
+#X text 163 139 <-- clear internal state to zero;
+#X obj 95 217 rpole~ 0.9;
+#N canvas 93 273 326 287 test 0;
+#X obj 76 78 osc~;
+#X floatatom 76 55 5 0 0 0 - - -;
+#X obj 77 219 env~ 16384;
+#X floatatom 77 243 5 0 0 0 - - -;
+#X obj 76 168 rpole~;
+#X obj 104 107 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 76 105 *~;
+#X msg 97 137 set 1;
+#X floatatom 172 157 4 -100 100 0 - - -;
+#X obj 172 182 / 100;
+#X obj 214 256 dac~;
+#X obj 228 177 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 214 220 *~;
+#X obj 230 197 / 10;
+#X text 80 18 Stuff to test it:;
+#X connect 0 0 6 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 4 0 2 0;
+#X connect 4 0 12 0;
+#X connect 5 0 6 1;
+#X connect 6 0 4 0;
+#X connect 7 0 4 0;
+#X connect 8 0 9 0;
+#X connect 9 0 4 1;
+#X connect 11 0 13 0;
+#X connect 12 0 10 0;
+#X connect 12 0 10 1;
+#X connect 13 0 12 1;
+#X restore 101 537 pd test;
+#X text 11 23 real one-pole (recursive) filter \, raw;
+#X text 50 58 [rpole~] filters an audio signal (left inlet) via a one-pole
+real filter \, whose coefficient is controlled by a creation argument
+or by an audio signal (right inlet).;
+#X text 98 346 signal;
+#X text 168 346 - the incoming signal to filter.;
+#X text 98 366 clear;
+#X text 168 366 - clear internal state to zero.;
+#X text 98 386 set;
+#X text 168 386 - set internal state (e.g. \, "set 1").;
+#X text 98 412 float;
+#X text 98 462 signal;
+#X text 168 462 - the outgoing \, filtered signal.;
+#X text 108 264 y[n] = y[n-1] + a[n] * x[n];
+#X text 49 316 The transfer function is H(Z) = 1/(1 - aZ^-1).;
+#X text 49 284 where y[n] is the output \, x[n] the input \, and a[n]
+the filter coefficient. The filter is unstable if/when |a[n]|>1.;
+#X text 80 505 1) float;
+#N canvas 27 280 428 309 Related_objects 0;
+#X obj 74 60 rzero~;
+#X obj 25 80 cpole~;
+#X obj 25 60 rpole~;
+#X obj 123 60 rzero_rev~;
+#X obj 74 80 czero~;
+#X obj 123 80 czero_rev~;
+#X text 201 60 real;
+#X text 200 81 complex;
+#X text 22 44 1-pole;
+#X text 71 44 1-zero;
+#X text 121 44 1-zero \, reversed;
+#X text 47 29 summary of raw filters:;
+#X text 18 184 User-friendly Filters;
+#X obj 21 213 lop~;
+#X obj 72 212 hip~;
+#X obj 124 213 bp~;
+#X obj 169 214 vcf~;
+#X obj 22 274 biquad~;
+#X text 18 250 Other Objects;
+#X text 18 113 Pd also provides a suite of user-friendly filters. This
+and other raw filters are provided for situations which the user-friendly
+ones can't handle. See Chapter 8 of http://crca.ucsd.edu/~msp/techniques
+for an introduction to the necessary theory.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [rpole~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 98 430 signal;
+#X text 167 430 - filter coefficient.;
+#X text 167 412 - filter coefficient.;
+#X text 167 505 - (optional) initializes filter coefficient.;
+#X text 49 242 The action of [rpole~] is:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 557 pddp/pddplink ../3.audio.examples/H11.shelving.pd -text
+doc/3.audio.examples/H11.shelving.pd;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/H14.all.pass.pd -text
+doc/3.audio.examples/H14.all.pass.pd;
+#X connect 12 0 21 1;
+#X connect 13 0 21 0;
+#X connect 14 0 21 0;
+#X connect 15 0 21 0;
diff --git a/doc/pddp/rsqrt~-help.pd b/doc/pddp/rsqrt~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ec111b4703af5996f81d3591b85725a3ca87522f
--- /dev/null
+++ b/doc/pddp/rsqrt~-help.pd
@@ -0,0 +1,75 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header rsqrt~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 468 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION signal reciprocal square root;
+#X text 12 5 KEYWORDS signal;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 504 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 544 (none);
+#N canvas 61 484 428 105 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 sqrt~;
+#X obj 137 43 q8_sqrt~;
+#X obj 67 43 q8_rsqrt~;
+#X obj 197 43 sqrt;
+#X text 8 2 [rsqrt~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 476 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 513 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 478 3 rsqrt~;
+#X obj 452 20 pddp/pddplink http://wiki.puredata.info/en/rsqrt~ -text
+pdpedia: rsqrt~;
+#X obj 233 261 metro 500;
+#X obj 233 236 r metro;
+#X floatatom 217 157 0 0 0 0 - - -;
+#X floatatom 217 319 0 0 0 0 - - -;
+#X obj 217 294 snapshot~;
+#X floatatom 217 404 9 0 0 0 - - -;
+#X obj 217 346 t f f;
+#X obj 217 375 *;
+#X obj 217 183 sig~;
+#X obj 217 212 rsqrt~;
+#X text 98 475 signal;
+#X text 98 512 signal;
+#X text 11 23 signal reciprocal square root;
+#X text 168 475 - incoming signal.;
+#X text 168 512 - reciprocal square root of the incoming signal.;
+#X text 74 110 [rsqrt~] takes the approximate reciprocal square root
+of the incoming signal \, using a fast \, approximate algorithm which
+is probably accurate to about 120 dB (20 bits).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 13 0 17 0;
+#X connect 14 0 13 0;
+#X connect 14 0 13 0;
+#X connect 15 0 21 0;
+#X connect 16 0 19 0;
+#X connect 17 0 16 0;
+#X connect 19 0 20 0;
+#X connect 19 1 20 1;
+#X connect 20 0 18 0;
+#X connect 21 0 22 0;
+#X connect 22 0 17 0;
diff --git a/doc/pddp/rzero_rev~-help.pd b/doc/pddp/rzero_rev~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f9e2392e36860aa70ae7c34a250110688e000882
--- /dev/null
+++ b/doc/pddp/rzero_rev~-help.pd
@@ -0,0 +1,137 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header rzero_rev~ 3 12
+0 18 -204280 -1 0;
+#X obj 0 335 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 247 494 344 META 0;
+#X text 12 135 LIBRARY internal;
+#X text 12 175 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 155 AUTHOR Miller Puckette;
+#X text 12 215 HELP_PATCH_AUTHORS Updated for Pd version-0.38. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION real one-zero (non-recursive) "reverse" filter
+\, raw;
+#X text 12 75 INLET_0 signal clear set;
+#X text 12 95 INLET_1 float signal;
+#X text 12 115 OUTLET_0 signal;
+#X text 12 195 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 465 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 543 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 344 cnv 17 3 65 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 474 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 419 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 418 float;
+#X obj 459 3 rzero_rev~;
+#X obj 431 20 pddp/pddplink http://wiki.puredata.info/en/rzero_rev~
+-text pdpedia: rzero_rev~;
+#X floatatom 283 190 0 0 0 0 - - -;
+#X obj 215 116 osc~ 100;
+#X msg 230 148 clear;
+#X msg 232 174 set 1;
+#X obj 214 216 rzero_rev~ 1;
+#X text 11 23 real one-zero (non-recursive) "reverse" filter \, raw
+;
+#X text 98 343 signal;
+#X text 98 363 clear;
+#X text 98 393 set;
+#X text 168 363 - clear internal state to zero.;
+#X text 168 343 - the incoming signal to be filtered.;
+#X text 168 393 - set internal state.;
+#X text 167 418 - filter coefficient.;
+#X text 167 438 - filter coefficient.;
+#X text 98 473 signal;
+#X text 168 473 - the outgoing \, filtered signal.;
+#X text 80 520 1) float;
+#X text 167 520 - (optional) initializes the filter coefficient.;
+#X text 69 49 [rzero_rev~] filters an audio signal (left inlet) via
+a one-zero real filter \, whose coefficient is controlled by a creation
+argument or by an audio signal (right inlet). The impulse response
+is that of "rzero" reversed in time.;
+#N canvas 27 280 428 309 Related_objects 0;
+#X obj 74 60 rzero~;
+#X obj 25 80 cpole~;
+#X obj 25 60 rpole~;
+#X obj 123 60 rzero_rev~;
+#X obj 74 80 czero~;
+#X obj 123 80 czero_rev~;
+#X text 201 60 real;
+#X text 200 81 complex;
+#X text 22 44 1-pole;
+#X text 71 44 1-zero;
+#X text 121 44 1-zero \, reversed;
+#X text 47 29 summary of raw filters:;
+#X text 18 184 User-friendly Filters;
+#X obj 21 213 lop~;
+#X obj 72 212 hip~;
+#X obj 124 213 bp~;
+#X obj 169 214 vcf~;
+#X obj 22 274 biquad~;
+#X text 18 250 Other Objects;
+#X text 18 113 Pd also provides a suite of user-friendly filters. This
+and other raw filters are provided for situations which the user-friendly
+ones can't handle. See Chapter 8 of http://crca.ucsd.edu/~msp/techniques
+for an introduction to the necessary theory.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [rzero_rev~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#N canvas 80 271 326 287 test 0;
+#X obj 76 78 osc~;
+#X floatatom 76 55 5 0 0 0 - - -;
+#X obj 77 219 env~ 16384;
+#X floatatom 77 243 5 0 0 0 - - -;
+#X obj 104 107 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 76 105 *~;
+#X msg 97 137 set 1;
+#X floatatom 172 157 4 -100 100 0 - - -;
+#X obj 172 182 / 100;
+#X obj 214 256 dac~;
+#X obj 228 177 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 214 220 *~;
+#X obj 230 197 / 10;
+#X text 80 18 Stuff to test it:;
+#X obj 76 168 rzero_rev~;
+#X connect 0 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 1;
+#X connect 5 0 14 0;
+#X connect 6 0 14 0;
+#X connect 7 0 8 0;
+#X connect 8 0 14 1;
+#X connect 10 0 12 0;
+#X connect 11 0 9 0;
+#X connect 11 0 9 1;
+#X connect 12 0 11 1;
+#X connect 14 0 2 0;
+#X connect 14 0 11 0;
+#X restore 102 552 pd test;
+#X text 70 281 where y[n] is the output \, x[n] the input \, and a[n]
+the filter coefficient. The filter is always stable.;
+#X text 126 261 y[n] = -a[n] * x[n] + x[n-1];
+#X text 70 312 The transfer function is H(Z) = -a + Z^-1.;
+#X text 69 240 The action of [rzero_rev~] is:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 99 572 pddp/pddplink ../3.audio.examples/H14.all.pass.pd -text
+doc/3.audio.examples/H14.all.pass.pd;
+#X text 98 438 signal;
+#X connect 13 0 17 1;
+#X connect 14 0 17 0;
+#X connect 15 0 17 0;
+#X connect 16 0 17 0;
diff --git a/doc/pddp/rzero~-help.pd b/doc/pddp/rzero~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..35335ecf135d45910e013cfb8dc6c4eebe791730
--- /dev/null
+++ b/doc/pddp/rzero~-help.pd
@@ -0,0 +1,135 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header rzero~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 349 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 247 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version-0.38. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION real one-zero (non-recursive) filter \, raw
+;
+#X text 12 65 INLET_0 signal clear set;
+#X text 12 85 INLET_1 float signal;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 465 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 544 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 358 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 474 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 424 cnv 17 3 30 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 423 float;
+#X obj 479 3 rzero~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/rzero~ -text
+pdpedia: rzero~;
+#X floatatom 241 193 0 0 0 0 - - -;
+#X obj 197 108 osc~ 100;
+#X msg 212 140 clear;
+#X msg 214 166 set 1;
+#X obj 196 218 rzero~ 1;
+#X text 11 23 real one-zero (non-recursive) filter \, raw;
+#X text 98 357 signal;
+#X text 168 357 - the incoming signal to filter.;
+#X text 74 52 [rzero~] filters an audio signal (left inlet) via a one-zero
+real filter \, whose coefficient is controlled by a creation argument
+or by an audio signal (right inlet).;
+#X text 98 377 clear;
+#X text 168 377 - clear internal state to zero.;
+#X text 98 397 set;
+#X text 168 397 - set internal state (e.g. \, "set 1").;
+#X text 167 423 - filter coefficient.;
+#X text 167 438 - filter coefficient.;
+#X text 98 438 signal;
+#X text 80 521 1) float;
+#X text 167 521 - (optional) initializes the filter coefficient.;
+#X text 98 473 signal;
+#X text 168 473 - the outgoing \, filtered signal.;
+#N canvas 74 275 326 287 test 0;
+#X obj 76 78 osc~;
+#X floatatom 76 55 5 0 0 0 - - -;
+#X obj 77 219 env~ 16384;
+#X floatatom 77 243 5 0 0 0 - - -;
+#X obj 104 107 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 76 105 *~;
+#X msg 97 137 set 1;
+#X floatatom 172 157 4 -100 100 0 - - -;
+#X obj 172 182 / 100;
+#X obj 214 256 dac~;
+#X obj 228 177 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 214 220 *~;
+#X obj 230 197 / 10;
+#X text 80 18 Stuff to test it:;
+#X obj 76 168 rzero~;
+#X connect 0 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 1;
+#X connect 5 0 14 0;
+#X connect 6 0 14 0;
+#X connect 7 0 8 0;
+#X connect 8 0 14 1;
+#X connect 10 0 12 0;
+#X connect 11 0 9 0;
+#X connect 11 0 9 1;
+#X connect 12 0 11 1;
+#X connect 14 0 2 0;
+#X connect 14 0 11 0;
+#X restore 101 553 pd test;
+#N canvas 27 280 428 309 Related_objects 0;
+#X obj 74 60 rzero~;
+#X obj 25 80 cpole~;
+#X obj 25 60 rpole~;
+#X obj 123 60 rzero_rev~;
+#X obj 74 80 czero~;
+#X obj 123 80 czero_rev~;
+#X text 201 60 real;
+#X text 200 81 complex;
+#X text 22 44 1-pole;
+#X text 71 44 1-zero;
+#X text 121 44 1-zero \, reversed;
+#X text 47 29 summary of raw filters:;
+#X text 18 184 User-friendly Filters;
+#X obj 21 213 lop~;
+#X obj 72 212 hip~;
+#X obj 124 213 bp~;
+#X obj 169 214 vcf~;
+#X obj 22 274 biquad~;
+#X text 18 250 Other Objects;
+#X text 18 113 Pd also provides a suite of user-friendly filters. This
+and other raw filters are provided for situations which the user-friendly
+ones can't handle. See Chapter 8 of http://crca.ucsd.edu/~msp/techniques
+for an introduction to the necessary theory.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [rzero~] Related Objects;
+#X restore 101 597 pd Related_objects;
+#X text 74 290 where y[n] is the output \, x[n] the input \, and a[n]
+the filter coefficient. The filter is always stable.;
+#X text 74 320 The transfer function is H(Z) = 1 - aZ^-1.;
+#X text 128 269 y[n] = x[n] - a[n] * x[n-1];
+#X text 74 249 The action of [rzero~] is:;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 573 pddp/pddplink ../3.audio.examples/H11.shelving.pd -text
+doc/3.audio.examples/H11.shelving.pd;
+#X connect 13 0 17 1;
+#X connect 14 0 17 0;
+#X connect 15 0 17 0;
+#X connect 16 0 17 0;
diff --git a/doc/pddp/samphold~-help.pd b/doc/pddp/samphold~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4aa81416479ca17767f66d7c38699a7747088a08
--- /dev/null
+++ b/doc/pddp/samphold~-help.pd
@@ -0,0 +1,108 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header samphold~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 244 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 248 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for version 0.39. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION sample and hold unit;
+#X text 12 65 INLET_0 signal set reset;
+#X text 12 85 INLET_1 signal float;
+#X text 12 105 OUTLET signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 507 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 544 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 569 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 547 (none);
+#N canvas 91 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [samphold~] Related Objects;
+#X obj 22 43 phasor~;
+#X obj 79 43 threshold~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 253 cnv 17 3 175 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 516 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 441 cnv 17 3 60 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 464 3 samphold~;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/samphold~
+-text pdpedia: samphold~;
+#X obj 180 197 snapshot~;
+#X floatatom 180 219 5 0 0 0 - - -;
+#X obj 180 151 samphold~;
+#X obj 207 118 sig~;
+#X obj 252 140 sig~;
+#X floatatom 207 97 3 0 0 0 - - -;
+#X floatatom 252 119 3 0 0 0 - - -;
+#X msg 130 48 set 34;
+#X msg 192 71 reset;
+#X text 232 96 sample signal;
+#X text 277 117 control signal;
+#X msg 180 48 reset 10;
+#X text 238 77 to force the next sample;
+#X text 237 63 reset to default 1e+20;
+#X text 98 252 signal;
+#X text 98 292 set;
+#X text 98 322 reset;
+#X text 98 399 float;
+#X text 168 252 - incoming signal \, which is sampled whenever the
+right input decreases in value (as [phasor~] does each period \, for
+example).;
+#X text 98 440 signal;
+#X text 98 464 float;
+#X text 167 464 - floats are accepted (and lists truncated) without
+error. They are ignored \, however \, if there is a signal connection
+to the same inlet.;
+#X text 98 515 signal;
+#X text 168 515 - the outgoing signal;
+#X text 168 292 - the "set" message sets the output value \, which
+continues to be updated as normal afterward (e.g. \, "set 34").;
+#X text 167 440 - the right inlet is the "control signal". When it
+decreases in value \, the left input is sampled.;
+#N canvas 291 150 170 145 metro 0;
+#X obj 19 18 loadbang;
+#X obj 19 42 metro 100;
+#X obj 19 65 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 192 174 pd metro;
+#X text 11 23 sample and hold unit;
+#X text 168 399 - floats are accepted (and lists truncated) without
+error. They are ignored \, however \, if there is a signal connection
+to the same inlet.;
+#X text 168 322 - the "reset" message causes [samphold~] to act as
+if the specified value were the most recent value of the control input
+(e.g. \, "reset 10"). Use this \, for example \, if you reset the incoming
+phasor but don't want the jump reflected in the output. Plain "reset"
+is equivalent to "reset infinity" which forces the next input to be
+sampled.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 573 pddp/pddplink ../3.audio.examples/C09.sample.hold.pd
+-text doc/3.audio.examples/C09.sample.hold.pd;
+#X connect 14 0 15 0;
+#X connect 16 0 14 0;
+#X connect 17 0 16 0;
+#X connect 18 0 16 1;
+#X connect 19 0 17 0;
+#X connect 20 0 18 0;
+#X connect 21 0 16 0;
+#X connect 22 0 16 0;
+#X connect 25 0 16 0;
+#X connect 40 0 14 0;
diff --git a/doc/pddp/samplerate~-help.pd b/doc/pddp/samplerate~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1db51e460a28af4a32397018872118ad93d4d6cf
--- /dev/null
+++ b/doc/pddp/samplerate~-help.pd
@@ -0,0 +1,56 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header samplerate~ 3 12
+0 18 -204280 -1 0;
+#X obj 0 431 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 45 DESCRIPTION get the current sample rate;
+#X text 12 65 INLET_0 bang;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS control;
+#X restore 500 597 pd META;
+#X obj 0 473 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 511 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 515 (none);
+#N canvas 102 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [samplerate~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 440 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 482 float;
+#X obj 78 483 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 455 3 samplerate~;
+#X obj 425 20 pddp/pddplink http://wiki.puredata.info/en/samplerate~
+-text pdpedia: samplerate~;
+#X obj 225 197 samplerate~;
+#X floatatom 225 240 8 0 0 0 - - -;
+#X obj 225 154 bng 30 250 50 0 empty empty empty 0 -6 0 8 -260818 -1
+-1;
+#X text 98 439 bang;
+#X text 168 439 - when sent a bang message \, [samplerate~] outputs
+the sample rate that Pd is currently running at.;
+#X text 99 542 Pd's sample rate can be changed using the command line
+flag: -r <n>. For example: pd -r 22050;
+#X text 11 23 get the current sample rate;
+#X text 99 573 DSP does not need to be turned on for [samplerate~]
+to work;
+#X text 168 482 - the sample rate.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 14 0 15 0;
+#X connect 16 0 14 0;
diff --git a/doc/pddp/savepanel-help.pd b/doc/pddp/savepanel-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0daa64245e48708a7f79b35f92d588ca6c0833b2
--- /dev/null
+++ b/doc/pddp/savepanel-help.pd
@@ -0,0 +1,70 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header savepanel 3 12 0
+18 -204280 -1 0;
+#X obj 0 334 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 243 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.24. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control GUI;
+#X text 12 45 DESCRIPTION query the user for the name of a file to
+create;
+#X text 12 85 DATATYPE_OUT symbol;
+#X text 12 65 INLET_0 bang symbol;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 459 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 501 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 528 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 505 (none);
+#N canvas 104 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 openpanel;
+#X text 8 2 [savepanel] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 343 cnv 17 3 105 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 468 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 463 3 savepanel;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/savepanel
+-text pdpedia: savepanel;
+#X text 98 342 bang;
+#X text 98 467 symbol;
+#X text 168 467 - once chosen from the file browser \, the filename
+is output as a symbol.;
+#X text 99 532 [savepanel] handles filenames with spaces correctly.
+However \, if you try to save a filename with spaces in a message box
+\, for example \, it will be converted to a list the next time you
+open the patch.;
+#X msg 205 131 bang;
+#X obj 205 225 print;
+#X obj 205 200 savepanel;
+#X msg 249 131 symbol /tmp;
+#X text 98 387 symbol;
+#X text 168 387 - you can send a symbol to the inlet of [savepanel]
+to specify the initial directory (see above).;
+#X text 98 422 list;
+#X msg 249 153 symbol C:/;
+#X text 11 23 query the user for the name of a file to create;
+#X text 168 422 - a list will be truncated to the first element (if
+it is a symbol).;
+#X text 168 342 - when [savepanel] gets a bang \, a "Save As" file
+browser appears on the screen. If you choose a filename \, it appears
+on the outlet.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 17 0 19 0;
+#X connect 19 0 18 0;
+#X connect 20 0 19 0;
+#X connect 24 0 19 0;
diff --git a/doc/pddp/scalar-help.pd b/doc/pddp/scalar-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ea55302408d4db3499ee541e8461456b4b441405
--- /dev/null
+++ b/doc/pddp/scalar-help.pd
@@ -0,0 +1,422 @@
+#N struct Pd-logo float x float y symbol Pd float obj1-c float wire-c
+float obj2-c float Pd-c float lightning-vis symbol adc float adc-c
+;
+#N struct red-box float x float y float bottom;
+#N struct box float x float y float w0 float p;
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (scalar) 3 12 0
+18 -204280 -1 0;
+#X obj 0 442 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 44 250 494 344 META 0;
+#X text 12 65 LIBRARY internal;
+#X text 12 105 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 85 AUTHOR Miller Puckette;
+#X text 12 145 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION graphical instance of a data structure;
+#X text 12 125 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS control data-structure;
+#X restore 500 597 pd META;
+#X obj 0 469 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 497 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 501 (none);
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 1 [scalar] Related Objects;
+#X obj 21 42 struct;
+#X obj 71 42 drawpolygon;
+#X obj 152 42 drawnumber;
+#X obj 228 42 plot;
+#X obj 21 72 append;
+#X obj 71 72 get;
+#X obj 101 72 set;
+#X obj 131 72 getsize;
+#X obj 183 72 setsize;
+#X obj 237 72 element;
+#X restore 102 597 pd Related_objects;
+#N canvas 84 74 428 477 Pd-logo-template 0;
+#N canvas 236 304 450 300 init 0;
+#X obj 108 109 loadbang;
+#X msg 108 136 traverse pd-scalar-help.pd \, next;
+#X obj 108 163 pointer;
+#X obj 108 217 set Pd-logo obj1-c wire-c obj2-c adc-c Pd-c;
+#X msg 108 190 list 999 0 999 0 0 \$1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 4 0 3 0;
+#X restore 21 41 pd init;
+#X obj 21 145 unpack p;
+#X obj 21 167 t b a;
+#X obj 360 210 t a;
+#X obj 21 68 struct Pd-logo float x float y symbol Pd float obj1-c
+float wire-c float obj2-c float Pd-c float lightning-vis symbol adc
+float adc-c;
+#X obj 21 241 set Pd-logo obj1-c adc-c wire-c obj2-c Pd-c lightning-vis
+;
+#X obj 21 439 filledpolygon 777 666 1 -12 -14 40 -14 40 55 -12 55;
+#X obj 21 325 filledpolygon obj1-c adc-c 1 0 9 7 9 0 9 0 10 30 10 30
+-7 0 -7 0 -6 7 -6 0 -6;
+#X obj 21 268 drawsymbol adc 3 -3 adc-c;
+#X obj 21 382 filledpolygon obj2-c Pd-c 1 7 29 0 29 0 28 25 28 25 29
+18 29 25 29 25 45 0 45 0 44 7 44 0 44 0 28;
+#X obj 21 417 drawsymbol Pd 3 32 Pd-c;
+#X obj 21 360 drawpolygon wire-c 1 3 10 3 28 4 28 4 10;
+#X obj 21 290 filledpolygon -v lightning-vis 990 0 1 4 11 -2 20 3 20
+1 28 9 17 4 17 5 12;
+#X obj 21 118 route select click;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#N canvas 108 55 380 398 animation 0;
+#X obj 27 18 inlet;
+#X obj 27 343 outlet;
+#X msg 27 45 0 999 0 999 0 0;
+#X msg 49 95 999 0 0 999 0 0;
+#X obj 82 171 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 82 194 sel 0 1;
+#X obj 223 171 0;
+#X msg 223 218 999 0 0 0 999 0;
+#X msg 243 277 999 0 0 999 0 0;
+#X obj 49 73 del 250;
+#X obj 82 122 del 100;
+#X obj 243 254 del 300;
+#X msg 101 218 999 0 777 999 0 1;
+#X obj 82 149 metro 200;
+#X obj 223 149 del 1200;
+#X msg 82 245 999 0 0 999 0 0;
+#X obj 223 194 del 50;
+#X connect 0 0 2 0;
+#X connect 0 0 9 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 15 0;
+#X connect 5 1 12 0;
+#X connect 6 0 15 0;
+#X connect 6 0 13 0;
+#X connect 7 0 1 0;
+#X connect 8 0 1 0;
+#X connect 9 0 3 0;
+#X connect 9 0 10 0;
+#X connect 10 0 13 0;
+#X connect 10 0 14 0;
+#X connect 11 0 8 0;
+#X connect 12 0 1 0;
+#X connect 13 0 4 0;
+#X connect 14 0 6 0;
+#X connect 14 0 16 0;
+#X connect 15 0 1 0;
+#X connect 16 0 7 0;
+#X connect 16 0 11 0;
+#X restore 21 197 pd animation;
+#X text 8 2 [scalar] A Scalar with Lots of Drawing Instructions;
+#X connect 1 0 2 0;
+#X connect 2 0 15 0;
+#X connect 2 1 3 0;
+#X connect 3 0 5 6;
+#X connect 4 0 13 0;
+#X connect 13 0 1 0;
+#X connect 13 1 1 0;
+#X connect 15 0 5 0;
+#X restore 79 210 pd Pd-logo-template;
+#X scalar Pd-logo 29 172 Pd~ 999 0 999 0 0 adc~ 0 \;;
+#X obj 451 20 pddp/pddplink http://wiki.puredata.info/en/scalar -text
+pdpedia: scalar;
+#X text 11 23 graphical instance of a data structure;
+#X text 98 446 (none);
+#X text 98 474 (none);
+#X obj 209 364 *~;
+#X floatatom 172 312 5 0 100 1 Volume_(dB) - -;
+#X obj 172 334 dbtorms;
+#X obj 208 392 dac~;
+#N canvas 107 82 428 452 box-face-template 0;
+#X obj 22 67 route click;
+#X obj 22 92 unpack p;
+#X obj 22 228 line;
+#X obj 22 117 t b a;
+#X obj 22 264 set box w0;
+#X msg 22 167 10 100;
+#X obj 97 167 del 500;
+#X msg 97 193 0 100;
+#X obj 22 325 drawpolygon 0 1 w0(0:10)(-4:-10) w0(0:10)(-4:-10) w0(0:10)(4:10)
+w0(0:10)(-4:-10) w0(0:10)(4:10) w0(0:10)(4:10) w0(0:10)(-4:-10) w0(0:10)(4:10)
+w0(0:10)(-4:-10) w0(0:10)(-4:-10);
+#X obj 22 391 drawpolygon 0 w0 -5 w0(0:10)(-14:-18) -5 w0(0:10)(-13:-17)
+;
+#X obj 22 418 drawpolygon 0 w0 5 w0(0:10)(-14:-18) 5 w0(0:10)(-13:-17)
+;
+#N canvas 366 92 332 503 make-noise 0;
+#X obj 43 446 *~;
+#X obj 42 141 line~;
+#X obj 43 473 outlet~;
+#X obj 147 424 osc~;
+#X obj 160 255 osc~;
+#X obj 146 373 *~;
+#X obj 42 41 inlet;
+#X obj 256 7 inlet;
+#X obj 147 397 +~ 0;
+#X obj 161 193 *~ 0;
+#X obj 256 133 mtof;
+#X obj 256 246 s tempo;
+#X obj 256 219 -;
+#X obj 256 166 * 0.16;
+#X obj 222 166 log;
+#X obj 256 61 + 55;
+#X msg 256 193 190 \$1;
+#X obj 256 39 mod 21;
+#X obj 66 213 *~ 50;
+#X obj 65 336 +~;
+#X obj 160 233 +~;
+#X obj 222 210 *~ 5;
+#X obj 222 188 osc~;
+#X obj 79 262 +~ 1;
+#X obj 182 166 * 0.1;
+#X obj 79 311 *~ 250;
+#X obj 79 289 *~;
+#X msg 123 213 0.7;
+#X obj 78 239 osc~ 1.1;
+#X obj 256 85 sel 60;
+#X obj 256 107 8;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 0 9 0;
+#X connect 1 0 18 0;
+#X connect 3 0 0 1;
+#X connect 4 0 5 1;
+#X connect 5 0 8 0;
+#X connect 6 0 1 0;
+#X connect 7 0 17 0;
+#X connect 7 0 27 0;
+#X connect 8 0 3 0;
+#X connect 9 0 20 0;
+#X connect 10 0 13 0;
+#X connect 10 0 8 1;
+#X connect 10 0 14 0;
+#X connect 10 0 24 0;
+#X connect 12 0 11 0;
+#X connect 13 0 16 0;
+#X connect 14 0 22 0;
+#X connect 15 0 29 0;
+#X connect 16 0 12 0;
+#X connect 17 0 15 0;
+#X connect 18 0 19 0;
+#X connect 19 0 5 0;
+#X connect 20 0 4 0;
+#X connect 21 0 20 1;
+#X connect 22 0 21 0;
+#X connect 23 0 26 0;
+#X connect 23 0 26 1;
+#X connect 24 0 9 1;
+#X connect 25 0 19 1;
+#X connect 26 0 25 0;
+#X connect 27 0 28 1;
+#X connect 28 0 23 0;
+#X connect 29 0 30 0;
+#X connect 29 1 10 0;
+#X connect 30 0 10 0;
+#X restore 97 264 pd make-noise;
+#X obj 96 291 outlet~;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [scalar] Scalar with Complex Drawing Instructions;
+#X obj 172 193 % 80;
+#X obj 172 167 get box y;
+#X obj 22 42 struct box float x float y float w0;
+#N canvas 513 6 428 642 move 0;
+#X obj 107 42 inlet;
+#X obj 27 42 inlet;
+#X obj 48 444 pointer;
+#X obj 93 77 b;
+#X msg 93 105 stop;
+#X obj 48 190 0;
+#X obj 48 489 get box x y;
+#X obj 48 538 set box x y;
+#X obj 48 464 t a a;
+#X obj 48 516 +;
+#X obj 79 516 +;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [scalar] Subpatch to Move the Boxheads Around;
+#X obj 48 244 t b b;
+#X obj 48 169 del 2000;
+#X obj 184 155 random 2;
+#X obj 184 182 sel 0 1;
+#X obj 116 213 0;
+#X obj 146 213 1;
+#X obj 75 271 t b b;
+#X obj 102 317 == 0;
+#X obj 75 376 *;
+#X obj 102 294 f;
+#X obj 75 294 3;
+#X obj 75 405 spigot;
+#X obj 127 405 spigot;
+#X obj 160 383 == 0;
+#X obj 154 277 t a;
+#X obj 48 212 metro 100;
+#X obj 184 222 random 2;
+#X obj 249 222 random 2;
+#X obj 249 244 - 0.5;
+#X obj 184 244 - 0.5;
+#X obj 249 266 * 2;
+#X obj 249 288 div -1;
+#X obj 184 266 * 2;
+#X obj 184 288 div -1;
+#X obj 103 346 *;
+#X obj 309 222 random 2;
+#X obj 309 244 - 0.5;
+#X obj 309 266 * 2;
+#X obj 309 288 div -1;
+#X obj 109 168 r tempo;
+#X obj 27 139 del 350;
+#X connect 0 0 2 1;
+#X connect 0 0 3 0;
+#X connect 1 0 43 0;
+#X connect 2 0 8 0;
+#X connect 3 0 4 0;
+#X connect 3 0 15 0;
+#X connect 3 0 38 0;
+#X connect 4 0 14 0;
+#X connect 4 0 28 0;
+#X connect 4 0 43 0;
+#X connect 5 0 28 0;
+#X connect 6 0 9 0;
+#X connect 6 1 10 0;
+#X connect 8 0 6 0;
+#X connect 8 1 7 2;
+#X connect 9 0 7 0;
+#X connect 10 0 7 1;
+#X connect 13 0 2 0;
+#X connect 13 1 19 0;
+#X connect 14 0 5 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X connect 16 0 29 0;
+#X connect 16 1 18 0;
+#X connect 16 1 30 0;
+#X connect 17 0 27 0;
+#X connect 18 0 27 0;
+#X connect 19 0 23 0;
+#X connect 19 1 22 0;
+#X connect 20 0 22 1;
+#X connect 20 0 37 0;
+#X connect 21 0 24 0;
+#X connect 21 0 25 0;
+#X connect 22 0 20 0;
+#X connect 23 0 21 0;
+#X connect 24 0 9 1;
+#X connect 25 0 10 1;
+#X connect 26 0 25 1;
+#X connect 27 0 26 0;
+#X connect 27 0 24 1;
+#X connect 28 0 13 0;
+#X connect 29 0 32 0;
+#X connect 30 0 31 0;
+#X connect 31 0 33 0;
+#X connect 32 0 35 0;
+#X connect 33 0 34 0;
+#X connect 34 0 10 1;
+#X connect 35 0 36 0;
+#X connect 36 0 9 1;
+#X connect 37 0 21 1;
+#X connect 38 0 39 0;
+#X connect 39 0 40 0;
+#X connect 40 0 41 0;
+#X connect 41 0 37 1;
+#X connect 42 0 28 1;
+#X connect 43 0 14 0;
+#X connect 43 0 28 0;
+#X restore 118 224 pd move;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 5 0;
+#X connect 3 0 6 0;
+#X connect 3 1 4 1;
+#X connect 3 1 16 0;
+#X connect 3 1 18 1;
+#X connect 5 0 2 0;
+#X connect 5 0 11 0;
+#X connect 6 0 7 0;
+#X connect 6 0 18 0;
+#X connect 7 0 2 0;
+#X connect 7 0 11 0;
+#X connect 11 0 12 0;
+#X connect 15 0 11 1;
+#X connect 16 0 15 0;
+#X connect 17 0 0 0;
+#X restore 225 334 pd box-face-template;
+#X text 245 358 The drawing instructions for the three;
+#X text 245 373 scalars to the left are a bit more complex \,;
+#X text 245 388 and allow us to associate one field-- "w0"--;
+#X text 244 403 with the size of the square. Click each little;
+#X text 244 418 "scalar creature" in runmode to trigger a note.;
+#X text 13 230 Above is a scalar with more drawing instructions-- it's
+made to look like two Pd object boxes connected together. Here it's
+used to exemplify data flow in Pd-- if you click or select the scalar
+\, it will trigger a simple animation. Open the subpatch "Pd-logo-template"
+to see how it works.;
+#N canvas 144 264 428 300 red-box-template 0;
+#X obj 22 42 struct red-box float x float y float bottom;
+#X obj 22 135 filledpolygon 900 0 1 0 0 20 0 20 bottom 0 bottom;
+#X text 19 69 Explain (or link to explanation) about x and y variables.
+;
+#X obj 22 162 drawnumber bottom -12 -15 250 bottom=;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [scalar] A Simple Scalar;
+#X restore 420 202 pd red-box-template;
+#X scalar red-box 369 199 20 \;;
+#X text 190 119 Below is a simple scalar-- it consists of a red box
+\, and a number with a label. The field "bottom" is associated with
+the two of the y-values of the box. If you click and drag the number
+\, you can change the placement of the bottom of the box.;
+#N canvas 50 456 428 105 Interacting_with_Scalars 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [scalar] Interacting with Scalars;
+#X text 19 37 When you interact with the scalar in a patch with the
+mouse \, some of those mouse actions are captured and sent to the outlet
+of the [struct] object. See the help patch for [struct] for a complete
+list of these actions.;
+#X restore 102 556 pd Interacting_with_Scalars;
+#N canvas 50 456 428 129 Appending_Scalars_to_a_Canvas 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [scalar] Appending Scalars;
+#X text 19 37 Blurb about the fact that these scalars were appended
+to the canvas when the patch was created (and they persist after you
+save them and their values are remembered). For more on how to instantiate
+a scalar \, see the help patch for [append].;
+#X obj 21 101 pddp/pddplink ../4.data.structures/04.append.pd -text
+doc/4.data.structures/04.append.pd;
+#X restore 102 534 pd Appending_Scalars_to_a_Canvas;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 385 291 pddp/dsp;
+#X obj 99 576 pddp/pddplink ../4.data.structures/01.scalars.pd -text
+doc/4.data.structures/01.scalars.pd;
+#X text 303 534 <-- needs work;
+#X text 70 56 Scalars are graphical instances of data structures. Their
+behavior is similar to other objects in Pd-- you can click them \,
+select them \, change their values \, delete them \, and so on.;
+#X obj 23 357 cnv 15 100 60 empty empty WOW 20 12 0 40 -262144 -232952
+0;
+#X scalar box 58 349 0 0 \;;
+#X scalar box 91 373 0 69 \;;
+#X scalar box 123 348 0 75 \;;
+#X connect 15 0 18 0;
+#X connect 15 0 18 1;
+#X connect 16 0 17 0;
+#X connect 17 0 15 0;
+#X connect 19 0 15 1;
diff --git a/doc/pddp/select-help.pd b/doc/pddp/select-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c459019582ef6b08f1b592a5fb70ff66f0516d5c
--- /dev/null
+++ b/doc/pddp/select-help.pd
@@ -0,0 +1,320 @@
+#N canvas 398 77 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header select 3 12 0 18
+-204280 -1 0;
+#X obj 0 163 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 171 494 420 META 0;
+#X text 12 165 LIBRARY internal;
+#X text 12 205 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 185 AUTHOR Miller Puckette;
+#X text 12 245 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 24 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 65 DESCRIPTION compare numbers or symbols;
+#X text 12 5 ALIAS sel;
+#X text 12 85 INLET_0 float symbol list;
+#X text 12 105 INLET_1 float symbol;
+#X text 12 125 OUTLET_N bang;
+#X text 12 145 OUTLET_R float symbol;
+#X text 12 25 KEYWORDS control symbol_op;
+#X text 12 225 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 359 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 458 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 100 340 428 250 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [select] Related Objects;
+#X obj 22 43 route;
+#X obj 62 43 spigot;
+#X obj 107 43 symbol;
+#X obj 155 43 float;
+#X text 18 123 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 17 165 The best places to find information about Pd's libraries
+is:;
+#X text 18 185 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 18 200 or;
+#X text 18 215 iem.kug.ac.at/pdb/;
+#X text 19 83 Externals;
+#X obj 19 103 pddp/helplink markex/multiselect;
+#X restore 102 597 pd Related_objects;
+#X obj 78 172 cnv 17 3 115 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 171 float;
+#X text 98 210 list;
+#X obj 78 368 cnv 17 3 40 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 78 306 cnv 17 3 45 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 305 float;
+#X obj 446 3 select;
+#X text 493 3 or;
+#X obj 518 3 sel;
+#X obj 448 20 pddp/pddplink http://wiki.puredata.info/en/select -text
+pdpedia: select;
+#X msg 62 49 6;
+#X obj 29 99 select 6;
+#X msg 29 49 234;
+#X floatatom 29 76 0 0 0 0 - - -;
+#X obj 29 127 print match;
+#X obj 108 127 print NO_match;
+#X text 202 115 Note that when the input to [select] matches one of
+its creation arguments \, then a "bang" is sent to the outlet \, NOT
+the original message.;
+#X text 11 23 compare numbers or symbols;
+#N canvas 57 54 428 548 A_Word_About_Conditional_Objects 0;
+#X text 20 38 Using the [select] object \, and others listed below
+\, Pd users can emulate the "conditional" statements of other programming
+environments.;
+#X text 20 79 Consider the following: (Visual Basic Script);
+#X text 59 97 IF input = 1 THEN;
+#X text 58 108 response.write("Hello");
+#X text 58 121 ELSEIF input = 2 THEN;
+#X text 58 133 response.write("GoodBye");
+#X text 58 170 ELSE;
+#X text 57 194 END IF;
+#X text 22 217 Now the Pd equivalent:;
+#X msg 60 242 1;
+#X msg 92 242 2;
+#X floatatom 138 242 5 0 0 0 - - -;
+#X obj 60 280 sel 1 2;
+#X msg 60 426 symbol Hello;
+#X msg 79 399 symbol GoodBye;
+#X symbolatom 181 452 21 0 0 0 - - -;
+#X obj 27 517 ==;
+#X obj 55 517 !=;
+#X obj 82 517 >;
+#X obj 108 517 <;
+#X obj 135 517 >=;
+#X obj 162 517 <=;
+#X text 22 494 OTHER CONDITIONAL/RELATIONAL OBJECTS IN Pd;
+#X text 57 181 response.write("No_match_for_me..."& input);
+#X text 58 159 response.write("This_is_cool.");
+#X obj 99 303 moses 3;
+#X msg 136 371 symbol This_is_cool.;
+#X obj 136 322 moses 10;
+#X obj 181 344 makefilename No_match_for_me...%d;
+#X text 58 147 ELSEIF (input < 3 AND input < 10) THEN;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [select] Conditional Statements in Pd;
+#X connect 9 0 12 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 14 0;
+#X connect 12 2 25 0;
+#X connect 13 0 15 0;
+#X connect 14 0 15 0;
+#X connect 25 1 27 0;
+#X connect 26 0 15 0;
+#X connect 27 0 26 0;
+#X connect 27 1 28 0;
+#X connect 28 0 15 0;
+#X restore 102 549 pd A_Word_About_Conditional_Objects;
+#N canvas 79 52 428 303 second_inlet 0;
+#X obj 23 181 sel 42;
+#X msg 23 135 42;
+#X obj 23 203 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 56 203 5 0 0 0 - - -;
+#X floatatom 31 157 5 0 0 0 - - -;
+#X floatatom 80 159 5 0 0 0 - - -;
+#X obj 197 222 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 183 137 symbol word;
+#X msg 197 159 symbol other;
+#X msg 295 161 symbol other;
+#X obj 197 197 select word;
+#X obj 260 222 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 292 137 symbol word;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [select] The Second Inlet;
+#X text 20 38 The right inlet is used to reset the argument's value
+as in the patch below. This feature is available only on [select] objects
+with only ONE creation argument (or no creation arguments in which
+case it takes on the default value of 0). In the other examples with
+multiple creation arguments \, you'll notice that this second inlet
+is absent.;
+#X text 20 246 Note: A given [select] object will match floats or symbols
+\, but not both. See the subpatch titled "matching_symbols" for more
+details.;
+#X connect 0 0 2 0;
+#X connect 0 1 3 0;
+#X connect 1 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 1;
+#X connect 7 0 10 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 1;
+#X connect 10 0 6 0;
+#X connect 10 1 11 0;
+#X connect 12 0 10 1;
+#X restore 171 335 pd second_inlet;
+#N canvas 52 20 491 603 matching_symbols 0;
+#X obj 151 304 print NO_match;
+#X obj 22 304 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 54 304 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 86 304 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 118 304 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 22 102 symbol dog;
+#X msg 30 124 symbol cat;
+#X msg 38 146 symbol foo;
+#X msg 45 168 symbol earth;
+#X msg 54 190 symbol 400;
+#X obj 22 282 select dog cat foo 400;
+#X msg 50 233 400;
+#X obj 152 571 print NO_match;
+#X obj 23 571 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 55 571 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 87 571 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 119 571 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 23 385 symbol dog;
+#X msg 31 407 symbol cat;
+#X msg 39 429 symbol foo;
+#X msg 46 451 symbol earth;
+#X msg 54 473 symbol 400;
+#X msg 75 506 400;
+#X obj 23 549 select 400 dog cat foo;
+#X text 126 182 Notice that "400" here is defined as a symbol data
+type and the [select] object can successfully match it to the creation
+argment.;
+#X text 77 221 Notice that "400" here is a number and the [select]
+object cannot successfully match it to the creation argument. That
+is because this [select] expects symbols - not numbers.;
+#X text 61 264 FIRST CREATION ARGUMENT IS A SYMBOL;
+#X text 66 532 FIRST CREATION ARGUMENT IS A NUMBER;
+#X text 103 500 Notice that "400" here is a number and the [select]
+object can successfully match it to the creation argument.;
+#X text 123 467 Notice that "400" here is a symbol and the [select]
+object cannot successfully match it to the creation argument.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [select] Matching Symbols;
+#X text 19 329 However \, in the case below \, you'll notice that the
+FIRST creation argument is a number. Therefore \, this [select] object
+expects numbers and will ignore the "symbol" data type.;
+#X text 19 28 [select] can be used to match symbols. It important to
+note that the FIRST creation argument indicates to the [select] object
+which data type to expect. If your first creation argument is a symbol
+\, like "dog" \, then the object will test only symbols \, and numbers
+will be ignored!;
+#X connect 5 0 10 0;
+#X connect 6 0 10 0;
+#X connect 7 0 10 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 10 1 2 0;
+#X connect 10 2 3 0;
+#X connect 10 3 4 0;
+#X connect 10 4 0 0;
+#X connect 11 0 10 0;
+#X connect 17 0 23 0;
+#X connect 18 0 23 0;
+#X connect 19 0 23 0;
+#X connect 20 0 23 0;
+#X connect 21 0 23 0;
+#X connect 22 0 23 0;
+#X connect 23 0 13 0;
+#X connect 23 1 14 0;
+#X connect 23 2 15 0;
+#X connect 23 3 16 0;
+#X connect 23 4 12 0;
+#X restore 102 571 pd matching_symbols;
+#X text 98 265 symbol;
+#X text 98 319 symbol;
+#X text 98 367 bang;
+#X text 168 367 - for each creation argument \, a corresponding outlet
+is created. When the value at the left inlet matches a creation argument
+\, a bang is sent to the corresponding outlet.;
+#X text 168 171 - if an incoming float matches a creation argument
+\, a bang is sent to the corresponding outlet. If it does not match
+\, the float is sent to the rightmost outlet.;
+#X obj 78 421 cnv 17 3 30 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#X text 98 420 float;
+#X text 98 435 symbol;
+#X text 168 420 - if there is no match \, the float or symbol is sent
+to the rightmost outlet.;
+#X text 168 476 - [select] creates an outlet for each creation argument
+(plus one outlet at the right). Floats and symbols may not be mixed.
+See the subpatch below for more details:;
+#N canvas 105 267 428 240 creation_arguments 0;
+#X floatatom 23 152 0 0 0 0 - - -;
+#X msg 87 110 1;
+#X msg 53 110 54;
+#X msg 23 110 23;
+#X obj 23 182 select 23 54 1;
+#X obj 23 209 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 50 209 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 77 209 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 104 209 5 0 0 0 - - -;
+#X text 61 139 If you click-n-drag this number box \, you'll notice
+how all numbers except "23" \, "54" \, and "1" are simply sent through
+to the rightmost outlet.;
+#X text 20 38 Several creation arguments can be defined. In effect
+you can use [select] to test the input for many different values. You
+will see an outlet for each test value and finally an outlet for values
+which match none of them (the rightmost outlet).;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [select] Creation Arguments;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 4 1 6 0;
+#X connect 4 2 7 0;
+#X connect 4 3 8 0;
+#X restore 171 517 pd creation_arguments;
+#X text 97 47 In its simplest form shown here \, [select] checks its
+input against the constant "6" (which is defined by the creation argument).
+If they match \, the first outlet gives "bang" \; otherwise the input
+is simply sent through to the second outlet.;
+#X text 168 262 - if an incoming symbol matches a creation argument
+\, a bang is sent to the corresponding outlet. If it does not match
+\, the symbol is sent to the rightmost outlet.;
+#X text 168 210 - if there is only one creation argument (or none)
+\, the first and second element of the list will be distributed to
+the two inlets of [select]. If there is more than one creation argument
+the list will be truncated.;
+#X text 167 305 - the right inlet is available if there is only one
+creation argument. See the subpatch below for details:;
+#X text 80 476 n) float;
+#X text 98 491 symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 296 572 pddp/pddplink ../2.control.examples/18.conditional.pd
+-text doc/2.control.examples/18.conditional.pd;
+#X connect 18 0 21 0;
+#X connect 19 0 22 0;
+#X connect 19 1 23 0;
+#X connect 20 0 21 0;
+#X connect 21 0 19 0;
diff --git a/doc/pddp/send-help.pd b/doc/pddp/send-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..236b5e9cbf83588a6b716573c58fe9da660585be
--- /dev/null
+++ b/doc/pddp/send-help.pd
@@ -0,0 +1,186 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header send 3 12 0 18 -204280
+-1 0;
+#X obj 0 240 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 54 246 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Dave Sabine \, September 12 \, 2003
+. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 25 KEYWORDS control nonlocal;
+#X text 12 65 DESCRIPTION send messages without patch cords;
+#X text 12 5 ALIAS s;
+#X text 12 85 INLET_0 anything;
+#X text 12 105 INLET_1 symbol;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 333 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 375 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 438 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 95 291 428 315 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [send] Related Objects;
+#X obj 23 43 receive~;
+#X obj 88 43 send~;
+#X obj 194 43 throw~;
+#X obj 249 43 catch~;
+#X obj 23 74 tabreceive~;
+#X obj 111 74 tabsend~;
+#X obj 180 74 netsend;
+#X obj 247 74 netreceive;
+#X obj 304 43 value;
+#X obj 134 43 receive;
+#X text 20 109 Externals and other object libraries;
+#X obj 20 168 pddp/helplink maxlib/remote;
+#X obj 20 208 pddp/helplink maxlib/dist;
+#X text 106 188 <- which library? (No help patch exists);
+#X text 106 227 <- which library?;
+#X text 106 247 <- which library?;
+#X obj 20 268 pddp/helplink maxlib/netdist;
+#X obj 20 128 pddp/helplink ggee/streamout~;
+#X obj 20 148 pddp/helplink ext13/send13~;
+#X obj 20 188 pddp/helplink sendlocal;
+#X obj 20 228 pddp/helplink sendOSC;
+#X obj 20 248 pddp/helplink shoutcast~;
+#X obj 20 288 pddp/helplink motex/system;
+#X restore 102 597 pd Related_objects;
+#X obj 78 342 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 send;
+#X text 498 3 or;
+#X obj 521 3 s;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/send -text
+pdpedia: send;
+#X obj 52 124 s;
+#X floatatom 52 100 5 0 0 0 - - -;
+#X floatatom 284 95 5 0 0 0 - - -;
+#X obj 284 66 r;
+#X floatatom 339 95 5 0 0 0 - - -;
+#X obj 339 66 r;
+#X floatatom 390 95 5 0 0 0 - - -;
+#X obj 390 66 r;
+#X floatatom 52 167 5 0 0 0 - - -;
+#X floatatom 277 177 5 0 0 0 - - -;
+#X floatatom 348 177 5 0 0 0 - - -;
+#X floatatom 423 177 5 0 0 0 - - -;
+#X text 51 147 with creation argument;
+#X obj 52 191 s dave;
+#X obj 277 148 r dave;
+#X obj 348 148 r dave;
+#X floatatom 152 168 5 0 0 0 - - -;
+#X obj 423 148 r hans;
+#X obj 152 192 s hans;
+#X obj 78 249 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 247 anything;
+#X obj 78 291 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 289 symbol;
+#X text 168 289 - if [send] is created without an argument \, the right
+inlet can be used to dynamically change the send/receive name. (See
+example above).;
+#X obj 112 124 s;
+#X floatatom 112 66 5 0 0 0 - - -;
+#X msg 157 66 symbol dave;
+#X msg 157 94 symbol hans;
+#X text 98 341 (none);
+#X text 168 341 - all messages are sent to a corresponding [receive]
+object with the same name.;
+#X obj 98 442 pddp/pddplink all_about_send_n_receive.pd -text all_about_send_n_receive
+;
+#N canvas 64 68 428 493 Dynamic_send_vs_messages 0;
+#X text 20 42 Consider this:;
+#X floatatom 115 43 5 0 0 0 - - -;
+#X floatatom 171 43 5 0 0 0 - - -;
+#X obj 115 69 s dave;
+#X obj 171 69 s hans;
+#X obj 264 43 r dave;
+#X obj 320 43 r hans;
+#X floatatom 264 67 5 0 0 0 - - -;
+#X floatatom 320 67 5 0 0 0 - - -;
+#X text 20 112 Now consider this:;
+#X floatatom 139 114 5 0 0 0 - - -;
+#X floatatom 208 115 5 0 0 0 - - -;
+#X msg 139 142 \; dave \$1;
+#X msg 208 142 \; hans \$1;
+#X text 20 232 And to complicate things a little more \, and offer
+some interesting functionality \, consider the following:;
+#X obj 264 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 320 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 23 312 \; \$1 42;
+#X text 20 184 In this example \, the message box contains a Pd command
+which effectively sends the value of the variable (\$1) to either 'dave'
+or 'hans'.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [send] Send using [send] of message? Dynamic [send]?;
+#X msg 23 274 symbol dave;
+#X msg 107 274 symbol hans;
+#X text 66 302 In this example \, I have created a single routine which
+acts as a 'dynamic' send object. The variable (\$1) in this message
+box is replaced by the incoming symbol. The two patches below do the
+same thing but with the [send] object:;
+#X msg 162 364 symbol dave;
+#X msg 171 386 symbol hans;
+#X obj 162 467 send;
+#X obj 162 440 42;
+#X obj 162 413 t b a;
+#X connect 1 0 3 0;
+#X connect 2 0 4 0;
+#X connect 5 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 15 0;
+#X connect 8 0 16 0;
+#X connect 10 0 12 0;
+#X connect 11 0 13 0;
+#X connect 21 0 17 0;
+#X connect 22 0 17 0;
+#X connect 24 0 28 0;
+#X connect 25 0 28 0;
+#X connect 27 0 26 0;
+#X connect 28 0 27 0;
+#X connect 28 1 26 1;
+#X restore 101 567 pd Dynamic_send_vs_messages;
+#X text 11 23 send messages without patch cords;
+#X text 168 393 - specifies the send/receive name. If no arguments
+are provided \, an extra inlet is available to dynamically set the
+send/receive name.;
+#X text 168 247 - when [send] is created with an argument \, it has
+a single inlet which accepts any message as input. The input is sent
+to all [receive] objects with the same name (argument).;
+#X text 80 393 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 457 pddp/pddplink all_about_scope_and_locality.pd -text all_about_scope_and_locality
+;
+#X text 98 493 doc/1.manual/x5.htm;
+#X text 98 478 doc/1.manual/x2.htm;
+#X obj 97 515 pddp/pddplink ../2.control.examples/09.send_receive.pd
+-text doc/2.control.examples/09.send_receive.pd;
+#X obj 97 530 pddp/pddplink ../2.control.examples/10.more.messages.pd
+-text doc/2.control.examples/10.more.messages.pd;
+#X obj 97 545 pddp/pddplink ../2.control.examples/13.locality.pd -text
+doc/2.control.examples/13.locality.pd;
+#X connect 14 0 13 0;
+#X connect 16 0 15 0;
+#X connect 18 0 17 0;
+#X connect 20 0 19 0;
+#X connect 21 0 26 0;
+#X connect 27 0 22 0;
+#X connect 28 0 23 0;
+#X connect 29 0 31 0;
+#X connect 30 0 24 0;
+#X connect 38 0 37 0;
+#X connect 39 0 37 1;
+#X connect 40 0 37 1;
diff --git a/doc/pddp/send~-help.pd b/doc/pddp/send~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..470248605d5bce00c02e848888e573ffa54da68e
--- /dev/null
+++ b/doc/pddp/send~-help.pd
@@ -0,0 +1,76 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header send~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 332 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 48 218 494 323 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 25 KEYWORDS signal nonlocal;
+#X text 12 65 DESCRIPTION one-to-many nonlocal signal connections;
+#X text 12 5 ALIAS s~;
+#X text 12 85 INLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 374 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 467 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 516 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 85 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 tabreceive~;
+#X obj 102 43 throw~;
+#X obj 152 43 catch~;
+#X text 8 2 [send~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 341 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 452 3 send~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/send~ -text
+pdpedia: send~;
+#X obj 157 236 send~ signal1;
+#X obj 157 213 sig~ 50;
+#X floatatom 157 189 4 0 0 0 - - -;
+#X text 98 340 signal;
+#X text 98 378 (none);
+#X text 168 340 - a [send~] object copies its input to a local buffer
+which all receive~ objects of the same name read from.;
+#X text 168 378 - the incoming signal is sent to all [receive~] objects
+that share the same name as the [send~] object. These objects may be
+in different windows or even different patches. Any number of [receive~]'s
+may be associated with one [send~] \, but it is an error to have two
+[send~] objects of the same name.;
+#X obj 284 147 receive~ signal1;
+#X obj 284 236 snapshot~;
+#X obj 304 176 loadbang;
+#X obj 304 199 metro 150;
+#X text 11 23 one-to-many nonlocal signal connections;
+#X floatatom 284 263 5 0 0 0 - - -;
+#X text 168 485 - [send~] takes a single argument which is the name
+associated with this particular [send~] object.;
+#X text 80 485 1) symbol atom;
+#X text 98 519 [send~]/[receive~] only work for the default block size
+(64).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X text 495 3 or [s~];
+#X obj 96 571 pddp/pddplink ../3.audio.examples/G05.execution.order.pd
+;
+#X text 99 551 See also:;
+#X connect 12 0 11 0;
+#X connect 13 0 12 0;
+#X connect 18 0 19 0;
+#X connect 19 0 23 0;
+#X connect 20 0 21 0;
+#X connect 21 0 19 0;
diff --git a/doc/pddp/set-help.pd b/doc/pddp/set-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f29b1a0a4f5fa57e11ce21b51e2016d7106b5873
--- /dev/null
+++ b/doc/pddp/set-help.pd
@@ -0,0 +1,145 @@
+#N struct set-help-template float x float y float a symbol b;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header set 3 12 0 18 -204280
+-1 0;
+#X obj 0 230 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 245 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Revised
+by Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS control data_structure;
+#X text 12 45 DESCRIPTION set values in a scalar;
+#X text 12 65 INLET_0 float list symbol bang;
+#X text 12 85 INLET_N float symbol;
+#X text 12 105 INLET_R pointer;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 402 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 425 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 505 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 76 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [set] Related Objects;
+#X obj 23 44 get;
+#X obj 55 44 append;
+#X obj 105 44 getsize;
+#X obj 161 44 setsize;
+#X obj 221 44 element;
+#X obj 23 69 sublist;
+#X obj 81 69 struct;
+#X obj 133 69 pointer;
+#X restore 102 598 pd Related_objects;
+#X obj 78 332 cnv 17 3 35 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 98 237 float;
+#X text 98 265 list;
+#X obj 78 374 cnv 17 3 17 empty \$0-pddp.cnv.let.r r 5 9 0 16 -228856
+-162280 0;
+#X obj 492 3 set;
+#X obj 466 20 pddp/pddplink http://wiki.puredata.info/en/set -text
+pdpedia: set;
+#X text 11 23 set values in a scalar;
+#N canvas 381 200 428 296 set-help-template 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [set] Data Structure Template;
+#X obj 23 124 drawcurve 0 1 60 50 70 50 70 60 60 60 60 50;
+#X obj 23 244 drawcurve 0 1 25 85 50 a 75 85;
+#X obj 23 80 drawcurve 0 1 0 20 100 20 100 120 0 120 0 20;
+#X text 298 79 <- Head;
+#X obj 23 102 drawcurve 0 1 30 50 40 50 40 60 30 60 30 50;
+#X text 298 102 <- Left eye;
+#X text 298 124 <- Right eye;
+#X text 25 198 The following drawing instruction associates the field
+"a" with the midpoint of a curve. Thus you can set the value of a and
+change the arc/direction of the curve.;
+#X text 217 244 <- Mouth;
+#X text 187 152 <- Text;
+#X text 187 175 <- Text;
+#X obj 23 43 struct set-help-template float x float y float a symbol
+b;
+#X obj 25 152 drawsymbol b 25 125 0 b=;
+#X obj 25 175 drawnumber a 40 a 900 a=;
+#X restore 417 153 pd set-help-template;
+#X scalar set-help-template 7 42 111 Comedy \;;
+#X obj 359 126 pointer;
+#X msg 359 73 traverse pd-set-help.pd \, next;
+#X floatatom 224 127 5 0 0 0 - - -;
+#X text 366 56 output first scalar in list;
+#X scalar set-help-template 116 42 61 Tragedy \;;
+#X msg 370 98 next;
+#X text 405 97 output next item;
+#X text 98 373 pointer;
+#X text 168 265 - a list is distributed among the inlets.;
+#X text 98 405 (none);
+#X obj 78 238 cnv 17 3 85 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 332 float;
+#X text 98 283 bang;
+#X text 98 346 symbol;
+#X text 98 310 symbol;
+#X text 168 464 - all subsequent arguments are names of fields. There
+is one inlet created per field (plus the rightmost inlet for the pointer).
+;
+#X text 167 373 - a pointer to a scalar.;
+#X text 168 446 - the template of a scalar.;
+#X text 168 283 - a bang to the leftmost inlet sets the field(s) of
+the scalar with the last stored field value(s).;
+#X text 168 237 - a float to the leftmost inlet updates the value(s)
+for the field(s) specified in the creation arguments.;
+#X text 168 332 - an inlet is added for each additional field specified
+by the creation arguments. All fields must be the same type (i.e. \,
+floats or symbols \, but not a mixture of the two).;
+#X text 98 509 You can't [set] "arrays" or "sublists". Instead \, you
+can get pointers into them using [element] and [sublist] (Note: [sublist]
+not working yet) and set individual items.;
+#X text 168 310 - see the subpatch "Setting_Symbolic_Fields" below.
+;
+#N canvas 98 376 428 215 Setting_Symbolic_Fields 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [set] Setting symbolic fields;
+#X obj 224 124 pointer;
+#X msg 224 71 traverse pd-set-help.pd \, next;
+#X msg 235 96 next;
+#X msg 23 84 symbol Trauermarsch;
+#X msg 48 109 symbol Scherzo;
+#X text 20 37 To set symbolic fields of a scalar \, the "-symbol" flag
+must be used as follows:;
+#X text 20 178 You cannot set symbols and floats using the same [set]
+object.;
+#X obj 23 151 set -symbol set-help-template b;
+#X connect 2 0 9 1;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 9 0;
+#X connect 6 0 9 0;
+#X restore 101 552 pd Setting_Symbolic_Fields;
+#X text 80 446 1) symbol atom;
+#X text 80 464 n) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 572 pddp/pddplink ../4.data.structures/03.setting.data.pd
+-text doc/4.data.structures/03.setting.data.pd;
+#X obj 353 552 pddp/pddplink scalar-help.pd;
+#X obj 224 153 set set-help-template a;
+#X obj 224 201 set -symbol set-help-template b;
+#X symbolatom 224 180 10 0 0 0 - - -;
+#X text 236 73 Click here first->;
+#X connect 17 0 46 1;
+#X connect 17 0 47 1;
+#X connect 18 0 17 0;
+#X connect 19 0 46 0;
+#X connect 22 0 17 0;
+#X connect 48 0 47 0;
diff --git a/doc/pddp/setsize-help.pd b/doc/pddp/setsize-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..974cc5575a35b4076b7f7830f06d1512853ce33e
--- /dev/null
+++ b/doc/pddp/setsize-help.pd
@@ -0,0 +1,108 @@
+#N struct string_of_dolls float x float y array dolls doll symbol label
+;
+#N struct doll float y;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header setsize 3 12 0 18
+-204280 -1 0;
+#X obj 0 304 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 247 494 328 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Revised
+by Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS control data_structure array;
+#X text 12 45 DESCRIPTION resize an array;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 pointer;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 397 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 425 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 485 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 46 483 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 44 get;
+#X obj 83 44 append;
+#X obj 133 44 getsize;
+#X obj 189 44 element;
+#X obj 23 69 sublist;
+#X obj 81 69 struct;
+#X obj 133 69 pointer;
+#X text 8 2 [setsize] Related Objects;
+#X obj 51 44 set;
+#X restore 102 598 pd Related_objects;
+#X obj 78 313 cnv 17 3 50 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 312 float;
+#X text 98 337 list;
+#X obj 78 369 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 11 23 resize an array;
+#X obj 473 3 setsize;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/setsize -text
+pdpedia: setsize;
+#X scalar string_of_dolls 32 110 An_array_of_paper_dolls... \; -3 \;
+0 \; 0 \; 0 \; 0 \; \;;
+#X msg 204 171 traverse pd-setsize-help.pd \, next;
+#X obj 204 196 pointer;
+#X floatatom 33 237 5 0 0 0 - - -;
+#N canvas 90 353 428 173 doll-template 0;
+#X obj 23 43 struct doll float y;
+#X obj 23 65 filledcurve 999 0 1 -10 -1 -10 -1 0 -1 0 -1 0 -4 0 -4
+-5 -9 3 -14 8 -9 5 -4 5 -4 5 -1 5 -1 15 -1 15 -1 15 3 15 3 5 3 5 3
+15 19 15 19 -10 19 -10 19 0 3 0 3 -10 3 -10 3;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [setsize] Data Structure;
+#X text 20 118 These are the drawing instructions for the paper doll.
+This template is used as the element of the array "dolls" in the template
+"string_of_dolls".;
+#X restore 380 241 pd doll-template;
+#N canvas 81 360 428 167 string_of_dolls 0;
+#X obj 23 78 plot dolls 0 1 0 0 30;
+#X obj 23 43 struct string_of_dolls float x float y array dolls doll
+symbol label;
+#X obj 23 101 drawsymbol label -15 -35 145;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [setsize] Template for string_of_dolls;
+#X text 20 124 Here we simply plot the array and give it a label by
+using the [drawsymbol] object;
+#X restore 380 263 pd string_of_dolls;
+#X obj 33 263 setsize string_of_dolls dolls;
+#X text 178 337 - a (float \, pointer) pair is distributed to the two
+inlets. Lists with more than two elements will be truncated.;
+#X text 98 368 pointer;
+#X text 98 400 (none);
+#X text 178 462 - the name of an array contained within the scalar.
+;
+#X text 178 312 - sending a float sets the number of elements of the
+array specified by the 2nd creation argument.;
+#X text 98 489 Sending values smaller than one to [setsize] will resize
+the array to one \, which is the smallest possible size of an array.
+If the array is resized downward (e.g. \, from 20 to 15 elements) the
+extra data are lost. If resized upward \, the new elements are initialized
+to default values.;
+#X text 177 368 - a pointer to a scalar that contains an array.;
+#X text 203 149 1) Click here first...;
+#X text 32 211 2) ...then here.;
+#X text 178 444 - the struct name of a scalar that contains an array.
+;
+#X text 80 444 1) symbol atom;
+#X text 80 462 n) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 557 pddp/pddplink all_about_arrays.pd;
+#X obj 98 572 pddp/pddplink scalar-help.pd;
+#X connect 16 0 17 0;
+#X connect 17 0 21 1;
+#X connect 18 0 21 0;
diff --git a/doc/pddp/sigbinops-help.pd b/doc/pddp/sigbinops-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..faa42a5a20bf0e39b03a4318b2c9b16022a3316a
--- /dev/null
+++ b/doc/pddp/sigbinops-help.pd
@@ -0,0 +1,125 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header (sigbinops) 3 12
+0 18 -204280 -1 0;
+#X obj -1 385 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 25 KEYWORDS signal;
+#X text 12 65 DESCRIPTION binary operators for signals;
+#X text 12 5 NAME +~ -~ *~ /~ max~ min~;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj -1 465 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj -1 502 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj -1 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8
+12 0 13 -228856 -1 0;
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 (sigbinops) Related Objects;
+#X obj 22 43 log~;
+#X obj 62 43 exp~;
+#X obj 103 43 abs~;
+#X restore 102 598 pd Related_objects;
+#X obj 78 394 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 474 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 417 cnv 17 3 40 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/bag -text
+pdpedia: bag;
+#X text 11 23 binary operators for signals;
+#X obj 15 286 +~;
+#X obj 103 284 -~;
+#X obj 190 284 *~;
+#X obj 275 286 /~;
+#X obj 15 212 osc~ 440;
+#X obj 415 212 osc~ 675;
+#X obj 361 284 max~;
+#X obj 447 286 min~;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0a 100 float 2;
+#X coords 0 1 99 -1 150 105 1;
+#X restore 15 73 graph;
+#X obj 344 3 +~;
+#X obj 379 3 -~;
+#X obj 412 3 *~;
+#X obj 446 3 /~;
+#X obj 479 3 max~;
+#X obj 513 3 min~;
+#X text 177 111 The binary signal operators can be configured to combine
+two signals as above \, or \, if you give a numeric argument \, audio
+signals are combined with scalars:;
+#X obj 329 156 +~ 5;
+#X text 177 181 The right inlet takes audio signals or numbers depending
+on whether the argument is present or not.;
+#X text 98 393 signal;
+#X text 167 416 - an incoming signal;
+#X text 168 393 - an incoming signal;
+#X text 98 416 signal;
+#X text 98 473 signal;
+#X text 168 473 - the outgoing signal;
+#X text 80 521 1) float;
+#X text 168 521 - (optional) a float argument initializes the right
+inlet to a value \, and allows the right inlet to receive float messages.
+;
+#X text 98 431 float;
+#X text 167 431 - if an argument is provided \, the object's right
+inlet will accept floats instead of a signal.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 15 333 tabwrite~ \$0a;
+#X obj 103 333 tabwrite~ \$0a;
+#X obj 190 333 tabwrite~ \$0a;
+#X obj 275 333 tabwrite~ \$0a;
+#X obj 361 333 tabwrite~ \$0a;
+#X obj 447 333 tabwrite~ \$0a;
+#X obj 21 311 bng 15 250 50 0 empty empty empty 17 7 0 10 -204786 -1
+-1;
+#X obj 109 311 bng 15 250 50 0 empty empty empty 17 7 0 10 -204786
+-1 -1;
+#X obj 196 311 bng 15 250 50 0 empty empty empty 17 7 0 10 -204786
+-1 -1;
+#X obj 281 311 bng 15 250 50 0 empty empty empty 17 7 0 10 -204786
+-1 -1;
+#X obj 367 311 bng 15 250 50 0 empty empty empty 17 7 0 10 -204786
+-1 -1;
+#X obj 453 311 bng 15 250 50 0 empty empty empty 17 7 0 10 -204786
+-1 -1;
+#X connect 13 0 43 0;
+#X connect 14 0 44 0;
+#X connect 15 0 45 0;
+#X connect 16 0 46 0;
+#X connect 17 0 13 0;
+#X connect 17 0 14 0;
+#X connect 17 0 16 0;
+#X connect 17 0 15 0;
+#X connect 17 0 19 0;
+#X connect 17 0 20 0;
+#X connect 18 0 16 1;
+#X connect 18 0 15 1;
+#X connect 18 0 14 1;
+#X connect 18 0 13 1;
+#X connect 18 0 19 1;
+#X connect 18 0 20 1;
+#X connect 19 0 47 0;
+#X connect 20 0 48 0;
+#X connect 49 0 43 0;
+#X connect 50 0 44 0;
+#X connect 51 0 45 0;
+#X connect 52 0 46 0;
+#X connect 53 0 47 0;
+#X connect 54 0 48 0;
diff --git a/doc/pddp/sigmund~-help.pd b/doc/pddp/sigmund~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..33b923c73e6726fc942cd230a130fe412ad72463
--- /dev/null
+++ b/doc/pddp/sigmund~-help.pd
@@ -0,0 +1,259 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header sigmund~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 179 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 210 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 45 DESCRIPTION sinusoidal analysis and pitch tracking;
+#X text 12 65 INLET_0 list signal npts hop npeak maxfreq vibrato stabletime
+minpower growth print;
+#X text 12 95 OUTLET_N float list;
+#X text 12 175 RELEASE_DATE;
+#X text 12 5 KEYWORDS signal analysis;
+#X restore 500 597 pd META;
+#X obj 0 414 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 450 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 572 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 82 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [sigmund~] Related Objects;
+#X obj 22 43 fiddle~;
+#X obj 78 43 bonk~;
+#X restore 102 598 pd Related_objects;
+#X obj 78 188 cnv 17 3 220 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 99 204 list;
+#X obj 78 421 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X text 11 23 sinusoidal analysis and pitch tracking;
+#X obj 474 3 sigmund~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/sigmund~ -text
+pdpedia: sigmund~;
+#X text 98 187 signal;
+#X text 148 187 - the incoming signal to be analyzed.;
+#X text 98 249 npts - number of points in each analysis window (1024)
+;
+#X text 98 263 hop - number of points between each analysis (512);
+#X text 98 276 npeak - number of sinusoidal peaks (20);
+#X text 98 304 vibrato - depth of vibrato to expect in 1/2-tones (1)
+;
+#X text 98 318 stabletime - time (msec) to wait to report notes (50)
+;
+#X text 98 332 minpower - minimum power (dB) to report a pitch (50)
+;
+#X text 98 347 growth - growth (dB) to report a new note (7);
+#X text 98 290 maxfreq - maximum sinusoid frequency in Hz. (1000000)
+;
+#N canvas 84 53 428 534 Using-with-arrays 0;
+#X obj 23 342 print peak;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-insignal 1024 float 2;
+#X coords 0 1 1023 -1 200 140 1;
+#X restore 23 382 graph;
+#X obj 288 463 phasor~;
+#X obj 264 382 loadbang;
+#X obj 264 409 440;
+#X floatatom 264 436 5 0 0 0 - - -;
+#X obj 264 464 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 20 38 If invoked with the "-t" flag (as a creation argument)
+\, sigmund~ analyzes waveforms stored in arrays. Instead of an incoming
+signal \, feed it "list" messages with the following arguments:;
+#X text 38 92 table name (a symbol);
+#X text 39 111 number of points;
+#X obj 23 319 sigmund~ -t -npeak 10 -maxfreq 5000 peaks;
+#X text 38 132 index of first point;
+#X text 38 153 sample rate;
+#X text 38 174 debug flag (print debugging info if nonzero);
+#X text 20 197 In this mode \, only the "env" \, "pitch" \, and "peaks"
+outputs are meaningful.;
+#X text 21 230 click here to test:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [sigmund~] Using on arrays;
+#X obj 23 249 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 23 272 f \$0;
+#X msg 23 296 list \$1-insignal 1024 0 44100 0;
+#X obj 264 490 tabwrite~ \$0-insignal;
+#X connect 2 0 21 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 21 0;
+#X connect 10 0 0 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 20 0 10 0;
+#X restore 152 233 pd Using-with-arrays;
+#X obj 39 113 phasor~;
+#X obj 39 43 loadbang;
+#X floatatom 38 158 5 0 0 1 pitch - -;
+#X floatatom 203 158 5 0 0 1 envelope - -;
+#X obj 39 91 mtof;
+#X obj 39 66 69;
+#X obj 38 136 sigmund~ -hop 4096 pitch env;
+#X floatatom 66 66 5 0 0 0 - - -;
+#N canvas 98 12 428 605 setting-parameters 0;
+#X msg 22 74 print;
+#X floatatom 32 96 5 0 0 0 - - -;
+#X msg 32 117 minpower \$1;
+#X obj 22 143 sigmund~ -minpower 40;
+#X text 19 164 npts: number of points used in an analysis. Must be
+a power of two \, at least 128 The minimum frequency that can be tracked
+is about 2(sample_rate)/npts.;
+#X text 19 203 hop: number of points between analyses. Must be a power
+of two \, at least the DSP vector size (usually 64). This regulates
+the number of analyses done per unit of time.;
+#X text 19 292 npeak: maximum number of sinusoidal peaks to look for.
+The computation time is quadratic in the number of peaks actually found
+(this number only sets an upper limit). Use it to balance CPU time
+with quality of results.;
+#X text 19 342 maxfreq: maximum frequency of sinusoidal peaks to look
+for. This can be useful in situations where background noise creates
+high-frequency \, spurious peaks..;
+#X text 19 381 vibrato: maximum deviation from "pitch" to accept as
+normal vibrato (affects "notes" output only). If the value is too small.
+vibratos will appear as trills. If too large \, very small melodic
+intervals may not be reported as new notes.;
+#X text 19 431 stabletime: time period to wait before reporting a note
+(affects "notes" output only). The "pitch" must be present and must
+not vary more than "vibrato" for this entire period to report a note.
+If too large \, the "notes" will be unnecessarily delayed. If too small
+\, spurious notes get output.;
+#X text 19 503 minpower: minimum measured RMS level to report a pitch
+(affects "pitch" and "notes" output only). Signals quieter than this
+will be assumed to be crosstalk and ignored.;
+#X text 19 542 growth: minimum measured RMS growth to report a new
+note (affects "notes" output only). The RMS level must rise by this
+many dB (within a time period given by "stabletime") to report a repetition
+of a note at or near the previously output pitch.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 31 Note: the following "parameters" can be sent to [sigmund~]
+as messages \, or provided as creation arguments by prefixing each
+selector with a dash (i.e. \, -minpower 40):;
+#X text 40 242 * Note: The npts and hop parameters are in samples \,
+and are powers of two. The example above specifies a huge hop of 4096
+(to slow the output down) and to output "pitch" and "env". (Those are
+the default outputs.);
+#X text 8 2 [sigmund~] Setting Parameters;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X restore 152 393 pd setting-parameters;
+#X text 108 504 pitch - output pitch continuously;
+#X text 108 555 tracks - output sinusoidal peaks organized into tracks
+;
+#X text 108 517 notes - output pitch at the beginning of notes;
+#X text 108 542 peaks - output all sinusoidal peaks in order of amplitude
+;
+#X text 108 529 env - output amplitude continuously;
+#X text 100 82 The [sigmund~] object analyzes an incoming sound into
+sinusoidal components \, which may be reported individually or combined
+to form a pitch estimate. Possible outputs are specified as creation
+arguments:;
+#X text 149 204 - [sigmund~] accepts a list to access waveforms stored
+in arrays. See the "Using_with_array" subpatch below.;
+#X text 148 420 One outlet is created for each creation argument (listed
+under the heading "arguments");
+#X text 98 374 See the subpatch below for more info on these parameters:
+;
+#X text 98 452 (optional) In addition to flags (see subpatch "setting-parameters"
+above) \, [sigmund~] can take up to five arguments \, in any order
+\, to specify its output. Each creates (and corresponds to) an outlet.
+;
+#X text 98 360 print - prints current setting to the console.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#N canvas 24 72 482 513 sinusoid-tracking 0;
+#X obj 74 195 sigmund~ -npeak 10 peaks;
+#X obj 74 168 phasor~;
+#X obj 74 98 loadbang;
+#X floatatom 74 144 5 0 120 0 - - -;
+#X obj 74 223 route 0 1 2 3 4 5 6 7 8 9;
+#X obj 74 257 unpack 0 0 0 0;
+#X floatatom 74 379 5 0 0 0 - - -;
+#X floatatom 101 349 5 0 0 0 - - -;
+#X floatatom 128 324 5 0 0 0 - - -;
+#X obj 74 121 440;
+#X floatatom 155 298 5 0 0 0 - - -;
+#X obj 206 257 unpack 0 0 0 0;
+#X floatatom 206 379 5 0 0 0 - - -;
+#X floatatom 233 349 5 0 0 0 - - -;
+#X floatatom 260 324 5 0 0 0 - - -;
+#X floatatom 287 298 5 0 0 0 - - -;
+#X text 269 383 frequency (Hz.);
+#X text 290 350 peak amplitude (linear);
+#X text 322 324 cosine component;
+#X text 343 298 sine component;
+#X text 79 413 loudest partial;
+#X text 216 413 quietest partial;
+#X text 36 4 You can ask for sinusoidal peaks in decreasing order of
+amplitude or arranged into maximally continuous tracks for resynthesis.
+(Or you can ask for both.) If you ask for peaks \, out come lists of
+five numbers \, one for each sinusoid at each analysis period. The
+first is the index number of the sinusoid (so you can use "route" to
+claw them apart). The other four are as shown:;
+#X obj 46 504 osc~ 440;
+#X obj 46 528 *~;
+#X obj 47 582 unpack 0 0 0 0;
+#X floatatom 47 675 5 0 0 0 - - -;
+#X floatatom 74 653 5 0 0 0 - - -;
+#X floatatom 101 630 5 0 0 0 - - -;
+#X floatatom 128 606 5 0 0 0 - - -;
+#X obj 88 531 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 35 443 If you ask for "tracks" \, the output is four numbers:
+index \, frequency \, and amplitude as before \, and finally a flag
+which is one for a new track \, zero for a continuation \, minus one
+for an empty track.;
+#X obj 47 555 sigmund~ -npts 16384 -hop 8192 -npeak 1 tracks;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 9 0;
+#X connect 3 0 1 0;
+#X connect 4 0 5 0;
+#X connect 4 9 11 0;
+#X connect 5 0 6 0;
+#X connect 5 1 7 0;
+#X connect 5 2 8 0;
+#X connect 5 3 10 0;
+#X connect 9 0 3 0;
+#X connect 11 0 12 0;
+#X connect 11 1 13 0;
+#X connect 11 2 14 0;
+#X connect 11 3 15 0;
+#X connect 23 0 24 0;
+#X connect 24 0 32 0;
+#X connect 25 0 26 0;
+#X connect 25 1 27 0;
+#X connect 25 2 28 0;
+#X connect 25 3 29 0;
+#X connect 30 0 24 1;
+#X connect 32 0 25 0;
+#X restore 101 577 pd sinusoid-tracking;
+#X text 99 433 list;
+#X text 98 419 float;
+#X connect 25 0 31 0;
+#X connect 26 0 30 0;
+#X connect 29 0 25 0;
+#X connect 30 0 29 0;
+#X connect 31 0 27 0;
+#X connect 31 1 28 0;
+#X connect 32 0 29 0;
diff --git a/doc/pddp/sig~-help.pd b/doc/pddp/sig~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d337d9209883b92657c12d0cbff7c2c48cd4a106
--- /dev/null
+++ b/doc/pddp/sig~-help.pd
@@ -0,0 +1,66 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header sig~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 45 DESCRIPTION convert numbers to audio signal;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 543 (none);
+#N canvas 98 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 snapshot~;
+#X text 8 2 [sig~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 446 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 float;
+#X text 98 474 list;
+#X obj 78 511 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 492 3 sig~;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/sig~ -text
+pdpedia: sig~;
+#X obj 245 228 snapshot~;
+#X floatatom 245 253 0 0 0 0 - - -;
+#X floatatom 165 106 0 0 0 0 - - -;
+#X obj 245 178 loadbang;
+#X obj 245 202 metro 200;
+#X text 195 105 <- Scroll to set value;
+#X text 168 445 - a float to the inlet of [sig~] will be converted
+to an audio signal.;
+#X text 98 510 signal;
+#X obj 165 131 sig~;
+#X text 11 23 convert numbers to audio signal;
+#X text 168 474 - a list will be truncated to the first element.;
+#X text 113 280 In this example \, the [sig~] object converts numbers
+to an audio signal \, which the [snapshot~] converts back again.;
+#X text 168 510 - the outgoing signal.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 15 0 16 0;
+#X connect 15 0 16 0;
+#X connect 17 0 23 0;
+#X connect 18 0 19 0;
+#X connect 19 0 15 0;
+#X connect 23 0 15 0;
diff --git a/doc/pddp/sin-help.pd b/doc/pddp/sin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6198900e6baa1a0cb1f8312e64d5e962f504452b
--- /dev/null
+++ b/doc/pddp/sin-help.pd
@@ -0,0 +1,93 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header sin 3 12 0 18 -204280
+-1 0;
+#X obj 0 438 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control trigonometry;
+#X text 12 45 DESCRIPTION sine function;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 544 (none);
+#N canvas 78 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 43 cos;
+#X obj 49 43 tan;
+#X obj 76 43 atan;
+#X obj 109 43 atan2;
+#X obj 149 43 exp;
+#X obj 177 43 log;
+#X obj 204 43 abs;
+#X obj 232 43 sqrt;
+#X obj 267 43 pow;
+#X obj 57 76 cos~;
+#X obj 89 76 osc~;
+#X obj 23 76 expr;
+#X text 8 2 [sin] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 447 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 446 float;
+#X text 98 466 list;
+#X text 98 511 float;
+#X obj 78 512 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 493 3 sin;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/sin -text
+pdpedia: sin;
+#X floatatom 396 171 0 0 0 0 - - -;
+#X floatatom 303 172 0 0 0 0 - - -;
+#X obj 210 137 sin;
+#X floatatom 87 92 0 0 0 0 - - -;
+#X floatatom 210 171 0 0 0 0 - - -;
+#X obj 87 132 * 6.28319;
+#X obj 87 112 / 360;
+#X obj 303 138 cos;
+#X obj 396 137 tan;
+#X text 150 132 2 x Pi;
+#X floatatom 87 152 0 0 0 0 - - -;
+#X text 150 152 Radian;
+#X obj 87 172 s radians;
+#X obj 210 111 r radians;
+#X text 84 209 Trigonometry functions take input in Radians. To find
+a radian \, simply divide a number by 360 (to make it a fraction of
+a circle) and multiply it by 2(Pi) where Pi is equal to approximately
+3.14159265.;
+#X text 83 296 [tan] will produce a number which represents the tangent
+of an angle.;
+#X text 83 270 [sin] and [cos] will return numbers between -1 and 1:
+the sine and cosine of a number repectively.;
+#X text 11 23 sine function;
+#X text 168 466 - a list will be truncated \, and the first element
+will be used as input.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 18 0 20 0;
+#X connect 19 0 22 0;
+#X connect 21 0 26 0;
+#X connect 22 0 21 0;
+#X connect 23 0 17 0;
+#X connect 24 0 16 0;
+#X connect 26 0 28 0;
+#X connect 29 0 18 0;
+#X connect 29 0 23 0;
+#X connect 29 0 24 0;
diff --git a/doc/pddp/snapshot~-help.pd b/doc/pddp/snapshot~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f2261b499b45d641a6f401c8f4f74fbf95c55865
--- /dev/null
+++ b/doc/pddp/snapshot~-help.pd
@@ -0,0 +1,82 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header snapshot~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 417 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.37. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 45 DESCRIPTION convert a signal to a number on demand;
+#X text 12 85 OUTLET_0 float;
+#X text 12 65 INLET_0 bang signal set;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 500 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 542 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 569 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 546 (none);
+#N canvas 104 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [snapshot~] Related Objects;
+#X obj 22 43 sig~;
+#X obj 63 43 vsnapshot~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 426 cnv 17 3 65 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 508 float;
+#X obj 78 509 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 465 3 snapshot~;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/snapshot~
+-text pdpedia: snapshot~;
+#X obj 91 307 snapshot~;
+#X floatatom 91 330 0 0 0 0 - - -;
+#X msg 102 255 bang;
+#X obj 91 230 osc~ 0.1;
+#X text 90 209 0.1 Hz cosine;
+#X msg 107 279 set 5;
+#X text 98 425 signal;
+#X text 11 23 convert a signal to a number on demand;
+#X text 98 445 bang;
+#X text 98 465 set;
+#X text 168 465 - the "set" message \, followed by a value \, sets
+[snapshot~] to the specified value (which is reset the next DSP block).
+;
+#X text 168 508 - upon receiving a bang to its inlet \, [snapshot~]
+outputs a value.;
+#X text 143 255 <- Click to take a "snapshot" of the signal;
+#X text 168 425 - the incoming signal.;
+#X text 168 445 - a bang takes one snapshot of the incoming signal.
+;
+#X text 18 109 In the example below \, a [snapshot~] object prints
+out the values of a low frequency cosine wave every time it is sent
+a bang message.;
+#X text 18 152 A "set" message is provided for the (rare) situations
+where you might make a known change to the signal input \, and then
+read snapshot's value before any ensuing signal computation.;
+#X text 18 57 The [snapshot~] object takes a signal and converts it
+to a control value whenever it receives a bang in its left outlet.
+This object is particularly useful for monitoring outputs.;
+#X text 156 329 This output updates each time bang is clicked above.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 99 572 pddp/pddplink ../3.audio.examples/C06.signal.to.control.pd
+-text doc/3.audio.examples/C06.signal.to.control.pd;
+#X connect 14 0 15 0;
+#X connect 14 0 15 0;
+#X connect 16 0 14 0;
+#X connect 17 0 14 0;
+#X connect 19 0 14 0;
diff --git a/doc/pddp/soundfiler-help.pd b/doc/pddp/soundfiler-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3e5b030a45c466f0c904dbe0e9b35f74013e4049
--- /dev/null
+++ b/doc/pddp/soundfiler-help.pd
@@ -0,0 +1,124 @@
+#N canvas 398 77 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header soundfiler 3 12
+0 18 -204280 -1 0;
+#X obj 0 387 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 247 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.37. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION read and write soundfiles to arrays;
+#X text 12 65 INLET_0 read write;
+#X text 12 85 OUTLET_0 float;
+#X text 12 5 KEYWORDS control array filesystem;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 487 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 529 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 554 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 533 (none);
+#N canvas 76 485 428 106 Related_objects 0;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [soundfiler] Related Objects;
+#X obj 22 43 tabwrite~;
+#X obj 22 69 tabread4~;
+#X obj 88 43 tabplay~;
+#X obj 143 69 writesf~;
+#X obj 87 69 readsf~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 396 cnv 17 3 80 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 495 float;
+#X obj 78 496 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 457 3 soundfiler;
+#X obj 430 20 pddp/pddplink http://wiki.puredata.info/en/soundfiler
+-text pdpedia: soundfiler;
+#X text 11 23 read and write soundfiles to arrays;
+#X text 98 395 read;
+#X text 98 412 write;
+#X text 168 495 - the output specifies the total number of samples
+that have been read or written.;
+#X obj 20 293 soundfiler;
+#X floatatom 20 317 0 0 0 0 - - -;
+#X text 231 137 read a file;
+#X text 287 159 ...optionally resize;
+#X text 322 224 write a file;
+#X text 358 268 write stereo;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array sf-array1 77971 float 0;
+#X coords 0 1 77971 -1 130 70 1;
+#X restore 135 306 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array sf-array2 77971 float 0;
+#X coords 0 1 77971 -1 130 70 1;
+#X restore 288 306 graph;
+#N canvas 110 93 428 434 flags 0;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 19 37 When reading you can leave soundfiler to figure out which
+of the three known soundfile formats the file belongs to or override
+all header information using the "-raw" flag.;
+#X text 136 79 Flags for reading:;
+#X text 45 99 -skip <sample frames to skip in file>;
+#X text 45 159 -raw <headersize> <channels> <bytespersample> <endianness>
+;
+#X text 64 177 This causes all header information to be ignored. Endianness
+is "l" ("little") for Intel machines or "b" ("big") for Macintoshes
+and SGIs. You can give "n" (natural) to take the byte order your machine
+prefers.;
+#X text 45 119 -resize;
+#X text 45 139 -maxsize <maximum number of samples we can resize to>
+;
+#X text 19 230 Flags for writing:;
+#X text 37 251 -wave \, -nextstep \, -aiff;
+#X text 37 271 -big \, -little (nextstep only!);
+#X text 37 291 -skip <number of sample frames to skip in array>;
+#X text 37 311 -nframes <maximum number to write>;
+#X text 37 351 -normalize;
+#X text 37 331 -bytes <2 \, 3 \, or 4>;
+#X text 17 400 The number of channels is limited to 64;
+#X text 37 371 -rate <sample rate>;
+#X text 7 1 [soundfiler] Flags;
+#X restore 172 459 pd flags;
+#X text 168 412 - write a soundfile.;
+#X text 169 428 The "read" and "write" messages accept flags. See the
+subpatch below for details:;
+#X msg 20 138 read ../sound/bell.aiff sf-array2;
+#X msg 20 161 read -resize ../sound/bell.aiff sf-array2;
+#X msg 20 185 read -raw 128 2 2 b ../sound/bell.aiff sf-array1 sf-array2
+;
+#X msg 20 214 write -aiff /tmp/foo1 sf-array2;
+#X msg 20 238 write -wave -nframes 10000 /tmp/foo2 sf-array2;
+#X msg 20 268 write -nextstep -bytes 4 /tmp/foo3 sf-array1 sf-array2
+;
+#X text 399 197 overriding everything;
+#X text 398 183 ...or even;
+#X text 168 395 - read a soundfile.;
+#X text 17 41 The [soundfiler] object reads and writes floating point
+arrays to binary soundfiles which may contain 2 or 3 byte fixed point
+or 4 byte floating point samples in wave \, aiff \, or next formats
+(no floating point aiff \, though.). The number of channels of the
+soundfile need not match the number of arrays given (extras are dropped
+and unsupplied channels are zeroed out).;
+#X text 98 558 Note: The number of channels is limited to 64 .;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 575 pddp/pddplink all_about_arrays.pd;
+#X connect 18 0 19 0;
+#X connect 29 0 18 0;
+#X connect 30 0 18 0;
+#X connect 31 0 18 0;
+#X connect 32 0 18 0;
+#X connect 33 0 18 0;
+#X connect 34 0 18 0;
diff --git a/doc/pddp/spigot-help.pd b/doc/pddp/spigot-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..949bd9d2ff4f56994dce588c13d5ffa0287e84df
--- /dev/null
+++ b/doc/pddp/spigot-help.pd
@@ -0,0 +1,188 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header spigot 3 12 0 18
+-204280 -1 0;
+#X obj 0 295 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 243 494 364 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.38-4. It was edited by Dave Sabine and Hans-Christoph Steiner
+as part of a project called pddp proposed by Krzysztof Czaja to build
+comprehensive documentation for Pd. Revised by Jonathan Wilkes to conform
+to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 45 DESCRIPTION pass or block messages;
+#X text 12 65 INLET_0 anything;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 anything;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 389 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 443 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 72 359 428 230 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [spigot] Related Objects;
+#X text 20 38 Externals;
+#X text 19 85 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 19 126 The best places to find information about Pd's libraries
+is:;
+#X text 19 146 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 19 161 or;
+#X text 19 176 iem.kug.ac.at/pdb/;
+#X obj 21 58 pddp/helplink cyclone/gate;
+#X restore 102 598 pd Related_objects;
+#X obj 78 304 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 398 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 345 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 344 float;
+#X obj 481 3 spigot;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/spigot -text
+pdpedia: spigot;
+#X text 11 23 pass or block messages;
+#X msg 101 111 0.5 1000;
+#X floatatom 134 177 1 0 0 0 - - -;
+#X obj 101 197 spigot;
+#X obj 101 218 print;
+#X msg 120 155 walk the cat;
+#X msg 111 133 bang;
+#X text 147 177 control: nonzero to pass messages \, zero to stop them
+;
+#X text 18 52 [spigot] passes messages from its left inlet to its outlet
+\, as long as a nonzero number is sent to its right inlet. When its
+right inlet gets zero \, incoming messages are "blocked" (i.e. ignored).
+;
+#X text 18 242 [spigot] works essentially like a doorway. When the
+door is open \, messages can pass through. When the door is closed
+\, messages are ignored. By default \, the door is always closed!;
+#N canvas 96 273 428 291 using_spigot_to_create_a_gate 0;
+#X text 20 38 Unlike its closest cousin MAX \, Pd does not have a native
+[gate] object. There are other Pd libraries which include gates for
+both audio and numerical data \, but similar routines can be built
+in Pd using [spigot]. The example below shows a two-way gate using
+two [spigots] and the [expr] object.;
+#X floatatom 121 188 1 0 0 0 - - -;
+#X text 138 187 controls: open and close the gates.;
+#X floatatom 24 262 5 0 0 0 - - -;
+#X floatatom 76 262 5 0 0 0 - - -;
+#X obj 24 129 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 24 149 metro 200;
+#X obj 24 171 f;
+#X obj 51 171 + 1;
+#X text 44 127 Click to start sending info through the gates.;
+#X obj 24 240 spigot;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [spigot] Using [spigot] to Create a Gate;
+#X obj 76 240 spigot 1;
+#X obj 121 218 == 0;
+#X connect 1 0 10 1;
+#X connect 1 0 14 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 7 0 10 0;
+#X connect 7 0 13 0;
+#X connect 8 0 7 1;
+#X connect 10 0 3 0;
+#X connect 13 0 4 0;
+#X connect 14 0 13 1;
+#X restore 102 568 pd using_spigot_to_create_a_gate;
+#N canvas 61 206 428 334 spigot_for_audio_signals 0;
+#X text 20 38 [spigot] does not work with audio signals. The data types
+which are accepted by this object are floats \, symbols \, lists \,
+bangs \, anythings and pointers. However \, audio signals require a
+completely different treatment.;
+#X text 21 100 Pd does not have a [spigot] for audio signals \, but
+the same effect can be created using the following structure:;
+#X obj 24 147 osc~ 800;
+#X obj 24 217 *~;
+#X floatatom 39 196 1 0 0 0 - - -;
+#X obj 24 279 env~;
+#X floatatom 24 300 5 0 0 0 - - -;
+#X obj 69 299 dac~;
+#X obj 69 279 *~ 0.05;
+#X text 79 168 Here is the [spigot].;
+#X text 80 183 When "0" \, audio signal;
+#X text 79 198 is effectively blocked.;
+#X text 80 213 When "1" \, audio signal is;
+#X text 80 228 not effected in any way.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [spigot] Is There a [spigot] for Audio Signals?;
+#X obj 287 145 pddp/dsp;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 3 0 8 0;
+#X connect 4 0 3 1;
+#X connect 5 0 6 0;
+#X connect 8 0 7 0;
+#X restore 102 547 pd spigot_for_audio_signals;
+#X text 98 303 anything;
+#X text 167 344 - "0" blocks all incoming messages to the left inlet.
+"1" (or any nonzero number) passes the incoming message to the outlet.
+;
+#X text 98 397 anything;
+#X text 168 397 - if the last value received at the right inlet was
+nonzero \, [spigot] passes the message from the first inlet to its
+outlet.;
+#X text 168 457 - By default \, the left inlet of [spigot] is initially
+closed. A one (or any nonzero number) as a creation argument will cause
+the spigot to be open initially. See the subpatch below for an example:
+;
+#X text 168 303 - [spigot] takes the input to the left inlet and either
+ignores it or passes it through to the outlet \, depending on the value
+at the right inlet.;
+#N canvas 74 291 428 213 creation_args 0;
+#X obj 146 108 spigot 0;
+#X text 21 38 [spigot] only accepts one numerical creation argument:
+a one or a zero. At creation time the [spigot] is "closed". With a
+one \, its defaults to open.;
+#X obj 214 108 spigot 1;
+#X obj 146 81 bng 15 250 50 0 empty empty empty 0 -6 0 8 -225271 -1
+-1;
+#X obj 90 108 spigot;
+#X obj 90 135 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 146 135 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 214 135 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [spigot] Creation Arguments;
+#X text 20 158 [spigot] used to accept any symbol as a creation argument
+\, but all of these are meaningless and have no effect on the operation
+of the object. This was removed in Pd 0.38-3;
+#X connect 0 0 6 0;
+#X connect 2 0 7 0;
+#X connect 3 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X restore 171 510 pd creation_args;
+#X text 90 457 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 296 548 pddp/pddplink ../2.control.examples/18.conditional.pd
+-text doc/2.control.examples/18.conditional.pd;
+#X connect 15 0 17 0;
+#X connect 16 0 17 1;
+#X connect 17 0 18 0;
+#X connect 19 0 17 0;
+#X connect 20 0 17 0;
diff --git a/doc/pddp/sqrt-help.pd b/doc/pddp/sqrt-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ec6463ef90eea311024af0cfecdcdaff9141b5ae
--- /dev/null
+++ b/doc/pddp/sqrt-help.pd
@@ -0,0 +1,68 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header sqrt 3 12 0 18 -204280
+-1 0;
+#X obj 0 442 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control orphan;
+#X text 12 45 DESCRIPTION square root;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 504 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 541 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 545 (none);
+#N canvas 110 477 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 272 43 pow;
+#X obj 57 76 cos~;
+#X obj 89 76 osc~;
+#X obj 23 76 expr;
+#X obj 23 43 sin;
+#X obj 49 43 cos;
+#X obj 76 43 tan;
+#X obj 109 43 atan;
+#X obj 144 43 atan2;
+#X obj 182 43 exp;
+#X obj 209 43 log;
+#X text 8 2 [sqrt] Related Objects;
+#X obj 237 43 abs;
+#X restore 102 597 pd Related_objects;
+#X obj 78 451 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 450 float;
+#X text 98 470 list;
+#X text 98 512 float;
+#X obj 78 513 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 239 217 0 0 0 0 - - -;
+#X floatatom 239 160 0 0 0 0 - - -;
+#X obj 493 3 sqrt;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/sqrt -text
+pdpedia: sqrt;
+#X obj 239 190 sqrt;
+#X text 115 249 [sqrt] will output the square root of a number. Negative
+numbers are ignored.;
+#X text 11 23 square root;
+#X text 168 470 - a list will be truncated \, and the first element
+will be used as input.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 15 0 18 0;
+#X connect 18 0 14 0;
diff --git a/doc/pddp/sqrt~-help.pd b/doc/pddp/sqrt~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7c46b03c4efaa0b017111a16fe74021e726a21a8
--- /dev/null
+++ b/doc/pddp/sqrt~-help.pd
@@ -0,0 +1,79 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header sqrt~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION signal square root;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 65 INLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 543 (none);
+#N canvas 108 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 152 43 rsqrt~;
+#X obj 203 43 sqrt;
+#X obj 22 43 q8_sqrt~;
+#X obj 82 43 q8_rsqrt~;
+#X text 8 2 [sqrt~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 446 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 511 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 485 3 sqrt~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/sqrt~ -text
+pdpedia: sqrt~;
+#X obj 232 240 metro 500;
+#X floatatom 215 137 0 0 0 0 - - -;
+#X floatatom 216 297 0 0 0 0 - - -;
+#X obj 216 264 snapshot~;
+#X floatatom 216 380 9 0 0 0 - - -;
+#X obj 216 324 t f f;
+#X obj 216 351 *;
+#X obj 215 163 sig~;
+#X text 98 445 signal;
+#X obj 232 215 loadbang;
+#X text 98 465 float;
+#X obj 216 191 sqrt~;
+#X text 168 465 - a float may be sent to the inlet as long as no signal
+connections are made to [sqrt~].;
+#X text 98 510 signal;
+#X text 168 510 - the square root of the incoming signal is output.
+;
+#X text 11 23 signal square root;
+#X text 168 445 - an incoming signal.;
+#X text 20 72 [sqrt~] takes the approximate square root of the incoming
+signal \, using a fast \, approximate algorithm which is probably accurate
+to about 120 dB (20 bits).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 13 0 16 0;
+#X connect 14 0 20 0;
+#X connect 15 0 18 0;
+#X connect 16 0 15 0;
+#X connect 18 0 19 0;
+#X connect 18 1 19 1;
+#X connect 19 0 17 0;
+#X connect 20 0 24 0;
+#X connect 22 0 13 0;
+#X connect 22 0 13 0;
+#X connect 24 0 16 0;
diff --git a/doc/pddp/standard_gui_elements.pd b/doc/pddp/standard_gui_elements.pd
new file mode 100644
index 0000000000000000000000000000000000000000..11d953dc0a6d36b23e17c4588ded82613cc963e5
--- /dev/null
+++ b/doc/pddp/standard_gui_elements.pd
@@ -0,0 +1,41 @@
+#N canvas 89 34 488 576 10;
+#X obj 2 2 cnv 15 450 20 empty empty [object_name] 2 11 1 18 -233017
+-66577 0;
+#X obj 21 133 tgl 30 0 empty empty start 1 15 1 12 -90049 -1 -1 0 1
+;
+#X obj 369 143 vsl 20 128 0 1 0 0 empty empty amp -1 -8 1 12 -225271
+-1 -1 0 1;
+#X obj 194 466 grouping patch;
+#X obj 100 241 nbx 5 20 -1e+37 1e+37 0 0 empty empty display_number_box
+0 -6 1 16 -199729 -1 -1 0 256;
+#X text 19 337 The idea behind these objects is to have a color scheme
+which consistently represents various ideas. Also \, having GUI objects
+highlighted by color signals the user that they should play with that
+object \, while plain white objects are part of the implementation.
+;
+#X obj 418 3 pddp/pddplink http://puredata.info/dev/pddp -text pddp;
+#X text 175 447 click on these for more info:;
+#X text 248 523 updated for Pd version 0.37.1;
+#N canvas 0 22 458 308 related_objects 0;
+#X restore 317 466 pd related_objects;
+#X text 14 37 [object_name] is an example patch for the PDDP style
+guide.;
+#X obj 223 132 bng 30 250 50 0 empty empty open 1 15 1 12 -4080 -1
+-228;
+#X obj 129 133 bng 30 250 50 0 empty empty stop 2 15 1 12 -212999 -1
+-1;
+#X obj 271 196 hsl 60 18 0 1 0 1 empty empty pan 2 9 1 12 -257472 -1
+-1 2950 0;
+#X obj 55 133 bng 30 250 50 0 empty empty start 1 15 1 12 -90049 -1
+-1;
+#X obj 28 409 comment 400 12 Times ? 0 0 0 0 This is Times 12pt;
+#X obj 33 438 comment 400 14 Times ? 0 0 0 0 comment;
+#X obj 255 132 bng 30 250 50 0 empty empty save 1 15 1 12 -512 -1 -4015
+;
+#X text 14 65 The colors used should not be the standard "quick pick"
+colors. PDDP should have distinct colors so that PDDP patches look
+distinct from regular Pd patches.;
+#X obj 466 43 cnv 10 2 500 empty empty empty 20 12 0 14 -166441 -262144
+0;
+#X text 332 312 page separator -->;
+#X obj 22 184 pddp/dsp;
diff --git a/doc/pddp/stripnote-help.pd b/doc/pddp/stripnote-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6ed03038b133ca78998220a564bffe9b7c55a386
--- /dev/null
+++ b/doc/pddp/stripnote-help.pd
@@ -0,0 +1,110 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header stripnote 3 12 0
+18 -204280 -1 0;
+#X obj 0 358 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 242 494 366 META 0;
+#X text 12 155 LIBRARY internal;
+#X text 12 195 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 215 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 175 AUTHOR Miller Puckette;
+#X text 12 235 HELP_PATCH_AUTHORS Updated for Pd version 0.28. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION send note-on messages and schedule note-off
+for later;
+#X text 12 75 INLET_0 float list;
+#X text 12 115 OUTLET_0 float;
+#X text 12 95 INLET_1 float;
+#X text 12 135 OUTLET_1 float;
+#X restore 500 597 pd META;
+#X obj 0 467 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 544 (none);
+#N canvas 107 153 428 433 Related_objects 0;
+#X obj 1 2 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 3 [stripnote] Related Objects;
+#X obj 74 81 ctlin;
+#X obj 217 81 pgmin;
+#X obj 24 81 bendin;
+#X obj 79 108 touchin;
+#X obj 261 81 polytouchin;
+#X obj 118 81 midiin;
+#X obj 23 108 sysexin;
+#X obj 179 168 noteout;
+#X obj 76 168 ctlout;
+#X obj 24 168 bendout;
+#X obj 366 168 touchout;
+#X obj 280 168 polytouchout;
+#X obj 123 168 midiout;
+#X obj 231 168 pgmout;
+#X obj 24 222 makenote;
+#X text 21 199 MIDI note construction:;
+#X text 21 141 MIDI output:;
+#X text 21 58 MIDI input:;
+#X obj 184 222 stripnote;
+#X obj 168 81 notein;
+#X text 181 199 MIDI note deconstruction:;
+#X obj 24 34 makenote;
+#X text 22 275 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 21 354 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 22 256 Externals;
+#X obj 22 305 pddp/helplink maxlib/pitch;
+#X obj 22 320 pddp/helplink maxlib/score;
+#X obj 22 335 pddp/helplink maxlib/chord;
+#X obj 22 370 pddp/helplink cyclone/midiformat;
+#X obj 22 385 pddp/helplink cyclone/midiparse;
+#X obj 22 400 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X obj 78 367 cnv 17 3 65 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 366 float;
+#X text 98 406 list;
+#X text 98 476 float;
+#X obj 78 477 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 439 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 438 float;
+#X obj 466 3 stripnote;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/stripnote
+-text pdpedia: stripnote;
+#X text 130 227 Stripnote takes note-off (zero-velocity) messages out
+of a stream of MIDI-style note message and passes the others through
+unchanged.;
+#X msg 134 127 23 0;
+#X obj 134 202 print x1;
+#X obj 191 202 print x2;
+#X obj 134 166 stripnote;
+#X text 168 366 - MIDI pitch value. The value will pass unchanged to
+the left outlet if the current value of the right inlet is non-zero.
+;
+#X msg 174 127 34.5 67.8;
+#X text 167 438 - a float to the right inlet is stored for later use.
+;
+#X text 168 476 - the MIDI pitch value received at the left inlet will
+pass unchanged if the value of the right inlet is non-zero.;
+#X text 98 506 float;
+#X obj 78 507 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 168 506 - the velocity will pass unchanged if the value of
+the right inlet is non-zero.;
+#X text 11 23 send note-on messages and schedule note-off for later
+;
+#X text 168 406 - a (pitch \, velocity) pair is distributed to the
+two inlets. Lists with more than two elements will be truncated.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 19 0 22 0;
+#X connect 22 0 20 0;
+#X connect 22 1 21 0;
+#X connect 24 0 22 0;
diff --git a/doc/pddp/struct-help.pd b/doc/pddp/struct-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..463a80cac0f7092f172757d999f03090734a4e8b
--- /dev/null
+++ b/doc/pddp/struct-help.pd
@@ -0,0 +1,163 @@
+#N struct struct-1 float x float y symbol dog array weasel struct-2
+;
+#N struct struct-2 float y;
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header struct 3 12 0 18
+-204280 -1 0;
+#X obj 0 189 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 58 228 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd version 0.35. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control data_structure;
+#X text 12 45 DESCRIPTION declare the fields in a data structure;
+#X text 12 65 OUTLET_0 click change select deselect displace;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 214 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 375 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 532 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 111 510 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [struct] Related Objects;
+#X obj 22 43 filledpolygon;
+#X obj 112 43 drawpolygon;
+#X obj 193 43 plot;
+#X obj 232 43 set;
+#X obj 262 43 get;
+#X obj 293 43 element;
+#X obj 22 73 getsize;
+#X obj 82 73 setsize;
+#X obj 142 73 pointer;
+#X obj 202 73 append;
+#X obj 254 73 sublist;
+#X restore 102 597 pd Related_objects;
+#X obj 78 296 cnv 17 3 72 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 483 3 struct;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/struct -text
+pdpedia: struct;
+#X text 11 23 declare the fields in a data structure;
+#X text 98 193 (none);
+#X text 98 295 click;
+#X text 98 325 select;
+#X text 98 310 change;
+#X text 98 355 displace;
+#X text 98 340 deselect;
+#X text 149 461 float;
+#X text 149 476 symbol;
+#X text 149 491 array;
+#N canvas 98 230 428 349 help-template1 0;
+#X obj 23 43 struct struct-1 float x float y symbol dog array weasel
+struct-2;
+#X text 20 182 This just displays a red square to visualize the data
+structure.;
+#X obj 23 159 filledpolygon 900 0 1 0 0 40 0 40 40 0 40;
+#X obj 23 226 plot weasel 0 1 0 0 10;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [struct] Data Stucture Template;
+#X text 21 247 Here we plot the array "weasel" \, which gets displayed
+on top of the red square;
+#X obj 23 78 print;
+#X text 20 99 In this example \, the "struct-1" structure is defined
+in which "x" and "y" are "floats" \, i.e. \, numbers \, but "dog" is
+a symbol and "weasel" is an array of objects of the data structure
+"struct-2".;
+#X text 21 286 To learn about z-ordering with data structures \, open
+the abstraction below:;
+#X obj 21 319 pddp/pddplink ./all_about_z_order.pd -text all_about_z_order.pd
+;
+#X connect 0 0 7 0;
+#X restore 101 96 pd help-template1;
+#N canvas 99 252 428 125 help-template2 0;
+#X obj 23 43 struct struct-2 float y;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [struct] Data Structure Template;
+#X text 21 67 Here is a data structure which specifies only the floating
+point "y". It's used for the elements of the array shown in the other
+template.;
+#X restore 101 118 pd help-template2;
+#N canvas 83 305 428 348 struct-help-data 0;
+#X scalar struct-1 95 43 symbol \; 17 \; 38 \; 2 \; 39 \; 14 \; \;
+;
+#X scalar struct-1 164 43 symbol \; 17 \; 1 \; 40 \; 2 \; 14 \; \;
+;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [struct] Related Objects;
+#X scalar struct-1 239 43 symbol \; 17 \; 38 \; 2 \; 39 \; 14 \; \;
+;
+#X text 19 279 You can also right-click on each square and choose "Properties"
+in both runmode and editmode to see the values associated with each
+scalar.;
+#X text 20 178 In editmode \, you can click on the squares to move
+them. Like other objects in Pd \, you can select multiple scalars and
+move them together (notice the blue bounding box when you select them).
+A [print] object is connected to the outlet of the corresponding [struct]
+for these boxes \, so when you move them with the mouse messages will
+print to the console.;
+#X text 20 103 The three squares above are scalars that are defined
+by the template "help-template1". The zigzag lines are arrays \, the
+elements of which are defined by the template "help-template2". In
+runmode you can click and drag each element to change its value.;
+#X restore 101 168 pd struct-help-data;
+#X text 98 138 To view instances of these data structures \, click
+the patch below:;
+#X text 98 41 The [struct] object is typically put one to a subpatch
+\, and may be accompanied by drawing instructions that define how the
+data will be visualized. Two data structures- "struct-1" and "struct-2"-
+are defined below in subpatches:;
+#X text 169 393 - the name of the struct;
+#N canvas 72 401 429 220 struct_names 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [struct] Struct Names;
+#X text 20 39 You can't use "float" or "_float_array" as struct names
+because Pd has hidden data structures named "float" and "_float_array"
+\, which are used for [table] and "Put menu arrays".;
+#X msg 23 134 \; pd-_float vis 1 \; pd-_float_array vis 1;
+#X text 20 99 You can click below to reveal the canvases that contain
+them:;
+#X restore 102 541 pd struct_names;
+#X text 188 461 - "float foo";
+#X text 188 476 - "symbol foo";
+#X text 188 491 - "array foo bar" \, where "bar" is the name of another
+data structure to be used as a template for elements of the array.
+;
+#X text 169 411 - all subsequent arguments are used to declare fields.
+Fields may be one of three types-- float \, symbol \, or array. To
+create the field "foo" \, use the syntax below for each type:;
+#X text 81 393 1) symbol atom;
+#X text 81 411 n) symbol atom;
+#X obj 99 560 pddp/pddplink scalar-help.pd;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 576 pddp/pddplink all_about_arrays.pd;
+#X obj 257 561 pddp/pddplink ../4.data.structures/06.file.pd -text
+doc/4.data.structures/06.file.pd;
+#X obj 257 576 pddp/pddplink ../4.data.structures/08.selection.pd -text
+doc/4.data.structures/08.selection.pd;
+#X text 99 217 When a scalar is moved or edited with the mouse \, data
+is sent to the outlet of the respective [struct] object. This data
+consists of: a selector that describes the mouse action that was performed
+\, a pointer to the scalar \, and-- optionally-- a number (usually
+a y-coordinate). The selectors below correspond to the following mouse
+actions:;
+#X text 172 295 - (run mode) clicking the object with the mouse.;
+#X text 172 310 - (run mode) changing the value of a field.;
+#X text 172 325 - (edit mode) selecting the object.;
+#X text 172 340 - (edit mode) deselecting an object.;
+#X text 172 355 - (edit mode) moving a selected object.;
diff --git a/doc/pddp/sublist-help.pd b/doc/pddp/sublist-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3b245a9c902c6ff10b1ce02093a2a8078aed5b06
--- /dev/null
+++ b/doc/pddp/sublist-help.pd
@@ -0,0 +1,62 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header sublist 3 12 0 18
+-204280 -1 0;
+#X obj 0 439 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.32. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control data_structure;
+#X text 12 45 DESCRIPTION get a list from a field of a scalar;
+#X text 12 65 INLET_0 pointer;
+#X text 12 85 OUTLET_0 pointer;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 476 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 512 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 569 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 76 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [sublist] Related Objects;
+#X obj 14 38 get;
+#X obj 46 38 set;
+#X obj 136 38 getsize;
+#X obj 193 38 setsize;
+#X obj 121 63 element;
+#X obj 13 64 sublist;
+#X obj 79 38 pointer;
+#X obj 69 63 struct;
+#X restore 102 597 pd Related_objects;
+#X obj 78 448 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 485 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 473 3 sublist;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/sublist -text
+pdpedia: sublist;
+#X text 96 170 Don't try this yet -- it's untested.;
+#X text 103 208 "sublist" will take as creation arguments a template
+name and a field name \; its one input takes a pointer. If you send
+a pointer (which should agree with the template name) \, "sublist"
+will output the field (which should be of type "list".) The output
+is in fact a pointer to the head of the sublist.;
+#X text 98 447 pointer;
+#X text 98 484 pointer;
+#X text 11 23 get a list from a field of a scalar;
+#X text 168 530 - template name.;
+#X text 168 545 - field name.;
+#X text 80 530 1) symbol;
+#X text 80 545 2) symbol;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 98 573 pddp/pddplink scalar-help.pd;
diff --git a/doc/pddp/swap-help.pd b/doc/pddp/swap-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2ab8c4b93748fe355ceb7b54e884f941859481a3
--- /dev/null
+++ b/doc/pddp/swap-help.pd
@@ -0,0 +1,234 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header swap 3 12 0 18 -204280
+-1 0;
+#X obj 0 220 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 275 494 357 META 0;
+#X text 12 165 LIBRARY internal;
+#X text 12 205 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 185 AUTHOR Miller Puckette;
+#X text 12 245 HELP_PATCH_AUTHORS Dave Sabine \, November 12 \, 2002
+. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 25 KEYWORDS control float list bang;
+#X text 12 65 DESCRIPTION swap two numbers \, respecting right-to-left
+order;
+#X text 12 85 INLET_0 float list bang;
+#X text 12 105 INLET_1 float;
+#X text 12 125 OUTLET_0 float;
+#X text 12 145 OUTLET_1 float;
+#X text 12 225 RELEASE_DATE 1997;
+#X text 12 5 ALIAS fswap;
+#X restore 500 597 pd META;
+#X obj 0 425 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 485 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 537 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 86 455 428 136 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [swap] Related Objects;
+#X text 20 69 Externals and other object libraries;
+#X obj 23 34 pack;
+#X obj 65 34 unpack;
+#X obj 20 89 pddp/helplink cyclone/split;
+#X restore 102 597 pd Related_objects;
+#X obj 78 229 cnv 17 3 145 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 433 float;
+#X obj 78 434 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 380 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 379 float;
+#X obj 443 3 swap;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/swap -text
+pdpedia: swap;
+#X text 98 278 float;
+#X text 168 283 - a float at the left inlet will send the number to
+the right outlet and then send the number at the right inlet to the
+left outlet.;
+#X text 98 229 bang;
+#X text 168 229 - a bang at the left inlet will force [swap] to send
+its values to the outlets \, in reverse order. The value from the left
+inlet will be sent to the right outlet then the value at the right
+inlet will be sent out the left outlet.;
+#X text 98 324 list;
+#X text 168 324 - a list at the left inlet will update the values of
+both of [swap]'s inlets and send the numbers to the outlets in reverse
+order. Note that lists of 3 or more elements will be truncated.;
+#X text 167 379 - a float at the right inlet is stored for later use.
+It will be sent to the left outlet when a float or bang is received
+in the left inlet.;
+#X text 98 456 float;
+#X obj 78 457 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 78 152 swap;
+#X floatatom 106 79 5 0 0 0 - - -;
+#X floatatom 190 119 5 0 0 0 - - -;
+#X floatatom 118 179 5 0 0 0 - - -;
+#X floatatom 78 179 5 0 0 0 - - -;
+#X msg 149 78 42 7;
+#X obj 78 77 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144 -1
+-1;
+#X msg 191 78 42 7 3 4;
+#X floatatom 333 143 5 0 0 0 - - -;
+#X floatatom 294 142 5 0 0 0 - - -;
+#X msg 294 88 bang;
+#X obj 294 112 swap 12;
+#X text 188 102 float;
+#X text 103 60 float;
+#X text 150 60 list;
+#X text 286 162 creation argument;
+#N canvas 90 38 428 503 More_Info 0;
+#X msg 42 82 42 7;
+#X obj 42 107 swap;
+#X floatatom 42 133 5 0 0 0 - - -;
+#X floatatom 101 133 5 0 0 0 - - -;
+#X obj 42 157 pack f f;
+#X obj 42 181 print;
+#X floatatom 43 347 5 0 0 0 - - -;
+#X floatatom 93 347 5 0 0 0 - - -;
+#X floatatom 142 347 5 0 0 0 - - -;
+#X floatatom 111 468 5 0 0 0 - - -;
+#X floatatom 158 468 5 0 0 0 - - -;
+#X floatatom 212 468 5 0 0 0 - - -;
+#X msg 42 271 2 2500 9 420;
+#X obj 42 317 unpack f f f f;
+#X floatatom 192 347 5 0 0 0 - - -;
+#X text 18 38 [swap] is most commonly used to change the order of a
+list. This trick is best suited for a PAIR of numbers.;
+#X obj 165 373 swap;
+#X obj 138 398 swap;
+#X obj 111 422 swap;
+#X obj 195 406 swap;
+#X obj 168 431 swap;
+#X obj 227 436 swap;
+#X floatatom 263 468 5 0 0 0 - - -;
+#X text 199 373 This could quickly become ridiculous!;
+#X msg 140 271 1 2 3 4;
+#X msg 219 271 0 200 3333 1111;
+#X text 19 213 Lists that are longer than two elements could be sorted
+this way \, but the structure quickly becomes unmanageable. It's probably
+better to find an alternative method.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [swap] More Info;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 1 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 5 0;
+#X connect 6 0 18 0;
+#X connect 7 0 17 0;
+#X connect 8 0 16 0;
+#X connect 12 0 13 0;
+#X connect 13 0 6 0;
+#X connect 13 1 7 0;
+#X connect 13 2 8 0;
+#X connect 13 3 14 0;
+#X connect 14 0 16 1;
+#X connect 16 0 17 1;
+#X connect 16 1 19 1;
+#X connect 17 0 18 1;
+#X connect 17 1 19 0;
+#X connect 18 0 9 0;
+#X connect 18 1 20 0;
+#X connect 19 0 20 1;
+#X connect 19 1 21 1;
+#X connect 20 0 10 0;
+#X connect 20 1 21 0;
+#X connect 21 0 11 0;
+#X connect 21 1 22 0;
+#X connect 24 0 13 0;
+#X connect 25 0 13 0;
+#X restore 102 546 pd More_Info;
+#N canvas 70 19 444 592 Note-off_parser_using_swap 0;
+#X obj 0 346 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12
+0 14 -204280 -1 0;
+#X obj 21 109 notein;
+#X text 77 105 [notein] is an object which receives incoming MIDI data
+from a MIDI instrument. The three outlets are PITCH \, VELOCITY \,
+and MIDI CHANNEL from left to right. It is important to note however
+that the data is outputted from right to left. Which means that the
+first piece of information to be sent out the object is the MIDI CHANNEL.
+;
+#X obj 21 183 swap;
+#X obj 21 222 pack;
+#X obj 21 266 route 0;
+#X floatatom 21 294 5 0 0 0 - - -;
+#X text 76 183 Here \, [swap] is used to store the VELOCITY until the
+PITCH information comes from [notein]. The next step will pack the
+two together...but we have to ensure that [pack] receives the two numbers
+in the correct order: PITCH first \, then VELOCITY. This way \, using
+[route] we can determine whether or not this incoming MIDI data is
+a "note-off" signal (i.e. VELOCITY = 0).;
+#X obj 21 316 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 21 386 notein;
+#X obj 22 426 pack;
+#X obj 22 451 route 0;
+#X floatatom 22 476 5 0 0 0 - - -;
+#X obj 22 497 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 45 315 This will "bang" only when velocity = 0;
+#X text 18 37 In some settings \, the [swap] object is useful as a
+timing mechanism to ensure that two numbers arrive at their destination
+in a particular order. Miller Puckette has provided an excellent example
+of [swap] used to build a 'note-off parser':;
+#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 346 Why doesn't the alternative work?;
+#X text 77 382 The goal of the Miller's example above is to retrieve
+"note-off" signals from [notein]. To do that \, we have to test the
+incoming data for pitches with a velocity of zero. So we swap the values
+\, pack up the incoming VELOCITY and PITCH data \, and send them to
+[route]...in effect we achieve the following:;
+#X text 78 463 IF velocity = 0 THEN display the pitch and send a bang
+;
+#X text 77 485 With the [notein] object \, the VELOCITY information
+is sent before the PITCH information. (Remember that in Pd data is
+sent to the outlets in right-to-left order.) In the example at left
+\, the VELOCITY information triggers the output of [pack] BEFORE the
+PITCH information is retrieved. This is why [swap] is used-- it solves
+the problem by making sure that the VELOCITY and PITCH are both received
+before packing them up and sending them to the [route] object.;
+#X text 7 1 [swap] Note-off Parser;
+#X connect 1 0 3 0;
+#X connect 1 1 3 1;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 8 0;
+#X connect 9 0 10 1;
+#X connect 9 1 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X restore 102 568 pd Note-off_parser_using_swap;
+#X text 11 23 swap two numbers \, respecting right-to-left order;
+#X text 168 433 - outputs the value from the right inlet.;
+#X text 168 456 - outputs the value from the left inlet.;
+#X text 80 503 1) float;
+#X text 168 503 - initializes the value of the right inlet.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 503 3 fswap;
+#X text 480 3 or;
+#X connect 24 0 28 0;
+#X connect 24 1 27 0;
+#X connect 25 0 24 0;
+#X connect 26 0 24 1;
+#X connect 29 0 24 0;
+#X connect 30 0 24 0;
+#X connect 31 0 24 0;
+#X connect 34 0 35 0;
+#X connect 35 0 33 0;
+#X connect 35 1 32 0;
diff --git a/doc/pddp/switch~-help.pd b/doc/pddp/switch~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5005c4c46f89b68cbfc690abb52426bbd9b9d2f2
--- /dev/null
+++ b/doc/pddp/switch~-help.pd
@@ -0,0 +1,171 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header switch~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 225 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 247 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.4. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 DESCRIPTION block size and on/off control for DSP;
+#X text 12 5 ALIAS block~;
+#X text 12 85 INLET_0 set float bang;
+#X text 12 25 KEYWORDS signal canvas_op;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 347 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 370 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 91 484 428 108 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [switch~] Related Objects;
+#X obj 22 43 fft~;
+#X obj 69 43 block~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 234 cnv 17 3 105 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/switch~ -text
+pdpedia: switch~;
+#X text 98 233 bang;
+#X text 168 233 - a "bang" message causes one block of DSP to be computed.
+This might be useful for pre-computing waveforms or window functions
+\, or also for video processing.;
+#X text 98 295 set;
+#X text 98 351 (none);
+#N canvas 65 117 428 374 messages-to-switch 0;
+#X obj 23 238 bang~;
+#X obj 23 264 t b b;
+#X obj 23 290 timer;
+#X floatatom 23 319 5 0 0 0 - - -;
+#X obj 23 38 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 52 63 set 4096 1 1;
+#X msg 52 121 set 4096 2 1;
+#X msg 52 92 set 8192 1 1;
+#X msg 52 151 set 4096 1 0.5;
+#X msg 52 178 set 4096 1 2;
+#X obj 23 205 switch~ 4096 1 1;
+#X obj 23 347 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 128 220 (args are blocksize \, overlap \, up/downsampling)
+;
+#X text 141 62 block size 4096 \, no overlap \, no resampling;
+#X text 141 91 bigger block size;
+#X text 140 120 double overlap;
+#X text 148 150 downsampled by factor of 2;
+#X text 148 179 upsampled by factor of 2;
+#X text 128 205 creation arguments (if any) initialize blocking;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [switch~] The "set" Message;
+#X text 65 319 <- measured time (msec) between blocks;
+#X text 50 37 <- switch this subpatch on and off;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 11 0;
+#X connect 4 0 10 0;
+#X connect 5 0 10 0;
+#X connect 6 0 10 0;
+#X connect 7 0 10 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 0;
+#X restore 171 325 pd messages-to-switch;
+#X text 168 295 - the "set" message can be used to change the blocksize
+\, overlap \, and up/downsampling.;
+#N canvas 82 247 428 234 switched 0;
+#X floatatom 140 95 1 0 0 0 - - -;
+#X floatatom 23 159 7 0 0 0 - - -;
+#X obj 23 95 noise~;
+#X obj 23 127 env~ 512;
+#X text 20 37 DSP in this subwindow is turned on and off by the [switch~]
+object. Any subwindows of this window can also be switched off here.
+If a patch and a superpatch both have switches \, both must be "on"
+for DSP to run in the patch.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [switch~] A simple example;
+#X obj 140 122 switch~;
+#X text 20 183 [switch~] takes optional arguments the same as block~.
+If you supply arguments to switch \, the patch will be switched AND
+reblocked.;
+#X connect 0 0 7 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X restore 78 183 pd switched;
+#X text 237 204 interactions with other objects;
+#X text 75 103 The [switch~] object also allows you to set the block
+size \, overlap \, and up/down-sampling ratio for the window. (The
+overlap and resampling ratio are relative to the super-patch.);
+#X text 76 39 The [switch~] object allows you to switch DSP on and
+off for the window. All subwindows are also switched. (If a subwindow
+of a switched window is also switched \, both switches must be on for
+the subwindow's audio DSP to run. Pd's global DSP must also be on.)
+;
+#X text 75 151 You may have at most one block~/switch~ object in any
+window \, so the examples are in subpatches below:;
+#X text 162 183 a simple example;
+#X text 99 503 BUG! [dac~] and [adc~] work only with a blocksize of
+64 . If you want to reblock audio computation \, do so in a sub-patch
+and keep the [adc~] and [dac~] objects in a super-patch. Only the [inlet~]
+and [outlet~] objects know how to reblock signals. In this example
+\, you could put a [dac~] in this \, outer window \, or in the switched
+subwindow \, but not the blocked one.;
+#N canvas 114 316 428 159 more_about_blocksize 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [switch~] Block Size;
+#X text 20 38 Pd's default block size is 64 samples. The [inlet~] and
+[outlet~] objects reblock signals to adjust for differences between
+parent and subpatch \, but only power-of-two adjustments are possible.
+So for "normal" audio computations \, all blocaks should also be power-of-two
+in size. HOWEVER \, if you have no [inlet~] or [outlet~] you may specify
+any other block size. This is intended for later use in video processing.
+;
+#X restore 170 476 pd more_about_blocksize;
+#X text 11 23 block size and on/off control for DSP;
+#X text 168 418 - up/downsampling;
+#X text 168 403 - overlap;
+#X text 168 388 - blocksize;
+#X text 167 434 [switch~] with no arguments does not reblock audio
+computation -- in other words \, block size and sample rate are as
+in the parent patch.;
+#X text 298 389 (See the "messages_to_switch" subpatch;
+#X text 298 404 above for more details.);
+#X text 98 270 float;
+#X text 467 3 [switch~];
+#N canvas 80 270 428 229 [switch~]-interactions 0;
+#X text 20 98 If using send~ or delwrite~ from a switched-off patch
+\, the output of corresponding receive~ and delread~ objects in other
+\, running patches will cycle old input (and sound like garbage). Throw~
+may be switched with impunity \, but not catch~.;
+#X text 20 38 dac~ and adc~ don't work correctly if reblocked \, nor
+if a parent window is reblocked \, even if the window containing the
+dac~ or adc~ is reblocked back to the default block size and sample
+rate.;
+#X text 20 168 Patches using send~/receive~ or throw~/catch~ to intercommunicate
+must have the same blocking -- and if their parents are blocked bigger
+than they are \, there might be weirdness.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [switch~] Interactions between [switch~] and other objects
+;
+#X restore 78 204 pd [switch~]-interactions;
+#X text 168 270 - "0" turns DSP off for the window \, "1" (or any nonzero
+value) turns it on.;
+#X text 80 388 1) float;
+#X text 80 403 2) float;
+#X text 80 418 3) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
diff --git a/doc/pddp/symbol-help.pd b/doc/pddp/symbol-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..638191b59e697618d64cbf9c4a3e3300fc9b26fc
--- /dev/null
+++ b/doc/pddp/symbol-help.pd
@@ -0,0 +1,129 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header symbol 3 12 0 18
+-204280 -1 0;
+#X obj 0 317 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 246 494 363 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 45 DESCRIPTION store a symbol;
+#X text 12 65 INLET_0 anything;
+#X text 12 85 INLET_1 symbol;
+#X text 12 105 OUTLET_0 symbol;
+#X text 12 5 KEYWORDS control storage symbol_op;
+#X text 12 185 RELEASE_DATE 1997;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 24 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X restore 500 597 pd META;
+#X obj 0 475 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 517 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 558 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 74 346 428 238 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [symbol] Related Objects;
+#X obj 23 67 list;
+#X obj 63 67 int;
+#X obj 94 67 float;
+#X obj 137 67 select;
+#X obj 187 67 makefilename;
+#X text 21 38 Native Pd Objects;
+#X text 21 108 Externals;
+#X obj 19 188 pddp/helplink ext13/ftos;
+#X obj 19 208 pddp/helplink iemlib/unsymbol;
+#X obj 20 168 pddp/helplink zexy/index;
+#X obj 20 148 pddp/helplink zexy/makesymbol;
+#X obj 20 128 pddp/helplink zexy/lister;
+#X restore 102 597 pd Related_objects;
+#X obj 78 326 cnv 17 3 110 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 484 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 442 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 481 3 symbol;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/symbol -text
+pdpedia: symbol;
+#X text 11 23 store a symbol;
+#X text 98 325 bang;
+#X text 98 350 symbol;
+#X text 98 441 symbol;
+#X text 98 483 symbol;
+#X text 168 483 - the symbol is output when a message is received at
+the left inlet of [symbol].;
+#X obj 51 220 symbol;
+#X symbolatom 51 279 10 0 0 0 - - -;
+#X obj 60 256 print;
+#X msg 63 82 dog;
+#X msg 71 105 cat;
+#X msg 84 132 symbol horse;
+#X msg 98 154 symbol wolf;
+#X msg 107 177 symbol pig;
+#X text 168 325 - sending a bang will force [symbol] to output its
+stored stored value.;
+#X text 275 120 IMPORTANT NOTE;
+#X obj 302 156 symbol;
+#X symbolatom 302 195 10 0 0 0 - - -;
+#X text 270 213 Careful not to get them confused.;
+#X text 270 175 is very different than the symbol box:;
+#X text 270 136 the [symbol] object:;
+#X msg 51 57 bang;
+#N canvas 78 344 428 194 Symbol_vs_Symbol_Box 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [symbol] vs. the Symbol Box;
+#X obj 23 125 symbol;
+#X msg 23 103 list 12;
+#X text 68 125 outputs "symbol list";
+#X msg 217 103 list 12;
+#X text 283 125 outputs "symbol float";
+#X symbolatom 217 125 10 0 0 0 - - -;
+#X text 20 38 The [symbol] object and the symbol box handle the "list"
+selector inconsistently.;
+#X text 23 76 [symbol] output;
+#X obj 23 147 print from_[symbol];
+#X obj 217 147 print from_symbol_box;
+#X text 216 76 symbol box output;
+#X connect 2 0 10 0;
+#X connect 3 0 2 0;
+#X connect 5 0 7 0;
+#X connect 7 0 11 0;
+#X restore 102 567 pd Symbol_vs_Symbol_Box;
+#X text 168 535 - (optional) initializes the stored symbol.;
+#X text 80 535 1) symbol atom;
+#X text 121 259 For this example \, I have used the symbol box to display
+the value that was stored in the [symbol] object \, as well as printing
+the value to the console.;
+#X text 167 441 - a symbol to the right inlet is stored. (Note: symbol
+atoms like "foo" will not be accepted.);
+#X text 105 49 The [symbol] object stores a symbol (which is set either
+by its creation argument or by the right inlet) and then outputs that
+symbol when it receives a "bang" message or a new symbol in its left
+inlet.;
+#X text 168 391 - all other messages to the left inlet of symbol will
+store and output the selector. E.g. \, a float will output the word
+"float" \, a list will output "list" \, a pointer will output "pointer"
+\, "foo bar" will output "foo" \, and so forth.;
+#X text 168 350 - a symbol sent to the left inlet will be stored and
+output. Symbol atoms (e.g. \, "foo") are accepted and given the "symbol"
+selector.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 98 391 anything;
+#X connect 19 0 20 0;
+#X connect 19 0 21 0;
+#X connect 22 0 19 0;
+#X connect 23 0 19 0;
+#X connect 24 0 19 1;
+#X connect 25 0 19 1;
+#X connect 26 0 19 1;
+#X connect 34 0 19 0;
diff --git a/doc/pddp/sysexin-help.pd b/doc/pddp/sysexin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0a659b21e3550edeb0f7caf78917bfad51295d2b
--- /dev/null
+++ b/doc/pddp/sysexin-help.pd
@@ -0,0 +1,91 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header sysexin 3 12 0 18
+-204280 -1 0;
+#X obj 0 441 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 47 253 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.35. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 65 OUTLET_0 float;
+#X text 12 85 OUTLET_1 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X text 12 45 DESCRIPTION needs a description;
+#X text 12 5 KEYWORDS control MIDI;
+#X restore 500 597 pd META;
+#X obj 0 469 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 441 423 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 78 80 ctlin;
+#X obj 221 80 pgmin;
+#X obj 28 80 bendin;
+#X obj 83 107 touchin;
+#X obj 265 80 polytouchin;
+#X obj 28 34 midiin;
+#X obj 27 107 sysexin;
+#X obj 183 167 noteout;
+#X obj 80 167 ctlout;
+#X obj 28 167 bendout;
+#X obj 370 167 touchout;
+#X obj 284 167 polytouchout;
+#X obj 127 167 midiout;
+#X obj 235 167 pgmout;
+#X obj 28 221 makenote;
+#X text 25 198 MIDI note construction:;
+#X text 25 140 MIDI output:;
+#X text 25 57 MIDI input:;
+#X obj 188 221 stripnote;
+#X obj 172 80 notein;
+#X text 185 198 MIDI note deconstruction:;
+#X text 8 2 [sysexin] Related Objects;
+#X text 26 265 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 25 344 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 26 246 Externals;
+#X obj 26 295 pddp/helplink maxlib/pitch;
+#X obj 26 310 pddp/helplink maxlib/score;
+#X obj 26 325 pddp/helplink maxlib/chord;
+#X obj 26 360 pddp/helplink cyclone/midiformat;
+#X obj 26 375 pddp/helplink cyclone/midiparse;
+#X obj 26 390 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 477 float;
+#X obj 78 478 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 (none);
+#X obj 78 503 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X floatatom 225 184 0 0 0 0 - - -;
+#X floatatom 264 184 0 0 0 0 - - -;
+#X text 164 264 of the channel (Linux only):;
+#X text 164 230 This object is always omni and;
+#X text 163 246 outputs the port number instead;
+#X text 11 23 needs a description;
+#X text 168 477 - port number;
+#X text 98 502 ???;
+#X text 168 502 - ???;
+#X text 80 545 1) ???;
+#X text 168 545 - ???;
+#X obj 484 3 sysexin;
+#X obj 447 20 pddp/pddplink http://wiki.puredata.info/en/sysexin -text
+pdpedia: sysexin;
+#X obj 225 153 sysexin;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 27 0 14 0;
+#X connect 27 1 15 0;
diff --git a/doc/pddp/table-help.pd b/doc/pddp/table-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..02cd74f35dc6167c3d8eca0430ab8d1bb1351772
--- /dev/null
+++ b/doc/pddp/table-help.pd
@@ -0,0 +1,121 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header table 3 12 0 18
+-204280 -1 0;
+#X obj 0 347 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 75 242 465 344 META 0;
+#X text 12 65 LIBRARY internal;
+#X text 12 105 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 125 RELEASE_DATE 2009-06-12;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 85 AUTHOR Miller Puckette;
+#X text 12 145 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS signal array GUI storage;
+#X text 12 45 DESCRIPTION array of numbers;
+#X restore 500 597 pd META;
+#X obj 0 377 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 407 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 529 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 84 273 428 334 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [table] Related Objects;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X restore 22 33 pd;
+#X obj 60 33 pddp/pddplink graph.pd;
+#X obj 124 33 struct;
+#X text 19 200 Externals and other object libraries;
+#X obj 22 91 tabread~;
+#X obj 96 91 tabread4;
+#X obj 171 91 tabwrite;
+#X obj 246 91 tabwrite~;
+#X obj 22 119 tabsend~;
+#X obj 98 119 tabreceive~;
+#X obj 198 119 tabplay~;
+#X obj 275 119 table;
+#X text 19 170 [array];
+#X obj 22 146 soundfiler;
+#X text 82 170 and fft objects.;
+#X obj 209 146 getsize;
+#X obj 118 146 tabosc4~;
+#X text 19 68 Native Pd Objects for reading from and writing to arrays:
+;
+#X obj 174 33 element;
+#X obj 19 220 pddp/helplink zexy/tabdump;
+#X obj 19 240 pddp/helplink linear_path;
+#X text 100 240 <-- which library is this in?;
+#X text 100 260 <-- which library is this in?;
+#X obj 19 260 pddp/helplink score;
+#X text 100 280 <-- which library is this in?;
+#X obj 19 280 pddp/helplink tabenv;
+#X obj 234 33 plot;
+#X obj 19 300 pddp/helplink arraysize;
+#X restore 102 598 pd Related_objects;
+#X text 80 426 1) symbol atom;
+#X text 11 23 array of numbers;
+#X obj 461 20 pddp/pddplink http://wiki.puredata.info/en/table -text
+pdpedia: table;
+#X obj 493 3 table;
+#X text 98 355 (none);
+#X text 98 385 (none);
+#X text 99 95 Note that the data (and other properties) of the array
+aren't saved with the patch. You can resize \, save to and/or read
+from an external file as you would with "array" objects. See "arrays"
+in the 2.control examples under the "pure documentation" help menu
+item.;
+#X text 80 505 2) float;
+#X text 99 321 Unfortunately there's no way to set vertical range \,
+etc.;
+#X text 98 561 For help on graphical arrays \, see:;
+#N canvas 74 365 428 203 table_vs_garray_from_Put_menu 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [table] vs. "Put" menu array: what's the difference?;
+#X text 20 80 * with the [table] object \, you can use the arguments
+to set the name and size of the garray.;
+#X text 20 110 * when using the [table] object \, you can't save any
+changes you make to the properites of the garray \, graph \, or the
+[table] subpatch itself.;
+#X text 20 150 * with the [table] object \, you cannot save the contents
+of the array with the patch. This is true even if you open the [table]
+and check "save contents" in the garray properties.;
+#X text 20 38 At first glance \, the [table] object might just look
+like garray in a graph that's been placed inside a subpatch. There
+are \, however \, some important differences:;
+#X restore 101 538 pd table_vs_garray_from_Put_menu;
+#X obj 102 191 table help-tab-2 25;
+#X obj 102 164 table help-tab-1;
+#X msg 72 242 \; help-tab-1 read table.txt;
+#X msg 72 281 \; help-tab-1 write /tmp/table.txt;
+#X obj 299 269 send help-tab-2;
+#X msg 299 242 sinesum 512 1;
+#X text 213 164 <- You can click [table] to view the garray inside.
+;
+#X text 100 52 The [table] object builds a subpatch with a graphical
+array inside. The creation arguments specify the name and an optional
+size in points.;
+#X text 99 215 You can also send messages to the garray by name:;
+#X obj 404 269 tabread help-tab-2;
+#X floatatom 404 243 5 0 0 0 - - -;
+#X floatatom 404 297 5 0 0 0 - - -;
+#X text 167 426 - (optional) name of the [table] and garray contained
+within. Use the name within array-handling objects \, like [tabwrite~]
+\, or use it to send messages to the garray (see examples above). Duplicate
+names will generate a warning when dsp is turned on. (If no argument
+is given \, [table] objects will be named "table1" \, "table2" \, "table3"
+\, etc.);
+#X text 167 505 - (optional) initial size of the array (default is
+100).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 98 576 pddp/pddplink array-help.pd;
+#X connect 24 0 23 0;
+#X connect 28 0 30 0;
+#X connect 29 0 28 0;
diff --git a/doc/pddp/tabosc4~-help.pd b/doc/pddp/tabosc4~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0775b928862570abbe34338032feb7e2cfba87a9
--- /dev/null
+++ b/doc/pddp/tabosc4~-help.pd
@@ -0,0 +1,194 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabosc4~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 262 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 245 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal array;
+#X text 12 45 DESCRIPTION 4-point interpolating oscillator;
+#X text 12 65 INLET_0 signal set;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 419 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 453 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 491 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 63 314 428 298 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [tabosc4~] Related Objects;
+#X text 21 38 Native Pd Objects;
+#X obj 24 61 tabread~;
+#X obj 98 61 tabread4;
+#X obj 173 61 tabwrite;
+#X obj 248 61 tabwrite~;
+#X obj 24 89 tabsend~;
+#X obj 100 89 tabreceive~;
+#X obj 200 89 tabplay~;
+#X obj 277 89 table;
+#X text 21 140 [array];
+#X obj 24 116 soundfiler;
+#X text 84 140 and fft objects.;
+#X obj 120 116 tabread4~;
+#X obj 211 116 getsize;
+#X text 22 170 Externals and other object libraries;
+#X obj 22 190 pddp/helplink zexy/tabdump;
+#X obj 22 210 pddp/helplink linear_path;
+#X text 103 210 <-- which library is this in?;
+#X text 103 230 <-- which library is this in?;
+#X obj 22 230 pddp/helplink score;
+#X text 103 250 <-- which library is this in?;
+#X obj 22 250 pddp/helplink tabenv;
+#X obj 22 270 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 271 cnv 17 3 100 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 428 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 376 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 375 float;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/tabosc4~ -text
+pdpedia: tabosc4~;
+#X obj 464 3 tabosc4~;
+#X floatatom 43 203 0 0 0 0 - - -;
+#N canvas 159 26 495 270 output 0;
+#X obj 414 196 t b;
+#X obj 414 134 f;
+#X obj 414 73 inlet;
+#X text 421 36 mute;
+#X obj 414 227 f;
+#X msg 521 218 0;
+#X msg 414 104 bang;
+#X obj 414 166 moses 1;
+#X obj 521 187 t b f;
+#X obj 486 143 moses 1;
+#X obj 102 181 dbtorms;
+#X obj 486 113 r master-lvl;
+#X obj 102 52 r master-lvl;
+#X obj 414 257 s master-lvl;
+#X obj 26 222 inlet~;
+#X obj 244 50 inlet;
+#X text 244 22 level;
+#X obj 244 122 s master-lvl;
+#X msg 118 80 set \$1;
+#X obj 118 109 outlet;
+#X msg 262 78 \; pd dsp 1;
+#X obj 102 238 line~;
+#X obj 26 259 *~;
+#X obj 26 295 dac~;
+#X obj 102 210 pack 0 50;
+#X text 24 195 audio;
+#X text 114 135 show level;
+#X connect 0 0 4 0;
+#X connect 1 0 7 0;
+#X connect 2 0 6 0;
+#X connect 4 0 13 0;
+#X connect 5 0 13 0;
+#X connect 6 0 1 0;
+#X connect 7 0 0 0;
+#X connect 7 1 8 0;
+#X connect 8 0 5 0;
+#X connect 9 1 4 1;
+#X connect 10 0 24 0;
+#X connect 11 0 1 1;
+#X connect 11 0 9 0;
+#X connect 12 0 10 0;
+#X connect 12 0 18 0;
+#X connect 14 0 22 0;
+#X connect 15 0 17 0;
+#X connect 15 0 20 0;
+#X connect 18 0 19 0;
+#X connect 21 0 22 1;
+#X connect 22 0 23 0;
+#X connect 22 0 23 1;
+#X connect 24 0 21 0;
+#X restore 18 224 pd output;
+#X msg 69 203 MUTE;
+#X floatatom 18 51 4 0 0 0 - - -;
+#X obj 18 76 sig~ 100;
+#X msg 32 119 set table1;
+#X obj 18 158 tabosc4~ table1;
+#X msg 116 119 set table2;
+#X floatatom 190 121 4 0 0 0 - - -;
+#X text 48 51 signal input for frequency (Hz.);
+#X text 33 98 message to switch tables;
+#X text 220 121 inlet to reset phase;
+#X obj 319 51 table table1;
+#X obj 319 73 table table2;
+#X text 98 270 signal;
+#X text 98 288 float;
+#X text 98 327 list;
+#X text 168 327 - a list will be truncated to the first item.;
+#X text 98 343 set;
+#X text 168 343 - the "set" message is used to switch to a different
+table (e.g. \, "set table2" in the example above).;
+#X text 167 375 - inlet to reset phase (range is 0 to 1).;
+#X text 98 395 list;
+#X text 167 395 - a list will be truncated to the first item.;
+#X text 98 427 signal;
+#N canvas 72 194 428 199 init_tables 0;
+#X msg 23 99 \; table1 sinesum 512 0.5 0.5 0.5 0.5 \; table2 cosinesum
+512 0 1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [tabosc4~] Subpatch to Initialize [table] objects;
+#X obj 23 75 loadbang;
+#X text 20 38 This subpatch initializes the [table] objects used by
+[tabosc4~].;
+#X text 20 147 Note: Don't send new "sinesum" messages to tables while
+you're running. Instead \, use "set" messages to switch between tables.
+;
+#X connect 3 0 0 0;
+#X restore 319 95 pd init_tables;
+#X text 29 184 volume in dB;
+#X text 11 23 4-point interpolating oscillator;
+#X text 168 471 - initializes the table or array to use.;
+#X text 168 288 - a float can be used to specify the frequency \, as
+long as there is not also a signal connection to the left inlet of
+[tabosc4~].;
+#X text 168 270 - an incoming signal to specify frequency (Hz.).;
+#X text 168 427 - the outgoing signal.;
+#X text 98 494 For good results use 512 points for up to about 15 partials
+\, or 32*npartials (rounded up to a power of 2) for more than 15 .
+;
+#X text 139 152 [tabosc4~] is a traditional computer music style wavetable
+lookup oscillator using 4-point polynomial interpolation. The table
+should have a power of two points plus three "guard points" \, one
+at the beginning and two at the end \, which should be wraparound copies
+of the last point and the first two points \, respectively. The "sinesum"
+and "cosinesum" methods for arrays do this automatically for you if
+you just want to specify partial strengths.;
+#X text 80 471 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 98 530 pddp/pddplink all_about_arrays.pd;
+#X obj 98 545 pddp/pddplink ../3.audio.examples/B01.wavetables.pd -text
+doc/3.audio.examples/B01.wavetables.pd;
+#X obj 98 560 pddp/pddplink ../3.audio.examples/B05.tabread.FM.pd -text
+doc/3.audio.examples/B05.tabread.FM.pd;
+#X obj 98 575 pddp/pddplink ../3.audio.examples/B06.table.switching.pd
+-text doc/3.audio.examples/B06.table.switching.pd;
+#X connect 14 0 15 1;
+#X connect 15 0 14 0;
+#X connect 16 0 15 2;
+#X connect 17 0 18 0;
+#X connect 18 0 20 0;
+#X connect 19 0 20 0;
+#X connect 20 0 15 0;
+#X connect 21 0 20 0;
+#X connect 22 0 20 1;
diff --git a/doc/pddp/tabplay~-help.pd b/doc/pddp/tabplay~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0efb66a2ff649bca1ca75cd65c26cdd10020f598
--- /dev/null
+++ b/doc/pddp/tabplay~-help.pd
@@ -0,0 +1,164 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabplay~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 284 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 246 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.29. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal array;
+#X text 12 45 DESCRIPTION play a table as audio (non-transposing);
+#X text 12 65 INLET_0 float bang list set;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 105 OUTLET_1 bang;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 565 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 58 313 441 301 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [tabplay~] Related Objects;
+#X text 20 38 Native Pd Objects;
+#X obj 23 63 tabread~;
+#X obj 97 63 tabread4;
+#X obj 276 89 table;
+#X text 22 146 [array];
+#X obj 23 116 soundfiler;
+#X text 85 146 and fft objects.;
+#X obj 119 116 tabread4~;
+#X obj 210 116 getsize;
+#X obj 281 116 setsize;
+#X obj 172 63 tabread;
+#X obj 247 63 tabwrite;
+#X obj 23 89 tabwrite~;
+#X obj 99 89 tabsend~;
+#X obj 179 89 tabreceive~;
+#X text 20 170 Externals and other object libraries;
+#X obj 20 190 pddp/helplink zexy/tabdump;
+#X obj 20 210 pddp/helplink linear_path;
+#X text 101 210 <-- which library is this in?;
+#X text 101 230 <-- which library is this in?;
+#X obj 20 230 pddp/helplink score;
+#X text 101 250 <-- which library is this in?;
+#X obj 20 250 pddp/helplink tabenv;
+#X obj 20 270 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 293 cnv 17 3 135 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 446 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 472 3 tabplay~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/tabplay~ -text
+pdpedia: tabplay~;
+#X text 98 292 bang;
+#X text 98 310 float;
+#X text 98 347 list;
+#X text 98 375 set;
+#X obj 78 469 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 signal;
+#X text 98 468 bang;
+#X text 168 468 - the right inlet sends a bang when [tabplay~] has
+finished playing through the table.;
+#X text 168 310 - sending a float n will cause [tabplay~] to start
+playing from the nth sample. (Sending 0 will play the entire sample.)
+;
+#X text 168 347 - a two-element list (x \, y) will cause [tabplay~]
+to begin at sample number x \, and continue for y samples.;
+#X floatatom 13 256 0 0 0 0 - - -;
+#X msg 13 52 set array99;
+#X obj 13 230 env~ 16384;
+#X obj 179 257 dac~ 1;
+#X obj 179 213 *~;
+#X obj 193 191 line~;
+#X msg 193 150 0.1 100;
+#X msg 209 171 0 100;
+#X text 255 151 on;
+#X text 255 171 off;
+#X text 231 191 envelope;
+#X text 231 202 generator;
+#X text 223 259 audio output;
+#X obj 179 235 hip~ 5;
+#X msg 42 137 0 44100;
+#X msg 38 116 44100;
+#X msg 28 76 bang;
+#X msg 48 157 44100 1000;
+#X text 168 520 - the name of the array or table to which [tabwrite~]
+will write data. The array or table must exist in an open Pd patch/canvas
+or an error message will appear in the console.;
+#X text 174 128 amplitude controls:;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 155948 float 0;
+#X coords 0 1 155948 -1 160 100 1;
+#X restore 345 145 graph;
+#N canvas 0 0 428 391 init 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 283 soundfiler;
+#X floatatom 23 305 0 0 0 0 - - -;
+#X obj 23 204 loadbang;
+#X text 20 38 The objects below load a short soundfile into the array
+named "tabplay~-help-array.";
+#X text 20 68 If you right-click on the array and choose "Properties
+\, " you'll see the "save contents" checkbox is unmarked \, so that
+the array data is not saved as part of the patch.;
+#X text 20 110 You can always check this box to save the contents of
+the array in the patch \, but with large amounts of array data- even
+a few seconds of audio- this can create rather large Pd files.;
+#X text 20 162 Thus it is better just to load the content of the array
+when the patch opens \, as follows:;
+#X text 20 333 See the [soundfiler] help patch for more information.
+;
+#X text 8 2 [tabplay~] Initialisation Subpatch;
+#X obj 23 231 f \$0;
+#X msg 23 258 read -resize ../sound/bell.aiff \$1-array;
+#X connect 1 0 2 0;
+#X connect 3 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 1 0;
+#X restore 345 250 pd init;
+#X text 11 23 play a table as audio (non-transposing);
+#X text 95 75 The tabplay~ object plays through a table \, or part
+of one \, with no transposition or interpolation. It is cheaper than
+tabread4~ and there are none of tabread4~'s interpolation artifacts.
+;
+#X text 168 292 - play through the whole table.;
+#X text 168 375 - the "set" message \, followed by the name of an array
+\, permits you to switch between arrays (e.g. \, "set another_array").
+;
+#X text 168 445 - the outgoing audio signal.;
+#X text 80 520 1) symbol;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 98 570 pddp/pddplink all_about_arrays.pd;
+#X obj 13 180 tabplay~ \$0-array;
+#X msg 33 96 stop;
+#X text 98 417 stop;
+#X text 168 417 - stop playback;
+#X connect 23 0 53 0;
+#X connect 24 0 22 0;
+#X connect 26 0 35 0;
+#X connect 27 0 26 1;
+#X connect 28 0 27 0;
+#X connect 29 0 27 0;
+#X connect 35 0 25 0;
+#X connect 36 0 53 0;
+#X connect 37 0 53 0;
+#X connect 38 0 53 0;
+#X connect 39 0 53 0;
+#X connect 53 0 24 0;
+#X connect 53 0 26 0;
+#X connect 54 0 53 0;
diff --git a/doc/pddp/tabread-help.pd b/doc/pddp/tabread-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..25ab1f0e556abd1856dfe7d4537066fcaa43c6f6
--- /dev/null
+++ b/doc/pddp/tabread-help.pd
@@ -0,0 +1,133 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabread 3 12 0 18
+-204280 -1 0;
+#X obj 0 277 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Dave Sabine \, April 25 \, 2003 .
+Jonathan Wilkes revised the patch to conform to the PDDP template for
+Pd version 0.42.;
+#X text 12 5 KEYWORDS control array;
+#X text 12 45 DESCRIPTION read numbers from a table;
+#X text 12 65 INLET_0 float set;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 444 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 482 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 541 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 83 315 428 299 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [tabread] Related Objects;
+#X text 21 38 Native Pd Objects;
+#X obj 24 61 tabread~;
+#X obj 98 61 tabread4;
+#X obj 173 61 tabwrite;
+#X obj 248 61 tabwrite~;
+#X obj 24 89 tabsend~;
+#X obj 100 89 tabreceive~;
+#X obj 200 89 tabplay~;
+#X obj 277 89 table;
+#X text 21 140 [array];
+#X obj 24 116 soundfiler;
+#X text 84 140 and fft objects.;
+#X obj 120 116 tabread4~;
+#X obj 211 116 getsize;
+#X obj 282 116 setsize;
+#X text 22 164 Externals and other object libraries;
+#X obj 22 184 pddp/helplink zexy/tabdump;
+#X obj 22 204 pddp/helplink linear_path;
+#X text 103 204 <-- which library is this in?;
+#X text 103 224 <-- which library is this in?;
+#X obj 22 224 pddp/helplink score;
+#X text 103 244 <-- which library is this in?;
+#X obj 22 244 pddp/helplink tabenv;
+#X obj 22 264 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 286 cnv 17 3 145 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 285 float;
+#X text 98 452 float;
+#X obj 78 453 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 475 3 tabread;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/tabread -text
+pdpedia: tabread;
+#X text 168 285 - a float at the left inlet will move to the corresponding
+index in the table's array. The index ranges from 0 to the size of
+the array minus one (numbers outside this range are ignored). By default
+\, the size of an array in a table is 100 - or 0 to 99 . The actual
+size of the array can be altered using the array's dialog box or the
+resize command. More about arrays can be found below.;
+#X text 98 402 set;
+#X text 168 500 - the argument informs [tabread] which array to read.
+The array must exist in an open Pd patch/canvas or an error message
+will appear in the terminal window.;
+#X text 168 452 - outputs a floating point number which corresponds
+to the index you query using the inlet.;
+#X floatatom 74 251 0 0 0 0 value - -;
+#X floatatom 74 93 0 0 99 0 index - -;
+#X text 18 55 Open the tables and use your mouse to draw new values
+in the arrays - otherwise [tabread] will always output "0".;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array1 100 float 3;
+#A 0 -0.900001 -0.900001 -0.900001 -0.900001 -0.900001 -0.866667 -0.833334
+-0.833334 -0.833334 -0.833334 -0.800001 -0.800001 -0.766667 -0.766667
+-0.766667 -0.766667 -0.766667 -0.766667 -0.766667 -0.766667 -0.766667
+-0.766667 -0.766667 -0.766667 -0.766667 -0.766667 -0.766667 -0.766667
+-0.766667 -0.766667 -0.733334 -0.733334 -0.733334 -0.7 -0.666667 -0.633334
+-0.633334 -0.633334 -0.633334 -0.633334 -0.633334 -0.633334 -0.633334
+-0.6 -0.6 -0.566667 -0.566667 -0.566667 -0.566667 -0.566667 -0.566667
+-0.566667 -0.566667 -0.566667 -0.566667 -0.566667 -0.533334 -0.533334
+-0.5 -0.5 -0.466667 -0.466667 -0.433334 -0.4 -0.366667 -0.333333 -0.3
+-0.283333 -0.266667 -0.233333 -0.2 -0.133333 -0.133333 -0.133333 -0.0666667
+-0.0666667 -0.0666667 1.49012e-08 0.1 0.1 0.233333 0.3 0.333334 0.4
+0.433334 0.566667 0.633334 0.733334 0.733334 0.766667 0.766667 0.800001
+0.800001 0.800001 0.800001 0.800001 0.800001 0.800001 0.800001 0.900001
+;
+#X coords 0 1 99 -1 100 60 1;
+#X restore 383 83 graph;
+#X text 346 217 mouse to draw new values.;
+#X text 346 204 Open the table and use your;
+#X text 168 402 - the "set" message allows you to read from dynamic
+sources (e.g. \, "set tabread-help-array"). You can change the source
+at any time using the "set" message.;
+#X text 98 380 list;
+#X text 168 380 - a list will be truncated to the first item.;
+#X text 11 24 read numbers from a table;
+#X obj 98 577 pddp/pddplink all_about_arrays.pd -text all_about_arrays
+;
+#X text 80 500 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 107 93 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 107 113 f \$0;
+#X obj 110 162 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 110 182 f \$0;
+#X msg 107 135 set \$1-array1;
+#X obj 74 227 tabread \$0-array1;
+#X msg 110 204 set \$1-array2;
+#X obj 353 184 table \$0-array2;
+#X obj 98 547 pddp/pddplink ../2.control.examples/15.arrays.pd;
+#X obj 97 562 pddp/pddplink ../2.control.examples/16.more.arrays.pd
+;
+#X connect 19 0 36 0;
+#X connect 31 0 32 0;
+#X connect 32 0 35 0;
+#X connect 33 0 34 0;
+#X connect 34 0 37 0;
+#X connect 35 0 36 0;
+#X connect 36 0 18 0;
+#X connect 37 0 36 0;
diff --git a/doc/pddp/tabread4-help.pd b/doc/pddp/tabread4-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c948f13e03a8d9753e39292fd81c36c9c46f370c
--- /dev/null
+++ b/doc/pddp/tabread4-help.pd
@@ -0,0 +1,123 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabread4 3 12 0
+18 -204280 -1 0;
+#X obj 0 247 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 247 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS Dave Sabine \, May 2 \, 2003 Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control array;
+#X text 12 45 DESCRIPTION read numbers from a table with 4-point interpolation
+;
+#X text 12 95 OUTLET_0 float;
+#X text 12 75 INLET_0 float set;
+#X text 12 175 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 422 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 475 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 74 320 428 293 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [tabread4] Related Objects;
+#X text 21 38 Native Pd Objects;
+#X obj 24 61 tabread~;
+#X obj 98 61 tabread4;
+#X obj 173 61 tabwrite;
+#X obj 248 61 tabwrite~;
+#X obj 24 89 tabsend~;
+#X obj 100 89 tabreceive~;
+#X obj 200 89 tabplay~;
+#X obj 277 89 table;
+#X text 21 140 [array];
+#X obj 24 116 soundfiler;
+#X text 84 140 and fft objects.;
+#X obj 211 116 getsize;
+#X obj 120 116 tabosc4~;
+#X text 22 165 Externals and other object libraries;
+#X obj 22 185 pddp/helplink zexy/tabdump;
+#X obj 22 205 pddp/helplink linear_path;
+#X text 103 205 <-- which library is this in?;
+#X text 103 225 <-- which library is this in?;
+#X obj 22 225 pddp/helplink score;
+#X text 103 245 <-- which library is this in?;
+#X obj 22 245 pddp/helplink tabenv;
+#X obj 22 265 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 256 cnv 17 3 160 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 255 float;
+#X text 98 362 list;
+#X text 98 430 float;
+#X obj 78 431 cnv 17 3 40 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 tabread4;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/tabread4 -text
+pdpedia: tabread4;
+#X floatatom 101 216 0 0 0 0 interpolation - -;
+#X floatatom 101 107 0 0 1000 0 location - -;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 10 float 1;
+#A 0 0 0.749989 0 -0.849987 0 -0.349995 0.949986 0 -0.699989 -0.399994
+;
+#X coords 0 1 9 -1 100 40 1;
+#X restore 316 73 graph;
+#X text 168 362 - a list will be truncated to the first item.;
+#X text 98 377 set;
+#X text 168 255 - a float at the left inlet will move to the corresponding
+location in the table's array. The lowest valid number is "0" which
+represents the first element of the array. The highest valid number
+is a fraction below the actual length of the array (values out of range
+are ignored). Each fractional increment between the lower and upper
+bounds of the array will produce an interpolation of the actual array
+values at the outlet.;
+#X text 168 377 - the "set" message allows you to read from dynamic
+sources (e.g. \, "set tabread-help-array"). You can change the source
+at any time using the "set" message.;
+#X text 168 430 - outputs a floating point number representing an interpolation
+of the array value corresponding to the location described at the inlet.
+;
+#X text 11 23 read numbers from a table with 4-point interpolation
+;
+#X obj 98 543 pddp/pddplink all_about_arrays.pd -text all_about_arrays
+;
+#X obj 101 132 / 100;
+#X text 323 163 Draw values in the table below:;
+#X text 168 493 - the name of the array or table to read. The array
+or table must exist in an open Pd patch/canvas or an error message
+will appear in the console.;
+#X text 80 493 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 101 189 tabread4 \$0-array;
+#X obj 172 125 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 172 145 f \$0;
+#X msg 172 166 set \$1-another_table;
+#X obj 374 182 table \$0-another_table 10;
+#X obj 182 47 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 182 67 f \$0;
+#X msg 182 89 set \$1-array;
+#X obj 96 558 pddp/pddplink ../2.control.examples/15.arrays.pd;
+#X obj 96 573 pddp/pddplink ../2.control.examples/16.more.arrays.pd
+;
+#X connect 16 0 25 0;
+#X connect 25 0 30 0;
+#X connect 30 0 15 0;
+#X connect 31 0 32 0;
+#X connect 32 0 33 0;
+#X connect 33 0 30 0;
+#X connect 35 0 36 0;
+#X connect 36 0 37 0;
+#X connect 37 0 30 0;
diff --git a/doc/pddp/tabread4~-help.pd b/doc/pddp/tabread4~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d314ba354562ab8e5ccca46f7617cc015ff7d405
--- /dev/null
+++ b/doc/pddp/tabread4~-help.pd
@@ -0,0 +1,143 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabread4~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 305 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 246 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.29. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal array;
+#X text 12 45 DESCRIPTION 4-point-interpolating table lookup;
+#X text 12 65 INLET_0 signal set;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 signal;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 417 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 449 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 510 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 79 318 428 294 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 21 38 Native Pd Objects;
+#X obj 24 61 tabread~;
+#X obj 98 61 tabread4;
+#X obj 173 61 tabwrite;
+#X obj 248 61 tabwrite~;
+#X obj 24 89 tabsend~;
+#X obj 100 89 tabreceive~;
+#X obj 200 89 tabplay~;
+#X obj 277 89 table;
+#X text 21 140 [array];
+#X obj 24 116 soundfiler;
+#X text 84 140 and fft objects.;
+#X obj 120 116 tabread4~;
+#X obj 211 116 getsize;
+#X obj 282 116 setsize;
+#X text 8 2 [tabread4~] Related Objects;
+#X text 21 170 Externals and other object libraries;
+#X obj 21 190 pddp/helplink zexy/tabdump;
+#X obj 21 210 pddp/helplink linear_path;
+#X text 102 210 <-- which library is this in?;
+#X text 102 230 <-- which library is this in?;
+#X obj 21 230 pddp/helplink score;
+#X text 102 250 <-- which library is this in?;
+#X obj 21 250 pddp/helplink tabenv;
+#X obj 21 270 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 314 cnv 17 3 75 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 426 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 tabread4~;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/tabread4~
+-text pdpedia: tabread4~;
+#X text 11 23 4-point-interpolating table lookup;
+#X text 68 174 signal input x(n);
+#X obj 21 261 snapshot~;
+#X obj 40 239 metro 200;
+#X obj 21 115 sig~;
+#X floatatom 21 89 0 0 0 0 - - -;
+#X floatatom 21 284 0 0 0 0 - - -;
+#X text 98 313 signal;
+#X text 168 313 - the incoming signal is the index. Indices should
+range from 1 to the size of the array minus two \, so that the 4-point
+interpolation is meaningful.;
+#X text 53 83 Shift-drag the number box to see the effect of interpolation.
+;
+#X text 98 353 set;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 10 float 0;
+#X coords 0 1 9 -1 160 100 1;
+#X restore 289 141 graph;
+#X text 98 425 signal;
+#X obj 40 217 loadbang;
+#X obj 100 515 pddp/pddplink all_about_arrays.pd -text all_about_arrays
+;
+#X text 168 467 - the name of the array or table from which [tabread4~]
+will read data. The array or table must exist in an open Pd patch/canvas
+or an error message will appear in the console.;
+#N canvas 117 345 428 159 init 0;
+#X msg 23 103 0 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 23 81 loadbang;
+#X text 8 2 [tabread4~] [table] initialization;
+#X text 20 38 This subpatch just initializes a [table] to some values.
+(Values in a [table] are not saved in the patch.);
+#X obj 23 125 s \$0-array;
+#X connect 0 0 5 0;
+#X connect 2 0 0 0;
+#X restore 288 270 pd init;
+#X text 168 353 - the "set" message \, followed by the name of an array
+\, permits you to switch between arrays (e.g. \, "set another_array").
+;
+#X text 80 467 1) symbol;
+#X text 18 44 [tabread4~] is used to build samplers and other table
+lookup algorithms. The interpolation scheme is 4-point polynomial.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 100 530 pddp/pddplink ../3.audio.examples/B03.tabread4.pd -text
+doc/3.audio.examples/B03.tabread4.pd;
+#X obj 100 545 pddp/pddplink ../3.audio.examples/B04.tabread4.interpolation.pd
+-text doc/3.audio.examples/B04.tabread4.interpolation.pd;
+#X obj 78 396 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 395 float;
+#X obj 247 395 pddp/pddplink ../3.audio.examples/B15.tabread4~-onset.pd
+-text doc/3.audio.examples/B15.tabread4~-onset.pd;
+#X text 168 395 - onset. See:;
+#X obj 100 560 pddp/pddplink ../3.audio.examples/B06.table.switching.pd
+-text doc/3.audio.examples/B06.table.switching.pd;
+#X obj 100 575 pddp/pddplink ../3.audio.examples/B07.sampler.pd -text
+doc/3.audio.examples/B07.sampler.pd;
+#X obj 21 194 tabread4~ \$0-array;
+#X obj 289 247 table \$0-array2;
+#X obj 66 113 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 66 133 f \$0;
+#X msg 66 155 set \$1-array2;
+#X obj 170 280 s \$0-array2;
+#X msg 170 253 sinesum 256 1;
+#X connect 14 0 18 0;
+#X connect 15 0 14 0;
+#X connect 16 0 42 0;
+#X connect 17 0 16 0;
+#X connect 25 0 15 0;
+#X connect 42 0 14 0;
+#X connect 44 0 45 0;
+#X connect 45 0 46 0;
+#X connect 46 0 42 0;
+#X connect 48 0 47 0;
diff --git a/doc/pddp/tabread~-help.pd b/doc/pddp/tabread~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..32ccfd80028cd8d5eb11aa5456dac599177cb930
--- /dev/null
+++ b/doc/pddp/tabread~-help.pd
@@ -0,0 +1,138 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabread~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 270 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Dave Sabine \, April 25 \, 2003 .
+Jonathan Wilkes revised the patch to conform to the PDDP template for
+Pd version 0.42.;
+#X text 12 45 DESCRIPTION read numbers from a table and output as signal
+;
+#X text 12 165 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS signal array;
+#X text 12 65 INLET_0 signal set;
+#X text 12 85 OUTLET_0 signal;
+#X restore 500 597 pd META;
+#X obj 0 426 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 464 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 533 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 83 315 428 299 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [tabread~] Related Objects;
+#X text 21 38 Native Pd Objects;
+#X obj 24 61 tabread;
+#X obj 98 61 tabread4;
+#X obj 173 61 tabwrite;
+#X obj 248 61 tabwrite~;
+#X obj 24 89 tabsend~;
+#X obj 100 89 tabreceive~;
+#X obj 200 89 tabplay~;
+#X obj 277 89 table;
+#X text 21 140 [array];
+#X obj 24 116 soundfiler;
+#X text 84 140 and fft objects.;
+#X obj 120 116 tabread4~;
+#X obj 211 116 getsize;
+#X obj 282 116 setsize;
+#X text 22 164 Externals and other object libraries;
+#X obj 22 184 pddp/helplink zexy/tabdump;
+#X obj 22 204 pddp/helplink linear_path;
+#X text 103 204 <-- which library is this in?;
+#X text 103 224 <-- which library is this in?;
+#X obj 22 224 pddp/helplink score;
+#X text 103 244 <-- which library is this in?;
+#X obj 22 244 pddp/helplink tabenv;
+#X obj 22 264 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 279 cnv 17 3 135 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 435 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 475 3 tabread~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/tabread~ -text
+pdpedia: tabread~;
+#X text 98 375 set;
+#X text 168 482 - the argument informs [tabread~] which array to read.
+The array must exist in an open Pd patch/canvas or an error message
+will appear in the terminal window.;
+#X floatatom 106 223 0 0 0 0 value - -;
+#X floatatom 87 65 0 0 99 0 index - -;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array1 100 float 3;
+#A 0 0.833332 0.433332 0.366665 0.333332 0.299999 0.266665 0.233332
+0.199999 0.133332 0.0999988 0.0333322 0.0333322 -1.13249e-06 -0.0666678
+-0.100001 -0.116668 -0.133334 -0.166668 -0.200001 -0.233334 -0.266668
+-0.300001 -0.300001 -0.333334 -0.366668 -0.366668 -0.400001 -0.433334
+-0.433334 -0.433334 -0.450001 -0.466667 -0.500001 -0.500001 -0.500001
+-0.533334 -0.533334 -0.566667 -0.583334 -0.600001 -0.633334 -0.633334
+-0.633334 -0.6 -0.6 -0.566667 -0.566667 -0.566667 -0.566667 -0.566667
+-0.566667 -0.566667 -0.566667 -0.566667 -0.566667 -0.566667 -0.533334
+-0.533334 -0.5 -0.5 -0.466667 -0.466667 -0.433334 -0.4 -0.366667 -0.333333
+-0.3 -0.283333 -0.266667 -0.233333 -0.2 -0.133333 -0.133333 -0.133333
+-0.0666667 -0.0666667 -0.0666667 1.49012e-08 0.1 0.1 0.233333 0.3 0.333334
+0.4 0.433334 0.566667 0.633334 0.733334 0.733334 0.766667 0.766667
+0.800001 0.800001 0.800001 0.800001 0.800001 0.800001 0.800001 0.800001
+0.900001;
+#X coords 0 1 99 -1 100 60 1;
+#X restore 383 83 graph;
+#X text 346 217 mouse to draw new values.;
+#X text 346 204 Open the table and use your;
+#X text 168 375 - the "set" message allows you to read from dynamic
+sources (e.g. \, "set tabread~-help-array"). You can change the source
+at any time using the "set" message.;
+#X text 11 24 read numbers from a table and output as signal;
+#X obj 98 569 pddp/pddplink all_about_arrays.pd -text all_about_arrays
+;
+#X text 80 482 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 232 65 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 106 164 tabread~ \$0-array1;
+#X obj 385 182 table \$0-array2;
+#X obj 87 126 sig~;
+#X obj 232 85 symbol \$0-array2;
+#X msg 232 107 set \$1;
+#X obj 122 65 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X msg 122 107 set \$1;
+#X obj 122 85 symbol \$0-array1;
+#X obj 39 176 metro 100;
+#X obj 106 199 snapshot~;
+#X obj 39 156 loadbang;
+#X text 98 278 signal;
+#X text 168 278 - a signal at the left inlet will move to the corresponding
+index in the table's array. The index ranges from 0 to the size of
+the array minus one (numbers outside this range are ignored). By default
+\, the size of an array in a table is 100 - or 0 to 99 . The actual
+size of the array can be altered using the array's dialog box or the
+resize command. More about arrays can be found below.;
+#X text 98 434 signal;
+#X text 168 434 - outputs is an audio signal which corresponds to the
+index you query using the inlet.;
+#X obj 96 538 pddp/pddplink ../2.control.examples/15.arrays.pd;
+#X obj 95 553 pddp/pddplink ../2.control.examples/16.more.arrays.pd
+;
+#X connect 15 0 27 0;
+#X connect 24 0 28 0;
+#X connect 25 0 34 0;
+#X connect 27 0 25 0;
+#X connect 28 0 29 0;
+#X connect 29 0 25 0;
+#X connect 30 0 32 0;
+#X connect 31 0 25 0;
+#X connect 32 0 31 0;
+#X connect 33 0 34 0;
+#X connect 34 0 14 0;
+#X connect 35 0 33 0;
diff --git a/doc/pddp/tabreceive~-help.pd b/doc/pddp/tabreceive~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fc4562dbc87b36d0d79c310df77955de6f4e7874
--- /dev/null
+++ b/doc/pddp/tabreceive~-help.pd
@@ -0,0 +1,56 @@
+#N canvas 1 88 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabreceive~ 3 12
+0 18 -204280 -1 0;
+#X obj 0 450 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 255 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION read a block of a signal from an array continuously
+;
+#X text 12 75 INLET_0;
+#X text 12 95 OUTLET_0 signal;
+#X text 12 175 RELEASE_DATE 1997;
+#X text 12 5 KEYWORDS signal array block_oriented;
+#X restore 500 597 pd META;
+#X obj 0 487 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 524 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 565 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 74 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 103 43 fft~;
+#X obj 23 43 tabsend~;
+#X text 8 2 [tabreceive~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 459 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 496 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 456 3 tabreceive~;
+#X obj 425 20 pddp/pddplink http://wiki.puredata.info/en/tabreceive~
+-text pdpedia: tabreceive~;
+#X text 11 23 read a block of a signal from an array continuously;
+#X obj 95 226 tabreceive~;
+#X text 90 291 By default a block is 64 samples \; this can be reset
+using the block~ object.;
+#X text 203 226 - read a block of a signal from an array continuously
+;
+#X text 168 542 - the name of an array to read from.;
+#X text 98 495 signal;
+#X text 98 458 unknown;
+#X text 80 542 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 98 570 pddp/pddplink all_about_arrays.pd;
diff --git a/doc/pddp/tabsend~-help.pd b/doc/pddp/tabsend~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b60d4dc94147dcbc60df0a770c424759849809a7
--- /dev/null
+++ b/doc/pddp/tabsend~-help.pd
@@ -0,0 +1,93 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabsend~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 464 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 247 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal array block_oriented;
+#X text 12 45 DESCRIPTION write one block of a signal continuously
+to an array;
+#X text 12 75 DATATYPE_IN signal;
+#X text 12 95 DATATYPE_OUT;
+#X text 12 175 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 501 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 76 480 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 103 43 fft~;
+#X text 8 2 [tabsend~] Related Objects;
+#X obj 23 43 tabreceive~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 473 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 tabsend~;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/tabsend~ -text
+pdpedia: tabsend~;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 64 float 2;
+#X coords 0 1 64 -1 100 70 1;
+#X restore 291 205 graph;
+#X obj 83 169 loadbang;
+#X text 98 505 (none);
+#X text 98 472 signal;
+#N canvas 68 141 428 387 Using_tabsend~_with_block~ 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array2 128 float 0;
+#X coords 0 1 127 -1 128 100 1;
+#X restore 193 117 graph;
+#X msg 24 305 set 128;
+#X msg 24 257 set 64;
+#X obj 194 117 cnv 15 64 20 empty empty 64_samples 0 10 0 10 -257985
+-66577 0;
+#X obj 193 197 cnv 15 128 20 empty empty 128_samples 60 10 0 10 -4034
+-66577 0;
+#X obj 23 117 osc~ 512;
+#X text 73 256 default size;
+#X text 78 303 double size;
+#X obj 24 353 block~;
+#X text 8 2 [tabsend~] Using [tabsend~] with [block~];
+#X text 21 230 Try changing the block size:;
+#X text 20 38 You can use [block~] to change the blocksize and \, consequently
+\, how many samples are send to the specified array by [tabsend~].
+;
+#X obj 24 148 tabsend~ \$0-array2;
+#X connect 2 0 9 0;
+#X connect 3 0 9 0;
+#X connect 6 0 13 0;
+#X restore 83 368 pd Using_tabsend~_with_block~;
+#X text 80 320 By default a block is 64 samples. This can be reset
+using the [block~] object \, as in the subpatch below:;
+#X obj 83 228 osc~;
+#X msg 83 198 512;
+#X text 168 472 - the incoming signal to be sent to the table/array.
+;
+#X text 81 121 The [tabsend~] object writes an audio signal continuously
+to an array.;
+#X text 11 23 write one block of a signal continuously to an array
+;
+#X text 168 543 - the name of an array to write to.;
+#X text 80 543 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 108 570 pddp/pddplink all_about_arrays.pd;
+#X obj 83 258 tabsend~ \$0-array;
+#X connect 12 0 18 0;
+#X connect 17 0 27 0;
+#X connect 18 0 17 0;
diff --git a/doc/pddp/tabwrite-help.pd b/doc/pddp/tabwrite-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7424f1a474c8f6b537889c3e489070e1ba1c60c0
--- /dev/null
+++ b/doc/pddp/tabwrite-help.pd
@@ -0,0 +1,134 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabwrite 3 12 0
+18 -204280 -1 0;
+#X obj 0 300 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 244 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Dave Sabine \, April 29 \, 2003 .
+Jonathan Wilkes revised the patch to conform to the PDDP template for
+Pd version 0.42.;
+#X text 12 5 KEYWORDS control array;
+#X text 12 45 DESCRIPTION write numbers to a table;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 456 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 481 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 77 311 428 300 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [tabwrite] Related Objects;
+#X text 20 38 Native Pd Objects;
+#X obj 23 63 tabread~;
+#X obj 97 63 tabread4;
+#X obj 247 63 tabwrite~;
+#X obj 23 89 tabsend~;
+#X obj 99 89 tabreceive~;
+#X obj 199 89 tabplay~;
+#X obj 276 89 table;
+#X text 22 146 [array];
+#X obj 23 116 soundfiler;
+#X text 85 146 and fft objects.;
+#X obj 119 116 tabread4~;
+#X obj 210 116 getsize;
+#X obj 281 116 setsize;
+#X obj 172 63 tabread;
+#X text 20 170 Externals and other object libraries;
+#X obj 20 190 pddp/helplink zexy/tabdump;
+#X obj 20 210 pddp/helplink linear_path;
+#X text 101 210 <-- which library is this in?;
+#X text 101 230 <-- which library is this in?;
+#X obj 20 230 pddp/helplink score;
+#X text 101 250 <-- which library is this in?;
+#X obj 20 250 pddp/helplink tabenv;
+#X obj 20 270 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 309 cnv 17 3 115 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 308 float;
+#X text 98 348 list;
+#X obj 78 435 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 434 float;
+#X obj 472 3 tabwrite;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/tabwrite -text
+pdpedia: tabwrite;
+#X floatatom 174 251 0 0 99 1 index - -;
+#X obj 51 276 tabwrite davids_array;
+#X floatatom 51 84 0 0 0 0 value - -;
+#X text 168 308 - a float at the left inlet will become the new value
+of the chosen index (whichever index is currently selected at the right
+inlet).;
+#X text 168 348 - the left inlet also accepts pairs of floats (longer
+lists will be truncated). A number pair represents "value" and "index"
+- corresponding to "left" and "right" inlets.;
+#X text 98 388 set;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-davids_array 100 float 1;
+#A 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0;
+#X coords 0 1 99 -1 100 70 1;
+#X restore 278 94 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-another_array 100 float 1;
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 -0.67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0;
+#X coords 0 1 99 -1 100 70 1;
+#X restore 408 94 graph;
+#X text 11 23 write numbers to a table;
+#X text 167 434 - selects index in which to write the new value.;
+#X text 98 460 (none);
+#X obj 98 543 pddp/pddplink all_about_arrays.pd -text all_about_arrays
+;
+#X text 276 181 Click below to view the table:;
+#X text 168 498 - the name of the array or table to which [tabwrite]
+will write data. The array must exist in an open Pd patch/canvas or
+an error message will appear in the console.;
+#X text 168 388 - the "set" message \, followed by the name of an array
+\, permits you to switch between arrays (e.g. \, "set another_array")
+;
+#X text 80 498 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 90 117 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 90 137 f \$0;
+#X obj 95 186 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 95 206 f \$0;
+#X obj 84 47 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1 -1
+;
+#X obj 84 67 f \$0;
+#X msg 84 89 set \$1-davids_array;
+#X obj 278 202 table \$0-tabwrite_table;
+#X msg 90 159 set \$1-another_array;
+#X msg 95 228 set \$1-tabwrite_table;
+#X obj 96 558 pddp/pddplink ../2.control.examples/15.arrays.pd;
+#X obj 95 573 pddp/pddplink ../2.control.examples/16.more.arrays.pd
+;
+#X connect 15 0 16 1;
+#X connect 17 0 16 0;
+#X connect 32 0 33 0;
+#X connect 33 0 40 0;
+#X connect 34 0 35 0;
+#X connect 35 0 41 0;
+#X connect 36 0 37 0;
+#X connect 37 0 38 0;
+#X connect 38 0 16 0;
+#X connect 40 0 16 0;
+#X connect 41 0 16 0;
diff --git a/doc/pddp/tabwrite~-help.pd b/doc/pddp/tabwrite~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fd1909db82b0f8b823c277b2b9427f2f6aa600f7
--- /dev/null
+++ b/doc/pddp/tabwrite~-help.pd
@@ -0,0 +1,112 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tabwrite~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 324 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 245 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd version 0.40. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal array;
+#X text 12 45 DESCRIPTION write a signal in an array;
+#X text 12 65 INLET_0 bang signal start stop set;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 475 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 502 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 77 301 428 313 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 20 38 Native Pd Objects;
+#X obj 23 63 tabread~;
+#X obj 97 63 tabread4;
+#X obj 23 89 tabsend~;
+#X obj 99 89 tabreceive~;
+#X obj 199 89 tabplay~;
+#X obj 276 89 table;
+#X text 22 146 [array];
+#X obj 23 116 soundfiler;
+#X text 85 146 and fft objects.;
+#X obj 119 116 tabread4~;
+#X obj 210 116 getsize;
+#X obj 281 116 setsize;
+#X obj 172 63 tabread;
+#X text 8 2 [tabwrite~] Related Objects;
+#X obj 247 63 tabwrite;
+#X text 20 180 Externals and other object libraries;
+#X obj 20 200 pddp/helplink zexy/tabdump;
+#X obj 20 220 pddp/helplink linear_path;
+#X text 101 220 <-- which library is this in?;
+#X text 101 240 <-- which library is this in?;
+#X obj 20 240 pddp/helplink score;
+#X text 101 260 <-- which library is this in?;
+#X obj 20 260 pddp/helplink tabenv;
+#X obj 20 280 pddp/helplink arraysize;
+#X restore 102 597 pd Related_objects;
+#X obj 78 333 cnv 17 3 135 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 466 3 tabwrite~;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/tabwrite~
+-text pdpedia: tabwrite~;
+#X text 11 23 write a signal in an array;
+#X msg 95 194 bang;
+#X msg 111 239 stop;
+#X obj 78 170 phasor~ 200;
+#X text 98 332 bang;
+#X text 98 351 start;
+#X text 98 390 stop;
+#X text 98 410 set;
+#X text 98 479 (none);
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-array 1000 float 0;
+#X coords 0 1 999 -1 160 100 1 0 0;
+#X restore 329 183 graph;
+#X msg 98 216 start 500;
+#X text 168 521 - the name of the array or table to which [tabwrite~]
+will write data. The array or table must exist in an open Pd patch/canvas
+or an error message will appear in the console.;
+#X text 98 451 signal;
+#X text 75 55 [tabwrite~] records an audio signal sequentially into
+an array. Sending it "bang" writes from beginning to end of the array.
+To avoid writing all the way to the end \, you can send a "stop message
+at an appropriate later time. The "start" message allows skipping a
+number of samples at the nbeginning. (Starting and stopping occur on
+block boundaries \, typically multiples of 64 samples \, in the input
+signal.);
+#X text 80 521 1) symbol atom;
+#X text 168 351 - the "start" message will start recording at the specified
+element (e.g. \, "start 500" will start recording at the 500th element).
+;
+#X text 168 332 - start recording.;
+#X text 168 390 - stop recording.;
+#X text 168 410 - the "set" message \, followed by the name of an array
+\, permits you to switch between arrays (e.g. \, "set another_array").
+;
+#X text 166 452 - the signal to be written to the array.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 455 51 pddp/dsp;
+#X obj 98 570 pddp/pddplink all_about_arrays.pd;
+#X obj 171 219 bng 15 250 50 0 empty empty empty 17 7 0 10 -4034 -1
+-1;
+#X obj 171 239 f \$0;
+#X obj 78 291 tabwrite~ \$0-array;
+#X obj 329 293 table \$0-array2;
+#X msg 171 261 set \$1-array2;
+#X connect 12 0 36 0;
+#X connect 13 0 36 0;
+#X connect 14 0 36 0;
+#X connect 21 0 36 0;
+#X connect 34 0 35 0;
+#X connect 35 0 38 0;
+#X connect 38 0 36 0;
diff --git a/doc/pddp/tan-help.pd b/doc/pddp/tan-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0b47b264d32f0e4659962e0fc3ac4a99bee1046d
--- /dev/null
+++ b/doc/pddp/tan-help.pd
@@ -0,0 +1,93 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header tan 3 12 0 18 -204280
+-1 0;
+#X obj 0 437 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 54 243 494 360 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control trigonometry;
+#X text 12 45 DESCRIPTION tangent function;
+#X text 12 65 INLET_0 float;
+#X text 12 85 OUTLET_0 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 536 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 564 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 540 (none);
+#N canvas 82 476 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 76 43 atan;
+#X obj 109 43 atan2;
+#X obj 149 43 exp;
+#X obj 177 43 log;
+#X obj 204 43 abs;
+#X obj 232 43 sqrt;
+#X obj 267 43 pow;
+#X obj 57 76 cos~;
+#X obj 89 76 osc~;
+#X obj 23 76 expr;
+#X obj 23 43 sin;
+#X obj 49 43 cos;
+#X text 8 2 [tan] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 446 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 445 float;
+#X text 98 465 list;
+#X text 98 507 float;
+#X obj 78 508 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X floatatom 396 201 0 0 0 0 - - -;
+#X floatatom 303 202 0 0 0 0 - - -;
+#X obj 210 167 sin;
+#X floatatom 87 122 0 0 0 0 - - -;
+#X floatatom 210 201 0 0 0 0 - - -;
+#X obj 87 162 * 6.28319;
+#X obj 87 142 / 360;
+#X obj 303 168 cos;
+#X obj 396 167 tan;
+#X text 150 162 2 x Pi;
+#X floatatom 87 182 0 0 0 0 - - -;
+#X text 150 182 Radian;
+#X obj 87 202 s radians;
+#X obj 210 141 r radians;
+#X text 84 239 Trigonometry functions take input in Radians. To find
+a radian \, simply divide a number by 360 (to make it a fraction of
+a circle) and multiply it by 2(Pi) where Pi is equal to approximately
+3.14159265.;
+#X text 83 326 [tan] will produce a number which represents the tangent
+of an angle.;
+#X text 83 300 [sin] and [cos] will return numbers between -1 and 1:
+the sine and cosine of a number repectively.;
+#X obj 494 3 tan;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/tan -text
+pdpedia: tan;
+#X text 11 23 tangent function;
+#X text 148 465 - a list will be truncated \, and the first element
+will be used as input.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 16 0 18 0;
+#X connect 17 0 20 0;
+#X connect 19 0 24 0;
+#X connect 20 0 19 0;
+#X connect 21 0 15 0;
+#X connect 22 0 14 0;
+#X connect 24 0 26 0;
+#X connect 27 0 16 0;
+#X connect 27 0 21 0;
+#X connect 27 0 22 0;
diff --git a/doc/pddp/templates/+pager.pd b/doc/pddp/templates/+pager.pd
new file mode 100644
index 0000000000000000000000000000000000000000..93583d9415ef96c24226edced885283a5ad2526d
--- /dev/null
+++ b/doc/pddp/templates/+pager.pd
@@ -0,0 +1,141 @@
+#N canvas 680 22 442 95 10;
+#N canvas 48 162 589 578 guts 0;
+#X obj 251 124 mapping/tolist;
+#X obj 150 289 list;
+#X obj 251 175 list-abs/list-len;
+#X obj 190 19 loadbang;
+#X obj 156 400 makefilename pd-%s;
+#X obj 60 10 bng 50 450 50 0 empty empty --> 12 25 1 24 -141952 -1
+-1;
+#X obj 10 10 bng 50 450 50 0 empty empty <-- 10 25 1 24 -87656 -1 -1
+;
+#X text 70 65 next;
+#X text 4 65 previous;
+#X obj 15 132 trigger bang float;
+#X text 94 99 up;
+#X obj 150 260 trigger bang float bang bang float;
+#X obj 324 286 list;
+#X obj 324 393 pack symbol symbol;
+#X msg 324 423 \; pd open \$2 \$1;
+#X obj 453 393 send \$0-filename;
+#X msg 453 372 label \$1;
+#X msg 64 98 0;
+#X msg 16 97 1;
+#X obj 151 236 cyclone/counter;
+#X obj 220 300 float 2;
+#X obj 220 323 select 0;
+#X msg 156 424 \; \$1 menuclose 1;
+#X obj 157 356 list-abs/list-idx;
+#X obj 324 306 list-abs/list-idx;
+#X obj 190 42 trigger bang bang bang;
+#X msg 336 497 label \$1;
+#X obj 336 517 send \$0-folder_name;
+#X msg 18 503 label \$1;
+#X obj 18 523 send \$0-current_page;
+#X obj 18 457 pack float float;
+#X obj 18 483 zexy/makesymbol (%s/%s);
+#X obj 63 242 float;
+#X obj 324 332 hcs/split_path;
+#X obj 157 378 hcs/split_path;
+#X obj 271 458 hcs/split_path;
+#N canvas 760 129 484 296 generate 0;
+#X obj 70 70 ggee/getdir;
+#X obj 70 167 hcs/folder_list;
+#X obj 68 209 select +pager.pd;
+#X obj 70 101 trigger symbol symbol;
+#X obj 247 143 makefilename %s/+pager.pd;
+#X text 167 209 (filter out this file to prevent endless loops);
+#N canvas 121 53 458 308 glob 0;
+#X obj 198 6 inlet;
+#X obj 167 265 outlet;
+#X obj 82 212 makefilename %s/*.pd;
+#X obj 213 212 makefilename %s/[0-9]*.pd;
+#X obj 25 48 zexy/operating_system;
+#X obj 25 72 select windows;
+#X obj 25 25 loadbang;
+#X obj 106 94 bang;
+#X obj 117 160 cyclone/gate 2;
+#X msg 25 116 1;
+#X msg 106 116 2;
+#X text 255 230 glob;
+#X text 116 229 windows;
+#X connect 0 0 8 1;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 9 0;
+#X connect 5 1 7 0;
+#X connect 6 0 4 0;
+#X connect 7 0 10 0;
+#X connect 8 0 2 0;
+#X connect 8 1 3 0;
+#X connect 9 0 8 0;
+#X connect 10 0 8 0;
+#X restore 70 143 pd glob or windows pattern;
+#X obj 161 254 outlet;
+#X obj 70 17 inlet;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 2 1 7 0;
+#X connect 3 0 6 0;
+#X connect 3 1 4 0;
+#X connect 4 0 2 1;
+#X connect 6 0 1 0;
+#X connect 8 0 0 0;
+#X restore 319 72 pd generate file list;
+#X msg 172 139 min 0;
+#X obj 18 434 + 1;
+#X connect 0 0 1 1;
+#X connect 0 0 2 0;
+#X connect 0 0 12 1;
+#X connect 1 0 23 0;
+#X connect 2 0 19 4;
+#X connect 2 0 32 0;
+#X connect 3 0 25 0;
+#X connect 4 0 22 0;
+#X connect 5 0 17 0;
+#X connect 6 0 18 0;
+#X connect 9 0 19 0;
+#X connect 9 1 19 1;
+#X connect 11 0 1 0;
+#X connect 11 1 20 1;
+#X connect 11 2 20 0;
+#X connect 11 3 12 0;
+#X connect 11 4 24 1;
+#X connect 12 0 24 0;
+#X connect 13 0 14 0;
+#X connect 16 0 15 0;
+#X connect 17 0 9 0;
+#X connect 18 0 9 0;
+#X connect 19 0 11 0;
+#X connect 19 0 38 0;
+#X connect 20 0 21 0;
+#X connect 21 1 23 1;
+#X connect 23 0 34 0;
+#X connect 24 0 33 0;
+#X connect 25 0 37 0;
+#X connect 25 1 0 1;
+#X connect 25 2 36 0;
+#X connect 26 0 27 0;
+#X connect 28 0 29 0;
+#X connect 30 0 31 0;
+#X connect 31 0 28 0;
+#X connect 32 0 30 1;
+#X connect 33 0 13 0;
+#X connect 33 0 35 0;
+#X connect 33 1 16 0;
+#X connect 33 1 13 1;
+#X connect 34 1 4 0;
+#X connect 35 1 26 0;
+#X connect 36 0 0 0;
+#X connect 37 0 19 0;
+#X connect 38 0 30 0;
+#X coords 0 -1 1 1 100 50 1 10 10;
+#X restore 6 8 pd guts;
+#X obj 167 8 cnv 15 240 25 empty \$0-folder_name intro 5 12 1 14 -262131
+-28 0;
+#X obj 107 33 cnv 15 300 25 empty \$0-filename 02.basic_elements.pd
+5 12 1 14 -262131 -28 0;
+#X obj 107 8 cnv 15 60 25 empty \$0-current_page (48/48) 5 12 1 14
+-262131 -28 0;
+#X coords 0 0 1 1 85 60 0;
diff --git a/doc/pddp/templates/colour-guide.pd b/doc/pddp/templates/colour-guide.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e4004328a9fc7bae808eba52e3273eca89ce1b9d
--- /dev/null
+++ b/doc/pddp/templates/colour-guide.pd
@@ -0,0 +1,14 @@
+#N canvas 304 179 349 252 10;
+#X text 11 8 PDDP Colour Guide:;
+#X obj 14 39 cnv 20 20 20 empty empty Reference-Patches 30 9 0 13 -200249
+-1 0;
+#X obj 14 69 cnv 20 20 20 empty empty About-Patches 30 9 0 13 -261104
+-1 0;
+#X obj 14 99 cnv 20 20 20 empty empty Tutorial-Patches 30 9 0 13 -261148
+-1 0;
+#X obj 14 148 cnv 20 20 20 empty empty Start-Process 30 9 0 13 -118429
+-1 0;
+#X obj 14 178 cnv 20 20 20 empty empty Stop-Process 30 9 0 13 -239389
+-1 0;
+#X obj 14 208 cnv 20 20 20 empty empty Highlight-Object/patch? 30 9
+0 13 -262126 -1 0;
diff --git a/doc/pddp/templates/example-about.pd b/doc/pddp/templates/example-about.pd
new file mode 100644
index 0000000000000000000000000000000000000000..498887262b9bfea0964f4b8a505439cf17c76629
--- /dev/null
+++ b/doc/pddp/templates/example-about.pd
@@ -0,0 +1,144 @@
+#N canvas 232 93 772 532 10;
+#X text 330 82 The [send] and [receive] objects are useful for linking
+objects and subroutines together in a single canvas or throughout multiple
+patches. Understanding these objects will help 'clean up' your patches
+and allow you to communicate messages between various modules that
+you build or between objects where patch cords are not possible.;
+#X text 328 167 In the [send] and [receive] help files \, you will
+see message sent within a single patch - from a [send] object to a
+[receive] object in the same patch. But the functionality of these
+objects goes far beyond the scope of a single patch.;
+#X obj 20 292 r one_send;
+#X obj 23 224 hsl 67 15 0 127 0 0 empty empty empty -2 -6 0 8 -228989
+-1 -1 0 0;
+#X obj 97 242 s one_send;
+#X obj 178 224 hsl 67 15 0 127 0 0 empty empty empty -2 -6 0 8 -228989
+-1 -1 0 0;
+#X obj 23 313 hsl 67 15 0 127 0 0 empty empty empty -2 -6 0 8 -228989
+-1 -1 0 1;
+#X obj 97 292 r one_send;
+#X obj 178 313 hsl 67 15 0 127 0 0 empty empty empty -2 -6 0 8 -228989
+-1 -1 0 1;
+#X text 327 300 A [send] object is a little like a radio station...it
+broadcasts information throughout Pd \, for all the [receives] to hear!
+A [receive] object is a little like your own AM/FM tuner...it will
+receive messages from all the [send] objects that it is 'tuned' to.
+Hence \, naming your [send] and [receive] objects becomes very important.
+A [receive] object named "dave" (as in [receive dave]) will pick up
+all messages from [send dave] \, regardless of which patch it is in.
+In this manner \, you can get messages across multiple patches \, or
+into abstractions or subpatches -- without patch cords.;
+#X obj 20 243 s one_send;
+#X obj 175 242 send one_send;
+#X obj 175 292 receive one_send;
+#X msg 38 437 \; one_send \$1;
+#X obj 57 414 hsl 67 15 0 127 0 0 empty empty empty -2 -6 0 8 -228989
+-1 -1 0 1;
+#X msg 151 433 \; aSymbol symbol \$1;
+#X msg 151 412 symbol down_below;
+#X floatatom 14 414 5 0 0 0 - - -;
+#X floatatom 98 314 5 0 0 0 - - -;
+#X floatatom 97 224 5 0 0 0 - - -;
+#X text 8 381 (look above at previous examples):;
+#X text 10 368 You can make message boxes into sends;
+#X text 13 272 received by [receive]s of the same name.;
+#X text 8 203 Multiple [send]s with the same name;
+#X obj 8 6 cnv 15 750 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 318 47 cnv 15 440 15 empty empty Getting_Your_Message_Across
+3 7 0 13 -261104 -1 0;
+#X text 656 18 LINK:Glossary;
+#X text 656 6 LINK:Contents;
+#X text 12 8 DESCRIPTION: All about communicating without connections
+;
+#X obj 318 277 cnv 15 440 15 empty empty Broadcasting_With_Sends_And_Receives
+3 7 0 13 -261104 -1 0;
+#X obj 8 496 cnv 15 750 20 empty empty empty 20 12 0 14 -261104 -66577
+0;
+#X text 13 499 PDDP Project 2005;
+#X obj 660 499 bng 15 250 50 0 pddpNextPage \$0- < 4 8 0 12 -262144
+-1 -1;
+#X obj 678 499 bng 15 250 50 0 pddpNextPage \$0- > 4 8 0 12 -262144
+-1 -1;
+#X text 561 499 Previous/Next;
+#N canvas 0 22 466 316 META 0;
+#X text 12 5 CATEGORY: about;
+#X text 12 15 KEYWORDS: send receive patch cord wireless connection
+canvas;
+#X restore 160 499 pd META;
+#N canvas 696 168 488 368 PAGES 0;
+#X text 19 9 Put your pages here: (They must be named [pd PAGE1] [pd
+PAGE2]... (PAGE0 is the main patch).;
+#X text 9 109 Don't forget to set the number of pages \, including
+the main page.;
+#N canvas 25 25 775 545 PAGE2 0;
+#X obj 8 6 cnv 15 750 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 318 47 cnv 15 440 15 empty empty Getting_Your_Message_Across
+3 7 0 13 -261104 -1 0;
+#X text 656 18 LINK:Glossary;
+#X text 656 6 LINK:Contents;
+#X text 12 8 DESCRIPTION: All about communicating without connections
+;
+#X obj 318 277 cnv 15 440 15 empty empty Broadcasting_With_Sends_And_Receives
+3 7 0 13 -261104 -1 0;
+#X obj 8 496 cnv 15 750 20 empty empty empty 20 12 0 14 -261104 -66577
+0;
+#X text 13 499 PDDP Project 2005;
+#X obj 660 499 bng 15 250 50 0 pddpNextPage \$0- < 4 8 0 12 -262144
+-1 -1;
+#X obj 678 499 bng 15 250 50 0 pddpNextPage \$0- > 4 8 0 12 -262144
+-1 -1;
+#X text 561 499 Previous/Next;
+#X obj 701 499 cnv 15 15 15 empty empty 1 0 8 0 12 -261104 -1 0;
+#X obj 717 499 cnv 15 15 15 empty empty of 0 8 0 12 -261104 -1 0;
+#X obj 733 499 cnv 15 25 15 empty pddpNumPages 3 4 8 0 12 -261104 -1
+0;
+#X obj 305 36 cnv 5 5 460 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 327 300;
+#X text 330 82;
+#X text 328 167;
+#X restore 14 54 pd PAGE2;
+#X text 24 179 BUG: these page-turns need to be local! Add logic for
+back button;
+#X obj 13 146 pddp_page 2;
+#X coords 0 0 1.01598e-05 1.58148e-05 96 15 0;
+#X restore 217 499 pd PAGES;
+#X obj 701 499 cnv 15 15 15 empty empty 1 0 8 0 12 -261104 -1 0;
+#X obj 717 499 cnv 15 15 15 empty empty of 0 8 0 12 -261104 -1 0;
+#X obj 733 499 cnv 15 25 15 empty pddpNumPages 2 4 8 0 12 -261104 -1
+0;
+#X obj 176 55 cnv 10 86 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X floatatom 176 76 5 0 0 0 - - -;
+#X obj 176 55 receive aNum;
+#X obj 44 155 cnv 10 87 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 45 155 send aSymbol;
+#X msg 45 107 symbol hello;
+#X msg 54 130 symbol world!;
+#X obj 179 129 cnv 10 105 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X symbolatom 178 157 0 0 0 0 - - -;
+#X obj 178 129 receive aSymbol;
+#X obj 61 71 cnv 10 65 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X floatatom 62 54 5 0 0 0 - - -;
+#X obj 62 71 send aNum;
+#X obj 305 36 cnv 5 5 460 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X connect 2 0 6 0;
+#X connect 3 0 10 0;
+#X connect 5 0 11 0;
+#X connect 7 0 18 0;
+#X connect 12 0 8 0;
+#X connect 14 0 13 0;
+#X connect 16 0 15 0;
+#X connect 17 0 13 0;
+#X connect 19 0 4 0;
+#X connect 42 0 41 0;
+#X connect 45 0 44 0;
+#X connect 46 0 44 0;
+#X connect 49 0 48 0;
+#X connect 51 0 52 0;
diff --git a/doc/pddp/templates/example-help.pd b/doc/pddp/templates/example-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5adc710d153728a6cfa752b54310c21259745a36
--- /dev/null
+++ b/doc/pddp/templates/example-help.pd
@@ -0,0 +1,163 @@
+#N canvas 50 40 568 623 10;
+#X obj 5 574 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 5 -12 cnv 15 550 40 empty \$0-pddp.cnv.header float 3 12 0 18
+-204280 -1 0;
+#X obj 4 244 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 15 12 0 13
+-228856 -1 0;
+#N canvas 407 510 490 340 META 0;
+#X text 12 25 KEYWORDS control number float store;
+#X text 12 45 LICENSE GPL;
+#X text 12 65 TEMPLATE template-help.pd v0.1;
+#X text 12 85 PLATFORM windows macosx gnulinux;
+#X text 12 105 DATATYPE float list;
+#X text 12 5 GENRE storage;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 RELEASE_DATE 2007-08-24;
+#X text 12 185 RELEASE_VERSION 0.40-test05;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X restore 505 576 pd META;
+#X obj 83 156 cnv 10 50 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 346 163 cnv 10 23 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X floatatom 384 135 5 0 0 0 - - -;
+#X floatatom 345 187 5 0 0 0 - - -;
+#X obj 364 135 bng 15 250 50 0 empty empty empty 20 7 0 12 -4034 -1
+-1;
+#X floatatom 85 181 5 0 0 0 - - -;
+#X msg 85 73 bang;
+#X msg 325 79 7 3 4;
+#X obj 345 162 f;
+#X obj 85 156 float 7;
+#X obj 4 394 cnv 3 550 3 empty empty outlet 15 12 0 13 -228856 -1 0
+;
+#X obj 4 444 cnv 3 550 3 empty empty argument 15 12 0 13 -228856 -1
+0;
+#X obj 4 494 cnv 3 550 3 empty empty more_info 15 12 0 13 -228856 -1
+0;
+#X obj 73 350 cnv 17 3 40 empty empty 1 5 9 0 16 -228856 -162280 0
+;
+#X obj 73 264 cnv 17 3 80 empty empty 0 5 9 0 16 -228856 -162280 0
+;
+#X text 103 263 BANG - output the currently stored value;
+#X text 103 350 FLOAT - a float received on the right inlet is stored
+;
+#X obj 465 9 pddp/pddplink http://wiki.puredata.info/en/float -text
+pdpedia: float;
+#X text 103 283 FLOAT - outputs the incoming number and stores it;
+#X text 103 303 LIST - truncates to the first element \, outputs that
+element \, and stores it;
+#X obj 467 -9 float;
+#X obj 527 -9 f;
+#X text 506 -8 or;
+#X msg 105 126 12;
+#X msg 138 126 -0.02;
+#X msg 53 102 555;
+#X msg 344 102 list one 2 3;
+#X text 428 101 does not work!;
+#X text 104 412 FLOAT - outputs the stored value as a float message
+;
+#X obj 105 532 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.1
+-text Pd manual 2.3.1: anatomy of a message;
+#N canvas 0 22 458 308 float/list 0;
+#X msg 75 133 float 1 2 3;
+#X text 34 22 FLOAT CONVERSION;
+#X msg 95 187 list 1 2 3;
+#X text 92 164 A list with multiple elements remains a list.;
+#X text 43 59 A float with one element remains a float.;
+#X text 72 106 A float with multiple elements remains a float but is
+cut to one element.;
+#X text 99 218 A list with one float element is converted to a float.
+;
+#X obj 58 308 bng 15 250 50 0 empty empty bang 0 20 1 9 -262144 -1
+-1;
+#X obj 105 308 bng 15 250 50 0 empty empty float 0 21 1 9 -262144 -1
+-1;
+#X obj 152 308 bng 15 250 50 0 empty empty symbol 0 21 1 9 -262144
+-1 -1;
+#X obj 200 308 bng 15 250 50 0 empty empty list 0 21 1 9 -262144 -1
+-1;
+#X obj 248 308 bng 15 250 50 0 empty empty UNDEFINED 0 21 1 9 -262144
+-1 -1;
+#X obj 57 286 route bang float symbol list;
+#X obj 92 349 print FLOAT;
+#X msg 50 81 float 3;
+#X msg 106 239 list 2;
+#X obj 188 349 print LIST;
+#X connect 0 0 12 0;
+#X connect 2 0 12 0;
+#X connect 12 0 7 0;
+#X connect 12 1 8 0;
+#X connect 12 1 13 0;
+#X connect 12 2 9 0;
+#X connect 12 3 10 0;
+#X connect 12 3 16 0;
+#X connect 12 4 11 0;
+#X connect 14 0 12 0;
+#X connect 15 0 12 0;
+#X restore 391 541 pd float/list conversion;
+#N canvas 57 22 649 630 More_Info 0;
+#X text 43 24 All numbers in Pd are kept in 32-bit floating point and
+can represent real numbers between -8 \, 388608 and 8.388.608.00;
+#X text 11 78 WHAT IS A FLOATING POINT NUMBER?;
+#X text 41 267 The following are examples of floating point numbers:
+;
+#X text 61 293 3;
+#X text 62 334 -111.5;
+#X text 61 313 0.5;
+#X text 40 387 3e-05 : This example is a computer shorthand for scientific
+notation. It means 3*10-5 (or 10 to the negative 5th power multiplied
+by 3).;
+#X text 41 108 According to Webopedia.com \, "computers are integer
+machines and are capable of representing real numbers only by using
+complex codes." Hence \, real numbers must be 'approximated' by computers
+using the "floating point standard". In such a number \, the decimal
+point can "float" meaning that there is no fixed number of digits preceding
+or following the decimal. A floating point number is therefore a computer's
+approximation of a real number.;
+#X text 43 453 Interesting side-note: In the early 1990's \, the Intel
+80486 was shipped with a math coprocessor to help accelerate the process
+of computing floating point numbers (which previously required a considerable
+amount of CPU power.) Math coprocessors have since found there way
+into nearly every graphics card and CPU available today.;
+#X text 62 358 10000 to 1e-16;
+#X restore 390 517 pd More_Info;
+#X obj 105 549 pddp/pddplink http://en.wikipedia.org/wiki/Floating_point
+;
+#X text 120 72 outputs argument;
+#X text 91 101 overrides argument;
+#X text 103 462 [float] accepts a single number as a creation argument
+which sets value that is stored.;
+#N canvas 309 454 609 478 guts 0;
+#X obj 117 95 textfile;
+#X msg 116 24 symbol template-HCS.pd;
+#X msg 116 54 read \$1 \, rewind \, bang;
+#X obj 117 141 trigger bang anything;
+#X obj 58 117 bang;
+#X obj 240 162 route #X;
+#X obj 240 183 route text;
+#X obj 240 250 route DESCRIPTION;
+#X obj 239 276 print;
+#X obj 140 277 print TEXT;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 7 0 8 0;
+#X restore 454 576 pd guts;
+#X text 16 8 description: stores a number;
+#X text 106 516 all_about_data-types.pd;
+#X connect 6 0 12 1;
+#X connect 8 0 12 0;
+#X connect 10 0 13 0;
+#X connect 11 0 12 0;
+#X connect 12 0 7 0;
+#X connect 13 0 9 0;
+#X connect 27 0 13 1;
+#X connect 28 0 13 1;
+#X connect 29 0 13 0;
+#X connect 30 0 12 0;
diff --git a/doc/pddp/templates/template-about.pd b/doc/pddp/templates/template-about.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9b7b81725b3187ceb96c03896d459d5f3bd5f940
--- /dev/null
+++ b/doc/pddp/templates/template-about.pd
@@ -0,0 +1,63 @@
+#N canvas 167 112 772 532 10;
+#X obj 8 6 cnv 15 750 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 318 47 cnv 15 440 15 empty empty Getting_Your_Message_Across
+3 7 0 13 -261104 -1 0;
+#X text 656 18 LINK:Glossary;
+#X text 656 6 LINK:Contents;
+#X obj 318 277 cnv 15 440 15 empty empty Broadcasting_With_Sends_And_Receives
+3 7 0 13 -261104 -1 0;
+#X obj 8 496 cnv 15 750 20 empty empty empty 20 12 0 14 -261104 -66577
+0;
+#X text 13 499 PDDP Project 2005;
+#X obj 660 499 bng 15 250 50 0 pddpNextPage \$0- < 4 8 0 12 -262144
+-1 -1;
+#X obj 678 499 bng 15 250 50 0 pddpNextPage \$0- > 4 8 0 12 -262144
+-1 -1;
+#X text 561 499 Previous/Next;
+#N canvas 0 22 470 320 META 0;
+#X text 12 5 CATEGORY: about;
+#X text 12 15 KEYWORDS:;
+#X restore 160 499 pd META;
+#N canvas 696 168 488 368 PAGES 0;
+#X text 19 9 Put your pages here: (They must be named [pd PAGE1] [pd
+PAGE2]... (PAGE0 is the main patch).;
+#X text 9 109 Don't forget to set the number of pages \, including
+the main page.;
+#N canvas 168 111 769 538 PAGE2 0;
+#X obj 8 6 cnv 15 750 30 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 318 47 cnv 15 440 15 empty empty Getting_Your_Message_Across
+3 7 0 13 -261104 -1 0;
+#X text 656 18 LINK:Glossary;
+#X text 656 6 LINK:Contents;
+#X obj 318 277 cnv 15 440 15 empty empty Broadcasting_With_Sends_And_Receives
+3 7 0 13 -261104 -1 0;
+#X obj 8 496 cnv 15 750 20 empty empty empty 20 12 0 14 -261104 -66577
+0;
+#X text 13 499 PDDP Project 2005;
+#X obj 660 499 bng 15 250 50 0 pddpNextPage \$0- < 4 8 0 12 -262144
+-1 -1;
+#X obj 678 499 bng 15 250 50 0 pddpNextPage \$0- > 4 8 0 12 -262144
+-1 -1;
+#X text 561 499 Previous/Next;
+#X obj 701 499 cnv 15 15 15 empty empty 1 0 8 0 12 -261104 -1 0;
+#X obj 717 499 cnv 15 15 15 empty empty of 0 8 0 12 -261104 -1 0;
+#X obj 733 499 cnv 15 25 15 empty pddpNumPages 2 4 8 0 12 -261104 -1
+0;
+#X obj 305 36 cnv 5 5 460 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 12 8 DESCRIPTION:;
+#X restore 14 54 pd PAGE2;
+#X text 24 179 BUG: these page-turns need to be local! Add logic for
+back button;
+#X obj 12 143 pddp_page 2;
+#X coords 0 0 1.01598e-05 1.58148e-05 96 15 0;
+#X restore 217 499 pd PAGES;
+#X obj 701 499 cnv 15 15 15 empty empty 1 0 8 0 12 -261104 -1 0;
+#X obj 717 499 cnv 15 15 15 empty empty of 0 8 0 12 -261104 -1 0;
+#X obj 733 499 cnv 15 25 15 empty pddpNumPages 2 4 8 0 12 -261104 -1
+0;
+#X obj 305 36 cnv 5 5 460 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 12 8 DESCRIPTION:;
diff --git a/doc/pddp/templates/template-help.pd b/doc/pddp/templates/template-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9473c8d69127e0defe0019664697a1b8c7ffcbcc
--- /dev/null
+++ b/doc/pddp/templates/template-help.pd
@@ -0,0 +1,67 @@
+#N canvas 41 22 564 619 10;
+#X obj 4 569 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 4 -17 cnv 15 550 40 empty \$0-pddp.cnv.header myobjectclass
+3 12 0 18 -204280 -1 0;
+#X obj 3 239 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 15 12 0 13
+-228856 -1 0;
+#N canvas 779 22 494 344 META 0;
+#X text 12 25 KEYWORDS control number float store;
+#X text 12 45 LICENSE GPL;
+#X text 12 65 TEMPLATE template-help.pd v0.1;
+#X text 12 85 PLATFORM windows macosx gnulinux;
+#X text 12 105 DATATYPE float list;
+#X text 12 5 GENRE storage;
+#X text 12 125 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 165 RELEASE_DATE 2007-08-24;
+#X text 12 185 RELEASE_VERSION 0.40-test05;
+#X restore 504 571 pd META;
+#X obj 3 389 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 15 12 0
+13 -228856 -1 0;
+#X obj 3 439 cnv 3 550 3 empty \$0-pddp.cnv.argument argument 15 12
+0 13 -228856 -1 0;
+#X obj 3 489 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 15
+12 0 13 -228856 -1 0;
+#X obj 72 345 cnv 17 3 40 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 72 259 cnv 17 3 80 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 102 457 [float] accepts a single number as a creation argument
+which sets value that is stored.;
+#N canvas 309 454 609 478 guts 0;
+#X obj 117 95 textfile;
+#X msg 116 24 symbol template-HCS.pd;
+#X msg 116 54 read \$1 \, rewind \, bang;
+#X obj 117 141 trigger bang anything;
+#X obj 58 117 bang;
+#X obj 240 162 route #X;
+#X obj 240 183 route text;
+#X obj 240 250 route DESCRIPTION;
+#X obj 239 276 print;
+#X obj 140 277 print TEXT;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 7 0 8 0;
+#X restore 453 571 pd guts;
+#X obj 470 -14 myobjectclass;
+#X obj 419 6 pddp/pddplink http://wiki.puredata.info/en/myobjectclass
+-text pdpedia: myobjectclass;
+#X text 203 118 (put working examples here);
+#X text 15 6 description: short desription of what this objectclass
+does;
+#X text 102 258 BANG - bang means do it!;
+#X text 102 278 FLOAT - what does a number do?;
+#X text 102 298 LIST - what does a list do?;
+#X text 102 345 FLOAT - how about a float on the cold inlet?;
+#X text 102 318 POINTER - does this object handle pointers;
+#X text 103 407 FLOAT - what kind of output comes out of here?;
+#X text 58 524 (put links to other help patches \, about patches \,
+links to the HTML manual \, and/or external links);
+#X text 146 363 (if you want longer lines \, you can use [cyclone/comment])
+;
diff --git a/doc/pddp/templates/template-help_elements.pd b/doc/pddp/templates/template-help_elements.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b78be401d92011bfbafc544367c4bd33fed653bf
--- /dev/null
+++ b/doc/pddp/templates/template-help_elements.pd
@@ -0,0 +1,60 @@
+#N canvas 299 251 572 554 10;
+#X obj 4 202 cnv 3 550 3 empty empty inlets 15 12 0 13 -228856 -1 0
+;
+#X obj 4 234 cnv 3 550 3 empty empty outlet 15 12 0 13 -228856 -1 0
+;
+#X obj 4 294 cnv 3 550 3 empty empty argument 15 12 0 13 -228856 -1
+0;
+#X obj 4 354 cnv 3 550 3 empty empty more_info 15 12 0 13 -228856 -1
+0;
+#X obj 420 384 cnv 17 3 40 empty empty 1 5 9 0 16 -228856 -162280 0
+;
+#X obj 369 384 cnv 17 3 80 empty empty 0 5 9 0 16 -228856 -162280 0
+;
+#X obj 447 384 cnv 17 3 25 empty empty 2 5 9 0 16 -228856 -162280 0
+;
+#X text 101 10 This is a collection of graphic elements for the PDDP
+template-help.pd. These are meant to be copied-n-pasted into new help
+patches.;
+#X obj 4 174 cnv 3 550 3 empty empty inlet 15 12 0 13 -228856 -1 0
+;
+#X obj 4 264 cnv 3 550 3 empty empty outlets 15 12 0 13 -228856 -1
+0;
+#X obj 396 384 cnv 17 3 60 empty empty 0 5 9 0 16 -228856 -162280 0
+;
+#X obj 339 384 cnv 17 3 100 empty empty 0 5 9 0 16 -228856 -162280
+0;
+#X obj 4 324 cnv 3 550 3 empty empty arguments 15 12 0 13 -228856 -1
+0;
+#X obj 140 88 cnv 10 23 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 140 114 cnv 10 27 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X text 22 66 highlights by character width:;
+#X text 57 88 1-3 chars;
+#X text 67 114 4 chars;
+#X obj 140 139 cnv 10 34 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 280 89 cnv 10 38 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 280 114 cnv 10 46 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 280 139 cnv 10 52 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 430 88 cnv 10 57 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 430 114 cnv 10 63 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X obj 430 139 cnv 10 69 16 empty empty empty 20 12 0 14 -262126 -66577
+0;
+#X text 67 139 5 chars;
+#X text 207 88 6 chars;
+#X text 207 114 7 chars;
+#X text 207 139 8 chars;
+#X text 358 87 9 chars;
+#X text 357 115 10 chars;
+#X text 357 139 11 chars;
+#X obj 309 384 cnv 17 3 120 empty empty 0 5 9 0 16 -228856 -162280
+0;
+#X obj 279 384 cnv 17 3 140 empty empty 0 5 9 0 16 -228856 -162280
+0;
diff --git a/doc/pddp/test-loop~.pd b/doc/pddp/test-loop~.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9966483dfc683c1e504c9f1e9fec01aee09dc50e
--- /dev/null
+++ b/doc/pddp/test-loop~.pd
@@ -0,0 +1,58 @@
+#N canvas 33 0 680 609 12;
+#X floatatom 52 262 0 0 0 0 - - -;
+#X obj 261 346 print~;
+#X msg 47 373 bang;
+#X msg 274 313 bang;
+#X obj 52 306 loop~;
+#X floatatom 102 245 0 0 0 0 - - -;
+#N canvas 0 0 450 300 graph1 0;
+#X array array1 44100 float 0;
+#X coords 0 10 44100 0 200 150 1;
+#X restore 65 17 graph;
+#X msg 43 204 \; array1 resize 44100;
+#X obj 25 401 tabwrite~ array1;
+#X msg 208 371 bang;
+#X obj 176 402 tabwrite~ array1;
+#X msg 194 261 bang;
+#X obj 204 347 print~;
+#X msg 217 314 bang;
+#N canvas 0 0 450 300 graph1 0;
+#X array array2 150000 float 0;
+#X coords 0 1 150000 -1 200 150 1;
+#X restore 332 398 graph;
+#X msg 326 274 \; array2 resize 150000;
+#X obj 103 529 tabread4~ array2;
+#X obj 64 481 *~;
+#X obj 107 581 dac~;
+#X obj 105 552 hip~ 5;
+#X obj 123 482 samphold~;
+#X obj 102 506 +~;
+#X floatatom 106 430 0 0 0 0 - - -;
+#X obj 108 453 *~ 1000;
+#X obj 312 215 soundfiler;
+#X msg 330 170 read ../doc/sound/bell.aiff array2;
+#X msg 330 193 read ../doc/sound/vocal.aiff array2;
+#X connect 0 0 4 0;
+#X connect 2 0 8 0;
+#X connect 3 0 1 0;
+#X connect 4 0 12 0;
+#X connect 4 0 17 0;
+#X connect 4 0 8 0;
+#X connect 4 0 20 1;
+#X connect 4 1 10 0;
+#X connect 4 1 1 0;
+#X connect 4 1 17 1;
+#X connect 5 0 4 1;
+#X connect 9 0 10 0;
+#X connect 11 0 4 0;
+#X connect 13 0 12 0;
+#X connect 16 0 19 0;
+#X connect 17 0 21 0;
+#X connect 19 0 18 0;
+#X connect 19 0 18 1;
+#X connect 20 0 21 1;
+#X connect 21 0 16 0;
+#X connect 22 0 23 0;
+#X connect 23 0 20 0;
+#X connect 25 0 24 0;
+#X connect 26 0 24 0;
diff --git a/doc/pddp/text-help.pd b/doc/pddp/text-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..97dcf67776ce58a24e2bf83e38caab948e747955
--- /dev/null
+++ b/doc/pddp/text-help.pd
@@ -0,0 +1,75 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header text 3 12 0 18 -204280
+-1 0;
+#X obj 0 458 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 42 282 494 344 META 0;
+#X text 12 65 LIBRARY internal;
+#X text 12 105 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 85 AUTHOR Miller Puckette;
+#X text 12 145 HELP_PATCH_AUTHORS Updated for Pd version 0.26. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS control;
+#X text 12 125 RELEASE_DATE 1997;
+#X text 12 45 DESCRIPTION box with text for an object or comment;
+#X restore 500 597 pd META;
+#X obj 0 486 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 514 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 542 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 518 (none);
+#N canvas 98 495 428 119 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 comment Related Objects;
+#X obj 21 28 pddp/pddplink all_about_externals.pd -text _________;
+#X obj 21 28 pddp/pddplink all_about_externals.pd -text Externals;
+#X obj 21 48 pddp/helplink cyclone/comment;
+#X obj 21 68 pddp/helplink pddp/pddplink;
+#X obj 21 88 pddp/helplink pddp/helplink;
+#X restore 102 597 pd Related_objects;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/comment -text
+pdpedia: comment;
+#X text 104 387 Phone number with hyphens: 555-555-5555;
+#X text 104 407 Same phone number without hyphens: 5.55556e+09;
+#X text 98 462 (none);
+#X text 98 491 (none);
+#N canvas 100 383 428 181 Some_Comments_On_Comments 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 20 29 semicolons in comments cause the text \; following them
+to \; start \; on a \; new \; line;
+#X text 19 110 Try adding a period at the end of this sentence \, which
+ends with the number 1;
+#X text 19 140 If you close this subwindow \, then open it again \,
+the period you added will be gone.;
+#X text 8 2 comment Commentary: Additional Comments About Comments
+;
+#X restore 102 551 pd Some_Comments_On_Comments;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X obj 99 571 pddp/pddplink all_about_ascii_art.pd;
+#X text 377 2 To create \, click <Control-5>;
+#X text 11 23 box with text for an object or comment;
+#X text 85 144 Comments don't actually "do" anything \, but you can
+use them to annotate your patch \, explain how something works \, add
+a copyright notice \, or anything else.;
+#X text 85 74 All text in Pure Data is just a series of symbol and/or
+float atoms. You create Pd objects by typing text into an object box
+\, but you can also write text as a comment for your patch (like this
+one).;
+#X text 85 224 To create a comment \, use the "Put" menu or click <Control-5>.
+;
+#X text 55 267 ***;
+#X text 85 347 Otherwise your phone number will interpreted as a float
+atom and you will lose some rather important precision!;
+#X text 85 267 Remember: text inside a comment is just a series of
+atoms \, and will be formatted accordingly. For example: if you want
+to jot down a large value like a phone number in pd \, use hyphens
+or multiple dots so that pd will interpret it as a symbol atom.;
diff --git a/doc/pddp/textfile-help.pd b/doc/pddp/textfile-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..286a53f0333dc5d288a7b349a592eb71ac76c5a6
--- /dev/null
+++ b/doc/pddp/textfile-help.pd
@@ -0,0 +1,113 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header textfile 3 12 0
+18 -204280 -1 0;
+#X obj 0 429 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 243 494 344 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 45 DESCRIPTION read and write text files;
+#X text 12 65 INLET_0 bang rewind clear add add2 set read write print
+;
+#X text 12 85 OUTLET_0 list;
+#X text 12 105 OUTLET_1 bang;
+#X text 12 5 KEYWORDS control storage filesystem list_op anything_op
+;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 465 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 531 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 558 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 535 (none);
+#N canvas 73 482 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [textfile] Related Objects;
+#X obj 22 43 qlist;
+#X restore 102 597 pd Related_objects;
+#X obj 78 438 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 474 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 498 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 11 23 read and write text files;
+#X obj 435 20 pddp/pddplink http://wiki.puredata.info/en/textfile -text
+pdpedia: textfile;
+#X obj 465 3 textfile;
+#X obj 85 347 print done;
+#X text 98 497 bang;
+#X text 167 497 - this outlet gets a bang when you hit the end of the
+sequence.;
+#X text 98 473 list;
+#X text 168 473 - this outlet gets the lines in sequence.;
+#X text 168 437 (see the example above for messages accepted by [textfile])
+;
+#X msg 101 76 rewind;
+#X text 214 207 read a file;
+#X msg 101 208 read textfile.txt;
+#X text 152 75 go to beginning;
+#X msg 101 98 bang;
+#X text 152 97 output one line as a list;
+#X msg 101 230 write /tmp/textfile.txt;
+#X msg 101 252 write /tmp/textfile2.txt cr;
+#X msg 101 274 read textfile.txt cr;
+#X msg 101 120 clear;
+#X text 152 119 empty the object;
+#X text 208 142 add a message;
+#X msg 101 186 set 2 4 6 8;
+#X text 208 186 clear and then add one message;
+#X msg 101 142 add cis boom bah;
+#X msg 101 164 add2 bang;
+#X text 208 164 add an unterminated message;
+#X msg 101 296 print;
+#X text 145 296 debugging printout;
+#X text 248 229 write a file;
+#X obj 40 322 textfile;
+#X text 272 251 write a file \, terminating lines with a;
+#X text 273 266 carriage return (omitting semicolons).;
+#X text 272 281 You can read files this way \, too \, in;
+#X text 273 296 which case carriage returns are mapped;
+#N canvas 94 361 428 199 About_textfile 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [textfile] Related Objects;
+#X text 21 38 The textfile object reads and writes text files to and
+from memory. You can read a file and output sequential lines as messages
+\, or collect lines and write them out. You can use this object to
+generate "models" for Gem \, for instance.;
+#X text 20 91 To record textual messages and save them to a file \,
+first send "clear" to empty the sequence and "add" to add messages
+(terminated with semicolons.) The message \, "add2" adds a list of
+atoms without finishing with a semicolon in case you want to make variable-length
+messages.;
+#X text 20 155 You can also use this object simply for storing heterogeneous
+sequences of messages.;
+#X restore 101 567 pd About_textfile;
+#X obj 40 369 print message;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 274 311 to semicolons.;
+#X connect 21 0 41 0;
+#X connect 23 0 41 0;
+#X connect 25 0 41 0;
+#X connect 27 0 41 0;
+#X connect 28 0 41 0;
+#X connect 29 0 41 0;
+#X connect 30 0 41 0;
+#X connect 33 0 41 0;
+#X connect 35 0 41 0;
+#X connect 36 0 41 0;
+#X connect 38 0 41 0;
+#X connect 41 0 47 0;
+#X connect 41 1 15 0;
diff --git a/doc/pddp/threshold~-help.pd b/doc/pddp/threshold~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a165bd2d655f4979041edc1d7c35fe02d5db1c79
--- /dev/null
+++ b/doc/pddp/threshold~-help.pd
@@ -0,0 +1,94 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header threshold~ 3 12
+0 18 -204280 -1 0;
+#X obj 0 295 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 365 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Updated for Pd version 0.32. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION trigger from audio signal;
+#X text 12 65 INLET_0 set signal;
+#X text 12 85 INLET_1 float;
+#X text 12 105 OUTLET_0 bang;
+#X text 12 125 OUTLET_1 bang;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 396 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 468 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 569 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 101 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [threshold~] Related Objects;
+#X obj 22 43 env~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 304 cnv 17 3 40 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 405 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 352 cnv 17 3 35 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 351 float;
+#X obj 453 3 threshold~;
+#X obj 425 20 pddp/pddplink http://wiki.puredata.info/en/threshold~
+-text pdpedia: threshold~;
+#X text 11 23 trigger from audio signal;
+#X obj 140 168 sig~;
+#X obj 140 226 threshold~ 10 100 0 100;
+#X floatatom 140 141 5 0 0 0 - - -;
+#X obj 140 254 print trigger;
+#X obj 275 254 print rest;
+#X msg 296 196 1;
+#X msg 327 196 0;
+#X msg 222 146 set 0 2000 1 2000;
+#X msg 222 169 set 10 100 0 100;
+#X text 98 303 signal;
+#X text 98 324 set;
+#X text 167 351 - a zero to the right inlet sets the object's state
+to "high." A nonzero value sets it to "low." There is no debounce period
+after this.;
+#X text 98 404 bang;
+#X obj 78 435 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 434 bang;
+#X text 168 404 - a bang is sent to the left outlet when the incoming
+signal is greater than or equal to the "trigger" value.;
+#X text 168 434 - a bang is sent to the right outlet when the incoming
+signal is less than or equal to the "rest" value.;
+#X text 168 324 - the "set" message can be used to change the parameters
+(i.e. \, the values set by the creation arguments).;
+#X text 168 303 - the incoming signal.;
+#X text 80 486 1) float;
+#X text 79 506 2) float;
+#X text 168 486 - (optional) trigger threshold.;
+#X text 167 526 - (optional) rest threshold.;
+#X text 167 506 - (optional) trigger debounce time (ms).;
+#X text 167 546 - (optional) rest debounce time (ms).;
+#X text 88 56 [threshold~] monitors its input signal and outputs bangs
+when the signal equals or exceeds a specified "trigger" value \, and
+also when the signal equals or recedes below a "rest" value. You can
+specify debounce times in milliseconds \, for the [threshold~] to wait
+after the two event types before triggering again.;
+#X text 79 526 3) float;
+#X text 79 546 4) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 15 0 16 0;
+#X connect 16 0 18 0;
+#X connect 16 1 19 0;
+#X connect 17 0 15 0;
+#X connect 20 0 16 1;
+#X connect 21 0 16 1;
+#X connect 22 0 16 0;
+#X connect 23 0 16 0;
diff --git a/doc/pddp/throw~-help.pd b/doc/pddp/throw~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d9b1ddf2620030f55abd143c3b9faca0c65664c1
--- /dev/null
+++ b/doc/pddp/throw~-help.pd
@@ -0,0 +1,88 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header throw~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 387 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 243 494 344 META 0;
+#X text 12 85 LIBRARY internal;
+#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 105 AUTHOR Miller Puckette;
+#X text 12 165 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal nonlocal;
+#X text 12 45 DESCRIPTION summing signal bus and nonlocal connection
+;
+#X text 12 65 INLET_0 signal;
+#X text 12 145 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 477 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 504 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 93 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [throw~] Related Objects;
+#X obj 22 43 catch~;
+#X obj 72 43 send~;
+#X obj 119 43 receive~;
+#X obj 181 43 inlet~;
+#X obj 231 43 outlet~;
+#X restore 102 597 pd Related_objects;
+#X obj 78 396 cnv 17 3 70 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 451 list;
+#X obj 474 3 throw~;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/throw~ -text
+pdpedia: throw~;
+#X obj 73 220 throw~ signal1;
+#X floatatom 224 268 0 0 0 0 - - -;
+#X obj 73 243 sig~ 50;
+#X obj 224 243 snapshot~;
+#X obj 73 268 throw~ signal1;
+#X obj 73 149 sig~ 25;
+#X obj 224 168 catch~ signal1;
+#X obj 267 193 loadbang;
+#X obj 267 218 metro 200;
+#X floatatom 358 268 0 0 0 0 - - -;
+#X obj 358 243 snapshot~;
+#X obj 358 168 catch~ signal2;
+#X msg 89 172 set signal2;
+#X msg 90 196 set signal1;
+#X text 98 395 signal;
+#X text 168 451 - a list will be truncated to the first item.;
+#X text 98 423 float;
+#X text 98 481 (none);
+#X text 168 395 - an incoming signal will be sent to a [catch~] object
+that shares the same name as this [throw~] object.;
+#X text 11 23 summing signal bus and non-local connection;
+#X text 168 423 - a float may be sent if there are no signal connections
+made to the inlet of [throw~].;
+#X text 67 99 Any number of [throw~] objects can add into one [catch~]
+object (but two [catch~] objects cannot share the same name.);
+#X text 71 295 You can redirect [throw~] via a "set" message.;
+#X text 79 521 1) symbol atom;
+#X text 168 521 - [throw~] takes one argument-- a symbol atom-- as
+its name. Other [throw~] objects may have the same name \, but there
+may only be one [catch~] that shares this name.;
+#X text 151 47 For help on [catch~] \, see:;
+#X obj 151 62 pddp/pddplink catch~-help.pd -text catch~-help;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 14 0 16 0;
+#X connect 15 0 13 0;
+#X connect 17 0 12 0;
+#X connect 18 0 15 0;
+#X connect 19 0 20 0;
+#X connect 20 0 15 0;
+#X connect 20 0 22 0;
+#X connect 22 0 21 0;
+#X connect 23 0 22 0;
+#X connect 24 0 12 0;
+#X connect 25 0 12 0;
diff --git a/doc/pddp/time_measurements.pd b/doc/pddp/time_measurements.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a3b3ed59f70f415b65febc6e64a5780520ae8d93
--- /dev/null
+++ b/doc/pddp/time_measurements.pd
@@ -0,0 +1,75 @@
+#N canvas 247 23 555 619 10;
+#X obj 63 160 inlet;
+#X obj 280 90 inlet;
+#X obj 472 107 inlet;
+#X obj 177 493 outlet;
+#X obj 239 492 outlet;
+#X obj 307 492 outlet;
+#X obj 63 190 t b b;
+#X obj 7 250 timer;
+#X obj 51 250 cputime;
+#X obj 107 250 realtime;
+#X obj 205 79 osc~ 800;
+#X msg 280 146 1;
+#X msg 280 173 \; pd dsp \$1 \;;
+#X msg 250 146 0;
+#X obj 280 116 t b b;
+#X obj 177 250 timer;
+#X obj 239 251 cputime;
+#X obj 307 250 realtime;
+#X obj 204 103 env~;
+#X obj 204 157 > 0;
+#X obj 204 182 sel 1;
+#X obj 403 176 delay 3000;
+#X obj 472 139 t b b;
+#X obj 376 250 timer;
+#X obj 433 250 cputime;
+#X obj 499 249 realtime;
+#X obj 0 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 Time Measurement Abstraction;
+#X text 19 38 This abstraction is used in the help patches for [timer]
+\, [realtime] \, and [cputime] to compare the output of each of these
+objects.;
+#X obj 204 130 spigot;
+#X connect 0 0 6 0;
+#X connect 1 0 14 0;
+#X connect 2 0 22 0;
+#X connect 6 0 7 1;
+#X connect 6 0 8 1;
+#X connect 6 0 9 1;
+#X connect 6 1 7 0;
+#X connect 6 1 8 0;
+#X connect 6 1 9 0;
+#X connect 7 0 3 0;
+#X connect 8 0 4 0;
+#X connect 9 0 5 0;
+#X connect 10 0 18 0;
+#X connect 11 0 12 0;
+#X connect 11 0 29 1;
+#X connect 13 0 12 0;
+#X connect 13 0 29 1;
+#X connect 14 0 11 0;
+#X connect 14 1 17 0;
+#X connect 14 1 16 0;
+#X connect 14 1 15 0;
+#X connect 15 0 3 0;
+#X connect 16 0 4 0;
+#X connect 17 0 5 0;
+#X connect 18 0 29 0;
+#X connect 19 0 20 0;
+#X connect 20 0 15 1;
+#X connect 20 0 16 1;
+#X connect 20 0 17 1;
+#X connect 20 0 13 0;
+#X connect 21 0 23 1;
+#X connect 21 0 24 1;
+#X connect 21 0 25 1;
+#X connect 22 0 21 0;
+#X connect 22 1 25 0;
+#X connect 22 1 24 0;
+#X connect 22 1 23 0;
+#X connect 23 0 3 0;
+#X connect 24 0 4 0;
+#X connect 25 0 5 0;
+#X connect 29 0 19 0;
diff --git a/doc/pddp/timer-help.pd b/doc/pddp/timer-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d4110eff75831665473e090a52e552e601c3c9ef
--- /dev/null
+++ b/doc/pddp/timer-help.pd
@@ -0,0 +1,161 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header timer 3 12 0 18
+-204280 -1 0;
+#X obj 0 394 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 245 494 368 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 5 KEYWORDS control time;
+#X text 12 45 DESCRIPTION measure logical time;
+#X text 12 65 INLET_0 bang;
+#X text 12 85 INLET_1 bang;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 470 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 512 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 539 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 516 (none);
+#N canvas 73 345 428 246 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [timer] Related Objects;
+#X obj 135 35 metro;
+#X obj 72 35 realtime;
+#X obj 24 35 timer;
+#X obj 183 35 delay;
+#X text 22 162 The best places to find information about Pd's libraries
+is:;
+#X text 22 182 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 24 197 or;
+#X text 21 212 iem.kug.ac.at/pdb/;
+#X text 22 120 This object is only offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 22 70 Externals;
+#X obj 24 95 pddp/helplink iemlib/t3_timer;
+#X restore 102 597 pd Related_objects;
+#X obj 78 403 cnv 17 3 25 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 478 float;
+#X obj 78 479 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 434 cnv 17 3 25 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 168 478 - upon sending the "flush" message to the left inlet
+\, [bag] will output each value in the order it was received.;
+#X obj 482 3 timer;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/timer -text
+pdpedia: timer;
+#X msg 104 180 bang;
+#X msg 79 158 bang;
+#X obj 79 202 timer;
+#X floatatom 79 224 0 0 0 0 - - -;
+#X text 151 226 Output is in milliseconds;
+#X text 114 158 Click here to start or reset;
+#X text 74 111 The [timer] object measures elapsed logical time. Logical
+time moves forward as if all computation were instantaneous and as
+if all [delay] and [metro] objects were exact.;
+#X text 142 181 Click here to get elapsed logical time. Click again...and
+again...to see periodic measurements from the start or reset time.
+;
+#X text 77 250 NOTE: Unlike most other objects in Pd \, the right inlet
+of [timer] is the hot one (i.e. \, a bang to it triggers the output).
+;
+#X text 98 402 bang;
+#X text 168 402 - an initial "bang" to the left inlet starts the timer.
+Subsequent "bangs" reset the timer.;
+#X text 98 433 bang;
+#X text 167 433 - a bang to the right inlet causes the elapsed time
+to be output (in milliseconds).;
+#N canvas 94 193 428 419 Time_Objects 0;
+#X text 21 38 In a fantasy world \, computers could exist somehow beyond
+the restrictions of time and digital computation could be performed
+in ZERO time. However \, that is not the case. Instead \, every process
+within Pd and within your operating system requires at least a few
+nanoseconds of your CPU's time.;
+#X text 22 123 The [timer] object is like a clock that is not constrained
+to the regular laws of physics and the universal space-time continuum.
+It reports "time" measurements as only Pd can see them!;
+#X text 23 182 The [cputime] object is like a clock that measures how
+much time your CPU actually required to carry out your request. Keep
+in mind however that your CPU is busy doing many things simoultaneously
+\, so even though a process might take 5 minutes to complete \, your
+CPU does not pay full attention to that process for the entire 5 minutes.
+Instead \, it simply begins the process \, then refers back to that
+process from time to time until the it is complete. In other cases
+\, your CPU might require a full 5 minutes while Pd might report that
+merely a few milliseconds have passed. This type of discrepancy depends
+heavily on your computer's hardware and the type of processing it is
+performing.;
+#X text 24 341 The [realtime] object is as much like your own wrist
+watch as Pd can possibly manage. It measures time according to your
+operating system's internal clock.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [cputime] Why the Discrepencies Between Clocks?;
+#X restore 102 548 pd Time_Objects;
+#N canvas 73 72 428 495 Time_Measurements 0;
+#X text 21 38 [timer] works like essentially like a stop-watch. Once
+it starts \, you can continue to "poll" the [timer] to view the elapsed
+time.;
+#X text 20 135 As stated above \, [timer] measures "logical" time.
+This value may be slightly different that CPU time or "real" time.
+PD offers two objects which measure CPU time and "real" time. See the
+reference documents for those objects for more information.;
+#X obj 25 304 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 25 448 0 0 0 0 - - -;
+#X floatatom 110 448 0 0 0 0 - - -;
+#X floatatom 172 448 0 0 0 0 - - -;
+#X text 21 211 In the example below \, I've created an abstraction
+which will force each of Pd's stop-watches \, [timer] [cputime] and
+[realtime] to measure various processes and report the elapsed time.
+Click on each [bng] to begin the process and wait for the results.
+Notice the discrepancies in the results.;
+#X text 23 464 Logical Time;
+#X text 170 464 Real Time;
+#X text 109 464 CPU Time;
+#X obj 40 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 45 298 1 Measures elapsed time between two "bangs" from a [trigger]
+object.;
+#X text 60 332 2 Measures the amount of time Pd requires to turn on
+DSP and start an oscillator.;
+#X obj 84 372 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 21 85 The odd aspect about comparing [timer] to a stop-watch
+is that a stop-watch can be stopped! [timer] can only be started or
+reset. It cannot be stopped.;
+#X text 105 364 3 Measures the amount of time Pd requires count to
+three...please wait for approximately 3 seconds.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [timer] Related Objects;
+#X obj 25 408 time_measurements;
+#X connect 2 0 18 0;
+#X connect 10 0 18 1;
+#X connect 13 0 18 2;
+#X connect 18 0 3 0;
+#X connect 18 1 4 0;
+#X connect 18 2 5 0;
+#X restore 102 572 pd Time_Measurements;
+#X text 11 23 measure logical time;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 16 0 18 1;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
diff --git a/doc/pddp/toggle-help.pd b/doc/pddp/toggle-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e19d34ce8cb51a530e37b8f36804ba3298ae543b
--- /dev/null
+++ b/doc/pddp/toggle-help.pd
@@ -0,0 +1,396 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header toggle 3 12 0 18
+-204280 -1 0;
+#X obj 0 308 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 244 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 165 AUTHOR Thomas Musil;
+#X text 12 185 WEBSITE;
+#X text 12 225 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 25 KEYWORDS control GUI nonlocal;
+#X text 12 65 DESCRIPTION gui-toggle between zero and a non-zero value
+;
+#X text 12 5 ALIAS tgl;
+#X text 12 85 INLET_0 float bang size nonzero init send receive label
+label_pos label_font color pos delta;
+#X text 12 125 OUTLET_0 float;
+#X text 12 205 RELEASE_DATE 2002;
+#X restore 500 597 pd META;
+#X obj 0 422 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 459 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 544 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 317 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 54 490 428 100 Related_objects 0;
+#X obj 20 53 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 18 29 All iem-gui objects:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [tgl] Related Objects;
+#X restore 100 597 pd Related_objects;
+#X obj 78 431 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 346 167 and receive names. Right-;
+#X text 346 182 click and choose;
+#X text 345 198 "Properties" to set them \,;
+#X text 120 255 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move
+a selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 346 212 or change them with messages;
+#X text 346 226 (see the subpatch below);
+#X text 98 361 see the following subpatch for messages that change
+the gui-properties of [bng]:;
+#N canvas 60 6 428 618 Changing_GUI_Properties 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 212 37 no init;
+#X text 162 166 label;
+#X msg 212 56 init 0;
+#X msg 232 109 init 1;
+#X msg 162 186 label blabla;
+#X msg 172 236 label myToggle;
+#X text 303 37 change send name;
+#X text 22 166 change receive name;
+#X obj 212 133 s tgl_rcv;
+#X obj 304 133 s tgl_rcv;
+#X obj 22 262 s tgl_rcv;
+#X obj 162 262 s tgl_rcv;
+#X msg 304 58 send foo6_snd;
+#X msg 314 108 send tgl_snd;
+#X msg 42 213 receive tgl_rcv;
+#X obj 42 237 s tgl2_rcv;
+#X msg 22 188 receive tgl2_rcv;
+#N canvas 317 326 161 227 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 73 \; \$1-size 15 \; \$1-nonzero 1 \; \$1-lbl-x 17 \; \$1-lbl-y
+7 \; \$1-font-size 10 \; \$1-xpos 336 \; \$1-ypos 500;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 311 580 pd init;
+#X msg 22 109 size \$1;
+#X text 21 37 dimensions;
+#X obj 22 58 nbx 3 14 8 200 0 0 empty \$0-size empty 0 -8 0 12 -262144
+-1 -1 15 256;
+#X text 69 55 size;
+#X obj 22 133 s tgl_rcv;
+#X obj 112 58 nbx 3 14 -1e+37 1e+37 0 0 empty \$0-nonzero empty 0 -8
+0 12 -262144 -1 -1 1 256;
+#X obj 112 133 s tgl_rcv;
+#X text 111 37 nonzero-value;
+#X msg 112 109 nonzero \$1;
+#X text 224 75 init value;
+#X text 226 89 on loadbang;
+#X text 306 165 label position;
+#X text 20 302 font properties;
+#X msg 308 237 label_pos \$1 \$2;
+#X msg 22 374 label_font \$1 \$2;
+#X text 71 326 1.font(0-2);
+#X text 71 347 2.height;
+#X text 357 188 1.x-offset;
+#X text 357 209 2.y-offset;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-lbl-x empty
+0 -8 0 12 -262144 -1 -1 17 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-lbl-y empty
+0 -8 0 12 -262144 -1 -1 7 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 308 187 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 22 324 pd flash-time;
+#X text 162 302 preset-colors;
+#X text 301 302 RGB-colors;
+#X msg 162 409 color \$1 \$2 \$3;
+#N canvas 364 205 306 317 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 33 237 pack 0 0 0;
+#X obj 120 197 t b a;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 0 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-front empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 144 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 2;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X coords 0 -1 1 1 48 62 2 100 100;
+#X restore 162 324 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 96 410 route 0 1 2;
+#X obj 96 497 pack 0 0 0;
+#X obj 115 456 t b a;
+#X obj 168 455 t b a;
+#X obj 104 124 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X text 120 137 2.front;
+#X text 120 153 3.label;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 10 2 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 1 11 1;
+#X connect 13 0 11 0;
+#X connect 13 1 11 2;
+#X connect 14 0 9 1;
+#X connect 18 0 5 0;
+#X connect 19 0 6 0;
+#X connect 20 0 7 0;
+#X coords 0 -1 1 1 102 74 2 100 100;
+#X restore 302 324 pd flash-time;
+#X text 211 326 1.bg;
+#X text 211 346 2.front;
+#X text 211 367 3.label;
+#X text 163 462 delta;
+#X text 21 462 position;
+#X msg 22 569 pos \$1 \$2;
+#X msg 164 569 delta \$1 \$2;
+#X obj 164 545 list;
+#X obj 164 484 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 70 483 1.x-position;
+#X text 70 505 2.y-position;
+#X text 243 483 1.x-delta;
+#X text 243 505 2.y-delta;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 336 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 500 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 22 484 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 193 484 pd flash-time;
+#X obj 311 467 cnv 15 102 102 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 312 468 cnv 15 100 100 empty empty empty 20 12 0 14 -261682
+-66577 0;
+#X obj 308 262 s tgl_rcv;
+#X obj 22 399 s tgl_rcv;
+#X obj 162 434 s tgl_rcv;
+#X obj 22 594 s tgl_rcv;
+#X obj 164 594 s tgl_rcv;
+#X obj 336 500 tgl 15 0 tgl_snd tgl_rcv myToggle 17 7 0 10 -262144
+-1 -1 0 1;
+#X obj 337 538 nbx 3 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X text 6 2 [tgl] Changing Properties through Messages;
+#X connect 3 0 9 0;
+#X connect 4 0 9 0;
+#X connect 5 0 12 0;
+#X connect 6 0 12 0;
+#X connect 13 0 10 0;
+#X connect 14 0 10 0;
+#X connect 15 0 16 0;
+#X connect 17 0 11 0;
+#X connect 19 0 23 0;
+#X connect 21 0 19 0;
+#X connect 24 0 27 0;
+#X connect 27 0 25 0;
+#X connect 32 0 62 0;
+#X connect 33 0 63 0;
+#X connect 38 0 32 0;
+#X connect 39 0 33 0;
+#X connect 42 0 64 0;
+#X connect 43 0 42 0;
+#X connect 44 0 42 0;
+#X connect 50 0 65 0;
+#X connect 51 0 66 0;
+#X connect 52 0 51 0;
+#X connect 53 0 52 0;
+#X connect 58 0 50 0;
+#X connect 59 0 52 1;
+#X connect 67 0 68 0;
+#X restore 170 394 pd Changing_GUI_Properties;
+#X text 168 463 - creating a [bng] without any arguments will set default
+values for all gui-properties. See the subpatch below to learn how
+to dynamically instantiate a [bng] object with custom properties:;
+#X obj 406 3 tgl 15 0 foo6_rcv empty empty 17 7 0 10 -262144 -1 -1
+0 1;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/toggle -text
+pdpedia: toggle;
+#X text 426 0 abbreviation: [tgl];
+#X obj 302 78 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 302 153 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144
+-1 -1;
+#X obj 302 103 s foo6_rcv;
+#X obj 302 127 r foo6_snd;
+#X obj 56 274 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 26 124 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X msg 29 65 33;
+#X obj 56 184 tgl 60 1 foo6_snd foo6_rcv big_toggle 66 27 2 13 -228992
+-4033 -34 1 1;
+#X msg 72 87 1;
+#X msg 79 109 0;
+#X floatatom 56 253 4 0 0 0 - - -;
+#X msg 63 65 -0.001;
+#X msg 183 123 set 1;
+#X msg 188 145 set 0;
+#X obj 20 159 tgl 15 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 95 253 tgl 15 0 empty empty empty 8 -8 0 10 -262144 -1 -1 1
+1;
+#X msg 175 101 set -0.23;
+#X obj 323 59 tgl 15 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 322 153 tgl 15 0 empty empty empty 8 -8 0 10 -262144 -1 -1 1
+1;
+#X msg 173 79 0 3 4.55;
+#X msg 165 57 0.22 0 -5.44;
+#X msg 323 79 set \$1;
+#X text 345 151 [tgl] has settable send;
+#N canvas 47 373 428 173 tgl_without_gui 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [tgl] Build a toggle without a gui;
+#X obj 58 87 == 0;
+#X floatatom 22 138 3 0 0 0 - - -;
+#X obj 22 43 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X text 96 86 toggle;
+#X obj 22 87 f 1;
+#X text 95 69 This works like;
+#X text 97 105 without the gui.;
+#X connect 2 0 6 1;
+#X connect 4 0 6 0;
+#X connect 6 0 2 0;
+#X connect 6 0 3 0;
+#X restore 100 552 pd tgl_without_gui;
+#X text 98 316 bang;
+#X text 168 316 - toggle between zero and the non-zero value.;
+#X text 98 331 float;
+#X text 98 346 list;
+#X text 168 346 - a list will be concatenated to the first item.;
+#X text 168 331 - output the value.;
+#X text 98 431 float;
+#N canvas 80 194 428 314 tgl_creation_arguments 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 7 2 [tgl] Creation Arguments and Dynamic Patching;
+#X text 19 38 "tgl" can be called with 14 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X text 21 127 It's unclear what the Unknown value is for- it is necessary
+to have it so you can specify the non-zero value.;
+#X text 22 164 Click the msg-box to dynamically create a tgl:;
+#X text 21 82 tgl creation arguments: Size Init sendName receiveName
+Label labelXOff labelYOff Font# fontSize bgColor foregroundColor LblColor
+initValue non-zeroValue;
+#X obj 23 231 s pd-tgl_creation_arguments;
+#X msg 23 186 obj 160 270 tgl 25 0 tgl-snd tgl-rcv Pleione 30 14 0
+20 5 18 13 0 1 \;;
+#X connect 7 0 6 0;
+#X restore 170 519 pd tgl_creation_arguments;
+#X text 11 23 gui-toggle between zero and a non-zero value;
+#X text 215 551 (c) musil@iem.kug.ac.at;
+#X text 257 564 IEM KUG;
+#X text 232 576 graz \, austria 2002;
+#X text 98 463 14;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 22 0 24 0;
+#X connect 25 0 23 0;
+#X connect 25 0 40 0;
+#X connect 27 0 29 0;
+#X connect 28 0 29 0;
+#X connect 29 0 32 0;
+#X connect 29 0 37 0;
+#X connect 30 0 29 0;
+#X connect 31 0 29 0;
+#X connect 32 0 26 0;
+#X connect 33 0 29 0;
+#X connect 34 0 29 0;
+#X connect 35 0 29 0;
+#X connect 36 0 29 0;
+#X connect 38 0 29 0;
+#X connect 39 0 43 0;
+#X connect 41 0 29 0;
+#X connect 42 0 29 0;
+#X connect 43 0 24 0;
diff --git a/doc/pddp/touchin-help.pd b/doc/pddp/touchin-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..62cf7f907faf9151bf2cda5b47a36933f3a84d6a
--- /dev/null
+++ b/doc/pddp/touchin-help.pd
@@ -0,0 +1,89 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header touchin 3 12 0 18
+-204280 -1 0;
+#X obj 0 431 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 48 220 494 375 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was created for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 45 DESCRIPTION needs a description;
+#X text 12 65 INLET_0 float;
+#X text 12 85 INLET_1 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 459 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 428 421 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 78 80 ctlin;
+#X obj 221 80 pgmin;
+#X obj 28 80 bendin;
+#X obj 83 107 touchin;
+#X obj 28 33 polytouchin;
+#X obj 122 80 midiin;
+#X obj 27 107 sysexin;
+#X obj 183 167 noteout;
+#X obj 80 167 ctlout;
+#X obj 28 167 bendout;
+#X obj 103 33 touchout;
+#X obj 161 33 polytouchout;
+#X obj 127 167 midiout;
+#X obj 235 167 pgmout;
+#X obj 28 221 makenote;
+#X text 25 198 MIDI note construction:;
+#X text 25 140 MIDI output:;
+#X text 25 57 MIDI input:;
+#X obj 188 221 stripnote;
+#X obj 172 80 notein;
+#X text 185 198 MIDI note deconstruction:;
+#X text 8 2 [touchin] Related Objects;
+#X text 26 270 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 25 349 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 26 251 Externals;
+#X obj 26 300 pddp/helplink maxlib/pitch;
+#X obj 26 315 pddp/helplink maxlib/score;
+#X obj 26 330 pddp/helplink maxlib/chord;
+#X obj 26 365 pddp/helplink cyclone/midiformat;
+#X obj 26 380 pddp/helplink cyclone/midiparse;
+#X obj 26 395 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 467 float;
+#X obj 78 468 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 435 (none);
+#X text 98 492 float;
+#X obj 78 493 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X text 80 545 1) float;
+#X text 11 23 needs a description;
+#X floatatom 275 218 0 0 0 0 - - -;
+#X floatatom 236 218 0 0 0 0 - - -;
+#X text 168 467 - MIDI channel.;
+#X text 168 492 - ???;
+#X text 168 545 - ???;
+#X obj 472 3 touchin;
+#X obj 443 20 pddp/pddplink http://wiki.puredata.info/en/touchin -text
+pdpedia: touchin;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 236 192 touchin;
+#X connect 25 0 18 0;
+#X connect 25 1 17 0;
diff --git a/doc/pddp/touchout-help.pd b/doc/pddp/touchout-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8632aeb74b2602d87d4f1b23502c15b263a432f7
--- /dev/null
+++ b/doc/pddp/touchout-help.pd
@@ -0,0 +1,91 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header touchout 3 12 0
+18 -204280 -1 0;
+#X obj 0 417 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 49 245 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was created for Pd
+version 0.35 by Michal Seta as part of a project called pddp proposed
+by Krzysztof Czaja \, managed and edited by Dave Sabine \, to build
+comprehensive documentation for Pd. Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control MIDI;
+#X text 12 65 INLET_0 float list;
+#X text 12 85 INLET_1 float;
+#X text 12 165 RELEASE_DATE 1997;
+#X text 12 45 DESCRIPTION needs a description;
+#X restore 500 597 pd META;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 90 178 428 421 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 78 80 ctlin;
+#X obj 221 80 pgmin;
+#X obj 28 80 bendin;
+#X obj 117 33 touchin;
+#X obj 175 33 polytouchin;
+#X obj 122 80 midiin;
+#X obj 27 107 sysexin;
+#X obj 183 167 noteout;
+#X obj 80 167 ctlout;
+#X obj 28 167 bendout;
+#X obj 283 167 touchout;
+#X obj 28 33 polytouchout;
+#X obj 127 167 midiout;
+#X obj 235 167 pgmout;
+#X obj 28 221 makenote;
+#X text 25 198 MIDI note construction:;
+#X text 25 140 MIDI output:;
+#X text 25 57 MIDI input:;
+#X obj 188 221 stripnote;
+#X obj 172 80 notein;
+#X text 185 198 MIDI note deconstruction:;
+#X text 8 2 [touchin] Related Objects;
+#X text 25 265 Additional useful objects for MIDI processing (Maxlib
+by Olaf Matthes);
+#X text 24 344 Also \, from cyclone (alpha) by Krzysztof Czaja:;
+#X text 25 246 Externals;
+#X obj 25 295 pddp/helplink maxlib/pitch;
+#X obj 25 310 pddp/helplink maxlib/score;
+#X obj 25 325 pddp/helplink maxlib/chord;
+#X obj 25 360 pddp/helplink cyclone/midiformat;
+#X obj 25 375 pddp/helplink cyclone/midiparse;
+#X obj 25 390 pddp/helplink cyclone/midiflush;
+#X restore 102 597 pd Related_objects;
+#X text 98 425 float;
+#X obj 78 426 cnv 17 3 35 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 503 (none);
+#X text 98 470 float;
+#X obj 78 471 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 364 572 pddp/pddplink all_about_midi_flags.pd -text all_about_midi_flags
+;
+#X text 98 572 for an explanation of MIDI usage in Pd see:;
+#X text 80 545 1) float;
+#X text 11 23 needs a description;
+#X text 168 425 - MIDI channel.;
+#X text 168 470 - ???;
+#X text 168 545 - ???;
+#X obj 236 192 touchout;
+#X floatatom 236 163 5 0 0 0 - - -;
+#X floatatom 281 163 5 0 0 0 - - -;
+#X obj 472 3 touchout;
+#X obj 439 20 pddp/pddplink http://wiki.puredata.info/en/touchout -text
+pdpedia: touchout;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 98 445 list;
+#X text 168 445 - a list is distributed to the two inlets.;
+#X connect 21 0 20 0;
+#X connect 22 0 20 1;
diff --git a/doc/pddp/trigger-help.pd b/doc/pddp/trigger-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d7aeab421401d809e0ce5669ab19982253f7a1af
--- /dev/null
+++ b/doc/pddp/trigger-help.pd
@@ -0,0 +1,380 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header trigger 3 12 0 18
+-204280 -1 0;
+#X obj 0 219 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 242 494 358 META 0;
+#X text 12 135 LIBRARY internal;
+#X text 12 175 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 155 AUTHOR Miller Puckette;
+#X text 12 215 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 26 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 65 DESCRIPTION sequence message in right-to-left order/
+convert data types;
+#X text 12 95 INLET_0 anything;
+#X text 12 115 OUTLET_N anything;
+#X text 12 5 ALIAS t;
+#X text 12 25 KEYWORDS control needs_work list_op bang_op;
+#X text 12 195 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 256 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 309 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 497 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 49 301 428 283 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [trigger] Related Objects;
+#X obj 103 43 route;
+#X obj 23 43 unpack;
+#X obj 69 43 pack;
+#X obj 144 43 delay;
+#X obj 186 43 pipe;
+#X obj 221 43 float;
+#X obj 261 43 int;
+#X obj 290 43 symbol;
+#X text 20 77 Externals;
+#X text 20 128 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 20 187 The best places to find information about Pd's libraries
+is:;
+#X text 21 208 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 21 223 or;
+#X text 21 238 iem.kug.ac.at/pdb/;
+#X obj 20 104 pddp/helplink unauthorized/exciter;
+#X restore 102 597 pd Related_objects;
+#X obj 78 228 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 265 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 447 3 trigger;
+#X obj 517 3 t;
+#X text 497 3 or;
+#X obj 445 20 pddp/pddplink http://wiki.puredata.info/en/trigger -text
+pdpedia: trigger;
+#X text 98 64 The [trigger] object outputs its input from right to
+left \, converting to the types indicated by its creation arguments.
+There is also a "pointer" argument type (see the [pointer] object.)
+;
+#X obj 339 518 pddp/pddplink all_about_lists_vs_anythings.pd -text
+all_about_lists_vs_anythings;
+#X text 98 227 anything;
+#X text 168 227 - the inlet to [trigger] takes any type of message.
+;
+#X text 98 264 variable;
+#X text 168 328 - for each creation argument \, a new outlet is created.
+If no arguments are supplied \, trigger defaults to two outlets that
+output bang messages.;
+#X text 98 371 The [trigger] object can be abbreviated as "t" and the
+creation arguments can be abbreviated as follows:;
+#X obj 214 413 trigger float bang symbol list pointer anything;
+#X text 315 432 is the same as;
+#X obj 318 452 t f b s l p a;
+#X text 97 408 "float" = f;
+#X text 97 420 "bang" = b;
+#X text 96 432 "symbol" = s;
+#X text 97 446 "list" = l;
+#X text 97 474 "anything" = a;
+#X text 97 460 "pointer" = p;
+#X floatatom 230 114 5 0 0 0 - - -;
+#X obj 230 160 +;
+#X floatatom 230 185 5 0 0 0 - - -;
+#X obj 230 136 t a a;
+#X text 11 23 sequence messages in right-to-left order/ convert data
+types;
+#X text 168 264 - upon receiving a message to its inlet \, [trigger]
+outputs messages specified by the creation arguments. (Like nearly
+all Pd objects \, messages are sent out from right to left.);
+#N canvas 73 80 428 469 trigger_oddities 0;
+#X obj 25 325 trigger anything bang float list pointer symbol;
+#X obj 25 347 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 87 347 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 144 347 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 210 347 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 248 347 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 316 347 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 216 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 273 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 114 413 route float;
+#X obj 114 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 177 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 304 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 373 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 28 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 85 435 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 28 413 route bang;
+#X obj 304 413 route symbol;
+#X obj 216 413 route list;
+#X msg 54 201 1 2 3;
+#X msg 25 104 1;
+#X msg 32 129 float 2;
+#X msg 39 153 test;
+#X msg 46 178 symbol this;
+#X msg 68 247 list 1 two 3;
+#X msg 77 294 list one 2 three;
+#X obj 221 390 print LIST;
+#X obj 136 390 print FLOAT;
+#X msg 59 226 1 two 3;
+#X msg 72 271 one 2 three;
+#X text 20 39 "float" is interpreted;
+#X text 21 59 "symbol" is not interpreted;
+#X text 22 78 "list" is interpreted \, and outputted;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [trigger] Oddities;
+#X connect 0 0 1 0;
+#X connect 0 1 2 0;
+#X connect 0 1 16 0;
+#X connect 0 2 3 0;
+#X connect 0 2 9 0;
+#X connect 0 2 27 0;
+#X connect 0 3 4 0;
+#X connect 0 3 18 0;
+#X connect 0 3 26 0;
+#X connect 0 4 5 0;
+#X connect 0 5 6 0;
+#X connect 0 5 17 0;
+#X connect 9 0 10 0;
+#X connect 9 1 11 0;
+#X connect 16 0 14 0;
+#X connect 16 1 15 0;
+#X connect 17 0 12 0;
+#X connect 17 1 13 0;
+#X connect 18 0 7 0;
+#X connect 18 1 8 0;
+#X connect 19 0 0 0;
+#X connect 20 0 0 0;
+#X connect 21 0 0 0;
+#X connect 22 0 0 0;
+#X connect 23 0 0 0;
+#X connect 24 0 0 0;
+#X connect 25 0 0 0;
+#X connect 28 0 0 0;
+#X connect 29 0 0 0;
+#X restore 102 572 pd trigger_oddities;
+#N canvas 60 35 428 560 Converting_data_types_with_trigger 0;
+#X text 21 38 All sophisticated programming environments provide tools
+to convert data types. For instance \, Visual Basic has:;
+#X text 27 69 - VarType: to check the data type.;
+#X text 27 84 - CStr: to convert a variable to a string.;
+#X text 27 99 - CDate: to convert a variable to a date.;
+#X text 27 114 - isNumeric: to test whether the variable is a number.
+;
+#X text 27 129 - etc.;
+#X text 20 151 [trigger] is one object in Pd which can convert an incoming
+atom to a different type of atom.;
+#X text 20 182 To prove this \, click on each of the messages below
+and watch your terminal window for the output.;
+#X msg 23 215 bang;
+#X msg 60 215 1;
+#X floatatom 94 215 5 0 0 0 - - -;
+#X msg 133 215 symbol cat;
+#X msg 207 215 this is anything;
+#X obj 23 264 print all_messages_are_converted_to_bangs;
+#X text 20 293 Another example showing floats and symbols.;
+#X msg 23 317 bang;
+#X floatatom 93 317 5 0 0 0 - - -;
+#X msg 135 317 symbol cat;
+#X msg 209 317 this is anything;
+#X obj 23 345 t f s;
+#X msg 60 317 1 0;
+#X obj 50 390 print converted_to_symbols;
+#X obj 23 413 print converted_to_floats;
+#X text 65 344 Note that "this is anything" causes an error. That is
+because 'anythings' don't conform to floats \, symbols \, lists \,
+pointers. They can only be converted to "bang".;
+#X text 21 435 In the example above \, note that the trigger object
+does not split a list among the outlets like [unpack] does. Instead
+it sends all list elements through all outlets and converts them as
+necessary.;
+#X text 22 487 Also note that some messages don't convert as nicely
+as others. Hence \, the symbol "cat" converts to a ZERO when [trigger]
+converts that symbol into a float. Likewise \, all numbers will convert
+to a symbol called "float" when sent through [trigger]'s right-most
+outlet.;
+#X obj 23 244 t b;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [trigger] Converting data types;
+#X connect 8 0 26 0;
+#X connect 9 0 26 0;
+#X connect 10 0 26 0;
+#X connect 11 0 26 0;
+#X connect 12 0 26 0;
+#X connect 15 0 19 0;
+#X connect 16 0 19 0;
+#X connect 17 0 19 0;
+#X connect 18 0 19 0;
+#X connect 19 0 22 0;
+#X connect 19 1 21 0;
+#X connect 20 0 19 0;
+#X connect 26 0 13 0;
+#X restore 102 528 pd Converting_data_types_with_trigger;
+#N canvas 29 67 459 506 Triggering_messages_with_trigger 0;
+#X text 21 77 1 Sequence a series of bangs - or triggers for symbols
+and/or other messages. In the example below \, you should see that
+it is important that it is important that [metro] gets a tempo setting
+before it is started - but let's assume for a moment that you wanted
+to start the [metro] with only a single click.;
+#X obj 23 269 metro;
+#X msg 50 247 1000;
+#X obj 23 289 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 23 194 tgl 15 0 empty empty On/Off 0 -6 0 7 -262144 -1 -1 0
+1;
+#X obj 23 212 t f b;
+#X text 21 151 Click the toggle to set the tempo and start the [metro]
+simultaneously.;
+#X text 64 203 Triggers are sent from right to left...so our tempo
+messages gets sent to [metro] immediately before the numbers from the
+toggle to start and stop the [metro].;
+#X text 20 310 This example is simple \, and may not be very practical
+in most situations \, but it clearly shows how [trigger] can be used
+to create a simple sequence of events. It is important to note however
+that the messages sent from [trigger]'s outlets occur in ZERO time
+with no delay between the events...more at the top right of the page...
+;
+#X obj 23 438 t b b;
+#X msg 23 416 bang;
+#X obj 23 468 timer;
+#X floatatom 23 490 5 0 0 0 - - -;
+#X text 57 416 Click here.;
+#X text 62 489 Watch here.;
+#X text 20 511 Now \, to prove that I'm not crazy...click here >;
+#X obj 319 560 timer;
+#X floatatom 319 581 5 0 0 0 - - -;
+#X obj 346 538 delay 2000;
+#X text 136 430 any delay between the first bang and the second bang
+;
+#X text 137 446 from the trigger.;
+#X text 20 540 object to force a 2 second delay between the;
+#X text 138 416 In this case \, the [timer] object does not perceive
+;
+#X obj 319 600 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 403 518 5 0 0 0 - - -;
+#X text 19 588 at the top-right to clearly see "logical time";
+#X text 19 601 as measured by [timer].;
+#X obj 319 513 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 20 384 Below is a simple structure which will measure the "logical
+time" between "bangs" from the [trigger] object.;
+#X text 20 526 In this case \, I've simply patched a [delay];
+#X text 20 554 first and second "bangs" sent to the [timer].;
+#X text 19 574 You can reset the [delay] with the number box;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [trigger] Uses;
+#X text 19 623 Click on the other subpatches in the main window to
+read about [trigger]'s second great purpose...;
+#X text 21 38 The [trigger] object serves two great purposes which
+aren't really related - but they might be on some level that I don't
+fully understand yet.;
+#X connect 1 0 3 0;
+#X connect 2 0 1 1;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
+#X connect 5 1 2 0;
+#X connect 9 0 11 1;
+#X connect 9 1 11 0;
+#X connect 10 0 9 0;
+#X connect 11 0 12 0;
+#X connect 16 0 17 0;
+#X connect 17 0 23 0;
+#X connect 18 0 16 1;
+#X connect 24 0 18 1;
+#X connect 27 0 18 0;
+#X connect 27 0 16 0;
+#X restore 102 506 pd Triggering_messages_with_trigger;
+#N canvas 73 48 428 558 Converting_data_types_(cont.) 0;
+#X msg 23 131 2.5;
+#X msg 110 131 bang;
+#X msg 60 131 23 64;
+#X msg 153 131 symbol dog;
+#X obj 23 256 trigger float bang symbol list anything;
+#X text 20 38 In the example below \, you can see that this [trigger]
+has creation arguments which specify what data type the object should
+output through each outlet. Messages which are sent to the first outlet
+will be floats \; the second outlet will send bangs \; the third \,
+symbols \; etc.;
+#X floatatom 23 278 5 0 0 0 - - -;
+#X obj 80 278 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X symbolatom 138 322 10 0 0 0 - - -;
+#X floatatom 192 187 5 0 0 0 - - -;
+#X obj 192 228 pack f s;
+#X msg 237 187 symbol earth;
+#X msg 250 209 symbol jupiter;
+#X obj 196 300 print a_list;
+#X floatatom 23 463 5 0 0 0 - - -;
+#X symbolatom 68 463 10 0 0 0 - - -;
+#X obj 113 441 print another_list;
+#X text 228 159 Click on all these.;
+#X obj 23 398 r anythings;
+#X text 20 346 Note how each of the messages sent to this trigger are
+converted appropriately for their receiving atoms boxes. Also note
+that "anythings" are sent to the example below.;
+#X obj 254 278 s anythings;
+#X obj 23 418 route float symbol list;
+#X msg 233 131 symbol cat;
+#X text 20 487 I've used the [route] object to show how "anythings"
+are converted as they pass through the above [trigger]. Note that all
+messages converted to floats are displayed here in the number box \,
+all symbols are displayed in the symbol box \, and all lists are printed
+to the terminal window.;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [trigger] Converting data types (cont.);
+#X connect 0 0 4 0;
+#X connect 1 0 4 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 4 1 7 0;
+#X connect 4 2 8 0;
+#X connect 4 3 13 0;
+#X connect 4 4 20 0;
+#X connect 9 0 10 0;
+#X connect 10 0 4 0;
+#X connect 11 0 10 1;
+#X connect 12 0 10 1;
+#X connect 18 0 21 0;
+#X connect 21 0 14 0;
+#X connect 21 1 15 0;
+#X connect 21 2 16 0;
+#X connect 22 0 4 0;
+#X restore 102 550 pd Converting_data_types_(cont.);
+#X text 80 328 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 339 501 pddp/pddplink all_about_messages.pd -text all_about_messages
+;
+#X obj 291 574 pddp/pddplink ../2.control.examples/03.connections.pd
+;
+#X connect 30 0 33 0;
+#X connect 31 0 32 0;
+#X connect 33 0 31 0;
+#X connect 33 1 31 1;
diff --git a/doc/pddp/unpack-help.pd b/doc/pddp/unpack-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e4a537e4019966bb8e7474f67c32e2ca918c55df
--- /dev/null
+++ b/doc/pddp/unpack-help.pd
@@ -0,0 +1,121 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header unpack 3 12 0 18
+-204280 -1 0;
+#X obj 0 191 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 243 494 361 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 26 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 45 DESCRIPTION split a message into atoms;
+#X text 12 5 KEYWORDS control list_op;
+#X text 12 65 INLET_0 anything;
+#X text 12 85 OUTLET_N float list symbol pointer bang;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 391 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 444 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 546 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 100 211 428 404 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 pack;
+#X obj 59 43 trigger;
+#X text 8 2 [unpack] Related Objects;
+#X text 19 266 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 19 315 The best places to find information about Pd's libraries
+is:;
+#X text 19 335 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 19 355 or;
+#X text 19 375 iem.kug.ac.at/pdb/;
+#X text 19 79 Externals;
+#X obj 20 103 pddp/helplink zexy/pack~;
+#X obj 20 123 pddp/helplink zexy/unpack~;
+#X obj 20 143 pddp/helplink zexy/tabdump;
+#X obj 20 163 pddp/helplink zexy/niagara;
+#X obj 20 183 pddp/helplink zexy/packel;
+#X obj 20 203 pddp/helplink zexy/repack;
+#X obj 20 223 pddp/helplink zexy/drip;
+#X obj 20 243 pddp/helplink zexy/sort;
+#X restore 102 597 pd Related_objects;
+#X obj 78 200 cnv 17 3 185 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 267 float;
+#X obj 78 400 cnv 17 3 37 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 481 3 unpack;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/unpack -text
+pdpedia: unpack;
+#X floatatom 137 162 0 0 0 0 - - -;
+#X floatatom 252 161 0 0 0 0 - - -;
+#X floatatom 290 161 0 0 0 0 - - -;
+#X floatatom 103 162 0 0 0 0 - - -;
+#X msg 103 91 1 2;
+#X msg 142 91 3 4 shut;
+#X msg 221 91 5 6 pick 7 8;
+#X symbolatom 179 162 10 0 0 0 - - -;
+#X text 11 23 split a message into atoms;
+#X text 98 297 symbol;
+#X text 98 199 list;
+#X text 98 340 pointer;
+#X text 98 368 bang;
+#X text 168 399 - if no arguments are provided \, [unpack] defaults
+to two outlets. Otherwise \, one outlet is created for each creation
+argument specified.;
+#X obj 373 128 unpack;
+#X msg 373 91 60 127;
+#X floatatom 373 162 3 0 0 0 - - -;
+#X floatatom 406 162 3 0 0 0 - - -;
+#X text 168 199 - the elements will be distributed to the outlets.
+The type of each element must match the arguments supplied to [unpack]
+\, or a "type mismatch" error will result. Lists with more (or fewer)
+elements than the total number of outlets are accepted.;
+#X text 100 60 [unpack] takes a list and distributes the elements to
+its outlets.;
+#X text 80 463 1) float;
+#X text 98 477 symbol atom;
+#X text 97 550 [unpack] only checks the first letter of each symbol
+atom in its arguments \, so both "f" and "float" will specify float
+type (so will "foo" \, for that matter).;
+#X text 168 267 - if no arguments are given \, or if the first argument
+is an "f" \, a float will be accepted and sent to the left outlet.
+;
+#X obj 103 128 unpack 0 0 s f f;
+#X text 168 297 - if the first argument to [unpack] is "s" \, a symbol
+message will be sent to the left outlet. Symbol atoms are also accepted
+and given the "symbol" selector when output.;
+#X text 168 340 - if the first argument to [unpack] is "p" \, a pointer
+will be accepted and sent to the left outlet;
+#X text 168 368 - a bang to the inlet has no apparent effect.;
+#X text 168 463 - one outlet is created for each argument specified.
+(If no arguments are provided \, [unpack] will accept a list with two
+floats.) Each symbolic argument specifies the type of atom expected
+in the incoming list. Acceptable arguments are: "f" for float \, "p"
+for pointer \, and "s" for symbol. You can also use a float (e.g. \,
+"o") to specify float.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X connect 17 0 37 0;
+#X connect 18 0 37 0;
+#X connect 19 0 37 0;
+#X connect 27 0 29 0;
+#X connect 27 1 30 0;
+#X connect 28 0 27 0;
+#X connect 37 0 16 0;
+#X connect 37 1 13 0;
+#X connect 37 2 20 0;
+#X connect 37 3 14 0;
+#X connect 37 4 15 0;
diff --git a/doc/pddp/until-help.pd b/doc/pddp/until-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7939ce3639177f207085accb07f665116c56d00b
--- /dev/null
+++ b/doc/pddp/until-help.pd
@@ -0,0 +1,163 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header until 3 12 0 18
+-204280 -1 0;
+#X obj 0 346 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 243 494 367 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 26 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 45 DESCRIPTION looping mechanism;
+#X text 12 65 INLET_0 float bang;
+#X text 12 105 OUTLET_0 bang;
+#X text 12 85 INLET_1 bang;
+#X text 12 5 KEYWORDS control bang_op;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 435 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 472 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 500 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 476 (none);
+#N canvas 105 453 428 159 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [until] Related Objects;
+#X text 19 38 External Objects;
+#X obj 21 57 pddp/helplink iemlib/for++;
+#X obj 21 77 pddp/helplink cyclone/counter;
+#X obj 21 97 pddp/helplink gem_counter;
+#X text 123 97 <-- Which library?;
+#X obj 21 117 pddp/helplink iemlib/modulo_counter;
+#X restore 102 597 pd Related_objects;
+#X obj 78 355 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 444 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 407 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 482 3 until;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/until -text
+pdpedia: until;
+#X obj 37 195 until;
+#X msg 37 172 100;
+#X obj 37 246 print i;
+#X text 11 23 looping mechanism;
+#X text 98 406 bang;
+#X text 167 406 - a bang to the right inlet ends the loop.;
+#X text 98 354 bang;
+#X text 98 374 float;
+#X text 168 354 - a bang to the left inlet starts the loop.;
+#X text 168 374 - sending a float to the left inlet will cause [until]
+to iterate that number of times.;
+#X text 98 443 bang;
+#X obj 37 221 f;
+#X obj 67 221 + 1;
+#X text 117 98 If you start [until] with a number \, it iterates that
+number of times. The [uzi] object in MAX works the same way.;
+#X obj 119 176 until;
+#X msg 119 129 100;
+#X obj 119 196 print i;
+#X msg 149 136 3;
+#X msg 179 143 42;
+#N canvas 86 234 428 358 Infinite_loops 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [until] Infinite loops;
+#X msg 23 61 bang;
+#X obj 23 81 until;
+#X obj 23 101 print;
+#X text 61 61 DO NOT CLICK. DO NOT CLICK. DO NOT CLICK.;
+#X text 20 126 The [until] object's left inlet starts a loop in which
+it outputs "bang" until its right inlet gets a "bang" which stops it.
+;
+#X text 64 81 If you click \, kill Pd or reboot the computer.;
+#X msg 72 241 bang;
+#X obj 72 262 until;
+#X text 103 241 start;
+#X obj 72 284 f;
+#X obj 101 284 + 1;
+#X obj 147 286 sel 0;
+#X obj 72 328 print;
+#X obj 101 306 mod 10;
+#X text 20 189 The example below includes a method to stop the loop
+to prevent Pd from looping infinitely.;
+#X text 20 37 How to FREEZE Pd;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 11 0 12 0;
+#X connect 11 0 14 0;
+#X connect 12 0 15 0;
+#X connect 13 0 9 1;
+#X connect 15 0 11 1;
+#X connect 15 0 13 0;
+#X restore 102 533 pd Infinite_loops;
+#N canvas 106 85 428 440 Loops 0;
+#X text 20 38 Every modern programming language will have various "looping"
+mechanisms: either in the form of an object \, or as a data structure.
+For example in Visual Basic:;
+#X text 31 105 DO UNTIL i = 100;
+#X text 31 119 i = i + 1;
+#X text 32 90 i = 0;
+#X text 31 134 LOOP;
+#X text 20 245 And now Pd's version of the above programming structures:
+;
+#X obj 29 322 until;
+#X obj 29 382 print i;
+#X text 20 160 OR:;
+#X text 30 186 FOR i = 0 TO 100;
+#X text 29 212 NEXT;
+#X text 30 200 ' do something;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [until] More about loops;
+#X obj 239 292 until;
+#X msg 239 272 100;
+#X obj 239 312 print i;
+#X text 139 289 OR:;
+#X obj 29 352 f;
+#X obj 57 352 + 1;
+#X msg 29 268 100;
+#X obj 29 291 t a b;
+#X obj 70 322 0;
+#X connect 6 0 18 0;
+#X connect 14 0 16 0;
+#X connect 15 0 14 0;
+#X connect 18 0 19 0;
+#X connect 18 0 7 0;
+#X connect 19 0 18 1;
+#X connect 20 0 21 0;
+#X connect 21 0 6 0;
+#X connect 21 1 22 0;
+#X connect 22 0 18 1;
+#X restore 102 509 pd Loops;
+#X text 116 216 If you start [until] with a "bang" \, it will begin
+an infinite loop! Please plan ahead in this case so that there is a
+mechanism in place to stop the loop - otherwise Pd will effectively
+freeze. (See the "Loops" subpatch below.);
+#X obj 102 555 pddp/pddplink all_about_looping.pd -text all_about_looping
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 102 572 pddp/pddplink ../2.control.examples/24.loops.pd -text
+doc/2.control.examples/24.loops.pd;
+#X connect 14 0 25 0;
+#X connect 15 0 14 0;
+#X connect 25 0 16 0;
+#X connect 25 0 26 0;
+#X connect 26 0 25 1;
+#X connect 28 0 30 0;
+#X connect 29 0 28 0;
+#X connect 31 0 28 0;
+#X connect 32 0 28 0;
diff --git a/doc/pddp/value-help.pd b/doc/pddp/value-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..511ba69ffbe3e7b73dbd36f0f5359fd023023723
--- /dev/null
+++ b/doc/pddp/value-help.pd
@@ -0,0 +1,143 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header value 3 12 0 18
+-204280 -1 0;
+#X obj 0 284 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 45 219 494 391 META 0;
+#X text 12 125 LIBRARY internal;
+#X text 12 165 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 145 AUTHOR Miller Puckette;
+#X text 12 205 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 26 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 25 KEYWORDS control storage nonlocal;
+#X text 12 65 DESCRIPTION nonlocal shared value (named variable);
+#X text 12 5 ALIAS v;
+#X text 12 85 INLET_0 float bang;
+#X text 12 105 OUTLET_0 float;
+#X text 12 185 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 379 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 421 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 66 452 428 139 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [value] Related Objects;
+#X obj 23 43 send;
+#X obj 56 43 receive;
+#X text 20 76 External Objects;
+#X obj 110 43 expr;
+#X obj 20 96 pddp/helplink motex/getenv;
+#X restore 102 597 pd Related_objects;
+#X obj 78 293 cnv 17 3 75 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 322 float;
+#X text 98 352 list;
+#X text 98 387 float;
+#X obj 78 388 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/value -text
+pdpedia: value;
+#X obj 456 3 value;
+#X obj 516 3 v;
+#X text 494 3 or;
+#X text 11 23 nonlocal shared value (named variable);
+#N canvas 57 148 428 418 scope 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 20 38 Understanding "scope" is important while developing programmatic
+applications. In Pd there are three levels of "scope":;
+#X text 31 81 1 Local Scope: all objects \, subroutines \, data \,
+and variables which exist within a single patch on a single computer
+and do not communicate with other active Pd patches.;
+#X text 29 137 2 Global Scope: all objects \, subroutines \, data and
+variables which exist within single or multiple patches on a single
+computer which communicate with other active Pd patches.;
+#X text 20 260 As a general rule \, all things are considered "local"
+in Pd and if communication between Pd windows is necessary \, then
+[send]/[receive] \, or [throw]/[catch] objects are used. Likewise \,
+if communication is necessary between many computers running Pd \,
+then objects such as [netsend]/[netreceive] are used.;
+#X text 20 347 The exception to the above rule is [value]. This object
+is a container which makes its data known to all [value] objects of
+the same name in all active Pd windows on a single computer: hence
+\, GLOBAL scope.;
+#X text 30 199 3 Network (Universal) Scope: all objects \, subroutines
+\, data and variables which exist within single or multiple patches
+on two or more computers which communicate with other active Pd patches
+via a network.;
+#X text 8 2 [value] Scope in Pd;
+#X restore 102 574 pd scope;
+#X text 98 47 [value] is a container. It holds a global variable numeric
+value and can be "polled" at any time with a "bang" message. In other
+words \, [value] is a place where numbers can be stored and then accessed
+by all active Pd windows.;
+#N canvas 73 60 428 231 global_values 0;
+#X obj 173 168 v my_variable;
+#X floatatom 173 190 5 0 0 0 - - -;
+#X obj 173 127 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 191 145 5 0 0 0 - - -;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [value] Sub-patch to demonstrate global values;
+#X text 20 38 To show how global scope works \, "bang" the [value]
+object to retreive the current number. While you're in the sub-patch
+\, change the number and then return to the main patch window and click
+the "bang". You'll quickly see how this variable can be retreived or
+reset in any active Pd window.;
+#X connect 0 0 1 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X restore 101 261 pd global_values;
+#X text 16 102 To assign a numeric value to that variable \, a number
+box or message can be used \, as follows:;
+#X obj 19 179 value my_variable;
+#X msg 37 156 42;
+#X floatatom 19 203 5 0 0 0 - - -;
+#X floatatom 19 136 5 0 0 0 - - -;
+#X obj 271 188 value my_variable;
+#X floatatom 271 212 5 0 0 0 - - -;
+#X obj 271 168 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 63 135 play with me;
+#X text 62 155 or click me;
+#X text 186 133 Notice that the number is not outputted to the outlet
+\; it is merely stored. To retreive the number \, send a "bang" \,
+like below:;
+#X text 168 322 - a float to the inlet sets all [value] objects that
+share the same name to the incoming value.;
+#X text 168 352 - a list is truncated to the first element.;
+#X text 98 292 bang;
+#X text 168 292 - sending a bang to a particular [value] object will
+cause it to output its current value.;
+#X text 168 387 - the current value is output when a bang is received
+at the inlet.;
+#X text 98 229 All [value] objects with the same name receive the value
+(see subpatch below):;
+#X text 168 491 If no creation argument is given \, then the object
+will communicate with all other [value] objects with no name.;
+#X text 99 529 [value] variables may be used within all [expr] family
+objects. See the help patches for [expr] \, [expr~] and [fexpr~] for
+more information.;
+#X text 80 439 1) symbol atom;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 168 439 - [value] takes one argument (a symbol) that is the
+name of the object. All [value] objects that share this name will have
+their values updated when a float is sent to the inlet of any of them.
+;
+#X obj 193 574 pddp/pddplink all_about_expr_and_value.pd;
+#X connect 22 0 24 0;
+#X connect 23 0 22 0;
+#X connect 25 0 22 0;
+#X connect 26 0 27 0;
+#X connect 28 0 26 0;
diff --git a/doc/pddp/vcf~-help.pd b/doc/pddp/vcf~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f553ad3b7c0941219f11e3418270b8b8dc8b2d8d
--- /dev/null
+++ b/doc/pddp/vcf~-help.pd
@@ -0,0 +1,95 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header vcf~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 376 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 41 189 494 409 META 0;
+#X text 12 165 LIBRARY internal;
+#X text 12 205 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 185 AUTHOR Miller Puckette;
+#X text 12 245 HELP_PATCH_AUTHORS Updated for Pd version 0.35. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal filter;
+#X text 12 45 DESCRIPTION voltage-controlled bandpass filter;
+#X text 12 65 INLET_0 signal;
+#X text 12 105 INLET_2 float;
+#X text 12 85 INLET_1 signal;
+#X text 12 125 OUTLET_0 signal;
+#X text 12 145 OUTLET_1 signal;
+#X text 12 225 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 468 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 525 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 94 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 bp~;
+#X text 8 2 [vcf~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 385 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 477 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 413 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 484 3 vcf~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/vcf~ -text
+pdpedia: vcf~;
+#X obj 78 440 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 439 float;
+#X text 98 476 signal;
+#X text 98 384 signal;
+#X text 98 412 signal;
+#X obj 261 141 sig~;
+#X text 68 141 test signal;
+#X text 125 235 amp in (db);
+#X text 116 96 test frequency;
+#X text 248 233 amp out (db);
+#X text 230 96 center frequency;
+#X text 344 140 q;
+#X floatatom 146 120 5 0 0 0 - - -;
+#X floatatom 261 120 5 0 0 0 - - -;
+#X obj 146 141 osc~;
+#X floatatom 308 141 5 0 0 0 - - -;
+#X obj 146 190 env~ 8192;
+#X obj 244 190 env~ 8192;
+#X floatatom 146 212 5 0 0 0 - - -;
+#X floatatom 244 212 5 0 0 0 - - -;
+#X obj 244 168 vcf~ 1;
+#X text 293 167 optional argument to initialize q;
+#X text 11 23 voltage-controlled bandpass filter;
+#X text 167 412 - center frequency \, which may change continuously
+in time.;
+#X text 167 439 - change the "Q \, " or filter sharpness.;
+#X text 168 384 - the incoming signal to be filtered;
+#X text 168 543 - [vcf~] takes one argument to initialize q.;
+#X text 80 543 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X text 168 476 - the filtered signal (real part).;
+#X obj 78 500 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 499 signal;
+#X text 168 499 - the filtered signal (imaginary part).;
+#X text 76 283 [vcf~] is like [bp~] except that it takes an audio signal
+to set center frequency \, which may thus change continuously in time.
+The "Q" or filter sharpness is still only set by messages. More expensive
+than bp~ in CPU time but more powerful too.;
+#X connect 18 0 33 1;
+#X connect 25 0 27 0;
+#X connect 26 0 18 0;
+#X connect 27 0 29 0;
+#X connect 27 0 33 0;
+#X connect 28 0 33 2;
+#X connect 29 0 31 0;
+#X connect 30 0 32 0;
+#X connect 33 0 30 0;
diff --git a/doc/pddp/vdial-help.pd b/doc/pddp/vdial-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ab5759a483c54879fc3e507fac9b2403f1412b25
--- /dev/null
+++ b/doc/pddp/vdial-help.pd
@@ -0,0 +1,283 @@
+#N canvas 90 217 558 455 10;
+#X obj 1 1 cnv 8 100 60 empty empty vdial=vdl 20 20 1 18 -262144 -1109
+0;
+#X text 13 390 (c) musil@iem.kug.ac.at;
+#X text 55 403 IEM KUG;
+#X text 132 122 click properties to;
+#X text 120 133 modify geometry \, colors \, etc.;
+#X obj 159 261 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144
+-1 -1;
+#X obj 21 54 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X msg 41 319 \$1;
+#X floatatom 41 341 4 0 0 0 - - -;
+#X obj 41 363 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 86 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 86 317 route 0 1 2 3 4 5 6 7 8 9;
+#X msg 194 92 set \$1;
+#X floatatom 194 71 4 0 9 0 - - -;
+#X floatatom 44 54 4 0 9 0 - - -;
+#X msg 91 41 7 0 -5.44;
+#X msg 95 63 3 3 4.55;
+#X obj 103 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 120 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 137 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 154 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 171 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 188 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 205 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 222 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 239 338 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 79 355 print;
+#X floatatom 183 287 4 0 0 0 - - -;
+#X msg 183 261 \$1;
+#X msg 158 192 set \$1;
+#X floatatom 158 171 4 0 9 0 - - -;
+#X text 125 355 UP- \, DOWN- \, LEFT- or RIGHT-key;
+#X text 124 366 for moving selected gui-objects;
+#N canvas 230 247 699 530 edit 0;
+#X obj 42 198 f;
+#X msg 20 177 bang;
+#X floatatom 58 176 3 63 156 0 - - -;
+#X floatatom 93 198 3 -20 37 0 - - -;
+#X obj 42 221 pack 0 0;
+#X text 120 198 y-label;
+#X text 86 176 x-label;
+#X floatatom 270 187 3 8 50 0 - - -;
+#X text 297 187 size;
+#X obj 286 293 f;
+#X msg 264 272 bang;
+#X floatatom 302 271 3 -10 10 0 - - -;
+#X floatatom 337 293 3 -10 10 0 - - -;
+#X obj 286 316 pack 0 0;
+#X obj 300 412 f;
+#X msg 278 391 bang;
+#X floatatom 316 390 3 20 60 0 - - -;
+#X floatatom 351 412 3 100 200 0 - - -;
+#X obj 300 435 pack 0 0;
+#X text 330 271 x-delta;
+#X text 364 293 y-delta;
+#X text 344 390 x-position;
+#X text 378 412 y-position;
+#X obj 62 313 f;
+#X msg 40 292 bang;
+#X floatatom 78 291 3 0 2 0 - - -;
+#X floatatom 113 313 3 4 36 0 - - -;
+#X obj 62 336 pack 0 0;
+#X text 106 291 font;
+#X text 142 313 height;
+#X text 504 293 no init;
+#X text 475 348 init value on loadbang;
+#X floatatom 482 228 5 2 20 0 - - -;
+#X text 491 417 changing-behavior;
+#X text 526 228 number of buttons;
+#X obj 47 104 pack 0 0 0;
+#X obj 47 76 f;
+#X msg 24 28 bang;
+#X floatatom 63 26 3 0 29 0 - - -;
+#X floatatom 79 46 3 0 29 0 - - -;
+#X floatatom 112 62 3 0 29 0 - - -;
+#X text 91 26 background;
+#X text 106 46 front-color;
+#X text 140 63 label-color;
+#X msg 285 25 back;
+#X msg 285 45 front;
+#X msg 285 65 label;
+#X msg 247 25 bang;
+#N canvas 15 207 606 448 RGB_____________ 0;
+#X obj 97 56 inlet;
+#X obj 262 53 inlet;
+#X obj 339 55 inlet;
+#X obj 405 56 inlet;
+#X obj 97 270 bang;
+#X msg 77 295 0;
+#X msg 104 295 1;
+#X obj 146 268 bang;
+#X msg 132 295 0;
+#X msg 160 295 1;
+#X obj 196 269 bang;
+#X msg 187 295 0;
+#X msg 214 295 1;
+#X obj 265 313 spigot;
+#X obj 312 313 spigot;
+#X obj 359 313 spigot;
+#X obj 249 385 outlet;
+#X text 93 33 select;
+#X text 267 28 red;
+#X text 337 30 green;
+#X text 409 30 blue;
+#X obj 405 102 t b f;
+#X obj 339 160 +;
+#X obj 339 185 t b f;
+#X obj 339 216 +;
+#X obj 296 385 outlet;
+#X obj 343 385 outlet;
+#X obj 28 180 loadbang;
+#X obj 97 135 route back front label bang;
+#X obj 343 362 f;
+#X obj 296 361 f;
+#X obj 249 361 f;
+#X obj 262 79 * -65536;
+#X obj 339 80 * -256;
+#X obj 405 80 * -1;
+#X obj 339 247 - 1;
+#X obj 235 168 t b b b b;
+#X connect 0 0 28 0;
+#X connect 1 0 32 0;
+#X connect 2 0 33 0;
+#X connect 3 0 34 0;
+#X connect 4 0 5 0;
+#X connect 4 0 6 0;
+#X connect 5 0 14 1;
+#X connect 5 0 15 1;
+#X connect 6 0 13 1;
+#X connect 7 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 13 1;
+#X connect 8 0 15 1;
+#X connect 9 0 14 1;
+#X connect 10 0 11 0;
+#X connect 10 0 12 0;
+#X connect 11 0 13 1;
+#X connect 11 0 14 1;
+#X connect 12 0 15 1;
+#X connect 13 0 31 1;
+#X connect 14 0 30 1;
+#X connect 15 0 29 1;
+#X connect 21 0 22 0;
+#X connect 21 1 22 1;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 23 1 24 1;
+#X connect 24 0 35 0;
+#X connect 27 0 6 0;
+#X connect 28 0 4 0;
+#X connect 28 1 7 0;
+#X connect 28 2 10 0;
+#X connect 28 3 36 0;
+#X connect 29 0 26 0;
+#X connect 30 0 25 0;
+#X connect 31 0 16 0;
+#X connect 32 0 24 0;
+#X connect 33 0 22 0;
+#X connect 34 0 21 0;
+#X connect 35 0 15 0;
+#X connect 35 0 14 0;
+#X connect 35 0 13 0;
+#X connect 36 0 31 0;
+#X connect 36 1 30 0;
+#X connect 36 2 29 0;
+#X connect 36 3 35 0;
+#X restore 285 86 pd RGB_____________;
+#X floatatom 327 55 3 0 255 0 - - -;
+#X floatatom 370 55 3 0 255 0 - - -;
+#X floatatom 413 56 3 0 255 0 - - -;
+#X text 34 0 preset-colors;
+#X text 296 -3 RGB-colors;
+#X text 327 37 red;
+#X text 363 36 green;
+#X text 411 36 blue;
+#X msg 47 125 \; foo12_rcv color \$1 \$2 \$3;
+#X msg 42 246 \; foo12_rcv label_pos \$1 \$2;
+#X msg 62 361 \; foo12_rcv label_font \$1 \$2;
+#X msg 34 423 \; foo12_rcv label blabla;
+#X msg 34 459 \; foo12_rcv label vdial_0_9;
+#X msg 300 460 \; foo12_rcv pos \$1 \$2;
+#X msg 286 341 \; foo12_rcv delta \$1 \$2;
+#X msg 270 216 \; foo12_rcv size \$1;
+#X msg 483 50 \; foo12_rcv send foo12a_snd;
+#X msg 483 88 \; foo12_rcv send foo12_snd;
+#X msg 482 171 \; foo12a_rcv receive foo12_rcv;
+#X msg 483 133 \; foo12_rcv receive foo12a_rcv;
+#X msg 482 254 \; foo12_rcv number \$1;
+#X msg 483 312 \; foo12_rcv init 0;
+#X msg 485 366 \; foo12_rcv init 1;
+#X msg 490 436 \; foo12_rcv single_change;
+#X msg 490 470 \; foo12_rcv double_change;
+#X connect 0 0 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 1;
+#X connect 3 0 4 1;
+#X connect 4 0 58 0;
+#X connect 7 0 64 0;
+#X connect 9 0 13 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 1;
+#X connect 12 0 13 1;
+#X connect 13 0 63 0;
+#X connect 14 0 18 0;
+#X connect 15 0 14 0;
+#X connect 16 0 14 1;
+#X connect 17 0 18 1;
+#X connect 18 0 62 0;
+#X connect 23 0 27 0;
+#X connect 24 0 23 0;
+#X connect 25 0 23 1;
+#X connect 26 0 27 1;
+#X connect 27 0 59 0;
+#X connect 32 0 69 0;
+#X connect 35 0 57 0;
+#X connect 36 0 35 0;
+#X connect 37 0 36 0;
+#X connect 38 0 36 1;
+#X connect 39 0 35 1;
+#X connect 40 0 35 2;
+#X connect 44 0 48 0;
+#X connect 45 0 48 0;
+#X connect 46 0 48 0;
+#X connect 47 0 48 0;
+#X connect 48 0 35 0;
+#X connect 48 1 35 1;
+#X connect 48 2 35 2;
+#X connect 49 0 48 1;
+#X connect 50 0 48 2;
+#X connect 51 0 48 3;
+#X restore 267 222 pd edit;
+#X obj 221 11 x_all_guis aaa bbb ccc ddd eee fff ggg hhh iii;
+#X text 30 415 graz \, austria 2002;
+#X text 223 401 updated for Pd version 0.35;
+#X text 144 11 gui-vdial:;
+#X obj 79 110 vdl 25 1 0 8 foo12_snd foo12_rcv vdial_0_9 20 -8 192
+10 -99865 -262144 -260818 0;
+#X obj 352 36 vdl 15 1 0 8 iii iii empty 20 8 192 8 -262144 -1 -1 0
+;
+#X obj 158 213 s foo12_rcv;
+#X obj 159 239 r foo12_snd;
+#X text 225 418 KEYWORDS deprecated;
+#X connect 6 0 38 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 11 0 10 0;
+#X connect 11 1 17 0;
+#X connect 11 2 18 0;
+#X connect 11 3 19 0;
+#X connect 11 4 20 0;
+#X connect 11 5 21 0;
+#X connect 11 6 22 0;
+#X connect 11 7 23 0;
+#X connect 11 8 24 0;
+#X connect 11 9 25 0;
+#X connect 12 0 38 0;
+#X connect 13 0 12 0;
+#X connect 14 0 38 0;
+#X connect 15 0 38 0;
+#X connect 16 0 38 0;
+#X connect 28 0 27 0;
+#X connect 29 0 40 0;
+#X connect 30 0 29 0;
+#X connect 38 0 11 0;
+#X connect 38 0 26 0;
+#X connect 38 0 7 0;
+#X connect 41 0 5 0;
+#X connect 41 0 28 0;
diff --git a/doc/pddp/vd~-help.pd b/doc/pddp/vd~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2bf176918086bf21729155d80897fdfb9bb9edf4
--- /dev/null
+++ b/doc/pddp/vd~-help.pd
@@ -0,0 +1,93 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header vd~ 3 12 0 18 -204280
+-1 0;
+#X obj 0 369 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 244 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal nonlocal time;
+#X text 12 45 DESCRIPTION read a signal from a delay line at a variable
+delay time;
+#X text 12 75 INLET_0 signal;
+#X text 12 95 OUTLET_0 signal;
+#X text 12 175 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 444 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 497 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 108 477 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 delwrite~;
+#X obj 92 43 delread~;
+#X text 8 2 [vd~] Related Objects;
+#X obj 159 44 delay;
+#X restore 102 597 pd Related_objects;
+#X obj 78 378 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 453 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/vd~ -text
+pdpedia: vd~;
+#X obj 324 138 sig~;
+#X text 98 377 signal;
+#X text 98 397 float;
+#X text 98 416 list;
+#X text 11 23 reads a signal from a delay line at a variable delay
+time;
+#X text 165 343 NOTE: [vd~] uses 4-point-interpolation;
+#X text 98 452 signal;
+#X text 168 452 - the signal from the corresponding [delwrite~] object
+is interpolated and output after the delay specified by the incoming
+signal.;
+#X text 168 515 - the name of the corresponding [delwrite~] object
+;
+#X text 484 5 [vd~];
+#X text 168 416 - a list is truncated to the first element.;
+#X text 168 377 - incoming signal (delay time in ms).;
+#X text 168 397 - delay time in ms.;
+#X text 80 515 1) symbol atom;
+#X obj 101 160 delwrite~ vd~help_example 1000;
+#X obj 324 160 vd~ vd~help_example;
+#X text 98 67 [vd~] implements a 4-point interpolating delay tap from
+a corresponding delwrite~ object. The delay in milliseconds of the
+tap is specified by the incoming signal.;
+#X floatatom 324 115 5 0 0 0 - - -;
+#X obj 324 230 snapshot~;
+#X obj 333 204 metro 150;
+#X obj 333 182 loadbang;
+#X floatatom 324 252 5 0 0 0 - - -;
+#X floatatom 101 139 5 0 0 0 - - -;
+#X msg 369 115 1000;
+#X text 98 274 The delay time is always at least one sample and at
+most the length of the delay line (specified by [delwrite~]). In addition
+\, in case the [delwrite~] runs later in the DSP loop than the [vd~]
+\, the delay is constrained below by one vector length (64 samples.)
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 543 pddp/pddplink ../3.audio.examples/G03.delay.variable.pd
+-text doc/3.audio.examples/G03.delay.variable.pd;
+#X obj 98 558 pddp/pddplink ../3.audio.examples/G04.control.blocksize.pd
+-text doc/3.audio.examples/G04.control.blocksize.pd;
+#X obj 98 573 pddp/pddplink ../3.audio.examples/G05.execution.order.pd
+-text doc/3.audio.examples/G05.execution.order.pd;
+#X connect 11 0 26 0;
+#X connect 26 0 29 0;
+#X connect 28 0 11 0;
+#X connect 29 0 32 0;
+#X connect 30 0 29 0;
+#X connect 31 0 30 0;
+#X connect 33 0 25 0;
+#X connect 34 0 11 0;
diff --git a/doc/pddp/vline~-help.pd b/doc/pddp/vline~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6ae0540911988e6f0fda7c20b1eebbb5d3fba795
--- /dev/null
+++ b/doc/pddp/vline~-help.pd
@@ -0,0 +1,101 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header vline~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 361 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 244 494 344 META 0;
+#X text 12 145 LIBRARY internal;
+#X text 12 185 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 165 AUTHOR Miller Puckette;
+#X text 12 225 HELP_PATCH_AUTHORS Updated for version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal time conversion;
+#X text 12 45 DESCRIPTION high-precision audio ramp generator;
+#X text 12 65 INLET_0 float list stop;
+#X text 12 85 INLET_1 float;
+#X text 12 105 INLET_2 float;
+#X text 12 125 OUTLET_0 signal;
+#X text 12 205 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 499 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 541 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 545 (none);
+#N canvas 85 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 line~;
+#X obj 62 43 line;
+#X text 8 2 [vline~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 370 cnv 17 3 70 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 369 float;
+#X text 98 393 list;
+#X obj 78 508 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 448 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 447 float;
+#X obj 480 3 vline~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/vline~ -text
+pdpedia: vline~;
+#X text 11 23 high-precision audio ramp generator;
+#X text 168 393 - a list to the first inlet is distributed among the
+inlets of [vline~].;
+#X text 98 426 stop;
+#X obj 78 471 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+-162280 0;
+#X text 98 470 float;
+#X text 98 507 signal;
+#X text 168 507 - the output is a linear ramp whose levels and timing
+are determined by the messages sent to the inlet(s).;
+#X obj 31 271 snapshot~;
+#X floatatom 31 294 5 0 0 0 - - -;
+#X obj 41 244 metro 100;
+#X msg 31 69 1 1000;
+#X msg 59 174 stop;
+#X msg 51 113 0;
+#X obj 31 200 vline~;
+#X text 86 67 ramp up;
+#X msg 40 91 0 1000;
+#X text 86 90 ramp down;
+#X text 60 133 ramp up \, jump down \, ramp up again;
+#X msg 54 152 1 1000 \, 0 0 1000 \, 1 1000 1000;
+#X text 86 112 jump down;
+#X text 147 181 The [vline~] object \, like [line~] \, generates linear
+ramps whose levels and timing are determined by messages you send it.
+The messages consist of a target value \, a time interval (zero if
+not supplied) \, and an initial delay (also zero if not supplied.)
+Ramps may start and stop between audio samples \, in which case the
+output is interpolated accordingly.;
+#X text 147 276 Any number of future ramps may be scheduled and [vline~]
+will remember them and execute them in order. They must be specified
+in increasing order of initial delay however \, since a segment cancels
+all planned segments at any future time.;
+#X text 168 369 - target value.;
+#X text 168 426 - the "stop" message freezes [vline~] at its current
+value.;
+#X text 167 447 - time value.;
+#X text 167 470 - initial delay.;
+#X obj 41 222 loadbang;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X obj 98 572 pddp/pddplink ../3.audio.examples/C04.control.to.signal.pd
+-text doc/3.audio.examples/C04.control.to.signal.pd;
+#X connect 24 0 25 0;
+#X connect 26 0 24 0;
+#X connect 27 0 30 0;
+#X connect 28 0 30 0;
+#X connect 29 0 30 0;
+#X connect 30 0 24 0;
+#X connect 32 0 30 0;
+#X connect 35 0 30 0;
+#X connect 43 0 26 0;
diff --git a/doc/pddp/vradio-help.pd b/doc/pddp/vradio-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3dd18ff3b8bf85ef7702c88ea6b72dda6ed27198
--- /dev/null
+++ b/doc/pddp/vradio-help.pd
@@ -0,0 +1,387 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header vradio 3 12 0 18
+-204280 -1 0;
+#X obj 0 316 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 54 247 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Thomas Musil;
+#X text 12 155 WEBSITE;
+#X text 12 195 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X text 12 5 KEYWORDS control storage GUI nonlocal;
+#X text 12 45 DESCRIPTION vertical column of gui-radio buttons;
+#X text 12 65 INLET_0 float bang size init number send receive label
+label_pos label_font color pos delta;
+#X text 12 95 OUTLET_0 float;
+#X text 12 175 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 438 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 492 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 571 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 325 cnv 17 3 85 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 83 461 428 129 Related_objects 0;
+#X obj 22 43 bang;
+#X obj 69 43 trigger;
+#X obj 145 43 until;
+#X obj 201 43 bang~;
+#X msg 257 43;
+#X obj 20 93 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 18 69 All iem-gui objects:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [vradio] Related Objects;
+#X restore 100 597 pd Related_objects;
+#X obj 78 447 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 291 174 and receive names. Right-;
+#X text 291 189 click and choose;
+#X text 290 205 "Properties" to set them \,;
+#X floatatom 292 63 5 0 5 0 - - -;
+#X floatatom 292 137 5 0 0 0 - - -;
+#X text 98 324 float;
+#X text 98 389 list;
+#X text 98 447 float;
+#X text 291 219 or change them with messages (see below);
+#X text 168 447 - output the number of the cell that has been clicked
+or sent to the inlet of [hradio]. Cell's are numbered from right to
+left \, in increasing order \, starting from zero.;
+#X text 97 270 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move a
+selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 11 21 vertical column of gui-radio buttons;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/vradio -text
+pdpedia: vradio;
+#X obj 529 45 vradio 15 1 0 8 empty empty empty 0 -8 0 10 -262144 -1
+-1 0;
+#X obj 91 48 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X floatatom 11 230 4 0 0 0 - - -;
+#X obj 11 252 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X obj 126 255 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X msg 226 76 set \$1;
+#X floatatom 226 55 4 0 5 0 - - -;
+#X floatatom 114 48 4 0 9 0 - - -;
+#X obj 148 255 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 170 255 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 192 255 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 214 255 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 236 255 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 259 255 tgl 12 0 empty empty empty 8 -8 0 10 -262144 -1 -1 0
+1;
+#X obj 59 230 print;
+#X obj 91 100 vradio 20 1 0 6 vradio-help-snd vradio-help-rcv vradio
+30 40 0 10 -4032 -86277 -1 0;
+#X msg 161 71 2;
+#X msg 161 48 6;
+#X obj 126 230 route 0 1 2 3 4 5;
+#X obj 292 84 s vradio-help-rcv;
+#X obj 292 114 r vradio-help-snd;
+#X text 290 158 [vradio] has settable send;
+#N canvas 83 190 428 345 vradio-creation-arguments 0;
+#X obj 23 208 s pd-vradio-creation-arguments;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [vradio] Creation Arguments and Dynamic Patching;
+#X text 20 38 [vradio] can be called with 15 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X text 20 81 [vradio] creation arguments: Size Unknown Init Number
+sendName receiveName Label labelXOff labelYOff font# fontSize bgColor
+foregroundColor labelColor initValue;
+#X text 20 125 For example \, click the msg-box to dynamically create
+a [vradio]:;
+#X msg 23 166 obj 180 260 vradio 25 1 0 3 empty empty Taygete -10 -10
+0 12 6 25 13 0 \;;
+#X connect 6 0 0 0;
+#X restore 170 547 pd vradio-creation-arguments;
+#X text 168 389 - a list is truncated to the first element.;
+#X text 168 324 - a float highlights the corresponding button and outputs
+the button number. Buttons are numbered from top to bottom \, starting
+from zero. For incoming numbers that are out of range \, the nearest
+button number is selected.;
+#N canvas 66 12 428 601 Setting_vradio_properties_through_messages
+0;
+#X text 111 33 no init;
+#X text 175 160 label;
+#X msg 175 180 label blabla;
+#X msg 121 104 init 1;
+#X msg 111 52 init 0;
+#X text 120 71 init value;
+#X text 121 85 on loadbang;
+#X text 317 33 change send name;
+#X text 23 160 change receive name;
+#X obj 38 233 s z_rcv;
+#X msg 21 182 receive z_rcv;
+#N canvas 313 106 164 268 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 73 \; \$1-xpos 349 \; \$1-ypos 432 \; \$1-xlabel 0 \; \$1-ylabel
+-8 \; \$1-number 8 \; \$1-font-size 10 \; \$1-size 15 \; \$1-font-size
+10 \; \$1-font 0 \; \$1-bg 0 \; \$1-front 12 \; \$1-label 12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 315 389 pd init;
+#X text 111 33 no init;
+#X msg 121 104 init 1;
+#X msg 111 52 init 0;
+#X text 120 71 init value;
+#X text 121 85 on loadbang;
+#X floatatom 204 52 3 0 20 0 - #0-number -;
+#X text 204 33 number (of cells);
+#X msg 204 104 number \$1;
+#X obj 204 128 s vradio_rcv;
+#X obj 316 128 s vradio_rcv;
+#X obj 21 259 s vradio_rcv;
+#X obj 175 259 s vradio_rcv;
+#X msg 316 56 send vradio1_snd;
+#X msg 325 104 send vradio_snd;
+#X msg 38 208 receive vradio_rcv;
+#X msg 185 234 label myVradio;
+#X msg 21 104 size \$1;
+#X text 20 33 dimensions;
+#X obj 21 54 nbx 3 14 8 200 0 0 empty \$0-size empty 0 -8 0 12 -262144
+-1 -1 15 256;
+#X text 71 51 size;
+#X obj 21 128 s vradio_rcv;
+#X text 314 160 label position;
+#X text 19 287 font properties;
+#X msg 316 234 label_pos \$1 \$2;
+#X msg 21 355 label_font \$1 \$2;
+#X text 70 311 1.font(0-2);
+#X text 70 332 2.height;
+#X text 365 183 1.x-offset;
+#X text 365 204 2.y-offset;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 -8 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 316 182 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 21 309 pd flash-time;
+#X text 175 287 preset-colors;
+#X text 314 287 RGB-colors;
+#X msg 175 391 color \$1 \$2 \$3;
+#N canvas 364 205 306 317 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 33 237 pack 0 0 0;
+#X obj 120 197 t b a;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 0 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-front empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 103 144 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 2;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X coords 0 -1 1 1 48 62 2 100 100;
+#X restore 175 309 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 96 410 route 0 1 2;
+#X obj 96 497 pack 0 0 0;
+#X obj 115 456 t b a;
+#X obj 168 455 t b a;
+#X obj 104 124 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X text 120 137 2.front;
+#X text 120 153 3.label;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 10 2 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 1 11 1;
+#X connect 13 0 11 0;
+#X connect 13 1 11 2;
+#X connect 14 0 9 1;
+#X connect 18 0 5 0;
+#X connect 19 0 6 0;
+#X connect 20 0 7 0;
+#X coords 0 -1 1 1 102 74 2 100 100;
+#X restore 315 306 pd flash-time;
+#X text 224 311 1.bg;
+#X text 224 331 2.front;
+#X text 224 352 3.label;
+#X text 174 448 delta;
+#X text 20 448 position;
+#X msg 21 545 pos \$1 \$2;
+#X msg 175 545 delta \$1 \$2;
+#X obj 175 521 list;
+#X obj 175 470 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 69 469 1.x-position;
+#X text 69 491 2.y-position;
+#X text 254 469 1.x-delta;
+#X text 254 491 2.y-delta;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 349 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 432 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 21 470 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 204 470 pd flash-time;
+#X obj 317 415 cnv 15 102 177 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 318 416 cnv 15 100 175 empty empty empty 20 12 0 14 -261682
+-66577 0;
+#X floatatom 350 567 5 0 0 0 - - -;
+#X obj 349 432 vradio 15 1 0 8 vradio_snd vradio_rcv myVradio 0 -8
+0 10 -262144 -33289 -33289 0;
+#X obj 316 259 s vradio_rcv;
+#X obj 21 380 s vradio_rcv;
+#X obj 175 416 s vradio_rcv;
+#X obj 21 570 s vradio_rcv;
+#X obj 175 570 s vradio_rcv;
+#X obj 111 128 s vradio_rcv;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [vradio] Set Properties through Messages;
+#X connect 2 0 23 0;
+#X connect 3 0 72 0;
+#X connect 4 0 72 0;
+#X connect 10 0 22 0;
+#X connect 17 0 19 0;
+#X connect 19 0 20 0;
+#X connect 24 0 21 0;
+#X connect 25 0 21 0;
+#X connect 26 0 9 0;
+#X connect 27 0 23 0;
+#X connect 28 0 32 0;
+#X connect 30 0 28 0;
+#X connect 35 0 67 0;
+#X connect 36 0 68 0;
+#X connect 41 0 35 0;
+#X connect 42 0 36 0;
+#X connect 45 0 69 0;
+#X connect 46 0 45 0;
+#X connect 47 0 45 0;
+#X connect 53 0 70 0;
+#X connect 54 0 71 0;
+#X connect 55 0 54 0;
+#X connect 56 0 55 0;
+#X connect 61 0 53 0;
+#X connect 62 0 55 1;
+#X connect 66 0 65 0;
+#X restore 100 410 pd Setting_vradio_properties_through_messages;
+#X text 98 496 15;
+#X text 168 496 - creating an [vradio] without any arguments sets default
+values for its gui-properties. See the subpatch below to learn how
+to dynamically instantiate a [vradio] object with custom properties:
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X text 98 372 bang;
+#X text 168 372 - output the current value.;
+#X connect 13 0 42 0;
+#X connect 24 0 38 0;
+#X connect 25 0 26 0;
+#X connect 28 0 38 0;
+#X connect 29 0 28 0;
+#X connect 30 0 38 0;
+#X connect 38 0 25 0;
+#X connect 38 0 37 0;
+#X connect 38 0 41 0;
+#X connect 39 0 38 0;
+#X connect 40 0 38 0;
+#X connect 41 0 27 0;
+#X connect 41 1 31 0;
+#X connect 41 2 32 0;
+#X connect 41 3 33 0;
+#X connect 41 4 34 0;
+#X connect 41 5 35 0;
+#X connect 41 6 36 0;
+#X connect 43 0 14 0;
diff --git a/doc/pddp/vslider-help.pd b/doc/pddp/vslider-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..24bf72cc723b95f9c5e2b70998c5a11e43c70005
--- /dev/null
+++ b/doc/pddp/vslider-help.pd
@@ -0,0 +1,435 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header vslider 3 12 0 18
+-204280 -1 0;
+#X obj 0 306 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 52 226 494 387 META 0;
+#X text 12 135 LIBRARY internal;
+#X text 12 175 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 45 LICENSE SIBSD;
+#X text 12 155 AUTHOR Miller Puckette;
+#X text 12 215 HELP_PATCH_AUTHORS This help patch was updated for Pd
+version 0.35 test 28 by Dave Sabine as part of a project called pddp
+proposed by Krzysztof Czaja to build comprehensive documentation for
+Pd. Jonathan Wilkes revised the patch to conform to the PDDP template
+for Pd version 0.42.;
+#X text 12 25 KEYWORDS control storage GUI nonlocal;
+#X text 12 65 DESCRIPTION vertical gui-slider;
+#X text 12 5 ALIAS vsl;
+#X text 12 85 INLET_0 float bang size range log init steady receive
+send label label_pos label_font color pos delta;
+#X text 12 115 OUTLET_0 float;
+#X text 12 195 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 436 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 490 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 574 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X obj 78 315 cnv 17 3 106 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#N canvas 68 461 428 129 Related_objects 0;
+#X obj 20 53 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 18 29 All iem-gui objects:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [vslider] Related Objects;
+#X restore 100 597 pd Related_objects;
+#X obj 78 445 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 314 float;
+#X text 98 445 float;
+#X text 54 259 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move a
+selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 168 445 - when the slider value is changed by clicking \, dragging
+\, or sending a float to the inlet \, the new slider value is sent
+to the outlet.;
+#N canvas 53 19 464 608 Setting_slider_properties_through_messages
+0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X floatatom 12 189 1 0 1 0 - #0-soc -;
+#X text 324 35 no init;
+#X text 9 170 steady-on-click;
+#X text 11 309 label;
+#X msg 11 329 label blabla;
+#X msg 324 54 init 0;
+#X msg 12 222 steady \$1;
+#X msg 235 74 lin;
+#X msg 245 106 log;
+#X text 231 35 linear/;
+#X text 231 50 logarithmical;
+#X text 333 74 init value;
+#X text 334 89 on loadbang;
+#X text 235 170 change send name;
+#X text 108 170 change receive name;
+#X obj 122 245 s z_rcv;
+#X msg 110 192 receive z_rcv;
+#X msg 21 381 label mySlider;
+#X msg 122 222 receive hsl_rcv;
+#X msg 237 193 send hsl1_snd;
+#X msg 246 222 send hsl_snd;
+#N canvas 234 255 161 292 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 73 \; \$1-xpos 391 \; \$1-ypos 200 \; \$1-xlabel -2 \; \$1-ylabel
+-8 \; \$1-soc 1 \; \$1-font-size 10 \; \$1-width 15 \; \$1-height 128
+\; \$1-bottom 0 \; \$1-top 127 \; \$1-bg 0 \; \$1-front 12 \; \$1-label
+12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 400 586 pd init;
+#X msg 334 110 init 1;
+#X msg 12 106 size \$1 \$2;
+#X text 61 57 1.width;
+#X text 61 78 2.height;
+#X text 173 57 1.bottom;
+#X text 173 78 2.top;
+#X text 121 35 output-range;
+#X msg 124 106 range \$1 \$2;
+#X text 242 308 font properties;
+#X msg 244 380 label_font \$1 \$2;
+#X text 293 330 1.font(0-2);
+#X text 293 351 2.height;
+#X text 120 309 label position;
+#X msg 122 380 label_pos \$1 \$2;
+#X text 171 330 1.x-offset;
+#X text 171 351 2.y-offset;
+#X obj 375 184 cnv 15 67 172 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 376 185 cnv 15 65 170 empty empty empty 20 12 0 14 -261682 -66577
+0;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-width empty
+0 -8 0 12 -262144 -1 -1 15 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-height empty
+0 -8 0 12 -262144 -1 -1 128 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 12 56 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-bottom empty
+0 -8 0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-top empty 0
+-8 0 12 -262144 -1 -1 127 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 124 56 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 -2 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 -8 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 122 329 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 244 329 pd flash-time;
+#X text 9 449 preset-colors;
+#X text 105 449 RGB-colors;
+#X msg 12 555 color \$1 \$2 \$3;
+#N canvas 364 205 306 317 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 33 237 pack 0 0 0;
+#X obj 120 197 t b a;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 0 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-front empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 103 144 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 2;
+#X connect 4 0 2 0;
+#X connect 5 0 0 0;
+#X connect 6 0 3 0;
+#X coords 0 -1 1 1 48 62 2 100 100;
+#X restore 12 470 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 96 410 route 0 1 2;
+#X obj 96 497 pack 0 0 0;
+#X obj 115 456 t b a;
+#X obj 168 455 t b a;
+#X obj 104 124 vradio 15 1 0 3 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X text 120 137 2.front;
+#X text 120 153 3.label;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 10 2 13 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 12 1 11 1;
+#X connect 13 0 11 0;
+#X connect 13 1 11 2;
+#X connect 14 0 9 1;
+#X connect 18 0 5 0;
+#X connect 19 0 6 0;
+#X connect 20 0 7 0;
+#X coords 0 -1 1 1 102 74 2 100 100;
+#X restore 109 470 pd flash-time;
+#X text 61 472 1.bg;
+#X text 61 492 2.front;
+#X text 61 513 3.label;
+#X text 318 449 delta;
+#X text 218 449 position;
+#X msg 219 541 pos \$1 \$2;
+#X msg 319 541 delta \$1 \$2;
+#X obj 319 518 list;
+#X obj 319 471 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 398 470 1.x-delta;
+#X text 398 492 2.y-delta;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 391 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 200 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 219 471 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 348 471 pd flash-time;
+#X floatatom 392 337 5 0 0 0 - - -;
+#X text 11 36 dimensions;
+#X text 267 470 1.x-pos;
+#X text 267 492 2.y-pos;
+#X obj 12 135 s vsl_rcv;
+#X obj 124 135 s vsl_rcv;
+#X obj 235 135 s vsl_rcv;
+#X obj 324 135 s vsl_rcv;
+#X obj 12 270 s vsl_rcv;
+#X obj 110 270 s vsl_rcv;
+#X obj 237 270 s vsl_rcv;
+#X obj 11 409 s vsl_rcv;
+#X obj 122 409 s vsl_rcv;
+#X obj 244 405 s vsl_rcv;
+#X obj 12 580 s vsl_rcv;
+#X obj 219 566 s vsl_rcv;
+#X obj 319 566 s vsl_rcv;
+#X obj 391 200 vsl 15 128 0 127 0 0 vsl_snd vsl_rcv mySlider -2 -8
+0 10 -262144 -33289 -33289 0 1;
+#X text 8 2 [vslider] Set Properties through Messages;
+#X connect 1 0 7 0;
+#X connect 5 0 74 0;
+#X connect 6 0 70 0;
+#X connect 7 0 71 0;
+#X connect 8 0 69 0;
+#X connect 9 0 69 0;
+#X connect 17 0 72 0;
+#X connect 18 0 74 0;
+#X connect 19 0 16 0;
+#X connect 20 0 73 0;
+#X connect 21 0 73 0;
+#X connect 23 0 70 0;
+#X connect 24 0 67 0;
+#X connect 30 0 68 0;
+#X connect 32 0 76 0;
+#X connect 36 0 75 0;
+#X connect 41 0 24 0;
+#X connect 42 0 30 0;
+#X connect 43 0 36 0;
+#X connect 44 0 32 0;
+#X connect 47 0 77 0;
+#X connect 48 0 47 0;
+#X connect 49 0 47 0;
+#X connect 55 0 78 0;
+#X connect 56 0 79 0;
+#X connect 57 0 56 0;
+#X connect 58 0 57 0;
+#X connect 61 0 55 0;
+#X connect 62 0 57 1;
+#X connect 80 0 63 0;
+#X restore 101 406 pd Setting_slider_properties_through_messages;
+#X text 430 3 abbreviation: [vsl];
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/vsl -text
+pdpedia: vsl;
+#X obj 57 213 ftom;
+#X floatatom 57 237 9 0 0 0 - - -;
+#X floatatom 104 213 9 0 0 0 - - -;
+#X floatatom 57 84 9 0 0 0 - - -;
+#X obj 57 106 mtof;
+#X text 97 177 (0.01 pixels);
+#X text 99 148 shift-click & drag;
+#X text 99 163 for fine-tuning;
+#X obj 57 132 vsl 15 73 55 3520 1 1 goo4_snd goo4_rcv log.freq. 20
+6 0 10 -261681 -260818 -90881 2244 1;
+#X text 380 170 names. Right-click and;
+#X text 380 155 send and receive names.;
+#X text 379 186 choose "Properties" to;
+#X text 380 200 set them \, or change them;
+#X text 380 214 with messages (see below);
+#X floatatom 250 216 4 0 0 0 - - -;
+#X msg 309 69 set \$1;
+#X floatatom 270 47 4 0 0 0 - - -;
+#X obj 250 240 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144
+-1 -1;
+#X obj 250 47 bng 15 250 50 0 empty empty empty 8 -8 0 10 -262144 -1
+-1;
+#X floatatom 309 48 4 0 0 0 - - -;
+#X floatatom 310 191 4 0 0 0 - - -;
+#X floatatom 309 100 4 0 0 0 - - -;
+#X obj 250 102 vsl 15 101 100 300 0 1 foo3_snd foo3_rcv empty 8 -8
+0 10 -225280 -1109 -1 5350 1;
+#X obj 309 143 s foo3_rcv;
+#X obj 310 169 r foo3_snd;
+#X msg 309 121 set \$1;
+#X obj 294 240 print;
+#N canvas 276 200 290 224 once 0;
+#X obj 38 24 inlet;
+#X obj 38 91 outlet;
+#X obj 38 69 t a b;
+#X obj 38 47 spigot 1;
+#X obj 97 47 0;
+#X connect 0 0 3 0;
+#X connect 2 0 1 0;
+#X connect 2 1 4 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 1;
+#X restore 294 216 pd once;
+#X text 98 374 Special messages can be sent to [vslider] to change
+its properties:;
+#N canvas 65 102 428 434 vsl-creation-arguments 0;
+#X text 22 226 For example \, click the msg-box to dynamically create
+a hsl:;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [vslider] Creation Arguments and Dynamic Patching;
+#X obj 23 290 s pd-vsl-creation-arguments;
+#X text 21 38 "vsl" can be called with 18 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X text 21 85 vsl creation arguments: xSize ySize rangeBtm rangeTop
+Logarithmic Init sendName receiveName Label labelXOff labelYOff Font#
+fontSize bgColor foregroundColor lblColor sliderPosition steadyOnClick
+;
+#X text 22 143 note: sliderPosition is not the same as the initialization
+value. To dynamically instantiate an hsl that initializes with a desired
+value \, save an hsl in a patch and view it in a text editor to get
+the right value for sliderPosition. Or \, refer to hslider_set in g_vslider.c
+for conversion between sliderPosition and slider value.;
+#X msg 23 248 obj 150 335 vsl 75 75 -1 1 0 1 send receive Merope 15
+-9 0 12 7 13 21 4400 0;
+#X connect 7 0 3 0;
+#X restore 170 551 pd vsl-creation-arguments;
+#X text 379 139 vslider has settable;
+#X text 11 21 vertical gui-slider;
+#X text 98 494 18;
+#X text 168 494 - creating a [vslider] object without arguments sets
+default values for its gui-properties. See the subpatch below to learn
+how to dynamically instantiate a [bng] object with custom properties:
+;
+#X text 168 314 - a float updates the slider value and is sent to the
+outlet.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 98 356 list;
+#X text 168 356 - a list is truncated to the first element.;
+#X text 98 339 bang;
+#X text 168 339 - output the current slider value.;
+#X connect 17 0 18 0;
+#X connect 20 0 21 0;
+#X connect 21 0 25 0;
+#X connect 25 0 17 0;
+#X connect 25 0 19 0;
+#X connect 31 0 34 0;
+#X connect 32 0 39 0;
+#X connect 33 0 39 0;
+#X connect 35 0 39 0;
+#X connect 36 0 32 0;
+#X connect 38 0 42 0;
+#X connect 39 0 31 0;
+#X connect 39 0 44 0;
+#X connect 41 0 37 0;
+#X connect 42 0 40 0;
+#X connect 44 0 43 0;
diff --git a/doc/pddp/vsnapshot~-help.pd b/doc/pddp/vsnapshot~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..755be25d00ffb4e4530698bb8df55dc41b906741
--- /dev/null
+++ b/doc/pddp/vsnapshot~-help.pd
@@ -0,0 +1,73 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header vsnapshot~ 3 12
+0 18 -204280 -1 0;
+#X obj 0 436 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 46 242 494 344 META 0;
+#X text 12 115 LIBRARY internal;
+#X text 12 155 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 135 AUTHOR Miller Puckette;
+#X text 12 195 HELP_PATCH_AUTHORS Updated for Pd v0.41. Revised by
+Jonathan Wilkes to conform to the PDDP template for Pd version 0.42.
+;
+#X text 12 5 KEYWORDS signal conversion;
+#X text 12 75 INLET_0 signal bang;
+#X text 12 95 OUTLET_0 float;
+#X text 12 175 RELEASE_DATE 1997;
+#X text 12 45 DESCRIPTION precision conversion of a signal to a number
+on demand;
+#X restore 500 597 pd META;
+#X obj 0 501 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 538 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 566 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 542 (none);
+#N canvas 54 478 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 snapshot~;
+#X text 8 2 [vsnapshot~] Related Objects;
+#X restore 102 598 pd Related_objects;
+#X obj 79 445 cnv 17 3 45 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 509 float;
+#X obj 79 510 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 11 23 precision conversion of a signal to a number on demand
+;
+#X obj 463 3 vsnapshot~;
+#X obj 431 20 pddp/pddplink http://wiki.puredata.info/en/vsnapshot~
+-text pdpedia: vsnapshot~;
+#X floatatom 80 308 0 0 0 0 - - -;
+#X msg 91 233 bang;
+#X text 154 310 This output updates each time bang is clicked above.
+;
+#X obj 80 208 osc~ 0.1;
+#X text 85 190 0.1 Hz cosine;
+#X text 163 208 signal in to take snapshots of;
+#X text 134 232 bang -- take one snapshot;
+#X obj 80 285 vsnapshot~;
+#X text 73 55 The [vsnapshot~] object is a high-precision version of
+[snapshot~]. It takes a signal and converts it to a control value whenever
+it receives a bang in its left outlet. This object is particularly
+useful for monitoring outputs.;
+#X text 98 444 signal;
+#X text 168 444 - the incoming signal.;
+#X text 98 464 bang;
+#X text 73 118 In the example below \, a [vsnapshot~] object prints
+out the values of a low frequency cosine wave every time it is sent
+a bang message.;
+#X text 168 464 - a bang takes the current sample from the signal \,
+converts it to a float \, and sends it to the outlet.;
+#X text 168 509 - the outgoing value.;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 16 0 22 0;
+#X connect 18 0 22 0;
+#X connect 22 0 15 0;
+#X connect 22 0 15 0;
diff --git a/doc/pddp/vu-help.pd b/doc/pddp/vu-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cb973ce815143cca7be74ced71b5f605dc1bc6d6
--- /dev/null
+++ b/doc/pddp/vu-help.pd
@@ -0,0 +1,375 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header vu 3 12 0 18 -204280
+-1 0;
+#X obj 0 287 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 53 246 494 344 META 0;
+#X text 12 155 LIBRARY internal;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 175 AUTHOR Thomas Musil;
+#X text 12 195 WEBSITE;
+#X text 12 5 KEYWORDS control GUI nonlocal;
+#X text 12 45 DESCRIPTION gui-vu-meter-display;
+#X text 12 65 INLET_0 float list bang size scale receive label label_pos
+label_font color pos delta;
+#X text 12 95 INLET_1 float;
+#X text 12 115 OUTLET_0 float;
+#X text 12 135 OUTLET_1 float;
+#X text 12 215 RELEASE_DATE 2002;
+#X text 12 235 HELP_PATCH_AUTHORS Jonathan Wilkes revised the patch
+to conform to the PDDP template for Pd version 0.42.;
+#X restore 500 597 pd META;
+#X obj 0 435 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 489 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 572 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 81 462 428 126 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [vu] Related Objects;
+#X obj 22 91 x_all_guis bng tgl vsl hsl hradio vradio vu cnv nbx;
+#X text 20 67 All iem-gui objects:;
+#X obj 23 43 env~;
+#X restore 92 597 pd Related_objects;
+#X obj 78 296 cnv 17 3 90 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X text 98 295 float;
+#X obj 78 444 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 396 cnv 17 3 30 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X obj 465 20 pddp/pddplink http://wiki.puredata.info/en/vu -text pdpedia:
+vu;
+#X text 98 312 list;
+#X text 98 396 float;
+#X text 98 412 list;
+#X text 168 312 - a 2-item list will be distributed to the two inlets
+;
+#X text 98 444 float;
+#X obj 78 466 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+-162280 0;
+#X text 98 466 float;
+#N canvas 76 117 428 416 vu-creation-arguments 0;
+#X obj 25 237 s pd-vu-creation-arguments;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [vu] Creation Arguments;
+#X text 22 163 For example \, click the msg-box to dynamically create
+a [vu]:;
+#X text 23 98 [vu] creation arguments: xSize ySize receiveName Label
+labelXOff labelYOff font# fontSize bgColor labelColor Scale Unknown(0)
+;
+#X text 22 38 [vu] can be called with 12 creation arguments. These
+are not "optional" - all parameters must be filled or the gui-bng will
+not instantiate correctly.;
+#X msg 25 195 obj 160 280 vu 15 120 fff Elektra -15 -12 0 12 26 12
+0 0;
+#X connect 6 0 0 0;
+#X restore 170 549 pd vu-creation-arguments;
+#N canvas 75 10 428 611 Changing_GUI_Properties 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X floatatom 130 62 1 0 1 0 - #0-scale -;
+#X text 124 38 display scale;
+#X msg 130 116 scale \$1;
+#X obj 130 141 s vu_rcv;
+#X text 213 38 change receive name;
+#X obj 215 141 s vu_rcv;
+#X msg 215 62 receive vu12_rcv;
+#X obj 231 114 s vu12_rcv;
+#X msg 231 89 receive vu_rcv;
+#X msg 339 61 label blabla;
+#X obj 339 141 s vu_rcv;
+#X text 339 38 label;
+#N canvas 378 326 151 256 init 0;
+#X obj 16 11 loadbang;
+#X obj 16 42 f \$0;
+#X msg 16 73 \; \$1-xpos 330 \; \$1-ypos 245 \; \$1-scale 1 \; \$1-xlabel
+-1 \; \$1-ylabel -8 \; \$1-label 12 \; \$1-font-size 10 \; \$1-width
+15 \; \$1-height 120 \; \$1-font 0 \; \$1-bg 12 \; \$1-bg 12;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 352 404 pd init;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-width empty
+0 -8 0 12 -262144 -1 -1 15 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-height empty
+0 -8 0 12 -262144 -1 -1 120 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 22 59 pd flash-time;
+#X text 19 38 dimensions;
+#X text 71 61 1.width;
+#X text 71 81 2.height;
+#X msg 22 116 size \$1 \$2;
+#X obj 22 141 s vu_rcv;
+#X text 20 175 label position;
+#X text 152 175 font properties;
+#X msg 22 250 label_pos \$1 \$2;
+#X msg 154 250 label_font \$1 \$2;
+#X text 203 199 1.font(0-2);
+#X text 203 220 2.height;
+#X text 71 198 1.x-offset;
+#X text 71 219 2.y-offset;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xlabel empty
+0 -8 0 12 -262144 -1 -1 -1 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ylabel empty
+0 -8 0 12 -262144 -1 -1 -8 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 22 197 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 0 2 0 0 \$0-dummy \$0-font empty 0 -8 0 12
+-262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-font-size empty
+0 -8 0 12 -262144 -1 -1 10 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 154 197 pd flash-time;
+#X text 22 310 preset-colors;
+#X text 131 310 RGB-colors;
+#N canvas 364 205 169 292 flash-time 0;
+#X obj 69 196 t b a;
+#X obj 33 262 outlet;
+#X obj 103 104 nbx 3 14 0 29 0 0 \$0-dummy \$0-bg empty 0 -8 0 12 -262144
+-1 -1 12 256;
+#X obj 103 124 nbx 3 14 0 29 0 0 \$0-dummy \$0-label empty 0 -8 0 12
+-262144 -1 -1 12 256;
+#X obj 33 237 pack 0 0;
+#X connect 0 0 4 0;
+#X connect 0 1 4 1;
+#X connect 2 0 4 0;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 22 332 pd flash-time;
+#N canvas 0 0 306 317 flash-time 0;
+#X obj 96 521 outlet;
+#X obj 162 230 t b f;
+#X obj 96 268 +;
+#X obj 96 293 t b f;
+#X obj 96 324 +;
+#X obj 19 208 * -65536;
+#X obj 96 208 * -256;
+#X obj 162 208 * -1;
+#X obj 96 355 - 1;
+#X obj 96 385 list prepend 0;
+#X obj 115 456 t b a;
+#X obj 104 124 vradio 15 1 0 2 empty empty empty 0 -8 0 10 -262144
+-1 -1 0;
+#X text 120 120 1.bg;
+#X obj 103 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-r empty 0 -8 0 10 -262144
+-258113 -1 0 256;
+#X obj 133 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-g empty 0 -8 0 10 -262144
+-13381 -1 0 256;
+#X obj 163 105 nbx 3 14 0 255 0 0 \$0-dummy \$0-b empty 0 -8 0 10 -262144
+-4160 -1 0 256;
+#X text 120 137 2.label;
+#X obj 96 410 route 0 1;
+#X obj 96 497 pack 0 0;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 2 0;
+#X connect 7 0 1 0;
+#X connect 8 0 9 0;
+#X connect 9 0 17 0;
+#X connect 10 0 18 0;
+#X connect 10 1 18 1;
+#X connect 11 0 9 1;
+#X connect 13 0 5 0;
+#X connect 14 0 6 0;
+#X connect 15 0 7 0;
+#X connect 17 0 18 0;
+#X connect 17 1 10 0;
+#X connect 18 0 0 0;
+#X coords 0 -1 1 1 102 58 2 100 100;
+#X restore 132 332 pd flash-time;
+#X text 71 334 1.bg;
+#X text 71 354 2.label;
+#X msg 22 407 color \$1 \$2;
+#X text 153 463 delta;
+#X text 21 463 position;
+#X msg 22 560 pos \$1 \$2;
+#X msg 154 560 delta \$1 \$2;
+#X obj 154 536 list;
+#X obj 154 485 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 70 484 1.x-position;
+#X text 70 506 2.y-position;
+#X text 233 484 1.x-delta;
+#X text 233 506 2.y-delta;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-xpos empty 0
+-8 0 12 -262144 -1 -1 330 256;
+#X obj 103 124 nbx 3 14 -1e+37 1e+37 0 0 \$0-dummy \$0-ypos empty 0
+-8 0 12 -262144 -1 -1 245 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 22 485 pd flash-time;
+#N canvas 366 206 174 259 flash-time 0;
+#X obj 68 180 pack;
+#X obj 103 149 t b a;
+#X obj 68 205 outlet;
+#X obj 103 104 nbx 3 14 -20 20 0 0 \$0-dummy \$0-xdelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X obj 103 124 nbx 3 14 -20 20 0 0 \$0-dummy \$0-ydelta empty 0 -8
+0 12 -262144 -1 -1 0 256;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 1 1 0 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X coords 0 -1 1 1 48 42 2 100 100;
+#X restore 183 485 pd flash-time;
+#X obj 296 213 cnv 15 102 177 empty empty empty 20 12 0 14 -1 -66577
+0;
+#X obj 297 214 cnv 15 100 175 empty empty empty 20 12 0 14 -261682
+-66577 0;
+#X obj 22 275 s vu_rcv;
+#X obj 154 275 s vu_rcv;
+#X obj 22 432 s vu_rcv;
+#X obj 154 585 s vu_rcv;
+#X obj 22 585 s vu_rcv;
+#X text 6 2 [vu] Changing Properties through Messages;
+#X msg 349 114 label my-vu;
+#X obj 330 245 vu 15 120 vu_rcv my-vu -1 -8 0 10 -33289 -33289 1 0
+;
+#X connect 1 0 3 0;
+#X connect 3 0 4 0;
+#X connect 7 0 6 0;
+#X connect 9 0 8 0;
+#X connect 10 0 11 0;
+#X connect 14 0 18 0;
+#X connect 18 0 19 0;
+#X connect 22 0 51 0;
+#X connect 23 0 52 0;
+#X connect 28 0 22 0;
+#X connect 29 0 23 0;
+#X connect 32 0 36 0;
+#X connect 33 0 36 0;
+#X connect 36 0 53 0;
+#X connect 39 0 55 0;
+#X connect 40 0 54 0;
+#X connect 41 0 40 0;
+#X connect 42 0 41 0;
+#X connect 47 0 39 0;
+#X connect 48 0 41 1;
+#X connect 57 0 11 0;
+#X restore 172 375 pd Changing_GUI_Properties;
+#X text 97 345 see the following subpatch for messages that change
+the gui-properties of [vu]:;
+#X text 168 493 - creating a [vu] without any arguments will set default
+values for all gui-properties. See the subpatch below to learn how
+to dynamically instantiate a [vu] object with custom properties:;
+#X text 170 239 Use the UP- \, DOWN- \, LEFT- or RIGHT-key to move
+a selected gui-object. Right-click and choose "Properties" to modify
+its appearance.;
+#X text 341 111 and receive names. Right-;
+#X text 341 126 click and choose;
+#X text 340 142 "Properties" to set them \,;
+#X text 341 156 or change them with messages;
+#X text 341 170 (see the subpatch below);
+#X floatatom 259 90 7 -110 20 1 dB - -;
+#X obj 42 48 tgl 15 1 empty empty empty 8 -8 0 10 -262144 -1 -1 0 1
+;
+#X obj 43 125 vu 15 120 foo7_rcv vu-meter 60 0 0 10 -1 -355 1 0;
+#X floatatom 42 259 6 0 0 1 dB - -;
+#X floatatom 104 259 6 0 0 1 dB - -;
+#X text 108 68 <list> of rms \, peak;
+#X obj 259 197 s foo7_rcv;
+#X obj 259 168 pack 0 0;
+#X floatatom 277 113 7 -110 20 1 dB - -;
+#X obj 277 138 t b f;
+#X floatatom 52 90 7 -110 20 1 dB - -;
+#X floatatom 120 90 7 -110 20 1 dB - -;
+#N canvas 44 136 290 278 source 0;
+#X obj 40 95 random 102;
+#X obj 40 171 - 101;
+#X obj 40 205 pack 0 0;
+#X obj 40 45 metro 300;
+#X obj 40 69 t b b;
+#X obj 133 95 random 20;
+#X obj 40 117 t f f;
+#X obj 91 147 +;
+#X obj 91 172 - 101;
+#X obj 40 21 inlet;
+#X obj 40 250 outlet;
+#X obj 100 249 s fff;
+#X obj 159 249 s vu_rcv;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 2 0 10 0;
+#X connect 2 0 11 0;
+#X connect 2 0 12 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 4 1 5 0;
+#X connect 5 0 7 1;
+#X connect 6 0 1 0;
+#X connect 6 1 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 2 1;
+#X connect 9 0 3 0;
+#X restore 42 68 pd source;
+#X text 340 95 [vu] has settable send;
+#X text 11 23 gui-vu-meter-display;
+#X text 98 493 12;
+#X text 168 295 - rms level.;
+#X text 168 396 - peak-level.;
+#X text 168 412 - a list will be truncated to the first element.;
+#X text 168 444 - rms level.;
+#X text 168 466 - peak-level.;
+#X text 98 328 bang;
+#X text 168 328 - a bang will output the current values of the inlets.
+;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X connect 30 0 37 0;
+#X connect 31 0 42 0;
+#X connect 32 0 33 0;
+#X connect 32 1 34 0;
+#X connect 37 0 36 0;
+#X connect 38 0 39 0;
+#X connect 39 0 37 0;
+#X connect 39 1 37 1;
+#X connect 40 0 32 0;
+#X connect 41 0 32 1;
+#X connect 42 0 32 0;
diff --git a/doc/pddp/wrap~-help.pd b/doc/pddp/wrap~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..68f1d56081db7e775d9b0ceaafdf1872f282e85b
--- /dev/null
+++ b/doc/pddp/wrap~-help.pd
@@ -0,0 +1,70 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header wrap~ 3 12 0 18
+-204280 -1 0;
+#X obj 0 428 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 50 243 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.33. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION remainder modulo 1;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 OUTLET_0 signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 503 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 540 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 568 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#X text 98 544 (none);
+#N canvas 104 481 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 22 43 wrap;
+#X text 8 2 [wrap~] Related Objects;
+#X restore 102 597 pd Related_objects;
+#X obj 78 437 cnv 17 3 55 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 512 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 482 3 wrap~;
+#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/wrap~ -text
+pdpedia: wrap~;
+#X obj 94 243 metro 500;
+#X floatatom 78 144 0 0 0 0 - - -;
+#X floatatom 78 290 0 0 0 0 - - -;
+#X obj 78 267 snapshot~;
+#X obj 78 170 sig~;
+#X obj 78 194 wrap~;
+#X obj 94 218 loadbang;
+#X text 111 144 <- shift-drag here to get non-integers to try;
+#X text 98 436 signal;
+#X text 98 457 float;
+#X text 98 477 list;
+#X text 168 477 - a list will be truncated to the first item.;
+#X text 98 511 signal;
+#X text 11 23 remainder modulo 1;
+#X text 168 436 - the incoming signal.;
+#X text 168 457 - a float will automatically be converted to a signal.
+;
+#X text 74 317 [wrap~] gives the difference between the input and the
+largest integer not exceeding it (for positive numbers this is the
+fractional part).;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 13 0 16 0;
+#X connect 14 0 17 0;
+#X connect 16 0 15 0;
+#X connect 17 0 18 0;
+#X connect 18 0 16 0;
+#X connect 19 0 13 0;
+#X connect 19 0 13 0;
diff --git a/doc/pddp/writesf~-help.pd b/doc/pddp/writesf~-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..370a5920082cedd743f1b0bf42d88f2a32bf9758
--- /dev/null
+++ b/doc/pddp/writesf~-help.pd
@@ -0,0 +1,99 @@
+#N canvas 0 0 555 619 10;
+#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header writesf~ 3 12 0
+18 -204280 -1 0;
+#X obj 0 267 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#N canvas 51 246 494 344 META 0;
+#X text 12 105 LIBRARY internal;
+#X text 12 145 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 25 LICENSE SIBSD;
+#X text 12 125 AUTHOR Miller Puckette;
+#X text 12 185 HELP_PATCH_AUTHORS Updated for Pd version 0.37. Jonathan
+Wilkes revised the patch to conform to the PDDP template for Pd version
+0.42.;
+#X text 12 5 KEYWORDS signal;
+#X text 12 45 DESCRIPTION write audio signals to a soundfile;
+#X text 12 65 INLET_0 signal open start stop print;
+#X text 12 85 INLET_N signal;
+#X text 12 165 RELEASE_DATE 1997;
+#X restore 500 597 pd META;
+#X obj 0 498 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 107 479 428 109 Related_objects 0;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X text 8 2 [writesf~] Related Objects;
+#X obj 22 43 readsf~;
+#X obj 80 43 soundfiler;
+#X restore 102 597 pd Related_objects;
+#X obj 78 276 cnv 17 3 183 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+-162280 0;
+#X obj 78 465 cnv 17 3 17 empty \$0-pddp.cnv.let.n n 5 9 0 16 -228856
+-162280 0;
+#X obj 472 3 writesf~;
+#X obj 441 20 pddp/pddplink http://wiki.puredata.info/en/writesf~ -text
+pdpedia: writesf~;
+#X text 98 502 (none);
+#X msg 77 179 print;
+#X msg 9 103 bang;
+#X msg 76 135 start;
+#X msg 78 157 stop;
+#X obj 9 134 del 1000;
+#X obj 67 223 writesf~ 2;
+#X msg 67 65 open /tmp/foo.wav;
+#X obj 81 201 osc~ 440;
+#X msg 67 111 open -bytes 4 /tmp/foo.wav;
+#X text 176 64 create a new 16-bit soundfile;
+#X text 233 88 create 24-bit soundfile;
+#X text 232 111 create 32-bit floating-point soundfile;
+#X msg 67 88 open -bytes 3 /tmp/foo.wav;
+#X text 11 23 write audio signals to a soundfile;
+#X text 98 275 signal;
+#X text 98 292 open;
+#X text 98 415 start;
+#X text 98 430 stop;
+#X text 98 445 print;
+#X text 98 464 signal;
+#X text 167 464 - an additional inlet is created for each channel specified
+by the creation argument.;
+#X text 202 328 -wave \, -nextstep \, -aiff;
+#X text 203 343 -big \, -little (nextstep only!);
+#X text 203 358 -bytes <2 \, 3 \, or 4>;
+#X text 203 374 -rate <sample rate>;
+#X text 167 389 (setting sample rate will affect the soundfile header
+but the file will _not_ be resampled.);
+#X text 168 292 - the "open" message creates a new soundfile that can
+be written to. The "open" message may take flag-style arguments as
+follows:;
+#X text 168 415 - start streaming audio to disk.;
+#X text 168 430 - stop streaming audio to disk.;
+#X text 149 206 The soundfile is 2- or 3-byte fixed point ("pcm") or
+4-byte floating-point. The soundfile format is determined by the file
+extent ("foo.wav" \, "foo.aiff" \, or "foo.snd").;
+#X text 149 138 [writesf~] creates a subthread whose task is to write
+audio streams to disk. You need not provide any disk access time between
+"open" and "start" \, but between "stop" and the next "open" you must
+give the object time to flush all the output to disk.;
+#X text 168 445 - print debugging information.;
+#X text 168 275 - the incoming signal is written to the file.;
+#X text 168 544 - the creation argument is the number of channels (1
+to 64).;
+#X text 80 544 1) float;
+#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide;
+#X obj 455 51 pddp/dsp;
+#X connect 13 0 18 0;
+#X connect 14 0 15 0;
+#X connect 14 0 17 0;
+#X connect 15 0 18 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 19 0 18 0;
+#X connect 20 0 18 0;
+#X connect 21 0 18 0;
+#X connect 25 0 18 0;
diff --git a/doc/pddp/x_all_guis.pd b/doc/pddp/x_all_guis.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e300eb07fa4405a20f264ba14114825a838bf083
--- /dev/null
+++ b/doc/pddp/x_all_guis.pd
@@ -0,0 +1,19 @@
+#N canvas 209 342 290 271 10;
+#X obj 23 31 bng 15 250 50 0 \$1 \$1 empty 20 8 0 8 -262144 -1 -1;
+#X obj 23 63 tgl 15 1.04858e+006 \$2 \$2 empty 20 8 0 8 -262144 -1
+-1 0 1;
+#X obj 22 95 vsl 15 128 0 127 0 1.04858e+006 \$3 \$3 empty 20 8 0 8
+-262144 -1 -1 0 1;
+#X obj 65 30 hsl 128 15 0 127 0 0 \$4 \$4 empty 20 8 0 8 -262144 -1
+-1 0 1;
+#X obj 63 63 hdl 15 1 2.6624e+006 8 \$5 \$5 empty 20 8 192 8 -262144
+-1 -1 0;
+#X obj 62 99 vu 15 120 \$6 empty 35 8 0 8 -66577 -1 1 0;
+#X obj 115 99 cnv 15 100 60 \$7 \$7 \$7 20 12 0 14 -233017 -66577 1.04858e+006
+;
+#X obj 41 308 inlet;
+#X obj 41 334 outlet;
+#X obj 227 30 vdl 15 1 4.79232e+006 8 \$9 \$9 empty 20 8 192 8 -262144
+-1 -1 0;
+#X obj 116 176 nbx 5 14 -1e+037 1e+037 0 0 \$8 \$8 empty 45 7 0 10
+-262144 -1 -1 88 256;
diff --git a/doc/pddp/zexy.pd b/doc/pddp/zexy.pd
new file mode 100644
index 0000000000000000000000000000000000000000..37e1f7814543e6cb8ca067e9647192e8bdfd0971
--- /dev/null
+++ b/doc/pddp/zexy.pd
@@ -0,0 +1,317 @@
+#N canvas 5 7 745 601 10;
+#X declare -lib zexy;
+#X msg 81 59 help;
+#N canvas 259 142 708 221 io~ 0;
+#X obj 41 184 sfplay;
+#X obj 137 185 sfrecord;
+#X msg 41 162 help;
+#X msg 137 163 help;
+#X text 297 186 harddisk-recording tools;
+#X text 144 19 input~/output~ objects;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X restore 54 187 pd io~;
+#N canvas 320 195 583 254 generators~ 0;
+#X obj 125 173 noisi~;
+#X msg 125 151 help;
+#X msg 29 149 help;
+#X msg 125 103 help;
+#X msg 29 101 help;
+#X obj 29 171 noish~;
+#X obj 29 123 dirac~;
+#X obj 125 125 step~;
+#X text 296 174 bandlimited noise~ generators;
+#X text 290 127 scientific test-functions;
+#X text 152 26 generator~ objects;
+#X connect 1 0 0 0;
+#X connect 2 0 5 0;
+#X connect 3 0 7 0;
+#X connect 4 0 6 0;
+#X restore 54 212 pd generators~;
+#N canvas 362 224 657 505 processing~ 0;
+#X obj 52 93 limiter~;
+#X obj 51 143 quantize~;
+#X obj 52 193 swap~;
+#X msg 51 121 help;
+#X msg 52 71 help;
+#X msg 52 171 help;
+#X text 280 92 a limiter/compressor module;
+#X text 121 16 signal~processing objects;
+#X text 280 131 quantizes signals by various degrees;
+#X text 281 186 byte-swapps a 16bit signal;
+#X obj 55 254 z~;
+#X msg 55 231 help;
+#X text 245 228 a samplewise delay \, great for designing FIR-filters
+;
+#X text 253 247 (you cannot use it for IIR-filters !);
+#X obj 62 336 blockswap~;
+#X msg 62 314 help;
+#X text 244 339 swap upper and lower part of a signal-block;
+#X msg 62 374 help;
+#X obj 62 396 blockmirror~;
+#X text 244 399 revert a signal-block (play it back reversely);
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 5 0 2 0;
+#X connect 11 0 10 0;
+#X connect 15 0 14 0;
+#X connect 17 0 18 0;
+#X restore 54 236 pd processing~;
+#N canvas 319 68 585 573 analytic~ 0;
+#X obj 26 173 sigzero~;
+#X msg 26 151 help;
+#X text 164 171 detects whether a signal-block is zero throughout or
+not;
+#X obj 25 236 pdf~;
+#X msg 25 213 help;
+#X text 165 237 get the probability density function of a signal;
+#X text 130 48 signal~analyzing objectsd;
+#X obj 27 303 envrms~;
+#X obj 28 356 avg~;
+#X obj 29 407 tavg~;
+#X msg 27 282 help;
+#X msg 28 335 help;
+#X msg 29 386 help;
+#X text 158 300 the same as env~ \, except that this outputs rms instead
+of dB;
+#X text 158 356 arithmetic mean of one signal~vector;
+#X text 161 407 arithmetic mean between two bangs;
+#X msg 31 448 help;
+#X obj 31 469 dfreq~;
+#X text 164 469 frequency detector;
+#X connect 1 0 0 0;
+#X connect 4 0 3 0;
+#X connect 10 0 7 0;
+#X connect 11 0 8 0;
+#X connect 12 0 9 0;
+#X connect 16 0 17 0;
+#X restore 54 261 pd analytic~;
+#N canvas 299 114 664 548 others~ 0;
+#X obj 31 70 nop~;
+#X msg 31 48 help;
+#X text 246 63 do_nothing but delay for one-block (useful for synchronising)
+;
+#X text 175 11 miscanellous signal~ objects;
+#X msg 31 127 help;
+#X obj 31 149 pack~;
+#X msg 77 128 help;
+#X obj 77 150 unpack~;
+#X text 245 138 convert a signal to (packages of) floats and vice-versa
+;
+#X msg 31 350 help;
+#X msg 32 394 help;
+#X obj 31 371 multiplex~;
+#X obj 32 415 demultiplex~;
+#X msg 129 350 help;
+#X msg 130 393 help;
+#X obj 129 371 mux~;
+#X obj 130 415 demux~;
+#X text 245 416 multiplex 1 IN~signal to 1-of-n OUT~signals;
+#X text 246 369 multiplex 1-of-n IN~signals to 1 OUT~signal;
+#X msg 31 297 help;
+#X obj 31 319 multiline~;
+#X text 239 316 a line~d multiplication for multiple streams;
+#X connect 1 0 0 0;
+#X connect 4 0 5 0;
+#X connect 6 0 7 0;
+#X connect 9 0 11 0;
+#X connect 10 0 12 0;
+#X connect 13 0 15 0;
+#X connect 14 0 16 0;
+#X connect 19 0 20 0;
+#X restore 54 332 pd others~;
+#X text 269 183 alternative i/o-devices (harddisk \, net \, ...);
+#X text 268 207 useful signal generators;
+#X text 271 231 process your own signals;
+#X text 270 257 and analyze them;
+#X text 270 328 none of the above;
+#N canvas 0 0 591 430 sigbinops~ 0;
+#X obj 81 96 >~;
+#X obj 81 129 <~;
+#X obj 81 162 ==~;
+#X obj 81 244 &&~;
+#X obj 81 277 ||~;
+#X text 159 95 greater;
+#X text 158 131 less;
+#X text 157 165 equal;
+#X text 156 246 logical AND;
+#X text 154 278 logical OR;
+#X obj 80 347 abs~;
+#X obj 80 375 sgn~;
+#X text 158 348 absolute value (I think this is included at GEM too)
+;
+#X text 158 375 sign of a function;
+#X text 148 32 binary and math operators for signals~;
+#X restore 54 286 pd sigbinops~;
+#X text 269 284 some mathematical and logical functions that were missing
+;
+#N canvas 266 0 630 542 basic 0;
+#X obj 41 28 nop;
+#X text 222 28 a do nothing - pass through everything;
+#X obj 41 85 lister;
+#X obj 98 86 l;
+#X text 216 87 store a list (like "float" \, "int" \, ...);
+#X text 83 86 ==;
+#X obj 40 244 repack;
+#X text 211 242 (re)packs atoms to packages of a given size;
+#X obj 40 275 packel;
+#X text 209 272 the specified element of a list;
+#X obj 39 316 niagara;
+#X text 214 315 split 1 package into 2 at a specifique point;
+#X obj 43 464 segregate;
+#X text 210 463 segregates the input to various outputs depending on
+the type;
+#X text 210 117 convert anythings to lists;
+#X obj 41 115 any2list;
+#X text 101 115 ==;
+#X obj 119 115 a2l;
+#X obj 39 215 length;
+#X text 210 214 get the length of a list;
+#X obj 41 351 glue;
+#X text 216 345 append a list to another;
+#X obj 42 409 list2symbol;
+#X text 123 410 ==;
+#X obj 140 409 l2s;
+#X text 207 410 convert a list into a single symbol;
+#X obj 40 147 repeat 0;
+#X text 211 148 repeat a message N-times;
+#X restore 52 446 pd basic control;
+#N canvas 401 27 602 871 advanced 0;
+#X obj 28 129 makesymbol;
+#X msg 28 107 help;
+#X text 202 129 concatenate lists to formatted symbols;
+#X msg 28 154 help;
+#X obj 28 176 date;
+#X msg 67 154 help;
+#X obj 67 176 time;
+#X text 201 173 get the current system date/time;
+#X obj 28 229 index;
+#X msg 28 207 help;
+#X text 202 226 map symbols to indices;
+#X text 166 384 (no "help"-message available...);
+#X obj 28 433 demultiplex;
+#X obj 128 433 demux;
+#X text 109 434 ==;
+#X text 199 434 demultiplex the inlet to a specified outlet;
+#X obj 28 485 drip;
+#X text 201 484 extract the atoms of a package (opt. scheduled);
+#X msg 28 278 help;
+#X obj 28 302 msgfile;
+#X text 197 300 a powerful "textfile" derivative;
+#X obj 28 629 lpt;
+#X text 200 625 write data to the parallel port (line printer);
+#X text 109 454 ==;
+#X obj 28 453 multiplex;
+#X obj 128 453 mux;
+#X text 200 456 multiplex the specified inlet to the outlet;
+#X obj 28 672 operating_system;
+#X text 209 676 get the current operating system;
+#X obj 31 553 fifop;
+#X text 195 554 a FIFO (first-in-first-out) with Priorities;
+#X obj 31 583 lifop;
+#X text 195 584 a LIFO (last-in-first-out) with Priorities;
+#X obj 28 350 strcmp;
+#X text 194 354 compare to symbols with strcmp();
+#X connect 1 0 0 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 9 0 8 0;
+#X connect 18 0 19 0;
+#X restore 53 478 pd advanced control;
+#X text 265 477 some more complex control objects (systime \, tabread4
+\, ...);
+#X text 262 446 some useful control objects (nop...);
+#X text 268 567 objects to work with matrices (moved to IEMMATRIX)
+;
+#N canvas 221 231 583 258 matrix 0;
+#X obj 224 173 iemmatrix;
+#X text 109 52 zexy>=2.0 no longer has any matrix-objects.;
+#X text 109 72 instead \, these objects are now in a separate library
+"iemmatrix" \, dedicated solely to manipulation of 2D-matrices.;
+#X text 185 171 use;
+#X restore 53 570 pd matrix;
+#N canvas 0 0 616 602 numeric 0;
+#X obj 39 46 list2int;
+#X text 94 47 ==;
+#X obj 112 47 l2i;
+#X obj 41 85 atoi;
+#X text 207 49 cast each float of a list/anything to an integer;
+#X text 209 83 ascii to integer;
+#X obj 42 435 sort;
+#X text 208 438 shell-sort a package of floats;
+#X obj 42 303 mavg;
+#X msg 42 283 help;
+#X text 214 307 a moving average filter;
+#X obj 41 346 mean;
+#X msg 41 327 help;
+#X msg 40 367 help;
+#X obj 40 386 minmax;
+#X text 209 343 get the mean value of a list of floats (==vector);
+#X text 208 383 get the minimum and the maximum of a vector;
+#X obj 43 223 .;
+#X text 209 225 scalar multiplication of 2 vectors;
+#X obj 43 158 prime;
+#X text 200 162 check whether a number is prime;
+#X obj 43 259 sum;
+#X text 194 252 elementwise sum of a list;
+#X obj 44 137 wrap;
+#X text 196 139 wrap a number between an upper and a lower bound;
+#X obj 50 505 urn;
+#X text 199 502 Unique-Random-Numbers: get random numbers from an urn
+;
+#X connect 9 0 8 0;
+#X connect 12 0 11 0;
+#X connect 13 0 14 0;
+#X restore 51 378 pd numeric objects;
+#X text 262 376 objects dealing with numbers;
+#N canvas 306 127 571 219 tables 0;
+#X msg 29 16 help;
+#X obj 29 35 tabdump table;
+#X text 205 33 dump a table as a list of floats;
+#X msg 30 55 help;
+#X obj 30 74 tabset table;
+#X text 206 72 set a table with a list of floats;
+#X msg 29 106 help;
+#X obj 29 125 tabminmax table;
+#X text 208 128 get minimum and maximum;
+#X connect 0 0 1 0;
+#X connect 3 0 4 0;
+#X connect 6 0 7 0;
+#X restore 53 508 pd tables;
+#X text 268 517 objects to work on tables;
+#N canvas 0 0 701 577 conversions 0;
+#X obj 65 95 cart2sph;
+#X obj 65 115 cart2pol;
+#X obj 65 155 sph2pol;
+#X obj 65 175 sph2cart;
+#X obj 65 224 pol2cart;
+#X obj 65 247 pol2sph;
+#X text 84 67 coordinate-conversion;
+#X text 186 168 convert between Cartesian \, polar and spherical corrdinates
+;
+#X obj 72 334 deg2rad;
+#X obj 72 362 rad2deg;
+#X text 146 350 convert between degree and radiant;
+#X restore 52 402 pd conversions;
+#X text 259 406 numeric conversion (coordinates \, angles \, ...);
+#X text 208 7 the zexy external v2.1;
+#X text 409 66 (c) forum::für::umlute 1999-2005;
+#X text 410 82 bug-reports: zmoelnig-AT-iem.at;
+#X obj 81 83 zexy;
+#N canvas 515 193 494 344 META 0;
+#X text 12 65 TEMPLATE template-help.pd v0.1;
+#X text 12 85 PLATFORM windows macosx gnulinux;
+#X text 12 165 WEBSITE;
+#X text 12 205 RELEASE_VERSION 0.42;
+#X text 12 225 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan
+Wilkes for Pd version 0.42.;
+#X text 12 45 LICENSE GPL v2;
+#X text 12 145 AUTHOR IOhannes m zmölnig;
+#X text 12 185 RELEASE_DATE;
+#X text 12 105 DATATYPE;
+#X text 12 25 KEYWORDS;
+#X text 12 125 LIBRARY external zexy;
+#X text 12 5 GENRE help;
+#X restore 696 581 pd META;
+#X obj 672 560 import zexy;
+#X connect 0 0 28 0;
diff --git a/doc/tutorials/cognition/beating.pd b/doc/tutorials/cognition/beating.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ad5337cae60537680e30f9784db2a5b51eae095e
--- /dev/null
+++ b/doc/tutorials/cognition/beating.pd
@@ -0,0 +1,143 @@
+#N canvas 398 221 726 560 12;
+#X text 87 15 BEATING OF SINE WAVES;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-sinewave 1027 float 1;
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
+#A 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
+#X coords 0 1 1026 -1 515 140 1;
+#X restore 115 65 graph;
+#X obj 117 219 hsl 515 18 55 440 1 0 \$0-freq1 empty empty -2 -6 1153
+8 -2688 -1 -1 33700 0;
+#X obj 117 242 hsl 515 18 55 440 1 0 \$0-freq2 empty empty -2 -6 1153
+8 -1856 -1 -1 33700 0;
+#X obj 117 265 hsl 515 18 44 440 1 0 \$0-freq3 empty empty -2 -6 1153
+8 -64 -1 -1 34100 0;
+#X obj 19 447 *~;
+#X obj 91 218 tgl 20 0 \$0-amp1 empty empty 0 -6 1153 8 -2688 -1 -1
+0 1;
+#X obj 427 526 dac~;
+#X obj 442 499 *~;
+#X obj 467 452 r \$0-master-level;
+#X obj 91 241 tgl 20 0 \$0-amp2 empty empty 0 -6 1153 8 -1856 -1 -1
+0 1;
+#X obj 91 264 tgl 20 0 \$0-amp3 empty empty 0 -6 1153 8 -64 -1 -1 0
+1;
+#X obj 500 526 tabwrite~ \$0-sinewave;
+#X obj 650 30 vsl 22 200 0 1 0 0 \$0-master-level empty amplitude -9
+-8 1153 10 -225271 -1 -1 4400 1;
+#X obj 19 351 osc~ 55;
+#X obj 500 480 loadbang;
+#X obj 479 482 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 500 503 metro 200;
+#X obj 19 326 r \$0-freq1;
+#X obj 44 380 r \$0-amp1;
+#X obj 44 424 line~;
+#X msg 44 402 \$1 10;
+#X obj 142 447 *~;
+#X obj 142 351 osc~ 55;
+#X obj 167 424 line~;
+#X msg 167 402 \$1 10;
+#X obj 266 447 *~;
+#X obj 266 351 osc~ 55;
+#X obj 291 424 line~;
+#X msg 291 402 \$1 10;
+#X obj 167 380 r \$0-amp2;
+#X obj 142 326 r \$0-freq2;
+#X obj 266 326 r \$0-freq3;
+#X obj 291 380 r \$0-amp3;
+#X obj 117 288 hsl 515 18 44 440 1 0 \$0-freq4 empty empty -2 -6 1153
+8 -38 -1 -1 35900 0;
+#X obj 91 287 tgl 20 0 \$0-amp4 empty empty 0 -6 1153 8 -38 -1 -1 0
+1;
+#X obj 387 447 *~;
+#X obj 387 351 osc~ 55;
+#X obj 412 424 line~;
+#X msg 412 402 \$1 10;
+#X obj 387 326 r \$0-freq4;
+#X obj 412 380 r \$0-amp4;
+#N canvas 683 260 535 488 record 0;
+#X obj 119 79 inlet~;
+#X obj 265 79 inlet;
+#X msg 235 243 start;
+#X msg 465 210 stop;
+#X obj 230 305 writesf~;
+#X obj 264 153 sel 1;
+#X obj 264 177 savepanel;
+#X msg 315 242 open \$1;
+#X obj 264 199 t b s;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 5 1 3 0;
+#X connect 6 0 8 0;
+#X connect 7 0 4 0;
+#X connect 8 0 2 0;
+#X connect 8 1 7 0;
+#X restore 318 529 pd record;
+#X obj 381 497 tgl 25 0 empty empty empty 0 -6 0 8 -258049 -1 -1 0
+1;
+#X connect 5 0 8 0;
+#X connect 8 0 7 0;
+#X connect 8 0 7 1;
+#X connect 8 0 12 0;
+#X connect 8 0 42 0;
+#X connect 9 0 8 1;
+#X connect 14 0 5 0;
+#X connect 15 0 17 0;
+#X connect 16 0 17 0;
+#X connect 17 0 12 0;
+#X connect 18 0 14 0;
+#X connect 19 0 21 0;
+#X connect 20 0 5 1;
+#X connect 21 0 20 0;
+#X connect 22 0 8 0;
+#X connect 23 0 22 0;
+#X connect 24 0 22 1;
+#X connect 25 0 24 0;
+#X connect 26 0 8 0;
+#X connect 27 0 26 0;
+#X connect 28 0 26 1;
+#X connect 29 0 28 0;
+#X connect 30 0 25 0;
+#X connect 31 0 23 0;
+#X connect 32 0 27 0;
+#X connect 33 0 29 0;
+#X connect 36 0 8 0;
+#X connect 37 0 36 0;
+#X connect 38 0 36 1;
+#X connect 39 0 38 0;
+#X connect 40 0 37 0;
+#X connect 41 0 39 0;
+#X connect 43 0 42 1;
diff --git a/doc/tutorials/cognition/change_perception.pd b/doc/tutorials/cognition/change_perception.pd
new file mode 100644
index 0000000000000000000000000000000000000000..29ef973dae3f540d734c470c09afaa0a2afa9bac
--- /dev/null
+++ b/doc/tutorials/cognition/change_perception.pd
@@ -0,0 +1,54 @@
+#N canvas 81 76 584 598 10;
+#X obj 6 206 cnv 15 250 40 empty empty empty 20 12 0 14 -261689 -66577
+0;
+#X obj 7 159 cnv 15 250 40 empty empty empty 20 12 0 14 -262131 -66577
+0;
+#X obj 7 4 cnv 15 250 150 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 391 40 pddp/dsp;
+#X obj 23 353 dac~;
+#X obj 34 309 *~;
+#X obj 53 290 hsl 128 15 0.01 1 1 1 empty empty amplitude 5 8 0 12
+-225271 -1 -1 12700 1;
+#X obj 34 120 osc~;
+#X obj 33 264 osc~;
+#X obj 33 218 +~ 250;
+#X obj 34 167 *~ 10;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-output 1000 float 2;
+#X coords 0 1 999 -1 500 140 1;
+#X restore 28 399 graph;
+#X obj 81 353 tabwrite~ \$0-output;
+#X obj 90 310 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X msg 36 20 100;
+#X msg 47 40 10;
+#X msg 60 82 0;
+#X text 88 83 this is a steady tone;
+#X text 81 41 steady or vibrato?;
+#X text 66 20 steady or vibrato?;
+#X text 85 219 <-- center pitch;
+#X text 79 168 <-- amount of change;
+#X obj 90 329 metro 200;
+#X obj 278 125 comment 270 14 Times ? 0 0 0 0 Conscious processing
+of sound in the brain is actually quite slow. Yes \, the ear can perceive
+changes on the order of 0.05ms (20 \, 000Hz) \, but your brain is made
+consciously aware of these changes at a much slower rate. You can hear
+an example of this using a oscillating frequency. A slow change in
+the frequency of a tone is perceived as vibrato \, you can consciously
+hear the wavering pitch. As that change in frequency becomes faster
+\, you can no longer consciously hear the wavering pitch. Instead you
+perceive a steady tone.;
+#X connect 5 0 4 0;
+#X connect 5 0 4 1;
+#X connect 5 0 12 0;
+#X connect 6 0 5 1;
+#X connect 7 0 10 0;
+#X connect 8 0 5 0;
+#X connect 9 0 8 0;
+#X connect 10 0 9 0;
+#X connect 13 0 22 0;
+#X connect 14 0 7 0;
+#X connect 15 0 7 0;
+#X connect 16 0 7 0;
+#X connect 22 0 12 0;
diff --git a/doc/tutorials/cognition/cognition_patch_ideas.txt b/doc/tutorials/cognition/cognition_patch_ideas.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e947ea230154ceee3c05392a10f7bf2eae55ea5e
--- /dev/null
+++ b/doc/tutorials/cognition/cognition_patch_ideas.txt
@@ -0,0 +1,42 @@
+
+Pd patches for demonstrating ideas of the cognitive psychology of music
+
+
+From "Music, Cognition, and Computerized Sound", Perry Cook:
+p31: 	sine sweeps with bursts of masking white noise
+	music with bursts of masking white noise
+
+p33:	"common fate" groups of dots moving through random dots
+	"common fate" using onset time, AM, FM
+
+p34:	Chownings female voice/bell demo
+
+
+"Auditory Scene Analysis", by Albert Bregman:
+
+repeating reading person while talking, then adding other sound source (Psych of Music class demo)
+
+
+Found. of Cog. Psych p224-225:
+	Bregman and Ruddnicky(1975): CCCFFCC stream segregation
+	Deutsch (1974): alternating high/low tones in each ear
+pp225-226	
+	Bregman: a stream of alternating high/low tones turns into two 
+		distinct streams when sped up.  Make sure the notes remain 		distinct with small silences as separation.
+pp234-235
+	masking tones and stream perception
+
+
+
+from class:
+	take two meoldies and layers them in the same pitch range.  then 
+	move them an octave apart.
+
+
+Interval Classes
+	take melody and scramble the octaves while keeping the pitches the 
+	same (after Deutsch)
+
+Deutsch: alternating ear notes form scales
+
+
diff --git a/doc/tutorials/cognition/durations_affect_recognition.pd b/doc/tutorials/cognition/durations_affect_recognition.pd
new file mode 100644
index 0000000000000000000000000000000000000000..df1a646871e44e516c920aa313b897620066d8ed
--- /dev/null
+++ b/doc/tutorials/cognition/durations_affect_recognition.pd
@@ -0,0 +1,18 @@
+#N canvas 448 122 530 585 10;
+#X text 91 14 Note durations affect recognition;
+#X text 117 91 (from Thinking in Sound p.52);
+#X text 57 122 "Sequences of tones forming melodies are perceived as
+more than a series of pitches \, and seem to have an emergent property
+characteristic of the particular pattern- in other words \, they form
+distinctive auditory gestalten or temporal compounds. If melodies can
+be considered as temporal compounds \, then we would expect to find
+a 'temporal template' for melody recognition that has both upper and
+lower durational limits." [1];
+#X text 31 479 [1] "Thinking in sound: the cognitive psychology of
+human audition" \, ed. S. McAdams and E. Bigand. Oxford University
+Press \, 1993 \, p52;
+#X text 81 294 play happy birthday fast/slow;
+#X text 79 320 play twinkle twinkle little star fast/slow;
+#X obj 0 0 cnv 15 580 40 empty empty durations_affect_recognition 20 12
+1 18 -216441 -66577 0;
+#X text 258 24 'cognition' by Hans-Christoph Steiner;
diff --git a/doc/tutorials/cognition/ear_dominance.pd b/doc/tutorials/cognition/ear_dominance.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c14e5b76399e94366eaeb7f1c11735d08d391155
--- /dev/null
+++ b/doc/tutorials/cognition/ear_dominance.pd
@@ -0,0 +1,76 @@
+#N canvas 336 40 530 602 10;
+#X obj 0 0 cnv 15 520 40 empty empty ear_dominance 20 12 1 18 -216441
+-66577 0;
+#X text 258 24 'cognition' by Hans-Christoph Steiner;
+#X text 36 166 The original experiment is from:;
+#X text 46 182 Deutsch \, D. (1975). Musical Illusions. Scientific
+American \, 233 \, pp92-104.;
+#X obj 251 550 dac~;
+#X obj 168 496 *~;
+#X obj 184 470 tgl 25 1 empty empty left 0 -6 1 10 -212983 -1 -1 1
+1;
+#X obj 168 431 *~;
+#X obj 168 384 osc~;
+#X obj 212 282 alternate;
+#X obj 146 359 t b f b;
+#X msg 212 391 0 5;
+#X msg 127 391 1 5;
+#X obj 184 412 line~;
+#X msg 16 272 \; pd dsp \$1;
+#X obj 105 230 tgl 35 0 empty empty start 0 -6 1 12 -4033 -1 -1 0 1
+;
+#X obj 212 258 metro 500;
+#X obj 193 256 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 160 322 220;
+#X msg 189 322 440;
+#X msg 279 321 440;
+#X msg 309 321 220;
+#X obj 342 496 *~;
+#X obj 358 470 tgl 25 1 empty empty right 0 -6 1 10 -261364 -1 -1 1
+1;
+#X obj 342 431 *~;
+#X obj 342 384 osc~;
+#X obj 320 359 t b f b;
+#X msg 386 391 0 5;
+#X msg 301 391 1 5;
+#X obj 358 412 line~;
+#X text 35 51 Most listeners perceive this stream as a tone alternating
+back and forth from ear to ear \, while alternating between high and
+low pitches. What is actually happening is that the high and low tones
+are alternating in each ear \, but at opposite times.;
+#X text 35 119 Your dominant ear tells the brain that the pitch of
+the tone is changing \, while both ears track the position of the high
+pitched tone.;
+#X connect 5 0 4 0;
+#X connect 6 0 5 1;
+#X connect 7 0 5 0;
+#X connect 8 0 7 0;
+#X connect 9 0 19 0;
+#X connect 9 0 18 0;
+#X connect 9 1 20 0;
+#X connect 9 1 21 0;
+#X connect 10 0 12 0;
+#X connect 10 1 8 0;
+#X connect 10 2 11 0;
+#X connect 11 0 13 0;
+#X connect 12 0 13 0;
+#X connect 13 0 7 1;
+#X connect 15 0 14 0;
+#X connect 15 0 16 0;
+#X connect 16 0 9 0;
+#X connect 16 0 17 0;
+#X connect 18 0 10 0;
+#X connect 19 0 26 0;
+#X connect 20 0 10 0;
+#X connect 21 0 26 0;
+#X connect 22 0 4 1;
+#X connect 23 0 22 1;
+#X connect 24 0 22 0;
+#X connect 25 0 24 0;
+#X connect 26 0 28 0;
+#X connect 26 1 25 0;
+#X connect 26 2 27 0;
+#X connect 27 0 29 0;
+#X connect 28 0 29 0;
+#X connect 29 0 24 1;
diff --git a/doc/tutorials/cognition/identification_of_order.pd b/doc/tutorials/cognition/identification_of_order.pd
new file mode 100644
index 0000000000000000000000000000000000000000..54cc9fa6ed93e6211bc789b5984ade13ec793e00
--- /dev/null
+++ b/doc/tutorials/cognition/identification_of_order.pd
@@ -0,0 +1,19 @@
+#N canvas 336 40 530 585 10;
+#X obj 123 280 osc~ 500;
+#X obj 275 280 phasor~;
+#X obj 275 261 sig~;
+#X msg 275 241 300;
+#X text 74 63 There are four distinct sounds being played in a sequence.
+Determine the order of the sequence of the sounds.;
+#X obj 192 259 noise~;
+#X text 97 619 (Warren 1968 \; Warren et al. 1969 \; Warren and Obusek
+1972);
+#X obj 192 279 hip~ 3000;
+#X text 347 280 speech 'ee';
+#X text 167 119 (from Thinking in Sound \, p.40);
+#X obj 0 0 cnv 15 580 40 empty empty Identification_of_order 20 12
+1 18 -216441 -66577 0;
+#X text 258 24 'cognition' by Hans-Christoph Steiner;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 5 0 7 0;
diff --git a/doc/tutorials/cognition/octaves.pd b/doc/tutorials/cognition/octaves.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6b2a5d655e6f21099513a433c2c09aa050c24576
--- /dev/null
+++ b/doc/tutorials/cognition/octaves.pd
@@ -0,0 +1,703 @@
+#N canvas 398 221 730 564 12;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-sinewave 4099 float 1;
+#A 0 -0.123728 -0.136775 -0.149354 -0.161447 -0.173034 -0.184098 -0.194623
+-0.204594 -0.214 -0.222827 -0.231066 -0.238707 -0.245744 -0.252171
+-0.257983 -0.263178 -0.267753 -0.271711 -0.275051 -0.277777 -0.279894
+-0.281408 -0.282327 -0.282659 -0.282414 -0.281604 -0.280242 -0.278342
+-0.275919 -0.27299 -0.269573 -0.265686 -0.26135 -0.256585 -0.251413
+-0.245857 -0.23994 -0.233685 -0.227118 -0.220265 -0.21315 -0.205801
+-0.198245 -0.190507 -0.182617 -0.1746 -0.166486 -0.158301 -0.150074
+-0.141831 -0.133601 -0.12541 -0.117286 -0.109254 -0.10134 -0.0935712
+-0.085971 -0.0785638 -0.0713733 -0.064422 -0.057732 -0.051324 -0.0452185
+-0.0394343 -0.0339892 -0.0289003 -0.0241831 -0.0198523 -0.0159211 -0.0124018
+-0.00930505 -0.00664038 -0.00441594 -0.00263858 -0.00131368 -0.000445358
+-3.62121e-05 -8.73852e-05 -0.000598787 -0.00156891 -0.00299477 -0.00487204
+-0.00719495 -0.0099564 -0.0131479 -0.0167597 -0.0207807 -0.0251985
+-0.0299996 -0.035169 -0.0406908 -0.0465479 -0.0527221 -0.0591942 -0.0659438
+-0.0729499 -0.0801906 -0.0876432 -0.0952835 -0.103087 -0.11103 -0.119085
+-0.127227 -0.135429 -0.143664 -0.151906 -0.160127 -0.168298 -0.176393
+-0.184384 -0.192243 -0.199943 -0.207456 -0.214755 -0.221814 -0.228606
+-0.235105 -0.241287 -0.247126 -0.252599 -0.257682 -0.262353 -0.266591
+-0.270374 -0.273684 -0.276502 -0.27881 -0.280592 -0.281833 -0.282519
+-0.282637 -0.282175 -0.281124 -0.279476 -0.277224 -0.274361 -0.270883
+-0.266788 -0.262074 -0.256742 -0.250792 -0.244229 -0.237057 -0.229282
+-0.220911 -0.211954 -0.202421 -0.192325 -0.181679 -0.170497 -0.158796
+-0.146594 -0.133908 -0.12076 -0.10717 -0.093162 -0.078758 -0.0639834
+-0.0488637 -0.0334255 -0.0176963 -0.00170462 0.0145205 0.0309493 0.0475511
+0.0642953 0.0811498 0.0980828 0.115062 0.132054 0.149027 0.165947 0.182781
+0.199497 0.216061 0.232441 0.248604 0.264518 0.28015 0.29547 0.310447
+0.32505 0.33925 0.353018 0.366326 0.379147 0.391455 0.403224 0.414431
+0.425052 0.435066 0.444451 0.453189 0.461262 0.468652 0.475346 0.481327
+0.486585 0.491109 0.494888 0.497914 0.500182 0.501687 0.502427 0.502399
+0.501603 0.500042 0.497718 0.494637 0.490804 0.486228 0.480919 0.474886
+0.468143 0.460704 0.452583 0.443799 0.434368 0.424311 0.413647 0.4024
+0.390592 0.378247 0.365391 0.352049 0.338249 0.32402 0.309389 0.294387
+0.279043 0.26339 0.247457 0.231278 0.214884 0.198308 0.181582 0.16474
+0.147815 0.13084 0.113848 0.0968717 0.0799436 0.0630963 0.0463616 0.0297712
+0.013356 -0.0028535 -0.0188275 -0.0345368 -0.0499533 -0.0650494 -0.0797987
+-0.0941753 -0.108155 -0.121714 -0.13483 -0.147482 -0.159649 -0.171314
+-0.182459 -0.193067 -0.203123 -0.212616 -0.221531 -0.22986 -0.237593
+-0.244722 -0.251242 -0.257147 -0.262435 -0.267104 -0.271154 -0.274587
+-0.277405 -0.279614 -0.281218 -0.282225 -0.282645 -0.282486 -0.28176
+-0.28048 -0.278661 -0.276316 -0.273463 -0.270119 -0.266302 -0.262033
+-0.257332 -0.252221 -0.246721 -0.240857 -0.234652 -0.228131 -0.221319
+-0.214242 -0.206927 -0.1994 -0.191688 -0.183818 -0.175819 -0.167717
+-0.159541 -0.151318 -0.143076 -0.134842 -0.126643 -0.118507 -0.110459
+-0.102527 -0.0947341 -0.0871069 -0.0796692 -0.0724447 -0.0654562 -0.0587256
+-0.0522741 -0.0461218 -0.0402879 -0.0347905 -0.0296467 -0.0248723 -0.0204822
+-0.0164898 -0.0129074 -0.00974611 -0.00701547 -0.00472392 -0.00287849
+-0.00148478 -0.00054712 -6.83357e-05 -4.98103e-05 -0.000491604 -0.00139241
+-0.00274956 -0.00455884 -0.00681476 -0.00951086 -0.0126384 -0.0161878
+-0.0201481 -0.0245072 -0.0292516 -0.0343666 -0.0398366 -0.0456444 -0.0517721
+-0.0582005 -0.0649097 -0.0718784 -0.0790849 -0.0865064 -0.0941194 -0.1019
+-0.109822 -0.117861 -0.125991 -0.134186 -0.142418 -0.15066 -0.158885
+-0.167066 -0.175175 -0.183183 -0.191064 -0.198789 -0.206332 -0.213666
+-0.220763 -0.227597 -0.234143 -0.240374 -0.246266 -0.251796 -0.256939
+-0.261673 -0.265978 -0.269831 -0.273213 -0.276106 -0.278491 -0.280353
+-0.281677 -0.282447 -0.274589 -0.277254 -0.279404 -0.281023 -0.282097
+-0.282611 -0.282555 -0.281916 -0.280686 -0.278856 -0.27642 -0.273371
+-0.269707 -0.265425 -0.260525 -0.255006 -0.24887 -0.242122 -0.234767
+-0.226811 -0.218262 -0.20913 -0.199426 -0.189162 -0.178352 -0.167011
+-0.155157 -0.142806 -0.129978 -0.116694 -0.102975 -0.0888446 -0.0743257
+-0.0594435 -0.0442239 -0.0286942 -0.0128821 0.00318379 0.0194741 0.0359586
+0.0526069 0.0693876 0.086269 0.103219 0.120205 0.137195 0.154155 0.171052
+0.187854 0.204527 0.221039 0.237357 0.253447 0.269279 0.28482 0.300039
+0.314906 0.32939 0.343463 0.357094 0.370258 0.382926 0.395074 0.406675
+0.417707 0.428147 0.437972 0.447164 0.455702 0.463569 0.470749 0.477227
+0.48299 0.488026 0.492324 0.495876 0.498674 0.500712 0.501986 0.502494
+0.502234 0.501208 0.499416 0.496863 0.493554 0.489496 0.484698 0.479168
+0.47292 0.465965 0.458319 0.449996 0.441014 0.431392 0.42115 0.410308
+0.398889 0.386916 0.374414 0.361408 0.347925 0.333993 0.319638 0.304891
+0.289782 0.274341 0.258599 0.242589 0.22634 0.209888 0.193263 0.176498
+0.159628 0.142684 0.1257 0.108709 0.091744 0.0748368 0.05802 0.0413255
+0.0247847 0.00842833 -0.00771322 -0.0236104 -0.0392343 -0.054557 -0.0695511
+-0.0841905 -0.0984499 -0.112305 -0.125732 -0.13871 -0.151218 -0.163236
+-0.174745 -0.185729 -0.196172 -0.206058 -0.215376 -0.224115 -0.232263
+-0.239813 -0.246758 -0.253091 -0.25881 -0.26391 -0.268392 -0.272255
+-0.275502 -0.278135 -0.280161 -0.281584 -0.282412 -0.282656 -0.282325
+-0.28143 -0.279986 -0.278006 -0.275506 -0.272503 -0.269014 -0.265059
+-0.260657 -0.25583 -0.250599 -0.244987 -0.239017 -0.232714 -0.226102
+-0.219208 -0.212056 -0.204674 -0.197087 -0.189325 -0.181413 -0.17338
+-0.165252 -0.157059 -0.148827 -0.140585 -0.132359 -0.124176 -0.116064
+-0.108048 -0.100155 -0.0924094 -0.0848368 -0.0774609 -0.0703051 -0.063392
+-0.0567434 -0.05038 -0.0443216 -0.0385873 -0.0331947 -0.0281607 -0.0235007
+-0.019229 -0.015359 -0.0119025 -0.00887004 -0.00627098 -0.00411326
+-0.00240352 -0.00114696 -0.000347968 -9.01558e-06 -0.000130456 -0.000712006
+-0.00175193 -0.00324702 -0.00519273 -0.00758309 -0.0104108 -0.0136671
+-0.0173421 -0.0214246 -0.0259018 -0.03076 -0.0359843 -0.0415584 -0.0474651
+-0.053686 -0.0602016 -0.0669917 -0.0740349 -0.0813091 -0.0887912 -0.0964575
+-0.104284 -0.112244 -0.120314 -0.128467 -0.136676 -0.144914 -0.153154
+-0.161369 -0.169531 -0.177613 -0.185586 -0.193422 -0.201095 -0.208577
+-0.215841 -0.222861 -0.22961 -0.236063 -0.242194 -0.247979 -0.253394
+-0.258415 -0.263022 -0.267192 -0.270904 -0.27414 -0.276881 -0.27911
+-0.280811 -0.281968 -0.282569 -0.2826 -0.28205 -0.28091 -0.279172 -0.276828
+-0.273873 -0.270303 -0.266115 -0.261308 -0.255883 -0.249841 -0.243186
+-0.235923 -0.228058 -0.219597 -0.210552 -0.200933 -0.190752 -0.180023
+-0.168762 -0.156983 -0.144706 -0.131949 -0.118732 -0.105077 -0.091007
+-0.076545 -0.0617162 -0.0465462 -0.031062 -0.015291 0.000738124 0.0169962
+0.0334532 0.0500787 0.0668413 0.0837096 0.100651 0.117634 0.134626
+0.151593 0.168502 0.185321 0.202016 0.218555 0.234904 0.251032 0.266906
+0.282493 0.297763 0.312685 0.327229 0.341365 0.355065 0.3683 0.381045
+0.393272 0.404957 0.416076 0.426606 0.436525 0.445813 0.454451 0.46242
+0.469706 0.476291 0.482163 0.48731 0.491721 0.495386 0.498299 0.500453
+0.501843 0.502467 0.502324 0.501413 0.499737 0.497299 0.494105 0.49016
+0.485473 0.480054 0.473913 0.467064 0.45952 0.451298 0.442414 0.432887
+0.422736 0.411983 0.400649 0.388758 0.376334 0.363402 0.34999 0.336123
+0.321831 0.307142 0.292086 0.276694 0.260997 0.245025 0.228811 0.212388
+0.195787 0.179042 0.162186 0.145251 0.128272 0.11128 0.0943084 0.0773903
+0.0605577 0.0438426 0.0272763 0.0108898 -0.00528639 -0.0212225 -0.0368895
+-0.0522594 -0.0673048 -0.0819992 -0.0963173 -0.110235 0.00460516 0.00809275
+0.0112549 0.0132757 0.0134084 0.0109925 0.00547538 -0.00357332 -0.0164496
+-0.0333015 -0.054137 -0.0788131 -0.107051 -0.138441 -0.172445 -0.208437
+-0.245705 -0.283476 -0.320946 -0.35728 -0.391673 -0.423356 -0.451604
+-0.475788 -0.49534 -0.509842 -0.518983 -0.522575 -0.52058 -0.513055
+-0.500235 -0.482456 -0.460161 -0.433897 -0.404274 -0.371993 -0.33778
+-0.302387 -0.266558 -0.231025 -0.196479 -0.163558 -0.132823 -0.104745
+-0.0797139 -0.0579998 -0.0397858 -0.0251319 -0.0140042 -0.00627322
+-0.00171054 -2.95087e-05 -0.000857735 -0.00379005 -0.00838201 -0.0141697
+-0.0206982 -0.0275152 -0.0342065 -0.0403985 -0.0457676 -0.0500564 -0.0530753
+-0.0547012 -0.0548952 -0.0536747 -0.0511305 -0.0474203 -0.0427349 -0.0373285
+-0.0314599 -0.0254141 -0.0194937 -0.0139645 -0.00909911 -0.00511056
+-0.00218056 -0.000461684 -1.43157e-05 -0.000873048 -0.00298732 -0.00625686
+-0.0105521 -0.0156537 -0.0213382 -0.0273301 -0.0333415 -0.0391013 -0.0443077
+-0.0487098 -0.0520719 -0.0542054 -0.05499 -0.0543425 -0.0522671 -0.0488318
+-0.044175 -0.0385165 -0.0321293 -0.0253545 -0.0185835 -0.0122384 -0.00677927
+-0.00266264 -0.000347772 -0.000271981 -0.00282533 -0.00836211 -0.0171463
+-0.029378 -0.0451598 -0.0644903 -0.0872782 -0.113306 -0.142269 -0.173754
+-0.207252 -0.242179 -0.277881 -0.313653 -0.34876 -0.382442 -0.413954
+-0.442585 -0.467661 -0.48859 -0.504844 -0.516012 -0.320557 -0.278213
+-0.235958 -0.194956 -0.156266 -0.12081 -0.0893242 -0.0623575 -0.0402621
+-0.0231619 -0.0109904 -0.00349341 -0.000238504 -0.000668226 -0.00411255
+-0.00983087 -0.0170623 -0.0250411 -0.0330495 -0.0404475 -0.0466891
+-0.0513557 -0.0541678 -0.0549817 -0.0537966 -0.0507475 -0.0460857 -0.0401578
+-0.0333935 -0.0262611 -0.0192327 -0.0127773 -0.00732098 -0.00321092
+-0.000716257 -1.17405e-05 -0.00112345 -0.00398116 -0.00841142 -0.0141175
+-0.020729 -0.0278284 -0.0349281 -0.0415462 -0.0472282 -0.0515627 -0.054219
+-0.0549749 -0.0537217 -0.0504879 -0.0454458 -0.0389095 -0.0313288 -0.0232674
+-0.0153896 -0.00842534 -0.00313614 -0.000292614 -0.000615552 -0.00475104
+-0.0132447 -0.0264772 -0.0446708 -0.0678541 -0.0958418 -0.128251 -0.164487
+-0.203764 -0.245138 -0.287515 -0.329712 -0.370492 -0.408605 -0.442838
+-0.472078 -0.495341 -0.511799 -0.520872 -0.522206 -0.515662 -0.501431
+-0.479933 -0.451802 -0.417957 -0.379473 -0.337553 -0.293534 -0.248779
+-0.204634 -0.162387 -0.123199 -0.0880552 -0.0577274 -0.0327433 -0.0133493
+0.000493037 0.00910874 0.013101 0.0133274 0.0108611 0.00694972 0.00297045
+0.000352283 0.000531455;
+#A 1000 0.00488662 0.0146574 0.030914 0.0544856 0.0859166 0.125457
+0.173007 0.228135 0.290084 0.357764 0.429812 0.504632 0.580438 0.655312
+0.727297 0.794447 0.854859 0.906856 0.948947 0.979863 0.998741 1.00502
+0.998469 0.979328 0.948151 0.905842 0.853651 0.793065 0.725804 0.653735
+0.578816 0.503015 0.428234 0.356264 0.288695 0.226883 0.171909 0.124524
+0.085162 0.0538998 0.0304909 0.0143856 0.00473973 0.000489467 0.000384588
+0.00304501 0.00704039 0.0109334 0.0133537 0.0130584 0.00897434 0.000252243
+-0.0137063 -0.0332213 -0.058323 -0.0887594 -0.124002 -0.163265 -0.205564
+-0.249741 -0.29449 -0.338478 -0.380341 -0.418738 -0.45247 -0.480463
+-0.501818 -0.515888 -0.522255 -0.520763 -0.511526 -0.494909 -0.471517
+-0.442157 -0.407826 -0.369648 -0.328821 -0.286607 -0.244241 -0.202901
+-0.163677 -0.127516 -0.095197 -0.0673064 -0.0442298 -0.0261439 -0.013013
+-0.00462115 0.00464939 0.011778 0.0136104 0.0115553 0.00732503 0.00284825
+0.000157885 0.00128694 0.00815214 0.0224483 0.0455373 0.0783636 0.121395
+0.174577 0.237314 0.308473 0.386427 0.469112 0.554133 0.638823 0.720416
+0.796127 0.863285 0.919493 0.962695 0.991309 1.00427 1.00107 0.98185
+0.947323 0.898774 0.837995 0.767146 0.688792 0.605643 0.520495 0.436096
+0.354999 0.279502 0.211498 0.15242 0.1032 0.0642158 0.0353136 0.0158296
+0.00464446 0.000258688 0.000874155 0.0045147 0.00913286 0.0127256 0.0134375
+0.0096652 0.000141836 -0.0160015 -0.0391854 -0.0693795 -0.106093 -0.148412
+-0.195057 -0.244429 -0.294741 -0.344077 -0.39049 -0.432141 -0.467342
+-0.494693 -0.513118 -0.521893 -0.520756 -0.509827 -0.489655 -0.461165
+-0.425566 -0.384382 -0.339275 -0.292007 -0.244352 -0.197989 -0.154454
+-0.115049 -0.080799 -0.052422 -0.0302933 -0.0144617 -0.00466235 -0.000353684
+-0.000763599 -0.00494126 -0.0118335 -0.0203484 -0.0294257 -0.038089
+-0.0455068 -0.0510341 -0.0542381 -0.0549209 -0.0530967 -0.0489951 -0.0430271
+-0.0357371 -0.0277833 -0.0198355 -0.0125586 -0.00656068 -0.00232313
+-0.000210026 -0.000381984 -0.00281812 -0.00733171 -0.0135431 -0.0209575
+-0.0289562 -0.0368569 -0.0439893 -0.0497144 -0.0535071 -0.0549815 -0.0539308
+-0.0503695 -0.0445346 -0.0368911 -0.028113 -0.0190559 -0.0107081 -0.00414134
+-0.00044582 -0.000665631 -0.168627 -0.213455 -0.260628 -0.308539 -0.355446
+-0.399542 -0.439076 -0.472395 -0.498085 -0.515001 -0.522343 -0.51973
+-0.507155 -0.485102 -0.454419 -0.416338 -0.372412 -0.324397 -0.274235
+-0.223872 -0.175224 -0.130031 -0.089778 -0.0556192 -0.028293 -0.00810672
+0.00510909 0.0119846 0.0135837 0.0113511 0.0070347 0.00259288 8.91565e-05
+0.00157704 0.00898397 0.024002 0.0479794 0.0818346 0.125996 0.180355
+0.244257 0.316498 0.395392 0.478804 0.564271 0.649085 0.730413 0.805467
+0.871562 0.926326 0.967725 0.994216 1.00483 0.999123 0.977353 0.940307
+0.889385 0.826474 0.753855 0.674134 0.590066 0.504506 0.420201 0.339702
+-0.466777 -0.426387 -0.378077 -0.324334 -0.267867 -0.21147 -0.157799
+-0.109238 -0.0677001 -0.0345051 -0.0102835 0.00508071 0.0124354 0.0133276
+0.00989447 0.00472277 0.000681065 0.000703478 0.00761129 0.0238681
+0.0514314 0.0915694 0.144753 0.210595 0.287828 0.374343 0.467314 0.563316
+0.658524 0.748943 0.830574 0.899776 0.953326 0.988736 1.00432 0.999329
+0.974024 0.929592 0.868131 0.792483 0.706121 0.61289 0.51681 0.421812
+0.331563 0.249216 0.177276 0.117443 0.0705646 0.036611 0.0147102 0.00325138
+6.35413e-08 0.00230651 0.00726034 0.0119375 0.0135804 0.00980013 -0.00127083
+-0.020851 -0.0494401 -0.0867904 -0.131922 -0.18322 -0.238527 -0.295305
+-0.350813 -0.402248 -0.447018 -0.482822 -0.507846 -0.520848 -0.521238
+-0.509138 -0.4853 -0.451109 -0.408421 -0.359505 -0.306842 -0.252984
+-0.200397 -0.151304 -0.107582 -0.0706454 -0.0413886 -0.0201687 -0.00681664
+-0.00067712 -0.000713684 -0.00557375 -0.013748 -0.0236634 -0.0338238
+-0.0429118 -0.0498715 -0.0539939 -0.0549143 -0.0526485 -0.0475493 -0.0402416
+-0.0315861 -0.0225213 -0.0140264 -0.00700769 -0.00218529 -7.81432e-05
+-0.000884204 -0.0045222 -0.0106308 -0.0185597 -0.0274883 -0.0364538
+-0.0444773 -0.0506682 -0.0542727 -0.0548125 -0.0521148 -0.0463646 -0.0381267
+-0.0283007 -0.0180971 -0.00894625 -0.00239465 -6.32803e-06 -0.00320744
+-0.0132007 -0.0308202 -0.0564622 -0.00125305 -0.000187852 -0.00386126
+-0.0116452 -0.0222494 -0.033822 -0.0443365 -0.0518795 -0.0549628 -0.0528353
+-0.0456431 -0.0345206 -0.0215268 -0.00944014 -0.00146233 -0.000824859
+-0.0103617 -0.0321147 -0.0669747 -0.114484 -0.172728 -0.238441 -0.307252
+-0.374065 -0.43356 -0.480709 -0.511347 -0.522603 -0.513245 -0.483832
+-0.436714 -0.375818 -0.306221 -0.233645 -0.16383 -0.101928 -0.0519016
+-0.0160835 0.00511517 0.0132607 0.0117699 0.00553652 0.000406125 0.00250923
+0.0175622 0.050173 0.103258 0.177617 0.271724 0.381768 0.501902 0.624763
+0.742121 0.845636 0.927699 0.982034 1.00452 0.99338 0.949495 0.876249
+0.779211 0.665636 0.543703 0.421757 0.307547 0.207491 0.126141 0.0658078
+0.0264783 0.00590524 7.8473e-06 0.0033629 0.0099069 0.0136157 0.00920714
+-0.00728613 -0.0380907 -0.0834628 -0.141704 -0.209362 -0.281631 -0.352893
+-0.417359 -0.469656 -0.505436 -0.52175 -0.517443 -0.493135 -0.451183
+-0.395345 -0.330424 -0.261697 -0.194396 -0.133189 -0.0817512 -0.0424706
+-0.0163065 -0.00279708 -0.00026963 -0.00610434 -0.0171673 -0.0301931
+-0.0422224 -0.0509249 -0.0548393 -0.0534778 -0.0473182 -0.0376102 -0.0261665
+-0.0150199 -0.00608829 -0.000919146 -0.000356685 -0.00450113 -0.0126657
+-0.0234531 -0.0350155 -0.0453046 -0.0524303 -0.0549919 -0.052304 -0.0446273
+-0.0331976 -0.0201565 -0.00834892 -0.000994758 -0.00130718 -0.0120515
+-0.0351664 -0.0714051 -0.120161 -0.179366 -0.24563 -0.314478 -0.380769
+-0.439191 -0.484778 -0.513483 -0.522594 -0.511063 -0.479647 -0.430867
+-0.368799 -0.298611 -0.226065 -0.156854 -0.0960419 -0.0474349 -0.0131704
+0.00654293 0.0134835 0.0112409 0.0048376 0.00018135 0.00339401 0.0201039
+0.0547699 0.110096 0.186651 0.282654 0.394065 0.514864 0.637532 0.753821
+0.855419 0.934812 0.985963 1.00493 0.990258 0.943085 0.867027 0.767888
+0.653037 0.530708 0.409238 0.29624 0.197977 0.118775 0.0606947 0.0234841
+0.00467814 2.74981e-05 0.00401004 0.010531 0.0136156 0.00809319 -0.00983716
+-0.0421975 -0.0890405 -0.148464 -0.216851 -0.289291 -0.360104 -0.423529
+-0.474268 -0.508106 -0.522273 -0.515797 -0.489491 -0.445875 -0.388846
+-0.323268 -0.25445 -0.187587 -0.127254 -0.0770114 -0.0390915 -0.0143066
+-0.00205143 -0.000541939 -0.00708129 -0.0185026 -0.0315537 -0.0433302
+-0.0515791 -0.054943 -0.0530426 -0.0464298 -0.0364536 -0.0249439 -0.013939
+-0.00535246 -0.000629712 -0.000577232 -0.00519609 -0.0137001 -0.0246738
+-0.036194 -0.0462322 -0.0529383 -0.0549568 -0.0517175 -0.0435699 -0.0318542
+-0.0188002 -0.00730698 -0.000612571 -0.00190608 -0.0138794 -0.0383655
+-0.0759764 -0.125955 -0.186087 -0.252848 -0.321676 -0.387387 -0.444676
+-0.48866 -0.515399 -0.522354 -0.508659 -0.475269 -0.424872 -0.361689
+-0.290977 -0.218518 -0.517379 -0.489202 -0.439212 -0.372387 -0.295432
+-0.215941 -0.141393 -0.0781809 -0.0307452 -0.00094946 0.0122066 0.0125002
+0.00601303 0.000340051 0.00356806 0.0231523 0.0648236 0.131712 0.22376
+0.337515 0.466375 0.601223 0.731385 0.845831 0.934425 0.989091 1.00474
+0.979936 0.916994 0.821719 0.702751 0.570546 0.436164 0.310013 0.200724
+0.114221 0.0531829 0.0169236 0.00164636 0.00113738 0.00770497 0.0132787
+0.0105203 -0.0061864 -0.0400138 -0.091305 -0.157571 -0.233864 -0.313452
+-0.388745 -0.452279 -0.497673 -0.52042 -0.518445 -0.492292 -0.444996
+-0.381656 -0.308753 -0.2333 -0.161998 -0.100459 -0.0526138 -0.0203752
+-0.0035961 -0.000270068 -0.0070097 -0.0196538 -0.0339369 -0.0461158
+-0.0534829 -0.0546709 -0.0497274 -0.0399598 -0.0275906 -0.0152757 -0.00557919
+-0.000483052 -0.00101898 -0.0070828 -0.017441 -0.0299708 -0.0420518
+-0.0510686 -0.0549358 -0.0525583 -0.0441491 -0.0313384 -0.0170542 -0.00517671
+-1.0028e-05 -0.00561861 -0.0251734 -0.0603612 -0.110964 -0.174674 -0.247215
+-0.322721 -0.394369 -0.455181 -0.498883 -0.520697 -0.51803 -0.490832
+-0.44166 -0.375407 -0.298731 -0.219196 -0.144304 -0.0805148 -0.0323665
+-0.00183793 0.011952 0.0126717 0.00632151 0.000452188 0.00315728 0.0219317
+0.0626011 0.128419 0.219469 0.332435 0.460839 0.595647 0.726222 0.841532
+0.931376 0.987562 1.00489 0.981758 0.920313 0.826214 0.708028 0.576151
+0.441642 0.314966 0.20484 0.117313 0.0552113 0.0179773 0.00193694 0.000960196
+0.00739823 0.0131672 0.0108806 -0.00516602 -0.0382557 -0.0888516 -0.154578
+-0.230575 -0.310176 -0.385805 -0.449972 -0.496219 -0.519963 -0.51902
+-0.493825 -0.447315 -0.384524 -0.311882 -0.236396 -0.164799 -0.102762
+-0.0542943 -0.0213998 -0.00400667 -0.000180492 -0.006581 -0.0190688
+-0.0333634 -0.0456922 -0.0532974 -0.0547512 -0.0500416 -0.0404308 -0.0281145
+-0.0157456 -0.00589802 -0.000585892 -0.000884768 -0.00673444 -0.0169499
+-0.0294389 -0.0415945 -0.0507869 -0.0548984 -0.0527855 -0.0446031 -0.0319237
+-0.0176276 -0.00556729 -3.69092e-05 -0.0051253 -0.0240539 -0.0585854
+-0.108579 -0.171818 -0.244102 -0.319616 -0.391563 -0.452956 -0.49747
+-0.520263 -0.518639 -0.492433 -0.444087 -0.378418 -0.302025 -0.222453
+-0.14723 -0.0828755 -0.0340199 -0.00275701 0.0116739 0.0128307 0.00663041
+0.000581746 0.00277368 0.0207485 0.0604222 0.125175 0.215217 0.32738
+0.455305 0.590049 0.721027 0.837194 0.92828 0.985984 1.00498 0.98351
+0.923553 0.830664 0.713286 0.581761 0.44714 0.319948 0.208992 0.120447
+0.0572812 0.0190669 0.00225297 0.000798075 0.00708985 0.0130415 0.0112178
+-0.00417257 -0.0365259 -0.0864252 -0.151608 -0.2273 -0.306897 -0.382841
+-0.447617 -0.494715 -0.519463 -0.519562 -0.0187639 -0.0314824 -0.0434172
+-0.0519291 -0.0549914 -0.0516515 -0.0423414 -0.0289514 -0.0146739 -0.00359856
+-0.000135466 -0.00833544 -0.031184 -0.0700471 -0.12424 -0.190945 -0.265362
+-0.341182 -0.411294 -0.468656 -0.507159 -0.522478 -0.51262 -0.478318
+-0.422943 -0.352128 -0.273077 -0.193619 -0.121218 -0.0619145 -0.0195167
+0.00495932 0.0134676 0.0107135 0.0035516 5.37423e-05 0.00841632 0.0357524
+0.0870612 0.164373 0.266298 0.387992 0.521567 0.656898 0.782758 0.888055
+0.96319 1.00115 0.998329 0.955019 0.875266 0.766547 0.638726 0.502984
+0.370473 0.251073 0.152297 0.0785363 0.0306903 0.00629777 1.07925e-05
+0.00449925 0.0115199 0.0130991 -0.0368593 -0.0392442 -0.0415294 -0.0436941
+-0.0457187 -0.0475843 -0.0492733 -0.0507695 -0.0520581 -0.0531259 -0.0539614
+-0.054555 -0.0548993 -0.0549886 -0.0548196 -0.0543912;
+#A 2000 -0.0537046 -0.0527633 -0.051573 -0.050142 -0.0484808 -0.0466023
+-0.0445216 -0.0422562 -0.0398257 -0.0372518 -0.0345581 -0.0317702 -0.0289156
+-0.026023 -0.0231232 -0.0202486 -0.017431 -0.0147044 -0.0121031 -0.0096622
+-0.00741702 -0.005403 -0.00365547 -0.0022094 -0.00109925 -0.000358622
+-2.01453e-05 -0.000115228 -0.000673809 -0.00172498 -0.00329543 -0.00540843
+-0.00808603 -0.0113479 -0.015211 -0.0196895 -0.024795 -0.0305356 -0.0369165
+-0.0439397 -0.0516038 -0.059904 -0.0688322 -0.0783766 -0.088523 -0.0992524
+-0.110542 -0.122367 -0.134699 -0.147506 -0.160752 -0.174401 -0.188411
+-0.202739 -0.217341 -0.232167 -0.247167 -0.26229 -0.277483 -0.29269
+-0.307856 -0.322923 -0.337834 -0.352533 -0.366961 -0.381061 -0.394776
+-0.408052 -0.420832 -0.433065 -0.444698 -0.455683 -0.465971 -0.475519
+-0.484281 -0.49222 -0.499302 -0.505495 -0.510768 -0.515098 -0.518463
+-0.520847 -0.522235 -0.52262 -0.521998 -0.520367 -0.517732 -0.514102
+-0.50949 -0.503909 -0.497386 -0.489944 -0.481613 -0.472426 -0.462422
+-0.451639 -0.440123 -0.427919 -0.415079 -0.401654 -0.387699 -0.373272
+-0.35843 -0.343234 -0.327743 -0.312021 -0.296132 -0.280139 -0.264104
+-0.24809 -0.232157 -0.216367 -0.200778 -0.185447 -0.170429 -0.155777
+-0.14154 -0.127766 -0.114497 -0.101775 -0.0896359 -0.0781121 -0.0672322
+-0.0570203 -0.0474965 -0.0386757 -0.0305688 -0.0231816 -0.0165155 -0.0105668
+-0.00532719 -0.000783692 0.00308143 0.00629065 0.00887083 0.010853
+0.0122725 0.0131687 0.0135849 0.0135679 0.0131677 0.0124376 0.0114335
+0.0102141 0.00883987 0.0073734 0.0058787 0.00442091 0.00306682 0.00188272
+0.000934473 0.000288159 9.1593e-06 0.00016179 0.000808886 0.00201148
+0.00382843 0.00631607 0.00952785 0.013514 0.0183214 0.0239929 0.0305675
+0.0380812 0.046563 0.0560373 0.0665245 0.0780394 0.0905917 0.104186
+0.11882 0.134489 0.151179 0.168872 0.187545 0.207169 0.227709 0.249127
+0.271376 0.294407 0.318164 0.342589 0.367616 0.393178 0.419203 0.445616
+0.472339 0.499289 0.526384 0.553537 0.58066 0.607664 0.63446 0.660954
+0.687057 0.71268 0.737733 0.762128 0.785778 0.808598 0.830507 0.851424
+0.871272 0.88998 0.907477 0.923699 0.938586 0.95208 0.964129 0.97469
+0.983724 0.991196 0.997079 1.00135 1.00399 1.005 1.00436 1.00208 0.998172
+0.992647 0.985527 0.976839 0.966613 0.954885 0.941703 0.927119 0.911187
+0.893965 0.875519 0.855916 0.835229 0.813532 0.790906 0.767432 0.743194
+0.718278 0.692773 0.666767 0.640349 0.613613 0.586648 0.559544 0.532391
+0.505277 0.478288 0.451509 0.425021 0.398903 0.373232 0.348081 0.323518
+0.299607 0.276411 0.253984 0.232379 0.21164 0.19181 0.172923 0.15501
+0.138096 0.1222 0.107336 0.0935105 0.0807274 0.0689832 0.0582694 0.0485722
+0.0398741 0.0321501 0.0253707 0.0195023 0.014507 0.0103427 0.00696339
+0.00431967 0.00235874 0.00102489 0.000259768 2.81318e-06 0.000191559
+0.00076199 0.00164893 0.00278769 0.0041106 0.00555107 0.00704304 0.00852114
+0.00992106 0.0111799 0.0122367 0.0130323 0.0135102 0.0136165 0.0133004
+0.0125143 0.0112143 0.00936005 0.00691538 0.00384796 0.000130028 -0.00426175
+-0.00934614 -0.0151372 -0.0216443 -0.0288722 -0.0368205 -0.0454845
+-0.0548545 -0.0649162 -0.0756509 -0.0870353 -0.0990417 -0.111638 -0.124788
+-0.138454 -0.152592 -0.167156 -0.182097 -0.197363 -0.212899 -0.228649
+-0.244555 -0.260556 -0.276591 -0.292598 -0.308515 -0.324278 -0.339823
+-0.35509 -0.370016 -0.384541 -0.398607 -0.412155 -0.425131 -0.437482
+-0.449156 -0.460106 -0.470288 -0.479661 -0.488186 -0.495829 -0.502558
+-0.508346 -0.513173 -0.517021 -0.519876 -0.521728 -0.522574 -0.522411
+-0.521243 -0.519078 -0.515928 -0.511809 -0.506742 -0.50075 -0.493862
+-0.486108 -0.477522 -0.468146 -0.458019 -0.447186 -0.435693 -0.42359
+-0.410927 -0.397758 -0.384136 -0.370117 -0.355757 -0.341114 -0.326245
+-0.311208 -0.296058 -0.280855 -0.265653 -0.250509 -0.235477 -0.220607
+-0.205952 -0.191558 -0.177473 -0.163741 -0.150401 -0.137494 -0.125054
+-0.113114 -0.101703 -0.0908486 -0.0805724 -0.0708935 -0.0618278 -0.0533878
+-0.0455822 -0.0384168 -0.0318935 -0.0260113 -0.0207656 -0.0161488 -0.0121503
+-0.00875648 -0.00595085 -0.00371445 -0.00202755 -0.000864403 -0.000199048
+-3.61611e-06 -0.00024852 -0.000902653 -0.00193365 -0.00330809 -0.0049917
+-0.0069496 -0.00914652 -0.011547 -0.0141157 -0.0168176 -0.0196181 -0.022484
+-0.0253814 -0.0282781 -0.0311436 -0.0339485 -0.0366651 -0.0392675 -0.0417315
+-0.0440349 -0.0461578 -0.0480821 -0.0497922 -0.0512747 -0.0525185 -0.0535151
+-0.0542585 -0.0547443 -0.0549706 -0.0549383 -0.0546501 -0.0541111 -0.0533285
+-0.0523114 -0.0510709 -0.0496197 -0.0479724 -0.0461449 -0.0441544 -0.0420195
+-0.0397598 -0.0373956 -0.0349481 -0.032439 -0.0298904 -0.0273243 -0.0247631
+-0.0222287 -0.0197427 -0.0173263 -0.0149999 -0.0127832 -0.0106947 -0.0087519
+-0.0069711 -0.00536769 -0.00395492 -0.00274396 -0.00174494 -0.000965962
+-0.000413597 -9.23574e-05 -4.82219e-06 -0.000151676 -0.000531763 -0.00114204
+-0.00197737 -0.00303092 -0.00429399 -0.00575604 -0.007405 -0.00922715
+-0.0112073 -0.0133289 -0.0155743 -0.0179244 -0.0203595 -0.022859 -0.0254016
+-0.0279656 -0.0305288 -0.0330691 -0.0355643 -0.0379925 -0.0403321 -0.0425634
+-0.0446649 -0.0466172 -0.048402 -0.0500024 -0.0514026 -0.0525888 -0.0535485
+-0.0542711 -0.0547481 -0.0549727 -0.0549405 -0.054649 -0.0540984 -0.0532908
+-0.052231 -0.0509259 -0.0493846 -0.047619 -0.0456429 -0.0434727 -0.0411267
+-0.0386255 -0.0359919 -0.0332505 -0.0304276 -0.0275514 -0.0246515 -0.0217589
+-0.0189062 -0.0161273 -0.0134557 -0.0109259 -0.00857325 -0.0064331
+-0.00454089 -0.00293179 -0.00164055 -0.000701257 -0.000147088 -1.01024e-05
+-0.000321048 -0.00110908 -0.00240161 -0.0042247 -0.0066024 -0.00955428
+-0.0130988 -0.0172516 -0.0220257 -0.0274309 -0.0334741 -0.040159 -0.0474859
+-0.0554518 -0.0640503 -0.0732717 -0.0831026 -0.0935263 -0.104523 -0.11607
+-0.128139 -0.140699 -0.153719 -0.167161 -0.180986 -0.195152 -0.209616
+-0.224329 -0.239244 -0.254309 -0.269472 -0.284679 -0.299873 -0.315
+-0.33 -0.344818 -0.359396 -0.373676 -0.387601 -0.401115 -0.414163 -0.426691
+-0.438646 -0.449978 -0.460639 -0.470582 -0.479764 -0.488145 -0.495684
+-0.502348 -0.508109 -0.512938 -0.516814 -0.519716 -0.52163 -0.522544
+-0.522452 -0.521351 -0.519244 -0.516137 -0.51204 -0.506968 -0.500941
+-0.493979 -0.486112 -0.477372 -0.467793 -0.457415 -0.446279 -0.434432
+-0.42192 -0.408797 -0.395114 -0.380928 -0.366297 -0.351281 -0.335939
+-0.320334 -0.304525 -0.288579 -0.272557 -0.256524 -0.24054 -0.224667
+-0.208965 -0.19349 -0.1783 -0.163449 -0.148987 -0.134963 -0.121423
+-0.108408 -0.0959574 -0.0841054 -0.0728827 -0.0623159 -0.0524272 -0.0432343
+-0.0347501 -0.0269831 -0.0199372 -0.0136111 -0.00799919 -0.00309081
+0.00112929 0.00468102 0.00758882 0.00988165 0.0115928 0.0127595 0.013423
+0.0136281 0.0134233 0.0128602 0.0119934 0.0108801 0.00957982 0.00815419
+0.00666645 0.00518121 0.00376403 0.00248112 0.00139963 0.000586143
+0.000105644 2.30652e-05 0.000402063 0.00130466 0.0027909 0.00491848
+0.00774243 0.0113147 0.015684 0.0208952 0.0269895 0.0340037 0.0419702
+0.050918 0.0608695 0.0718416 0.0838466 0.0968918 0.110979 0.126104
+0.142258 0.159425 0.177585 0.196712 0.216775 0.237735 0.259552 0.282177
+0.305559 0.32964 0.354358 0.379647 0.405438 0.431657 0.458226 0.485067
+0.512097 0.53923 0.56638 0.593458 0.620376 0.647042 0.673366 0.699253
+0.724617 0.749369 0.773422 0.796689 0.819087 0.840535 0.860955 0.880272
+0.898414 0.915315 0.930911 0.945145 0.957963 0.969316 0.979158 0.987456
+0.994178 0.999299 1.0028 1.00467 1.00489 1.00348 1.00042 0.995748 0.989465
+0.981598 0.972178 0.96124 0.948824 0.934973 0.919743 0.903194 0.885384
+0.866382 0.846257 0.825083 0.802936 0.779899 0.756053 0.731483 0.706278
+0.680525 0.654315 0.627737 0.600881 0.573839 0.546701 0.519556 0.49249
+0.46559 0.438938 0.412616 0.386701 0.361267 0.336386 0.312124 0.288544
+0.265705 0.24366 0.222459 0.202145 0.182756 0.164327 0.146884 0.130449
+0.11504 0.100666 0.0873343 0.0750436 0.0637884 0.0535577 0.0443352
+0.0360995 0.0288256 0.0224819 0.0170317 0.0124353 0.00864856 0.00562391
+0.00331021 0.00165327 0.000596095 7.9242e-05 4.12037e-05 0.000418706
+0.00114715 0.00216096 0.00339391 0.00478055 0.00625375 0.00774738 0.00919655
+0.0105376 0.0117084 0.0126489 0.0133011 0.0136098 0.0135225 0.0129898
+0.0119659 0.0104085 0.00827921 0.00554367 0.00217182 -0.00186214 -0.00657939
+-0.0119965 -0.0181253 -0.0249729 -0.0325418 -0.0408294 -0.0498286 -0.0595277
+-0.0699102 -0.0809552 -0.0926373 -0.104927 -0.117791 -0.13119 -0.145085
+-0.159431 -0.17418 -0.189281 -0.204682 -0.220327 -0.236158 -0.252116
+-0.268141 -0.28417 -0.300142 -0.315994 -0.331663 -0.347085 -0.362198
+-0.376942 -0.391257 -0.405085 -0.418369 -0.431055 -0.443091 -0.454428
+-0.46502 -0.474824 -0.483799 -0.491911 -0.499125 -0.505415 -0.510754
+-0.515119 -0.518498 -0.52088 -0.522256 -0.522623 -0.521984 -0.520343
+-0.517709 -0.514099 -0.509528 -0.50402 -0.4976 -0.490298 -0.482148
+-0.473184 -0.463447 -0.45298 -0.441829 -0.430041 -0.417667 -0.404757
+-0.391367 -0.37755 -0.363363 -0.348862 -0.334105 -0.319149 -0.304052
+-0.288871 -0.273662 -0.258481 -0.243382 -0.22842 -0.213646 -0.199108
+-0.184855 -0.170931 -0.15738 -0.14424 -0.131549 -0.119342 -0.107649
+-0.0964978 -0.085913 -0.0759169 -0.0665264 -0.0577555 -0.0496148 -0.0421118
+-0.0352503 -0.0290308 -0.0234507 -0.0185039 -0.0141814 -0.0104711 -0.00735795
+-0.00482436 -0.00285004 -0.00141234 -0.000488103 -4.88687e-05 -6.57541e-05
+-0.000508407 -0.00134512 -0.00254298 -0.00406817 -0.00588607 -0.00796158
+-0.0102594 -0.012744 -0.0153801 -0.0181329 -0.0209681 -0.0238521 -0.0267533
+-0.0296392 -0.0324798 -0.0352465 -0.0379125 -0.0404525 -0.0428435 -0.0450642
+-0.0470955 -0.0489207 -0.050525 -0.0518962 -0.0530243 -0.0539018 -0.0545234
+-0.0548865 -0.0549902 -0.0548362 -0.0544285 -0.0537732 -0.0528782 -0.0517538
+-0.0504117 -0.0488655 -0.0471305 -0.0452234 -0.0431619 -0.0409651 -0.038653
+-0.0362464 -0.0337666 -0.0312356 -0.0286755 -0.0261085 -0.0235567 -0.0210419
+-0.0185857 -0.0162089 -0.0139314 -0.0117725 -0.00975025 -0.00788156
+-0.00618201 -0.0046657 -0.0033464 -0.00223521 -0.00134005 -0.000668307
+-0.000225561 -1.53937e-05 -3.94677e-05 -0.000297696 -0.000787943 -0.00150616
+-0.00244645 -0.00360105 -0.00496043 -0.00651319 -0.00824664 -0.0101462
+-0.0121961 -0.0143792 -0.0166771 -0.0190706 -0.0215393 -0.0240624 -0.0266183
+-0.0291851 -0.0317407 -0.0342627 -0.0367293 -0.0391185 -0.0414091 -0.0435804
+-0.045613 -0.0474878 -0.0491868 -0.0506939 -0.0519941;
+#A 3000 -0.0530741 -0.0539225 -0.0545295 -0.0548874 -0.0549907 -0.0548357
+-0.0544213 -0.0537485 -0.0528206 -0.0516434 -0.050225 -0.0485759 -0.0467088
+-0.0446386 -0.0423828 -0.0399607 -0.037394 -0.0347063 -0.031923 -0.0290714
+-0.0261804 -0.0232802 -0.0204025 -0.0175801 -0.0148467 -0.012238 -0.00978778
+-0.00753143 -0.00550437 -0.00374191 -0.00227908 -0.00115035 -0.000389366
+-2.88408e-05 -0.000100225 -0.000633543 -0.00165716 -0.00319759 -0.00527927
+-0.00792478 -0.0111551 -0.0149858 -0.0194314 -0.0245032 -0.0302099
+-0.0365566 -0.0435456 -0.0511757 -0.0594421 -0.068337 -0.0778488 -0.0879627
+-0.0986603 -0.10992 -0.121717 -0.134022 -0.146804 -0.160028 -0.173657
+-0.187649 -0.201961 -0.216549 -0.231364 -0.246357 -0.261475 -0.276665
+-0.291872 -0.307041 -0.322115 -0.337037 -0.351748 -0.366192 -0.380311
+-0.394048 -0.407348 -0.420156 -0.432419 -0.444085 -0.455105 -0.465432
+-0.47502 -0.483827 -0.491815 -0.498948 -0.50519 -0.510513 -0.514894
+-0.51831 -0.520746 -0.522188 -0.522627 -0.522057 -0.52048 -0.517898
+-0.514321 -0.50976 -0.504233 -0.497761 -0.490369 -0.482085 -0.472943
+-0.462981 -0.452239 -0.44076 -0.428591 -0.415783 -0.402388 -0.38846
+-0.374056 -0.359235 -0.344056 -0.328582 -0.312874 -0.296995 -0.281005
+-0.26497 -0.248952 -0.233013 -0.217214 -0.201612 -0.186265 -0.171229
+-0.156555 -0.142295 -0.128494 -0.115198 -0.102445 -0.0902738 -0.078716
+-0.0678007 -0.0575523 -0.0479909 -0.0391319 -0.0309864 -0.0235605 -0.0168556
+-0.0108684 -0.00559097 -0.00101042 0.00289072 0.00613451 0.00874752
+0.0107607 0.0122092 0.0131326 0.0135735 0.0135786 0.0131978 0.0124842
+0.0114936 0.0102844 0.00891725 0.00745443 0.00595992 0.00449886 0.00313714
+0.00194113 0.000977252 0.000312185 1.20375e-05 0.000140129 0.000759387
+0.00193095 0.00371378 0.00616437 0.00933631 0.0132801 0.0180426 0.023667
+0.0301925 0.0376538 0.0460811 0.0554999 0.0659315 0.0773913 0.0898882
+0.103427 0.118006 0.133619 0.150255 0.167895 0.186517 0.20609 0.226583
+0.247954 0.270159 0.293148 0.316867 0.341257 0.366254 0.391789 0.417791
+0.444185 0.470893 0.497833 0.524921 0.552073 0.579199 0.606211 0.63302
+0.659535 0.685664 0.711319 0.736405 0.760837 0.784529 0.807396 0.829354
+0.850325 0.870232 0.889002 0.906565 0.922856 0.937815 0.951385 0.963515
+0.974161 0.983281 0.990838 0.996805 1.00116 1.00389 1.00498 1.00443
+1.00224 0.998417 0.992978 0.985942 0.977336 0.967193 0.955551 0.942454
+0.92795 0.912087 0.894932 0.876549 0.857005 0.836373 0.814727 0.792148
+0.768716 0.744516 0.719634 0.694158 0.668177 0.641781 0.615061 0.588106
+0.561007 0.533854 0.506735 0.479737 0.452943 0.426437 0.400298 0.374601
+0.34942 0.324824 0.300877 0.277641 0.255171 0.233519 0.212733 0.192852
+0.173914 0.155949 0.138981 0.12303 0.10811 0.094229 0.0813903 0.0695909
+0.0588224 0.0490713 0.040319 0.0325415 0.0257102 0.019793 0.0147522
+0.0105448 0.00712501 0.00444351 0.00244768 0.00108195 0.000288137 5.76849e-06
+0.000172452 0.000724269 0.00159607 0.00272195 0.00403556 0.00547045
+0.00696124 0.00844206 0.0098481 0.0111164 0.0121857 0.012997 0.0134935
+0.0136213 0.0133292 0.0125696 0.0112984 0.00947488 0.00706274 0.00402956
+0.000347331 -0.00400757 -0.00905419 -0.0148069 -0.0212752 -0.0284642
+-0.0363737 -0.0449993 -0.0543315 -0.0643563 -0.0750551 -0.086405 -0.0983786
+-0.110944 -0.124067 -0.137707 -0.151821 -0.166364 -0.181286 -0.196535
+-0.212058 -0.227798 -0.243696 -0.259694 -0.275728 -0.291738 -0.30766
+-0.323433 -0.338992 -0.354277 -0.369224 -0.383772 -0.397863 -0.41144
+-0.424448 -0.436832 -0.448543 -0.459533 -0.469757 -0.479173 -0.487744
+-0.495434 -0.502215 -0.508058 -0.512941 -0.516845 -0.519753 -0.521659
+-0.522558 -0.522448 -0.521334 -0.519221 -0.516123 -0.512056 -0.507038
+-0.501095 -0.494253 -0.486545 -0.478005 -0.468672 -0.458584 -0.447788
+-0.436329 -0.424257 -0.411622 -0.398478 -0.384878 -0.370879 -0.356536
+-0.341907 -0.327048 -0.312019 -0.296875 -0.281674 -0.266472 -0.251323
+-0.236283 -0.221403 -0.206735 -0.192326 -0.178223 -0.164471 -0.151109
+-0.138178 -0.125712 -0.113745 -0.102305 -0.0914193 -0.0811102 -0.0713974
+-0.062298 -0.0538243 -0.0459848 -0.0387852 -0.0322278 -0.0263115 -0.0210321
+-0.0163822 -0.0123512 -0.00892562 -0.00608921 -0.00382305 -0.00210573
+-0.000913555 -0.00022067 -6.98707e-07 -0.00022309 -0.000856424 -0.00186837
+-0.00322556 -0.00489375 -0.00683811 -0.00902335 -0.0114141 -0.0139749
+-0.0166706 -0.0194667 -0.0223291 -0.0252248 -0.0281217 -0.0309898 -0.033799
+-0.0365213 -0.0391306 -0.0416028 -0.0439157 -0.0460489 -0.0479844 -0.0497066
+-0.0512017 -0.0524587 -0.0534687 -0.0542253 -0.0547242 -0.0549639 -0.0549454
+-0.0546709 -0.0541452 -0.0533755 -0.0523708 -0.051142 -0.0497018 -0.0480647
+-0.0462464 -0.0442643 -0.0421367 -0.0398833 -0.0375244 -0.035081 -0.0325749
+-0.030028 -0.0274624 -0.0249005 -0.0223642 -0.0198752 -0.0174547 -0.0151232
+-0.0129002 -0.0108046 -0.00885375 -0.00706404 -0.00545029 -0.00402599
+-0.00280286 -0.00179157 -0.00100078 -0.000436257 -0.00010271 -2.78551e-06
+-0.000137201 -0.000505013 -0.0011032 -0.00192677 -0.00296897 -0.00422119
+-0.00567302 -0.00731247 -0.00912585 -0.0110981 -0.0132128 -0.0154521
+-0.0177972 -0.0202284 -0.0227251 -0.025266 -0.0278294 -0.0303933 -0.0329354
+-0.0354337 -0.037866 -0.040211 -0.0424474 -0.0445551 -0.0465148 -0.0483088
+-0.0499196 -0.0513312 -0.0525293 -0.0535017 -0.0542374 -0.0547279 -0.0549664
+-0.0549482 -0.0546709 -0.0541343 -0.0533406 -0.0522942 -0.0510019 -0.0494728
+-0.0477189 -0.0457538 -0.0435937 -0.0412567 -0.0387635 -0.0361366 -0.0334005
+-0.0305815 -0.0277076 -0.0248085 -0.021915 -0.0190594 -0.016275 -0.0135957
+-0.0110563 -0.00869333 -0.00654109 -0.00463491 -0.00300998 -0.00170109
+-0.000742351 -0.000166997 -7.15865e-06 -0.000293634 -0.00105569 -0.00232084
+-0.00411462 -0.00646047 -0.00937943 -0.0128902 -0.0170103 -0.0217511
+-0.0271226 -0.0331317 -0.0397824 -0.0470751 -0.0550071 -0.0635721 -0.0727606
+-0.0825593 -0.0929518 -0.103918 -0.115435 -0.127476 -0.14001 -0.153006
+-0.166427 -0.180232 -0.194382 -0.208831 -0.223532 -0.238437 -0.253496
+-0.268655 -0.28386 -0.299056 -0.314188 -0.329197 -0.344026 -0.358619
+-0.372916 -0.386861 -0.400399 -0.413472 -0.426029 -0.438016 -0.449382
+-0.460079 -0.470062 -0.479285 -0.487709 -0.495297 -0.502013 -0.507827
+-0.512709 -0.516635 -0.519589 -0.521556 -0.522523 -0.522485 -0.521438
+-0.519384 -0.516329 -0.512285 -0.507264 -0.501287 -0.494376 -0.486559
+-0.477866 -0.468332 -0.457995 -0.446898 -0.435087 -0.422609 -0.409516
+-0.395861 -0.381701 -0.367092 -0.352094 -0.336768 -0.321175 -0.305378
+-0.289441 -0.273424 -0.25739 -0.241401 -0.22552 -0.209807 -0.194318
+-0.179111 -0.16424 -0.149756 -0.135707 -0.122139 -0.109095 -0.0966131
+-0.0847279 -0.0734705 -0.0628677 -0.052942 -0.0437111 -0.0351885 -0.0273828
+-0.020298 -0.0139333 -0.00828317 -0.00333725 0.000919462 0.00450662
+0.00744845 0.0097736 0.011515 0.0127098 0.0133989 0.0136275 0.0134435
+0.0128984 0.0120466 0.0109452 0.00965366 0.0082334 0.00674764 0.00526091
+0.00383874 0.00254732 0.00145305 0.000622293 0.000120861 1.41127e-05
+0.000366974 0.00124018 0.00269389 0.00478594 0.00757149 0.0111027 0.0154283
+0.0205937 0.0266399 0.0336042 0.0415192 0.0504127 0.060308 0.071223
+0.0831714 0.096161 0.110193 0.125262 0.141362 0.158475 0.176583 0.195659
+0.215672 0.236586 0.258357 0.28094 0.304282 0.328326 0.353011 0.378271
+0.404037 0.430235 0.456787 0.483615 0.510637 0.537766 0.564916 0.592
+0.618928 0.645609 0.671952 0.697869 0.723267 0.74806 0.772154 0.795465
+0.817911 0.839411 0.859888 0.879264 0.897471 0.914438 0.930105 0.944412
+0.957306 0.968739 0.978666 0.987051 0.993862 0.99907 1.00266 1.00461
+1.00492 1.00359 1.00063 0.996038 0.989839 0.982056 0.972717 0.961859
+0.949521 0.935751 0.9206 0.904125 0.886381 0.86744 0.847372 0.826251
+0.804154 0.781161 0.757356 0.732822 0.707648 0.681922 0.655734 0.629173
+0.602331 0.575298 0.548164 0.521016 0.493943 0.467032 0.440364 0.414022
+0.388083 0.362622 0.337709 0.313412 0.289795 0.266915 0.244826 0.223578
+0.203215 0.183775 0.165293 0.147796 0.131307 0.115843 0.101414 0.088026
+0.0756797 0.0643695 0.0540845 0.0448087 0.036521 0.0291952 0.0228004
+0.0173014 0.0126591 0.00883048 0.00576657 0.00341645 0.00172604 0.000638509
+9.45273e-05 3.26668e-05 0.000389773 0.00110128 0.00210166 0.00332471
+0.00470401 0.00617324 0.00766658 0.00911956 0.0104683 0.0116501 0.0126047
+0.013274 0.0136027 0.0135381 0.0130306 0.0120343 0.0105066 0.00840898
+0.00570685 0.00236989 -0.00162784 -0.00630778 -0.0116868 -0.017777
+-0.0245858 -0.0321158 -0.0403648 -0.0493259 -0.0589876 -0.0693337 -0.0803434
+-0.0919918 -0.104249 -0.117083 -0.130456 -0.144326 -0.15865 -0.173378
+-0.188462 -0.203848 -0.219481 -0.235303 -0.251256 -0.267278 -0.283309
+-0.299285 -0.315144 -0.330824 -0.34626 -0.361393 -0.376159 -0.3905
+-0.404355 -0.417669 -0.430388 -0.44246 -0.453835 -0.464467 -0.474314
+-0.483334 -0.491492 -0.498755 -0.505094 -0.510485 -0.514908 -0.518344
+-0.520784 -0.522213 -0.522634 -0.522048 -0.52046 -0.517879 -0.514319
+-0.509799 -0.50434 -0.497968 -0.490712 -0.482606 -0.473685 -0.46399
+-0.453562 -0.442447 -0.430692 -0.418347 -0.405465 -0.392098 -0.378302
+-0.364133 -0.349648 -0.334903 -0.319956 -0.304866 -0.289688 -0.274479
+-0.259296 -0.244193 -0.229222 -0.214436 -0.199884 -0.185615 -0.171672
+-0.158099 -0.144937 -0.132222 -0.119988 -0.108266 -0.0970856 -0.0864701
+-0.076441 -0.0670162 -0.0582102 -0.0500349 -0.0424977 -0.035602 -0.000195025
+-0.00102156 -0.00248065 -0.00453159 -0.00714318 -0.0102386 -0.0137406
+-0.0175993 -0.0216921 -0.0259289 -0.03022 -0.0344517 -0.0385237 -0.0423322
+-0.0457911 -0.0488006 -0.051279 -0.0531749 -0.0544157 -0.0549632 -0.0547987
+-0.0539093 -0.0523049 -0.0500142 -0.0470861 -0.0435809 -0.0395815 -0.0351925
+-0.0305229 -0.0257014 -0.0208697 -0.0161771 -0.0117849 -0.00785333
+-0.00454718 -0.00203075 -0.000465264 -1.07219e-05 -0.000807538 -0.00298886
+-0.00667315 -0.0119618 -0.0189412 -0.0276659 -0.038172 -0.0504701 -0.0645467
+-0.0803641 -0.0978497 -0.116907 -0.137416 -0.159234 -0.182184 -0.206078
+-0.230704 -0.255828 -0.281214 -0.306596 -0.33172 -0.356312 -0.380107
+-0.402847 -0.424249 -0.444088 -0.462123 -0.478131 -0.491931 -0.503323
+-0.512187 -0.518395 -0.521861 -0.522543 -0.520386 -0.515437 -0.507731
+-0.497345 -0.484406 -0.469025 -0.451409 -0.431746 -0.410256 -0.387198
+-0.362809 -0.337392 -0.311221 -0.28459 -0.2578 -0.231122 -0.204858
+-0.179274 -0.154621 -0.131143 -0.109043 -0.0885161 -0.0697132 -0.0527608
+;
+#A 4000 -0.037752 -0.0247336 -0.0137309 -0.00472287 0.00234915 0.00757534
+0.0110845 0.0130378 0.0136281 0.0130747 0.0116243 0.00954587 0.00712178
+0.00464951 0.00243512 0.000789928 2.41574e-05 0.000437562 0.00232164
+0.00595223 0.0115878 0.019461 0.0297706 0.0426862 0.0583433 0.0768423
+0.0982366 0.12254 0.149723 0.179709 0.212389 0.247601 0.285143 0.324774
+0.366219 0.409176 0.453285 0.498198 0.543526 0.588854 0.633778 0.677867
+0.720706 0.761873 0.800963 0.837593 0.871354 0.90194 0.929031 0.952322
+0.971589 0.986613 0.997251 1.00338 1.00495 1.00194 0.99434 0.982287
+0.965899 0.945322 0.920794 0.892557 0.860919 0.826198 0.788751 0.748964
+0.707207 0.663924 0.619528 0.574426 0.529054 0.483817 0.439119 0.395335
+0.352827 0.311931 0.272934 0.236112 0.20169 0.16985 0.140746 0.114477
+0.0911017 0.0706335 0.0530461 0.0382755 0.026208 0.0166969 0.00956089
+0.0045876 0.00154261 0.000159556 0.000155497 0.00123491 0.00309297
+0.00542331 0.00791377 0.01026 0.0121686;
+#X coords 0 1 4098 -1 515 140 1;
+#X restore 115 65 graph;
+#X obj 117 219 hsl 515 18 55 440 1 0 \$0-freq empty empty -2 -6 1153
+8 -2688 -1 -1 28400 0;
+#X obj 19 447 *~;
+#X obj 91 218 tgl 20 0 \$0-amp1 empty empty 0 -6 1153 8 -2688 -1 -1
+1 1;
+#X obj 427 526 dac~;
+#X obj 442 499 *~;
+#X obj 467 452 r \$0-master-level;
+#X obj 500 526 tabwrite~ \$0-sinewave;
+#X obj 650 30 vsl 22 200 0 1 0 0 \$0-master-level empty amplitude -9
+-8 1153 10 -225271 -1 -1 5000 1;
+#X obj 500 480 loadbang;
+#X obj 479 482 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 44 380 r \$0-amp1;
+#X obj 44 424 line~;
+#X msg 44 402 \$1 10;
+#X obj 142 447 *~;
+#X obj 167 424 line~;
+#X msg 167 402 \$1 10;
+#X obj 266 447 *~;
+#X obj 291 424 line~;
+#X msg 291 402 \$1 10;
+#X obj 167 380 r \$0-amp2;
+#X obj 291 380 r \$0-amp3;
+#X obj 387 447 *~;
+#X obj 412 424 line~;
+#X msg 412 402 \$1 10;
+#X obj 412 380 r \$0-amp4;
+#N canvas 683 260 535 488 record 0;
+#X obj 119 79 inlet~;
+#X obj 265 79 inlet;
+#X msg 235 243 start;
+#X msg 465 210 stop;
+#X obj 230 305 writesf~;
+#X obj 264 153 sel 1;
+#X obj 264 177 savepanel;
+#X msg 315 242 open \$1;
+#X obj 264 199 t b s;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 5 0 6 0;
+#X connect 5 1 3 0;
+#X connect 6 0 8 0;
+#X connect 7 0 4 0;
+#X connect 8 0 2 0;
+#X connect 8 1 7 0;
+#X restore 318 529 pd record;
+#X obj 381 497 tgl 25 0 empty empty empty 0 -6 0 8 -258049 -1 -1 0
+1;
+#X text 87 15 SINE WAVE OCTAVES;
+#X obj 91 246 tgl 20 0 \$0-amp2 empty empty 0 -6 1152 8 -2049 -1 -1
+1 1;
+#X obj 63 300 * 2;
+#X obj 63 323 osc~;
+#X obj 19 323 osc~;
+#X obj 107 300 * 2;
+#X obj 107 323 osc~;
+#X obj 151 300 * 2;
+#X obj 151 323 osc~;
+#X obj 589 335 r \$0-freq;
+#X obj 18 272 r \$0-freq;
+#X obj 589 378 t b f;
+#X obj 500 503 metro;
+#X floatatom 650 438 5 0 0 0 - - -;
+#X obj 557 506 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 591 413 / 10;
+#X obj 617 499 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 2 0 5 0;
+#X connect 5 0 4 0;
+#X connect 5 0 4 1;
+#X connect 5 0 7 0;
+#X connect 5 0 26 0;
+#X connect 6 0 5 1;
+#X connect 9 0 40 0;
+#X connect 10 0 40 0;
+#X connect 11 0 13 0;
+#X connect 12 0 2 1;
+#X connect 13 0 12 0;
+#X connect 14 0 5 0;
+#X connect 15 0 14 1;
+#X connect 16 0 15 0;
+#X connect 17 0 5 0;
+#X connect 18 0 17 1;
+#X connect 19 0 18 0;
+#X connect 20 0 16 0;
+#X connect 21 0 19 0;
+#X connect 22 0 5 0;
+#X connect 23 0 22 1;
+#X connect 24 0 23 0;
+#X connect 25 0 24 0;
+#X connect 27 0 26 1;
+#X connect 30 0 31 0;
+#X connect 30 0 33 0;
+#X connect 31 0 2 0;
+#X connect 32 0 2 0;
+#X connect 33 0 34 0;
+#X connect 33 0 35 0;
+#X connect 35 0 36 0;
+#X connect 37 0 39 0;
+#X connect 38 0 32 0;
+#X connect 38 0 30 0;
+#X connect 39 0 40 0;
+#X connect 39 1 43 0;
+#X connect 40 0 7 0;
+#X connect 40 0 42 0;
+#X connect 43 0 40 1;
+#X connect 43 0 41 0;
+#X connect 44 0 7 0;
diff --git a/doc/tutorials/cognition/perception_is_logarithmic.pd b/doc/tutorials/cognition/perception_is_logarithmic.pd
new file mode 100644
index 0000000000000000000000000000000000000000..22c194b52a24081dc153c788c2b74de49da38549
--- /dev/null
+++ b/doc/tutorials/cognition/perception_is_logarithmic.pd
@@ -0,0 +1,73 @@
+#N canvas 144 134 933 716 36;
+#X obj 36 251 mtof;
+#X floatatom 247 353 5 0 0 0 - - -;
+#X obj 36 420 osc~;
+#X obj 36 582 *~;
+#X obj 20 642 dac~;
+#X obj 362 612 hsl 500 40 0 1 0 0 empty empty amplitude 20 20 0 24
+-262144 -1 -1 49900 1;
+#X floatatom 98 194 5 0 0 0 - - -;
+#X obj 817 77 pddp/dsp;
+#X floatatom 421 540 5 0 0 0 - - -;
+#X obj 360 473 float;
+#X msg 360 412 bang;
+#X msg 472 412 0;
+#X floatatom 683 546 5 0 0 0 - - -;
+#X obj 630 473 float;
+#X msg 630 412 bang;
+#X msg 742 412 0.1;
+#X msg 835 411 0;
+#X obj 761 473 * 1.3;
+#X obj 491 473 + 0.1;
+#X obj 375 357 hsl 500 40 0 10000 0 0 empty empty frequency 20 20 0
+24 -262144 -1 -1 4929 1;
+#X obj 237 127 + 1;
+#X msg 281 67 36;
+#X msg 575 189 65.4;
+#X obj 581 253 + 3.89;
+#X obj 36 67 metro 1000;
+#X obj 37 41 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1
+;
+#X obj 330 189 metro 1000;
+#X obj 331 163 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 330 253 float 65.4;
+#X obj 37 127 float 36;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
+#X connect 0 0 19 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 0 4 1;
+#X connect 5 0 3 1;
+#X connect 9 0 8 0;
+#X connect 9 0 5 0;
+#X connect 9 0 18 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 1;
+#X connect 11 0 9 0;
+#X connect 13 0 12 0;
+#X connect 13 0 5 0;
+#X connect 13 0 17 0;
+#X connect 14 0 13 0;
+#X connect 15 0 13 1;
+#X connect 15 0 13 0;
+#X connect 16 0 13 0;
+#X connect 17 0 13 1;
+#X connect 18 0 9 1;
+#X connect 20 0 29 1;
+#X connect 21 0 29 0;
+#X connect 22 0 28 1;
+#X connect 22 0 28 0;
+#X connect 23 0 28 1;
+#X connect 24 0 29 0;
+#X connect 25 0 24 0;
+#X connect 26 0 28 0;
+#X connect 27 0 26 0;
+#X connect 28 0 19 0;
+#X connect 28 0 2 0;
+#X connect 28 0 1 0;
+#X connect 28 0 23 0;
+#X connect 29 0 0 0;
+#X connect 29 0 6 0;
+#X connect 29 0 20 0;
diff --git a/doc/tutorials/externals-howto/HOWTO-externals-de.tex b/doc/tutorials/externals-howto/HOWTO-externals-de.tex
new file mode 100644
index 0000000000000000000000000000000000000000..73b2eedbd1b305f536f3b5c5e2d3bc1320a793cf
--- /dev/null
+++ b/doc/tutorials/externals-howto/HOWTO-externals-de.tex
@@ -0,0 +1,1806 @@
+% format latexg -*- latex -*-
+
+\documentclass[12pt, a4paper,austrian, titlepage]{article}
+
+
+%% HOWTO write an external for Pd
+%% Copyright (c) 2001-2006 by IOhannes m zmölnig
+%%
+%%  Permission is granted to copy, distribute and/or modify this document
+%%  under the terms of the GNU Free Documentation License, Version 1.2
+%%  or any later version published by the Free Software Foundation;
+%%  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+%%  Texts.  A copy of the license is included in the LICENSE.txt file.
+
+%sprache
+\usepackage[latin1]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{babel}
+
+% add hypertext support (fine for latex2html)
+\usepackage{html}
+
+% add landscape support (for rotating text through 90deg)
+\usepackage{lscape}
+
+
+%\begin{latexonly}
+% pdf kompatibilität
+\newif\ifpdf
+\ifx\pdfoutput\undefined
+  \pdffalse     % we are not running PDFLatex
+\else
+  \pdfoutput=1  % yes, we are running PDFLatex
+  \pdftrue
+\fi
+
+\latexhtml{
+\ifpdf
+  \usepackage[pdftex]{graphicx}
+  \pdfcompresslevel=9
+\else
+  \usepackage{graphicx}
+\fi
+}{
+\usepackage{graphicx}
+}
+
+
+\title{
+HOWTO \\
+write an External \\
+for {\em Pure data}
+}
+
+\author{
+johannes m zmölnig \\
+\\
+{\em
+\latexhtml{institut für elektronische musik und akustik}
+{\htmladdnormalink{institut für elektronische musik und akustik}{http://iem.at}}
+}
+}
+
+\date{}
+
+\begin {document}
+\maketitle
+
+\hyphenation{Echt-zeit}
+\hyphenation{Computer-musik-program-men}
+\hyphenation{Echt-zeit-Computer-musik-pro-gramm}
+
+\begin{abstract}
+Pd ist ein graphisches Computermusiksystem in der Tradition von IRCAMs {\em ISPW-max}.
+
+Obwohl eine Fülle von Funktionen von Pd selbst zur Verfügung gestellt 
+werden, stößt man doch manchmal an die Grenzen dessen,
+das mit diesen Primitiven und ihren Kombinationen möglich ist.
+
+Deswegen bietet Pd die Möglichkeit, eigene Primitive (``objects'', Objekte) in komplexen
+Programmiersprachen wie {\tt C/C++} zu erstellen.
+
+In diesem Dokument soll beschrieben werden, wie man solche Primitive mit Hilfe der 
+Sprache {\tt C}, in der auch Pd selbst realisiert wurde, schreibt.
+\end{abstract}
+
+
+\vfill
+\newpage
+
+\tableofcontents
+
+\vfill
+\newpage
+
+\section{Voraussetzungen und Begriffsbestimmungen}
+
+Pd bezieht sich auf das graphische Echtzeit-Computermusikprogramm von
+Miller~S.~Puckette.
+{\em Pure data}.
+
+Zum Verständnis dieses Dokumentes wird der Umgang mit Pd sowie
+Verständnis von Programmiertechniken, insbesondere {\tt C} vorausgesetzt.
+
+Zum Schreiben von eigenen Primitiven wird weiters ein {\tt C}-Compiler,
+der dem {\tt ANSI-C}-Standard genügt, notwendig sein.
+Solche Compiler sind beispielsweise der {\em Gnu C-Compiler} (gcc) auf linux-Systemen oder
+{\em Visual-C++} auf Windows-Systemen.
+
+\subsection{Klassen, Instanzen und Objekte}
+Pd ist in der Programmiersprache {\tt C} geschrieben.
+Allerdings ist Pd auf Grund seiner graphischen Natur ein {\em objektorientiertes} System.
+Da {\tt C} die Verwendung von Klassen nicht sehr gut unterstützt, ist der resultierende
+Quellcode nicht so elegant wie er zum Beispiel unter {\tt C++} wäre.
+
+Der Ausdruck {\em Klasse} bezieht sich in diesem Dokument auf die Realisierung eines
+Konzeptes, bei dem Daten und Manipulatoren eine Einheit bilden.
+
+Konkrete {\em Instanzen einer Klasse} sind {\em Objekte}.
+
+\subsection{Internals, Externals und Libraries}
+Um Begriffsverwirrungen von vorneherein auszuschließen, seien hier kurz die Ausdrücke
+{\em Internal}, {\em External} und {\em Library} erklärt.
+
+\paragraph{Internal}
+Ein {\em Internal} ist eine Klasse, die in Pd eingebaut ist.
+Viele Primitive wie ``+'', ``pack'' oder ``sig\~\/`` sind {\em Internals}
+
+\paragraph{External}
+Ein {\em External} ist eine Klasse, die nicht in Pd eingebaut ist und erst zur Laufzeit
+nachgeladen wird.
+Sind sie einmal im Speicher von Pd, so sind {\em Externals} nicht mehr von {\em Internals} zu
+unterscheiden.
+
+\paragraph{Library}
+Eine {\em Library} bezeichnet eine Sammlung von {\em Externals},
+die gemeinsam in eine Binärdatei kompiliert werden.
+
+{\em Library}-Dateien müssen eine betriebssystemabhängige Namenskonvention einhalten:
+
+\begin{tabular}{c||c|c|c}
+Bibliothek&linux&irix&Win32 \\
+\hline
+{\tt my\_lib}&{\tt  my\_lib.pd\_linux}&{\tt  my\_lib.pd\_irix}&
+{\tt  my\_lib.dll}\\
+\end{tabular}
+
+Die einfachste Form einer {\em Library} beinhaltet genau ein {\em External},
+das den selben Name trägt, wie auch die {\em Library}
+
+Im Gegensatz zu Externals können {\em Libraries} mit bestimmten Befehlen
+von Pd importiert werden.
+Ist eine {\em Library} importiert worden,
+so sind alle {\em Externals}, die sie beinhaltet,
+in den Speicher geladen und stehen als Objekte zur Verfügung.
+
+Pd stellt zwei Methoden zur Verfügung, um {\em Libraries} zu laden:
+\begin{itemize}
+\item mit der commandline-Option ``{\tt -lib my\_lib}''
+\item durch Kreieren eines Objektes ``{\tt my\_lib}''
+\end{itemize}
+
+Die erste Methode lädt die {\em Library} sofort beim Starten von Pd.
+Dies ist die zu bevorzugende Methode für {\em Libraries},
+die mehrere {\em Externals} beinhalten.
+
+Die zweite Methode ist für {\em Libraries} zu bevorzugen, die genau
+ein {\em External} mit dem selben Namen beinhalten.
+Bei der zweiten Methode wird zuerst geprüft, ob eine Klasse namens ``my\_lib'' bereits
+in den Speicher geladen ist.
+Ist dies nicht der Fall\footnote
+{Ist eine solche Klasse bereits im Speicher, wird ein
+Objekt namens ``my\_lib'' instanziiert und der Vorgang bricht ab.
+Es wird also keine neue {\em Library} geladen.
+Man kann daher keine {\em Libraries} mit bereits verwendeten Klassennamen,
+wie zum Beispiel ``abs'', laden.}
+so werden alle Pfade untersucht,
+ob darin eine Datei namens ``{\tt my\_lib.pd\_linux}''\footnote{
+oder einer anderen betriebssystemabhängigen Dateinamenerweiterung (s.o.)}
+existiert.
+Wird eine solche Datei gefunden, so werden alle in ihr enthaltenen {\em Externals}
+in den Speicher geladen.
+Danach wird nachgesehen, ob nun eine Klasse namens ``my\_lib''
+als (neu geladenes) {\em External} im Speicher existiert.
+Ist dies der Fall, so wird eine Instanz dieser Klasse geschaffen.
+Ansonsten wird eine Fehlermeldung ausgegeben, die Instanziierung ist gescheitert.
+
+
+\section{mein erstes External: {\tt helloworld}}
+Wie das beim Erlernen von Programmiersprachen so üblich ist,
+beginnen wir mit ``Hello world''.
+
+Ein Objekt soll geschaffen werden, dass jedesmal, wenn es
+mit ``bang'' getriggert wird, die Zeile ``Hello world!!'' auf
+die Standardausgabe schreibt.
+
+\subsection{die Schnittstelle zu Pd}
+Um ein Pd-External zu schreiben, braucht man eine wohldefinierte Schnittstelle.
+Diese wird in der Datei ``m\_pd.h'' zur Verfügung gestellt.
+
+\begin{verbatim}
+#include "m_pd.h"
+\end{verbatim}
+
+
+\subsection{eine Klasse und ihr Datenraum}
+Als nächstes muß eine neue Klasse vorbereitet und der
+Datenraum für diese Klasse definiert werden.
+
+\begin{verbatim}
+static t_class *helloworld_class;
+
+typedef struct _helloworld {
+  t_object  x_obj;
+} t_helloworld;
+\end{verbatim}
+
+\verb+hello_worldclass+ wird der Zeiger auf die neue Klasse.
+
+Die Struktur \verb+t_helloworld+ (vom Typ \verb+_helloworld+)
+stellt den Datenraum der Klasse dar.
+Ein unverzichtbares Element ist dabei eine Variable des Type \verb+t_object+.
+In ihr werden interne Objekteigenschaften abgelegt, wie zum Beispiel
+die Größe der Objekt-Box bei der graphischen Darstellung, aber auch
+Daten über Inlets und Outlets.
+\verb+t_object+ muss der erste Eintrag in die Struktur sein !
+
+Da bei einer einfachen ``Hello world''-Anwendung keine Variablen gebraucht werden,
+ist die Struktur ansonsten leer.
+
+\subsection{Methodenraum}
+Zu einer Klasse gehören neben einem Datenraum auch ein Satz von
+Manipulatoren (Methoden) mit denen diese Daten manipuliert werden können.
+
+Wird eine Message an eine Instanz unserer Klasse geschickt,
+so wird eine Methoden aufgerufen.
+Diese Mehtoden, die die Schnittstelle zum Messagesystem von Pd bilden, 
+haben grundsätzlich kein Rückgabeargument, sind also vom Typ \verb+void+.
+
+\begin{verbatim}
+void helloworld_bang(t_helloworld *x)
+{
+  post("Hello world !!");
+}
+\end{verbatim}
+
+Diese Methode hat ein Übergabeargument vom Typ \verb+t_helloworld+,
+sodass wir also unseren Datenraum manipulieren könnten.
+
+Da wir nur ``Hello world!'' ausgeben wollen (und ausserdem unser Datenraum
+recht spärlich ist), verzichten wir auf eine Manipulation.
+
+Mit dem Befehl \verb+post(char *c,...)+ wird eine Meldung an die Standardausgabe
+geschickt.
+Ein Zeilenumbruch wird automatisch angehängt.
+Ansonsten funktioniert \verb+post()+ gleich wie der {\tt C}-Befehl \verb+printf()+.
+
+\subsection{Generierung einer neuen Klasse}
+Um eine neue Klasse zu generieren, müssen Angaben über
+den Datenraum und den Methodenraum dieser Klasse 
+beim Laden einer Library an Pd übergeben werden.
+
+Wird eine neue Library ``my\_lib'' geladen,
+so versucht Pd eine Funktion ``my\_lib\_setup()'' aufzurufen.
+Diese Funktion (oder von ihr aufgerufene Funktionen) teilt Pd mit,
+welche Eigenschaften die neuen Klassen haben.
+Sie wird nur einmal, beim Laden der Library aufgerufen.
+
+\begin{verbatim}
+void helloworld_setup(void)
+{
+  helloworld_class = class_new(gensym("helloworld"),
+        (t_newmethod)helloworld_new,
+        0, sizeof(t_helloworld),
+        CLASS_DEFAULT, 0);
+
+  class_addbang(helloworld_class, helloworld_bang);
+}
+\end{verbatim}
+
+\paragraph{class\_new}
+
+Der Befehl \verb+class_new+ kreiert eine neue Klasse und gibt einen Zeiger auf diesen
+Prototyp zurück.
+
+Das erste Argument ist der symbolische Name der Klasse.
+
+Die nächsten beiden Argumente definieren Konstruktor und Destruktor der Klasse.
+Wenn in einen Pd-Patch ein Objekt kreiert wird, 
+instanziiert der Konstruktor \verb+(t_newmethod)helloworld_new+ diesses Objekt
+und initialisiert den Datenraum.
+Wird ein Pd-Patch geschlossen oder ein Objekt daraus entfernt,
+so gibt der Destruktor, wenn notwendig, dynamisch reservierten Speicher wieder frei.
+Der Speicherplatz für den Datenraum selbst wird von Pd automatisch freigegeben.
+Deshalb kann in diesem Beispiel auf einen Destruktor verzichtet werden,
+folglich wird dieses Argument auf ``0'' gesetzt.
+
+Damit Pd genug Speicher für den Datenraum allozieren und wieder freigeben kann,
+wird die Größe dieser Datenstruktur als viertes Argument übergeben.
+
+Das fünfte Argument bestimmt, wie Klasseninstanzen graphisch dargestellt werden und 
+ob sie mit anderen Objekten verknüpfbar sind.
+Der Standardwert \verb+CLASS_DEFAULT+ (oder einfacher: ``0'') bezieht sich auf
+ein Objekt mit mindestens einem Inlet.
+Würde man keinen Eingang wollen (wie zum Beispiel beim Internal ``receive''),
+so kann man diesen Wert auf \verb+CLASS_NOINLET+ setzen.
+
+Die restlichen Argumente definieren die Übergabeargumente eines Objektes und deren Typ.
+
+Bis zu sechs numerische und symbolische Objektargumente können in beliebiger Reihenfolge
+mit \verb+A_DEFFLOAT+ und \verb+A_DEFSYMBOL+ angegeben werden.
+Sollen mehr Argumente übergeben werden oder die Atomtyp-Reihenfolge flexibler sein,
+so bietet \verb+A_GIMME+ die Übergabe einer beliebigen Liste von Atomen.
+
+Die Objektargumentliste wird mit ``0'' terminiert.
+In unserem Beispiel sind also keine Übergabeargumente für die Klasse vorgesehen.
+
+\paragraph{class\_addbang}
+Jetzt muss zur Klasse noch ein Methodenraum hinzugefügt werden.
+
+Mit \verb+class_addbang+ wird der durch das erste Argument definierten Klasse
+eine Methode für eine ``bang''-Message hinzuzugefügt.
+Diese Methode ist das zweite Argument.
+
+
+
+\subsection{Konstruktor: Instanziierung eines Objektes}
+Jedesmal, wenn in einem Pd-Patch ein Objekt einer Klasse kreiert wird,
+schafft der mit \verb+class_new+ angegebene Konstruktor eine neue Instanz der Klasse.
+
+Der Konstruktor ist immer vom Typ \verb+void *+
+
+\begin{verbatim}
+void *helloworld_new(void)
+{
+  t_helloworld *x = (t_helloworld *)pd_new(helloworld_class);
+
+  return (void *)x;
+}
+\end{verbatim}
+
+Die Übergabeargumente der Konstruktorfunktion hängen von den mit
+\verb+class_new+ angegebenen Objektargumenten ab.
+
+\begin{tabular}{l|l}
+\verb+class_new+-Argument&Konstruktorargument\\
+\hline
+\verb+A_DEFFLOAT+&\verb+t_floatarg f+ \\
+\verb+A_DEFSYMBOL+&\verb+t_symbol *s+ \\
+\verb+A_GIMME+&\verb+t_symbol *s, int argc, t_atom *argv+
+\end{tabular}
+
+Da in diesem Beispiel keine Objektargumente existieren, hat auch
+der Konstruktor keine.
+
+Die Funktion \verb+pd_new+ reserviert Speicher für den Datenraum, initialisiert
+die objektinternen Variablen und gibt einen Zeiger auf den Datenraum zurück.
+
+Der Typ-Cast auf den Datenraum ist notwendig.
+
+Normalerweise würden im Konstruktor auch die Objektvariablen initialisiert werden.
+In diesem Beispiel ist dies aber nicht notwendig.
+
+Der Konstruktor muss einen Zeiger auf den instanziierten Datenraum zurückgeben.
+
+\subsection{der Code: \tt helloworld}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *helloworld_class;
+
+typedef struct _helloworld {
+  t_object  x_obj;
+} t_helloworld;
+
+void helloworld_bang(t_helloworld *x)
+{
+  post("Hello world !!");
+}
+
+void *helloworld_new(void)
+{
+  t_helloworld *x = (t_helloworld *)pd_new(helloworld_class);
+
+  return (void *)x;
+}
+
+void helloworld_setup(void) {
+  helloworld_class = class_new(gensym("helloworld"),
+        (t_newmethod)helloworld_new,
+        0, sizeof(t_helloworld),
+        CLASS_DEFAULT, 0);
+  class_addbang(helloworld_class, helloworld_bang);
+}
+\end{verbatim}
+
+
+\section{ein komplexes External: {\tt counter}}
+
+Als nächstes soll ein einfacher Zähler als External geschrieben werden.
+Ein ``bang''-Trigger soll den aktuellen Zählerstand am Outlet ausgeben
+und anschließend um 1 erhöhen.
+
+Diese Klasse unterscheidet sich nicht sonderlich von der vorherigen, 
+ausser dass nun eine interne Variable ``Zählerstand'' benötigt
+wird und das Ergebnis nicht mehr auf die Standardausgabe geschrieben sondern
+als Message zu einem Outlet geschickt wird.
+
+\subsection{Variablen eines Objektes}
+Ein Zähler braucht natürlich eine Zustandsvariable,
+in der der aktueller Zählerstand gespeichert ist.
+
+Solche zum Objekt gehörigen Zustandsvariablen werden im Datenraum abgelegt.
+
+\begin{verbatim}
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+} t_counter;
+\end{verbatim}
+
+Die Ganzzahlvariable \verb+i_count+ beschreibt den Zählerstand.
+Natürlich könnte man sie auch als Gleitkommawert realisieren,
+doch traditionell werden Zähler ganzzahlig ausgeführt.
+
+\subsection{Übergabeargumente}
+Für einen Zähler ist es durchaus sinnvoll, wenn man den Startwert festlegen kann.
+Hier soll der Startwert dem Objekt bei der Kreation übergeben werden.
+
+\begin{verbatim}
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT,
+        A_DEFFLOAT, 0);
+
+  class_addbang(counter_class, counter_bang);
+}
+\end{verbatim}
+
+Es ist also ein Argument zur Funktion \verb+class_new+ hinzugekommen:
+
+\verb+A_DEFFLOAT+ teilt mit, dass das Objekt ein Übergabeargument
+vom Typ \verb+t_floatarg+ hat.
+
+
+
+\subsection{Konstruktor}
+Dem Konstruktor kommen nun mehrere neue Aufgaben zu.
+Zum ersten muss eine Variable initialisiert werden,
+zum anderen muss auch ein Outlet für das Objekt geschaffen werden.
+\begin{verbatim}
+void *counter_new(t_floatarg f)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+
+  x->i_count=f;
+  outlet_new(&x->x_obj, &s_float);
+
+  return (void *)x;
+}
+\end{verbatim}
+
+Die Konstruktorfunktion hat jetzt ein Argument fom Typ \verb+t_floatarg+, wie es in
+der Setup-Routine \verb+class_new+ deklariert worden ist.
+Dieses Argument initialisiert den Zähler.
+
+Einer neuer Outlet wird mit der Funktion \verb+outlet_new+ geschaffen.
+Das erste Argument ist ein Zeiger auf die Objektinterna,
+in denen der neue Ausgang geschaffen wird.
+
+Das zweite Argument ist eine symbolische Typbeschreibung des Ausgangs.
+Da der Zähler numerische Werte ausgeben soll, ist er vom Typ ``float''.
+Sollte der Ausgang für Messages mit verschiedenen Selectoren verwendet werden,
+so ist dieser Wert ``0''.
+
+\verb+outlet_new+ gibt einen Zeiger auf den neuen Outlet zurück und speichert diesen
+Zeiger in der \verb+t_object+-Variablen \verb+x_obj.ob_outlet+.
+Wird nur ein Outlet verwendet, muss daher der Zeiger nicht extra im Datenraum gespeichert
+werden.
+Werden mehrere Outlets verwendet, so müssen diese Zeiger im Datenraum gespeichert werden.
+
+\subsection{die Zählermethode}
+Bei einem Triggerevent soll der alte Zählerstand ausgegeben und um eins inkrementiert werden.
+
+\begin{verbatim}
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  x->i_count++;
+  outlet_float(x->x_obj.ob_outlet, f);
+}
+\end{verbatim}
+
+Die Funktion \verb+outlet_float+ gibt an dem Outlet, auf den das erste Argument verweist,
+eine Gleitkommazahl (zweites Argument) aus.
+
+Hier wird zuerst der Zählerstand in eine Gleitkomma-Buffervariable gespeichert.
+Danach wird er inkrementiert und dann wird erst die Buffervariable ausgegeben.
+
+Was auf den ersten Blick unnötig erscheint, macht bei näherer Betrachtung Sinn:
+Die Buffervariable wurde gleich als \verb+t_float+ realisiert,
+da sich \verb+outlet_float+ sowieso einen Gleitkommawert erwartet
+und ein Cast unvermeidlich ist.
+
+Würde der Zählerstand zuerst an den Outlet geschickt werden und
+danach erst inkrementiert werden, würde dies unter Umständen zu einem etwas seltsamen
+Verhalten führen.
+Wenn nämlich der Zählerausgang wieder an den Inlet zurückgeführt würde, der
+Zähler sich also selbst triggerte, so würde die Zählermethode erneut
+aufgerufen, ohne dass der Zählerstand inkrementiert worden wäre.
+Dies ist im Allgemeinen aber unerwünscht.
+
+Man kann übrigens das gleiche Ergebnis wie hier mit nur einer einzigen Zeile erreichen, 
+doch sieht man das {\em Reentrant}-Problem dann nicht sehr gut.
+
+\subsection{der Code: \tt counter}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *counter_class;
+
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+} t_counter;
+
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  x->i_count++;
+  outlet_float(x->x_obj.ob_outlet, f);
+}
+
+void *counter_new(t_floatarg f)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+
+  x->i_count=f;
+  outlet_new(&x->x_obj, &s_float);
+
+  return (void *)x;
+}
+
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT,
+        A_DEFFLOAT, 0);
+
+  class_addbang(counter_class, counter_bang);
+}
+\end{verbatim}
+
+
+\section{ein komplexeres External: \tt counter}
+
+Man kann natürlich auch einen einfache Zähler ein bißchen komplexer gestalten.
+Es wäre zum Beispiel sinnvoll,
+wenn der Zählerstand auf einen Startwert zurückgesetzt werden könnte,
+wenn man Start- und Endwert bestimmen könnte und auch die Schrittweite variabel wäre.
+
+Bei jedem Zählerüberlauf soll ein zweiter Outlet eine ``bang''-Message schicken und der
+Zähler auf den Startwert zurückgesetzt werden.
+
+\subsection{erweiterter Datenraum}
+
+\begin{verbatim}
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+  t_float step;
+  t_int i_down, i_up;
+  t_outlet *f_out, *b_out;
+} t_counter;
+\end{verbatim}
+
+Der Datenraum wurde also erweitert um Variablen für Schrittweite und Start- bzw. Stopwert.
+Weiters werden Zeiger auf zwei Outlets zur Verfügung gestellt.
+
+\subsection{Erweiterung der Klasse}
+Da nun die Klassenobjekte verschiedene Messages, wie ``set'' und ``reset'',
+verstehen können sollen, mussen der Methodenraum entsprechend erweitert werden.
+
+\begin{verbatim}
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT, 
+        A_GIMME, 0);
+\end{verbatim}
+
+Der Klassengenerator \verb+class_new+ ist um das Objektübergabeargument
+\verb+A_GIMME+ erweitert.
+Damit kann eine dynamische Anzahl von Argumenten bei der Objektinstanziierung
+verwaltet werden.
+
+\begin{verbatim}
+  class_addmethod(counter_class,
+        (t_method)counter_reset,
+        gensym("reset"), 0);
+\end{verbatim}
+
+\verb+class_addmethod+ fügt einer Klasse eine Methode mit für einen
+beliebigen Selector hinzu.
+
+Das erste Argument ist die Klasse,
+zu der die Methode (zweites Argument) hinzugefügt wird.
+
+Das dritte Argument ist der symbolische Selector,
+der mit der Methode assoziiert wird.
+
+Die restlichen ``0''-terminierten Argumente
+beschreiben die Atomliste, die dem Selector folgt.
+
+\begin{verbatim}
+  class_addmethod(counter_class,
+        (t_method)counter_set, gensym("set"),
+        A_DEFFLOAT, 0);
+  class_addmethod(counter_class,
+        (t_method)counter_bound, gensym("bound"),
+        A_DEFFLOAT, A_DEFFLOAT, 0);
+\end{verbatim}
+
+Eine Methode für den Selector ``set'', gefolgt von einem numerischen Wert,
+wird hinzugefügt.
+
+Für den Selector ``bound'', gefolgt von zwei numerischen Werten,
+wird ebenfalls eine Methode zur Klasse hinzugefügt.
+
+\begin{verbatim}
+  class_sethelpsymbol(counter_class, gensym("help-counter"));
+\end{verbatim}
+
+Clickt man mit der rechten Maustaste auf ein Pd-Objekt,
+so kann man sich einen Hilfe-Patch für die zugehörige Objektklasse anzeigen lasse.
+Standardmäßig wird ist dies ein Patch mit dem symbolischen Klassennamen
+im Verzeichnis ``{\em doc/5.reference/}'' gesucht.
+Mit dem Befehl \verb+class_sethelpsymbol+ kann ein alternativer Patch angegeben werden.
+
+\subsection{Konstruktion von In- und Outlets}
+
+Bei der Objektkreation sollten dem Objekt verschiedene Argumente übergeben
+werden.
+
+\begin{verbatim}
+void *counter_new(t_symbol *s, int argc, t_atom *argv)
+\end{verbatim}
+Durch die Argumentendeklaration in der \verb+class_new+-Funktion
+mit \verb+A_GIMME+, werden dem Konstruktor folgende Argumente
+übergeben:
+
+\begin{tabular}{c|l}
+\verb+t_symbol *s+ & der symbolische Namen,\\
+& mit dem das Objekt kreiert wurde \\
+\verb+int argc+ & die Anzahl, der dem Objekt übergebenen Argumente\\
+\verb+t_atom *argv+ & ein Zeiger auf eine Liste von {\tt argc} Atomen
+\end{tabular}
+
+\begin{verbatim}
+  t_float f1=0, f2=0;
+
+  x->step=1;
+  switch(argc){
+  default:
+  case 3:
+    x->step=atom_getfloat(argv+2);
+  case 2:
+    f2=atom_getfloat(argv+1);
+  case 1:
+    f1=atom_getfloat(argv);
+    break;
+  case 0:
+    break;
+  }
+  if (argc<2)f2=f1;
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+
+  x->i_count=x->i_down;
+\end{verbatim}
+
+Werden drei Argumente übergeben, so sollten dies {\em untere Zählergrenze},
+{\em obere Zählergrenze} und {\em Schrittgröße} sein.
+Werden nur zwei Argumente übergeben,
+so wird die Schrittgröße standardmäßig auf ``1'' gesetzt.
+Bei nur einem Argument, sei dies der {\em Startwert} des Zählers,
+die {\em Schrittgröße} sei ``1''.
+
+\begin{verbatim}
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd,
+        gensym("list"), gensym("bound"));
+\end{verbatim}
+Die Funktion \verb+inlet_new+ erzeugt einen neuen ``aktiven'' Inlet.
+``Aktiv'' heißt, dass eine Klassenmethode ausgeführt wird,
+wenn eine Message in den einen ``aktiven'' Inlet geschickt wird.
+
+Von der Software-Architektur her ist der erste Inlet immer ``aktiv''.
+
+Die ersten beiden Argumente der \verb+inlet_new+-Funktion
+sind Zeiger auf die Objektinterna und die graphische Darstellung des Objektes.
+
+Der symbolische Selector, der durch das dritte Argument spezifiziert wird,
+wird für diesen Inlet durch einen anderen symbolischen Selector (viertes Argument)
+substituiert.
+
+Durch die Substitution von Selectoren kann eine Message
+an einem bestimmten rechten Eingang wie eine Message mit einem bestimmten Selector
+am linken Eingang betrachtet werden.
+
+Dies bedeutet
+\begin{itemize}
+\item Der substituierende Selector muss mit \verb+class_addmethod+ angegeben werden.
+\item Man kann einen bestimmten rechten Eingang simulieren,
+indem man dem ersten Eingang eine Message mit dem Selector dieses Eingangs schickt.
+\item Es ist nicht möglich, einem rechten Eingang Methoden für mehr als einen Selector
+zuzuweisen. Insbesondere ist es nicht möglich, ihm eine allgemeine Methode
+für einen beliebigen Selector zuzuweisen.
+\end{itemize}
+
+\begin{verbatim}
+  floatinlet_new(&x->x_obj, &x->step);
+\end{verbatim}
+\verb+floatinlet_new+ generiert einen ``passiven'' Inlet für numerische Werte.
+``Passive'' Eingänge erlauben, dass ein Speicherplatz bestimmten Typs im
+Variablenraum des Objektes von außen direkt beschrieben werden kann.
+Dadurch ist zum Beispiel eine Abfrage nach illegalen Eingaben nicht möglich.
+Das erste Argument ist dabei ein Zeiger auf die interne Objektinfrastruktur.
+Das zweite Argument ist ein Zeiger auf den Speicherplatz, auf den geschrieben wird.
+
+Es können ``passive'' Eingänge für numerische (Gleitkomma\footnote{
+Deswegen ist der {\tt step}-Wert des Klassendatenraums als {\tt t\_float} realisiert.})
+-Werte, symbolische Werte und Pointer geschaffen werden.
+
+\begin{verbatim}
+  x->f_out = outlet_new(&x->x_obj, &s_float);
+  x->b_out = outlet_new(&x->x_obj, &s_bang);
+\end{verbatim}
+
+Die von \verb+outlet_new+ zurückgegebenen Zeiger auf die geschaffenen Outlets,
+müssen im Klassendatenraum gespeichert werden,
+damit sie später von den Ausgaberoutinen angesprochen werden.
+
+Die Reihenfolge der Generierung von In- und Outlets ist wichtig,
+da sie der Reihenfolge der Ein- und Ausgänge der graphischen Repräsentation
+des Objektes entsprechen.
+
+\subsection{erweiterter Methodenraum}
+
+Der Methode für die ``bang''-Message muss natürlich der komplexeren Zählerstruktur
+genüge tun.
+
+
+\begin{verbatim}
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  t_int step = x->step;
+  x->i_count+=step;
+  if (x->i_down-x->i_up) {
+    if ((step>0) && (x->i_count > x->i_up)) {
+      x->i_count = x->i_down;
+      outlet_bang(x->b_out);
+    } else if (x->i_count < x->i_down) {
+      x->i_count = x->i_up;
+      outlet_bang(x->b_out);
+    }
+  }
+  outlet_float(x->f_out, f);
+}
+\end{verbatim}
+
+Die einzelnen Outlets werden von den \verb+outlet_...+-Funktionen über
+die Zeiger auf diese Ausgänge identifiziert.
+
+Die übrigen Methoden müssen noch implementiert werden:
+
+\begin{verbatim}
+void counter_reset(t_counter *x)
+{
+  x->i_count = x->i_down;
+}
+
+void counter_set(t_counter *x, t_floatarg f)
+{
+  x->i_count = f;
+}
+
+void counter_bound(t_counter *x, t_floatarg f1, t_floatarg f2)
+{
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+}
+\end{verbatim}
+
+\subsection{der Code: \tt counter}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *counter_class;
+
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+  t_float step;
+  t_int i_down, i_up;
+  t_outlet *f_out, *b_out;
+} t_counter;
+
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  t_int step = x->step;
+  x->i_count+=step;
+
+  if (x->i_down-x->i_up) {
+    if ((step>0) && (x->i_count > x->i_up)) {
+      x->i_count = x->i_down;
+      outlet_bang(x->b_out);
+    } else if (x->i_count < x->i_down) {
+      x->i_count = x->i_up;
+      outlet_bang(x->b_out);
+    }
+  }
+
+  outlet_float(x->f_out, f);
+}
+
+void counter_reset(t_counter *x)
+{
+  x->i_count = x->i_down;
+}
+
+void counter_set(t_counter *x, t_floatarg f)
+{
+  x->i_count = f;
+}
+
+void counter_bound(t_counter *x, t_floatarg f1, t_floatarg f2)
+{
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+}
+
+void *counter_new(t_symbol *s, int argc, t_atom *argv)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+  t_float f1=0, f2=0;
+
+  x->step=1;
+  switch(argc){
+  default:
+  case 3:
+    x->step=atom_getfloat(argv+2);
+  case 2:
+    f2=atom_getfloat(argv+1);
+  case 1:
+    f1=atom_getfloat(argv);
+    break;
+  case 0:
+    break;
+  }
+  if (argc<2)f2=f1;
+
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+
+  x->i_count=x->i_down;
+
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd,
+        gensym("list"), gensym("bound"));
+  floatinlet_new(&x->x_obj, &x->step);
+
+  x->f_out = outlet_new(&x->x_obj, &s_float);
+  x->b_out = outlet_new(&x->x_obj, &s_bang);
+
+  return (void *)x;
+}
+
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT, 
+        A_GIMME, 0);
+
+  class_addbang  (counter_class, counter_bang);
+  class_addmethod(counter_class,
+        (t_method)counter_reset, gensym("reset"), 0);
+  class_addmethod(counter_class, 
+        (t_method)counter_set, gensym("set"),
+        A_DEFFLOAT, 0);
+  class_addmethod(counter_class,
+        (t_method)counter_bound, gensym("bound"),
+        A_DEFFLOAT, A_DEFFLOAT, 0);
+
+  class_sethelpsymbol(counter_class, gensym("help-counter"));
+}
+\end{verbatim}
+
+
+\section{ein Signal-External: {\tt pan\~\/}}
+Signalklassen sind normale Klassen, die zusätzlich Methoden
+für Signale bereitstellen.
+
+Alle Methoden und Konzepte die mit normalen Objektklassen realisierbar sind,
+sind also auch mit Signalklassen zuverwirklichen.
+
+Per Konvention enden die symbolischen Namen mit einer Tilde \~\/.
+
+Anhand einer Klasse ``pan\~\/`` soll demonstriert werden wie Signalklassen geschrieben
+werden können.
+
+Ein Signal am linken Inlet wird mit einem Signal am zweiten Inlet gemischt.
+Der Mischungsgrad wird als \verb+t_float+-Message an einen dritten Eingang festgelegt.
+
+\subsection{Variablen einer Signalklasse}
+Da eine Signalklasse nur eine erweiterte normale Klasse ist,
+gibt es keine prinzipielle Unterschiede zwischen den Datenräumen.
+
+\begin{verbatim}
+typedef struct _pan_tilde {
+  t_object x_obj;
+
+  t_sample f_pan;
+  t_float  f;
+} t_pan_tilde;
+\end{verbatim}
+
+Es wird nur eine Variable für den {\em Mischfaktor} der Panningfunktion benötigt.
+
+Die Variable \verb+f+ wird gebraucht, falls kein Signal am Signalinlet liegt.
+Wird dann an diesen Signalinlet ein numerischer Wert als Message geschickt,
+so ersetzt dieser das Signal und wird in der Variable \verb+f+ gespeichert.
+
+\subsection{Signalklassen}
+
+\begin{verbatim}
+void pan_tilde_setup(void) {
+  pan_tilde_class = class_new(gensym("pan~"),
+        (t_newmethod)pan_tilde_new,
+        0, sizeof(t_pan_tilde),
+        CLASS_DEFAULT, 
+        A_DEFFLOAT, 0);
+
+  class_addmethod(pan_tilde_class,
+        (t_method)pan_tilde_dsp, gensym("dsp"), 0);
+  CLASS_MAINSIGNALIN(pan_tilde_class, t_pan_tilde, f);
+}
+\end{verbatim}
+
+Jeder Signalklasse muss eine Methode für die Signalverarbeitung zugeordnet werden.
+Wenn die Audioengine von Pd gestartet wird, wird allen Objekten eine
+Message mit dem Selector ``\verb+dsp+'' geschickt.
+Alle Klassen, die eine Methode für die ``dsp''-Message haben, sind Signalklassen.
+
+Signalklassen, die Signal-Inlets zur Verfügung stellen wollen,
+müssen dies mit dem \verb+CLASS_MAINSIGNALIN+-Makro anmelden.
+Dadurch ist der erste Inlet als Signalinlet deklariert.
+\verb+t_float+-Messages können nicht mehr an einen solchen Eingang
+gesendet werden.
+
+Das erste Argument des Makros ist ein Zeiger auf die Signalklasse.
+Das zweite Argument ist der Typ des Datenraums der Klasse.
+Das dritte Argument ist eine Dummy-Variable aus dem Datenraum, die gebraucht wird,
+um bei nicht vorhandenen Signalen am Signalinlet diese durch \verb+t_float+-Messages
+einfach ersetzen zu können.
+
+\subsection{Konstruktion von Signal-In- und Outlets}
+
+\begin{verbatim}
+void *pan_tilde_new(t_floatarg f)
+{
+  t_pan_tilde *x = (t_pan_tilde *)pd_new(pan_tilde_class);
+
+  x->f_pan = f;
+  
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+  floatinlet_new (&x->x_obj, &x->f_pan);
+
+  outlet_new(&x->x_obj, &s_signal);
+
+  return (void *)x;
+}
+\end{verbatim}
+
+Zusätzliche Signal-Eingänge werden normal mit der Routine \verb+inlet_new+
+hinzugefügt.
+Die letzen beiden Argumente sind dann jeweils ein Verweis auf den symbolischen Selector
+``signal'' in der lookup-Tabelle.
+
+Signal-Outlets werden ebenfalls wie Message-Outlets generiert, deren Outlet mit dem
+Selector ``signal'' versehen ist.
+
+
+\subsection{DSP-Methode}
+Wenn die Audio-Engine von Pd eingeschalten wird,
+so teilen ihr alle Signal-Objekte mit,
+welche Methode von ihrer Klasse zur digitalen Signalverarbeitung herangezogen werden soll.
+
+Die ``DSP''-Methode hat als Argumente einen Zeiger auf den Klassendatenraum und
+einen Zeiger auf ein Array von Signalen.
+
+Die Signale im Array sind so angeordnet, dass sie am graphischen Objekt
+im Uhrzeigersinn gelesen werden.\footnote{
+Sofern linke und rechte Ein- und Ausgangssignale vorhanden sind, gilt also:
+Zuerst kommt das linke Eingangssignal, danach die rechten Eingangssignale;
+nach den rechten Ausgangssignalen kommt das linke Ausgangssignal.
+}
+
+\begin{verbatim}
+void pan_tilde_dsp(t_pan_tilde *x, t_signal **sp)
+{
+  dsp_add(pan_tilde_perform, 5, x,
+          sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+\end{verbatim}
+
+\verb+dsp_add+ fügt eine ``Perform''-Routine (erstes Argument) zum DSP-Baum hinzu.
+Das zweite Argument ist die Anzahl der nachfolgenden Zeiger auf diverse Variablen.
+Welche Zeiger auf welche Variablen übergeben werden, unterliegt keiner Beschränkung.
+
+sp[0] bezeichnet hier das erste Eingangssignal, sp[1] das zweite Eingangssignal,
+sp[3] das Ausgangssignal.
+
+Die Struktur \verb+t_signal+ enthält einen Zeiger auf den
+zugehörigen Signalvektor \verb+.s_vec+ (ein Array von Samples \verb+t_sample+),
+sowie die Länge dieses Signalvektors \verb+.s_n+.
+Da innerhalb eines Patches alle Signalvektoren die gleiche Länge haben,
+genügt es, die Länge eines dieser Vektoren abzufragen.
+
+\subsection{perform-Routine}
+Die perform-Routine ist das eigentliche DSP-Herzstück einer Signalklasse.
+
+Ihr wird ein Zeiger auf ein Integer-Array übergeben.
+In diesem Array sind die Zeiger gespeichert, die mit \verb+dsp_add+ übergeben wurden.
+Sie müssen auf ihren ursprünglichen Typ zurückgecastet werden.
+
+Die perform-Routine muß einen Zeiger auf Integer zurückgeben, der hinter den
+Speicherplatz zeigt, in dem die eigenen Zeiger gespeichert sind.
+Dies bedeutet, dass das Rückgabeargument gleich dem Übergabeargument plus der
+Anzahl der eigenen Zeigervariablen (wie sie als zweites Argument in
+\verb+dsp_add+ angegeben wurde) plus eins.
+
+\begin{verbatim}
+t_int *pan_tilde_perform(t_int *w)
+{
+  t_pan_tilde *x = (t_pan_tilde *)(w[1]);
+  t_sample  *in1 =    (t_sample *)(w[2]);
+  t_sample  *in2 =    (t_sample *)(w[3]);
+  t_sample  *out =    (t_sample *)(w[4]);
+  int          n =           (int)(w[5]);
+
+  t_sample f_pan = (x->f_pan<0)?0.0:(x->f_pan>1)?1.0:x->f_pan;
+
+  while (n--) *out++ = (*in1++)*(1-f_pan)+(*in2++)*f_pan;
+
+  return (w+6);
+}
+\end{verbatim}
+
+In der \verb+while+-Schleife wird jedes Sample der Signalvektoren einzeln
+abgearbeitet.
+
+Eine Optimierungsroutine bei der Erstellung des DSP-Baumes wird darauf geachtet,
+keine unnötigen Kopieroperationen durchzuführen.
+Es kann daher geschehen, dass ein Eingangs- und ein Ausgangssignal an der
+gleichen Stelle im Speicher stehen.
+Es ist daher in solchem Falle darauf zu achten,
+dass nicht in das Ausgangssignal geschrieben wird,
+bevor dort das Eingangssignal ausgelesen wurde.
+
+\subsection{der Code: \tt pan\~\/}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *pan_tilde_class;
+
+typedef struct _pan_tilde {
+  t_object  x_obj;
+  t_sample f_pan;
+  t_sample f;
+} t_pan_tilde;
+
+t_int *pan_tilde_perform(t_int *w)
+{
+  t_pan_tilde *x = (t_pan_tilde *)(w[1]);
+  t_sample  *in1 =    (t_sample *)(w[2]);
+  t_sample  *in2 =    (t_sample *)(w[3]);
+  t_sample  *out =    (t_sample *)(w[4]);
+  int          n =           (int)(w[5]);
+  t_sample f_pan = (x->f_pan<0)?0.0:(x->f_pan>1)?1.0:x->f_pan;
+
+  while (n--) *out++ = (*in1++)*(1-f_pan)+(*in2++)*f_pan;
+
+  return (w+6);
+}
+
+void pan_tilde_dsp(t_pan_tilde *x, t_signal **sp)
+{
+  dsp_add(pan_tilde_perform, 5, x,
+          sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+
+void *pan_tilde_new(t_floatarg f)
+{
+  t_pan_tilde *x = (t_pan_tilde *)pd_new(pan_tilde_class);
+
+  x->f_pan = f;
+  
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+  floatinlet_new (&x->x_obj, &x->f_pan);
+  outlet_new(&x->x_obj, &s_signal);
+
+  return (void *)x;
+}
+
+void pan_tilde_setup(void) {
+  pan_tilde_class = class_new(gensym("pan~"),
+        (t_newmethod)pan_tilde_new,
+        0, sizeof(t_pan_tilde),
+        CLASS_DEFAULT, 
+        A_DEFFLOAT, 0);
+
+  class_addmethod(pan_tilde_class,
+        (t_method)pan_tilde_dsp, gensym("dsp"), 0);
+  CLASS_MAINSIGNALIN(pan_tilde_class, t_pan_tilde, f);
+}
+\end{verbatim}
+
+
+
+
+\vfill
+\newpage
+\begin{appendix}
+
+\section{das Message-System von \em pd}
+Nicht-Audio-Daten werden über ein Message-System verteilt.
+Jede Message besteht aus einem ``Selector'' und einer Liste von Atomen.
+
+\subsection{Atome}
+
+Es gibt drei Arten von Atomen:
+\begin{itemize}
+\item {\em A\_FLOAT}: ein numerischer Wert (Gleitkommazahl)
+\item {\em A\_SYMBOL}: ein symbolischer Wert (String)
+\item {\em A\_POINTER}: ein Zeiger
+\end{itemize}
+
+Numerische Werte werden immer als Floating-Point-Werte (\verb+double+) dargestellt,
+auch wenn es sich um Ganzzahlwerte handelt.
+
+Jedes Symbol wird aus Performancegründen in einer lookup-Tabelle abgelegt.
+Der Befehl \verb+gensym+ speichert, wenn nötig,
+einen String in dieser Symboltabelle und gibt seine Addresse in der Tabelle zurück.
+
+Atome vom Typ {\em A\_POINTER} haben in der Praxis
+(für einfache Externals) eher untergeordnete Bedeutung.
+
+Der Typ eines Atoms \verb+a+ wird im Strukturelement \verb+a.a_type+ gespeichert.
+
+\subsection{Selectoren}
+
+Der Selector ist ein Symbol und bestimmt, welchen Typ eine Message hat.
+Es gibt fünf vordefinierte Selectoren:
+\begin{itemize}
+\item ``{\tt bang}'' bezeichnet ein Triggerevent.
+Die Message besteht nur aus dem Selector und enthält keine Liste von Atomen.
+\item ``{\tt float}'' bezeichnet einen numerischen Wert. Die Liste enthält nur ein Atom.
+\item ``{\tt symbol}'' bezeichnet einen symbolischen Wert. Die Liste enthält nur ein Atom.
+\item ``{\tt pointer}'' bezeichnet einen Zeiger. Die Liste enthält nur ein Atom.
+\item ``{\tt list}'' bezeichnet eine Liste von mehreren Atomen.
+\end{itemize}
+
+Da die Symbole für diese Selectoren relativ häufig verwendet werden,
+kann man deren Symboltabellen-Adresse auch direkt,
+ohne den Umweg über \verb+gensym+ abfragen:
+
+\begin{tabular}{l||l|l}
+Selector&lookup-Routine&lookup-Addresse\\
+\hline
+\tt bang &\verb+gensym("bang")+ & \verb+&s_bang+ \\
+\tt float &\verb+gensym("float")+ & \verb+&s_float+ \\
+\tt symbol &\verb+gensym("symbol")+ & \verb+&s_symbol+ \\
+\tt pointer &\verb+gensym("pointer")+ & \verb+&s_pointer+ \\
+\tt list &\verb+gensym("list")+ & \verb+&s_list+ \\
+--- (Signal) &\verb+gensym("signal")+&\verb+&s_symbol+
+\end{tabular}
+
+Es können auch andere Selectoren verwendet werden,
+doch muss dann die Empfängerklasse entweder selbst eine Methode
+für diesen Selector zur verfügung stellen,
+oder eine Methode für ``anything'', also jeden beliebigen Selector, anbieten.
+
+Messages die ohne Selector sofort mit einem Zahlenwert beginnen, werden automatisch
+entweder als numerischer Wert (nur ein Atom) oder als Liste (mehrere Atome) erkannt.
+
+Zum Beispiel sind also die Messages ``\verb+12.429+'' und ``\verb+float 12.429+'' ident.
+Ebenfalls ident sind auch die Listen-Messages
+``\verb+list 1 kleines Haus+'' und ``\verb+1 kleines Haus+''.
+
+\section{Pd-Typen}
+Da Pd auf mehreren Plattformen benutzt wird,
+werden viele gewöhnliche Variablentypen, wie \verb|int|, neu definiert.
+Um portablen Code zu schreiben ist es daher angebracht, die von Pd bereitgestellten
+Typen zu verwenden.
+
+Weiters gibt es viele vordefinierte Typen,
+die das Leben des Programmierers vereinfachen sollten.
+Pd-Typen beginnen im Allgemeinen mit \verb|t_|.
+
+\begin{tabular}{c|l}
+Pd-Type & Beschreibung \\
+\hline\hline
+\verb+t_atom+& Atom \\
+\verb+t_float+ & Gleitkomma-Zahl \\
+\verb+t_symbol+ & Symbol \\
+\verb+t_gpointer+ & Zeiger (auf graphische Objekte) \\
+\hline
+\verb+t_int+ & Ganzzahl \\
+\verb+t_signal+ & Struktur auf ein Signal \\
+\verb+t_sample+ & Audio-Signalwert (Gleitkomma)\\
+\verb+t_outlet+ & Outlet eines Objekts \\
+\verb+t_inlet+ & Inlet eines Objekts \\
+\verb+t_object+ & Objekt-Interna \\
+\hline
+\verb+t_class+ & eine Pd-Klasse \\
+\verb+t_method+ & Zeiger auf Klassenmethode \\
+\verb+t_newmethod+ & Zeiger auf Klasseninstanziierungsmethode (new-Routine) \\
+\end{tabular}
+
+
+\section{Wichtige Funktionen aus ``m\_pd.h''}
+\subsection{Funktionen: Atome}
+
+\subsubsection{SETFLOAT}
+\begin{verbatim}
+SETFLOAT(atom, f)
+\end{verbatim}
+Dieses Makro setzt den Typ von \verb+atom+ auf \verb+A_FLOAT+
+und setzt den numerischen Wert dieses Atoms auf \verb+f+.
+
+\subsubsection{SETSYMBOL}
+\begin{verbatim}
+SETSYMBOL(atom, s)
+\end{verbatim}
+Dieses Makro setzt den Typ von \verb+atom+ auf \verb+A_SYMBOL+
+und setzt den symbolischen Wert dieses Atoms auf \verb+s+.
+
+\subsubsection{SETPOINTER}
+\begin{verbatim}
+SETPOINTER(atom, pt)
+\end{verbatim}
+Dieses Makro setzt den Typ von \verb+atom+ auf \verb+A_POINTER+
+und setzt den Zeiger-Wert dieses Atoms auf \verb+pt+.
+
+\subsubsection{atom\_getfloat}
+\begin{verbatim}
+t_float atom_getfloat(t_atom *a);
+\end{verbatim}
+Wenn der Typ des Atoms \verb+a+ \verb+A_FLOAT+ ist, wird dessen numerischer Wert,
+ansonsten ``0.0'' zurückgegeben.
+
+\subsubsection{atom\_getfloatarg}
+\begin{verbatim}
+t_float atom_getfloatarg(int which, int argc, t_atom *argv)
+\end{verbatim}
+Wenn das Atom,
+das in der Atomliste \verb+argv+ mit der Länge \verb+argc+ an der Stelle \verb+which+
+zu finden ist,
+vom Typ \verb+A_FLOAT+ ist, wird dessen numerischer Wert,
+ansonsten ``0.0'' zurückgegeben.
+
+\subsubsection{atom\_getint}
+\begin{verbatim}
+t_int atom_getint(t_atom *a);
+\end{verbatim}
+Wenn der Typ des Atoms \verb+a+ \verb+A_FLOAT+ ist, wird dessen numerischer
+Wert als Ganzzahlwert, ansonsten ``0'' zurückgegeben.
+
+\subsubsection{atom\_getsymbol}
+\begin{verbatim}
+t_symbol atom_getsymbol(t_atom *a);
+\end{verbatim}
+Wenn der Typ des Atoms \verb+a+ \verb+A_SYMBOL+ ist, wird ein Zeiger
+auf dessen Symbol ansonsten auf das Symbol ``float'' zurückgegeben.
+
+\subsubsection{atom\_gensym}
+\begin{verbatim}
+t_symbol *atom_gensym(t_atom *a);
+\end{verbatim}
+Wenn der Typ des Atoms \verb+a+ \verb+A_SYMBOL+ ist, wird ein Zeiger
+auf dessen Symbol zurückgegeben.
+
+Atome anderen Typs werden zuerst ``sinnvoll'' in Strings umgewandelt.
+Diese Strings werden, falls nötig, in die Symbol-Tabelle eingetragen.
+Die Zeiger auf das Symbol wird zurückgegeben.
+
+
+\subsubsection{atom\_string}
+\begin{verbatim}
+void atom_string(t_atom *a, char *buf, unsigned int bufsize);
+\end{verbatim}
+Konvertiert ein Atom \verb+a+ in einen {\tt C}-String \verb+buf+.
+Der char-Buffer muss selbst reserviert und seine Länge in \verb+bufsize+ angegeben werden.
+
+\subsubsection{gensym}
+\begin{verbatim}
+t_symbol *gensym(char *s);
+\end{verbatim}
+Prüft, ob für den C-String \verb+*s+ bereits ein Eintrag in der Symbol-lookup-Tabelle
+vorhanden ist.
+Ist noch kein Eintrag vorhanden, so wird einer angelegt.
+Ein Zeiger auf das Symbol in der Tabelle wird zurückgegeben.
+
+
+\subsection{Funktionen: Klassen}
+\subsubsection{class\_new}
+\begin{verbatim}
+t_class *class_new(t_symbol *name,
+        t_newmethod newmethod, t_method freemethod,
+        size_t size, int flags,
+        t_atomtype arg1, ...);
+\end{verbatim}
+Generiert eine neue Klasse mit dem symbolischen Namen \verb+name+.
+
+\verb+newmethod+ ist eine Konstruktorfunktion,
+die eine Instanz der Klasse konstruiert und einen Zeiger auf diese Instanz zurückgibt.
+
+Wird manuell dynamischer Speicher reserviert,
+so muss dieser bei Zerstörung eines Objektes
+mit der Destruktormethode \verb+freemethod+ (kein Rückgabeargument)
+wieder freigegeben werden.
+
+\verb+size+ ist statische die Größe des Klassendatenraumes,
+die mit der Funktion \verb+sizeof(t_mydata)+ berechnet werden kann.
+
+\verb+flags+ bestimmen das Aussehen des graphischen Objektes.
+Eine beliebige Kombination folgender Flags ist möglich:
+
+\begin{tabular}{l|l}
+Flag&Bedeutung\\
+\hline
+\verb+CLASS_DEFAULT+ &Ein normales Objekt mit einem Inlet \\
+\verb+CLASS_PD+ & \em Objekte ohne Graphikdarstellung\\
+\verb+CLASS_GOBJ+ & \em reine Graphikobjekte (wie Arrays, Graphen,...)\\
+\verb+CLASS_PATCHABLE+ & \em normales Objekt (mit einem Inlet) \\
+\verb+CLASS_NOINLET+ & Der standardmäßige Inlet wird unterdrückt \\
+\end{tabular}
+
+Flags, deren Bedeutung {\em kursiv} gedruckt ist,
+haben geringe Bedeutung beim Schreiben von Externals.
+
+Die restlichen Argumente \verb+arg1,...+ definieren
+die Typen die Übergabeargumente bei der Objektkreation.
+Höchstens sechs typgeprüfte Argumente können einem Objekt übergeben werden.
+Die Argumententypeliste wird ``0'' terminiert.
+
+Mögliche Argumententypen sind:
+
+\begin{tabular}{l|l}
+\verb+A_DEFFLOAT+ & ein numerischer Wert \\
+\verb+A_DEFSYMBOL+ & ein symbolischer Wert \\
+\verb+A_GIMME+ & eine Atomliste beliebiger Länge und Typen \\
+\end{tabular}
+
+Sollten mehr als sechs Argumente übergeben werden, muss man
+\verb+A_GIMME+ verwenden und eine händische Typprüfung durchführen.
+
+\subsubsection{class\_addmethod}
+\begin{verbatim}
+void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
+    t_atomtype arg1, ...);
+\end{verbatim}
+Fügt der Klasse, auf die \verb+c+ zeigt, die Methode \verb+fn+ für
+eine Message mit dem Selector \verb+sel+ hinzu.
+
+Die restlichen Argumente \verb+arg1,...+ definieren
+die Typen der Atomliste die dem Selector folgt.
+Höchstens sechs typgeprüfte Argumente angegeben werden.
+Sollten mehr als sechs Argumente übergeben werden, muss man
+\verb+A_GIMME+ verwenden und eine händische Typprüfung durchführen.
+
+Die Argumententypeliste wird ``0'' terminiert.
+
+Mögliche Argumententypen sind:
+
+\begin{tabular}{l|l}
+\verb+A_DEFFLOAT+ & ein numerischer Wert \\
+\verb+A_DEFSYMBOL+ & ein symbolischer Wert \\
+\verb+A_POINTER+ & eine Zeiger \\
+\verb+A_GIMME+ & eine Atomliste beliebiger Länge und Typen \\
+\end{tabular}
+
+\subsubsection{class\_addbang}
+\begin{verbatim}
+void class_addbang(t_class *c, t_method fn);
+\end{verbatim}
+Fügt der Klasse, auf die \verb+c+ zeigt, die Methode \verb+fn+ 
+für eine ``bang''-Message hinzu.
+Die ``bang''-Methode hat als Übergabeargument einen Zeiger auf den Klassendatenraum:
+
+\verb+void my_bang_method(t_mydata *x);+
+
+\subsubsection{class\_addfloat}
+\begin{verbatim}
+void class_addfloat(t_class *c, t_method fn);
+\end{verbatim}
+Fügt der Klasse, auf die \verb+c+ zeigt, die Methode \verb+fn+ 
+für eine ``float''-Message hinzu.
+Die ``float''-Methode hat als Übergabeargument einen Zeiger auf den Klassendatenraum und
+ein Gleitkommaargument:
+
+\verb+void my_float_method(t_mydata *x, t_floatarg f);+
+
+\subsubsection{class\_addsymbol}
+\begin{verbatim}
+void class_addsymbol(t_class *c, t_method fn);
+\end{verbatim}
+Fügt der Klasse, auf die \verb+c+ zeigt, die Methode \verb+fn+ 
+für eine ``symbol''-Message hinzu.
+Die ``symbol''-Methode hat als Übergabeargument einen Zeiger auf den Klassendatenraum und
+einen Zeiger auf das übergebene Symbol:
+
+\verb+void my_symbol_method(t_mydata *x, t_symbol *s);+
+
+\subsubsection{class\_addpointer}
+\begin{verbatim}
+void class_addpointer(t_class *c, t_method fn);
+\end{verbatim}
+Fügt der Klasse, auf die \verb+c+ zeigt, die Methode \verb+fn+ 
+für eine ``pointer''-Message hinzu.
+Die ``pointer''-Methode hat als Übergabeargument einen Zeiger
+auf den Klassendatenraum und einen Zeiger auf einen Pointer:
+
+\verb+void my_pointer_method(t_mydata *x, t_gpointer *pt);+
+
+\subsubsection{class\_addlist}
+\begin{verbatim}
+void class_addlist(t_class *c, t_method fn);
+\end{verbatim}
+Fügt der Klasse, auf die \verb+c+ zeigt, die Methode \verb+fn+ 
+für eine ``list''-Message hinzu.
+Die ``list''-Methode hat als Übergabeargument neben einem Zeiger
+auf den Klassendatenraum einen Zeiger auf das Selectorsymbol
+(immer \verb+&s_list+), 
+die Anzahl der Atome in der Liste sowie einen Zeiger auf die Atomliste:
+
+\verb+void my_list_method(t_mydata *x,+
+
+\verb+   t_symbol *s, int argc, t_atom *argv);+
+
+
+%\begin{verbatim}
+%void my_list_method(t_mydata *x,
+%   t_symbol *s, int argc, t_atom *argv);
+%\end{verbatim}
+
+
+
+\subsubsection{class\_addanything}
+\begin{verbatim}
+void class_addanything(t_class *c, t_method fn);
+\end{verbatim}
+Fügt der Klasse, auf die \verb+c+ zeigt, die Methode \verb+fn+ 
+für eine beliebige Message hinzu.
+Die anything-Methode hat als Übergabeargument neben einem Zeiger
+auf den Klassendatenraum einen Zeiger auf das Selectorsymbol, 
+die Anzahl der Atome in der Liste sowie einen Zeiger auf die Atomliste:
+
+
+\verb+void my_any_method(t_mydata *x,+
+
+\verb+   t_symbol *s, int argc, t_atom *argv);+
+
+
+%\begin{verbatim}
+%void my_any_method(t_mydata *x,
+%   t_symbol *s, int argc, t_atom *argv);
+%\end{verbatim}
+
+\subsubsection{class\_addcreator}
+\begin{verbatim}
+ void class_addcreator(t_newmethod newmethod, t_symbol *s, 
+    t_atomtype type1, ...);
+\end{verbatim}
+Fügt zu einem Konstruktor \verb+newmethod+ ein zum Klassennamen alternatives
+Kreatorsymbol \verb+s+ hinzu.
+Dadurch können Objekte mit dem richtigen Klassennamen und einem Aliasnamen
+(zum Beispiel eine Abkürzung, wie das Internal ``float'' bzw. ``f'') kreiert werden.
+
+Die ``0''-terminierte Typenliste entspricht der von \verb+class_new+.
+
+\subsubsection{class\_sethelpsymbol}
+\begin{verbatim}
+void class_sethelpsymbol(t_class *c, t_symbol *s);
+\end{verbatim}
+
+Clickt man mit der rechten Maustaste auf ein Pd-Objekt,
+so kann man sich einen Hilfe-Patch für die zugehörige Objektklasse anzeigen lasse.
+Standardmäßig wird ist dies ein Patch mit dem symbolischen Klassennamen
+im Verzeichnis ``{\em doc/5.reference/}'' gesucht.
+
+Für die Klasse, auf die \verb+c+ zeigt, wird der Name des Hilfepatches auf den
+symbolischen Wert \verb+s+ geändert.
+
+Dadurch können sich mehrere verwandte Klassen einen Hilfepatch teilen.
+
+Pfadangaben erfolgen relativ zum Standardhilfepfad {\em doc/5.reference/}.
+
+\subsubsection{pd\_new}
+\begin{verbatim}
+t_pd *pd_new(t_class *cls);
+\end{verbatim}
+Generiert eine neue Instanz der Klasse \verb+cls+ und gibt einen Zeiger auf diese
+Instanz zurück.
+
+\subsection{Funktionen: In- und Outlets}
+Alle Inlet- und Outletroutinen benötigen eine Referenz auf die Objektinterna
+der Klasseninstanz.
+Die notwendige Variable vom Typ \verb+t_object+ im Datenraum wird bei der
+Objektinstanziierung initialisiert.
+Diese Variable muß als \verb+owner+-Objekt den Inlet- und Outletroutinen übergeben werden.
+
+\subsubsection{inlet\_new}
+\begin{verbatim}
+t_inlet *inlet_new(t_object *owner, t_pd *dest,
+      t_symbol *s1, t_symbol *s2);
+\end{verbatim}
+Generiert einen zusätzlichen ``aktiven'' Inlet des Objektes, auf das \verb+owner+ zeigt.
+\verb+dest+ zeigt im Allgemeinen auf ``\verb+owner.ob_pd+''.
+
+Der Selector \verb+s1+ am neuen Inlet, wird durch den Selector \verb+s2+ substituiert.
+
+Tritt also eine Message mit dem Selector \verb+s1+ am neuen Inlet auf,
+wird die Klassenmethode für den Selector \verb+s2+ ausgeführt.
+
+Dies bedeutet
+\begin{itemize}
+\item Der substituierende Selector muss mit \verb+class_addmethod+ angegeben werden.
+\item Man kann einen bestimmten rechten Eingang simulieren,
+indem man dem ersten Eingang eine Message mit dem Selector dieses Eingangs schickt.
+
+Verwendet man ein leeres Symbol (\verb+gensym("")+) als Selector,
+so erreicht man, dass der rechte Eingang nicht über den ersten angesprochen werden kann.
+\item Es ist nicht möglich, einem rechten Eingang Methoden für mehr als einen Selector
+zuzuweisen. Insbesondere ist es nicht möglich, ihm eine allgemeine Methode
+für einen beliebigen Selector zuzuweisen.
+\end{itemize}
+
+\subsubsection{floatinlet\_new}
+\begin{verbatim}
+t_inlet *floatinlet_new(t_object *owner, t_float *fp);
+\end{verbatim}
+Schafft einen neuen ``passiven'' Eingang für das Objekt, auf das \verb+owner+ zeigt,
+der es erlaubt, einen numerischen Wert von außen direkt auf einen 
+Speicherplatz \verb+fp+ zu schreiben, ohne eine eigene Methode aufzurufen.
+
+\subsubsection{symbolinlet\_new}
+\begin{verbatim}
+t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
+\end{verbatim}
+Schafft einen neuen ``passiven'' Eingang für das Objekt, auf das \verb+owner+ zeigt,
+der es erlaubt, einen symbolischen Wert von außen direkt auf einen 
+Speicherplatz \verb+sp+ zu schreiben, ohne eine eigene Methode aufzurufen.
+
+\subsubsection{pointerinlet\_new}
+\begin{verbatim}
+t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
+\end{verbatim}
+Schafft einen neuen ``passiven'' Eingang für das Objekt, auf das \verb+owner+ zeigt,
+der es erlaubt, einen Zeigerwert von außen direkt auf einen 
+Speicherplatz \verb+gp+ zu schreiben, ohne eine eigene Methode aufzurufen.
+
+\subsubsection{outlet\_new}
+\begin{verbatim}
+t_outlet *outlet_new(t_object *owner, t_symbol *s);
+\end{verbatim}
+Generiert einen neuen Ausgang für das Objekt, auf das \verb+owner+ zeigt.
+Das Symbol, auf das \verb+s+ zeigt, zeigt den Typ des Ausgangs an.
+
+\begin{tabular}{c|l||l}
+Symbolwert & Symboladresse & Outlet-Typus \\
+\hline\hline
+``bang'' & \verb+&s_bang+ & Message (Bang)\\
+``float'' & \verb+&s_float+ & Message (Float)\\
+``symbol'' & \verb+&s_symbol+ & Message (Symbol) \\
+``pointer'' & \verb+&s_gpointer+ & Message (List)\\
+``list'' & \verb+&s_list+ & Message \\
+--- & 0 & Message \\
+\hline
+``signal'' & \verb+&s_signal+ & Signal \\
+\end{tabular}
+
+Zwischen den verschiedenen Message-Outlet-Typen gibt es keinen Unterschied.
+Allerdings macht es den Code leichter lesbar,
+wenn schon bei der Outlet-Generierung angezeigt wird, wozu der Ausgang verwendet wird.
+Für allgemeine Message-Outlets verwendet man einen ``0''-Pointer.
+
+Variablen vom Typ \verb+t_object+ stellen einen Zeiger auf einen Outlet zur Verfügung.
+Bei der Generierung eines neuen Outlets,
+wird seine Addresse in der Objektvariablen \verb+(*owner).ob_outlet+ gespeichert.
+
+Werden mehrere Message-Ausgänge benötigt, müssen die Outletzeiger,
+die von \verb+outlet_new+ zurückgegeben werden, manuell im Datenraum gespeichert werden,
+um die jeweiligen Ausgänge ansprechen zu können.
+
+\subsubsection{outlet\_bang}
+\begin{verbatim}
+void outlet_bang(t_outlet *x);
+\end{verbatim}
+Gibt am Outlet, auf den \verb+x+ zeigt, eine ``bang''-Message aus.
+
+\subsubsection{outlet\_float}
+\begin{verbatim}
+void outlet_float(t_outlet *x, t_float f);
+\end{verbatim}
+Gibt am Outlet, auf den \verb+x+ zeigt, eine ``float''-Message mit dem 
+numerischen Wert \verb+f+ aus.
+
+\subsubsection{outlet\_symbol}
+\begin{verbatim}
+void outlet_symbol(t_outlet *x, t_symbol *s);
+\end{verbatim}
+Gibt am Outlet, auf den \verb+x+ zeigt, eine ``symbol''-Message mit dem 
+symbolischen Wert von \verb+s+ aus.
+
+\subsubsection{outlet\_pointer}
+\begin{verbatim}
+void outlet_pointer(t_outlet *x, t_gpointer *gp);
+\end{verbatim}
+Gibt am Outlet, auf den \verb+x+ zeigt, eine ``pointer''-Message mit dem 
+Zeiger \verb+gp+ aus.
+
+\subsubsection{outlet\_list}
+\begin{verbatim}
+void outlet_list(t_outlet *x,
+                 t_symbol *s, int argc, t_atom *argv);
+\end{verbatim}
+Gibt am Outlet, auf den \verb+x+ zeigt, eine ``list''-Message mit
+\verb+argc+ Atomen aus.
+\verb+argv+ zeigt auf das erste Atom der Liste.
+
+Unabhängig davon, auf welches Symbol \verb+s+ zeigt, wird der Selector
+``list'' der Liste vorangestellt.
+
+Aus Lesbarkeitsgründen sollte man aber trotzdem einen Zeiger auf das
+Symbol ``list'' (\verb+gensym("list")+ oder \verb+&s_list+) angeben.
+
+\subsubsection{outlet\_anything}
+\begin{verbatim}
+void outlet_anything(t_outlet *x,
+                     t_symbol *s, int argc, t_atom *argv);
+\end{verbatim}
+Gibt am Outlet, auf den \verb+x+ zeigt, eine Message mit
+dem Selector, auf den \verb+s+ zeigt, aus.
+Dem Selector folgen \verb+argc+ Atome.
+\verb+argv+ zeigt auf das erste Atom dieser Liste.
+
+
+\subsection{Funktionen: DSP}
+Soll eine Klasse Methoden zur digitalen Signalsverarbeitung zur Verfügung stellen,
+so muss ihr eine Methode für den Selector ``dsp'' hinzugefügt werden.
+
+Wird die Audio-Engine gestartet, so werden alle Objekte, die eine ``dsp''-Methode
+zur Verfügung stellen, als Instanzen von Signalklassen identifiziert.
+
+\paragraph{DSP-Methode}
+
+\begin{verbatim}
+void my_dsp_method(t_mydata *x, t_signal **sp)
+\end{verbatim}
+
+In der ``dsp''-Methode wird mit der Funktion \verb+dsp_add+ die
+Klassenroutine für Signalverarbeitung in den DSP-Baum eingebunden.
+
+Neben dem eigenen Datenraum \verb+x+, wird auch ein Array von Signalen übergeben.
+Die Signale im Array sind so angeordnet, dass sie am graphischen Objekt
+im Uhrzeigersinn gelesen werden.
+
+Sofern je zwei Ein- und Ausgangssignale vorhanden sind, gilt also:
+
+\begin{tabular}{c|r}
+Zeiger & auf Signal \\
+\hline\hline
+sp[0] & linkes Eingangssignal \\
+sp[1] & rechtes Eingangssignal \\
+sp[2] & rechtes Ausgangssignal \\
+sp[3] & linkes Ausgangssignal \\
+\end{tabular}
+
+Die Signalstruktur enthält unter anderem:
+
+\begin{tabular}{c|l}
+Strukturelement & Bedeutung \\
+\hline
+\verb+s_n+ & Länge des Signalvektors \\
+\verb+s_vec+ & Zeiger auf den Signalvektor \\
+\end{tabular}
+
+Der Signalvektor ist ein Array auf Samples vom Typ \verb+t_sample+.
+
+\paragraph{Perform-Routine}
+\begin{verbatim}
+t_int *my_perform_routine(t_int *w)
+\end{verbatim}
+
+Der Perform-Routine die mit \verb+class_add+ in den DSP-Baum eingefügt wurde,
+wird ein Zeiger \verb+w+ auf ein (Integer-)Array übergeben.
+In diesem Array sind die Zeiger gespeichert, die mit \verb+dsp_add+ übergeben wurden.
+Sie müssen auf ihren ursprünglichen Typ zurückgecastet werden.
+Der erste Zeiger ist an der Stelle \verb+w[1]+ gespeichert !!!
+
+Die perform-Routine muß einen Zeiger auf Integer zurückgeben, der hinter den
+Speicherplatz zeigt, in dem die eigenen Zeiger gespeichert sind.
+Dies bedeutet, dass das Rückgabeargument gleich dem Übergabeargument plus der
+Anzahl der eigenen Zeigervariablen (wie sie als zweites Argument in
+\verb+dsp_add+ angegeben wurde) plus eins.
+
+
+
+
+\subsubsection{CLASS\_MAINSIGNALIN}
+\begin{verbatim}
+CLASS_MAINSIGNALIN(<class_name>, <class_data>, <f>);
+\end{verbatim}
+Das Makro \verb+CLASS_MAINSIGNALIN+ meldet an, dass die Klasse
+Signal-Inlets brauchts.
+
+Das erste Argument des Makros ist ein Zeiger auf die Signalklasse.
+Das zweite Argument ist der Typ des Datenraums der Klasse.
+Das dritte Argument ist eine (Dummy-)Gleitkomma-Variable aus dem Datenraum,
+die gebraucht wird, um bei nicht vorhandenen Signalen am Signalinlet,
+``float''-Messages wie Signale behandeln zu können.
+
+An so kreierten Signaleingängen können daher keine zusätzlichen ``float''-Messages
+geschickt werden.
+
+\subsubsection{dsp\_add}
+\begin{verbatim}
+void dsp_add(t_perfroutine f, int n, ...);
+\end{verbatim}
+Fügt dem DSP-Baum eine Perform-Routine \verb+f+ hinzu,
+die jeden DSP-Zyklus neu aufgerufen wird.
+
+Das zweite Argument \verb+n+ legt die Anzahl der nachfolgenden Zeigerargumente fest.
+
+Welche Zeiger auf welche Variablen übergeben werden, unterliegt keiner Beschränkung.
+Sinnvoll sind im Allgemeinen Zeiger auf den Datenraum und auf die Signalvektoren.
+Auch die Länge der Signalvektoren sollte übergeben werden,
+um effektiv Signale manipulieren zu können.
+
+\subsubsection{sys\_getsr}
+\begin{verbatim}
+float sys_getsr(void);
+\end{verbatim}
+Gibt die Abtastrate des Systems zurück.
+
+\subsection{Funktion: Memory}
+\subsubsection{getbytes}
+\begin{verbatim}
+void *getbytes(size_t nbytes);
+\end{verbatim}
+Reserviert \verb+nbytes+ Bytes und gibt einen Zeiger auf den reservierten Speicher zurück.
+
+\subsubsection{copybytes}
+\begin{verbatim}
+void *copybytes(void *src, size_t nbytes);
+\end{verbatim}
+Kopiert  \verb+nbytes+ Bytes von \verb+*src+ in einen neu alloziierten Speicher.
+Die Addresse dieses Speichers wird zurückgegeben.
+
+\subsubsection{freebytes}
+\begin{verbatim}
+void freebytes(void *x, size_t nbytes);
+\end{verbatim}
+Gibt \verb+nbytes+ Bytes an der Addresse \verb+*x+ frei.
+
+\subsection{Funktionen: Ausgabe}
+\subsubsection{post}
+\begin{verbatim}
+void post(char *fmt, ...);
+\end{verbatim}
+
+Schreibt einen {\tt C}-String auf den Standarderror (Shell).
+
+\subsubsection{error}
+\begin{verbatim}
+void error(char *fmt, ...);
+\end{verbatim}
+
+Schreibt einen {\tt C}-String als Fehlermeldung auf den Standarderror (Shell).
+Das Objekt, das die Fehlermeldung ausgegeben hat, wird markiert und
+ist über das Pd-Menü {\em Find->Find last error} identifizierbar.
+
+\end{appendix}
+
+\end{document} 
+
diff --git a/doc/tutorials/externals-howto/HOWTO-externals-en.tex b/doc/tutorials/externals-howto/HOWTO-externals-en.tex
new file mode 100644
index 0000000000000000000000000000000000000000..26faae2b5a1bf3c8c5e0e8390d6ba2d7f50d7a6b
--- /dev/null
+++ b/doc/tutorials/externals-howto/HOWTO-externals-en.tex
@@ -0,0 +1,1747 @@
+% format latexg -*- latex -*-
+
+\documentclass[12pt, a4paper,english,titlepage]{article}  
+
+%% HOWTO write an external for pd
+%% Copyright (c) 2001-2006 by IOhannes m zmölnig
+%%
+%%  Permission is granted to copy, distribute and/or modify this document
+%%  under the terms of the GNU Free Documentation License, Version 1.2
+%%  or any later version published by the Free Software Foundation;
+%%  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+%%  Texts.  A copy of the license is included in the LICENSE.txt file.
+
+\usepackage[latin1]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{babel}
+
+\title{
+HOWTO \\
+write an External \\
+for {\em Pure Data}
+}
+
+\author{
+johannes m zmölnig \\
+\\
+{\em institute of electronic music and acoustics\footnote{http://iem.at}}
+}
+
+\date{}
+
+\begin{document}
+\maketitle
+
+\begin{abstract}
+Pd is a graphical real-time computer-music system that follows the tradition of
+IRCAMs {\em ISPW-max}.
+
+Although plenty of functions are built into Pd,
+it is sometimes a pain or simply impossible to create a patch with a certain
+functionality out of the given primitives and combinations of these.
+
+Therefore, Pd can be extended with self made primitives (``objects'')
+that are written in complex programming-languages, like {\tt C/C++}. 
+
+This document aims to explain, how to write such primitives in {\tt C},
+the popular language that was used to realize Pd.
+\end{abstract}
+
+
+\vfill
+\newpage
+
+\tableofcontents
+
+\vfill
+\newpage
+
+\section{definitions and prerequisites}
+Pd refers to the graphical real-time computer-music environment {\em Pure Data}
+by Miller~S.~Puckette.
+
+To fully understand this document, it is necessary to
+be acquainted with Pd and to 
+have a general understanding of programming techniques especially in {\tt C}.
+
+To write externals yourself, a {\tt C}-compiler that supports the
+{\tt ANSI-C}-Standard, like the {\em Gnu C-compiler} (gcc) on linux-systems or
+{\em Visual-C++} on windos-plattforms, will be necessary.
+
+\subsection{classes, instances, objects}
+Pd is written in the programming-language {\tt C}.
+Due to its graphical nature, Pd is a {\em object-oriented} system.
+Unfortunately {\tt C} does not support very well the use of classes.
+Thus the resulting source-code is not as elegant as {\tt C++}-code would be, for instance.
+
+In this document, the expression {\em class} refers to the realisation of a concept
+combining data and manipulators on this data.
+
+Concrete {\em instances of a class} are called {\em objects}.
+
+\subsection{internals, externals und libraries}
+
+To avoid confusion of ideas, the expressions {\em internal}, {\em external} and
+{\em library} should be explained here.
+
+\paragraph{Internal}
+An {\em internal} is a class that is built into Pd.
+Plenty of primitives, such as ``+'', ``pack'' or ``sig\~\/'' are {\em internals}.
+
+\paragraph{External}
+An {\em external} is a class that is not built into Pd but is loaded at runtime.
+Once loaded into Pd's memory, {\em externals} cannot be distinguished from
+{\em internals} any more.
+
+\paragraph{Library}
+A {\em library} is a collection of {\em externals} that are compiled into a 
+single binary-file.
+
+{\em Library}-files have to follow a system dependent naming convention:
+
+\begin{tabular}{c||c|c|c}
+library & linux&irix&Win32 \\
+\hline
+{\tt my\_lib}&{\tt  my\_lib.pd\_linux}&{\tt  my\_lib.pd\_irix}&
+{\tt  my\_lib.dll}\\
+\end{tabular}
+
+The simplest form of a {\em library} includes exactly one {\em external}
+bearing the same name as the {\em library}.
+
+Unlike {\em externals}, {\em libraries} can be imported by Pd with special operations.
+After a {\em library} has been imported,
+all included {\em externals} have been loaded into memory and are available as objects.
+
+Pd supports to modes to import {\em libraries}:
+
+\begin{itemize}
+\item via the command line-option ``{\tt -lib my\_lib}''
+\item by creating an object ``{\tt my\_lib}''
+\end{itemize}
+
+The first method loads a {\em library} when Pd is started.
+This method is preferably used for {\em libraries} that contain several {\em externals}.
+
+The other method should be used for {\em libraries} that contain exactly
+one {\em external} bearing the same name.
+Pd checks first, whether a class named ``my\_lib'' is already loaded.
+If this is not the case\footnote{
+If a class ``my\_lib'' is already existent, an object ``my\_lib'' will be instantiated
+and the procedure is done. 
+Thus, no {\em library} has been loaded.
+Therefore no {\em library} that is named like an already used class-name like, say, ``abs'',
+can be loaded.}, all paths are searched for a file called
+``{\tt my\_lib.pd\_linux}''\footnote{or another system-dependent filename-extensions (s.a.)}.
+If such file is found, all included {\em externals} are loaded into memory by calling a
+routine \verb+my_lib_setup()+.
+After loading, a class ``my\_lib'' is (again) looked for as a (newly loaded) {\em external}.
+If so, an instance of this class is created, else the instantiation fails and an error is
+printed.
+Anyhow, all {\em external}-classes declared in the {\em library} are loaded by now.
+
+
+\section{my first external: {\tt helloworld}}
+Usually the first attempt learning a programming-language is a ``hello world''-application.
+
+In our case, an object class should be created, that prints the line ``hello world!!'' to
+the standard error every time it is triggered with a ``bang''-message.
+
+
+
+\subsection{the interface to Pd}
+To write a Pd-external a well-defined interface is needed.
+This is provided in the header-file ``m\_pd.h''.
+
+\begin{verbatim}
+#include "m_pd.h"
+\end{verbatim}
+
+\subsection{a class and its data space}
+First a new class has to be prepared and the data space for this class has to be defined.
+
+\begin{verbatim}
+static t_class *helloworld_class;
+
+typedef struct _helloworld {
+  t_object  x_obj;
+} t_helloworld;
+\end{verbatim}
+
+\verb+hello_worldclass+ is going to be a pointer to the new class.
+
+The structure \verb+t_helloworld+ (of the type \verb+_helloworld+) is
+the data space of the class.
+
+An absolutely necessary element of the data space is a variable of the type
+\verb+t_object+, which is used to store internal object-properties like
+the graphical presentation of the object or data about inlets and outlets.
+
+\verb+t_object+ has to be the first entry in the structure !
+
+Because a simple ``hello world''-application needs no variables,
+the structure is empty apart from the \verb+t_object+.
+
+
+\subsection{method space}
+Apart from the data space, a class needs a set of manipulators (methods) to
+manipulate the data with.
+
+If a message is sent to an instance of our class, a method is called.
+These methods are the interfaces to the message system of Pd.
+On principal they have no return argument and are therefore are of the
+type \verb+void+.
+
+\begin{verbatim}
+void helloworld_bang(t_helloworld *x)
+{
+  post("Hello world !!");
+}
+\end{verbatim}
+
+
+This method has an argument of the type \verb+t_helloworld+,
+which would enable us to manipulate the data space.
+
+Since we only want to output ``Hello world!''
+(and, by the way, our data space is quite sparse),
+we renounce a manipulation.
+
+The command \verb+post(char *c,...)+ sends a string to the standard error.
+A carriage return is added automatically.
+Apart from this, the \verb+post+-command works like the {\tt C}-command \verb+printf()+.
+
+\subsection{generation of a new class}
+To generate a new class, information of the data space and the method space of this class,
+have to be passed to Pd when a library is loaded.
+
+On loading a new library ``my\_lib'',
+Pd tries to call a function ``my\_lib\_setup()''.
+This function (or functions called by it) 
+declares the new classes and their properties.
+It is only called once, when the library is loaded.
+If the function-call fails (e.g., because no function of the specified name is present)
+no external of the library will be loaded.
+
+\begin{verbatim}
+void helloworld_setup(void)
+{
+  helloworld_class = class_new(gensym("helloworld"),
+        (t_newmethod)helloworld_new,
+        0, sizeof(t_helloworld),
+        CLASS_DEFAULT, 0);
+
+  class_addbang(helloworld_class, helloworld_bang);
+}
+\end{verbatim}
+
+\paragraph{class\_new}
+
+The function \verb+class_new+ creates a new class and returns a pointer to this prototype.
+
+The first argument is the symbolic name of the class.
+
+The next two arguments define the constructor and destructor of the class.
+
+Whenever a class object is created in a Pd-patch,
+the class-constructor \verb+(t_newmethod)helloworld_new+ instantiates the object
+and initialises the data space.
+
+Whenever an object is destroyed
+(either by closing the containing patch or by deleting the object from the patch)
+the destructor frees the dynamically reserved memory.
+The allocated memory for the static data space is automatically reserved and freed.
+
+Therefore we do not have to provide a destructor in this example, the argument
+is set to ``0''.
+
+To enable Pd to reserve and free enough memory for the static data space,
+the size of the data structure has to be passed as the fourth argument.
+
+The fifth argument has influence on the graphical representation of the class objects.
+The default-value is \verb+CLASS_DEFAULT+ or simply ``0''.
+
+The remaining arguments define the arguments of an object and its type.
+
+Up to six numeric and symbolic object-arguments can be defined via
+\verb+A_DEFFLOAT+ and \verb+A_DEFSYMBOL+.
+If more arguments are to be passed to the object
+or if the order of atom types should by more flexible, 
+\verb+A_GIMME+ can be used for passing an arbitrary list of atoms.
+
+The list of object-arguments is terminated by ``0''.
+In this example we have no object-arguments at all for the class.
+
+\paragraph{class\_addbang}
+We still have to add a method space to the class.
+
+\verb+class_addbang+ adds a method for a ``bang''-message to the class that is
+defined in the first argument.
+The added method is defined in the second argument.
+
+
+\subsection{constructor: instantiation of an object}
+Each time, an object is created in a Pd-patch, the
+constructor that is defined with the \verb+class_new+-command,
+generates a new instance of the class.
+
+The constructor has to be of type \verb+void *+.
+
+\begin{verbatim}
+void *helloworld_new(void)
+{
+  t_helloworld *x = (t_helloworld *)pd_new(helloworld_class);
+
+  return (void *)x;
+}
+\end{verbatim}
+
+
+The arguments of the constructor-method depend on the object-arguments
+defined with \verb+class_new+.
+
+\begin{tabular}{l|l}
+\verb+class_new+-argument&constructor-argument\\
+\hline
+\verb+A_DEFFLOAT+&\verb+t_floatarg f+ \\
+\verb+A_DEFSYMBOL+&\verb+t_symbol *s+ \\
+\verb+A_GIMME+&\verb+t_symbol *s, int argc, t_atom *argv+
+\end{tabular}
+
+Because there are no object-arguments for our ``hello world''-class,
+the constructor has anon too.
+
+The function \verb+pd_new+ reserves memory for the data space,
+initialises the variables that are internal to the object and
+returns a pointer to the data space.
+
+The type-cast to the data space is necessary.
+
+Normally, the constructor would initialise the object-variables.
+However, since we have none, this is not necessary.
+
+
+The constructor has to return a pointer to the instantiated data space.
+
+\subsection{the code: \tt helloworld}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *helloworld_class;
+
+typedef struct _helloworld {
+  t_object  x_obj;
+} t_helloworld;
+
+void helloworld_bang(t_helloworld *x)
+{
+  post("Hello world !!");
+}
+
+void *helloworld_new(void)
+{
+  t_helloworld *x = (t_helloworld *)pd_new(helloworld_class);
+
+  return (void *)x;
+}
+
+void helloworld_setup(void) {
+  helloworld_class = class_new(gensym("helloworld"),
+        (t_newmethod)helloworld_new,
+        0, sizeof(t_helloworld),
+        CLASS_DEFAULT, 0);
+  class_addbang(helloworld_class, helloworld_bang);
+}
+\end{verbatim}
+
+
+\section{a simple external: {\tt counter}}
+
+Now we want to realize a simple counter as an external.
+A ``bang''-trigger outputs the counter-value on the outlet and
+afterwards increases the counter-value by 1.
+
+This class is similar to the previous one,
+but the data space is extended by a variable ``counter'' and the
+result is written as a message to an outlet instead of 
+a string to the standard error.
+
+\subsection{object-variables}
+Of course, a counter needs a state-variable to store the actual counter-value.
+
+State-variables that belong to class instances belong to the data space.
+
+\begin{verbatim}
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+} t_counter;
+\end{verbatim}
+
+The integer variable \verb+i_count+ stores the counter-value.
+
+\subsection{object-arguments}
+It is quite useful for a counter, if a initial value can be defined by the user.
+Therefore this initial value should be passed to the object at creation-time.
+
+\begin{verbatim}
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT,
+        A_DEFFLOAT, 0);
+
+  class_addbang(counter_class, counter_bang);
+}
+\end{verbatim}
+
+So we have an additional argument in the function \verb+class_new+:
+\verb+A_DEFFLOAT+ tells Pd, that the object needs one argument of the 
+type \verb+t_floatarg+.
+If no argument is passed, this will default to ``0''.
+
+\subsection{constructor}
+The constructor has some new tasks.
+On the one hand, a variable value has to be initialised,
+on the other hand, an outlet for the object has to be created.
+
+\begin{verbatim}
+void *counter_new(t_floatarg f)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+
+  x->i_count=f;
+  outlet_new(&x->x_obj, &s_float);
+
+  return (void *)x;
+}
+\end{verbatim}
+
+The constructor-method has one argument of type \verb+t_floatarg+ as declared
+in the setup-routine by \verb+class_new+.
+This argument is used to initialise the counter.
+
+A new outlet is created with the function \verb+outlet_new+.
+The first argument is a pointer to the interna of the object
+the new outlet is created for.
+
+The second argument is a symbolic description of the outlet-type.
+Since out counter should output numeric values it is of type ``float''.
+
+\verb+outlet_new+ returns a pointer to the new outlet and saves this very pointer
+in the \verb+t_object+-variable \verb+x_obj.ob_outlet+.
+If only one outlet is used, the pointer need not additionally be stored in the data space.
+If more than one outlets are used, the pointers have to be stored in the data space,
+because the \verb+t_object+-variable can only hold one outlet pointer.
+
+\subsection{the counter method}
+When triggered, the counter value should be sent to the outlet
+and afterwards be incremented by 1.
+
+\begin{verbatim}
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  x->i_count++;
+  outlet_float(x->x_obj.ob_outlet, f);
+}
+\end{verbatim}
+
+The function \verb+outlet_float+ sends a floating-point-value (second argument) to the outlet
+that is specified by the first argument.
+
+We first store the counter in a floating point-buffer.
+Afterwards the counter is incremented and not before that the buffer variable is sent 
+to the outlet.
+
+What appears to be unnecessary on the first glance, makes sense after further
+inspection:
+The buffer variable has been realized as \verb+t_float+,
+since \verb+outlet_float+ expects a floating point-value and a typecast is
+inevitable.
+
+If the counter value was sent to the outlet before being incremented,
+this could result in an unwanted (though well defined) behaviour:
+If the counter-outlet directly triggered its own inlet,
+the counter-method would be called although the counter value was not yet incremented.
+Normally this is not what we want.
+
+The same (correct) result could of course be obtained with a single line,
+but this  would obscure the {\em reentrant}-problem.
+
+\subsection{the code: \tt counter}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *counter_class;
+
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+} t_counter;
+
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  x->i_count++;
+  outlet_float(x->x_obj.ob_outlet, f);
+}
+
+void *counter_new(t_floatarg f)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+
+  x->i_count=f;
+  outlet_new(&x->x_obj, &s_float);
+
+  return (void *)x;
+}
+
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT,
+        A_DEFFLOAT, 0);
+
+  class_addbang(counter_class, counter_bang);
+}
+\end{verbatim}
+
+
+\section{a complex external: \tt counter}
+
+The simple counter of the previous chapter can easily be extended to more complexity.
+It might be quite useful to be able to reset the counter to an initial value,
+to set upper and lower boundaries and to control the step-width.
+Each overrun should send a ``bang''-Message to a second outlet and reset the counter to
+the initial value.
+
+\subsection{extended data space}
+
+\begin{verbatim}
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+  t_float step;
+  t_int i_down, i_up;
+  t_outlet *f_out, *b_out;
+} t_counter;
+\end{verbatim}
+
+The data space has been extended to hold variables for step width and 
+upper and lower boundaries.
+Furthermore pointers for two outlets have been added.
+
+\subsection{extension of the class}
+The new class objects should have methods for different messages,
+like ``set'' and ``reset''.
+Therefore the method space has to be extended too.
+
+\begin{verbatim}
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT, 
+        A_GIMME, 0);
+\end{verbatim}
+
+The class generator \verb+class_new+ has been extended by the argument \verb+A_GIMME+.
+This enables a dynamic number of arguments to be passed at the instantiation of the object.
+
+\begin{verbatim}
+  class_addmethod(counter_class,
+        (t_method)counter_reset,
+        gensym("reset"), 0);
+\end{verbatim}
+
+\verb+class_addmethod+ adds a method for an arbitrary selector to an class.
+
+The first argument is the class the method (second argument) will be added to.
+
+The third argument is the symbolic selector that should be associated with the method.
+
+The remaining ``0''-terminated arguments describe the list of atoms that
+follows the selector.
+
+\begin{verbatim}
+  class_addmethod(counter_class,
+        (t_method)counter_set, gensym("set"),
+        A_DEFFLOAT, 0);
+  class_addmethod(counter_class,
+        (t_method)counter_bound, gensym("bound"),
+        A_DEFFLOAT, A_DEFFLOAT, 0);
+\end{verbatim}
+
+A method for ``set'' followed by a numerical value is added,
+as well as a method for the selector ``bound'' followed by two numerical values.
+
+\begin{verbatim}
+  class_sethelpsymbol(counter_class, gensym("help-counter"));
+\end{verbatim}
+
+If a Pd-object is right-clicked, a help-patch describing the object-class can be opened.
+By default, this patch is located in the directory ``{\em doc/5.reference/}'' and
+is named like the symbolic class name.
+
+An alternative help-patch can be defined with the 
+\verb+class_sethelpsymbol+-command.
+
+\subsection{construction of in- and outlets}
+
+When creating the object, several arguments should be passed by the user.
+
+\begin{verbatim}
+void *counter_new(t_symbol *s, int argc, t_atom *argv)
+\end{verbatim}
+Because of the declaration of arguments in the \verb+class_new+-function
+with \verb+A_GIMME+,
+the constructor has following arguments:
+
+\begin{tabular}{c|l}
+\verb+t_symbol *s+ & the symbolic name,\\
+& that was used for object creation \\
+\verb+int argc+ & the number of arguments passed to the object\\
+\verb+t_atom *argv+ & a pointer to a list of {\tt argc} atoms
+\end{tabular}
+
+\begin{verbatim}
+  t_float f1=0, f2=0;
+
+  x->step=1;
+  switch(argc){
+  default:
+  case 3:
+    x->step=atom_getfloat(argv+2);
+  case 2:
+    f2=atom_getfloat(argv+1);
+  case 1:
+    f1=atom_getfloat(argv);
+    break;
+  case 0:
+    break;
+  }
+  if (argc<2)f2=f1;
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+
+  x->i_count=x->i_down;
+\end{verbatim}
+
+If three arguments are passed, these should be the {\em lower boundary},
+the {\em upper boundary} and the {\em step width}.
+
+If only two arguments are passed, the step-width defaults to ``1''.
+If only one argument is passed, this should be the {\em initial value} of the counter with
+step-width of ``1''.
+
+\begin{verbatim}
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd,
+        gensym("list"), gensym("bound"));
+\end{verbatim}
+
+The function \verb+inlet_new+ creates a new ``active'' inlet.
+``Active'' means, that a class-method is called each time
+a message is sent to an ``active'' inlet.
+
+Due to the software-architecture, the first inlet is always ``active''.
+
+The first two arguments of the \verb+inlet_new+-function are
+pointers to the interna of the object and to the graphical presentation of the object.
+
+The symbolic selector that is specified by the third argument is to be
+substituted by another symbolic selector (fourth argument) for this inlet.
+
+Because of this substitution of selectors,
+a message on a certain right inlet can be treated as a message with 
+a certain selector on the leftmost inlet.
+
+This means:
+\begin{itemize}
+\item The substituting selector has to be declared by \verb+class_addmethod+
+in the setup-routine.
+\item It is possible to simulate a certain right inlet, by sending a message with
+this inlet's selector to the leftmost inlet.
+\item It is not possible to add methods for more than one selector to a right inlet.
+Particularly it is not possible to add a universal method for arbitrary selectors to 
+a right inlet.
+\end{itemize}
+
+\begin{verbatim}
+  floatinlet_new(&x->x_obj, &x->step);
+\end{verbatim}
+\verb+floatinlet_new+ generates a new ``passive'' inlet for numerical values.
+``Passive'' inlets allow parts of the data space-memory to be written directly 
+from outside.
+Therefore it is not possible to check for illegal inputs.
+
+The first argument is a pointer to the internal infrastructure of the object.
+The second argument is the address in the data space-memory,
+where other objects can write too.
+
+``Passive'' inlets can be created for pointers, symbolic or
+numerical (floating point\footnote{
+That's why the {\tt step}-width of the class\/data space is realized as {\tt t\_float}.})
+values.
+
+
+\begin{verbatim}
+  x->f_out = outlet_new(&x->x_obj, &s_float);
+  x->b_out = outlet_new(&x->x_obj, &s_bang);
+\end{verbatim}
+
+The pointers returned by \verb+outlet_new+ have to be saved in the class\/data space
+to be used later by the outlet-routines.
+
+The order of the generation of inlets and outlets is important,
+since it corresponds to the order of inlets and outlets in the
+graphical representation of the object.
+
+\subsection{extended method space}
+
+The method for the ``bang''-message has to full fill the more complex tasks.
+
+\begin{verbatim}
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  t_int step = x->step;
+  x->i_count+=step;
+  if (x->i_down-x->i_up) {
+    if ((step>0) && (x->i_count > x->i_up)) {
+      x->i_count = x->i_down;
+      outlet_bang(x->b_out);
+    } else if (x->i_count < x->i_down) {
+      x->i_count = x->i_up;
+      outlet_bang(x->b_out);
+    }
+  }
+  outlet_float(x->f_out, f);
+}
+\end{verbatim}
+
+Each outlet is identified by the \verb+outlet_...+-functions via the
+pointer to this outlets.
+
+The remaining methods still have to be implemented:
+
+\begin{verbatim}
+void counter_reset(t_counter *x)
+{
+  x->i_count = x->i_down;
+}
+
+void counter_set(t_counter *x, t_floatarg f)
+{
+  x->i_count = f;
+}
+
+void counter_bound(t_counter *x, t_floatarg f1, t_floatarg f2)
+{
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+}
+\end{verbatim}
+
+\subsection{the code: \tt counter}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *counter_class;
+
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+  t_float step;
+  t_int i_down, i_up;
+  t_outlet *f_out, *b_out;
+} t_counter;
+
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  t_int step = x->step;
+  x->i_count+=step;
+
+  if (x->i_down-x->i_up) {
+    if ((step>0) && (x->i_count > x->i_up)) {
+      x->i_count = x->i_down;
+      outlet_bang(x->b_out);
+    } else if (x->i_count < x->i_down) {
+      x->i_count = x->i_up;
+      outlet_bang(x->b_out);
+    }
+  }
+
+  outlet_float(x->f_out, f);
+}
+
+void counter_reset(t_counter *x)
+{
+  x->i_count = x->i_down;
+}
+
+void counter_set(t_counter *x, t_floatarg f)
+{
+  x->i_count = f;
+}
+
+void counter_bound(t_counter *x, t_floatarg f1, t_floatarg f2)
+{
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+}
+
+void *counter_new(t_symbol *s, int argc, t_atom *argv)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+  t_float f1=0, f2=0;
+
+  x->step=1;
+  switch(argc){
+  default:
+  case 3:
+    x->step=atom_getfloat(argv+2);
+  case 2:
+    f2=atom_getfloat(argv+1);
+  case 1:
+    f1=atom_getfloat(argv);
+    break;
+  case 0:
+    break;
+  }
+  if (argc<2)f2=f1;
+
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+
+  x->i_count=x->i_down;
+
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd,
+        gensym("list"), gensym("bound"));
+  floatinlet_new(&x->x_obj, &x->step);
+
+  x->f_out = outlet_new(&x->x_obj, &s_float);
+  x->b_out = outlet_new(&x->x_obj, &s_bang);
+
+  return (void *)x;
+}
+
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+        (t_newmethod)counter_new,
+        0, sizeof(t_counter),
+        CLASS_DEFAULT, 
+        A_GIMME, 0);
+
+  class_addbang  (counter_class, counter_bang);
+  class_addmethod(counter_class,
+        (t_method)counter_reset, gensym("reset"), 0);
+  class_addmethod(counter_class, 
+        (t_method)counter_set, gensym("set"),
+        A_DEFFLOAT, 0);
+  class_addmethod(counter_class,
+        (t_method)counter_bound, gensym("bound"),
+        A_DEFFLOAT, A_DEFFLOAT, 0);
+
+  class_sethelpsymbol(counter_class, gensym("help-counter"));
+}
+\end{verbatim}
+
+
+\section{a signal-external: {\tt pan\~\/}}
+Signal classes are normal Pd-classes, that offer additional methods for signals.
+
+
+All methods and concepts that can be realized with normal object classes can
+therefore be realized with signal classes too.
+
+Per agreement, the symbolic names of signal classes end with a tilde \~\/.
+
+The class ``pan\~\/'' shall demonstrate, how signal classes are written.
+
+A signal on the left inlet is mixed with a signal on the second inlet.
+The mixing-factor between 0 and 1 is defined via a \verb+t_float+-message
+on a third inlet.
+
+\subsection{variables of a signal class}
+Since a signal-class is only an extended normal class,
+there are no principal differences between the data spaces.
+
+\begin{verbatim}
+typedef struct _pan_tilde {
+  t_object x_obj;
+
+  t_sample f_pan;
+  t_float  f;
+} t_pan_tilde;
+\end{verbatim}
+
+Only one variable \verb+f_pan+ for the {\em mixing-factor} of the panning-function is needed.
+
+The other variable \verb+f+ is needed whenever a signal-inlet is needed too.
+If no signal but only a float-message is present at a signal-inlet, this
+variable is used to automatically convert the float to signal.
+
+\subsection{signal-classes}
+
+\begin{verbatim}
+void pan_tilde_setup(void) {
+  pan_tilde_class = class_new(gensym("pan~"),
+        (t_newmethod)pan_tilde_new,
+        0, sizeof(t_pan_tilde),
+        CLASS_DEFAULT, 
+        A_DEFFLOAT, 0);
+
+  class_addmethod(pan_tilde_class,
+        (t_method)pan_tilde_dsp, gensym("dsp"), 0);
+  CLASS_MAINSIGNALIN(pan_tilde_class, t_pan_tilde, f);
+}
+\end{verbatim}
+
+A method for signal-processing has to be provided by each signal class.
+
+Whenever Pd's audio engine is started, a message with the selector ``dsp''
+is sent to each object.
+Each class that has a method for the ``dsp''-message is recognised as signal class.
+
+Signal classes that want to provide signal-inlets have to
+declare this via the \verb+CLASS_MAINSIGNALIN+-macro.
+This enables signals at the first (default) inlet.
+If more than one signal-inlet is needed, they have to be created explicitly
+in the constructor-method.
+
+Inlets that are declared as signal-inlets cannot provide
+methods for \verb+t_float+-messages any longer.
+
+The first argument of the macro is a pointer to the signal class.
+The second argument is the type of the class's data space.
+
+The last argument is a dummy-variable out of the data space that is needed
+to replace non-existing signal at the signal-inlet(s) with \verb+t_float+-messages.
+
+\subsection{construction of signal-inlets and -outlets}
+
+\begin{verbatim}
+void *pan_tilde_new(t_floatarg f)
+{
+  t_pan_tilde *x = (t_pan_tilde *)pd_new(pan_tilde_class);
+
+  x->f_pan = f;
+  
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+  floatinlet_new (&x->x_obj, &x->f_pan);
+
+  outlet_new(&x->x_obj, &s_signal);
+
+  return (void *)x;
+}
+\end{verbatim}
+
+Additional signal-inlets are added like other inlets with the routine \verb+inlet_new+.
+The last two arguments are references to the symbolic selector ``signal''
+in the lookup-table.
+
+Signal-outlets are also created like normal (message-)outlets,
+by setting the outlet-selector to ``signal''.
+
+\subsection{DSP-methods}
+Whenever Pd's audio engine is turned on,
+all signal-objects declare their perform-routines that are to be added to the DSP-tree.
+
+The ``dsp''-method has two arguments, the pointer to the class-data space, and 
+a pointer to an array of signals.
+
+The signals are arranged in the array in such way,
+that they are ordered in a clockwise way in the graphical representation of the
+object.\footnote{
+If both left and right in- and out-signals exist, this means:
+First is the leftmost in-signal followed by the right in-signals;
+after the right out-signals, finally there comes the leftmost out-signal.}
+
+\begin{verbatim}
+void pan_tilde_dsp(t_pan_tilde *x, t_signal **sp)
+{
+  dsp_add(pan_tilde_perform, 5, x,
+          sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+\end{verbatim}
+
+\verb+dsp_add+ adds a {\em perform}-routine (as declared in the first argument)
+to the DSP-tree.
+
+The second argument is the number of the following pointers to diverse variables.
+Which pointers to which variables are passed is not limited.
+
+Here, sp[0] is the first in-signal, sp[1] represents the second in-signal and
+sp[3] points to the out-signal.
+
+The structure \verb+t_signal+ contains a pointer to the
+its signal-vector \verb+().s_vec+ (an array of samples of type  \verb+t_sample+),
+and the length of this signal-vector \verb+().s_n+.
+
+Since all signal vectors of a patch (not including it's sub-patches) are of the same length,
+it is sufficient to get the length of one of these vectors.
+
+\subsection{perform-routine}
+The perform-routine is the DSP-heart of each signal class.
+
+A pointer to an integer-array is passed to it.
+This array contains the pointers, that were passed via \verb+dsp_add+,
+which must be casted back to their real type.
+
+The perform-routine has to return a pointer to integer,
+that points to the address behind the stored pointers of the routine.
+This means, that the return argument equals the
+argument of the perform-routine plus
+the number of pointer variables (as declared as the second argument
+of \verb+dsp_add+) plus one.
+
+\begin{verbatim}
+t_int *pan_tilde_perform(t_int *w)
+{
+  t_pan_tilde *x = (t_pan_tilde *)(w[1]);
+  t_sample  *in1 =    (t_sample *)(w[2]);
+  t_sample  *in2 =    (t_sample *)(w[3]);
+  t_sample  *out =    (t_sample *)(w[4]);
+  int          n =           (int)(w[5]);
+
+  t_sample f_pan = (x->f_pan<0)?0.0:(x->f_pan>1)?1.0:x->f_pan;
+
+  while (n--) *out++ = (*in1++)*(1-f_pan)+(*in2++)*f_pan;
+
+  return (w+6);
+}
+\end{verbatim}
+
+Each sample of the signal vectors is read and manipulated in the \verb+while+-loop.
+
+
+Optimisation of the DSP-tree tries to avoid unnecessary copy-operations.
+Therefore it is possible, that in- and out-signal are located
+at the same address in the memory.
+In this case, the programmer has to be careful not to write into the out-signal
+before having read the in-signal to avoid overwriting data that is not yet saved.
+
+\subsection{the code: \tt pan\~\/}
+
+\begin{verbatim}
+#include "m_pd.h"
+
+static t_class *pan_tilde_class;
+
+typedef struct _pan_tilde {
+  t_object  x_obj;
+  t_sample f_pan;
+  t_sample f;
+} t_pan_tilde;
+
+t_int *pan_tilde_perform(t_int *w)
+{
+  t_pan_tilde *x = (t_pan_tilde *)(w[1]);
+  t_sample  *in1 =    (t_sample *)(w[2]);
+  t_sample  *in2 =    (t_sample *)(w[3]);
+  t_sample  *out =    (t_sample *)(w[4]);
+  int          n =           (int)(w[5]);
+  t_sample f_pan = (x->f_pan<0)?0.0:(x->f_pan>1)?1.0:x->f_pan;
+
+  while (n--) *out++ = (*in1++)*(1-f_pan)+(*in2++)*f_pan;
+
+  return (w+6);
+}
+
+void pan_tilde_dsp(t_pan_tilde *x, t_signal **sp)
+{
+  dsp_add(pan_tilde_perform, 5, x,
+          sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+
+void *pan_tilde_new(t_floatarg f)
+{
+  t_pan_tilde *x = (t_pan_tilde *)pd_new(pan_tilde_class);
+
+  x->f_pan = f;
+  
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+  floatinlet_new (&x->x_obj, &x->f_pan);
+  outlet_new(&x->x_obj, &s_signal);
+
+  return (void *)x;
+}
+
+void pan_tilde_setup(void) {
+  pan_tilde_class = class_new(gensym("pan~"),
+        (t_newmethod)pan_tilde_new,
+        0, sizeof(t_pan_tilde),
+        CLASS_DEFAULT, 
+        A_DEFFLOAT, 0);
+
+  class_addmethod(pan_tilde_class,
+        (t_method)pan_tilde_dsp, gensym("dsp"), 0);
+  CLASS_MAINSIGNALIN(pan_tilde_class, t_pan_tilde, f);
+}
+\end{verbatim}
+
+\vfill
+\newpage
+\begin{appendix}
+
+\section{Pd's message-system}
+Non-audio-data are distributed via a message-system.
+Each message consists of a ``selector'' and a list of atoms.
+
+\subsection{atoms}
+
+There are three kinds of atoms:
+\begin{itemize}
+\item {\em A\_FLOAT}: a numerical value (floating point)
+\item {\em A\_SYMBOL}: a symbolic value (string)
+\item {\em A\_POINTER}: a pointer
+\end{itemize}
+
+Numerical values are always floating point-values (\verb+t_float+),
+even if they could be displayed as integer values.
+
+Each symbol is stored in a lookup-table for reasons of performance.
+The command \verb+gensym+ looks up a string in the lookup-table and
+returns the address of the symbol.
+If the string is not yet to be found in the table,
+a new symbol is added.
+
+Atoms of type {\em A\_POINTER} are not very important (for simple externals). 
+
+The type of an atom \verb+a+ is stored in the structure-element \verb+a.a_type+.
+
+\subsection{selectors}
+The selector is a symbol that defines the type of a message.
+There are five predefined selectors:
+\begin{itemize}
+\item ``{\tt bang}'' labels a trigger event.
+A ``bang''-message consists only of the selector and contains no lists of atoms.
+\item ``{\tt float}'' labels a numerical value.
+The list of a ``float''-Message contains one single atom of type {\em A\_FLOAT}
+\item ``{\tt symbol}'' labels a symbolic value.
+The list of a ``symbol''-Message contains one single atom of type {\em A\_SYMBOL}
+\item ``{\tt pointer}'' labels a pointer value.
+The list of a ``pointer''-Message contains one single atom of type {\em A\_POINTER}
+\item ``{\tt list}'' labels a list of one or more atoms of arbitrary type.
+\end{itemize}
+
+Since the symbols for these selectors are used quite often,
+their address in the lookup-table can be queried directly,
+without having to use \verb+gensym+:
+
+\begin{tabular}{l||l|l}
+selector&lookup-routine&lookup-address\\
+\hline
+\tt bang &\verb+gensym("bang")+ & \verb+&s_bang+ \\
+\tt float &\verb+gensym("float")+ & \verb+&s_float+ \\
+\tt symbol &\verb+gensym("symbol")+ & \verb+&s_symbol+ \\
+\tt pointer &\verb+gensym("pointer")+ & \verb+&s_pointer+ \\
+\tt list &\verb+gensym("list")+ & \verb+&s_list+ \\
+--- (signal) &\verb+gensym("signal")+&\verb+&s_symbol+
+\end{tabular}
+
+Other selectors can be used as well.
+The receiving class has to provide a method for a specifique selector
+or for ``anything'', which is any arbitrary selector.
+
+Messages that have no explicit selector and start with a numerical value,
+are recognised automatically either as ``float''-message (only one atom) or as
+``list''-message (several atoms).
+
+For example, messages ``\verb+12.429+'' and ``\verb+float 12.429+'' are identical.
+Likewise, the messages ``\verb+list 1 for you+'' is identical to ``\verb+1 for you+''.
+
+\section{Pd-types}
+Since Pd is used on several platforms,
+many ordinary types of variables, like \verb|int|, are re-defined.
+To write portable code, it is reasonable to use types provided by Pd.
+
+Apart from this there are many predefined types,
+that should make the life of the programmer simpler.
+
+Generally, Pd-types start with \verb|t_|.
+
+\begin{tabular}{c|l}
+Pd-type & description \\
+\hline\hline
+\verb+t_atom+& atom \\
+\verb+t_float+ & floating point value\\
+\verb+t_symbol+ & symbol \\
+\verb+t_gpointer+ & pointer (to graphical objects) \\
+\hline
+\verb+t_int+ & integer value \\
+\verb+t_signal+ & structure of a signal \\
+\verb+t_sample+ & audio signal-value (floating point)\\
+\verb+t_outlet+ & outlet of an object \\
+\verb+t_inlet+ & inlet of an object \\
+\verb+t_object+ & object-interna \\
+\hline
+\verb+t_class+ & a Pd-class \\
+\verb+t_method+ & class-method \\
+\verb+t_newmethod+ & pointer to a constructor (new-routine) \\
+\end{tabular}
+
+
+\section{important functions in ``m\_pd.h''}
+
+\subsection{functions: atoms}
+
+\subsubsection{SETFLOAT}
+\begin{verbatim}
+SETFLOAT(atom, f)
+\end{verbatim}
+This macro sets the type of \verb+atom+ to \verb+A_FLOAT+
+and stores the numerical value \verb+f+ in this atom.
+
+\subsubsection{SETSYMBOL}
+\begin{verbatim}
+SETSYMBOL(atom, s)
+\end{verbatim}
+This macro sets the type of \verb+atom+ to \verb+A_SYMBOL+
+and stores the symbolic pointer \verb+s+ in this atom.
+
+\subsubsection{SETPOINTER}
+\begin{verbatim}
+SETPOINTER(atom, pt)
+\end{verbatim}
+This macro sets the type of \verb+atom+ to \verb+A_POINTER+
+and stores the pointer \verb+pt+ in this atom.
+
+\subsubsection{atom\_getfloat}
+\begin{verbatim}
+t_float atom_getfloat(t_atom *a);
+\end{verbatim}
+If the type of the atom \verb+a+ is \verb+A_FLOAT+,
+the numerical value of this atom else ``0.0'' is returned.
+
+\subsubsection{atom\_getfloatarg}
+\begin{verbatim}
+t_float atom_getfloatarg(int which, int argc, t_atom *argv)
+\end{verbatim}
+If the type of the atom -- that is found at in the atom-list
+\verb+argv+ with the length \verb+argc+ at the place \verb+which+ --
+is \verb+A_FLOAT+, the numerical value of this atom else ``0.0'' is returned.
+
+\subsubsection{atom\_getint}
+\begin{verbatim}
+t_int atom_getint(t_atom *a);
+\end{verbatim}
+If the type of the atom \verb+a+ is \verb+A_FLOAT+,
+its numerical value is returned as integer else ``0'' is returned.
+
+\subsubsection{atom\_getsymbol}
+\begin{verbatim}
+t_symbol atom_getsymbol(t_atom *a);
+\end{verbatim}
+If the type of the atom \verb+a+ is \verb+A_SYMBOL+,
+a pointer to this symbol is returned, else a null-pointer ``0'' is returned.
+
+\subsubsection{atom\_gensym}
+\begin{verbatim}
+t_symbol *atom_gensym(t_atom *a);
+\end{verbatim}
+If the type of the atom \verb+a+ is \verb+A_SYMBOL+,
+a pointer to this symbol is returned.
+
+Atoms of a different type, are ``reasonably'' converted into a string.
+This string is -- on demand -- inserted into the symbol-table.
+A pointer to this symbol is returned.
+
+\subsubsection{atom\_string}
+\begin{verbatim}
+void atom_string(t_atom *a, char *buf, unsigned int bufsize);
+\end{verbatim}
+Converts an atom \verb+a+ into a {\tt C}-string \verb+buf+.
+The memory to this char-Buffer has to be reserved manually and
+its length has to be declared in \verb+bufsize+.
+
+\subsubsection{gensym}
+\begin{verbatim}
+t_symbol *gensym(char *s);
+\end{verbatim}
+Checks, whether the C-string \verb+*s+ has already been inserted into the symbol-table.
+If no entry exists, it is created.
+A pointer to the symbol is returned.
+
+\subsection{functions: classes}
+\subsubsection{class\_new}
+\begin{verbatim}
+t_class *class_new(t_symbol *name,
+        t_newmethod newmethod, t_method freemethod,
+        size_t size, int flags,
+        t_atomtype arg1, ...);
+\end{verbatim}
+Generates a class with the symbolic name \verb+name+.
+\verb+newmethod+ is the constructor that creates an instance of the class and
+returns a pointer to this instance.
+
+If memory is reserved dynamically, this memory has to be freed by the
+destructor-method \verb+freemethod+ (without any return argument),
+when the object is destroyed.
+
+\verb+size+  is the static size of the class-data space,
+that is returned by \verb+sizeof(t_mydata)+.
+
+\verb+flags+ define the presentation of the graphical object.
+A (more or less arbitrary) combination of following objects is possible:
+
+\begin{tabular}{l|l}
+flag&description\\
+\hline
+\verb+CLASS_DEFAULT+ & a normal object with one inlet \\
+\verb+CLASS_PD+ & \em object (without graphical presentation) \\
+\verb+CLASS_GOBJ+ & \em pure graphical object (like arrays, graphs,...)\\
+\verb+CLASS_PATCHABLE+ & \em a normal object (with one inlet) \\
+\verb+CLASS_NOINLET+ & the default inlet is suppressed \\
+\end{tabular}
+
+Flags the description of which is printed in {\em italic}
+are of small importance for writing externals.
+
+The remaining arguments \verb+arg1,...+ define the
+types of object-arguments passed at the creation of a class-object.
+A maximum of six type checked arguments can be passed to an object.
+The list of argument-types are terminated by ``0''.
+
+Possible types of arguments are:
+
+\begin{tabular}{l|l}
+\verb+A_DEFFLOAT+ & a numerical value \\
+\verb+A_DEFSYMBOL+ & a symbolical value \\
+\verb+A_GIMME+ & a list of atoms of arbitrary length and types \\
+\end{tabular}
+
+If more than six arguments are to be passed,
+\verb+A_GIMME+ has to be used and a manual type-check has to be made.
+
+\subsubsection{class\_addmethod}
+\begin{verbatim}
+void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
+    t_atomtype arg1, ...);
+\end{verbatim}
+Adds a method \verb+fn+ for a selector \verb+sel+ to a class \verb+c+.
+
+The remaining arguments \verb+arg1,...+ define the
+types of the list of atoms that follow the selector.
+A maximum of six type-checked arguments can be passed.
+If more than six arguments are to be passed,
+\verb+A_GIMME+ has to be used and a manual type-check has to be made.
+
+The list of arguments is terminated by ``0''.
+
+
+Possible types of arguments are:
+
+\begin{tabular}{l|l}
+\verb+A_DEFFLOAT+ & a numerical value \\
+\verb+A_DEFSYMBOL+ & a symbolical value \\
+\verb+A_POINTER+ & a pointer \\
+\verb+A_GIMME+ & a list of atoms of arbitrary length and types \\
+\end{tabular}
+
+\subsubsection{class\_addbang}
+\begin{verbatim}
+void class_addbang(t_class *c, t_method fn);
+\end{verbatim}
+Adds a method \verb+fn+ for ``bang''-messages to the class \verb+c+.
+
+The argument of the ``bang''-method is a pointer to the class-data space:
+
+\verb+void my_bang_method(t_mydata *x);+
+
+\subsubsection{class\_addfloat}
+\begin{verbatim}
+void class_addfloat(t_class *c, t_method fn);
+\end{verbatim}
+Adds a method \verb+fn+ for ``float''-messages to the class \verb+c+.
+
+The arguments of the ``float''-method is a pointer to the class-data space and
+a floating point-argument:
+
+\verb+void my_float_method(t_mydata *x, t_floatarg f);+
+
+\subsubsection{class\_addsymbol}
+\begin{verbatim}
+void class_addsymbol(t_class *c, t_method fn);
+\end{verbatim}
+Adds a method \verb+fn+ for ``symbol''-messages to the class \verb+c+.
+
+The arguments of the ``symbol''-method is a pointer to the class-data space and
+a pointer to the passed symbol:
+
+\verb+void my_symbol_method(t_mydata *x, t_symbol *s);+
+
+\subsubsection{class\_addpointer}
+\begin{verbatim}
+void class_addpointer(t_class *c, t_method fn);
+\end{verbatim}
+Adds a method \verb+fn+ for ``pointer''-messages to the class \verb+c+.
+
+The arguments of the ``pointer''-method is a pointer to the class-data space and
+a pointer to a pointer:
+
+\verb+void my_pointer_method(t_mydata *x, t_gpointer *pt);+
+
+\subsubsection{class\_addlist}
+\begin{verbatim}
+void class_addlist(t_class *c, t_method fn);
+\end{verbatim}
+Adds a method \verb+fn+ for ``list''-messages to the class \verb+c+.
+
+The arguments of the ``list''-method are -- apart from a pointer to the class-data space --
+a pointer to the selector-symbol (always \verb+&s_list+),
+the number of atoms and a pointer to the list of atoms:
+
+\verb+void my_list_method(t_mydata *x,+
+
+\verb+   t_symbol *s, int argc, t_atom *argv);+
+
+\subsubsection{class\_addanything}
+\begin{verbatim}
+void class_addanything(t_class *c, t_method fn);
+\end{verbatim}
+Adds a method \verb+fn+ for an arbitrary message to the class \verb+c+.
+
+The arguments of the anything-method are -- apart from a pointer to the class-data space --
+a pointer to the selector-symbol,
+the number of atoms and a pointer to the list of atoms:
+
+\verb+void my_any_method(t_mydata *x,+
+
+\verb+   t_symbol *s, int argc, t_atom *argv);+
+
+\subsubsection{class\_addcreator}
+\begin{verbatim}
+ void class_addcreator(t_newmethod newmethod, t_symbol *s, 
+    t_atomtype type1, ...);
+\end{verbatim}
+Adds a creator-symbol \verb+s+, alternative to the symbolic class name,
+to the constructor \verb+newmethod+.
+Thus, objects can be created either by their ``real'' class name or
+an alias-name (p.e. an abbreviation, like the internal ``float'' resp. ``f'').
+
+The ``0''-terminated list of types corresponds to that of \verb+class_new+.
+
+\subsubsection{class\_sethelpsymbol}
+\begin{verbatim}
+void class_sethelpsymbol(t_class *c, t_symbol *s);
+\end{verbatim}
+
+If a Pd-object is right-clicked, a help-patch for the corresponding object class
+can be opened.
+By default this is a patch with the symbolic class name in the
+directory ``{\em doc/5.reference/}''.
+
+The name of the help-patch for the class that is pointed to by \verb+c+
+is changed to the symbol \verb+s+.
+
+Therefore, several similar classes can share a single help-patch.
+
+Path-information is relative to the default help path {\em doc/5.reference/}.
+
+\subsubsection{pd\_new}
+\begin{verbatim}
+t_pd *pd_new(t_class *cls);
+\end{verbatim}
+Generates a new instance of the class \verb+cls+ and
+returns a pointer to this instance.
+
+\subsection{functions: inlets and outlets}
+All routines for inlets and outlets need a reference to the object-interna of
+the class-instance.
+When instantiating a new object,
+the necessary data space-variable of the \verb+t_object+-type is initialised.
+This variable has to be passed as the \verb+owner+-object to the
+various inlet- and outlet-routines.
+
+\subsubsection{inlet\_new}
+\begin{verbatim}
+t_inlet *inlet_new(t_object *owner, t_pd *dest,
+      t_symbol *s1, t_symbol *s2);
+\end{verbatim}
+Generates an additional ``active'' inlet for the object
+that is pointed at by \verb+owner+.
+Generally, \verb+dest+ points at ``\verb+owner.ob_pd+''.
+
+The selector \verb+s1+ at the new inlet is substituted by the selector \verb+s2+.
+
+If a message with selector \verb+s1+ appears at the new inlet,
+the class-method for the selector \verb+s2+ is called.
+
+This means
+\begin{itemize}
+\item The substituting selector has to be declared by \verb+class_addmethod+
+in the setup-routine.
+\item It is possible to simulate a certain right inlet, by sending a message with
+this inlet's selector to the leftmost inlet.
+
+Using an empty symbol (\verb+gensym("")+) as selector
+makes it impossible to address a right inlet via the leftmost one.
+
+\item It is not possible to add methods for more than one selector to a right inlet.
+Particularly it is not possible to add a universal method for arbitrary selectors to 
+a right inlet.
+\end{itemize}
+
+\subsubsection{floatinlet\_new}
+\begin{verbatim}
+t_inlet *floatinlet_new(t_object *owner, t_float *fp);
+\end{verbatim}
+Generates a new ``passive'' inlet for the object that is pointed at by \verb+owner+.
+This inlet enables numerical values to be written directly into the
+memory \verb+fp+, without calling a dedicated method.
+
+\subsubsection{symbolinlet\_new}
+\begin{verbatim}
+t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp);
+\end{verbatim}
+Generates a new ``passive'' inlet for the object that is pointed at by \verb+owner+.
+This inlet enables symbolic values to be written directly into the
+memory \verb+*sp+, without calling a dedicated method.
+
+
+\subsubsection{pointerinlet\_new}
+\begin{verbatim}
+t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp);
+\end{verbatim}
+Generates a new ``passive'' inlet for the object that is pointed at by \verb+owner+.
+This inlet enables pointer to be written directly into the
+memory \verb+gp+, without calling a dedicated method.
+
+\subsubsection{outlet\_new}
+\begin{verbatim}
+t_outlet *outlet_new(t_object *owner, t_symbol *s);
+\end{verbatim}
+Generates a new outlet for the object that is pointed at by \verb+owner+.
+The Symbol \verb+s+ indicates the type of the outlet.
+
+\begin{tabular}{c|l||l}
+symbol & symbol-address & outlet-type \\
+\hline\hline
+``bang'' & \verb+&s_bang+ & message (bang)\\
+``float'' & \verb+&s_float+ & message (float)\\
+``symbol'' & \verb+&s_symbol+ & message (symbol) \\
+``pointer'' & \verb+&s_gpointer+ & message (pointer)\\
+``list'' & \verb+&s_list+ & message (list) \\
+--- & 0 & message \\
+\hline
+``signal'' & \verb+&s_signal+ & signal \\
+\end{tabular}
+
+There are no real differences between outlets of the various message-types.
+At any rate, it makes code more easily readable,
+if the use of outlet is shown at creation-time.
+For outlets for any messages a null-pointer is used.
+Signal-outlet must be declared with \verb+&s_signal+.
+
+Variables if the type \verb+t_object+ provide pointer to one outlet.
+Whenever a new outlet is generated, its address is stored in the
+object variable \verb+(*owner).ob_outlet+.
+
+If more than one message-outlet is needed,
+the outlet-pointers that are returned by \verb+outlet_new+ 
+have to be stored manually in the data space
+to address the given outlets.
+
+\subsubsection{outlet\_bang}
+\begin{verbatim}
+void outlet_bang(t_outlet *x);
+\end{verbatim}
+Outputs a ``bang''-message at the outlet specified by \verb+x+.
+
+\subsubsection{outlet\_float}
+\begin{verbatim}
+void outlet_float(t_outlet *x, t_float f);
+\end{verbatim}
+Outputs a ``float''-message with the numeric value \verb+f+
+at the outlet specified by \verb+x+.
+
+\subsubsection{outlet\_symbol}
+\begin{verbatim}
+void outlet_symbol(t_outlet *x, t_symbol *s);
+\end{verbatim}
+Outputs a ``symbol''-message with the symbolic value \verb+s+
+at the outlet specified by \verb+x+.
+
+\subsubsection{outlet\_pointer}
+\begin{verbatim}
+void outlet_pointer(t_outlet *x, t_gpointer *gp);
+\end{verbatim}
+Outputs a ``pointer''-message with the pointer \verb+gp+
+at the outlet specified by \verb+x+.
+
+\subsubsection{outlet\_list}
+\begin{verbatim}
+void outlet_list(t_outlet *x,
+                 t_symbol *s, int argc, t_atom *argv);
+\end{verbatim}
+Outputs a ``list''-message at the outlet specified by \verb+x+.
+The list contains \verb+argc+ atoms.
+\verb+argv+ points to the first element of the atom-list.
+
+Independent of the symbol \verb+s+, the selector ``list'' will precede
+the list.
+
+To make the code more readable,
+\verb+s+ should point to the symbol list
+(either via \verb+gensym("list")+ or via \verb+&s_list+)
+
+\subsubsection{outlet\_anything}
+\begin{verbatim}
+void outlet_anything(t_outlet *x,
+                     t_symbol *s, int argc, t_atom *argv);
+\end{verbatim}
+Outputs a message at the outlet specified by \verb+x+.
+
+The message-selector is specified with \verb+s+.
+It is followed by \verb+argc+ atoms.
+\verb+argv+ points to the first element of the atom-list.
+
+\subsection{functions: DSP}
+If a class should provide methods for digital signal-processing,
+a method for the selector ``dsp'' (followed by no atoms)
+has to be added to this class
+
+Whenever Pd's audio engine is started,
+all objects that provide a ``dsp''-method are identified as instances of signal classes.
+
+\paragraph{DSP-method}
+
+\begin{verbatim}
+void my_dsp_method(t_mydata *x, t_signal **sp)
+\end{verbatim}
+
+In the ``dsp''-method a class method for signal-processing
+is added to the DSP-tree by the function \verb+dsp_add+.
+
+Apart from the data space \verb+x+ of the object,
+an array of signals is passed.
+The signals in the array are arranged in such a way,
+that they can be read in the graphical representation of the object
+clockwisely.
+
+In case there are both two in- and out-signals, this means:
+
+\begin{tabular}{c|r}
+pointer & to signal \\
+\hline\hline
+sp[0] & left in-signal \\
+sp[1] & right in-signal \\
+sp[2] & right out-signal \\
+sp[3] & left out-signal \\
+\end{tabular}
+
+The signal structure contains apart from other things:
+
+\begin{tabular}{c|l}
+structure-element & description \\
+\hline
+\verb+s_n+ & length of the signal vector \\
+\verb+s_vec+ & pointer to the signal vector \\
+\end{tabular}
+
+The signal vector is an array of samples of type  \verb+t_sample+.
+
+\paragraph{perform-routine}
+\begin{verbatim}
+t_int *my_perform_routine(t_int *w)
+\end{verbatim}
+
+
+A pointer \verb+w+ to an array (of integer) is passed to
+the perform-routine that is inserted into the DSP-tree by \verb+class_add+.
+
+In this array the pointers that are passed via \verb+dsp_add+ are stored.
+These pointers have to be casted back to their original type.
+
+The first pointer is stored at \verb+w[1]+ !!!
+
+The perform-routine has to return a pointer to integer,
+that points directly behind the memory, where the object's pointers are stored.
+This means, that the return-argument equals the routine's argument \verb+w+
+plus the number of used pointers
+(as defined in the second argument of \verb+dsp_add+) plus one.
+
+\subsubsection{CLASS\_MAINSIGNALIN}
+\begin{verbatim}
+CLASS_MAINSIGNALIN(<class_name>, <class_data>, <f>);
+\end{verbatim}
+The macro \verb+CLASS_MAINSIGNALIN+ declares,
+that the class will use signal-inlets.
+
+The first macro-argument is a pointer to the signal-class.
+The second argument is the type of the class-data space.
+The third argument is a (dummy-)floating point-variable of the data space,
+that is needed to automatically convert ``float''-messages into signals
+if no signal is present at the signal-inlet.
+
+No ``float''-methods can be used for signal-inlets, that are created this way.
+
+\subsubsection{dsp\_add}
+\begin{verbatim}
+void dsp_add(t_perfroutine f, int n, ...);
+\end{verbatim}
+Adds the perform-routine \verb+f+ to the DSP-tree.
+The perform-routine is called at each DSP-cycle.
+
+The second argument\verb+n+ defines the number of following pointer-arguments 
+
+Which pointers to which data are passes is not limited.
+Generally, pointers to the data space of the object and to the
+signal-vectors are reasonable.
+The length of the signal-vectors should also be passed to manipulate signals effectively.
+
+\subsubsection{sys\_getsr}
+\begin{verbatim}
+float sys_getsr(void);
+\end{verbatim}
+Returns the sampler ate of the system.
+
+\subsection{functions: memory}
+\subsubsection{getbytes}
+\begin{verbatim}
+void *getbytes(size_t nbytes);
+\end{verbatim}
+Reserves \verb+nbytes+ bytes and returns a pointer to the allocated memory.
+
+\subsubsection{copybytes}
+\begin{verbatim}
+void *copybytes(void *src, size_t nbytes);
+\end{verbatim}
+Copies \verb+nbytes+ bytes from \verb+*src+ into a newly allocated memory.
+The address of this memory is returned.
+
+\subsubsection{freebytes}
+\begin{verbatim}
+void freebytes(void *x, size_t nbytes);
+\end{verbatim}
+Frees \verb+nbytes+ bytes at address \verb+*x+.
+
+\subsection{functions: output}
+\subsubsection{post}
+\begin{verbatim}
+void post(char *fmt, ...);
+\end{verbatim}
+
+Writes a {\tt C}-string to the standard error (shell).
+
+\subsubsection{error}
+\begin{verbatim}
+void error(char *fmt, ...);
+\end{verbatim}
+
+Writes a {\tt C}-string as an error-message to the standard error (shell).
+
+The object that has output the error-message is marked and
+can be identified via the Pd-menu {\em Find->Find last error}.
+
+\end{appendix}
+
+\end{document} 
+
diff --git a/doc/tutorials/externals-howto/LICENSE.txt b/doc/tutorials/externals-howto/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..aa5c03cca299a105865359c3be30c3052323bbc7
--- /dev/null
+++ b/doc/tutorials/externals-howto/LICENSE.txt
@@ -0,0 +1,179 @@
+"HOWTO write Externals for Pure data" by IOhannes m zmölnig
+
+This work consists of a HOWTO-text (possibly in various translations) and 
+accompanying material (example source code files, Makefiles,...)
+Any source-code examples within the HOWTO-text are regarded as accompanying material.
+
+
+1. License for the HOWTO-text:
+==============================
+
+Copyright (c)  2001-2006  IOhannes m zmölnig.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled "GNU
+      Free Documentation License" of this document.
+
+
+
+2. License for the accompanying material (examples,...)
+=======================================================
+
+This software is copyrighted by IOhannes m zmölnig.  The following
+terms (the "Standard Improved BSD License") apply to all files associated with
+the software unless explicitly disclaimed in individual files:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above  
+   copyright notice, this list of conditions and the following 
+   disclaimer in the documentation and/or other materials provided
+   with the distribution.
+3. The name of the author may not be used to endorse or promote
+   products derived from this software without specific prior 
+   written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,   
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+
+
+=======================================================
+=======================================================
+=======================================================
+
+
+GNU Free Documentation License
+
+Version 1.2, November 2002
+
+Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.
+
+We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.
+
+A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and you may publicly display copies.
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
+
+If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
+
+It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
+
+    * A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
+    * B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
+    * C. State on the Title page the name of the publisher of the Modified Version, as the publisher.
+    * D. Preserve all the copyright notices of the Document.
+    * E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
+    * F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
+    * G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
+    * H. Include an unaltered copy of this License.
+    * I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
+    * J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
+    * K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
+    * L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
+    * M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version.
+    * N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section.
+    * O. Preserve any Warranty Disclaimers. 
+
+If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements."
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. 
diff --git a/doc/tutorials/externals-howto/Makefile b/doc/tutorials/externals-howto/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..f9840099455186ae3e8fffda7a40a7be884c6d97
--- /dev/null
+++ b/doc/tutorials/externals-howto/Makefile
@@ -0,0 +1,71 @@
+HOWTO_EN=HOWTO-externals-en
+HOWTO_DE=HOWTO-externals-de
+
+HOWTO_EXAMPLES=example1  example2  example3  example4
+
+HTMLDIR_EN=HOWTO
+HTMLDIR_DE=HOWTO-de
+
+LATEX=latex
+DVIPS=dvips
+DVIPDF=dvipdf
+LATEX2HTML=latex2html
+
+default: en_pdf
+
+TARGETS: default \
+	en_ps en_pdf en_html de_ps de_pdf de_html ps pdf html \
+	clean cleaner distclean \
+	examples $(HOWTO_EXAMPLES)
+
+.PHONY: $(TARGETS)
+
+en_ps: $(HOWTO_EN).ps
+
+en_pdf: $(HOWTO_EN).pdf
+
+en_html: 
+	mkdir -p ${HTMLDIR_EN}
+	$(LATEX2HTML) -dir $(HTMLDIR_EN) -split 4 $(HOWTO_EN).tex
+
+de_ps: $(HOWTO_DE).ps
+
+de_pdf: $(HOWTO_DE).pdf
+
+de_html: 
+	mkdir -p ${HTMLDIR_DE}
+	$(LATEX2HTML) -dir $(HTMLDIR_DE) -split 4 $(HOWTO_DE).tex
+
+ps: en_ps de_ps
+
+pdf: en_pdf de_pdf
+
+html: en_html de_html
+
+clean:
+	-rm -f *.aux *.log *.toc *.dvi *~
+
+cleaner: clean
+	-rm -f *.ps *.pdf
+	-rm -rf $(HTMLDIR_EN) $(HTMLDIR_DE)
+
+distclean: cleaner
+	@for d in ${HOWTO_EXAMPLES}; do ${MAKE} -C $$d clean; done
+
+%.dvi:
+	$(LATEX) $*.tex
+	$(LATEX) $*.tex
+
+
+%.ps: %.dvi
+	$(DVIPS) $*.dvi
+
+
+%.pdf: %.dvi
+	$(DVIPDF) $*.dvi
+
+examples: $(HOWTO_EXAMPLES)
+	echo made examples
+
+$(HOWTO_EXAMPLES):
+	$(MAKE) -C $@
diff --git a/doc/tutorials/externals-howto/example1/Makefile b/doc/tutorials/externals-howto/example1/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..50e00ac2ad0ed037de9301ab13b7872e7f62b6dd
--- /dev/null
+++ b/doc/tutorials/externals-howto/example1/Makefile
@@ -0,0 +1,154 @@
+# Makefile
+# (c) 2006 IOhannes m zmölnig
+
+# path to pd
+## change this according to your setup!
+PDROOT=../../../../pd
+#PDROOT=/home/zmoelnig/src/pd/
+
+# here we find the sources of pd (and evtl. the pd.lib)
+PDSRCDIR=$(PDROOT)/src
+PDLIBDIR=$(PDROOT)/bin
+
+# this is the filename-extension
+# people have to specify it at the cmdline: eg "make pd_linux"
+EXTENSION=$(MAKECMDGOALS)
+
+# if no filename-extension is supplied by the user
+# try to guess one, based on what "uname" tells us
+UNAME := $(shell uname -s)
+ifeq ($(UNAME),Linux)
+  DEFAULTEXTENSION= pd_linux
+else
+  ifeq ($(UNAME),Darwin)
+    DEFAULTEXTENSION= pd_darwin
+  else
+    ifeq (MINGW,$(findstring MINGW,$(UNAME)))
+      DEFAULTEXTENSION= pd_nt
+    else
+      ifeq ($(UNAME),IRIX)
+	UNAMEV := $(shell uname -R)
+	ifeq (6.,$(findstring 6.,$(UNAMEV)))
+	  DEFAULTEXTENSION= pd_irix6
+	else
+	  DEFAULTEXTENSION= pd_irix5
+	endif
+      else
+	DEFAULTEXTENSION=help
+      endif
+    endif
+  endif
+endif
+
+# if no extension is given, call "make" again with a guessed extension
+auto:
+	make $(DEFAULTEXTENSION)
+
+# just a stupid fallback
+help: 
+	@echo "choose one command:  make pd_linux (linux), make pd_darwin (osX), make pd_irix5 (IRIX5), make pd_irix6 (IRIX6), make dll (MSVC), make pd_nt (MinWG)"
+
+# delete old build files
+clean:
+	-rm -f *.dll *.pd_* *.o *.obj *~
+
+# we want to compile all C-files we find in the current directory
+SOURCES=$(sort $(filter %.c, $(wildcard *.c)))
+# each C-files maps will become an external with the given filename-extension
+TARGETS=$(SOURCES:.c=.$(EXTENSION))
+
+
+# ----------------------- Linux -----------------------
+
+pd_linux: $(TARGETS)
+
+LINUXCFLAGS = -DPD -O2 -funroll-loops -fomit-frame-pointer -fPIC \
+    -Wall -W -Wshadow -Wstrict-prototypes -Werror \
+    -Wno-unused -Wno-parentheses -Wno-switch
+
+LINUXLDFLAGS =  -export_dynamic -shared  -lc -lm
+
+LINUXINCLUDE =  -I$(PDSRCDIR)
+
+%.pd_linux: %.c
+	$(CC) $(LINUXLDFLAGS) $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.pd_linux $*.c
+	strip --strip-unneeded $*.pd_linux
+
+
+
+# ----------------------- Mac OSX -----------------------
+
+pd_darwin: $(TARGETS)
+
+DARWINCFLAGS = -DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \
+    -Wno-unused -Wno-parentheses -Wno-switch
+
+DARWININCLUDE = -I$(PDSRCDIR)
+
+DARWINLDFLAGS = -bundle -undefined suppress -flat_namespace
+
+%.pd_darwin: %.c
+	$(CC) $(DARWINCFLAGS) $(DARWININCLUDE) $(DARWINLDFLAGS) -o $*.pd_darwin $*.c
+
+
+# ----------------------- IRIX 5.x -----------------------
+pd_irix5: $(TARGETS)
+
+SGICFLAGS5 = -o32 -DPD -DSGI -O2
+
+SGIINCLUDE =  -I$(PDSRCDIR)
+
+SGILDFLAGS =  -elf -shared -rdata_shared
+
+%.pd_irix5: %.c
+	$(CC) $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c
+	$(LD) $(SGILDFLAGS) -o $*.pd_irix5 $*.o
+	rm $*.o
+
+
+# ----------------------- IRIX 6.x -----------------------
+pd_irix6: $(TARGETS)
+
+SGICFLAGS6 = -DPD -DSGI -n32 \
+	-OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \
+	-Ofast=ip32
+
+%.pd_irix6: %.c
+	$(CC) $(SGICFLAGS6) $(SGIINCLUDE) -o $*.o -c $*.c
+	$(LD) $(SGILDFLAGS) -o $*.pd_irix6 $*.o
+	rm $*.o
+
+
+# ----------------------- NT -----------------------
+dll: $(TARGETS)
+
+PDNTCFLAGS = /W3 /WX /DPD /DNT /D__WIN32__ /DMSW /nologo
+
+VC="C:\Programme\Microsoft Visual Studio\Vc98"
+
+PDNTINCLUDE = /I. /I$(PDROOT)\tcl\include /I$(PDSRCDIR)\src /I$(VC)\include
+
+PDNTLDIR = $(VC)\lib
+
+PDNTLIB = $(PDNTLDIR)\libc.lib \
+	$(PDNTLDIR)\oldnames.lib \
+	$(PDNTLDIR)\kernel32.lib \
+	$(PDLIBDIR)\pd.lib 
+
+%.dll: %.c
+	cl $(PDNTCFLAGS) $(PDNTINCLUDE) /c $*.c
+	link /dll /export:$*_setup $*.obj $(PDNTLIB)
+
+
+pd_nt: $(TARGETS)
+
+MINGWCFLAGS = -DPD -O2 -funroll-loops -fomit-frame-pointer \
+    -Wall -W -Wshadow -Wstrict-prototypes -Werror \
+    -Wno-unused -Wno-parentheses -Wno-switch -mms-bitfields
+
+MINGWLDFLAGS =  -export_dynamic -shared -lm -lkernel32 -lcoldname -lcrtdll -lpd -L$(PDLIBDIR)
+
+MINGWINCLUDE =  -I$(PDSRCDIR)
+
+%.pd_nt: %.c
+	$(CC) $(MINGWLDFLAGS) $(MINGWCFLAGS) $(MINGWINCLUDE) -o $*.dll $*.c
diff --git a/doc/tutorials/externals-howto/example1/helloworld.c b/doc/tutorials/externals-howto/example1/helloworld.c
new file mode 100644
index 0000000000000000000000000000000000000000..f3660f45ea9f735752fe467bad6c19e68cf77dd6
--- /dev/null
+++ b/doc/tutorials/externals-howto/example1/helloworld.c
@@ -0,0 +1,93 @@
+/*
+ * HOWTO write an External for Pure data
+ * (c) 2001-2006 IOhannes m zmölnig zmoelnig[AT]iem.at
+ *
+ * this is the source-code for the first example in the HOWTO
+ * it creates an object that prints "Hello world!" whenever it 
+ * gets banged.
+ *
+ * for legal issues please see the file LICENSE.txt
+ */
+
+
+
+/**
+ * include the interface to Pd 
+ */
+#include "m_pd.h"
+
+/**
+ * define a new "class" 
+ */
+static t_class *helloworld_class;
+
+
+/**
+ * this is the dataspace of our new object
+ * we don't need to store anything,
+ * however the first (and only) entry in this struct
+ * is mandatory and of type "t_object"
+ */
+typedef struct _helloworld {
+  t_object  x_obj;
+} t_helloworld;
+
+
+/**
+ * this method is called whenever a "bang" is sent to the object
+ * the name of this function is arbitrary and is registered to Pd in the 
+ * helloworld_setup() routine
+ */
+void helloworld_bang(t_helloworld *x)
+{
+  /*
+   * post() is Pd's version of printf()
+   * the string (which can be formatted like with printf()) will be
+   * output to wherever Pd thinks it has too (pd's console, the stderr...)
+   * it automatically adds a newline at the end of the string
+   */
+  post("Hello world !!");
+}
+
+
+/**
+ * this is the "constructor" of the class
+ * this method is called whenever a new object of this class is created
+ * the name of this function is arbitrary and is registered to Pd in the 
+ * helloworld_setup() routine
+ */
+void *helloworld_new(void)
+{
+  /*
+   * call the "constructor" of the parent-class
+   * this will reserve enough memory to hold "t_helloworld"
+   */
+  t_helloworld *x = (t_helloworld *)pd_new(helloworld_class);
+
+  /*
+   * return the pointer to the class - this is mandatory
+   * if you return "0", then the object-creation will fail
+   */
+  return (void *)x;
+}
+
+
+/**
+ * define the function-space of the class
+ * within a single-object external the name of this function is special
+ */
+void helloworld_setup(void) {
+  /* create a new class */
+  helloworld_class = class_new(gensym("helloworld"),        /* the object's name is "helloworld" */
+			       (t_newmethod)helloworld_new, /* the object's constructor is "helloworld_new()" */
+			       0,                           /* no special destructor */
+			       sizeof(t_helloworld),        /* the size of the data-space */
+			       CLASS_DEFAULT,               /* a normal pd object */
+			       0);                          /* no creation arguments */
+
+  /* attach functions to messages */
+  /* here we bind the "helloworld_bang()" function to the class "helloworld_class()" -
+   * it will be called whenever a bang is received
+   */
+  class_addbang(helloworld_class, helloworld_bang); 
+}
diff --git a/doc/tutorials/externals-howto/example2/Makefile b/doc/tutorials/externals-howto/example2/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ec17746ec92025866b63fe88e7603eb1b6221a58
--- /dev/null
+++ b/doc/tutorials/externals-howto/example2/Makefile
@@ -0,0 +1,6 @@
+# Makefile
+# (c) 2006 IOhannes m zmölnig
+
+# just use the Makefile in ../example1/
+# (so i only have to maintain one Makefile)
+include ../example1/Makefile
diff --git a/doc/tutorials/externals-howto/example2/counter.c b/doc/tutorials/externals-howto/example2/counter.c
new file mode 100644
index 0000000000000000000000000000000000000000..6c4787c2fb83c462e73681437ed3baa2daceed20
--- /dev/null
+++ b/doc/tutorials/externals-howto/example2/counter.c
@@ -0,0 +1,86 @@
+/*
+ * HOWTO write an External for Pure data
+ * (c) 2001-2006 IOhannes m zmölnig zmoelnig[AT]iem.at
+ *
+ * this is the source-code for the second example in the HOWTO
+ * it creates an object that increments and outputs a counter
+ * whenever it gets banged.
+ *
+ * for legal issues please see the file LICENSE.txt
+ */
+
+
+
+/**
+ * include the interface to Pd 
+ */
+#include "m_pd.h"
+
+/**
+ * define a new "class" 
+ */
+static t_class *counter_class;
+
+
+
+/**
+ * this is the dataspace of our new object
+ * the first (mandatory) "t_object"
+ * and a variable that holds the current counter value
+ */
+typedef struct _counter {
+  t_object  x_obj;
+  t_int i_count;
+} t_counter;
+
+
+/**
+ * this method is called whenever a "bang" is sent to the object
+ * a reference to the class-dataspace is given as argument
+ * this enables us to do something with the data (e.g. increment the counter)
+ */
+void counter_bang(t_counter *x)
+{
+  /*
+   * convert the current counter value to floating-point to output it later
+   */
+  t_float f=x->i_count;
+  /* increment the counter */
+  x->i_count++;
+  /* send the old counter-value to the 1st outlet of the object */
+  outlet_float(x->x_obj.ob_outlet, f);
+}
+
+
+/**
+ * this is the "constructor" of the class
+ * we have one argument of type floating-point (as specified below in the counter_setup() routine)
+ */
+void *counter_new(t_floatarg f)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+
+  /* set the counter value to the given argument */
+  x->i_count=f;
+
+  /* create a new outlet for floating-point values */
+  outlet_new(&x->x_obj, &s_float);
+
+  return (void *)x;
+}
+
+
+/**
+ * define the function-space of the class
+ */
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+			    (t_newmethod)counter_new,
+			    0, 
+			    sizeof(t_counter),
+			    CLASS_DEFAULT,
+			    A_DEFFLOAT, 0); /* the object takes one argument which is a floating-point and defaults to 0 */
+
+  /* call a function when object gets banged */
+  class_addbang(counter_class, counter_bang);
+}
diff --git a/doc/tutorials/externals-howto/example3/Makefile b/doc/tutorials/externals-howto/example3/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ec17746ec92025866b63fe88e7603eb1b6221a58
--- /dev/null
+++ b/doc/tutorials/externals-howto/example3/Makefile
@@ -0,0 +1,6 @@
+# Makefile
+# (c) 2006 IOhannes m zmölnig
+
+# just use the Makefile in ../example1/
+# (so i only have to maintain one Makefile)
+include ../example1/Makefile
diff --git a/doc/tutorials/externals-howto/example3/counter.c b/doc/tutorials/externals-howto/example3/counter.c
new file mode 100644
index 0000000000000000000000000000000000000000..5fa8caef98e31dd01c7b17e19fbd8f2528ea2b17
--- /dev/null
+++ b/doc/tutorials/externals-howto/example3/counter.c
@@ -0,0 +1,203 @@
+/*
+ * HOWTO write an External for Pure data
+ * (c) 2001-2006 IOhannes m zmölnig zmoelnig[AT]iem.at
+ *
+ * this is the source-code for the third example in the HOWTO
+ * it creates an object that increments and outputs a counter
+ * whenever it gets banged.
+ * the counter value can be "set" to a special value, or "reset" to a default
+ * an upper and lower boundary can be specified: whenever the counter crosses
+ * such boundary a "bang" is emitted at the 2nd outlet and the counter value wraps
+ *
+ * for legal issues please see the file LICENSE.txt
+ */
+
+
+/**
+ * include the interface to Pd 
+ */
+#include "m_pd.h"
+
+
+/**
+ * define a new "class" 
+ */
+static t_class *counter_class;
+
+
+/**
+ * this is the dataspace of our new object
+ * the first element is the mandatory "t_object"
+ * then we have all sort of variables for the
+ * actual counter value, the step-size and the counting boundaries
+ * finally we have 2 "t_outlet" elements so we can send data
+ * to a "named" outlet.
+ */
+typedef struct _counter {
+  t_object  x_obj;         /* mandatory t_object */
+  t_int i_count;           /* the current counter value */
+  t_float step;            /* step size; 
+                            * this is "float" because of the passive inlet we are using */
+  t_int i_down, i_up;      /* lower and upper boundary */
+  t_outlet *f_out, *b_out; /* outlets */
+} t_counter;
+
+
+/**
+ * this method is called whenever a "bang" is sent to the object
+ */
+void counter_bang(t_counter *x)
+{
+  t_float f=x->i_count;
+  t_int step = x->step;
+  x->i_count+=step;
+
+  if (x->i_down-x->i_up) {
+    if ((step>0) && (x->i_count > x->i_up)) {
+      x->i_count = x->i_down;
+      /* we crossed the upper boundary, so we send a bang out of 
+       * the 2nd outlet (which is x->b_out)
+       */
+      outlet_bang(x->b_out);
+    } else if (x->i_count < x->i_down) {
+      x->i_count = x->i_up;
+      outlet_bang(x->b_out);
+    }
+  }
+  /* output the current counter value at the 1st outlet (which is x->f_out) */
+  outlet_float(x->f_out, f);
+}
+
+
+/**
+ * this is called whenever a "reset" message is sent to the inlet of the object
+ * since the "reset" message has no arguments (as declared in counter_setup())
+ * we only get a reference to the class-dataspace
+ */
+void counter_reset(t_counter *x)
+{
+  x->i_count = x->i_down;
+}
+
+
+/**
+ * this is called whenever a "set" message is sent to the inlet of the object
+ * since the "set" message has one floating-point argument (as declared in counter_setup())
+ * we get a reference to the class-dataspace and the value 
+ */
+void counter_set(t_counter *x, t_floatarg f)
+{
+  x->i_count = f;
+}
+
+
+/**
+ * this is called whenever a "bound" message is sent to the inlet of the object
+ * note that in counter_new(), we rewrite a list to the 2nd inlet 
+ * to a "bound" message to the 1st inlet
+ */
+void counter_bound(t_counter *x, t_floatarg f1, t_floatarg f2)
+{
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+}
+
+
+/**
+ * this is the "constructor" of the class
+ * we expect a variable number of arguments to this object
+ * symbol "s" is the name of the object itself
+ * the arguments are given as a t_atom array of argc elements.
+ */
+void *counter_new(t_symbol *s, int argc, t_atom *argv)
+{
+  t_counter *x = (t_counter *)pd_new(counter_class);
+  t_float f1=0, f2=0;
+
+  /* depending on the number of arguments we interprete them differently */
+  x->step=1;
+  switch(argc){
+  default:
+  case 3:
+    x->step=atom_getfloat(argv+2);
+  case 2:
+    f2=atom_getfloat(argv+1);
+  case 1:
+    f1=atom_getfloat(argv);
+    break;
+  case 0:
+    break;
+  }
+  if (argc<2)f2=f1;
+
+  x->i_down = (f1<f2)?f1:f2;
+  x->i_up   = (f1>f2)?f1:f2;
+
+  x->i_count=x->i_down;
+
+  /* create a new active inlet for this object
+   * a message with the selector "list" that is sent
+   * to this inlet (it is the 2nd inlet from left),
+   * will be appear to be the same message but with the selector "bound"
+   * at the 1st inlet.
+   * the method for "bound" messages is given in counter_setup()
+   */
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd,
+        gensym("list"), gensym("bound"));
+
+  /* create a passive inlet inlet (it will be the 2rd inlet from left)
+   * whenever a floating point number is sent to this inlet,
+   * its value will be immediately stored in "x->step"
+   * no function will be called
+   */
+  floatinlet_new(&x->x_obj, &x->step);
+
+  /* create a new outlet which will output floats
+   * we store a reference to this outlet in x->f_out
+   * so we are able to send data to this very outlet
+   */
+  x->f_out = outlet_new(&x->x_obj, &s_float);
+  /* create a new outlet which will output bangs */
+  x->b_out = outlet_new(&x->x_obj, &s_bang);
+
+  return (void *)x;
+}
+
+
+/**
+ * define the function-space of the class
+ */
+void counter_setup(void) {
+  counter_class = class_new(gensym("counter"),
+                            (t_newmethod)counter_new,
+                            0, sizeof(t_counter),
+                            CLASS_DEFAULT, 
+                            A_GIMME, /* an arbitrary number of arguments 
+                                      * which are of arbitrary type */
+                            0);
+
+  /* call a function when a "bang" message appears on the first inlet */
+  class_addbang  (counter_class, counter_bang);
+
+  /* call a function when a "reset" message (without arguments) appears on the first inlet */
+  class_addmethod(counter_class,
+        (t_method)counter_reset, gensym("reset"), 0);
+
+  /* call a function when a "set" message with one float-argument (defaults to 0)
+   * appears on the first inlet */
+  class_addmethod(counter_class, 
+        (t_method)counter_set, gensym("set"),
+        A_DEFFLOAT, 0);
+
+  /* call a function when a "bound" message with 2 float-argument (both default to 0)
+   * appears on the first inlet
+   * this is used for "list" messages which appear on the 2nd inlet
+   * the magic is done in counter_new()
+   */
+  class_addmethod(counter_class,
+        (t_method)counter_bound, gensym("bound"),
+        A_DEFFLOAT, A_DEFFLOAT, 0);
+
+  /* set the name of the help-patch to "help-counter"(.pd) */
+  class_sethelpsymbol(counter_class, gensym("help-counter"));
+}
diff --git a/doc/tutorials/externals-howto/example4/Makefile b/doc/tutorials/externals-howto/example4/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ec17746ec92025866b63fe88e7603eb1b6221a58
--- /dev/null
+++ b/doc/tutorials/externals-howto/example4/Makefile
@@ -0,0 +1,6 @@
+# Makefile
+# (c) 2006 IOhannes m zmölnig
+
+# just use the Makefile in ../example1/
+# (so i only have to maintain one Makefile)
+include ../example1/Makefile
diff --git a/doc/tutorials/externals-howto/example4/pan~.c b/doc/tutorials/externals-howto/example4/pan~.c
new file mode 100644
index 0000000000000000000000000000000000000000..06dccd69533e32f2afb43852da333f70a7f94908
--- /dev/null
+++ b/doc/tutorials/externals-howto/example4/pan~.c
@@ -0,0 +1,146 @@
+/*
+ * HOWTO write an External for Pure data
+ * (c) 2001-2006 IOhannes m zmölnig zmoelnig[AT]iem.at
+ *
+ * this is the source-code for the fourth example in the HOWTO
+ * it creates a simple dsp-object:
+ * 2 input signals are mixed into 1 output signal
+ * the mixing-factor can be set via the 3rd inlet
+ *
+ * for legal issues please see the file LICENSE.txt
+ */
+
+
+/**
+ * include the interface to Pd 
+ */
+#include "m_pd.h"
+
+
+/**
+ * define a new "class" 
+ */
+static t_class *pan_tilde_class;
+
+
+/**
+ * this is the dataspace of our new object
+ * the first element is the mandatory "t_object"
+ * f_pan denotes the mixing-factor
+ * "f" is a dummy and is used to be able to send floats AS signals.
+ */
+typedef struct _pan_tilde {
+  t_object  x_obj;
+  t_sample f_pan;
+  t_sample f;
+} t_pan_tilde;
+
+
+/**
+ * this is the core of the object
+ * this perform-routine is called for each signal block
+ * the name of this function is arbitrary and is registered to Pd in the 
+ * pan_tilde_dsp() function, each time the DSP is turned on
+ *
+ * the argument to this function is just a pointer within an array
+ * we have to know for ourselves how many elements inthis array are
+ * reserved for us (hint: we declare the number of used elements in the
+ * pan_tilde_dsp() at registration
+ *
+ * since all elements are of type "t_int" we have to cast them to whatever
+ * we think is apropriate; "apropriate" is how we registered this function
+ * in pan_tilde_dsp()
+ */
+t_int *pan_tilde_perform(t_int *w)
+{
+  /* the first element is a pointer to the dataspace of this object */
+  t_pan_tilde *x = (t_pan_tilde *)(w[1]);
+  /* here is a pointer to the t_sample arrays that hold the 2 input signals */
+  t_sample  *in1 =    (t_sample *)(w[2]);
+  t_sample  *in2 =    (t_sample *)(w[3]);
+  /* here comes the signalblock that will hold the output signal */
+  t_sample  *out =    (t_sample *)(w[4]);
+  /* all signalblocks are of the same length */
+  int          n =           (int)(w[5]);
+  /* get (and clip) the mixing-factor */
+  t_sample f_pan = (x->f_pan<0)?0.0:(x->f_pan>1)?1.0:x->f_pan;
+  /* just a counter */
+  int i;
+
+  /* this is the main routine: 
+   * mix the 2 input signals into the output signal
+   */
+  for(i=0; i<n; i++)
+    {
+      out[i]=in1[i]*(1-f_pan)+in2[i]*f_pan;
+    }
+
+  /* return a pointer to the dataspace for the next dsp-object */
+  return (w+6);
+}
+
+
+/**
+ * register a special perform-routine at the dsp-engine
+ * this function gets called whenever the DSP is turned ON
+ * the name of this function is registered in pan_tilde_setup()
+ */
+void pan_tilde_dsp(t_pan_tilde *x, t_signal **sp)
+{
+  /* add pan_tilde_perform() to the DSP-tree;
+   * the pan_tilde_perform() will expect "5" arguments (packed into an
+   * t_int-array), which are:
+   * the objects data-space, 3 signal vectors (which happen to be
+   * 2 input signals and 1 output signal) and the length of the
+   * signal vectors (all vectors are of the same length)
+   */
+  dsp_add(pan_tilde_perform, 5, x,
+          sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
+}
+
+
+/**
+ * this is the "constructor" of the class
+ * the argument is the initial mixing-factir
+ */
+void *pan_tilde_new(t_floatarg f)
+{
+  t_pan_tilde *x = (t_pan_tilde *)pd_new(pan_tilde_class);
+
+  /* save the mixing factor in our dataspace */
+  x->f_pan = f;
+  
+  /* create a new signal-inlet */
+  inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+
+  /* create a new passive inlet for the mixing-factor */
+  floatinlet_new (&x->x_obj, &x->f_pan);
+
+  /* create a new signal-outlet */
+  outlet_new(&x->x_obj, &s_signal);
+
+  return (void *)x;
+}
+
+
+/**
+ * define the function-space of the class
+ * within a single-object external the name of this function is very special
+ */
+void pan_tilde_setup(void) {
+  pan_tilde_class = class_new(gensym("pan~"),
+        (t_newmethod)pan_tilde_new,
+        0, sizeof(t_pan_tilde),
+        CLASS_DEFAULT, 
+        A_DEFFLOAT, 0);
+
+  /* whenever the audio-engine is turned on, the "pan_tilde_dsp()" 
+   * function will get called
+   */
+  class_addmethod(pan_tilde_class,
+        (t_method)pan_tilde_dsp, gensym("dsp"), 0);
+  /* if no signal is connected to the first inlet, we can as well 
+   * connect a number box to it and use it as "signal"
+   */
+  CLASS_MAINSIGNALIN(pan_tilde_class, t_pan_tilde, f);
+}
diff --git a/doc/tutorials/footils/pddrums/2lineseg~-1.pd b/doc/tutorials/footils/pddrums/2lineseg~-1.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1b34bfa2c77e7b519ba88a0d7842cbcf12bdc615
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/2lineseg~-1.pd
@@ -0,0 +1,49 @@
+#N canvas 179 206 819 529 10;
+#X obj 191 291 t3_bpe;
+#X obj 191 192 t b b;
+#X obj 191 348 t3_line~ 0;
+#X obj 191 252 f 0;
+#X obj 244 128 t b f;
+#X floatatom 244 87 5 0 0;
+#X obj 107 417 tabwrite~ line;
+#N canvas 0 0 450 300 graph1 0;
+#X array line 441 float 0;
+#X coords 0 1 440 -1 200 140 1;
+#X restore 457 270 graph;
+#X msg 472 79 \; line resize 441 \; line xticks 0 64 8 \; line xlabel
+1.1 0 64 128 192 256 320 384 \; pd dsp 1;
+#X obj 244 176 pack 1 0.5 0 1.5;
+#X obj 244 105 / 44.1;
+#X msg 191 149 bang;
+#X obj 472 49 loadbang;
+#X floatatom 112 189 5 0 0;
+#X obj 112 207 / 44.1;
+#X text 104 165 pre-delay;
+#X text 90 24 T3-envelopes;
+#X text 290 85 samples;
+#X floatatom 274 152 5 0 0;
+#X text 324 151 msec;
+#X text 63 47 With Time-Tagged Triggers exact positioning is possible
+even between block boundaries.;
+#X msg 244 204 set \$1 \$2 \$3 \$4;
+#X msg 244 246 1 2.26757 0 1.5;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 1 0 3 0;
+#X connect 1 0 6 0;
+#X connect 1 1 22 0;
+#X connect 2 0 6 0;
+#X connect 3 0 0 0;
+#X connect 4 0 9 0;
+#X connect 4 0 11 0;
+#X connect 4 1 18 0;
+#X connect 5 0 10 0;
+#X connect 9 0 21 0;
+#X connect 10 0 4 0;
+#X connect 11 0 1 0;
+#X connect 12 0 8 0;
+#X connect 13 0 14 0;
+#X connect 14 0 3 1;
+#X connect 18 0 9 1;
+#X connect 21 0 22 0;
+#X connect 22 0 0 0;
diff --git a/doc/tutorials/footils/pddrums/2lineseg~.pd b/doc/tutorials/footils/pddrums/2lineseg~.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5dbc2b5454cc928cfda9e0497b833dd7bea117cc
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/2lineseg~.pd
@@ -0,0 +1,72 @@
+#N canvas 52 135 633 538 10;
+#X obj 191 425 outlet~;
+#X obj 191 237 t3_bpe;
+#X obj 191 138 t b b;
+#X obj 191 294 t3_line~ 0;
+#X obj 191 375 fade~ lin;
+#X msg 342 344 set _lin;
+#X msg 342 365 set _linsqrt;
+#X msg 342 386 set _sqrt;
+#X msg 342 407 set _sin;
+#X msg 342 428 set _sinhann;
+#X msg 342 449 set _hann;
+#X obj 476 48 inlet;
+#X obj 140 40 inlet;
+#X msg 342 323 set \$1;
+#X obj 476 132 symbol;
+#X obj 522 190 symbol stop;
+#X obj 140 138 t b b;
+#X obj 140 105 select 0;
+#X obj 191 198 f 0;
+#X obj 476 69 route set stop;
+#X obj 289 36 inlet;
+#X obj 289 61 t b f;
+#X obj 244 35 inlet;
+#X obj 332 36 inlet;
+#X obj 332 61 t b f;
+#X obj 377 37 inlet;
+#X obj 377 62 t b f;
+#X obj 244 105 pack 0 0 0 0;
+#X msg 244 133 set \$1 \$2 \$3 \$4;
+#X msg 244 192 1 71 0 132;
+#X msg 140 198 0 10;
+#X text 18 225 go very quick to zero;
+#X text 17 238 if inlet receives a 0;
+#X connect 1 0 3 0;
+#X connect 1 1 3 1;
+#X connect 2 0 18 0;
+#X connect 2 1 29 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 4 0;
+#X connect 7 0 4 0;
+#X connect 8 0 4 0;
+#X connect 9 0 4 0;
+#X connect 10 0 4 0;
+#X connect 11 0 19 0;
+#X connect 12 0 17 0;
+#X connect 13 0 4 0;
+#X connect 14 0 13 0;
+#X connect 15 0 1 0;
+#X connect 16 0 30 0;
+#X connect 16 1 18 0;
+#X connect 17 0 16 0;
+#X connect 17 1 2 0;
+#X connect 18 0 1 0;
+#X connect 19 0 14 0;
+#X connect 19 1 15 0;
+#X connect 20 0 21 0;
+#X connect 21 0 27 0;
+#X connect 21 1 27 1;
+#X connect 22 0 27 0;
+#X connect 23 0 24 0;
+#X connect 24 0 27 0;
+#X connect 24 1 27 2;
+#X connect 25 0 26 0;
+#X connect 26 0 27 0;
+#X connect 26 1 27 3;
+#X connect 27 0 28 0;
+#X connect 28 0 29 0;
+#X connect 29 0 1 0;
+#X connect 30 0 1 0;
diff --git a/doc/tutorials/footils/pddrums/angriff-01.pd b/doc/tutorials/footils/pddrums/angriff-01.pd
new file mode 100644
index 0000000000000000000000000000000000000000..72a1833038e036544178329be910eabd8d64f16a
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/angriff-01.pd
@@ -0,0 +1,2 @@
+#N canvas 0 0 392 161 10;
+#X obj 160 67 noise~;
diff --git a/doc/tutorials/footils/pddrums/angriff-01.png b/doc/tutorials/footils/pddrums/angriff-01.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebacdbec142759576c1dc7b4c8aa5e1f47878e53
Binary files /dev/null and b/doc/tutorials/footils/pddrums/angriff-01.png differ
diff --git a/doc/tutorials/footils/pddrums/angriff-1.pd b/doc/tutorials/footils/pddrums/angriff-1.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f47d98d4949db8283399a05fd7883af21eb7936c
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/angriff-1.pd
@@ -0,0 +1,2 @@
+#N canvas 0 0 450 300 10;
+#X obj 159 146 noise~;
diff --git a/doc/tutorials/footils/pddrums/default.css b/doc/tutorials/footils/pddrums/default.css
new file mode 100644
index 0000000000000000000000000000000000000000..bd00d3cc7821957aac7ec5bf61955444ddce7730
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/default.css
@@ -0,0 +1,326 @@
+
+HTML { 
+	background: #ffffff; 
+	color: #000;
+	font-family: Verdana, Helvetica, Arial, Tahoma, sans-serif;
+	font-size: 8pt;
+} 
+
+BODY{ 
+	padding: 5px;
+	font-family: Verdana, Helvetica, Arial, Tahoma, sans-serif;
+	font-size: 8pt;
+} 
+
+.footer {
+	background:#EEEEEE;
+	width: 650px;
+}
+
+.bordered {
+	padding: 5px;
+}
+
+
+H1 { 
+	color: #600; 
+	border: solid 1px;
+	font-family: monospace;
+	padding: 5px;
+	background:#EEEEEE;
+}
+
+H2 { 
+	font-family: Courier, monospace;
+	border: solid 1px;
+	color: #000; 
+	padding: 4px;
+}
+
+H3 { 
+	font-family: Courier, monospace;
+	border: solid 1px;
+	color: #000; 
+	padding: 4px;
+}
+
+pre { 
+	color: #333333; 
+	padding: 3px;
+	background:#EEEEEE;
+}
+
+A { 
+	text-decoration: none; 
+/*	background: #FFFFFF;  */
+	color: #b00; 
+} 
+
+A:hover { 
+	text-decoration: underline; 
+	/* background: #FFFFFF; */
+	color: #003300 ;
+} 
+
+A.nonexistent { 
+	background: #EEE; 
+	color: #CC6600;
+}
+
+
+
+
+HR {
+	height:1px;
+	width: 75%;
+	/* background:#eeaa00;  */
+	background:#eee; 
+	color:#000;
+}
+
+P.small {
+	font-size: xx-small;
+	background:#fff; 
+	text-align: right;
+	/*border: dotted 1px;*/
+	padding: 5px;
+}
+
+UL {
+	list-style-type: circle;
+}
+
+#Content>p {margin:0px;}
+#Content>p+p {text-indent:30px;}
+
+#Content {
+	margin:0px 50px 50px 160px;
+	padding:10px;
+	}
+div.document>p {margin:0px;}
+div.document>p+p {text-indent:30px;}
+
+div.document {
+	margin:0px 50px 50px 160px;
+	padding:10px;
+	}
+
+#Menu {
+	position:absolute;
+	top:120px;
+	left:10px;
+	width:150px;
+	padding:10px;
+	line-height:17px;
+/* Again, the ugly brilliant hack. */
+	voice-family: "\"}\"";
+	voice-family:inherit;
+	width:140px;
+	}
+/* Again, "be nice to Opera 5". */
+body>#Menu {width:140px;}
+
+#contents {
+	position:absolute;
+	top:120px;
+	left:10px;
+	width:150px;
+	padding:10px;
+	line-height:17px;
+/* Again, the ugly brilliant hack. */
+	voice-family: "\"}\"";
+	voice-family:inherit;
+	width:140px;
+	}
+/* Again, "be nice to Opera 5". */
+body>#contents {width:140px;}
+
+
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:date: $Date: 2003-04-29 09:19:26 $
+:version: $Revision: 1.2 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+*/
+
+.first {
+  margin-top: 0 }
+
+.last {
+  margin-bottom: 0 }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+dd {
+  margin-bottom: 0.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.attention, div.caution, div.danger, div.error, div.hint,
+div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.hint p.admonition-title, div.important p.admonition-title,
+div.note p.admonition-title, div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em }
+
+div.footer, div.header {
+  font-size: smaller }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr {
+  width: 75% }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.line-block {
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em ;
+  background-color: #eeeeee }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+table {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.citation {
+  border-left: solid thin gray ;
+  padding-left: 0.5ex }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.footnote {
+  border-left: solid thin black ;
+  padding-left: 0.5ex }
+
+td, th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+th.docinfo-name, th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+  font-size: 100% }
+
+tt {
+  background-color: #eeeeee }
+
+ul.auto-toc {
+  list-style-type: none }
diff --git a/doc/tutorials/footils/pddrums/drumcenter-01.pd b/doc/tutorials/footils/pddrums/drumcenter-01.pd
new file mode 100644
index 0000000000000000000000000000000000000000..013d1343bb1095bf8c6ed89bf13eb5c6234769a9
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/drumcenter-01.pd
@@ -0,0 +1,44 @@
+#N canvas 236 304 646 364 10;
+#X obj 66 77 noise~;
+#X obj 123 77 line~;
+#X obj 66 131 *~;
+#X obj 58 253 dac~;
+#X obj 66 226 *~ 0;
+#X obj 99 206 hsl 128 15 0 1 0 0 empty empty Volume_0-1 -2 -6 0 8 -262144
+-1 -1 6500 1;
+#N canvas 0 0 450 300 graph1 0;
+#X array noise 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 102 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 19 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array noise_and_line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 186 graph;
+#X obj 187 132 tabwrite~ noise;
+#X obj 209 109 tabwrite~ line;
+#X obj 147 167 tabwrite~ noise_and_line;
+#X msg 59 295 \; line resize \$1 \; noise resize \$1 \; noise_and_line
+resize \$1;
+#X msg 59 274 5000;
+#X msg 123 49 1 \, 0 50;
+#X obj 247 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X connect 0 0 2 0;
+#X connect 0 0 9 0;
+#X connect 1 0 2 1;
+#X connect 1 0 10 0;
+#X connect 2 0 4 0;
+#X connect 2 0 11 0;
+#X connect 4 0 3 0;
+#X connect 4 0 3 1;
+#X connect 5 0 4 1;
+#X connect 13 0 12 0;
+#X connect 14 0 1 0;
+#X connect 15 0 14 0;
+#X connect 15 0 10 0;
+#X connect 15 0 11 0;
+#X connect 15 0 9 0;
diff --git a/doc/tutorials/footils/pddrums/drumcenter-01.png b/doc/tutorials/footils/pddrums/drumcenter-01.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc42b13a1a074afe2ce29f8c03356f6e949b8ff9
Binary files /dev/null and b/doc/tutorials/footils/pddrums/drumcenter-01.png differ
diff --git a/doc/tutorials/footils/pddrums/drumcenter-02.pd b/doc/tutorials/footils/pddrums/drumcenter-02.pd
new file mode 100644
index 0000000000000000000000000000000000000000..906bc4ac66cf235c605a8ec09048de237e68a016
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/drumcenter-02.pd
@@ -0,0 +1,48 @@
+#N canvas 236 304 646 364 10;
+#X obj 66 77 noise~;
+#X obj 123 77 line~;
+#X obj 66 131 *~;
+#X obj 58 253 dac~;
+#X obj 66 226 *~ 0;
+#X obj 99 212 hsl 128 15 0 1 0 0 empty empty Volume_0-1 -2 -6 0 8 -262144
+-1 -1 7000 1;
+#N canvas 0 0 450 300 graph1 0;
+#X array noise 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 102 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 19 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array noise_and_line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 186 graph;
+#X obj 186 130 tabwrite~ noise;
+#X obj 208 107 tabwrite~ line;
+#X obj 145 184 tabwrite~ noise_and_line;
+#X msg 59 295 \; line resize \$1 \; noise resize \$1 \; noise_and_line
+resize \$1;
+#X msg 59 274 5000;
+#X msg 123 49 1 \, 0 50;
+#X obj 247 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X obj 66 167 lop~ 400;
+#X floatatom 117 145 5 0 0;
+#X connect 0 0 2 0;
+#X connect 0 0 9 0;
+#X connect 1 0 2 1;
+#X connect 1 0 10 0;
+#X connect 2 0 16 0;
+#X connect 4 0 3 0;
+#X connect 4 0 3 1;
+#X connect 5 0 4 1;
+#X connect 13 0 12 0;
+#X connect 14 0 1 0;
+#X connect 15 0 14 0;
+#X connect 15 0 10 0;
+#X connect 15 0 11 0;
+#X connect 15 0 9 0;
+#X connect 16 0 4 0;
+#X connect 16 0 11 0;
+#X connect 17 0 16 1;
diff --git a/doc/tutorials/footils/pddrums/drumcenter-02.png b/doc/tutorials/footils/pddrums/drumcenter-02.png
new file mode 100644
index 0000000000000000000000000000000000000000..0812d81d2f71bf40390314528486b5cf5a311cc7
Binary files /dev/null and b/doc/tutorials/footils/pddrums/drumcenter-02.png differ
diff --git a/doc/tutorials/footils/pddrums/drumcenter-03.pd b/doc/tutorials/footils/pddrums/drumcenter-03.pd
new file mode 100644
index 0000000000000000000000000000000000000000..96fc679cd0eeaae0307cf9474e952d350ba0e832
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/drumcenter-03.pd
@@ -0,0 +1,65 @@
+#N canvas 236 304 646 364 10;
+#X obj 66 77 noise~;
+#X obj 157 80 line~;
+#X obj 66 143 *~;
+#X obj 57 293 dac~;
+#X obj 65 266 *~ 0;
+#X obj 98 252 hsl 128 15 0 1 0 0 empty empty Volume_0-1 -2 -6 0 8 -262144
+-1 -1 9100 1;
+#N canvas 0 0 450 300 graph1 0;
+#X array noise 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 102 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 19 graph;
+#X msg 157 52 1 \, 0 50;
+#X obj 247 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X obj 66 167 lop~ 400;
+#X floatatom 193 138 5 0 0;
+#X obj 247 32 s \$0-trigger;
+#N canvas 0 0 615 324 I_dont_need_to_see_this_now 0;
+#X obj 113 88 tabwrite~ noise;
+#X obj 226 88 tabwrite~ line;
+#X obj 334 89 tabwrite~ noise_and_line;
+#X obj 18 38 r \$0-trigger;
+#X msg 230 181 \; line resize \$1 \; noise resize \$1 \; noise_and_line
+resize \$1;
+#X msg 230 160 5000;
+#X obj 114 36 inlet~;
+#X obj 226 35 inlet~;
+#X obj 333 47 inlet~;
+#X connect 3 0 1 0;
+#X connect 3 0 0 0;
+#X connect 3 0 2 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 7 0 1 0;
+#X connect 8 0 2 0;
+#X restore 44 210 pd I_dont_need_to_see_this_now;
+#N canvas 0 0 450 300 graph1 0;
+#X array noise_and_line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 186 graph;
+#X obj 148 103 *~;
+#X obj 146 126 *~;
+#X connect 0 0 2 0;
+#X connect 0 0 13 0;
+#X connect 1 0 15 0;
+#X connect 1 0 15 1;
+#X connect 2 0 10 0;
+#X connect 4 0 3 0;
+#X connect 4 0 3 1;
+#X connect 5 0 4 1;
+#X connect 8 0 1 0;
+#X connect 9 0 12 0;
+#X connect 9 0 8 0;
+#X connect 10 0 4 0;
+#X connect 10 0 13 2;
+#X connect 11 0 10 1;
+#X connect 15 0 16 0;
+#X connect 15 0 16 1;
+#X connect 16 0 2 1;
+#X connect 16 0 13 1;
diff --git a/doc/tutorials/footils/pddrums/drumcenter-03.png b/doc/tutorials/footils/pddrums/drumcenter-03.png
new file mode 100644
index 0000000000000000000000000000000000000000..361b361b3a368fb11603d9b304cd1b4625c6df09
Binary files /dev/null and b/doc/tutorials/footils/pddrums/drumcenter-03.png differ
diff --git a/doc/tutorials/footils/pddrums/drumcenter-04.pd b/doc/tutorials/footils/pddrums/drumcenter-04.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b46ff9519e8e90b5f4899085732d8d5e9fdca594
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/drumcenter-04.pd
@@ -0,0 +1,72 @@
+#N canvas 236 304 646 364 10;
+#X obj 186 107 line~;
+#X obj 66 143 *~;
+#X obj 59 306 dac~;
+#X obj 67 279 *~ 0;
+#X obj 100 265 hsl 128 15 0 1 0 0 empty empty Volume_0-1 -2 -6 0 8
+-262144 -1 -1 5000 1;
+#N canvas 0 0 450 300 graph1 0;
+#X array osc 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 383 188 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 381 19 graph;
+#X msg 186 83 1 \, 0 50;
+#X obj 247 11 bng 15 250 50 0 empty empty empty 0 -6 0 8 -241291 -1
+-1;
+#X obj 247 32 s \$0-trigger;
+#N canvas 0 0 615 324 I_dont_need_to_see_this_now 0;
+#X obj 226 88 tabwrite~ line;
+#X obj 18 38 r \$0-trigger;
+#X msg 230 160 5000;
+#X obj 114 36 inlet~;
+#X obj 226 35 inlet~;
+#X obj 333 47 inlet~;
+#X obj 334 89 tabwrite~ osc_and_line;
+#X obj 113 88 tabwrite~ osc;
+#X msg 230 181 \; line resize \$1 \; frequency resize \$1 \; osc resize
+\$1 \; osc_and_line resize \$1;
+#X obj 506 37 inlet~;
+#X obj 506 90 tabwrite~ frequency;
+#X connect 1 0 0 0;
+#X connect 1 0 6 0;
+#X connect 1 0 7 0;
+#X connect 1 0 10 0;
+#X connect 2 0 8 0;
+#X connect 3 0 7 0;
+#X connect 4 0 0 0;
+#X connect 5 0 6 0;
+#X connect 9 0 10 0;
+#X restore 33 200 pd I_dont_need_to_see_this_now;
+#N canvas 0 0 450 300 graph1 0;
+#X array osc_and_line 5000 float 0;
+#X coords 0 1 4999 -1 200 80 1;
+#X restore 383 272 graph;
+#X obj 66 112 osc~;
+#X obj 66 74 line~;
+#N canvas 0 0 450 300 graph1 0;
+#X array frequency 5000 float 0;
+#X coords 0 220 4999 1 200 80 1;
+#X restore 381 103 graph;
+#X msg 66 51 220 \, 50 20;
+#X msg 115 76 0.5;
+#X connect 0 0 1 1;
+#X connect 0 0 10 1;
+#X connect 1 0 10 2;
+#X connect 1 0 3 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
+#X connect 4 0 3 1;
+#X connect 7 0 0 0;
+#X connect 8 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 0 15 0;
+#X connect 8 0 16 0;
+#X connect 12 0 1 0;
+#X connect 12 0 10 0;
+#X connect 13 0 12 0;
+#X connect 13 0 10 3;
+#X connect 15 0 13 0;
+#X connect 16 0 12 1;
diff --git a/doc/tutorials/footils/pddrums/drumcenter-04.png b/doc/tutorials/footils/pddrums/drumcenter-04.png
new file mode 100644
index 0000000000000000000000000000000000000000..9643bdc9468293299ea406697d081e2fc68fc0b7
Binary files /dev/null and b/doc/tutorials/footils/pddrums/drumcenter-04.png differ
diff --git a/doc/tutorials/footils/pddrums/fastline.pd b/doc/tutorials/footils/pddrums/fastline.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6cf909a207879382631adaeb7ec0f5eca235ee74
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/fastline.pd
@@ -0,0 +1,47 @@
+#N canvas 15 38 859 491 10;
+#N canvas 0 0 450 300 graph1 0;
+#X array line 441 float 0;
+#X coords 0 1 440 -1 200 140 1;
+#X restore 319 322 graph;
+#X obj 151 306 line~;
+#X obj 100 352 tabwrite~ line;
+#X obj 186 217 t b;
+#X msg 151 186 1 2.1542;
+#X floatatom 216 122 5 0 0 0 - - -;
+#X msg 151 158 set 1 \$1;
+#X obj 100 107 t b;
+#X obj 472 56 loadbang;
+#X obj 216 90 / 44.1;
+#X obj 364 73 samplerate~;
+#X text 268 121 msecs;
+#X text 315 270 See how the [delay]ed peak always lands on a blocksize
+boundary?;
+#X msg 186 270 0 2;
+#X obj 363 96 / 1000;
+#X msg 100 158 bang;
+#X obj 186 246 del 1;
+#X msg 472 79 \; line resize 441 \; line xticks 0 64 8 \; line xlabel
+1.1 0 64 128 192 256 320 384 \; pd dsp 1;
+#X obj 216 68 nbx 5 16 -1e+37 1e+37 0 0 empty empty Samples 0 -8 1
+10 -260818 -1 -1 95 256;
+#X text 72 31 If we set Samples to small (< 64) \, line~ generates
+no output anymore;
+#X connect 1 0 2 0;
+#X connect 3 0 16 0;
+#X connect 4 0 1 0;
+#X connect 4 0 3 0;
+#X connect 5 0 6 0;
+#X connect 5 0 16 1;
+#X connect 6 0 4 0;
+#X connect 7 0 15 0;
+#X connect 8 0 17 0;
+#X connect 8 0 10 0;
+#X connect 9 0 5 0;
+#X connect 9 0 7 0;
+#X connect 10 0 14 0;
+#X connect 13 0 1 0;
+#X connect 14 0 9 1;
+#X connect 15 0 4 0;
+#X connect 15 0 2 0;
+#X connect 16 0 13 0;
+#X connect 18 0 9 0;
diff --git a/doc/tutorials/footils/pddrums/fastline.png b/doc/tutorials/footils/pddrums/fastline.png
new file mode 100644
index 0000000000000000000000000000000000000000..346f52ede07a9e68135bb8754ef875c589e54233
Binary files /dev/null and b/doc/tutorials/footils/pddrums/fastline.png differ
diff --git a/doc/tutorials/footils/pddrums/pddrums.html b/doc/tutorials/footils/pddrums/pddrums.html
new file mode 100644
index 0000000000000000000000000000000000000000..9b167106fcb2db17a8f79d5d751139c0f1b0d8fa
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/pddrums.html
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.2.8: http://docutils.sourceforge.net/" />
+<title>Building Drums in PD</title>
+<link rel="stylesheet" href="default.css" type="text/css" />
+</head>
+<body>
+<div class="document" id="building-drums-in-pd">
+<h1 class="title">Building Drums in PD</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr class="field"><th class="docinfo-name">Autor:</th><td class="field-body">Frank Barknecht</td>
+</tr>
+<tr><th class="docinfo-name">Contact:</th>
+<td><a class="first last reference" href="mailto:fbar&#64;footils.org">fbar&#64;footils.org</a></td></tr>
+</tbody>
+</table>
+<div class="abstract topic">
+<p class="topic-title">Abstract</p>
+<p>This quicktoot describes how PD can be used to build a simple drum 
+synthesizer with graphical controls and a step sequencer.</p>
+</div>
+<div class="contents topic" id="contents">
+<p class="topic-title"><a name="contents">Contents</a></p>
+<ul class="simple">
+<li><a class="reference" href="#small-is-beautiful" id="id1" name="id1">Small is beautiful</a></li>
+<li><a class="reference" href="#the-creator" id="id2" name="id2">The Creator</a></li>
+<li><a class="reference" href="#bring-the-noise" id="id3" name="id3">Bring The Noise</a></li>
+<li><a class="reference" href="#let-it-swing" id="id4" name="id4">Let It Swing</a></li>
+<li><a class="reference" href="#going-faster" id="id5" name="id5">Going faster</a></li>
+</ul>
+</div>
+<div class="section" id="small-is-beautiful">
+<h1><a class="toc-backref" href="#id1" name="small-is-beautiful">Small is beautiful</a></h1>
+<p>Pure Data - or short PD - is a multimedia software environment written 
+by Miller Puckette and others that can be used to make art in several 
+media like music, sound or graphics. In this quicktoot we will use the 
+sound generating capabilities of PD to build a module for drum sounds. 
+Our drum synthesizer will use a synthesis algorithm that's very 
+similar to the early analog or digital drumsynths of the eighties. We 
+will not use pre-recorded samples but instead employ simple sound 
+generators. You will be surprised, how effective this is and how much 
+variety is possible with just two or three sound sources. On the other 
+hand our design leaves room for improvment. By the end of this article 
+you will be able to add these on your own. Our drummer includes a 
+preset database: When you have found a sound, that you like, you can 
+save it and recall it again later.</p>
+<p>I will not go into much detail on how to install or how to use PD: You 
+should read the documentation that comes with PD for that. I will of 
+course explain the more advanced features of PD used and everything 
+that is needed to follow this tutorial.</p>
+</div>
+<div class="section" id="the-creator">
+<h1><a class="toc-backref" href="#id2" name="the-creator">The Creator</a></h1>
+<p>Creating something in PD is very much like the genesis of a world as described
+in, well, the Bible's first book &quot;Genesis&quot;.  In the beginning you have nothing,
+just a large white area. You, the Creator, can create objects by a simple
+button press &quot;Ctrl-1&quot;, which actually means &quot;Let there be an object&quot;. And there
+was an object. But your first object is a small empty rectangle and it can do
+nothing, it has no way of communicating, it isn't alive yet. To create a living
+object you have to give it a name, you have to call it by typing the name onto
+the object, for example &quot;noise~&quot;. And there was noise. With time you can
+populate the area with more objects, you can let them talk to each other, you
+can create more worlds, and you will create by giving all of them names. We
+maybe come to <tt class="literal"><span class="pre">[moses]</span></tt> later. Our drumsynth will have the name &quot;angriff&quot;,
+which is german for &quot;attack&quot;. So our goal is, that someone can create a
+drumsynth by typing the name &quot;angriff&quot; on a new object.</p>
+<p>This is achieved in PD by a so called &quot;abstraction&quot;. An abstraction is 
+simply a saved PD patch. So our very first and basically unusable 
+version of angriff is this: A nearly empty patch with a noise~ object 
+inside, saved under the name &quot;angriff-01.pd&quot;.</p>
+<div class="figure">
+<p><img alt="angriff-01.png" src="angriff-01.png" /></p>
+<p class="caption"><a class="reference" href="angriff-01.pd">angriff-01.pd</a>, an unusable first version.</p>
+</div>
+<p>Even this can be used as an object. Just create a new, empty patch 
+(with &quot;Ctrl-n&quot;), put an object in it and call it &quot;angriff-01&quot;, i.e. the 
+name of our first drum patch without the .pd-suffix.</p>
+<div class="figure">
+<p><img alt="using_angriff-1.png" src="using_angriff-1.png" /></p>
+<p class="caption">Using the unusable angriff-01.pd in another patch. <a class="reference" href="using_angriff-1.pd">using_angriff-1.pd</a></p>
+</div>
+<p>PD searches for something that matches the object &quot;angriff-01&quot; in 
+several places: in the list of builtin objects like &quot;noise~&quot;, in 
+external libraries or in its path for abstractions. If angriff-01.pd 
+is in the same directory as the using patch or in a path known to PD 
+through the startup option &quot;-path /a/pd-path/&quot;, it gets found. If you 
+click on angriff-01, you can open it to see, what's inside. 
+Abstractions itself can use other abstractions so it's a good idea to 
+put often used functionality into abstractions. As our final drumsynth 
+should have a sound generating part and a GUI to control this, we will 
+seperate both parts from each other by use of abstractions. For the 
+synthesis of sound we will build and use an abstraction called &quot;drumcenter&quot;
+inside of the main &quot;angriff&quot; patch. The main patch includes the control 
+elements for the parameters provided by &quot;drumcenter&quot;. This way our 
+synthesis model and the view to the user are separated.</p>
+</div>
+<div class="section" id="bring-the-noise">
+<h1><a class="toc-backref" href="#id3" name="bring-the-noise">Bring The Noise</a></h1>
+<p>How do drums drum? Although human dummers can spend hours tuning their 
+drumset, drums are generally non-pitched, percussive sounds. So for 
+our first usable version of a drumsound we take some noise as a sound 
+source and put an amplitude envelope around the noise. A simple, 
+builtin envelope generator in PD is line~. drumcenter-01.pd show the 
+noise, the envelope and both multiplied together.</p>
+<div class="figure">
+<p><img alt="drumcenter-01.png" src="drumcenter-01.png" /></p>
+<p class="caption">Enveloped noise, <a class="reference" href="drumcenter-01.pd">drumcenter-01.pd</a></p>
+</div>
+<p>If you listen to this patch, it already sounds a bit like a snare, 
+doesn't it? To make this sound a bit more variable we can use filtered 
+noise, for example with a lowpass or highpass filter. PD comes with 
+both, so lets use them. Her's the noise filtered with the lop~ filter 
+at a cutoff frequency of 400 Hertz:</p>
+<div class="figure">
+<p><img alt="drumcenter-02.png" src="drumcenter-02.png" /></p>
+<p class="caption">Lowpass filtered and enveloped noise, <a class="reference" href="drumcenter-02.pd">drumcenter-02.pd</a></p>
+</div>
+<p>Now our patch is beginning to get a bit crammed and chaotic, so let's 
+replace some chords with &quot;send&quot; and &quot;receive&quot; pairs, abbreviated &quot;s&quot; and &quot;r&quot;. 
+If we give those pairs names starting with $0, they get names starting 
+with unique numbers instead of the $0 while performing. This way, we 
+can later use several instances of our patches without conflicts 
+between their own send and receive variables. We can also hide stuff 
+we don't need to see in so called subpatches. Subpatches are areas 
+inside a patch that are hidden in an object box starting with <tt class="literal"><span class="pre">[pd]</span></tt>. 
+They are like curtains hiding things in a room, but the hidden objects 
+are a full part of the surrounding patch. The special objects <tt class="literal"><span class="pre">[inlet]</span></tt>, 
+<tt class="literal"><span class="pre">[outlet]</span></tt>, <tt class="literal"><span class="pre">[inlet~]</span></tt> and <tt class="literal"><span class="pre">[outlet~]</span></tt> create points of connections between 
+the surroundig patch and the subpatch. They work with abstractions as well.</p>
+<div class="figure">
+<p><img alt="drumcenter-03.png" src="drumcenter-03.png" /></p>
+<p class="caption">Cleaning up in the house, <a class="reference" href="drumcenter-03.pd">drumcenter-03.pd</a></p>
+</div>
+</div>
+<div class="section" id="let-it-swing">
+<h1><a class="toc-backref" href="#id4" name="let-it-swing">Let It Swing</a></h1>
+<p>I lied in the previous chapter: Drums are indeed pitched, although 
+just a little bit pitched. If a drummer kicks a bassdrum, the drum 
+begins to oscillate slightly at a low frequency. But this oscillation 
+is soon damped to an even lower frequency and then disapears. To 
+simulate this behaviour, we use PD's <tt class="literal"><span class="pre">[osc~]</span></tt> object with an added 
+frequency envelope as show in drumcenter-04.pd:</p>
+<div class="figure">
+<p><img alt="drumcenter-04.png" src="drumcenter-04.png" /></p>
+<p class="caption">Percussive oscillator, <a class="reference" href="drumcenter-04.pd">drumcenter-04.pd</a></p>
+</div>
+<p>The right inlet of <tt class="literal"><span class="pre">[osc~]</span></tt> is used here to set the start phase of the 
+oscillator. If we wouldn't set it, it would be different everytime we 
+start the envelope, because an object like the <tt class="literal"><span class="pre">[osc~]</span></tt> is always on and 
+goes through its cycle even if we don't listen to it. The main inlet 
+sets the frequency, that's going from a starting value to a lower 
+frequency in a short time.</p>
+</div>
+<div class="section" id="going-faster">
+<h1><a class="toc-backref" href="#id5" name="going-faster">Going faster</a></h1>
+<p>So far we used <tt class="literal"><span class="pre">[line~]</span></tt> for all envelopes and a controlling message 
+like <tt class="literal"><span class="pre">[1,</span> <span class="pre">0</span> <span class="pre">50(</span></tt>. This tells <tt class="literal"><span class="pre">[line~]</span></tt> to first go immediatly to 1, then 
+start going to 0 for 50 milliseconds. For our oscillator frequency 
+this is fine, but instantly going to an amplitude of 1 produces 
+clicks, as you might have heard. So we need to specify an attack time, 
+in that the amplitude raises from 0. The first guess would be a 
+message like <tt class="literal"><span class="pre">[1</span> <span class="pre">10,</span> <span class="pre">0</span> <span class="pre">50(</span></tt>, but that simply doesn't work. So this has to 
+be solved with two messages to the <tt class="literal"><span class="pre">[line~]</span></tt> object, for example <tt class="literal"><span class="pre">[1</span> <span class="pre">10(</span></tt>
+to go in 10 msecs to 1 and then the release: <tt class="literal"><span class="pre">[0</span> <span class="pre">50(</span></tt>. Between them a 
+<tt class="literal"><span class="pre">[del]</span></tt> is placed, that delays for as long as the first line segment's 
+duration is. But this also has a problem, as shown in the next figure: 
+a <tt class="literal"><span class="pre">[del]</span></tt> always delays in blocks of 64 samples, and that is a time of 
+around 1.45 msecs at a sampling rate of 44100 Hertz. A bit too long 
+for the short attack times used in drum synths.</p>
+<div class="figure">
+<p><img alt="fastline.png" src="fastline.png" /></p>
+<p class="caption">Two line~ segments started with delay, <a class="reference" href="fastline.pd">fastline.pd</a></p>
+</div>
+<p>This problem isn't trivial at all and it appears everywhere, one wants 
+to contol messages in PD quicker than the signal blocksize allows, for 
+example in granular synthesis patches. A solution to this are &quot;
+Time-Tagged Triggers&quot; (T3) as proposed by Gerhard Eckel and Manuel 
+Rocha Iturbide for Max/FTS. In PD T3-objects are made available as 
+externals in IEMLIB. Time-Tagged Triggers are a replacment for the 
+standard &quot;bang&quot; message that is normally used in PD or Max. Eckel 
+writes: &quot;In Max/FTS, a T3 is nothing else than a message containing one 
+floating-point number which specifies the delay in ms after which, 
+counting from the current tick, the trigger should go off.&quot; We will now 
+use the T3 break point envelope generator <tt class="literal"><span class="pre">[t3_bpe]</span></tt> to generate faster 
+envelopes.</p>
+<div class="figure">
+<p><img alt="t3-fastline.png" src="t3-fastline.png" /></p>
+<p class="caption">Two line~ segments started with delay, <a class="reference" href="t3-fastline.pd">t3-fastline.pd</a></p>
+</div>
+<p><em>to be continued...</em></p>
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/tutorials/footils/pddrums/pddrums.txt b/doc/tutorials/footils/pddrums/pddrums.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c4ccb39e4367ac3b1e403f3eabad59d8bee4e4bd
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/pddrums.txt
@@ -0,0 +1,205 @@
+====================
+Building Drums in PD
+====================
+
+:Autor: Frank Barknecht
+:Contact: fbar@footils.org
+
+:Abstract: 
+	This quicktoot describes how PD can be used to build a simple drum 
+	synthesizer with graphical controls and a step sequencer. 
+
+
+.. contents:: 
+
+
+Small is beautiful
+------------------
+
+Pure Data - or short PD - is a multimedia software environment written 
+by Miller Puckette and others that can be used to make art in several 
+media like music, sound or graphics. In this quicktoot we will use the 
+sound generating capabilities of PD to build a module for drum sounds. 
+Our drum synthesizer will use a synthesis algorithm that's very 
+similar to the early analog or digital drumsynths of the eighties. We 
+will not use pre-recorded samples but instead employ simple sound 
+generators. You will be surprised, how effective this is and how much 
+variety is possible with just two or three sound sources. On the other 
+hand our design leaves room for improvment. By the end of this article 
+you will be able to add these on your own. Our drummer includes a 
+preset database: When you have found a sound, that you like, you can 
+save it and recall it again later. 
+
+I will not go into much detail on how to install or how to use PD: You 
+should read the documentation that comes with PD for that. I will of 
+course explain the more advanced features of PD used and everything 
+that is needed to follow this tutorial. 
+
+The Creator 
+------------------
+
+Creating something in PD is very much like the genesis of a world as described
+in, well, the Bible's first book "Genesis".  In the beginning you have nothing,
+just a large white area. You, the Creator, can create objects by a simple
+button press "Ctrl-1", which actually means "Let there be an object". And there
+was an object. But your first object is a small empty rectangle and it can do
+nothing, it has no way of communicating, it isn't alive yet. To create a living
+object you have to give it a name, you have to call it by typing the name onto
+the object, for example "noise~". And there was noise. With time you can
+populate the area with more objects, you can let them talk to each other, you
+can create more worlds, and you will create by giving all of them names. We
+maybe come to ``[moses]`` later. Our drumsynth will have the name "angriff",
+which is german for "attack". So our goal is, that someone can create a
+drumsynth by typing the name "angriff" on a new object.
+
+This is achieved in PD by a so called "abstraction". An abstraction is 
+simply a saved PD patch. So our very first and basically unusable 
+version of angriff is this: A nearly empty patch with a noise~ object 
+inside, saved under the name "angriff-01.pd".
+
+.. figure:: angriff-01.png
+
+   angriff-01.pd_, an unusable first version.
+
+.. _angriff-01.pd: angriff-01.pd
+
+Even this can be used as an object. Just create a new, empty patch 
+(with "Ctrl-n"), put an object in it and call it "angriff-01", i.e. the 
+name of our first drum patch without the .pd-suffix.
+
+.. figure:: using_angriff-1.png
+
+   Using the unusable angriff-01.pd in another patch. using_angriff-1.pd_
+
+.. _using_angriff-1.pd: using_angriff-1.pd
+
+PD searches for something that matches the object "angriff-01" in 
+several places: in the list of builtin objects like "noise~", in 
+external libraries or in its path for abstractions. If angriff-01.pd 
+is in the same directory as the using patch or in a path known to PD 
+through the startup option "-path /a/pd-path/", it gets found. If you 
+click on angriff-01, you can open it to see, what's inside. 
+Abstractions itself can use other abstractions so it's a good idea to 
+put often used functionality into abstractions. As our final drumsynth 
+should have a sound generating part and a GUI to control this, we will 
+seperate both parts from each other by use of abstractions. For the 
+synthesis of sound we will build and use an abstraction called "drumcenter"
+inside of the main "angriff" patch. The main patch includes the control 
+elements for the parameters provided by "drumcenter". This way our 
+synthesis model and the view to the user are separated.
+
+Bring The Noise
+------------------
+
+How do drums drum? Although human dummers can spend hours tuning their 
+drumset, drums are generally non-pitched, percussive sounds. So for 
+our first usable version of a drumsound we take some noise as a sound 
+source and put an amplitude envelope around the noise. A simple, 
+builtin envelope generator in PD is line~. drumcenter-01.pd show the 
+noise, the envelope and both multiplied together.
+
+.. figure:: drumcenter-01.png
+
+  Enveloped noise, drumcenter-01.pd_
+
+.. _drumcenter-01.pd: drumcenter-01.pd 
+
+If you listen to this patch, it already sounds a bit like a snare, 
+doesn't it? To make this sound a bit more variable we can use filtered 
+noise, for example with a lowpass or highpass filter. PD comes with 
+both, so lets use them. Her's the noise filtered with the lop~ filter 
+at a cutoff frequency of 400 Hertz: 
+
+.. figure:: drumcenter-02.png
+            
+	    Lowpass filtered and enveloped noise, drumcenter-02.pd_
+
+.. _drumcenter-02.pd: drumcenter-02.pd
+
+Now our patch is beginning to get a bit crammed and chaotic, so let's 
+replace some chords with "send" and "receive" pairs, abbreviated "s" and "r". 
+If we give those pairs names starting with $0, they get names starting 
+with unique numbers instead of the $0 while performing. This way, we 
+can later use several instances of our patches without conflicts 
+between their own send and receive variables. We can also hide stuff 
+we don't need to see in so called subpatches. Subpatches are areas 
+inside a patch that are hidden in an object box starting with ``[pd]``. 
+They are like curtains hiding things in a room, but the hidden objects 
+are a full part of the surrounding patch. The special objects ``[inlet]``, 
+``[outlet]``, ``[inlet~]`` and ``[outlet~]`` create points of connections between 
+the surroundig patch and the subpatch. They work with abstractions as well.
+
+.. figure:: drumcenter-03.png
+	
+	Cleaning up in the house, drumcenter-03.pd_
+
+.. _drumcenter-03.pd: drumcenter-03.pd
+
+
+Let It Swing
+------------------
+
+I lied in the previous chapter: Drums are indeed pitched, although 
+just a little bit pitched. If a drummer kicks a bassdrum, the drum 
+begins to oscillate slightly at a low frequency. But this oscillation 
+is soon damped to an even lower frequency and then disapears. To 
+simulate this behaviour, we use PD's ``[osc~]`` object with an added 
+frequency envelope as show in drumcenter-04.pd:
+
+.. figure:: drumcenter-04.png
+            
+	    Percussive oscillator, drumcenter-04.pd_
+
+.. _drumcenter-04.pd: drumcenter-04.pd
+
+The right inlet of ``[osc~]`` is used here to set the start phase of the 
+oscillator. If we wouldn't set it, it would be different everytime we 
+start the envelope, because an object like the ``[osc~]`` is always on and 
+goes through its cycle even if we don't listen to it. The main inlet 
+sets the frequency, that's going from a starting value to a lower 
+frequency in a short time.
+
+Going faster
+------------------
+
+So far we used ``[line~]`` for all envelopes and a controlling message 
+like ``[1, 0 50(``. This tells ``[line~]`` to first go immediatly to 1, then 
+start going to 0 for 50 milliseconds. For our oscillator frequency 
+this is fine, but instantly going to an amplitude of 1 produces 
+clicks, as you might have heard. So we need to specify an attack time, 
+in that the amplitude raises from 0. The first guess would be a 
+message like ``[1 10, 0 50(``, but that simply doesn't work. So this has to 
+be solved with two messages to the ``[line~]`` object, for example ``[1 10(``
+to go in 10 msecs to 1 and then the release: ``[0 50(``. Between them a 
+``[del]`` is placed, that delays for as long as the first line segment's 
+duration is. But this also has a problem, as shown in the next figure: 
+a ``[del]`` always delays in blocks of 64 samples, and that is a time of 
+around 1.45 msecs at a sampling rate of 44100 Hertz. A bit too long 
+for the short attack times used in drum synths.
+
+.. figure:: fastline.png
+
+  Two line~ segments started with delay, fastline.pd_
+
+.. _fastline.pd: fastline.pd
+
+This problem isn't trivial at all and it appears everywhere, one wants 
+to contol messages in PD quicker than the signal blocksize allows, for 
+example in granular synthesis patches. A solution to this are "
+Time-Tagged Triggers" (T3) as proposed by Gerhard Eckel and Manuel 
+Rocha Iturbide for Max/FTS. In PD T3-objects are made available as 
+externals in IEMLIB. Time-Tagged Triggers are a replacment for the 
+standard "bang" message that is normally used in PD or Max. Eckel 
+writes: "In Max/FTS, a T3 is nothing else than a message containing one 
+floating-point number which specifies the delay in ms after which, 
+counting from the current tick, the trigger should go off." We will now 
+use the T3 break point envelope generator ``[t3_bpe]`` to generate faster 
+envelopes. 
+
+.. figure:: t3-fastline.png
+
+  Two line~ segments started with delay, t3-fastline.pd_
+
+.. _t3-fastline.pd: t3-fastline.pd
+
+*to be continued...*
diff --git a/doc/tutorials/footils/pddrums/t3-fastline.pd b/doc/tutorials/footils/pddrums/t3-fastline.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e1c209b78be9287d2d1b002714877669bdbb5b8b
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/t3-fastline.pd
@@ -0,0 +1,49 @@
+#N canvas 193 381 819 529 10;
+#X obj 191 291 t3_bpe;
+#X obj 191 192 t b b;
+#X obj 191 348 t3_line~ 0;
+#X obj 191 252 f 0;
+#X obj 244 128 t b f;
+#X obj 107 417 tabwrite~ line;
+#N canvas 0 0 450 300 graph1 0;
+#X array line 441 float 0;
+#X coords 0 1 440 -1 200 140 1;
+#X restore 457 270 graph;
+#X msg 472 79 \; line resize 441 \; line xticks 0 64 8 \; line xlabel
+1.1 0 64 128 192 256 320 384 \; pd dsp 1;
+#X obj 244 105 / 44.1;
+#X msg 191 149 bang;
+#X obj 472 49 loadbang;
+#X floatatom 112 189 5 0 0 0 - - -;
+#X obj 112 207 / 44.1;
+#X text 104 165 pre-delay;
+#X text 86 8 T3-envelopes;
+#X floatatom 274 152 5 0 0 0 - - -;
+#X text 324 151 msec;
+#X text 59 31 With Time-Tagged Triggers exact positioning is possible
+even between block boundaries.;
+#X msg 244 204 set \$1 \$2 \$3 \$4;
+#X msg 244 246 1 1.85941 0 2;
+#X obj 244 84 nbx 5 16 -1e+37 1e+37 0 0 empty empty Samples 0 -8 1
+10 -260818 -1 -1 82 256;
+#X obj 244 176 pack 1 0.5 0 2;
+#X connect 0 0 2 0;
+#X connect 0 1 2 1;
+#X connect 1 0 3 0;
+#X connect 1 0 5 0;
+#X connect 1 1 19 0;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 9 0;
+#X connect 4 0 21 0;
+#X connect 4 1 15 0;
+#X connect 8 0 4 0;
+#X connect 9 0 1 0;
+#X connect 10 0 7 0;
+#X connect 11 0 12 0;
+#X connect 12 0 3 1;
+#X connect 15 0 21 1;
+#X connect 18 0 19 0;
+#X connect 19 0 0 0;
+#X connect 20 0 8 0;
+#X connect 21 0 18 0;
diff --git a/doc/tutorials/footils/pddrums/t3-fastline.png b/doc/tutorials/footils/pddrums/t3-fastline.png
new file mode 100644
index 0000000000000000000000000000000000000000..7833cc2afb19cd3ad6c5247110dc851d5743acf5
Binary files /dev/null and b/doc/tutorials/footils/pddrums/t3-fastline.png differ
diff --git a/doc/tutorials/footils/pddrums/using_angriff-1.pd b/doc/tutorials/footils/pddrums/using_angriff-1.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7aafbd6367e439a84f51e791d36164dbcd3cb537
--- /dev/null
+++ b/doc/tutorials/footils/pddrums/using_angriff-1.pd
@@ -0,0 +1,2 @@
+#N canvas 270 233 450 300 10;
+#X obj 187 140 angriff-01;
diff --git a/doc/tutorials/footils/pddrums/using_angriff-1.png b/doc/tutorials/footils/pddrums/using_angriff-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbe04cc1845e222110c418617395c5e99c5e8a14
Binary files /dev/null and b/doc/tutorials/footils/pddrums/using_angriff-1.png differ
diff --git a/doc/tutorials/intro/01.hello_world.pd b/doc/tutorials/intro/01.hello_world.pd
new file mode 100644
index 0000000000000000000000000000000000000000..530139dc720f597be2f1bb420b276f80f45875dd
--- /dev/null
+++ b/doc/tutorials/intro/01.hello_world.pd
@@ -0,0 +1,19 @@
+#N canvas 10 40 620 460 12;
+#X msg 235 167 Hello world!;
+#X text 238 216 <-- connection \, aka "cord";
+#X text 17 32 In Pd \, programming is done with boxes which are connected
+together. The boxes have "inlets" and "outlets" \, where they are connected.
+;
+#X text 153 265 inlet-->;
+#X text 154 158 inlet-->;
+#X text 144 178 outlet-->;
+#X obj 234 265 print;
+#X text 289 266 <-- object box;
+#X text 73 319 Now look in the Pd window to see the result.;
+#X text 359 168 <-- message box;
+#X text 101 111 Click on the box with "Hello world!" in it:;
+#X text 16 363 Whenever you see the [print] box \, that means that
+stuff will be printed to the Pd window.;
+#X obj 133 415 print;
+#X text 198 415 prints to the Pd window.;
+#X connect 0 0 6 0;
diff --git a/doc/tutorials/intro/02.basic_elements.pd b/doc/tutorials/intro/02.basic_elements.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e58fc9493de4f5bc8106697421c7cd7697fc62be
--- /dev/null
+++ b/doc/tutorials/intro/02.basic_elements.pd
@@ -0,0 +1,16 @@
+#N canvas 10 40 620 460 12;
+#X obj 36 141;
+#X obj 34 91 float;
+#X msg 34 187 message;
+#X floatatom 34 236 5 0 0 0 - - -;
+#X symbolatom 34 285 10 0 0 0 - - -;
+#X text 33 334 comment;
+#X text 54 28 comment;
+#X obj 12 13 cnv 15 400 40 empty empty Basic_Elements 20 12 0 24 -228992
+-66577 0;
+#X text 153 333 comment (like the rest of this text);
+#X text 151 91 object box;
+#X text 151 141 empty object box;
+#X text 152 232 number box (click and drag/type);
+#X text 152 284 symbol box (click and type);
+#X text 152 187 message box (click);
diff --git a/doc/tutorials/intro/03.getting_help.pd b/doc/tutorials/intro/03.getting_help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a851ce427862159e585f583412e7488736f3d6f4
--- /dev/null
+++ b/doc/tutorials/intro/03.getting_help.pd
@@ -0,0 +1,17 @@
+#N canvas 10 40 620 460 12;
+#X msg 179 150;
+#X obj 61 150 trigger;
+#X text 54 28 comment;
+#X obj 12 13 cnv 15 400 40 empty empty Getting_Help 20 12 0 24 -228992
+-66577 0;
+#X text 26 291 You can right-click on the canvas to get a list of the
+core Pd objects. A more complete list is in the Help Browser \, available
+under the Help menu.;
+#X text 58 187 object;
+#X text 179 186 message;
+#X floatatom 275 150 5 0 0 0 - - -;
+#X text 276 182 number box;
+#X symbolatom 403 151 10 0 0 0 - - -;
+#X text 406 182 symbol box;
+#X text 21 75 Right-click on anything and select "Help" \, and a help
+patch will pop up.;
diff --git a/doc/tutorials/intro/04.edit_mode.pd b/doc/tutorials/intro/04.edit_mode.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b5682d128e5dbf98d91f1dc2acdb259d27c8b179
--- /dev/null
+++ b/doc/tutorials/intro/04.edit_mode.pd
@@ -0,0 +1,13 @@
+#N canvas 10 40 620 460 12;
+#X obj 8 10 cnv 15 400 40 empty empty edit_mode 20 12 0 24 -228992
+-66577 0;
+#X text 19 67 There are two modes when editing a patch: play and edit.
+In order to edit an existing patch \, or create new boxes \, you need
+to switch to edit mode.;
+#X text 20 131 To switch to edit mode \, go to the "Edit" menu and
+select "Edit mode". Now try putting down some boxes on this canvas.
+You can select which one from the "Put" menu.;
+#X text 26 347 To stop editing \, go to the "Edit" menu again \, and
+select "Edit mode" again.;
+#X text 26 404 You can also use the key command Ctrl-E (Cmd-E on Mac
+OS X) to switch between edit and play mode.;
diff --git a/doc/tutorials/intro/05.objects.pd b/doc/tutorials/intro/05.objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d06c6afa387f2f11ba50eb39368e789562abc633
--- /dev/null
+++ b/doc/tutorials/intro/05.objects.pd
@@ -0,0 +1,31 @@
+#N canvas 10 40 620 460 12;
+#X obj 28 151 float;
+#X text 10 61 The fundamental building block of a Pd program is the
+object. Each object is itself like a tiny program that does a very
+specific thing.;
+#X text 11 124 These are all objects which store data:;
+#X obj 96 151 symbol;
+#X obj 174 151 list;
+#X text 13 188 With most objects \, you can read the name of the object
+in the object box:;
+#X obj 16 230 moses;
+#X obj 92 230 select;
+#X obj 176 230 route;
+#X obj 251 230 trigger;
+#X text 11 264 GUI objects convert themselves into a GUI element \,
+usually some kind of control. In the process \, they often hide the
+text name of the object:;
+#X obj 27 358 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 15 329 [bng];
+#X obj 108 355 vsl 15 80 0 127 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X text 85 329 [vslider];
+#X text 227 331 [hslider];
+#X obj 197 353 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 393 351 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 382 326 [tgl];
+#X obj 8 10 cnv 15 400 40 empty empty objects 20 12 0 24 -228992 -66577
+0;
diff --git a/doc/tutorials/intro/06.connections.pd b/doc/tutorials/intro/06.connections.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d77fed94dd05ce21181214ec8b4e408afb76ddf2
--- /dev/null
+++ b/doc/tutorials/intro/06.connections.pd
@@ -0,0 +1,27 @@
+#N canvas 10 40 620 460 12;
+#X text 12 132 Pd patches are always running and changes take effect
+immediately.;
+#X floatatom 25 277 5 0 0 0 - - -;
+#X floatatom 25 341 5 0 0 0 - - -;
+#X obj 24 179 tgl 30 0 empty empty start 2 15 1 12 -24198 -1 -1 0 1
+;
+#X obj 24 221 metro 100;
+#X obj 24 248 random 100;
+#X text 70 183 <-- click here to start;
+#X text 58 299 connect by clicking on the outlet of the top number
+box \, then drag and drop on the inlet of the bottom number box;
+#X text 28 299 ^--;
+#X obj 8 10 cnv 15 400 40 empty empty connections 20 12 0 24 -228992
+-66577 0;
+#X obj 219 428 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s2.6
+;
+#X text 11 53 One path for objects to communicate is thru connections
+\, called cords or cables. Connections are always made from the inlet
+to the outlet since that is the direction data flows in Pd.;
+#X text 195 238 next \, make sure you are in edit mode!;
+#X text 34 365 Disconnect the cable by clicking on it to highlight
+it \, then press "backspace" ("delete" on a Mac).;
+#X text 192 412 For more info:;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
diff --git a/doc/tutorials/intro/07.messages.pd b/doc/tutorials/intro/07.messages.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d3c8fa8aab6bb647d4adab425755289d6733e3a5
--- /dev/null
+++ b/doc/tutorials/intro/07.messages.pd
@@ -0,0 +1,47 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty messages 20 12 0 24 -228992
+-66577 0;
+#X obj 112 249 + 1;
+#X msg 111 161 1;
+#X floatatom 111 306 5 0 0 0 - - -;
+#X text 183 161 <-- messages -->;
+#X text 187 250 <-- objects -->;
+#X obj 201 434 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3
+;
+#X text 20 64 Objects respond to messages received on their inlets
+\, and output messages on their outlets. These messages can be anything
+from data to commands.;
+#X text 104 128 data;
+#X text 359 127 commands;
+#X text 19 341 All communication within Pd is in the form of messages
+\, including when the user is controlling the program.;
+#X msg 123 189 2;
+#X text 169 415 For more info:;
+#X obj 424 250 readsf~;
+#X obj 424 282 dac~;
+#X msg 437 189 1;
+#X msg 424 161 open ../../sound/voice.wav;
+#X text 187 303 <-- number box;
+#X obj 327 250 metro 500;
+#X obj 327 282 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X msg 327 161 bang;
+#X msg 340 189 stop;
+#X obj 8 249 print;
+#X msg 9 161 word;
+#X msg 23 189 another;
+#X obj 527 250 send pd;
+#X msg 527 189 dsp 1;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 11 0 1 0;
+#X connect 13 0 14 0;
+#X connect 13 0 14 1;
+#X connect 15 0 13 0;
+#X connect 16 0 13 0;
+#X connect 18 0 19 0;
+#X connect 20 0 18 0;
+#X connect 21 0 18 0;
+#X connect 23 0 22 0;
+#X connect 24 0 22 0;
+#X connect 26 0 25 0;
diff --git a/doc/tutorials/intro/08.EXERCISE-make_your_first_patch.pd b/doc/tutorials/intro/08.EXERCISE-make_your_first_patch.pd
new file mode 100644
index 0000000000000000000000000000000000000000..566e4cdf4e80237fbd95bdd0e874c4e3b5ee9d7c
--- /dev/null
+++ b/doc/tutorials/intro/08.EXERCISE-make_your_first_patch.pd
@@ -0,0 +1,11 @@
+#N canvas 10 40 620 460 12;
+#X obj 8 10 cnv 15 600 40 empty empty EXERCISE-make_your_first_patch
+20 12 0 24 -262131 -66577 0;
+#X text 15 71 Its time to make your first patch. Follow the instructions
+on the right:;
+#X text 166 196 2- make a new object box \, in it \, type: symbol;
+#X text 166 235 3- make a new symbol box;
+#X text 166 275 4- connect the message box to the object box;
+#X text 166 315 5- connect the object box to the symbol box;
+#X text 165 353 6- click the message box \, and viola!;
+#X text 166 159 1- make a message box \, in it \, type: servus;
diff --git a/doc/tutorials/intro/09.the_basic_atoms.pd b/doc/tutorials/intro/09.the_basic_atoms.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0863ec052376ebe2fd20a218928618c911dd7646
--- /dev/null
+++ b/doc/tutorials/intro/09.the_basic_atoms.pd
@@ -0,0 +1,38 @@
+#N canvas 10 40 620 460 12;
+#X obj 12 211 cnv 15 600 70 empty empty empty 20 12 0 14 -262134 -66577
+0;
+#X obj 10 12 cnv 15 400 40 empty empty the_basic_atoms 20 12 0 24 -228992
+-66577 0;
+#X text 56 209 1;
+#X text 81 240 0;
+#X text 138 213 1.14234e+34;
+#X text 429 244 3.14159;
+#X text 333 211 -999999;
+#X text 335 244 45;
+#X text 195 243 -12;
+#X text 512 221 1824.53;
+#X text 28 237 3;
+#X obj 13 377 cnv 15 600 70 empty empty empty 20 12 0 14 -262134 -66577
+0;
+#X text 33 377 word;
+#X text 94 409 number5;
+#X text 204 380 3..2;
+#X text 558 414 --44;
+#X text 240 412 label;
+#X text 486 375 reset;
+#X text 337 375 5++;
+#X text 404 407 trigger;
+#X text 11 68 The essential data types of Pd are called "atoms". An
+atom is a piece of data that cannot be broken down into smaller parts.
+The two most basic atom types are numeric and symbol \, also known
+as "float" and "symbol".;
+#X obj 12 151 cnv 15 15 15 empty empty numeric_atom 0 8 0 14 -262144
+-66577 0;
+#X obj 12 301 cnv 15 15 15 empty empty symbolic_atom 0 8 0 14 -262144
+-66577 0;
+#X text 30 332 A symbolic atom is any element that is not a functional
+representation of a number \, usually in the form of words:;
+#X text 124 300 = anything that is not a number;
+#X text 24 170 A numeric atom is any element that can be interpreted
+as a number;
+#X text 114 150 = a number;
diff --git a/doc/tutorials/intro/10.bang.pd b/doc/tutorials/intro/10.bang.pd
new file mode 100644
index 0000000000000000000000000000000000000000..39460122e57cf2c67cf7c44b8eeebc75002b60d8
--- /dev/null
+++ b/doc/tutorials/intro/10.bang.pd
@@ -0,0 +1,34 @@
+#N canvas 10 40 620 460 12;
+#X obj 18 191 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 18 269 bang;
+#X text 40 189 <--bang button;
+#X text 62 270 <--you can also send "bang" using a message box;
+#X text 14 137 Here \, this toggle changes state when it receives a
+bang:;
+#X obj 8 10 cnv 15 400 40 empty empty bang 20 12 0 24 -228992 -66577
+0;
+#X text 13 79 In Pd \, "bang" means "do it". What that "it" is depends
+on the object receiving the bang.;
+#X msg 73 349 bang;
+#X obj 73 387 print word;
+#X obj 132 352 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 279 324 bang;
+#X obj 289 398 pddp/print_long;
+#X msg 279 350 send me!;
+#X obj 395 320 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 394 349 234;
+#X obj 18 219 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0
+1;
+#X obj 18 297 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0
+1;
+#X connect 0 0 15 0;
+#X connect 1 0 16 0;
+#X connect 7 0 8 0;
+#X connect 9 0 8 0;
+#X connect 10 0 12 0;
+#X connect 12 0 11 0;
+#X connect 13 0 14 0;
+#X connect 14 0 11 0;
diff --git a/doc/tutorials/intro/11.metro.pd b/doc/tutorials/intro/11.metro.pd
new file mode 100644
index 0000000000000000000000000000000000000000..29caf7c9b62896faed89bc8a2d5f61a5f2754a71
--- /dev/null
+++ b/doc/tutorials/intro/11.metro.pd
@@ -0,0 +1,49 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty metro 20 12 0 24 -228992 -66577
+0;
+#X obj 30 321 metro;
+#X text 12 72 The timing of events is an essential function of Pd.
+For example: in a piece of music \, each note is played at a specific
+time of the whole piece.;
+#X text 12 132 The [metro] object provides a method for making things
+happen at a regular time interval. "metro" comes from metronome. A
+metronome makes repeating clicks and the time between each click can
+be set.;
+#X msg 16 263 bang;
+#X msg 55 263 stop;
+#X obj 63 299 nbx 3 18 100 999 0 1 empty empty empty 0 -6 0 16 -262144
+-1 -1 500 256;
+#X obj 30 359 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144 -1
+-1;
+#X text 120 297 <-- change the time between bangs here;
+#X msg 483 96 bang;
+#X obj 483 147 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 326 422 pddp/pddplink http://en.wikipedia.org/wiki/Metronome
+;
+#X text 304 397 For more info:;
+#X msg 458 271 bang;
+#X msg 497 271 stop;
+#X obj 472 377 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 472 349 metro 500;
+#X obj 483 122 metro 500;
+#X text 12 206 The same is true of [metro] \, using a number to represent
+the time in milliseconds (ms):;
+#X msg 500 300 1;
+#X msg 533 300 0;
+#X obj 445 323 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0
+1;
+#X text 413 243 Ways to start/stop [metro]:;
+#X connect 1 0 7 0;
+#X connect 4 0 1 0;
+#X connect 5 0 1 0;
+#X connect 6 0 1 1;
+#X connect 9 0 17 0;
+#X connect 13 0 16 0;
+#X connect 14 0 16 0;
+#X connect 16 0 15 0;
+#X connect 17 0 10 0;
+#X connect 19 0 16 0;
+#X connect 20 0 16 0;
+#X connect 21 0 16 0;
diff --git a/doc/tutorials/intro/12.hot_and_cold_inlets.pd b/doc/tutorials/intro/12.hot_and_cold_inlets.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cd6c69faaf5bef0417d5be5b3a5261c9b7f0604e
--- /dev/null
+++ b/doc/tutorials/intro/12.hot_and_cold_inlets.pd
@@ -0,0 +1,54 @@
+#N canvas 10 40 620 460 12;
+#X obj 99 238 +;
+#X floatatom 99 267 5 0 0 0 - - -;
+#X msg 99 184 1;
+#X msg 117 215 5;
+#X text 11 54 For most objects in Pd \, the leftmost inlet is the "hot"
+inlet. This means that it will output something whenever it receives
+data on the "hot" inlet.;
+#X text 145 215 2) click this and there will be no new output;
+#X obj 181 350 +;
+#X floatatom 181 374 5 0 0 0 - - -;
+#X msg 84 315 1;
+#X text 15 291 Try a number of different combinations to see for yourself:
+;
+#X text 215 343 <-- "cold" inlet;
+#X text 49 343 "hot" inlet -->;
+#X msg 124 315 2;
+#X msg 164 315 3;
+#X msg 234 315 4;
+#X msg 274 315 5;
+#X msg 314 315 6;
+#X text 145 184 1) click this first \, and [+ ] immediately outputs
+a 1;
+#X obj 6 8 cnv 15 400 40 empty empty hot_and_cold_inlets 20 12 0 24
+-228992 -66577 0;
+#X text 10 111 All other inlets are generally "cold" inlets \, which
+just store the data. When the object receives input on the "hot" inlet
+\, the object with read the data from all the inlets and do its thing.
+;
+#X text 145 242 3) now click the [1( message box;
+#X obj 516 97 +;
+#X msg 534 73 1;
+#X msg 502 73 1;
+#X text 17 395 Notice that the number is stored in the "cold" inlet
+until you change it. For example \, if you click [4( \, then click
+[1( \, [2( \, and [3( \, you will see that 1 \, 2 \, and 3 are all
+added to 4;
+#X floatatom 516 120 5 0 0 0 - - -;
+#X obj 516 140 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X connect 0 0 1 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 6 0 7 0;
+#X connect 8 0 6 0;
+#X connect 12 0 6 0;
+#X connect 13 0 6 0;
+#X connect 14 0 6 1;
+#X connect 15 0 6 1;
+#X connect 16 0 6 1;
+#X connect 21 0 25 0;
+#X connect 22 0 21 1;
+#X connect 23 0 21 0;
+#X connect 25 0 26 0;
diff --git a/doc/tutorials/intro/13.counters.pd b/doc/tutorials/intro/13.counters.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a18cb2f7552f72029c3439c9ce7e2067ba47c695
--- /dev/null
+++ b/doc/tutorials/intro/13.counters.pd
@@ -0,0 +1,42 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty counters 20 12 0 24 -228992
+-66577 0;
+#X obj 156 362 cnv 15 100 60 empty empty empty 20 12 0 14 -261039 -66577
+0;
+#X obj 174 382 f;
+#X obj 209 382 + 1;
+#X obj 157 219 float;
+#X floatatom 120 246 5 0 0 0 - - -;
+#X msg 121 137 1;
+#X obj 120 219 +;
+#X msg 157 189 0;
+#X msg 133 160 -1;
+#X text 167 138 increment;
+#X text 172 161 decrement;
+#X text 195 187 reset;
+#X floatatom 346 244 5 0 0 0 - - -;
+#X msg 378 180 0;
+#X text 395 137 increment;
+#X obj 346 216 float;
+#X obj 404 216 + 1;
+#X msg 347 138 bang;
+#X text 278 377 DANGER! infinite loop!;
+#X text 20 78 Counters are used a lot when programming Pd. Here are
+two examples of simple counters that you will see frequently.;
+#X text 416 180 reset;
+#X text 20 277 Pd is designed to be as flexible and open as possible.
+This means that it will let you crash your computer. For example \,
+never start a counter like this \, it could crash your computer!;
+#X connect 2 0 3 0;
+#X connect 3 0 2 0;
+#X connect 4 0 7 1;
+#X connect 6 0 7 0;
+#X connect 7 0 4 0;
+#X connect 7 0 5 0;
+#X connect 8 0 4 0;
+#X connect 9 0 7 0;
+#X connect 14 0 16 1;
+#X connect 16 0 13 0;
+#X connect 16 0 17 0;
+#X connect 17 0 16 1;
+#X connect 18 0 16 0;
diff --git a/doc/tutorials/intro/14.event_driven_processing.pd b/doc/tutorials/intro/14.event_driven_processing.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d3c7120ccfc4f9e7610c46f08aca03106a7bcbaa
--- /dev/null
+++ b/doc/tutorials/intro/14.event_driven_processing.pd
@@ -0,0 +1,72 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty event_driven_processing 20 12
+0 24 -228992 -66577 0;
+#X obj 113 324 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 113 372 float;
+#X obj 170 372 + 1;
+#X floatatom 113 397 5 0 0 0 - - -;
+#X obj 113 418 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 113 348 metro 1000;
+#X obj 384 316 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 385 353 float;
+#X obj 442 353 + 1;
+#X floatatom 385 378 5 0 0 0 - - -;
+#X obj 385 399 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 54 145 cnv 15 80 30 empty empty empty 20 12 0 14 -225271 -66577
+0;
+#X obj 236 140 cnv 15 80 30 empty empty empty 20 12 0 14 -225271 -66577
+0;
+#X obj 404 139 cnv 15 80 30 empty empty empty 20 12 0 14 -225271 -66577
+0;
+#X obj 72 181 + 1;
+#X floatatom 72 207 5 0 0 0 - - -;
+#X msg 72 149 1;
+#X msg 237 145 convert;
+#X obj 237 178 symbol;
+#X symbolatom 237 206 10 0 0 0 - - -;
+#X obj 72 234 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 237 233 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 421 176 float;
+#X obj 478 176 + 1;
+#X floatatom 421 204 5 0 0 0 - - -;
+#X obj 421 229 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 277 364 delay 1000;
+#X msg 421 144 bang;
+#X text 18 65 Message processing is driven by events \, nothing happens
+if there are no events. There is nothing happening in the patches below
+until you click on the messages (the bang buttons at the bottom of
+each patch illustrate this):;
+#X text 18 265 Pd is always ready to process messages \, you don't
+need to tell it to run. You can keep events happening by sending a
+stream of messages:;
+#X connect 1 0 6 0;
+#X connect 2 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 1;
+#X connect 4 0 5 0;
+#X connect 6 0 2 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 0 10 0;
+#X connect 9 0 8 1;
+#X connect 10 0 11 0;
+#X connect 11 0 27 0;
+#X connect 15 0 16 0;
+#X connect 16 0 21 0;
+#X connect 17 0 15 0;
+#X connect 18 0 19 0;
+#X connect 19 0 20 0;
+#X connect 20 0 22 0;
+#X connect 23 0 24 0;
+#X connect 23 0 25 0;
+#X connect 24 0 23 1;
+#X connect 25 0 26 0;
+#X connect 27 0 8 0;
+#X connect 28 0 23 0;
diff --git a/doc/tutorials/intro/15.right_to_left_order.pd b/doc/tutorials/intro/15.right_to_left_order.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7af342db11adaf95aa5ed2db15e85e1089af8a69
--- /dev/null
+++ b/doc/tutorials/intro/15.right_to_left_order.pd
@@ -0,0 +1,27 @@
+#N canvas 10 40 620 460 12;
+#X obj 165 185 bng 25 250 50 0 empty empty empty -2 -8 1 10 -24198
+-1 -1;
+#X obj 165 225 trigger bang bang bang;
+#X msg 381 264 1;
+#X msg 273 264 2;
+#X msg 165 264 3;
+#X obj 273 340 print ORDER;
+#X obj 8 10 cnv 15 400 40 empty empty right_to_left_order 20 12 0 24
+-228992 -66577 0;
+#X text 212 188 <-- click here \,;
+#X text 10 65 In Pd \, you read a patch from right to left \, from
+top to bottom. Objects also output from right to left;
+#X obj 222 422 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.3
+;
+#X text 97 369 then check the Pd window to see the order;
+#X text 11 119 The [trigger] object is used to enforce execution order.
+If you need things to run in a certain sequence \, then use a [trigger].
+;
+#X text 206 403 For more info:;
+#X connect 0 0 1 0;
+#X connect 1 0 4 0;
+#X connect 1 1 3 0;
+#X connect 1 2 2 0;
+#X connect 2 0 5 0;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
diff --git a/doc/tutorials/intro/16.ordering_messages.pd b/doc/tutorials/intro/16.ordering_messages.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cd91201175036862732ad7349c73abc2969ee2d2
--- /dev/null
+++ b/doc/tutorials/intro/16.ordering_messages.pd
@@ -0,0 +1,44 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty ordering_messages 20 12 0 24
+-228992 -66577 0;
+#X text 10 62 Officially \, the execution order in Pd is undefined.
+;
+#X text 10 88 The [trigger] object allows you to specify the order
+of messages are sent. If you need to make sure that one thing runs
+before another \, use [trigger]:;
+#X obj 61 149 cnv 15 50 25 empty empty empty 20 12 0 14 -225271 -66577
+0;
+#X obj 242 149 cnv 15 50 25 empty empty empty 20 12 0 14 -225271 -66577
+0;
+#X msg 395 259 now;
+#X msg 316 260 this;
+#X msg 237 260 makes;
+#X msg 158 260 sense;
+#X msg 249 151 bang;
+#X msg 69 151 bang;
+#X obj 250 178 trigger bang bang bang bang bang bang;
+#X obj 157 325 mapping/tolist;
+#X obj 157 372 pddp/print;
+#X msg 478 258 bang;
+#X msg 80 260 bang;
+#X connect 5 0 12 0;
+#X connect 6 0 12 0;
+#X connect 7 0 12 0;
+#X connect 8 0 12 0;
+#X connect 9 0 11 0;
+#X connect 10 0 14 0;
+#X connect 10 0 15 0;
+#X connect 10 0 6 0;
+#X connect 10 0 5 0;
+#X connect 10 0 8 0;
+#X connect 10 0 7 0;
+#X connect 11 0 15 0;
+#X connect 11 1 8 0;
+#X connect 11 2 7 0;
+#X connect 11 3 6 0;
+#X connect 11 4 5 0;
+#X connect 11 5 14 0;
+#X connect 12 0 13 0;
+#X connect 14 0 12 1;
+#X connect 14 0 12 0;
+#X connect 15 0 12 1;
diff --git a/doc/tutorials/intro/17.top_to_bottom.pd b/doc/tutorials/intro/17.top_to_bottom.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2b875a397389e8bb671fbf30d21001f2d0869b2d
--- /dev/null
+++ b/doc/tutorials/intro/17.top_to_bottom.pd
@@ -0,0 +1,44 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty top_to_bottom 20 12 0 24 -228992
+-66577 0;
+#X msg 495 137 1;
+#X obj 495 164 + 1;
+#X floatatom 502 190 5 0 0 0 - - -;
+#X obj 495 214 + 1;
+#X floatatom 502 240 5 0 0 0 - - -;
+#X obj 495 264 + 1;
+#X floatatom 502 290 5 0 0 0 - - -;
+#X obj 495 314 + 1;
+#X floatatom 502 340 5 0 0 0 - - -;
+#X msg 106 273 1;
+#X obj 113 319 + 1;
+#X floatatom 148 272 5 0 0 0 - - -;
+#X obj 211 275 + 1;
+#X floatatom 239 329 5 0 0 0 - - -;
+#X obj 184 310 + 1;
+#X floatatom 289 281 5 0 0 0 - - -;
+#X obj 282 305 + 1;
+#X floatatom 289 331 5 0 0 0 - - -;
+#X text 15 175 The example below is just as functional as the example
+on the right. But the example on the right clearly shows the flow of
+the messages.;
+#X text 16 81 Messages flow from the top to the bottom of a patch \,
+always flowing from the outlets on the bottom to inlets on the top.
+Therefore it is also a good idea to structure your patch to represent
+that.;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 0 4 0;
+#X connect 4 0 5 0;
+#X connect 4 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 0 8 0;
+#X connect 8 0 9 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 11 0 13 0;
+#X connect 13 0 14 0;
+#X connect 13 0 15 0;
+#X connect 15 0 16 0;
+#X connect 15 0 17 0;
+#X connect 17 0 18 0;
diff --git a/doc/tutorials/intro/18.depth_first.pd b/doc/tutorials/intro/18.depth_first.pd
new file mode 100644
index 0000000000000000000000000000000000000000..38528693c0c54c07f8416bcd05eaea8366863bec
--- /dev/null
+++ b/doc/tutorials/intro/18.depth_first.pd
@@ -0,0 +1,34 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty depth_first 20 12 0 24 -228992
+-66577 0;
+#X obj 265 229 trigger bang bang;
+#X msg 215 338 add2 \$1;
+#X msg 112 234 set;
+#X msg 264 195 4;
+#X msg 265 262 3;
+#X msg 430 260 2;
+#X msg 430 295 1;
+#X text 57 376 see result here -->;
+#X obj 265 164 bng 25 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X text 12 66 Pd processes messages in "depth first". This means the
+bottom-most message in a chain runs first. Everything below a spot
+in a chain is run before. As you'll see from the example below \, the
+[4( message actually runs last \, since everything below it executed
+before it.;
+#X obj 223 430 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.2
+;
+#X msg 214 377 1 2 3 4;
+#X text 205 413 For more info:;
+#X text 8 234 clear the box:;
+#X connect 1 0 5 0;
+#X connect 1 1 6 0;
+#X connect 2 0 12 0;
+#X connect 3 0 12 0;
+#X connect 4 0 1 0;
+#X connect 4 0 2 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 6 0 2 0;
+#X connect 7 0 2 0;
+#X connect 9 0 4 0;
diff --git a/doc/tutorials/intro/19.storage_objects.pd b/doc/tutorials/intro/19.storage_objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..08a9ab98e2fbcc8aa403769c8908a0e58618a450
--- /dev/null
+++ b/doc/tutorials/intro/19.storage_objects.pd
@@ -0,0 +1,57 @@
+#N canvas 10 40 620 460 12;
+#X obj 277 25 import libdir iemlib;
+#X obj 122 89 symbol;
+#X obj 63 89 bang;
+#X obj 303 89 f;
+#X obj 208 89 float;
+#X text 268 89 aka;
+#X text 36 384 If a storage object receives a value on the left inlet
+\, then it outputs that value immediately in addition to storing it.
+;
+#X text 35 254 If a storage object receives a value on the right inlet
+\, then it stores that value.;
+#X text 28 123 If you bang the left inlet of a storage object \, it
+outputs its stored value.;
+#X obj 170 334 float;
+#X msg 195 302 123;
+#X obj 124 478 float;
+#X msg 170 452 123;
+#X msg 124 453 432;
+#X msg 237 301 321;
+#X floatatom 170 358 5 0 0 0 - - -;
+#X floatatom 185 228 5 0 0 0 - - -;
+#X floatatom 124 507 5 0 0 0 - - -;
+#X obj 12 13 cnv 15 400 40 empty empty storage_objects 20 12 0 24 -228992
+-66577 0;
+#X obj 185 199 float 5.5;
+#X text 98 58 A storage object stores data.;
+#X obj 362 89 list;
+#X obj 299 198 symbol yoyo;
+#X symbolatom 299 227 10 0 0 0 - - -;
+#X msg 185 171 bang;
+#X msg 299 170 bang;
+#X msg 132 303 bang;
+#X obj 320 329 symbol yoyo;
+#X symbolatom 320 358 10 0 0 0 - - -;
+#X msg 320 301 bang;
+#X msg 70 453 bang;
+#X msg 379 300 symbol one;
+#X msg 492 300 symbol two;
+#X obj 427 89 any;
+#X obj 477 89 pointer;
+#X connect 9 0 15 0;
+#X connect 10 0 9 1;
+#X connect 11 0 17 0;
+#X connect 12 0 11 1;
+#X connect 13 0 11 0;
+#X connect 14 0 9 1;
+#X connect 19 0 16 0;
+#X connect 22 0 23 0;
+#X connect 24 0 19 0;
+#X connect 25 0 22 0;
+#X connect 26 0 9 0;
+#X connect 27 0 28 0;
+#X connect 29 0 27 0;
+#X connect 30 0 11 0;
+#X connect 31 0 27 1;
+#X connect 32 0 27 1;
diff --git a/doc/tutorials/intro/20.creation_arguments.pd b/doc/tutorials/intro/20.creation_arguments.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7af673606d21bc96ff50ff9465dfa03d44a91c1b
--- /dev/null
+++ b/doc/tutorials/intro/20.creation_arguments.pd
@@ -0,0 +1,35 @@
+#N canvas 10 40 620 460 10;
+#X obj 438 85 float;
+#X text 20 72 Many objects can accept "arguments" to define their behavior.
+Here is a plain [float] object:;
+#X obj 438 143 float 5.5;
+#X obj 438 215 float 5.5;
+#X obj 438 197 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 438 236 5 0 0 0 - - -;
+#X obj 10 10 cnv 15 400 40 empty empty creation_arguments 20 12 0 24
+-228992 -66577 0;
+#X text 229 402 For more info:;
+#X obj 277 422 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s1.2
+;
+#X text 20 135 Here is a [float] object with a creation argument of
+"5.5":;
+#X text 20 187 Here \, the creation argument of "5.5" makes this [float]
+store the value 5.5 by default. Clicking the bang makes [float] output
+the value that it is currently storing:;
+#X obj 438 313 float 5.5;
+#X floatatom 438 334 7 0 0 0 - - -;
+#X obj 438 295 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 474 288 -123;
+#X msg 512 288 0.0044;
+#X text 20 286 On most objects \, the creation arguments can be replaced
+by data coming in from the inlets. With the [float] object \, the right
+inlet \, a cold inlet \, sets the value that the [float] object stores:
+;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 11 0 12 0;
+#X connect 13 0 11 0;
+#X connect 14 0 11 1;
+#X connect 15 0 11 1;
diff --git a/doc/tutorials/intro/21.atomic_messages.pd b/doc/tutorials/intro/21.atomic_messages.pd
new file mode 100644
index 0000000000000000000000000000000000000000..af66a35ba3481624b1dd1dc2962ef8c9a44fbfb4
--- /dev/null
+++ b/doc/tutorials/intro/21.atomic_messages.pd
@@ -0,0 +1,24 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 12 cnv 15 400 40 empty empty atomic_messages 20 12 0 24 -228992
+-66577 0;
+#X msg 69 191 symbol atom;
+#X msg 47 343 float 1.234;
+#X text 15 76 To send one piece of data to an object \, send an atomic
+message. There are atomic messages to match each of the atom types.
+;
+#X symbolatom 61 233 10 0 0 0 - - -;
+#X msg 54 165 atom;
+#X text 172 232 <-- the symbol box expects a symbol message;
+#X text 106 165 <-- this gives an error (check the Pd window);
+#X text 196 190 <-- this works;
+#X text 14 134 When using symbolic atoms \, the symbol message is essential:
+;
+#X floatatom 74 410 5 0 0 0 - - -;
+#X msg 84 374 362;
+#X text 17 273 When using numeric atoms \, the float message is optional.
+This is because the float message is automatically implied when sending
+a numeric atom:;
+#X connect 1 0 4 0;
+#X connect 2 0 10 0;
+#X connect 5 0 4 0;
+#X connect 11 0 10 0;
diff --git a/doc/tutorials/intro/22.selectors.pd b/doc/tutorials/intro/22.selectors.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5b322519dd22d8d6eb0a1bf949141d9d28c57746
--- /dev/null
+++ b/doc/tutorials/intro/22.selectors.pd
@@ -0,0 +1,44 @@
+#N canvas 10 40 620 460 12;
+#X obj 311 314 cnv 15 300 60 empty empty not_selectors 5 12 0 14 -261234
+-66577 0;
+#X obj 6 314 cnv 15 300 60 empty empty possible_selectors 5 12 0 14
+-204786 -66577 0;
+#X obj 8 -29 cnv 15 400 40 empty empty selectors 20 12 0 24 -228992
+-66577 0;
+#N canvas 10 40 620 460 object 0;
+#X obj 79 36 inlet;
+#X obj 86 270 outlet;
+#X obj 308 267 outlet;
+#X obj 71 131 route output-left output-right;
+#X connect 0 0 3 0;
+#X connect 3 0 1 0;
+#X connect 3 1 2 0;
+#X restore 51 201 pd object;
+#X floatatom 51 244 5 0 0 0 - - -;
+#X floatatom 136 244 5 0 0 0 - - -;
+#X msg 83 155 output-right 309;
+#X msg 50 105 output-left 8675;
+#X text 9 28 Every message has a selector. The selector is the first
+element in the message. It tells the object which receives that message
+what to do with it. A selector is basically like a command or a function.
+;
+#X text 220 106 <-- "output-left" is the selector;
+#X text 250 156 <-- "output-right" is the selector;
+#X text 205 377 For more info:;
+#X obj 223 394 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s3.1
+;
+#X text 19 348 symbol;
+#X text 179 320 list;
+#X text 159 349 my23;
+#X text 217 338 output-left;
+#X text 340 338 2523;
+#X text 466 320 -134.4;
+#X text 536 347 is \; next;
+#X text 8 272 The selector has a specific format. It needs to be a
+symbolic atom with no spaces \, semicolons \, or commas.;
+#X text 91 337 fl--^;
+#X text 403 351 my \, 23;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 6 0 3 0;
+#X connect 7 0 3 0;
diff --git a/doc/tutorials/intro/23.implied_selectors.pd b/doc/tutorials/intro/23.implied_selectors.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d7f22b15b3f026092718ffcdcaec2e723fb63c61
--- /dev/null
+++ b/doc/tutorials/intro/23.implied_selectors.pd
@@ -0,0 +1,64 @@
+#N canvas 10 40 620 460 12;
+#X obj 8 -29 cnv 15 400 40 empty empty implied_selectors 20 12 0 24
+-228992 -66577 0;
+#X msg 246 123 534 2334;
+#X msg 322 123 5 cats;
+#X floatatom 260 194 5 0 0 0 - - -;
+#X symbolatom 308 193 10 0 0 0 - - -;
+#X obj 213 214 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X obj 213 170 route bang float symbol list;
+#X obj 260 214 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 308 214 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 357 214 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 406 214 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144
+-1 -1;
+#X msg 206 93 12;
+#X obj 42 353 list;
+#X obj 42 377 pddp/print;
+#X msg 42 324 list 1 2 3;
+#X obj 252 377 pddp/print;
+#X msg 252 324 float 9876;
+#X obj 252 353 float;
+#X msg 136 93 0.0003;
+#X msg 385 123 1 2 3 4 5 6 7 8 9;
+#X text 14 29 In the case of messages whose first element is a numeric
+atom \, the selector is implied (either a "float" or a "list"):;
+#X msg 76 93 -999;
+#X obj 142 377 pddp/print;
+#X obj 142 353 route list;
+#X msg 142 324 list 1 2 3 4;
+#X obj 353 377 pddp/print;
+#X floatatom 353 355 9 0 0 0 - - -;
+#X msg 353 324 float -0.9876;
+#X obj 472 377 pddp/print;
+#X msg 472 324 float 782.32;
+#X obj 472 353 trigger float;
+#X text 12 259 Most objects output using the implied selector \, even
+converting messages with an explicit "list" or "float" selector:;
+#X connect 1 0 6 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X connect 4 0 8 0;
+#X connect 6 0 5 0;
+#X connect 6 1 3 0;
+#X connect 6 2 4 0;
+#X connect 6 3 9 0;
+#X connect 6 4 10 0;
+#X connect 11 0 6 0;
+#X connect 12 0 13 0;
+#X connect 14 0 12 0;
+#X connect 16 0 17 0;
+#X connect 17 0 15 0;
+#X connect 18 0 6 0;
+#X connect 19 0 6 0;
+#X connect 21 0 6 0;
+#X connect 23 0 22 0;
+#X connect 24 0 23 0;
+#X connect 26 0 25 0;
+#X connect 27 0 26 0;
+#X connect 29 0 30 0;
+#X connect 30 0 28 0;
diff --git a/doc/tutorials/intro/24.subpatches.pd b/doc/tutorials/intro/24.subpatches.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fc4ead01422008f2c3cf92203171250663127d3d
--- /dev/null
+++ b/doc/tutorials/intro/24.subpatches.pd
@@ -0,0 +1,27 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty subpatches 20 12 0 24 -228992
+-66577 0;
+#X text 12 69 Encapsulation is a key concept in Pd programming. Each
+object is an idea that is bundled up into an easy-to-use package. You
+should make encapsulated your ideas. Subpatches are the easiest way
+to do this.;
+#N canvas 10 40 620 460 what's 0;
+#X obj 140 91 loadbang;
+#X obj 139 149 float;
+#X obj 198 149 + 1;
+#X floatatom 139 221 5 0 0 0 - - -;
+#X obj 30 149 delay 1000;
+#X text 39 39 just counting away in here...;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 3 0;
+#X connect 1 0 4 0;
+#X connect 2 0 1 1;
+#X connect 4 0 1 0;
+#X restore 97 190 pd what's in here?;
+#X text 26 414 A subpatch is part of the same file \, its just a way
+of organizing the logic of a program.;
+#X text 19 271 To make a subpatch \, create an object that started
+with the word "pd" \, then type anything after that to identify it.
+Try making one below:;
+#X text 179 214 ^-- right-click here and select "Open";
diff --git a/doc/tutorials/intro/25.inlets_and_outlets.pd b/doc/tutorials/intro/25.inlets_and_outlets.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5dfe83713c82b831d4bd804dca9d5fb492c58e84
--- /dev/null
+++ b/doc/tutorials/intro/25.inlets_and_outlets.pd
@@ -0,0 +1,64 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty inlets_and_outlets 20 12 0 24
+-228992 -66577 0;
+#N canvas 10 40 620 460 look 0;
+#X obj 24 34 inlet;
+#X obj 238 47 inlet;
+#X obj 469 41 inlet;
+#X obj 251 304 outlet;
+#X msg 469 175 I am the third inlet;
+#X msg 242 145 I am the second inlet;
+#X msg 24 94 I am the first inlet;
+#X connect 0 0 6 0;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 3 0;
+#X restore 32 162 pd look inside me;
+#X obj 31 202 pddp/print_long;
+#X obj 32 129 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 114 129 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 197 129 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#N canvas 10 40 620 460 look 0;
+#X obj 20 34 inlet;
+#X obj 334 33 inlet;
+#X obj 528 35 inlet;
+#X obj 20 120 trigger bang anything;
+#X obj 224 404 outlet;
+#X obj 224 266 mapping/tolist;
+#X connect 0 0 3 0;
+#X connect 1 0 5 0;
+#X connect 2 0 5 0;
+#X connect 3 0 5 1;
+#X connect 3 1 5 0;
+#X connect 5 0 4 0;
+#X restore 199 376 pd look inside me;
+#X obj 198 416 pddp/print_long;
+#X msg 200 327 smokin!;
+#X msg 281 327 are;
+#X msg 363 327 you;
+#X text 17 259 The first inlet should be the hot inlet \, even in your
+own patches. There are times when you need to make other inlets hot
+\, but in general \, its a good rule to stick with.;
+#X obj 332 126 cnv 15 220 120 empty empty empty 20 12 0 14 -233017
+-66577 0;
+#X obj 347 132 inlet;
+#X obj 348 218 outlet;
+#X text 402 132 take in data;
+#X text 361 173 do some stuff here;
+#X text 418 217 output data;
+#X text 14 72 When making your own objects and subpatches \, you can
+create inlets and outlets using [inlet] and [outlet].;
+#X connect 1 0 2 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 1;
+#X connect 5 0 1 2;
+#X connect 6 0 7 0;
+#X connect 8 0 6 0;
+#X connect 9 0 6 1;
+#X connect 10 0 6 2;
+#X connect 13 0 14 0;
diff --git a/doc/tutorials/intro/26.outlet_order.pd b/doc/tutorials/intro/26.outlet_order.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4bfebf41f848634538ede1678b158d255b66ecae
--- /dev/null
+++ b/doc/tutorials/intro/26.outlet_order.pd
@@ -0,0 +1,32 @@
+#N canvas 10 40 620 460 12;
+#X text 223 149 <-- click here \,;
+#X obj 8 10 cnv 15 400 40 empty empty outlet_order 20 12 0 24 -228992
+-66577 0;
+#X msg 153 149 3 2 1;
+#X obj 101 234 print último;
+#X obj 388 234 print first;
+#X obj 240 234 print nächste;
+#X text 19 374 There are occasional exceptions where it makes sense
+to break this convention. But you shouldn't do it unless it really
+is necessary. This will save you in the long run.;
+#X text 15 80 Just like the flow of programming in Pd \, the data should
+be output from right to left.;
+#N canvas 10 40 620 460 spread 0;
+#X obj 68 2 inlet;
+#X obj 38 235 outlet;
+#X obj 201 235 outlet;
+#X obj 345 235 outlet;
+#X obj 66 109 unpack float float float;
+#X connect 0 0 4 0;
+#X connect 4 0 1 0;
+#X connect 4 1 2 0;
+#X connect 4 2 3 0;
+#X restore 153 188 pd spread the love;
+#X text 18 310 While there is nothing forcing you to output data to
+the outlets in any order \, Pd has a very strong convention for how
+data should be output from an object.;
+#X text 175 259 now check the Pd window;
+#X connect 2 0 8 0;
+#X connect 8 0 3 0;
+#X connect 8 1 5 0;
+#X connect 8 2 4 0;
diff --git a/doc/tutorials/intro/27.Example-all_just_data.pd b/doc/tutorials/intro/27.Example-all_just_data.pd
new file mode 100644
index 0000000000000000000000000000000000000000..9f18651eeca347b597e0a40bcdf4941976560534
--- /dev/null
+++ b/doc/tutorials/intro/27.Example-all_just_data.pd
@@ -0,0 +1,122 @@
+#N canvas 10 40 620 460 12;
+#X obj 208 229 import Gem;
+#X text 217 160 caught you peeking!!;
+#X text 197 255 (this just makes sure the;
+#X text 200 271 right libraries are loaded);
+#X obj 193 124 unauthorized/grid grid1 200 0 199 200 0 199 1 1 1 10 10 245 211;
+#X obj 25 55 pddp/dsp;
+#X text 140 11 Its all just data. Use it however you want!;
+#X obj 193 372 nbx 5 24 -1e+37 1e+37 0 0 empty empty X -15 12 1 18
+-166441 -1 -1 0 256;
+#X obj 386 371 nbx 5 24 -1e+37 1e+37 0 0 empty empty Y -15 12 1 18
+-166441 -1 -1 0 256;
+#X text 40 207 this box ------->;
+#N canvas 10 40 620 460 open 0;
+#X obj 314 7 cnv 15 300 40 empty empty Y_input 120 20 0 14 -228856
+-66577 0;
+#X obj 8 7 cnv 15 300 40 empty empty X_input 120 20 0 14 -228856 -66577
+0;
+#X obj 314 52 cnv 15 300 230 empty empty gemwin 248 220 0 14 -203904
+-66577 0;
+#X obj 8 229 cnv 15 300 220 empty empty sphere 249 209 0 14 -204800
+-66577 0;
+#X obj 8 52 cnv 15 300 170 empty empty audio 257 160 0 14 -262130 -66577
+0;
+#X obj 314 289 cnv 15 300 160 empty empty lighting 234 149 0 14 -232576
+-66577 0;
+#X obj 17 18 inlet;
+#X obj 321 18 inlet;
+#X obj 52 141 osc~;
+#X obj 82 172 *~;
+#X obj 104 88 / 200;
+#X obj 70 199 dac~;
+#X obj 426 59 receive pd;
+#X msg 444 193 create;
+#X msg 410 193 1;
+#X obj 426 255 gemwin;
+#X msg 578 193 0;
+#X msg 516 193 destroy;
+#X obj 426 110 select 1;
+#X obj 426 84 route dsp;
+#X obj 87 236 gemhead;
+#X obj 87 424 sphere 1 20;
+#X obj 87 403 translateXYZ;
+#X obj 87 310 colorRGB 1 1 1 1;
+#X msg 325 193 lighting 1;
+#X obj 415 329 gemhead;
+#X obj 416 394 world_light -120;
+#X obj 202 353 / 25;
+#X obj 24 353 / 25;
+#X obj 202 332 - 100;
+#X obj 24 332 - 100;
+#X obj 143 263 / 200;
+#X obj 52 263 / 200;
+#X obj 51 89 + 250;
+#X obj 114 147 line~;
+#X obj 185 71 bang;
+#X msg 185 117 0 250;
+#X obj 185 94 delay 200;
+#X obj 325 151 trigger bang bang;
+#X obj 479 151 trigger bang bang;
+#X text 346 106 on;
+#X text 522 107 off;
+#X text 91 262 red;
+#X text 178 263 green;
+#X text 36 316 X;
+#X text 218 315 Y;
+#X floatatom 202 376 5 0 0 0 - - -;
+#X floatatom 24 376 5 0 0 0 - - -;
+#X obj 104 111 pack 0 25;
+#X text 54 107 freq.;
+#X text 225 73 off;
+#X text 109 71 on;
+#X connect 6 0 10 0;
+#X connect 6 0 30 0;
+#X connect 6 0 32 0;
+#X connect 6 0 35 0;
+#X connect 7 0 29 0;
+#X connect 7 0 31 0;
+#X connect 7 0 33 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 9 0 11 1;
+#X connect 10 0 48 0;
+#X connect 12 0 19 0;
+#X connect 13 0 15 0;
+#X connect 14 0 15 0;
+#X connect 16 0 15 0;
+#X connect 17 0 15 0;
+#X connect 18 0 38 0;
+#X connect 18 1 39 0;
+#X connect 19 0 18 0;
+#X connect 20 0 23 0;
+#X connect 22 0 21 0;
+#X connect 23 0 22 0;
+#X connect 24 0 15 0;
+#X connect 25 0 26 0;
+#X connect 27 0 22 2;
+#X connect 27 0 46 0;
+#X connect 28 0 22 1;
+#X connect 28 0 47 0;
+#X connect 29 0 27 0;
+#X connect 30 0 28 0;
+#X connect 31 0 23 2;
+#X connect 32 0 23 1;
+#X connect 33 0 8 0;
+#X connect 34 0 9 1;
+#X connect 35 0 37 0;
+#X connect 36 0 34 0;
+#X connect 37 0 36 0;
+#X connect 38 0 14 0;
+#X connect 38 0 24 0;
+#X connect 38 1 13 0;
+#X connect 39 0 17 0;
+#X connect 39 1 16 0;
+#X connect 48 0 34 0;
+#X restore 267 341 pd open me;
+#X text 26 77 ^-- 1) click here to turn it on and off;
+#X text 40 192 2) click and drag in;
+#X connect 4 0 7 0;
+#X connect 4 0 10 0;
+#X connect 4 1 8 0;
+#X connect 4 1 10 1;
diff --git a/doc/tutorials/intro/28.EXERCISE-hmmm.pd b/doc/tutorials/intro/28.EXERCISE-hmmm.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4c657683b4771e9ccb7f6ccaa3ffe69c192f7c93
--- /dev/null
+++ b/doc/tutorials/intro/28.EXERCISE-hmmm.pd
@@ -0,0 +1,97 @@
+#N canvas 10 40 620 460 12;
+#N canvas 10 40 620 460 guts 0;
+#X msg 280 45 \; pd filename exercise-patch.pd /tmp \; #N canvas \;
+#X pop 1 \;;
+#X obj 300 328 s pd-exercise-patch.pd;
+#X msg 329 216 obj 50 103 osc~;
+#X msg 330 240 obj 50 153 dac~;
+#X obj 103 17 inlet;
+#X msg 320 155 clear;
+#X obj 276 7 loadbang;
+#X obj 259 108 delay 1000;
+#X obj 259 129 t b b b b;
+#X msg 52 155 connect 0 0 1 0;
+#X msg 37 216 connect 1 0 2 0;
+#X msg 31 266 connect 1 0 2 1;
+#X msg 292 27 \; pd dsp 1;
+#X obj 112 108 t b b;
+#X msg 87 52 bang;
+#X obj 34 134 delay 2000;
+#X obj 21 187 delay 2000;
+#X obj 10 245 delay 2000;
+#N canvas 10 40 620 460 connection-effect 0;
+#X obj 186 312 dac~;
+#X obj 72 233 osc~ 1000;
+#X obj 138 266 *~;
+#X obj 253 259 *~;
+#X obj 204 236 osc~ 800;
+#X obj 153 236 line~;
+#X obj 183 7 inlet;
+#X msg 184 31 bang;
+#X obj 187 61 t b b;
+#X obj 168 95 delay 10;
+#X msg 201 125 0 10;
+#X obj 276 218 line~;
+#X obj 276 191 pipe 30;
+#X msg 241 125 1 10;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 4 0 3 0;
+#X connect 5 0 2 1;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 1 13 0;
+#X connect 9 0 10 0;
+#X connect 10 0 5 0;
+#X connect 10 0 12 0;
+#X connect 11 0 3 1;
+#X connect 12 0 11 0;
+#X connect 13 0 5 0;
+#X connect 13 0 12 0;
+#X restore 22 365 pd connection-effect;
+#X msg 256 453 floatatom 50 50 5 0 0 0;
+#X msg 327 184 obj 50 50 hsl;
+#X obj 197 18 inlet;
+#X msg 205 50 bang;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 14 0;
+#X connect 5 0 1 0;
+#X connect 6 0 0 0;
+#X connect 6 0 7 0;
+#X connect 6 0 12 0;
+#X connect 7 0 8 0;
+#X connect 8 0 3 0;
+#X connect 8 1 2 0;
+#X connect 8 2 20 0;
+#X connect 8 3 5 0;
+#X connect 9 0 1 0;
+#X connect 10 0 1 0;
+#X connect 11 0 1 0;
+#X connect 13 0 15 0;
+#X connect 13 1 8 0;
+#X connect 14 0 13 0;
+#X connect 15 0 16 0;
+#X connect 15 0 9 0;
+#X connect 15 0 18 0;
+#X connect 16 0 17 0;
+#X connect 16 0 10 0;
+#X connect 16 0 18 0;
+#X connect 17 0 11 0;
+#X connect 17 0 18 0;
+#X connect 20 0 1 0;
+#X connect 21 0 22 0;
+#X connect 22 0 8 0;
+#X restore 220 269 pd guts;
+#X msg 220 242 solve;
+#X text 19 64 In the exercise patch \, connect the existing objects
+so that you can control the frequency of the oscillator and hear the
+resulting sound.;
+#X text 22 131 If you want help \, click the solve message below.;
+#X msg 285 242 try again;
+#X obj 11 10 cnv 15 600 40 empty empty EXERCISE-make_your_first_patch
+20 12 0 24 -262131 -66577 0;
+#X connect 1 0 0 0;
+#X connect 4 0 0 1;
diff --git a/doc/tutorials/intro/29.turning_on_and_off.pd b/doc/tutorials/intro/29.turning_on_and_off.pd
new file mode 100644
index 0000000000000000000000000000000000000000..52f49fd66998f076386846d6a2d66df61b0f858f
--- /dev/null
+++ b/doc/tutorials/intro/29.turning_on_and_off.pd
@@ -0,0 +1,50 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty turning_on_and_off 20 12 0 24
+-228992 -66577 0;
+#X obj 160 122 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X text 183 122 <-- click here;
+#X obj 160 171 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 15 371 The object is called [tgl] or you can get it from the
+"Put" menu.;
+#X text 14 63 Many objects can be switched on and off using a toggle.
+A toggle outputs 0 for off \, and an number for on.;
+#X text 11 217 By default \, a toggle outputs 1 for on \, but you can
+change that to any number by selecting the "Properties" dialog.;
+#X obj 33 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X floatatom 33 324 5 0 0 0 - - -;
+#X obj 103 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 100
+100;
+#X floatatom 103 324 5 0 0 0 - - -;
+#X obj 173 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 9e-22
+;
+#X floatatom 173 324 5 0 0 0 - - -;
+#X obj 243 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 -0.034
+;
+#X floatatom 243 324 5 0 0 0 - - -;
+#X obj 313 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 23
+;
+#X floatatom 313 324 5 0 0 0 - - -;
+#X obj 383 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 99999
+;
+#X floatatom 383 324 5 0 0 0 - - -;
+#X obj 453 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X floatatom 453 324 5 0 0 0 - - -;
+#X obj 523 290 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 100
+;
+#X floatatom 523 324 5 0 0 0 - - -;
+#X text 186 171 bangs once every second (1000ms);
+#X obj 160 145 metro 1000;
+#X connect 1 0 24 0;
+#X connect 7 0 8 0;
+#X connect 9 0 10 0;
+#X connect 11 0 12 0;
+#X connect 13 0 14 0;
+#X connect 15 0 16 0;
+#X connect 17 0 18 0;
+#X connect 19 0 20 0;
+#X connect 21 0 22 0;
+#X connect 24 0 3 0;
diff --git a/doc/tutorials/intro/30.properties.pd b/doc/tutorials/intro/30.properties.pd
new file mode 100644
index 0000000000000000000000000000000000000000..aaa3db98e5fa174f0683dbeeb001d0afead0ac6b
--- /dev/null
+++ b/doc/tutorials/intro/30.properties.pd
@@ -0,0 +1,16 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty properties 20 12 0 24 -228992
+-66577 0;
+#X obj 260 148 tgl 200 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0
+12345;
+#X text 13 65 Many objects have properties that affect how the behave
+and look. You can see and edit these properties by opening the Properties
+panel. Below is a giant toggle. If you right-click on it \, and select
+"Properties" \, you can see the properties.;
+#X floatatom 260 353 5 0 0 0 - - -;
+#X text 18 387 You'll see in the properties panel that "size" is set
+to 200 pixels and "value" is set to 12345 \, so the toggle outputs
+12345 when its turned on.;
+#X text 15 221 right-click on this -->;
+#X text 15 240 and select "Properties";
+#X connect 1 0 3 0;
diff --git a/doc/tutorials/intro/31.sliders.pd b/doc/tutorials/intro/31.sliders.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e6742445042c4d75e930fc65383d76c344a4fa2a
--- /dev/null
+++ b/doc/tutorials/intro/31.sliders.pd
@@ -0,0 +1,42 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty sliders 20 12 0 24 -228992 -66577
+0;
+#X obj 120 105 vsl 15 128 0 127 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X floatatom 120 247 5 0 0 0 - - -;
+#X obj 338 106 vsl 15 128 0 1 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X floatatom 338 248 5 0 0 0 - - -;
+#X floatatom 253 423 5 0 0 0 - - -;
+#X msg 356 360 1000;
+#X msg 271 360 100;
+#X msg 227 360 60;
+#X msg 313 360 127;
+#X text 9 61 Sliders are generally useful for controlling things over
+a range of numbers \, like a color or loudness.;
+#X text 144 130 by default \,;
+#X text 144 152 they range;
+#X text 142 174 from 0 to 127;
+#X text 363 138 0 to 1 is a;
+#X text 361 160 commonly used;
+#X text 361 181 range;
+#X obj 257 400 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X msg 185 360 0;
+#X msg 140 360 -23;
+#X text 16 276 They act very similarly to number boxes \, except they
+show their value graphically rather that with numbers. One difference
+is that sliders always limit the range of numbers that can pass thru:
+;
+#X obj 234 424 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 1 0 2 0;
+#X connect 3 0 4 0;
+#X connect 6 0 17 0;
+#X connect 7 0 17 0;
+#X connect 8 0 17 0;
+#X connect 9 0 17 0;
+#X connect 17 0 5 0;
+#X connect 17 0 21 0;
+#X connect 18 0 17 0;
+#X connect 19 0 17 0;
diff --git a/doc/tutorials/intro/32.gui_objects.pd b/doc/tutorials/intro/32.gui_objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fc2c33a510179c53f755580bb1750abcd0af90e4
--- /dev/null
+++ b/doc/tutorials/intro/32.gui_objects.pd
@@ -0,0 +1,68 @@
+#N canvas 10 40 620 460 10;
+#X obj 420 33 import libdir cyclone flatgui;
+#X obj 11 57 cnv 15 600 650 empty empty empty 20 12 0 14 -262131 -66577
+0;
+#X obj 11 348 cnv 15 400 100 empty empty empty 20 12 0 14 -261696 -66577
+0;
+#X obj 11 57 cnv 15 400 300 empty empty empty 20 12 0 14 -241657 -66577
+0;
+#X obj 30 110 bng 15 250 50 0 \$1 \$1 empty 20 8 0 8 -262144 -1 -1
+;
+#X obj 30 142 tgl 15 1.04858e+06 empty \$2 empty 20 8 0 8 -262144 -1
+-1 0 1;
+#X obj 34 188 vsl 15 128 0 127 0 1.04858e+06 empty \$3 empty 20 8 0
+8 -262144 -1 -1 0 1;
+#X obj 191 318 hsl 128 15 0 127 0 0 empty empty empty 20 8 0 8 -262144
+-1 -1 0 1;
+#X obj 201 289 hdl 15 1 2.6624e+06 8 \$5 \$5 empty 20 8 192 8 -262144
+-1 -1 0;
+#X obj 254 127 vu 15 120 \$6 empty 35 8 0 8 -66577 -1 1 0;
+#X obj 111 109 cnv 15 100 60 empty empty [canvas] 20 12 0 14 -233017
+-66577 1.04858e+06;
+#X obj 126 189 vdl 15 1 4.79232e+06 8 \$9 \$9 empty 20 8 192 8 -262144
+-1 -1 0;
+#X obj 341 116 nbx 5 14 -1e+37 1e+37 0 0 \$5 \$5 empty 45 7 0 10 -262144
+-1 -1 0 256;
+#X text 17 66 Pd comes with a standard \, built-in set of GUI elements
+\, which you can select from the "Put" menu.;
+#X text 17 356 There are also some OS-native GUI elements available
+;
+#X obj 49 404 ggee/button OK;
+#X obj 147 408 popup 124 25 #ffffff popup option;
+#X obj 333 404 ggee/ticker ;
+#X obj 324 529 ggee/envgen 200 140 1 0  ;
+#X obj 491 454 knob 32 32 0 127 0 0 empty empty empty 0 -8 32 8 -262144
+-1 -1 0 1;
+#X text 485 428 [knob];
+#X text 316 381 [ticker];
+#X text 390 505 [envgen];
+#X text 449 90 [cyclone/Scope~];
+#X text 40 380 [button];
+#X text 134 382 [popup];
+#X text 250 107 [vu];
+#X text 46 109 [bng];
+#X text 46 141 [tgl];
+#X text 21 320 [vslider];
+#X text 325 288 [hradio];
+#X text 325 318 [hslider];
+#X text 107 317 [vradio];
+#X obj 441 112 Scope~ 130 130 256 3 128 -1 1 0 0 0 0 102 255 51 135
+135 135 0;
+#X text 337 98 [nbx];
+#X obj 461 299 ggee/gcanvas 80 80;
+#X text 472 274 [gcanvas];
+#X obj 51 472 unauthorized/grid grid1 200 0 199 200 0 199 1 1 1 10 10 133 520;
+#X text 71 453 [unauthorized/grid];
+#X floatatom 462 386 5 0 0 0 - - -;
+#X floatatom 534 387 5 0 0 0 - - -;
+#X obj 10 10 cnv 15 400 40 empty empty gui_objects 20 12 0 24 -228992
+-66577 0;
+#X floatatom 244 680 5 0 0 0 - - -;
+#X floatatom 51 679 5 0 0 0 - - -;
+#X floatatom 491 492 5 0 0 0 - - -;
+#X text 422 67 And various others:;
+#X connect 19 0 44 0;
+#X connect 35 0 39 0;
+#X connect 35 1 40 0;
+#X connect 37 0 43 0;
+#X connect 37 1 42 0;
diff --git a/doc/tutorials/intro/33.guis.pd b/doc/tutorials/intro/33.guis.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2949b96372af9f51248e8d4e7fbbdad0c13af038
--- /dev/null
+++ b/doc/tutorials/intro/33.guis.pd
@@ -0,0 +1,813 @@
+#N canvas 10 40 620 460 10;
+#X obj -4 -4 cnv 15 620 700 empty empty gui-INTRO 237 20 2 14 -261819
+-143491 0;
+#X text 101 4 bng;
+#X obj 456 313 vsl 15 128 0 127 0 0 empty empty default_15x128 8 -8
+0 8 -262144 -1 -1 0 1;
+#X obj 354 42 tgl 100 1 empty empty 100_pix 8 -8 0 8 -250685 -24198
+-42246 1 1;
+#X obj 57 251 hsl 128 15 0 127 0 0 empty empty default_128x15 8 -8
+0 8 -262144 -1 -1 0 1;
+#X obj 78 226 hsl 20 8 0 19 0 0 empty empty min_20x8 8 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 478 326 vsl 8 20 0 19 0 0 empty empty min_8x20 8 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 458 48 tgl 8 0 empty empty min_8 8 -8 0 8 -262144 -1 -1 0 1
+;
+#X obj 458 71 tgl 15 0 empty empty default_15 8 -8 0 8 -262144 -1 -1
+0 1;
+#X obj 459 109 tgl 30 0 empty empty 30_pix 8 -8 0 8 -262144 -1 -1 0
+1;
+#X obj 101 88 bng 30 250 50 0 empty empty 30_pix 8 -8 0 8 -262144 -1
+-1;
+#X obj 412 304 vsl 30 250 0 249 0 1 empty empty 30x250 8 -8 0 8 -184301
+-42886 -42246 21800 1;
+#X obj 7 271 hsl 251 30 0 250 0 1 empty empty 251x30 8 -8 0 8 -147456
+-1109 -66577 12500 1;
+#X text 180 518 (c) musil@iem.kug.ac.at;
+#X text 222 531 IEM KUG;
+#X text 197 543 graz \, austria 2001;
+#X obj 40 343 vu 25 200 empty empty 8 -8 0 8 -1 -99865 1 0;
+#X obj 13 24 bng 75 5000 25 1 empty empty 75pix+init 8 -8 0 8 -262131
+-261458 -123526;
+#X obj 100 376 vu 15 120 empty empty 8 -8 0 8 -66577 -1 1 0;
+#X obj 186 375 vu 10 80 empty empty 8 -8 0 8 -66577 -1 1 0;
+#X text 99 313 vu;
+#N canvas 10 40 620 460 animate_vu 0;
+#X obj 40 211 t f f;
+#X obj 65 233 + 6;
+#X obj 40 257 pack 0 0;
+#X obj 78 94 tgl 15 0 empty empty empty 8 -8 0 10 -262144 -1 -1 1 1
+;
+#X obj 78 115 sel 0 1;
+#X obj 78 74 metro 4000;
+#X msg 100 137 30 3000;
+#X msg 78 167 -130 3000;
+#X obj 40 189 line -130 50;
+#X obj 78 51 inlet;
+#X obj 40 316 outlet;
+#X obj 87 316 outlet;
+#X obj 134 316 outlet;
+#X connect 0 0 2 0;
+#X connect 0 1 1 0;
+#X connect 1 0 2 1;
+#X connect 2 0 10 0;
+#X connect 2 0 11 0;
+#X connect 2 0 12 0;
+#X connect 3 0 4 0;
+#X connect 4 0 7 0;
+#X connect 4 1 6 0;
+#X connect 5 0 3 0;
+#X connect 6 0 8 0;
+#X connect 7 0 8 0;
+#X connect 8 0 0 0;
+#X connect 9 0 5 0;
+#X restore 99 349 pd animate_vu;
+#X obj 99 331 tgl 15 1 empty empty empty 8 -8 0 10 -262144 -1 -1 1
+1;
+#X text 360 8 toggle = tgl;
+#X text 68 198 hslider = hsl;
+#X text 430 271 vslider = vsl;
+#X obj 13 160 print initial_bang;
+#X obj 21 118 bng 15 250 50 0 empty empty default_15 8 -8 0 8 -262144
+-1 -1;
+#X obj 104 48 bng 8 250 50 0 empty empty min_8 8 -8 0 10 -262144 -1
+-1;
+#X obj 21 137 print no_initial_bang;
+#X obj 283 324 cnv 15 100 30 empty empty empty 20 12 2 20 -225271 -66577
+0;
+#X obj 283 355 cnv 15 100 30 empty empty empty 20 12 2 20 -225280 -66577
+0;
+#X obj 283 386 cnv 15 100 30 empty empty empty 20 12 2 20 -261681 -66577
+0;
+#X obj 283 417 cnv 15 100 30 empty empty empty 20 12 2 20 -257472 -66577
+0;
+#X obj 172 375 vu 10 80 empty empty 8 -8 0 8 -66577 -1 0 0;
+#X obj 310 203 hradio 15 1 1 8 empty empty default_8*15 8 -8 0 8 -262144
+-1 -1 2;
+#X obj 254 223 hradio 25 1 1 12 empty empty 12*25 8 -8 0 8 -1433 -225280
+-355 1;
+#N canvas 10 40 620 460 nervous 0;
+#X obj 10 23 tgl 55 1 empty start_nervously1 start_it 8 -8 0 10 -260818
+-1 -250685 0 1;
+#X obj 131 141 bng 51 1200 50 0 empty nerv_bng bang 8 -8 0 10 -253378
+-137031 -222091;
+#X obj 120 418 hsl 22 12 0 127 0 0 empty nerv_hsl h-slider 8 -8 0 10
+-71033 -66198 -128091 0 1;
+#X obj 448 140 tgl 11 1 empty nerv_tgl toggle 8 -8 0 10 -141355 -82199
+-51488 0 1;
+#X obj 447 383 vsl 15 111 0 127 0 0 empty nerv_vsl v-slider 8 -8 0
+10 -150187 -73940 -248863 0 1;
+#N canvas 10 40 620 460 control 0;
+#X obj 19 21 inlet;
+#X obj 19 50 t b f;
+#X obj 19 153 del 900;
+#X obj 19 212 del 900;
+#X obj 19 93 del 100;
+#X obj 19 283 del 900;
+#X obj 33 125 f;
+#X obj 33 180 f;
+#X obj 33 245 f;
+#X obj 33 309 f;
+#N canvas 10 40 620 460 bng 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 85 53 t b b b;
+#X obj 234 368 pack 0 0 0;
+#X obj 250 29 metro 2000;
+#X obj 445 122 random 555666;
+#X obj 445 168 + 8;
+#X obj 445 145 % 120;
+#X obj 84 32 metro 100;
+#X obj 234 261 random 1.67772e+07;
+#X obj 266 283 random 1.67772e+07;
+#X obj 299 315 random 1.67772e+07;
+#X obj 84 11 inlet;
+#X msg 64 312 \; nerv_bng delta \$1 \$2;
+#X msg 234 390 \; nerv_bng color \$1 \$2 \$3;
+#X msg 445 192 \; nerv_bng size \$1;
+#X msg 250 51 \; nerv_bng bang;
+#X obj 234 340 * -1;
+#X obj 266 316 * -1;
+#X obj 299 342 * -1;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 22 0;
+#X connect 11 0 3 0;
+#X connect 11 0 14 0;
+#X connect 11 0 18 0;
+#X connect 11 1 4 0;
+#X connect 11 1 19 0;
+#X connect 11 2 20 0;
+#X connect 12 0 23 0;
+#X connect 13 0 25 0;
+#X connect 14 0 16 0;
+#X connect 15 0 24 0;
+#X connect 16 0 15 0;
+#X connect 17 0 11 0;
+#X connect 18 0 26 0;
+#X connect 19 0 27 0;
+#X connect 20 0 28 0;
+#X connect 21 0 17 0;
+#X connect 21 0 13 0;
+#X connect 26 0 12 0;
+#X connect 27 0 12 1;
+#X connect 28 0 12 2;
+#X restore 114 143 pd bng;
+#N canvas 10 40 620 460 tgl 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 85 53 t b b b;
+#X obj 445 122 random 555666;
+#X obj 445 168 + 8;
+#X obj 445 144 % 120;
+#X obj 85 31 metro 100;
+#X obj 264 28 metro 1000;
+#X obj 85 10 inlet;
+#X msg 64 312 \; nerv_tgl delta \$1 \$2;
+#X msg 226 322 \; nerv_tgl color \$1 \$2 \$3;
+#X msg 445 192 \; nerv_tgl size \$1;
+#X msg 264 51 \; nerv_tgl bang;
+#X obj 226 298 pack 0 0 0;
+#X obj 226 191 random 1.67772e+07;
+#X obj 258 213 random 1.67772e+07;
+#X obj 291 245 random 1.67772e+07;
+#X obj 226 270 * -1;
+#X obj 258 246 * -1;
+#X obj 291 272 * -1;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 18 0;
+#X connect 11 0 3 0;
+#X connect 11 0 12 0;
+#X connect 11 0 23 0;
+#X connect 11 1 4 0;
+#X connect 11 1 24 0;
+#X connect 11 2 25 0;
+#X connect 12 0 14 0;
+#X connect 13 0 20 0;
+#X connect 14 0 13 0;
+#X connect 15 0 11 0;
+#X connect 16 0 21 0;
+#X connect 17 0 15 0;
+#X connect 17 0 16 0;
+#X connect 22 0 19 0;
+#X connect 23 0 26 0;
+#X connect 24 0 27 0;
+#X connect 25 0 28 0;
+#X connect 26 0 22 0;
+#X connect 27 0 22 1;
+#X connect 28 0 22 2;
+#X restore 114 198 pd tgl;
+#N canvas 10 40 620 460 hsl 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 85 53 t b b b;
+#X obj 445 122 random 555666;
+#X obj 560 188 + 8;
+#X obj 560 128 random 773322;
+#X obj 445 208 pack 0 0;
+#X obj 84 32 metro 100;
+#X obj 561 155 % 30;
+#X obj 445 183 + 20;
+#X obj 446 149 % 110;
+#X obj 254 305 metro 1000;
+#X obj 254 327 random 846352;
+#X obj 254 350 % 130;
+#X obj 84 11 inlet;
+#X msg 64 321 \; nerv_hsl delta \$1 \$2;
+#X msg 254 373 \; nerv_hsl set \$1;
+#X msg 445 231 \; nerv_hsl size \$1 \$2;
+#X obj 245 202 pack 0 0 0;
+#X obj 245 95 random 1.67772e+07;
+#X obj 277 117 random 1.67772e+07;
+#X obj 310 149 random 1.67772e+07;
+#X obj 245 174 * -1;
+#X obj 277 150 * -1;
+#X obj 310 176 * -1;
+#X msg 245 229 \; nerv_hsl color \$1 \$2 \$3;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 24 0;
+#X connect 11 0 3 0;
+#X connect 11 0 12 0;
+#X connect 11 0 28 0;
+#X connect 11 1 4 0;
+#X connect 11 1 14 0;
+#X connect 11 1 29 0;
+#X connect 11 2 30 0;
+#X connect 12 0 19 0;
+#X connect 13 0 15 1;
+#X connect 14 0 17 0;
+#X connect 15 0 26 0;
+#X connect 16 0 11 0;
+#X connect 17 0 13 0;
+#X connect 18 0 15 0;
+#X connect 18 0 22 1;
+#X connect 19 0 18 0;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 22 0 25 0;
+#X connect 23 0 16 0;
+#X connect 23 0 20 0;
+#X connect 27 0 34 0;
+#X connect 28 0 31 0;
+#X connect 29 0 32 0;
+#X connect 30 0 33 0;
+#X connect 31 0 27 0;
+#X connect 32 0 27 1;
+#X connect 33 0 27 2;
+#X restore 112 263 pd hsl;
+#N canvas 10 40 620 460 vsl 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 85 53 t b b b;
+#X obj 445 122 random 555666;
+#X obj 560 128 random 773322;
+#X obj 445 208 pack 0 0;
+#X obj 84 32 metro 100;
+#X obj 241 299 metro 1000;
+#X obj 240 325 random 846352;
+#X obj 241 352 % 130;
+#X obj 561 155 % 110;
+#X obj 560 188 + 20;
+#X obj 446 149 % 30;
+#X obj 445 183 + 3;
+#X obj 84 11 inlet;
+#X msg 239 227 \; nerv_vsl color \$1 \$2 \$3;
+#X msg 445 231 \; nerv_vsl size \$1 \$2;
+#X msg 64 310 \; nerv_vsl delta \$1 \$2;
+#X msg 241 376 \; nerv_vsl set \$1;
+#X obj 239 203 pack 0 0 0;
+#X obj 239 96 random 1.67772e+07;
+#X obj 271 118 random 1.67772e+07;
+#X obj 304 150 random 1.67772e+07;
+#X obj 239 175 * -1;
+#X obj 271 151 * -1;
+#X obj 304 177 * -1;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 26 0;
+#X connect 11 0 3 0;
+#X connect 11 0 12 0;
+#X connect 11 0 29 0;
+#X connect 11 1 4 0;
+#X connect 11 1 13 0;
+#X connect 11 1 30 0;
+#X connect 11 2 31 0;
+#X connect 12 0 21 0;
+#X connect 13 0 19 0;
+#X connect 14 0 25 0;
+#X connect 15 0 11 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 27 0;
+#X connect 19 0 20 0;
+#X connect 20 0 14 1;
+#X connect 20 0 18 1;
+#X connect 21 0 22 0;
+#X connect 22 0 14 0;
+#X connect 23 0 15 0;
+#X connect 23 0 16 0;
+#X connect 28 0 24 0;
+#X connect 29 0 32 0;
+#X connect 30 0 33 0;
+#X connect 31 0 34 0;
+#X connect 32 0 28 0;
+#X connect 33 0 28 1;
+#X connect 34 0 28 2;
+#X restore 113 327 pd vsl;
+#X connect 0 0 1 0;
+#X connect 1 0 4 0;
+#X connect 1 1 6 1;
+#X connect 1 1 7 1;
+#X connect 1 1 8 1;
+#X connect 1 1 9 1;
+#X connect 2 0 3 0;
+#X connect 2 0 7 0;
+#X connect 3 0 5 0;
+#X connect 3 0 8 0;
+#X connect 4 0 2 0;
+#X connect 4 0 6 0;
+#X connect 5 0 9 0;
+#X connect 6 0 10 0;
+#X connect 7 0 11 0;
+#X connect 8 0 12 0;
+#X connect 9 0 13 0;
+#X restore 10 85 pd control;
+#X connect 0 0 5 0;
+#X restore 295 424 pd nervous;
+#X floatatom 239 84 4 0 0 0 - - -;
+#N canvas 10 40 620 460 properties 0;
+#X obj 2 1 cnv 8 870 590 empty empty about_gui_properties 290 20 2
+18 -225280 -1109 0;
+#X text 12 62 "selectable dimensions(pix): size:" = square-size of
+the;
+#X text 10 35 "dimensions(pix): size:" = square-size of the gui-objects
+;
+#X text 10 48 "dimensions(pix)(pix): width: height:" = width & height
+;
+#X text 11 177 "visible_rectangle(pix)(pix): width: height:" = width
+&;
+#X text 11 104 "flash-time(ms)(ms): intrrpt:" = flash-interrupt-time
+;
+#X text 411 62 selectable top-left corner of my_canvas in pixels.;
+#X text 415 35 in pixels.;
+#X text 11 76 "flash-time(ms)(ms): hold:" = flash-hold-time in msec
+=;
+#X text 405 76 duration of activity \, if a bang-object was activated
+;
+#X text 400 48 of the rectangular gui-object in pixels.;
+#X text 402 177 height of a visible \, deactivated rectangle in pixels.
+;
+#X text 14 224 "new&old" or "new-only" = the radiobutton-object changes
+its;
+#X text 441 224 state in 2 ways:;
+#X text 198 237 "new&old"-mode: output sends previous state off \,
+current;
+#X text 596 237 state on \;;
+#X text 197 250 "new-only"-mode: output sends only current state on.
+;
+#X text 14 280 "steady on click" or "jump on click" = the 2 slider-objects
+;
+#X text 481 322 immediately to new mouse-position \,;
+#X text 12 413 "label: font: fontsize:" = font-properties of label.
+;
+#X text 15 429 "colors:" = a click on radiobuttons "background:" \,
+;
+#X text 370 429 "front-color:" or "label-color:" activates the color-fields
+;
+#X text 174 193 if "init"-mode is selected \, the object displays and
+puts;
+#X text 15 266 "number:" = number of buttons of a radiobutton.;
+#X text 205 89 by any message-event or by a mouse-click.;
+#X text 388 104 in msec = duration of inactivity \, if an already;
+#X text 205 117 activated bang is activated once more.;
+#X text 11 132 "output-range: left: right:" = hslider-bounds;
+#X text 332 132 for input- as well as output-values.;
+#X text 332 146 for input- as well as output-values.;
+#X text 11 146 "output-range: bottom: top:" = vslider-bounds;
+#X text 12 193 "init" or "no init" =;
+#X text 571 193 out its previously saved value.;
+#X text 174 208 if "no init"-mode is selected \, nothing will happen.
+;
+#X text 433 280 react to mouse-click in 2 ways:;
+#X text 201 294 "steady on click"-mode: slider-knob stays in position
+\,;
+#X text 225 307 mouse and knob will move parallel \;;
+#X text 200 322 "jump on click"-mode: slider-knob jumps;
+#X text 224 338 positions of mouse and knob will be identical \;;
+#X text 402 353 receive-object with the same send-symbol-name.;
+#X text 11 368 "receive-symbol:" = a send-object with the same;
+#X text 11 353 "send-symbol:" = an output-message can be received by
+a;
+#X text 347 368 symbol-name can send an input-message to the gui-object.
+;
+#X text 13 383 "label: name:" = visible name of a gui-object \;;
+#X text 343 383 it will be moved together with the gui-object.;
+#X text 12 397 "label: x_off: y_off:" = coordinates of the label in
+;
+#X text 382 397 relation to top-left corner of gui-object.;
+#X text 207 444 on the right side which display the current color of
+the;
+#X text 605 444 item \;;
+#X text 11 161 "non-zero-value: value:" = toggle has 2;
+#X text 292 161 value-states: zero and this value.;
+#X text 208 460 to select a different color \, click on one of the
+30 small;
+#X text 614 459 preset-color-buttons \;;
+#X text 208 475 each color (background \, front \, label) can be tuned
+by its;
+#X text 235 490 RGB-values (0 .. 252 \, step 4) and a click on the
+set-button.;
+#X restore 287 361 pd properties;
+#N canvas 10 40 620 460 move 0;
+#X obj 0 0 cnv 8 460 120 empty empty how_to_move_gui_objects 100 18
+2 20 -225271 -42246 0;
+#X text 11 43 Select a gui-object \, then navigate the object by using
+the 4 direction-keys: UP \, DOWN \, LEFT or RIGHT.;
+#X text 12 70 If you press the SHIFT-Key too \, the object will move
+10 times faster.;
+#X restore 308 331 pd move;
+#N canvas 10 40 620 460 dollar 0;
+#X obj 0 0 cnv 8 560 160 empty empty the_dollar_thing 100 18 2 20 -261681
+-123526 0;
+#X text 10 39 if you want to send to \, or to receive from gui-objects
+;
+#X text 394 39 in abstractions \,;
+#X text 36 52 you have to write into the property-entry:;
+#X text 44 67 #1-label (instead of \$1-label).;
+#X text 25 103 type #0-uniquelabel (instead of \$0-uniquelabel).;
+#X text 9 88 if you want a unique send-receive-symbolname:;
+#X restore 299 391 pd dollar;
+#X obj 283 448 cnv 15 100 30 empty empty empty 20 12 2 20 -228992 -66577
+0;
+#N canvas 10 40 620 460 messages 0;
+#X obj 1 1 cnv 8 870 640 empty empty about_gui_messages 200 20 2 18
+-228992 -355 0;
+#X text 366 99 in pixels.;
+#X text 9 84 "size 15 128" = change width & height;
+#X text 9 159 "flashtime 50 600" = change flash-interrupt- and flash-hold
+;
+#X text 424 160 -time of bng-object.;
+#X text 9 174 "pos 150 170" = change the x-y-position of the top-left
+;
+#X text 400 173 corner of a gui-object in pixels \;;
+#X text 139 188 "pos 0 0" is the top-left corner of your window \;
+;
+#X text 143 204 the positive directions of x- and y-axes are right
+and down.;
+#X text 12 415 "receive togui" = change receive-name of object.;
+#X text 12 431 "label its_me" = change label-text of object.;
+#X text 12 446 "label_pos 20 8" = change offset-coordinates of label-text.
+;
+#X text 12 461 "label_font 0 10" = change font and fontsize of label-text.
+;
+#X text 12 340 "steady 1" change slider-knob-behaviour on mouse-click.
+;
+#X text 13 522 "lin" = change scale-mode of slider to linear.;
+#X text 14 537 "log" = change scale-mode of slider to logarithmical.
+;
+#X text 333 355 to output only the new state.;
+#X text 273 84 of sliders and vu in pixels.;
+#X text 12 477 "init 1" = change initial loadbang-mode of gui-objects
+;
+#X text 12 400 "send fromgui" = change send-name of gui-objects \,
+;
+#X text 12 325 "number 10" = change number of buttons of radio-button.
+;
+#X text 9 128 "range 0.1 10.0" = change slider-boundaries for;
+#X text 344 128 input- as well as output-values.;
+#X text 13 492 "set 64" = change only the inner state and display of
+gui-;
+#X text 11 33 all gui-objects (bng \, hsl \, vsl \, tgl \, rdb \, cnv
+and vu);
+#X text 9 113 "vis_size 800 600" = change width & height;
+#X text 309 113 of visual rectangle of my_canvas in pixels.;
+#X text 359 400 except vu and my_canvas.;
+#X text 395 477 except vu and cnv.;
+#X text 421 492 objects \, except bng and cnv \;;
+#X text 85 47 understand input-messages which change their properties.
+;
+#X text 11 222 "delta 15 17" = move the gui-object in relation to its
+;
+#X text 397 222 current position (in pixels).;
+#X text 333 371 to first release the previous button \,;
+#X text 144 385 then output the state of the new button.;
+#X text 12 371 "double_change" change radio-button-behaviour;
+#X text 12 355 "single_change" change radio-button-behaviour;
+#X text 147 507 no output will result.;
+#X text 9 99 "size 15" = change square-size of rdb \, bng and tgl;
+#X text 9 143 "nonzero 127.0" = change the nonzero-value of toggle.
+;
+#X text 15 552 "get_pos" = if my_canvas has a receive-name and a send-name
+;
+#X text 434 552 and you send the;
+#X text 272 237 front- and label-color of object with one of 30 presets.
+;
+#X text 277 252 label-color of vu and my_canvas with one of 30 presets.
+;
+#X text 504 282 (0 .. 255);
+#X text 558 568 coordinates.;
+#X text 149 568 message "get_pos" to it \, you receive the current
+x- and y-;
+#X text 85 59 except cnv has no inlet \, so you have to send messages
+;
+#X text 85 71 to its receive-label (edit properties).;
+#X text 11 237 "color 0 22 22" = change background- \,;
+#X text 11 252 "color 0 22" = change background- and;
+#X text 13 268 "color -1.67772e+07 (-1) -1" = change background- \,
+;
+#X text 364 267 (front-) and label-color of object with RGB-values.
+;
+#X text 149 283 the RGB-value will be calculated: -65536*RED-value
+;
+#X text 592 309 - 1;
+#X text 422 309 - BLUE-value (0 .. 255);
+#X text 394 296 - 256*GREEN-value (0 .. 255);
+#X restore 294 453 pd messages;
+#X obj 225 259 cnv 1 350 1 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 4 308 cnv 1 268 1 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 4 186 cnv 1 220 1 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 225 151 cnv 1 350 1 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 271 261 cnv 1 1 48 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 232 308 cnv 1 1 200 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 339 3 cnv 1 1 149 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 398 260 cnv 1 1 310 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X obj 225 3 cnv 1 1 255 empty empty empty 20 12 2 20 -258699 -66577
+0;
+#X floatatom 276 84 4 0 0 0 - - -;
+#X obj 239 43 tgl 15 0 empty dsp_tgl empty 20 8 0 10 -370 -262144 -1
+0 1;
+#N canvas 10 40 620 460 dsp 0;
+#X msg 31 88 \; pd dsp \$1;
+#X obj 20 199 cputime;
+#X obj 20 178 t b b;
+#X text 15 11 dsp;
+#X text 48 439 (c) musil@iem.kug.ac.at;
+#X text 90 452 IEM KUG;
+#X text 59 65 1/0 = ON/OFF;
+#X text 97 313 CPU-load;
+#X obj 62 126 loadbang;
+#X obj 20 126 sel 1;
+#X text 65 464 graz \, austria 2001;
+#X text 64 12 turn dsp-kernel on & off \,;
+#X obj 20 240 t f f;
+#X text 65 408 average;
+#X text 177 405 peak;
+#X obj 211 154 f;
+#X obj 146 179 > -1;
+#X obj 169 155 f -1;
+#X obj 179 91 t f b f;
+#X obj 146 204 sel 1;
+#X obj 192 132 f -1;
+#X obj 20 154 metro 500;
+#X obj 20 220 * 0.2;
+#X text 74 37 -dsp-load in %;
+#X text 65 24 measure average- and peak-;
+#X obj 20 315 * 100;
+#X obj 20 360 int;
+#X obj 20 338 + 0.499;
+#X obj 20 383 * 0.01;
+#X obj 246 207 r pd;
+#X obj 246 231 route dsp;
+#X text 245 318 to toggle input;
+#X msg 246 283 \; dsp_tgl set \$1;
+#X obj 247 341 r dsp_tgl;
+#X obj 246 257 route float;
+#X obj 146 227 del 3990;
+#N canvas 10 40 620 460 once 0;
+#X text 7 204 (c) musil@iem.kug.ac.at;
+#X text 49 214 IEM KUG;
+#X text 24 223 graz \, austria 2001;
+#X text 8 6 once;
+#X obj 19 150 bang;
+#X obj 56 65 f 0;
+#X text 59 7 only the first message passes through;
+#X obj 19 127 t b a;
+#X obj 19 100 spigot;
+#X obj 119 63 f 1;
+#X obj 119 41 loadbang;
+#X obj 19 40 inlet;
+#X obj 49 183 outlet;
+#X connect 4 0 5 0;
+#X connect 5 0 8 1;
+#X connect 7 0 4 0;
+#X connect 7 1 12 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 1;
+#X connect 10 0 9 0;
+#X connect 11 0 8 0;
+#X restore 111 264 pd once;
+#N canvas 10 40 620 460 1p1z 0;
+#X text 7 315 (c) musil@iem.kug.ac.at;
+#X text 52 325 IEM KUG;
+#X obj 22 231 +;
+#X text 8 6 1p1z;
+#X text 24 334 graz \, austria 2001;
+#X text 104 22 y[n] = a0*x[n] + a1*x[n-1] + b1*y[n-1];
+#X text 169 53 a0;
+#X text 25 34 x[n];
+#X text 24 280 y[n];
+#X text 209 53 a1;
+#X text 249 53 b1;
+#X obj 284 52 loadbang;
+#X text 64 102 x[n-1];
+#X obj 40 205 +;
+#X obj 22 133 *;
+#X obj 40 160 *;
+#X obj 59 182 *;
+#X text 82 143 y[n-1];
+#X obj 284 72 t b b b;
+#X obj 40 98 f;
+#X obj 59 138 f;
+#X obj 22 71 t f b b;
+#X text 350 63 x[n-1]init;
+#X text 429 102 y[n-1]init;
+#X text 147 202 1.arg: <float> a0;
+#X text 147 213 2.arg: <float> a1;
+#X text 147 224 3.arg: <float> b1;
+#X text 63 5 <float> control-IIR-filter 1.order;
+#X obj 162 115 f 0.1;
+#X obj 202 142 f 0;
+#X obj 242 164 f 0.9;
+#X obj 22 49 inlet;
+#X obj 162 71 inlet;
+#X obj 202 71 inlet;
+#X obj 242 71 inlet;
+#X obj 356 80 inlet;
+#X obj 431 120 inlet;
+#X obj 22 264 outlet;
+#X connect 2 0 20 1;
+#X connect 2 0 37 0;
+#X connect 11 0 18 0;
+#X connect 13 0 2 1;
+#X connect 14 0 2 0;
+#X connect 15 0 13 0;
+#X connect 16 0 13 1;
+#X connect 18 0 28 0;
+#X connect 18 1 29 0;
+#X connect 18 2 30 0;
+#X connect 19 0 15 0;
+#X connect 20 0 16 0;
+#X connect 21 0 14 0;
+#X connect 21 0 19 1;
+#X connect 21 1 19 0;
+#X connect 21 2 20 0;
+#X connect 28 0 14 1;
+#X connect 29 0 15 1;
+#X connect 30 0 16 1;
+#X connect 31 0 21 0;
+#X connect 32 0 28 0;
+#X connect 33 0 29 0;
+#X connect 34 0 30 0;
+#X connect 35 0 19 1;
+#X connect 36 0 20 1;
+#X restore 20 289 pd 1p1z 0.1 0 0.9;
+#X obj 20 65 inlet;
+#X obj 20 406 outlet;
+#X obj 211 405 outlet;
+#X connect 1 0 22 0;
+#X connect 2 0 1 0;
+#X connect 2 1 1 1;
+#X connect 8 0 21 0;
+#X connect 9 0 21 0;
+#X connect 12 0 37 0;
+#X connect 15 0 17 1;
+#X connect 15 0 40 0;
+#X connect 16 0 19 0;
+#X connect 17 0 16 1;
+#X connect 18 0 16 0;
+#X connect 18 1 17 0;
+#X connect 18 2 15 1;
+#X connect 19 0 15 0;
+#X connect 19 0 35 0;
+#X connect 20 0 17 1;
+#X connect 21 0 2 0;
+#X connect 22 0 12 0;
+#X connect 22 0 18 0;
+#X connect 25 0 27 0;
+#X connect 26 0 28 0;
+#X connect 27 0 26 0;
+#X connect 28 0 39 0;
+#X connect 29 0 30 0;
+#X connect 30 0 34 0;
+#X connect 34 0 32 0;
+#X connect 35 0 20 0;
+#X connect 37 0 25 0;
+#X connect 38 0 0 0;
+#X connect 38 0 9 0;
+#X restore 239 63 pd dsp;
+#X text 238 99 mean;
+#X text 279 100 peak;
+#X text 289 63 % cpu;
+#X text 283 305 my_canvas = cnv;
+#X text 312 172 radiobutton = rdb;
+#X text 271 350 R;
+#X text 270 370 E;
+#X text 270 389 A;
+#X text 270 409 D;
+#X text 270 428 M;
+#X text 269 447 E;
+#X connect 17 0 26 0;
+#X connect 21 0 18 0;
+#X connect 21 0 16 0;
+#X connect 21 1 34 0;
+#X connect 21 2 19 0;
+#X connect 22 0 21 0;
+#X connect 27 0 29 0;
+#X connect 54 0 55 0;
+#X connect 55 0 38 0;
+#X connect 55 1 53 0;
diff --git a/doc/tutorials/intro/34.nervous_guis.pd b/doc/tutorials/intro/34.nervous_guis.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4f9d5ac8c4f2c101f38ab715955ab3b22b2988ce
--- /dev/null
+++ b/doc/tutorials/intro/34.nervous_guis.pd
@@ -0,0 +1,338 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty nervous_guis 20 12 0 24 -228992
+-66577 0;
+#X obj 23 146 tgl 20 1 empty start_nervously1 empty 8 -8 0 10 -24198
+-1 -250685 0 1;
+#X obj 255 165 bng 15 1200 50 0 empty nerv_bng bang 8 -8 0 10 -262144
+-1 -1;
+#X obj 250 343 hsl 127 15 0 127 0 0 empty nerv_hsl h-slider 8 -8 0
+10 -262144 -1 -1 0 1;
+#X obj 443 164 tgl 15 1 empty nerv_tgl toggle 8 -8 0 10 -262144 -1
+-1 0 1;
+#X obj 482 282 vsl 15 127 0 127 0 0 empty nerv_vsl v-slider 8 -8 0
+10 -262144 -1 -1 0 1;
+#N canvas 10 40 620 460 control 0;
+#X obj 19 21 inlet;
+#N canvas 10 40 620 460 bng 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 84 60 t b b b;
+#X obj 234 368 pack 0 0 0;
+#X obj 250 29 metro 2000;
+#X obj 445 122 random 555666;
+#X obj 445 168 + 8;
+#X obj 445 145 % 120;
+#X obj 84 35 metro 100;
+#X obj 234 261 random 1.67772e+07;
+#X obj 266 283 random 1.67772e+07;
+#X obj 299 315 random 1.67772e+07;
+#X obj 84 11 inlet;
+#X msg 64 312 \; nerv_bng delta \$1 \$2;
+#X msg 234 390 \; nerv_bng color \$1 \$2 \$3;
+#X msg 445 192 \; nerv_bng size \$1;
+#X msg 250 51 \; nerv_bng bang;
+#X obj 234 340 * -1;
+#X obj 266 316 * -1;
+#X obj 299 342 * -1;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 22 0;
+#X connect 11 0 3 0;
+#X connect 11 0 14 0;
+#X connect 11 0 18 0;
+#X connect 11 1 4 0;
+#X connect 11 1 19 0;
+#X connect 11 2 20 0;
+#X connect 12 0 23 0;
+#X connect 13 0 25 0;
+#X connect 14 0 16 0;
+#X connect 15 0 24 0;
+#X connect 16 0 15 0;
+#X connect 17 0 11 0;
+#X connect 18 0 26 0;
+#X connect 19 0 27 0;
+#X connect 20 0 28 0;
+#X connect 21 0 17 0;
+#X connect 21 0 13 0;
+#X connect 26 0 12 0;
+#X connect 27 0 12 1;
+#X connect 28 0 12 2;
+#X restore 52 130 pd bng;
+#N canvas 10 40 620 460 tgl 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 85 53 t b b b;
+#X obj 445 122 random 555666;
+#X obj 445 168 + 8;
+#X obj 445 144 % 120;
+#X obj 85 31 metro 100;
+#X obj 264 28 metro 1000;
+#X obj 85 10 inlet;
+#X msg 64 312 \; nerv_tgl delta \$1 \$2;
+#X msg 226 322 \; nerv_tgl color \$1 \$2 \$3;
+#X msg 445 192 \; nerv_tgl size \$1;
+#X msg 264 51 \; nerv_tgl bang;
+#X obj 226 298 pack 0 0 0;
+#X obj 226 191 random 1.67772e+07;
+#X obj 258 213 random 1.67772e+07;
+#X obj 291 245 random 1.67772e+07;
+#X obj 226 270 * -1;
+#X obj 258 246 * -1;
+#X obj 291 272 * -1;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 18 0;
+#X connect 11 0 3 0;
+#X connect 11 0 12 0;
+#X connect 11 0 23 0;
+#X connect 11 1 4 0;
+#X connect 11 1 24 0;
+#X connect 11 2 25 0;
+#X connect 12 0 14 0;
+#X connect 13 0 20 0;
+#X connect 14 0 13 0;
+#X connect 15 0 11 0;
+#X connect 16 0 21 0;
+#X connect 17 0 15 0;
+#X connect 17 0 16 0;
+#X connect 22 0 19 0;
+#X connect 23 0 26 0;
+#X connect 24 0 27 0;
+#X connect 25 0 28 0;
+#X connect 26 0 22 0;
+#X connect 27 0 22 1;
+#X connect 28 0 22 2;
+#X restore 33 217 pd tgl;
+#N canvas 10 40 620 460 hsl 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 85 53 t b b b;
+#X obj 445 122 random 555666;
+#X obj 560 188 + 8;
+#X obj 560 128 random 773322;
+#X obj 445 208 pack 0 0;
+#X obj 84 32 metro 100;
+#X obj 561 155 % 30;
+#X obj 445 183 + 20;
+#X obj 446 149 % 110;
+#X obj 254 305 metro 1000;
+#X obj 254 327 random 846352;
+#X obj 254 350 % 130;
+#X obj 84 11 inlet;
+#X msg 64 321 \; nerv_hsl delta \$1 \$2;
+#X msg 254 373 \; nerv_hsl set \$1;
+#X msg 445 231 \; nerv_hsl size \$1 \$2;
+#X obj 245 202 pack 0 0 0;
+#X obj 245 95 random 1.67772e+07;
+#X obj 277 117 random 1.67772e+07;
+#X obj 310 149 random 1.67772e+07;
+#X obj 245 174 * -1;
+#X obj 277 150 * -1;
+#X obj 310 176 * -1;
+#X msg 245 229 \; nerv_hsl color \$1 \$2 \$3;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 24 0;
+#X connect 11 0 3 0;
+#X connect 11 0 12 0;
+#X connect 11 0 28 0;
+#X connect 11 1 4 0;
+#X connect 11 1 14 0;
+#X connect 11 1 29 0;
+#X connect 11 2 30 0;
+#X connect 12 0 19 0;
+#X connect 13 0 15 1;
+#X connect 14 0 17 0;
+#X connect 15 0 26 0;
+#X connect 16 0 11 0;
+#X connect 17 0 13 0;
+#X connect 18 0 15 0;
+#X connect 18 0 22 1;
+#X connect 19 0 18 0;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 22 0 25 0;
+#X connect 23 0 16 0;
+#X connect 23 0 20 0;
+#X connect 27 0 34 0;
+#X connect 28 0 31 0;
+#X connect 29 0 32 0;
+#X connect 30 0 33 0;
+#X connect 31 0 27 0;
+#X connect 32 0 27 1;
+#X connect 33 0 27 2;
+#X restore 33 312 pd hsl;
+#N canvas 10 40 620 460 vsl 0;
+#X obj 114 260 - 0;
+#X obj 148 258 f;
+#X obj 147 222 t f b;
+#X obj 79 122 random 56789;
+#X obj 150 165 random 9876;
+#X obj 47 236 - 0;
+#X obj 81 234 f;
+#X obj 80 198 t f b;
+#X obj 150 192 % 50;
+#X obj 79 145 % 50;
+#X obj 64 289 pack 0 0;
+#X obj 85 53 t b b b;
+#X obj 445 122 random 555666;
+#X obj 560 128 random 773322;
+#X obj 445 208 pack 0 0;
+#X obj 84 32 metro 100;
+#X obj 241 299 metro 1000;
+#X obj 240 325 random 846352;
+#X obj 241 352 % 130;
+#X obj 561 155 % 110;
+#X obj 560 188 + 20;
+#X obj 446 149 % 30;
+#X obj 445 183 + 3;
+#X obj 84 11 inlet;
+#X msg 239 227 \; nerv_vsl color \$1 \$2 \$3;
+#X msg 445 231 \; nerv_vsl size \$1 \$2;
+#X msg 64 310 \; nerv_vsl delta \$1 \$2;
+#X msg 241 376 \; nerv_vsl set \$1;
+#X obj 239 203 pack 0 0 0;
+#X obj 239 96 random 1.67772e+07;
+#X obj 271 118 random 1.67772e+07;
+#X obj 304 150 random 1.67772e+07;
+#X obj 239 175 * -1;
+#X obj 271 151 * -1;
+#X obj 304 177 * -1;
+#X connect 0 0 10 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 1;
+#X connect 2 0 0 0;
+#X connect 2 1 1 0;
+#X connect 3 0 9 0;
+#X connect 4 0 8 0;
+#X connect 5 0 10 0;
+#X connect 6 0 5 1;
+#X connect 7 0 6 1;
+#X connect 7 0 5 0;
+#X connect 7 1 6 0;
+#X connect 8 0 2 0;
+#X connect 9 0 7 0;
+#X connect 10 0 26 0;
+#X connect 11 0 3 0;
+#X connect 11 0 12 0;
+#X connect 11 0 29 0;
+#X connect 11 1 4 0;
+#X connect 11 1 13 0;
+#X connect 11 1 30 0;
+#X connect 11 2 31 0;
+#X connect 12 0 21 0;
+#X connect 13 0 19 0;
+#X connect 14 0 25 0;
+#X connect 15 0 11 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 27 0;
+#X connect 19 0 20 0;
+#X connect 20 0 14 1;
+#X connect 20 0 18 1;
+#X connect 21 0 22 0;
+#X connect 22 0 14 0;
+#X connect 23 0 15 0;
+#X connect 23 0 16 0;
+#X connect 28 0 24 0;
+#X connect 29 0 32 0;
+#X connect 30 0 33 0;
+#X connect 31 0 34 0;
+#X connect 32 0 28 0;
+#X connect 33 0 28 1;
+#X connect 34 0 28 2;
+#X restore 32 395 pd vsl;
+#X obj 19 80 delay 100;
+#X obj 19 163 delay 900;
+#X obj 19 252 delay 900;
+#X obj 19 343 delay 900;
+#X obj 33 285 float;
+#X obj 33 190 float;
+#X obj 52 107 float;
+#X obj 32 369 float;
+#X obj 19 50 trigger bang float;
+#X connect 0 0 13 0;
+#X connect 5 0 6 0;
+#X connect 5 0 11 0;
+#X connect 6 0 7 0;
+#X connect 6 0 10 0;
+#X connect 7 0 8 0;
+#X connect 7 0 9 0;
+#X connect 8 0 12 0;
+#X connect 9 0 3 0;
+#X connect 10 0 2 0;
+#X connect 11 0 1 0;
+#X connect 12 0 4 0;
+#X connect 13 0 5 0;
+#X connect 13 1 9 1;
+#X connect 13 1 10 1;
+#X connect 13 1 11 1;
+#X connect 13 1 12 1;
+#X restore 23 172 pd control;
+#X text 49 146 <-- start!;
+#X text 17 88 You can programmatically control just about every property
+and behavior of most GUI objects.;
+#X connect 1 0 6 0;
diff --git a/doc/tutorials/intro/35.EXERCISE-make_a_gui_object_dynamic.pd b/doc/tutorials/intro/35.EXERCISE-make_a_gui_object_dynamic.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1b829fe85bc697c9892e5f1ca11de85a21af885b
--- /dev/null
+++ b/doc/tutorials/intro/35.EXERCISE-make_a_gui_object_dynamic.pd
@@ -0,0 +1,5 @@
+#N canvas 10 40 620 460 12;
+#X obj 11 10 cnv 15 600 40 empty empty EXERCISE-make_a_gui_object_dynamic
+20 12 0 24 -262131 -66577 0;
+#X text 26 60 Take any gui object \, and make it change and/or move
+according to your program.;
diff --git a/doc/tutorials/intro/36.selecting_events.pd b/doc/tutorials/intro/36.selecting_events.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c025fbe61af7aafe60627e75b61070f32a689417
--- /dev/null
+++ b/doc/tutorials/intro/36.selecting_events.pd
@@ -0,0 +1,54 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty selecting_events 20 12 0 24
+-228992 -66577 0;
+#X floatatom 370 178 5 0 0 0 - - -;
+#X obj 370 236 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 391 236 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 370 211 select 2 3 4 5 6 10;
+#X obj 413 236 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 435 236 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 456 236 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 478 236 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 500 235 5 0 0 0 - - -;
+#X obj 58 341 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 95 342 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 133 342 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 171 342 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 61 105 symbol dog;
+#X msg 66 134 symbol cat;
+#X msg 74 162 symbol foo;
+#X msg 81 192 symbol earth;
+#X msg 90 221 symbol 400;
+#X obj 58 315 select dog cat foo 400;
+#X msg 86 251 400;
+#X text 97 297 FIRST CREATION ARGUMENT IS A SYMBOL;
+#X obj 209 341 pddp/print;
+#X connect 1 0 4 0;
+#X connect 4 0 2 0;
+#X connect 4 1 3 0;
+#X connect 4 2 5 0;
+#X connect 4 3 6 0;
+#X connect 4 4 7 0;
+#X connect 4 5 8 0;
+#X connect 4 6 9 0;
+#X connect 14 0 19 0;
+#X connect 15 0 19 0;
+#X connect 16 0 19 0;
+#X connect 17 0 19 0;
+#X connect 18 0 19 0;
+#X connect 19 0 10 0;
+#X connect 19 1 11 0;
+#X connect 19 2 12 0;
+#X connect 19 3 13 0;
+#X connect 19 4 22 0;
+#X connect 20 0 19 0;
diff --git a/doc/tutorials/intro/37.comparing_numbers.pd b/doc/tutorials/intro/37.comparing_numbers.pd
new file mode 100644
index 0000000000000000000000000000000000000000..791b923bcd05ae41190664fbba121c739f7e0532
--- /dev/null
+++ b/doc/tutorials/intro/37.comparing_numbers.pd
@@ -0,0 +1,152 @@
+#N canvas 10 40 620 460 12;
+#X obj 14 354 cnv 15 195 80 empty empty empty 40 70 0 14 -262130 -66577
+0;
+#X obj 214 354 cnv 15 380 80 empty empty empty 160 70 0 14 -232576
+-66577 0;
+#X obj 10 10 cnv 15 400 40 empty empty comparing_numbers 20 12 0 24
+-228992 -66577 0;
+#X floatatom 27 179 5 0 0 0 - - -;
+#X msg 27 132 7;
+#X floatatom 100 179 5 0 0 0 - - -;
+#X msg 100 132 4;
+#X obj 100 156 == 4;
+#X floatatom 168 179 5 0 0 0 - - -;
+#X msg 168 132 20;
+#X floatatom 237 179 5 0 0 0 - - -;
+#X msg 237 132 20;
+#X obj 237 156 != 10;
+#X obj 27 156 > 1;
+#X obj 168 156 >= 8;
+#X floatatom 354 324 7 -6 6 0 - - -;
+#X obj 224 364 == 5;
+#X obj 291 364 != 5;
+#X obj 356 364 > 5;
+#X obj 418 364 < 5;
+#X floatatom 224 391 5 0 0 0 - - -;
+#X floatatom 291 391 5 0 0 0 - - -;
+#X floatatom 356 391 5 0 0 0 - - -;
+#X floatatom 418 391 5 0 0 0 - - -;
+#X msg 545 108 3;
+#X floatatom 490 109 5 0 0 0 - - -;
+#X floatatom 545 157 5 0 0 0 - - -;
+#X obj 545 133 > 1;
+#X obj 490 135 < 5;
+#X floatatom 490 158 5 0 0 0 - - -;
+#X obj 512 184 &&;
+#X floatatom 512 206 5 0 0 0 - - -;
+#X floatatom 486 391 5 0 0 0 - - -;
+#X floatatom 548 391 5 0 0 0 - - -;
+#X obj 486 364 >= 5;
+#X obj 548 364 <= 5;
+#X floatatom 23 391 5 0 0 0 - - -;
+#X obj 23 364 moses 5;
+#X floatatom 69 391 5 0 0 0 - - -;
+#X floatatom 166 391 5 0 0 0 - - -;
+#X obj 113 364 select 5;
+#X obj 113 392 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X text 407 322 <-- click and drag here;
+#X text 9 56 There are a number of techniques for comparing numbers
+in Pd. Some are related to mathematics \, and others are related to
+programming logic.;
+#X obj 224 413 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0
+1;
+#X obj 291 413 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 1
+1;
+#X obj 356 413 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 1
+1;
+#X obj 486 413 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 1
+1;
+#X obj 548 413 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0
+1;
+#X text 14 201 Here are two different techniques \, [moses] for spliting
+a range of numbers \, and [select] for banging when a specific number
+is received:;
+#X floatatom 57 309 5 0 0 0 - - -;
+#X floatatom 110 309 5 0 0 0 - - -;
+#X obj 57 285 moses -4;
+#X msg 124 259 5;
+#X msg 57 259 -5;
+#X msg 24 259 -11;
+#X msg 91 259 1;
+#X text 10 106 These give true or false \, a 1 for true or a 0 for
+false:;
+#X floatatom 270 309 5 0 0 0 - - -;
+#X msg 284 259 5;
+#X msg 217 259 -5;
+#X msg 184 259 -11;
+#X msg 251 259 1;
+#X obj 217 310 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144
+-1 -1;
+#X obj 217 286 select 1;
+#X obj 418 413 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0
+1;
+#X floatatom 308 179 5 0 0 0 - - -;
+#X obj 308 156 &&;
+#X obj 308 135 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 1
+1;
+#X obj 326 135 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 1
+1;
+#X floatatom 368 179 5 0 0 0 - - -;
+#X obj 368 135 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 1
+1;
+#X obj 386 135 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0
+1;
+#X obj 368 156 ||;
+#X connect 4 0 13 0;
+#X connect 6 0 7 0;
+#X connect 7 0 5 0;
+#X connect 9 0 14 0;
+#X connect 11 0 12 0;
+#X connect 12 0 10 0;
+#X connect 13 0 3 0;
+#X connect 14 0 8 0;
+#X connect 15 0 16 0;
+#X connect 15 0 17 0;
+#X connect 15 0 18 0;
+#X connect 15 0 19 0;
+#X connect 15 0 34 0;
+#X connect 15 0 35 0;
+#X connect 15 0 37 0;
+#X connect 15 0 40 0;
+#X connect 16 0 20 0;
+#X connect 17 0 21 0;
+#X connect 18 0 22 0;
+#X connect 19 0 23 0;
+#X connect 20 0 44 0;
+#X connect 21 0 45 0;
+#X connect 22 0 46 0;
+#X connect 23 0 65 0;
+#X connect 24 0 27 0;
+#X connect 25 0 28 0;
+#X connect 26 0 30 1;
+#X connect 27 0 26 0;
+#X connect 28 0 29 0;
+#X connect 29 0 30 0;
+#X connect 30 0 31 0;
+#X connect 32 0 47 0;
+#X connect 33 0 48 0;
+#X connect 34 0 32 0;
+#X connect 35 0 33 0;
+#X connect 37 0 36 0;
+#X connect 37 1 38 0;
+#X connect 40 0 41 0;
+#X connect 40 1 39 0;
+#X connect 52 0 50 0;
+#X connect 52 1 51 0;
+#X connect 53 0 52 0;
+#X connect 54 0 52 0;
+#X connect 55 0 52 0;
+#X connect 56 0 52 0;
+#X connect 59 0 64 0;
+#X connect 60 0 64 0;
+#X connect 61 0 64 0;
+#X connect 62 0 64 0;
+#X connect 64 0 63 0;
+#X connect 64 1 58 0;
+#X connect 67 0 66 0;
+#X connect 68 0 67 0;
+#X connect 69 0 67 1;
+#X connect 71 0 73 0;
+#X connect 72 0 73 1;
+#X connect 73 0 70 0;
diff --git a/doc/tutorials/intro/38.math.pd b/doc/tutorials/intro/38.math.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b7ee11b61644c7b19548463cdd0d63cf0049fc98
--- /dev/null
+++ b/doc/tutorials/intro/38.math.pd
@@ -0,0 +1,260 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib hexloader -lib maxlib -lib zexy -lib iemlib -lib iemmatrix 
+-lib markex;
+#X obj 637 350 +~;
+#X obj 641 499 trigger;
+#X text 25 8 ARITHMETIC;
+#X text 30 29 Pd's arithmetic objects include:;
+#X obj 231 30 +;
+#X obj 256 30 -;
+#X obj 282 30 *;
+#X obj 308 30 /;
+#X obj 334 30 pow;
+#X obj 359 30 max;
+#X obj 385 30 min;
+#X obj 54 189 +;
+#X floatatom 54 118 0 0 0 0 - - -;
+#X floatatom 54 210 0 0 0 0 - - -;
+#X floatatom 67 141 0 0 0 0 - - -;
+#X msg 85 167 bang;
+#X text 120 168 Bang outputs sum;
+#X text 92 117 Numbers in left inlet add and output sum;
+#X text 109 140 Numbers in right inlet only change the inlet's value
+;
+#X text 29 74 The example below performs basic addition with two numbers:
+i.e. a + b = c;
+#X text 34 263 The example below incorporates a creation argument:
+i.e. a + 42 = b;
+#X floatatom 34 295 0 0 0 0 - - -;
+#X floatatom 34 338 0 0 0 0 - - -;
+#X obj 34 317 + 42;
+#N canvas 10 40 620 460 basic_examples 0;
+#X obj 44 129 +;
+#X obj 113 129 -;
+#X obj 179 129 *;
+#X obj 244 129 /;
+#X obj 316 129 pow;
+#X obj 394 129 max;
+#X obj 482 129 min;
+#X floatatom 44 32 5 0 0 0 - - -;
+#X floatatom 44 150 0 0 0 0 - - -;
+#X floatatom 113 149 0 0 0 0 - - -;
+#X floatatom 179 149 0 0 0 0 - - -;
+#X floatatom 244 149 0 0 0 0 - - -;
+#X floatatom 316 149 0 0 0 0 - - -;
+#X floatatom 394 150 0 0 0 0 - - -;
+#X floatatom 482 149 0 0 0 0 - - -;
+#X floatatom 495 32 5 0 0 0 - - -;
+#X msg 360 32 bang;
+#X connect 0 0 8 0;
+#X connect 1 0 9 0;
+#X connect 2 0 10 0;
+#X connect 3 0 11 0;
+#X connect 4 0 12 0;
+#X connect 5 0 13 0;
+#X connect 6 0 14 0;
+#X connect 7 0 0 0;
+#X connect 7 0 1 0;
+#X connect 7 0 2 0;
+#X connect 7 0 3 0;
+#X connect 7 0 4 0;
+#X connect 7 0 5 0;
+#X connect 7 0 6 0;
+#X connect 15 0 6 1;
+#X connect 15 0 5 1;
+#X connect 15 0 4 1;
+#X connect 15 0 3 1;
+#X connect 15 0 2 1;
+#X connect 15 0 1 1;
+#X connect 15 0 0 1;
+#X connect 16 0 0 0;
+#X connect 16 0 1 0;
+#X connect 16 0 2 0;
+#X connect 16 0 3 0;
+#X connect 16 0 4 0;
+#X connect 16 0 5 0;
+#X connect 16 0 6 0;
+#X restore 33 521 pd basic_examples;
+#X text 32 422 However \, [pow] \, [max] \, and [min] objects may need
+some explanation.;
+#N canvas 10 40 620 460 understanding_POW 0;
+#X text 12 25 [POW];
+#X obj 17 66 pow 2;
+#X floatatom 17 86 2 0 0 0 - - -;
+#X msg 17 46 2;
+#X text 61 115 - it is important to note that [pow] only works with
+NON-negative mantissas. That is to say that negative floating point
+fractions will be ignored.;
+#X obj 18 153 pow 2;
+#X floatatom 18 173 2 0 0 0 - - -;
+#X msg 13 111 -2;
+#X msg 24 132 -1.5;
+#X text 65 202 - however \, [pow] is capable of computing negative
+exponents!;
+#X floatatom 19 201 0 0 0 0 - - -;
+#X obj 19 221 pow -2;
+#X floatatom 19 242 0 0 0 0 - - -;
+#X text 57 39 - this object is used to exponentiate a number. The object
+returns the value at the left inlet to the power of the right inlet
+where the left inlet is the base and the right inlet is the exponent.
+For example: 2 to the power of 2 = 4 (i.e. 2 Squared);
+#X connect 1 0 2 0;
+#X connect 3 0 1 0;
+#X connect 5 0 6 0;
+#X connect 7 0 5 0;
+#X connect 8 0 5 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X restore 33 456 pd understanding_POW;
+#N canvas 10 40 620 460 understanding_MAX_and_MIN 0;
+#X text 34 9 [MAX];
+#X obj 32 51 max 10;
+#X floatatom 32 29 5 0 0 0 - - -;
+#X floatatom 32 76 5 0 0 0 - - -;
+#X text 87 26 - [max] returns the greater of the two numbers passed
+to its inlets. For example \, if the creation argument (or right inlet)
+is equal to 10 \, and you send 9 to the left inlet then the object
+will return 10 If you pass it an 11 \, then object returns 11;
+#X floatatom 33 116 5 0 0 0 - - -;
+#X floatatom 33 163 5 0 0 0 - - -;
+#X text 35 96 [MIN];
+#X text 88 113 - [min] returns the lesser of the two numbers passed
+to its inlets. For example \, if the creation argument (or right inlet)
+is equal to 10 \, and you send 9 to the left inlet then the object
+will return 9 If you pass it an 11 \, then object returns 10;
+#X obj 33 138 min 10;
+#X text 32 185 - It is important to note that [max] and [min] output
+a number with every number or "bang" that is sent to the left inlet.
+;
+#X floatatom 35 234 5 0 0 0 - - -;
+#X floatatom 35 282 5 0 0 0 - - -;
+#X obj 35 256 min 10;
+#X obj 76 281 bng 15 50 10 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 80 232 Move this number box above 10;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 5 0 9 0;
+#X connect 9 0 6 0;
+#X connect 11 0 13 0;
+#X connect 13 0 12 0;
+#X connect 13 0 14 0;
+#X restore 33 488 pd understanding_MAX_and_MIN;
+#X text 469 20 THE SUM OF MANY NUMBERS;
+#X msg 600 98 bang;
+#X obj 600 150 random 10;
+#X obj 662 150 random 10;
+#X obj 724 150 random 10;
+#X text 628 169 a;
+#X text 690 170 b;
+#X text 751 169 c;
+#X text 631 235 d;
+#X floatatom 600 235 0 0 0 0 - - -;
+#X obj 600 119 t b b b;
+#X obj 600 192 +;
+#X obj 600 213 +;
+#X floatatom 600 170 0 0 0 0 - - -;
+#X floatatom 662 170 0 0 0 0 - - -;
+#X floatatom 724 170 0 0 0 0 - - -;
+#X text 469 324 RELATED OBJECTS;
+#X obj 666 350 -~;
+#X obj 695 350 *~;
+#X obj 723 350 /~;
+#X obj 751 350 max~;
+#X obj 781 350 min~;
+#X text 540 350 Audio Math;
+#X obj 637 374 ==;
+#X obj 695 374 >;
+#X obj 751 374 <;
+#X obj 723 374 >=;
+#X obj 781 373 <=;
+#X obj 667 374 !=;
+#X text 504 375 Relational Tests;
+#X text 498 398 Logical Operators;
+#X obj 638 398 &;
+#X obj 667 398 |;
+#X obj 695 398 &&;
+#X obj 723 398 ||;
+#X obj 751 398 <<;
+#X obj 781 398 >>;
+#X obj 695 499 expr;
+#X obj 637 422 mtof;
+#X obj 668 422 ftom;
+#X obj 699 422 powtodb;
+#X obj 749 422 rmstodb;
+#X obj 799 422 dbtopow;
+#X obj 849 422 dbtorms;
+#X text 445 423 Acoustical Unit Conversion;
+#X text 537 450 Higher Math;
+#X obj 808 374 mod;
+#X obj 835 374 div;
+#X obj 641 449 sin;
+#X obj 667 449 cos;
+#X obj 694 449 tan;
+#X obj 721 449 atan;
+#X obj 640 473 atan2;
+#X obj 731 499 random;
+#X obj 678 473 sqrt;
+#X obj 709 473 log;
+#X obj 735 473 exp;
+#X obj 761 473 abs;
+#X text 570 499 Other;
+#N canvas 10 40 620 460 related_objects_from_other_libraries 0;
+#X obj 37 25 vector+;
+#X obj 37 45 vector-;
+#X obj 37 65 vector*;
+#X obj 85 25 vector/;
+#X obj 85 45 rgb2hsv;
+#X obj 85 65 hsv2rgb;
+#X obj 133 25 abs~;
+#X obj 133 45 db2v;
+#X obj 133 65 v2db;
+#X obj 163 25 avg~;
+#X obj 164 45 tavg~;
+#X obj 164 65 pdf~;
+#X obj 201 24 <~;
+#X obj 201 45 ==~;
+#X obj 201 67 >~;
+#X obj 228 25 &&~;
+#X obj 228 46 ||~;
+#X obj 228 67 mtx_*~;
+#X obj 280 25 mavg;
+#X obj 280 46 mean;
+#X obj 280 68 divide;
+#X obj 323 27 divmod;
+#X obj 324 47 minus;
+#X obj 324 67 plus;
+#X text 29 104 These objects are offered in Pd only if you have downloaded
+and properly installed the appropriate library. These objects may or
+may not exist in a single library.;
+#X text 28 153 The best places to find information about Pd's libraries
+is:;
+#X text 25 175 www.puredata.org and click on "Downloads" then "Software"
+;
+#X text 27 190 or;
+#X text 27 205 iem.kug.ac.at/pdb/;
+#X obj 370 27 q8_rsqrt~;
+#X obj 370 51 q8_sqrt~;
+#X restore 520 537 pd related_objects_from_other_libraries;
+#X obj 778 499 f;
+#X obj 806 499 int;
+#X obj 809 398 %;
+#X obj 754 449 pow;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 14 0 11 1;
+#X connect 15 0 11 0;
+#X connect 21 0 23 0;
+#X connect 23 0 22 0;
+#X connect 29 0 38 0;
+#X connect 30 0 41 0;
+#X connect 31 0 42 0;
+#X connect 32 0 43 0;
+#X connect 38 0 30 0;
+#X connect 38 1 31 0;
+#X connect 38 2 32 0;
+#X connect 39 0 40 0;
+#X connect 40 0 37 0;
+#X connect 41 0 39 0;
+#X connect 42 0 39 1;
+#X connect 43 0 40 1;
diff --git a/doc/tutorials/intro/39.init_to_0.pd b/doc/tutorials/intro/39.init_to_0.pd
new file mode 100644
index 0000000000000000000000000000000000000000..feed14a15a7005e44652902a376efc811f1bc797
--- /dev/null
+++ b/doc/tutorials/intro/39.init_to_0.pd
@@ -0,0 +1,33 @@
+#N canvas 10 40 620 460 12;
+#X obj 12 13 cnv 15 400 40 empty empty init_to_zero 10 15 0 24 -228992
+-66577 0;
+#X obj 293 241 +;
+#X obj 177 242 *;
+#X obj 56 241 float;
+#X obj 242 272 bng 15 250 50 0 empty empty reset 0 -6 0 8 -262144 -1
+-1;
+#X obj 293 315 pddp/print;
+#X obj 176 315 pddp/print;
+#X obj 56 315 pddp/print;
+#X obj 414 315 pddp/print;
+#X msg 293 203 bang;
+#X msg 177 204 bang;
+#X msg 56 204 bang;
+#X msg 414 204 bang;
+#X obj 414 241 trigger float;
+#X text 47 170 Here are a few examples:;
+#X text 32 78 Objects are automatically initialized to 0 in Pd. If
+there is no value specified \, then the value will be 0. This only applies
+to places where numeric atoms are used.;
+#X connect 1 0 5 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X connect 4 0 5 0;
+#X connect 4 0 6 0;
+#X connect 4 0 7 0;
+#X connect 4 0 8 0;
+#X connect 9 0 1 0;
+#X connect 10 0 2 0;
+#X connect 11 0 3 0;
+#X connect 12 0 13 0;
+#X connect 13 0 8 0;
diff --git a/doc/tutorials/intro/40.math_expr.pd b/doc/tutorials/intro/40.math_expr.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8b9f5c2a0384cbfd29890a67c64d102de55389f4
--- /dev/null
+++ b/doc/tutorials/intro/40.math_expr.pd
@@ -0,0 +1,32 @@
+#N canvas 10 40 620 460 12;
+#X obj 304 137 cnv 15 80 25 empty empty empty 20 12 0 14 -261681 -66577
+0;
+#X obj 192 137 cnv 15 80 25 empty empty empty 20 12 0 14 -261681 -66577
+0;
+#X obj 10 10 cnv 15 400 40 empty empty math_expr 20 12 0 24 -228992
+-66577 0;
+#X text 204 114 sqrt(x^2 + y^2);
+#X obj 106 274 +;
+#X obj 106 316 sqrt;
+#X floatatom 106 373 7 0 0 0 - - -;
+#X obj 79 230 pow 2;
+#X obj 141 230 pow 2;
+#X floatatom 321 141 5 0 0 0 y - -;
+#X floatatom 208 141 5 0 0 0 x - -;
+#X obj 238 290 expr sqrt(pow($f1 \, 2) + pow($f2 \, 2));
+#X floatatom 237 373 7 0 0 0 - - -;
+#X obj 321 176 trigger bang float;
+#X text 11 57 The [expr] object allows you to write out formulas in
+the standard style of many programming languages.;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 7 0 4 0;
+#X connect 8 0 4 1;
+#X connect 9 0 13 0;
+#X connect 10 0 7 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 13 0 7 0;
+#X connect 13 0 11 0;
+#X connect 13 1 11 1;
+#X connect 13 1 8 0;
diff --git a/doc/tutorials/intro/41.number_limitations.pd b/doc/tutorials/intro/41.number_limitations.pd
new file mode 100644
index 0000000000000000000000000000000000000000..4232c34c72d3317b97d284df555a23deedca3296
--- /dev/null
+++ b/doc/tutorials/intro/41.number_limitations.pd
@@ -0,0 +1,22 @@
+#N canvas 10 40 620 460 12;
+#X obj -20 9 cnv 15 400 40 empty empty number_limitations 20 12 0 24
+-228992 -66577 0;
+#X text 23 146 NaN;
+#X text 86 147 -inf;
+#X text 154 148 inf;
+#X text -9 253 rounding errors;
+#X floatatom 2 411 12 999900 1e+20 0 - - -;
+#X text -9 373 Pd can only display 6 significant digits:;
+#X floatatom 3 331 12 0 0 0 - - -;
+#X text 113 287 999999 + 999999 = 1 \, 999 \, 998;
+#X msg 3 278 999999;
+#X obj 3 305 + 999999;
+#X obj -9 204 pddp/pddplink http://en.wikipedia.org/wiki/Real_numbers
+;
+#X text -13 61 Computers use floating point numbers to try to represent
+real numbers (a real number is any number that could be plotted on
+a line).;
+#X text 137 332 == 2 \, OOO \, OOO;
+#X text 108 409 <-- click and drag up to see;
+#X connect 9 0 10 0;
+#X connect 10 0 7 0;
diff --git a/doc/tutorials/intro/42.floats_and_ints.pd b/doc/tutorials/intro/42.floats_and_ints.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5bb32cbe8d1132c3b8041f4560cc8cbba2ffc31c
--- /dev/null
+++ b/doc/tutorials/intro/42.floats_and_ints.pd
@@ -0,0 +1,23 @@
+#N canvas 10 40 620 460 12;
+#X obj -37 4 cnv 15 400 40 empty empty floats_and_ints 20 12 0 24 -228992
+-66577 0;
+#X text -30 60 In Pd \, there is only one kind of number \, its generally
+known as a "float" \, which is a word used in programming to mean a
+"floating point number" \, i.e. a number with a decimal point in it.
+;
+#X text -24 242 Oftentimes \, its useful to use integers. For this
+there is the [int] object.;
+#X text 36 149 4.5;
+#X text 79 205 1.234e+07;
+#X text 188 162 -0.0032;
+#X text 323 178 4.3332;
+#X obj 223 322 int;
+#X floatatom 223 358 5 0 0 1 int - -;
+#X floatatom 164 358 5 0 0 0 float - -;
+#X obj 226 286 hsl 128 15 0 20 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X text -22 396 floats and ints are direct representations of how your
+CPU handles numbers.;
+#X connect 7 0 8 0;
+#X connect 10 0 9 0;
+#X connect 10 0 7 0;
diff --git a/doc/tutorials/intro/43.EXERCISE-help_americans.pd b/doc/tutorials/intro/43.EXERCISE-help_americans.pd
new file mode 100644
index 0000000000000000000000000000000000000000..56b6fb45c86cef3af2aa4cabe2ffa6d785f1e0ae
--- /dev/null
+++ b/doc/tutorials/intro/43.EXERCISE-help_americans.pd
@@ -0,0 +1,6 @@
+#N canvas 10 40 620 460 12;
+#X obj 11 10 cnv 15 600 40 empty empty EXERCISE-help_americans 20 12
+0 24 -262131 -66577 0;
+#X text 19 64 Help the poor Americans to understand Celsius. The formulas
+are C = (5/9) * (F-32) and F = (9/5 * C) + 32. Try not to use [expr]
+\, but instead use individual Pd objects for each math operation.;
diff --git a/doc/tutorials/intro/44.building_lists.pd b/doc/tutorials/intro/44.building_lists.pd
new file mode 100644
index 0000000000000000000000000000000000000000..044cc01570b26833ece06079762f8a9671f1a019
--- /dev/null
+++ b/doc/tutorials/intro/44.building_lists.pd
@@ -0,0 +1,31 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty building_lists 20 12 0 24 -228992
+-66577 0;
+#X obj 117 350 pack float float float;
+#X msg 117 381 \$3 \$1 \$2;
+#X floatatom 117 324 5 0 0 0 - - -;
+#X floatatom 224 325 5 0 0 0 - - -;
+#X floatatom 332 326 5 0 0 0 - - -;
+#X text 24 295 You can use arguments to reorder elements:;
+#X obj 19 59 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1
+;
+#X floatatom 234 108 5 0 0 0 - - -;
+#X floatatom 126 108 5 0 0 0 - - -;
+#X floatatom 19 108 5 0 0 0 - - -;
+#X obj 19 82 trigger bang bang bang;
+#X obj 19 132 pack float float float;
+#X obj 19 165 print;
+#X obj 117 411 print;
+#X connect 1 0 2 0;
+#X connect 2 0 14 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 1;
+#X connect 5 0 1 2;
+#X connect 7 0 11 0;
+#X connect 8 0 12 2;
+#X connect 9 0 12 1;
+#X connect 10 0 12 0;
+#X connect 11 0 10 0;
+#X connect 11 1 9 0;
+#X connect 11 2 8 0;
+#X connect 12 0 13 0;
diff --git a/doc/tutorials/intro/45.using_lists.pd b/doc/tutorials/intro/45.using_lists.pd
new file mode 100644
index 0000000000000000000000000000000000000000..54ff542f7d7954bfa2edd8ad3339154a989ecf22
--- /dev/null
+++ b/doc/tutorials/intro/45.using_lists.pd
@@ -0,0 +1,17 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty using_lists 20 12 0 24 -228992
+-66577 0;
+#X msg 49 113 300 240 1;
+#X floatatom 49 187 5 0 0 0 - - -;
+#X floatatom 166 187 5 0 0 0 - - -;
+#X floatatom 284 187 5 0 0 0 - - -;
+#X obj 49 148 unpack float float float;
+#X msg 52 281 1 1;
+#X obj 52 308 +;
+#X floatatom 52 338 5 0 0 0 - - -;
+#X connect 1 0 5 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 5 2 4 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
diff --git a/doc/tutorials/intro/46.sorting_messages_by_type.pd b/doc/tutorials/intro/46.sorting_messages_by_type.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3ce6701be47627c1a8c76ce0290f65e0f7b3cf63
--- /dev/null
+++ b/doc/tutorials/intro/46.sorting_messages_by_type.pd
@@ -0,0 +1,49 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty sorting_messages_by_type 20
+12 0 24 -228992 -66577 0;
+#X floatatom 282 359 5 0 0 0 - - -;
+#X symbolatom 351 358 10 0 0 0 - - -;
+#X obj 214 379 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144
+-1 -1;
+#X obj 214 335 route bang float symbol list;
+#X obj 282 379 bng 15 250 50 0 empty empty float -4 23 1 12 -262144
+-1 -1;
+#X obj 351 379 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144
+-1 -1;
+#X obj 420 379 bng 15 250 50 0 empty empty list -2 23 1 12 -262144
+-1 -1;
+#X obj 489 379 bng 15 250 50 0 empty empty selector_series -18 23 1
+12 -262144 -1 -1;
+#X msg 40 172 bang;
+#X msg 128 183 642.3;
+#X msg 214 159 symbol moshimoshi;
+#X msg 214 183 symbol sayonara;
+#X obj 40 197 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 411 171 1 2 3;
+#X msg 411 194 5 for free!;
+#X msg 411 218 list here we go...;
+#X msg 423 251 not a list? nope...;
+#X msg 105 159 float 5;
+#X text 10 63 When processing messages \, some operations should only
+be applied to messages of a certain type. [route] allows you to sort
+messages by type:;
+#X msg 423 276 selector data data;
+#X connect 1 0 5 0;
+#X connect 2 0 6 0;
+#X connect 4 0 3 0;
+#X connect 4 1 1 0;
+#X connect 4 2 2 0;
+#X connect 4 3 7 0;
+#X connect 4 4 8 0;
+#X connect 9 0 4 0;
+#X connect 10 0 4 0;
+#X connect 11 0 4 0;
+#X connect 12 0 4 0;
+#X connect 13 0 4 0;
+#X connect 14 0 4 0;
+#X connect 15 0 4 0;
+#X connect 16 0 4 0;
+#X connect 17 0 4 0;
+#X connect 18 0 4 0;
+#X connect 20 0 4 0;
diff --git a/doc/tutorials/intro/47.trigger_conversion.pd b/doc/tutorials/intro/47.trigger_conversion.pd
new file mode 100644
index 0000000000000000000000000000000000000000..17a98cb175f47d71f15125d4356caf813b15297e
--- /dev/null
+++ b/doc/tutorials/intro/47.trigger_conversion.pd
@@ -0,0 +1,29 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty trigger_conversion 20 12 0 24
+-228992 -66577 0;
+#X obj 126 187 trigger anything float bang;
+#X msg 125 142 float 45.234;
+#X floatatom 126 223 5 0 0 0 - - -;
+#X floatatom 258 222 5 0 0 0 - - -;
+#X obj 391 221 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 42 298 12 45 blah;
+#X msg 163 297 blah;
+#X msg 221 298 123;
+#X msg 265 297 symbol test;
+#X obj 160 370 print bang;
+#X obj 160 344 trigger bang anything;
+#X obj 365 370 print anything;
+#X text 10 80 [trigger] can also do limited conversions in addition
+to ordering. The keyword "anything" tells [trigger] to do no conversion.
+;
+#X connect 1 0 3 0;
+#X connect 1 1 4 0;
+#X connect 1 2 5 0;
+#X connect 2 0 1 0;
+#X connect 6 0 11 0;
+#X connect 7 0 11 0;
+#X connect 8 0 11 0;
+#X connect 9 0 11 0;
+#X connect 11 0 10 0;
+#X connect 11 1 12 0;
diff --git a/doc/tutorials/intro/48.grabbing_keystrokes.pd b/doc/tutorials/intro/48.grabbing_keystrokes.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8bf37e15efa29bb866477d518c964e89e4f95ef7
--- /dev/null
+++ b/doc/tutorials/intro/48.grabbing_keystrokes.pd
@@ -0,0 +1,61 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty grabbing_keystrokes 20 12 0
+24 -228992 -66577 0;
+#X obj 115 152 key;
+#X floatatom 115 176 5 0 0 0 - - -;
+#X text 284 216 This times how long between each;
+#X text 284 232 press of the 'a' key.;
+#X floatatom 215 176 5 0 0 0 - - -;
+#X obj 215 152 keyup;
+#X floatatom 315 176 5 0 0 0 - - -;
+#X obj 315 152 keyname;
+#X symbolatom 379 176 10 0 0 0 - - -;
+#X text 20 231 't' key as toggle:;
+#X obj 68 303 select 116;
+#X obj 68 272 keyup;
+#N canvas 10 40 620 460 /SUBPATCH/ 0;
+#X obj 101 10 inlet;
+#X obj 100 100 tgl 32 0 empty \$0-tgl empty 0 -6 0 8 -166441 -166441
+-262144 0 1;
+#X obj 156 68 select 1;
+#X msg 172 186 color \$1 \$2 \$3;
+#X msg 268 146 1 1 0;
+#X msg 133 144 -65281 0 -1;
+#X obj 268 85 bang;
+#X obj 176 241 send \$0-tgl;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X connect 2 1 6 0;
+#X connect 3 0 7 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 4 0;
+#X coords 0 -1 1 1 32 32 1 100 100;
+#X restore 68 327 pd;
+#X text 13 63 Pd provides a set of objects for getting events from
+the keyboard. [key] outputs on key down \, [keyup] outputs on key up
+\, and [keyname] outputs both key up and key down \, and gives a symbolic
+name for the current key.;
+#X text 21 391 These objects will only grab keys when this window has
+focus. If you click on the Pd window \, this window won't get key events
+anymore.;
+#X obj 376 259 key;
+#X floatatom 376 283 5 0 0 0 - - -;
+#X obj 475 261 keyup;
+#X obj 376 312 select 97;
+#X obj 475 312 select 97;
+#X obj 411 341 timer;
+#X floatatom 411 367 5 0 0 0 - - -;
+#X connect 1 0 2 0;
+#X connect 6 0 5 0;
+#X connect 8 0 7 0;
+#X connect 8 1 9 0;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 16 0 17 0;
+#X connect 17 0 19 0;
+#X connect 18 0 20 0;
+#X connect 19 0 21 0;
+#X connect 20 0 21 1;
+#X connect 21 0 22 0;
diff --git a/doc/tutorials/intro/49.building_messages.pd b/doc/tutorials/intro/49.building_messages.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d7de63cc91cf701926d48f350254f4e547621596
--- /dev/null
+++ b/doc/tutorials/intro/49.building_messages.pd
@@ -0,0 +1,36 @@
+#N canvas 10 40 620 460 12;
+#X obj 10 10 cnv 15 400 40 empty empty building_messages 20 12 0 24
+-228992 -66577 0;
+#X msg 86 180;
+#X msg 72 126 set word;
+#X obj 87 213 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 93 149 set another;
+#X text 14 65 You can build messages programmatically in message boxes.
+The basic operation is the [set( message:;
+#X text 18 381 When using the [set( \, [add( \, and [add2( messages
+\, the message box that you are building does not output anything.
+Instead it waits for a bang or a mouse click.;
+#X msg 53 288 add my message;
+#X msg 61 337;
+#X text 18 238 [add( puts a complete message in the message box \,
+terminated by a semi-colon \, while [add2( just the items:;
+#X msg 303 288 add2 my;
+#X msg 396 288 add2 message;
+#X msg 316 342;
+#X msg 254 288 set;
+#X msg 30 127 set;
+#X text 299 120 [set( alone resets:;
+#X msg 364 155 set;
+#X msg 364 189 blah blah blah;
+#X msg 69 312 set;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 4 0 1 0;
+#X connect 7 0 8 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 13 0 12 0;
+#X connect 14 0 1 0;
+#X connect 16 0 17 0;
+#X connect 18 0 8 0;
diff --git a/doc/tutorials/intro/50.pure_data_files.pd b/doc/tutorials/intro/50.pure_data_files.pd
new file mode 100644
index 0000000000000000000000000000000000000000..be5f1ec686a6dbdcfdc6ba6c262e43a55b38df7f
--- /dev/null
+++ b/doc/tutorials/intro/50.pure_data_files.pd
@@ -0,0 +1,61 @@
+#N canvas 10 40 620 500 10;
+#X obj 191 249 textfile;
+#X obj 111 279 print LINE;
+#X msg 191 213 rewind;
+#X obj 171 355 route canvas;
+#X obj 54 458 print Xpos;
+#X obj 121 458 print Ypos;
+#X obj 344 397 s pd-clone;
+#X obj 191 274 route #N #X;
+#X obj 234 106 tgl 20 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X msg 344 338 vis 1 \, clear;
+#X obj 142 174 + 1;
+#X obj 100 174 float;
+#X obj 344 152 select 1;
+#X obj 98 150 metro 300;
+#X text 35 54 Even .pd files use the same message format.;
+#X text 34 75 Here is a patch that reads the file of this patch and
+sends it to the "clone" subpatch \, making a clone:;
+#X obj 8 10 cnv 15 400 40 empty empty pure_data_files 10 15 0 24 -228992
+-66577 0;
+#X msg 389 214 read 50.pure_data_files.pd;
+#X msg 100 213 bang;
+#X msg 54 437 \$1;
+#X obj 171 377 list;
+#X msg 121 437 \$2;
+#X obj 189 458 print width;
+#X obj 263 458 print height;
+#X msg 263 437 \$4;
+#X msg 189 437 \$3;
+#X obj 222 309 route restore;
+#N canvas 630 40 620 500 clone 0;
+#X restore 433 456 pd clone;
+#X connect 0 0 1 0;
+#X connect 0 0 7 0;
+#X connect 0 1 8 0;
+#X connect 2 0 0 0;
+#X connect 3 0 20 0;
+#X connect 7 0 3 0;
+#X connect 7 1 26 0;
+#X connect 8 0 12 0;
+#X connect 8 0 13 0;
+#X connect 9 0 6 0;
+#X connect 10 0 11 1;
+#X connect 11 0 10 0;
+#X connect 11 0 18 0;
+#X connect 12 0 17 0;
+#X connect 12 0 2 0;
+#X connect 12 0 9 0;
+#X connect 13 0 11 0;
+#X connect 17 0 0 0;
+#X connect 18 0 0 0;
+#X connect 19 0 4 0;
+#X connect 20 0 19 0;
+#X connect 20 0 21 0;
+#X connect 20 0 25 0;
+#X connect 20 0 24 0;
+#X connect 21 0 5 0;
+#X connect 24 0 23 0;
+#X connect 25 0 22 0;
+#X connect 26 1 6 0;
diff --git a/doc/tutorials/intro/51.multiple_messages.pd b/doc/tutorials/intro/51.multiple_messages.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c20cae95b27e015b10c9dad5e8129b14e39100f8
--- /dev/null
+++ b/doc/tutorials/intro/51.multiple_messages.pd
@@ -0,0 +1,18 @@
+#N canvas 10 40 620 460 12;
+#X obj -49 6 cnv 15 400 40 empty empty multiple_messages 20 12 0 24
+-228992 -66577 0;
+#X text -42 70 You can send multiple messages in one message box by
+separating them with commas:;
+#X msg 7 161 1 \, 2 \, 3;
+#X text 102 175 these each print on a new line;
+#X msg 7 263 first 1 \, second 2 \, third 3;
+#X obj 7 308 route first second third;
+#X floatatom 7 335 5 0 0 0 - - -;
+#X floatatom 85 335 5 0 0 0 - - -;
+#X floatatom 163 335 5 0 0 0 - - -;
+#X obj 7 195 print;
+#X connect 2 0 9 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 1 7 0;
+#X connect 5 2 8 0;
diff --git a/doc/tutorials/intro/52.send_messages_to_pd.pd b/doc/tutorials/intro/52.send_messages_to_pd.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8644209aad2a2746d0466c2b369d92c6a9122ba8
--- /dev/null
+++ b/doc/tutorials/intro/52.send_messages_to_pd.pd
@@ -0,0 +1,26 @@
+#N canvas 10 40 620 460 12;
+#X msg 93 390 menuclose;
+#X obj 45 437 s pd-mon-nouveau-patch.pd;
+#X obj 20 200 cnv 15 5 5 empty empty 1 5 0 0 20 -262144 -258699 0;
+#X obj 20 240 cnv 15 5 5 empty empty 2 5 0 0 20 -262144 -258699 0;
+#X obj 20 280 cnv 15 5 5 empty empty 3 5 0 0 20 -262144 -258699 0;
+#X msg 59 145 \; pd filename mon-nouveau-patch.pd /tmp \; #N canvas
+\; #X pop 1 \;;
+#X text 12 109 Click these messages starting from the top:;
+#X msg 59 230 msg 20 27 symbol Hello_World!;
+#X msg 75 270 symbolatom 20 100 0 0 0 0;
+#X msg 91 310 connect 0 0 1 0;
+#X text 90 350 click on [symbol Hello_World!( in the new window;
+#X text 172 390 now close the new window;
+#X obj 20 320 cnv 15 5 5 empty empty 4 5 0 0 20 -262144 -258699 0;
+#X obj 20 360 cnv 15 5 5 empty empty 5 5 0 0 20 -262144 -258699 0;
+#X obj 20 400 cnv 15 5 5 empty empty 6 5 0 0 20 -262144 -258699 0;
+#X obj 8 10 cnv 15 400 40 empty empty send_messages_to_pd 20 12 0 24
+-228992 -66577 0;
+#X text 11 55 Keeping true to the name "Pure Data" \, you can send
+messages to Pd itself. All messages are in the same format \, whether
+its in your patch \, or it's Pd's GUI talking to the Pd core.;
+#X connect 0 0 1 0;
+#X connect 7 0 1 0;
+#X connect 8 0 1 0;
+#X connect 9 0 1 0;
diff --git a/doc/tutorials/intro/EXERCISE_TEMPLATE.pd b/doc/tutorials/intro/EXERCISE_TEMPLATE.pd
new file mode 100644
index 0000000000000000000000000000000000000000..909899f8e5adcee611645e84529480082942152a
--- /dev/null
+++ b/doc/tutorials/intro/EXERCISE_TEMPLATE.pd
@@ -0,0 +1,97 @@
+#N canvas 333 243 686 482 12;
+#N canvas 414 102 546 555 guts 0;
+#X msg 280 45 \; pd filename exercise-patch.pd /tmp \; #N canvas \;
+#X pop 1 \;;
+#X obj 300 328 s pd-exercise-patch.pd;
+#X msg 329 216 obj 50 103 osc~;
+#X msg 330 240 obj 50 153 dac~;
+#X obj 103 17 inlet;
+#X msg 320 155 clear;
+#X obj 276 7 loadbang;
+#X obj 259 108 delay 1000;
+#X obj 259 129 t b b b b;
+#X msg 52 155 connect 0 0 1 0;
+#X msg 37 216 connect 1 0 2 0;
+#X msg 31 266 connect 1 0 2 1;
+#X msg 292 27 \; pd dsp 1;
+#X obj 112 108 t b b;
+#X msg 87 52 bang;
+#X obj 34 134 delay 2000;
+#X obj 21 187 delay 2000;
+#X obj 10 245 delay 2000;
+#N canvas 261 307 459 387 connection-effect 0;
+#X obj 186 312 dac~;
+#X obj 72 233 osc~ 1000;
+#X obj 138 266 *~;
+#X obj 253 259 *~;
+#X obj 204 236 osc~ 800;
+#X obj 153 236 line~;
+#X obj 183 7 inlet;
+#X msg 184 31 bang;
+#X obj 187 61 t b b;
+#X obj 168 95 delay 10;
+#X msg 201 125 0 10;
+#X obj 276 218 line~;
+#X obj 276 191 pipe 30;
+#X msg 241 125 1 10;
+#X connect 1 0 2 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 4 0 3 0;
+#X connect 5 0 2 1;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 1 13 0;
+#X connect 9 0 10 0;
+#X connect 10 0 5 0;
+#X connect 10 0 12 0;
+#X connect 11 0 3 1;
+#X connect 12 0 11 0;
+#X connect 13 0 5 0;
+#X connect 13 0 12 0;
+#X restore 22 365 pd connection-effect;
+#X msg 256 453 floatatom 50 50 5 0 0 0;
+#X msg 327 184 obj 50 50 hsl;
+#X obj 197 18 inlet;
+#X msg 205 50 bang;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 14 0;
+#X connect 5 0 1 0;
+#X connect 6 0 0 0;
+#X connect 6 0 7 0;
+#X connect 6 0 12 0;
+#X connect 7 0 8 0;
+#X connect 8 0 3 0;
+#X connect 8 1 2 0;
+#X connect 8 2 20 0;
+#X connect 8 3 5 0;
+#X connect 9 0 1 0;
+#X connect 10 0 1 0;
+#X connect 11 0 1 0;
+#X connect 13 0 15 0;
+#X connect 13 1 8 0;
+#X connect 14 0 13 0;
+#X connect 15 0 16 0;
+#X connect 15 0 9 0;
+#X connect 15 0 18 0;
+#X connect 16 0 17 0;
+#X connect 16 0 10 0;
+#X connect 16 0 18 0;
+#X connect 17 0 11 0;
+#X connect 17 0 18 0;
+#X connect 20 0 1 0;
+#X connect 21 0 22 0;
+#X connect 22 0 8 0;
+#X restore 233 269 pd guts;
+#X msg 233 242 solve;
+#X text 32 64 In the exercise patch \, connect the existing objects
+so that you can control the frequency of the oscillator and hear the
+resulting sound.;
+#X text 35 131 If you want help \, click the solve message below.;
+#X msg 298 242 try again;
+#X obj 11 10 cnv 15 600 40 empty empty EXERCISE-make_your_first_patch
+20 12 0 24 -262131 -66577 0;
+#X connect 1 0 0 0;
+#X connect 4 0 0 1;
diff --git a/doc/tutorials/intro/README.txt b/doc/tutorials/intro/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..69ab99e5f497bad8954f5eb26df682e77f3d4d66
--- /dev/null
+++ b/doc/tutorials/intro/README.txt
@@ -0,0 +1,19 @@
+
+This tutorial came out of the PDDP project:
+
+http://puredata.info/dev/pddp
+
+Contributors include (in alphabetical order):
+
+Alexandre Castonguay
+Aymeric Mansoux
+Ben Bogart <ben@ekran.org>
+Frank Barknecht
+Gregorio García Karman <ggkarman@airtel.net>
+Hans-Christoph Steiner <hans@at.or.at>
+Jerome Abel
+Koray Tahiroglu
+Malte Steiner
+Max Neupert
+Miller Puckette <msp@crca.ucsd.edu>
+Thomas Musil <musil@iem.at>
diff --git a/doc/tutorials/intro/TEMPLATE.pd b/doc/tutorials/intro/TEMPLATE.pd
new file mode 100644
index 0000000000000000000000000000000000000000..75492e997d5cb938783eb8be64cb923195b384c1
--- /dev/null
+++ b/doc/tutorials/intro/TEMPLATE.pd
@@ -0,0 +1,3 @@
+#N canvas 10 40 624 449 12;
+#X obj 10 10 cnv 15 400 40 empty empty TEMPLATE 20 12 0 24 -228992
+-66577 0;
diff --git a/doc/tutorials/intro/TODO b/doc/tutorials/intro/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..bc89634ab91b3d545c4a6d32efc1018d29c46d02
--- /dev/null
+++ b/doc/tutorials/intro/TODO
@@ -0,0 +1,68 @@
+
+- finish up 17.atomic_messages.pd
+
+- make new exercise in 26.EXERCISE.hmmmm
+
+- in pure_data_files.pd, make the patch create [pd clone] dynamically,
+  probably like how send_messages_to_pd.pd does it.
+
+- in pure_data_files.pd, make the patch reset itself once it finishes the
+  clone. (remember that [pd clone] has to be the last object.)
+
+- make looping sequence
+
+- 20.inlets_and_outlets: explain the message building, prepend, add2, set,
+     etc.  probalby, I should make a patch or two before that about message
+     buildling
+
+
+
+---------------
+Unsorted topics
+---------------
+
+- math
+- init to 0
+- comparing numbers
+- expr
+- creation arguments
+
+
+- selecting events ([select])
+- sorting_messages_by_selectors ([route])
+- sorting_messages_by_atom ([route])
+
+- storing a number globally ([value])
+
+- building lists (pack and unpack, arguments)
+- list2symbol
+
+- trigger conversions
+- symbol conversion
+
+- keywords
+
+- number limitations
+
+- more on timing
+
+- building lists
+- using lists (unpack, lists replacing inlets)
+
+- writing objects in Pd (abstractions)
+
+- loading libraries
+- namespaces
+- import
+
+- multiple messages
+- sends and receives
+- sends in a message box
+
+- Example: parazit
+- send messages to Pd
+- pure data files
+
+
+
+data structures tutorial?
diff --git a/doc/tutorials/intro/determinism.pd b/doc/tutorials/intro/determinism.pd
new file mode 100644
index 0000000000000000000000000000000000000000..23a5c6157831076ebc0a0b55d210c347cb848edf
--- /dev/null
+++ b/doc/tutorials/intro/determinism.pd
@@ -0,0 +1,16 @@
+#N canvas 10 40 636 461 12;
+#X obj 10 10 cnv 15 400 40 empty empty determinism 20 12 0 24 -228992
+-66577 0;
+#X obj 231 419 pddp/pddplink http://crca.ucsd.edu/~msp/Pd_documentation/x2.htm#s5.3
+;
+#X text 195 395 For more info:;
+#X obj 14 133 pddp/pddplink http://en.wikipedia.org/wiki/Deterministic_algorithm
+;
+#X text 9 73 Pd is designed to be "deterministic". This is a computer
+science term meaning to behave predictibly \, i.e. given a certain
+input \, it will always produce the same output.;
+#X text 9 163 For Pd \, this means that it will always run the program
+in the exact same order everytime. Even if the computer is not fast
+enough to complete all of the operations in realtime \, Pd will then
+cause an interruption while it ties to finish everything before moving
+to the next step.;
diff --git a/doc/tutorials/intro/keywords.pd b/doc/tutorials/intro/keywords.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0f935359f9367e15b85a3bf9b7a67a050d8d1b3b
--- /dev/null
+++ b/doc/tutorials/intro/keywords.pd
@@ -0,0 +1,8 @@
+#N canvas 21 40 643 459 12;
+#X obj -39 10 cnv 15 400 40 empty empty keywords 20 12 0 24 -228992
+-66577 0;
+#X text 127 126 float;
+#X text 127 106 bang;
+#X text 127 146 list;
+#X text 127 166 pointer;
+#X text 127 186 symbol;
diff --git a/doc/tutorials/intro/math.pd b/doc/tutorials/intro/math.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e7047c695a8a84925a6b32fac93a369e75669df9
--- /dev/null
+++ b/doc/tutorials/intro/math.pd
@@ -0,0 +1,434 @@
+#N canvas 436 10 551 278 10;
+#X obj 17 11 cnv 15 500 100 empty empty OPERATIONS: 20 12 0 14 -233017
+-66577 0;
+#N canvas 58 106 794 296 operations-logiques-relationnelles 0;
+#X obj 41 146 &;
+#X obj 91 146 |;
+#X obj 143 146 &&;
+#X obj 194 146 ||;
+#X obj 415 146 >;
+#X obj 464 146 >=;
+#X obj 517 146 ==;
+#X obj 618 146 <=;
+#X obj 665 146 <;
+#X obj 569 146 !=;
+#X obj 233 146 <<;
+#X obj 284 146 >>;
+#X floatatom 41 92 5 0 0 0 - - -;
+#X floatatom 303 93 5 0 0 0 - - -;
+#X floatatom 41 183 2 0 0 0 - - -;
+#X floatatom 91 183 2 0 0 0 - - -;
+#X floatatom 143 183 2 0 0 0 - - -;
+#X floatatom 194 183 2 0 0 0 - - -;
+#X floatatom 233 183 2 0 0 0 - - -;
+#X floatatom 284 183 2 0 0 0 - - -;
+#X floatatom 415 183 2 0 0 0 - - -;
+#X floatatom 464 183 2 0 0 0 - - -;
+#X floatatom 517 183 2 0 0 0 - - -;
+#X floatatom 569 183 2 0 0 0 - - -;
+#X floatatom 618 183 2 0 0 0 - - -;
+#X floatatom 665 183 2 0 0 0 - - -;
+#X floatatom 415 93 5 0 0 0 - - -;
+#X floatatom 684 93 5 0 0 0 - - -;
+#X text 38 33 Operateurs Logiques;
+#X text 39 45 -------------------;
+#X text 412 34 Operateurs Relationnelles;
+#X text 413 45 --------------------------;
+#X text 167 238 voir 17-exercices.pd : detecteur d'enveloppe;
+#X text 167 256 voir 19-exercices.pd : sequenceurs;
+#X connect 0 0 14 0;
+#X connect 1 0 15 0;
+#X connect 2 0 16 0;
+#X connect 3 0 17 0;
+#X connect 4 0 20 0;
+#X connect 5 0 21 0;
+#X connect 6 0 22 0;
+#X connect 7 0 24 0;
+#X connect 8 0 25 0;
+#X connect 9 0 23 0;
+#X connect 10 0 18 0;
+#X connect 11 0 19 0;
+#X connect 12 0 0 0;
+#X connect 12 0 1 0;
+#X connect 12 0 2 0;
+#X connect 12 0 3 0;
+#X connect 12 0 10 0;
+#X connect 12 0 11 0;
+#X connect 13 0 11 1;
+#X connect 13 0 10 1;
+#X connect 13 0 3 1;
+#X connect 13 0 2 1;
+#X connect 13 0 1 1;
+#X connect 13 0 0 1;
+#X connect 26 0 4 0;
+#X connect 26 0 5 0;
+#X connect 26 0 6 0;
+#X connect 26 0 9 0;
+#X connect 26 0 7 0;
+#X connect 26 0 8 0;
+#X connect 27 0 4 1;
+#X connect 27 0 5 1;
+#X connect 27 0 6 1;
+#X connect 27 0 9 1;
+#X connect 27 0 7 1;
+#X connect 27 0 8 1;
+#X restore 18 129 pd operations-logiques-relationnelles;
+#N canvas 0 0 795 354 operations-mathematiques 0;
+#X floatatom 31 72 5 0 0 0 - - -;
+#X obj 160 128 *;
+#X floatatom 238 72 5 0 0 0 - - -;
+#X floatatom 160 197 5 0 0 0 - - -;
+#X obj 31 128 +;
+#X obj 96 128 -;
+#X obj 219 128 /;
+#X floatatom 31 197 5 0 0 0 - - -;
+#X floatatom 96 197 5 0 0 0 - - -;
+#X floatatom 219 197 5 0 0 0 - - -;
+#X obj 375 134 pow 2;
+#X obj 441 133 pow -1;
+#X floatatom 375 80 5 0 0 0 - - -;
+#X floatatom 375 206 5 0 0 0 - - -;
+#X floatatom 441 206 5 0 0 0 - - -;
+#X obj 626 133 % 5;
+#X floatatom 611 81 5 0 0 0 - - -;
+#X floatatom 664 81 5 0 0 0 - - -;
+#X floatatom 626 206 5 0 0 0 - - -;
+#X text 628 242 Modulo;
+#X text 31 24 Operations Mathematiques;
+#X text 30 34 ------------------------;
+#X text 29 243 Operations arithmetiques standards;
+#X obj 691 132 mod 5;
+#X text 667 132 =;
+#X text 364 244 operations puissances;
+#X text 435 299 voir 18-exercices.pd : beat tempo;
+#X connect 0 0 1 0;
+#X connect 0 0 5 0;
+#X connect 0 0 6 0;
+#X connect 0 0 4 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 1;
+#X connect 2 0 4 1;
+#X connect 2 0 5 1;
+#X connect 2 0 6 1;
+#X connect 4 0 7 0;
+#X connect 5 0 8 0;
+#X connect 6 0 9 0;
+#X connect 10 0 13 0;
+#X connect 11 0 14 0;
+#X connect 12 0 10 0;
+#X connect 12 0 11 0;
+#X connect 15 0 18 0;
+#X connect 16 0 15 0;
+#X connect 17 0 15 1;
+#X restore 18 167 pd operations-mathematiques;
+#N canvas 29 79 932 301 operations-conditionnelles 0;
+#X floatatom 445 74 5 0 0 0 - - -;
+#X floatatom 504 74 5 0 0 0 - - -;
+#X floatatom 445 160 5 0 0 0 - - -;
+#X floatatom 504 160 5 0 0 0 - - -;
+#X obj 445 115 moses 10;
+#X obj 326 112 spigot;
+#X floatatom 22 96 5 0 0 0 - - -;
+#X obj 22 186 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 137 select 2 3 4;
+#X obj 52 186 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 82 186 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 113 186 5 0 0 0 - - -;
+#X obj 369 89 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X floatatom 326 70 5 0 0 0 - - -;
+#X floatatom 326 156 5 0 0 0 - - -;
+#X obj 621 183 print r1;
+#X obj 690 183 print r2;
+#X obj 759 183 print r3;
+#X obj 828 183 print r4;
+#X msg 621 69 1 2 3;
+#X msg 678 70 2 3 4;
+#X obj 621 130 route 1 2 symbol;
+#X msg 731 70 symbol bar;
+#X msg 732 97 who am I?;
+#X text 18 20 Operations Conditionnelles;
+#X text 18 32 --------------------------;
+#X text 18 61 Selectionner certaines entrees;
+#X text 325 36 Porte;
+#X text 438 36 Separer les entrees;
+#X text 619 38 Routage des entrees;
+#X obj 258 233 *;
+#X obj 277 208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 366 209 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 347 233 *~;
+#X text 257 181 autres Portes :;
+#X obj 449 203 cnv 15 74 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 624 223 cnv 15 107 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 625 243 cnv 15 113 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#N canvas 243 0 636 690 random 0;
+#X msg 103 95 bang;
+#X text 44 19 You can generate weighted random numbers from uniformly
+distributed ones. If you just want two possible outcomes with a varying
+probability for each one \, you can do as shown:;
+#X obj 103 121 random 100;
+#X obj 102 174 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 169 174 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 205 148 3 0 100 0 - - -;
+#X text 250 148 <-- change probablilty;
+#X obj 103 149 moses 80;
+#X text 152 93 <-- click to test;
+#X text 61 219 This outputs a number at left 80% of the time \, otherwise
+at right \, unless you override the "80" using the number box. You
+may extend this to more than two possible outcomes \, for instance
+like this:;
+#X msg 106 305 bang;
+#X obj 106 331 random 100;
+#X obj 105 384 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 195 387 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 155 303 <-- click to test;
+#X obj 106 359 moses 10;
+#X obj 196 360 moses 30;
+#X obj 263 387 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 103 409 10%;
+#X text 193 410 20%;
+#X text 265 409 70%;
+#X obj 103 736 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 100 821 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 181 820 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 218 822 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 100 843 1;
+#X msg 181 845 2;
+#X msg 218 846 3;
+#X obj 100 882 s state;
+#X obj 85 658 bng 20 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 121 641 r state;
+#X obj 102 710 sel 1 2 3;
+#X obj 274 738 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 271 823 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 353 825 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 392 828 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 271 846 1;
+#X msg 348 851 2;
+#X msg 392 852 3;
+#X obj 271 882 s state;
+#X obj 438 739 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 438 824 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 518 823 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X obj 557 826 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 438 847 1;
+#X msg 518 848 2;
+#X msg 557 849 3;
+#X obj 438 882 s state;
+#X msg 255 671 \; state 1;
+#X obj 102 684 f 1;
+#X obj 103 764 random 100;
+#X obj 102 793 moses 30;
+#X obj 181 794 moses 60;
+#X obj 274 765 random 100;
+#X obj 274 795 moses 10;
+#X obj 353 796 moses 60;
+#X obj 438 766 random 100;
+#X obj 438 795 moses 70;
+#X obj 518 795 moses 80;
+#X floatatom 133 666 3 0 0 0 - - -;
+#X text 255 651 reset;
+#X text 68 637 STEP;
+#X text 53 505 Here is how to construct a simple \, three-valued Markov
+chain using "random." Each time you click on "step" the previous output
+("state") determines which of three random networks to invoke \, each
+having a different probability distribution for the next value of "state."
+For instance if the state was 3 \, the next state will be 1 70% of
+the time \, state 2 10% \, and state 3 20%.;
+#X connect 0 0 2 0;
+#X connect 2 0 7 0;
+#X connect 5 0 7 1;
+#X connect 7 0 3 0;
+#X connect 7 1 4 0;
+#X connect 10 0 11 0;
+#X connect 11 0 15 0;
+#X connect 15 0 12 0;
+#X connect 15 1 16 0;
+#X connect 16 0 13 0;
+#X connect 16 1 17 0;
+#X connect 21 0 50 0;
+#X connect 22 0 25 0;
+#X connect 23 0 26 0;
+#X connect 24 0 27 0;
+#X connect 25 0 28 0;
+#X connect 26 0 28 0;
+#X connect 27 0 28 0;
+#X connect 29 0 49 0;
+#X connect 30 0 49 1;
+#X connect 30 0 59 0;
+#X connect 31 0 21 0;
+#X connect 31 1 32 0;
+#X connect 31 2 40 0;
+#X connect 32 0 53 0;
+#X connect 33 0 36 0;
+#X connect 34 0 37 0;
+#X connect 35 0 38 0;
+#X connect 36 0 39 0;
+#X connect 37 0 39 0;
+#X connect 38 0 39 0;
+#X connect 40 0 56 0;
+#X connect 41 0 44 0;
+#X connect 42 0 45 0;
+#X connect 43 0 46 0;
+#X connect 44 0 47 0;
+#X connect 45 0 47 0;
+#X connect 46 0 47 0;
+#X connect 49 0 31 0;
+#X connect 50 0 51 0;
+#X connect 51 0 22 0;
+#X connect 51 1 52 0;
+#X connect 52 0 23 0;
+#X connect 52 1 24 0;
+#X connect 53 0 54 0;
+#X connect 54 0 33 0;
+#X connect 54 1 55 0;
+#X connect 55 0 34 0;
+#X connect 55 1 35 0;
+#X connect 56 0 57 0;
+#X connect 57 0 41 0;
+#X connect 57 1 58 0;
+#X connect 58 0 42 0;
+#X connect 58 1 43 0;
+#X restore 448 203 pd random;
+#N canvas 0 0 357 255 route_lists 0;
+#X floatatom 228 32 5 0 0 0 - - -;
+#X obj 228 70 t b f;
+#X obj 228 120 pack s f;
+#X msg 81 30 droite;
+#X msg 17 30 gauche;
+#N canvas 510 50 299 253 test 0;
+#X obj 112 34 inlet;
+#X obj 185 175 outlet;
+#X obj 112 74 route list;
+#X obj 112 176 outlet;
+#X obj 112 116 route gauche droite;
+#X obj 79 166 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 216 152 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X connect 0 0 2 0;
+#X connect 2 0 4 0;
+#X connect 2 1 4 0;
+#X connect 4 0 3 0;
+#X connect 4 0 5 0;
+#X connect 4 1 1 0;
+#X connect 4 1 6 0;
+#X restore 228 189 pd test;
+#X floatatom 279 217 5 0 0 0 - - -;
+#X floatatom 228 217 5 0 0 0 - - -;
+#X msg 40 151 droite 10 \, gauche 40;
+#X symbolatom 139 32 10 0 0 0 - - -;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 7 0;
+#X connect 5 1 6 0;
+#X connect 8 0 5 0;
+#X connect 9 0 2 0;
+#X restore 625 243 pd route_lists;
+#N canvas 385 246 472 322 lists_pack 0;
+#X obj 68 114 pack 0 5 s;
+#X obj 68 160 print;
+#X obj 189 168 unpack 0 0 s;
+#X floatatom 189 204 5 0 0 0 - - -;
+#X floatatom 234 204 5 0 0 0 - - -;
+#X msg 280 236 Hello;
+#X msg 280 204 set \$1;
+#X obj 37 79 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 143 79 symbol Hello;
+#X floatatom 105 79 3 0 0 0 - - -;
+#X floatatom 68 79 3 0 0 0 - - -;
+#X text 35 24 Making lists with pack;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 2 2 6 0;
+#X connect 6 0 5 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 2;
+#X connect 9 0 0 1;
+#X connect 10 0 0 0;
+#X restore 625 223 pd lists_pack;
+#X connect 0 0 4 0;
+#X connect 1 0 4 1;
+#X connect 4 0 2 0;
+#X connect 4 1 3 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 8 0 7 0;
+#X connect 8 1 9 0;
+#X connect 8 2 10 0;
+#X connect 8 3 11 0;
+#X connect 12 0 5 1;
+#X connect 13 0 5 0;
+#X connect 19 0 21 0;
+#X connect 20 0 21 0;
+#X connect 21 0 15 0;
+#X connect 21 1 16 0;
+#X connect 21 2 17 0;
+#X connect 21 3 18 0;
+#X connect 22 0 21 0;
+#X connect 23 0 21 0;
+#X connect 31 0 30 1;
+#X connect 32 0 33 1;
+#X restore 18 205 pd operations-conditionnelles;
+#X text 322 129 > < != >= . . .;
+#X text 36 34 Pour aller plus loin dans les possibilites relationnelles
+:;
+#X text 249 165 - + = / *;
+#X text 270 204 selection \, routage \, porte \, ...;
+#N canvas 0 0 556 312 changementEchelles 0;
+#X text 11 3 But : passer un nombre qui va de 0 a 127 en un nombre
+entre 40 et 3000;
+#X obj 171 43 maxlib/scale 0 127 40 3000;
+#X text 13 43 Un objet fait ca :;
+#X text 9 92 Mais on peut faire tout aussi bien en utilisant les objets
+[expr] qui servent tres bien pour tout calcul.;
+#X floatatom 130 173 5 0 0 0 - - -;
+#X floatatom 130 260 5 0 0 0 - - -;
+#X text 452 124 0 : x1;
+#X text 436 139 127 : x2;
+#X text 444 153 40 : x3;
+#X text 428 168 3000 : x4;
+#X obj 130 202 expr ( (($f1-O)/(127-0))*(3000-40) ) + (40-0);
+#X msg 60 136 0;
+#X msg 94 137 60;
+#X msg 126 138 127;
+#X connect 4 0 10 0;
+#X connect 10 0 5 0;
+#X connect 11 0 4 0;
+#X connect 12 0 4 0;
+#X connect 13 0 4 0;
+#X restore 17 242 pd changementEchelles;
+#X text 204 243 objet [expr];
diff --git a/doc/tutorials/intro/send_and_receive.pd b/doc/tutorials/intro/send_and_receive.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fad96f07612d3d16268756c2f6d3ba1233527d3a
--- /dev/null
+++ b/doc/tutorials/intro/send_and_receive.pd
@@ -0,0 +1,132 @@
+#N canvas 433 8 555 660 10;
+#X obj 22 344 cnv 15 500 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 26 518 cnv 15 500 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 24 723 cnv 15 500 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 22 12 cnv 15 500 100 empty empty MESSAGES:send_variables_II
+20 12 0 14 -233017 -66577 0;
+#X obj 39 170 hsl 50 15 0 127 0 0 empty empty empty -2 -6 0 8 -261689
+-258699 -1 0 0;
+#X floatatom 37 369 5 0 0 0 - - -;
+#X floatatom 95 370 5 0 0 0 - - -;
+#N canvas 0 0 392 106 sous-patchs1 0;
+#X floatatom 1 62 5 0 0 0 - - -;
+#X obj 1 39 r A;
+#X text -3 5 Ce sous-patch recevra TOUS les "send A";
+#X connect 1 0 0 0;
+#X restore 38 437 pd sous-patchs1;
+#N canvas 4 159 254 107 sous-patchs2 0;
+#X floatatom 18 59 5 0 0 0 - - -;
+#N canvas 5 328 278 106 sous-patchs3 0;
+#X floatatom 12 70 5 0 0 0 - - -;
+#X obj 12 44 r A;
+#X text 9 4 bien que loin du patch-MERE;
+#X text 8 20 on recoit les "send A";
+#X connect 1 0 0 0;
+#X restore 78 47 pd sous-patchs3;
+#X obj 18 24 r B;
+#X connect 2 0 0 0;
+#X restore 38 463 pd sous-patchs2;
+#X text 32 133 On peut avoir autant de send/receive du meme nom;
+#X obj 36 191 send JeanPaulII;
+#X obj 166 169 hsl 50 15 0 127 0 0 empty empty empty -2 -6 0 8 -261689
+-258699 -1 0 0;
+#X obj 163 190 send JeanPaulII;
+#X obj 304 168 hsl 50 15 0 127 0 0 empty empty empty -2 -6 0 8 -261689
+-258699 -1 0 0;
+#X obj 301 189 send JeanPaulII;
+#X obj 40 253 hsl 50 15 0 127 0 0 empty empty empty -2 -6 0 8 -261689
+-258699 -1 0 0;
+#X obj 37 229 receive JeanPaulII;
+#X obj 193 253 hsl 50 15 0 127 0 0 empty empty empty -2 -6 0 8 -261689
+-258699 -1 0 0;
+#X obj 190 229 receive Poutine;
+#X text 251 249 <- on ne recoit pas;
+#X text 34 345 GLOBAL - envoie et recoie un message dans TOUS LES PATCHS
+;
+#X obj 37 393 s A;
+#X obj 95 393 s B;
+#X floatatom 37 642 5 0 0 0 - - -;
+#X obj 221 604 f \$0;
+#X obj 221 584 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 221 631 5 0 0 0 - - -;
+#X floatatom 38 585 5 0 0 0 - - -;
+#X floatatom 128 611 5 0 0 0 - - -;
+#X obj 38 609 s \$0-foo;
+#X obj 128 585 r \$0-foo;
+#X obj 37 666 s 1012-foo;
+#N canvas 318 78 289 202 sous-patch4 0;
+#X obj 27 33 f \$0;
+#X obj 27 13 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 27 60 5 0 0 0 - - -;
+#X floatatom 117 47 5 0 0 0 - - -;
+#X obj 117 21 r \$0-foo;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 4 0 3 0;
+#X restore 153 666 pd sous-patch4;
+#X text 34 538 \$0 : variable au hasard designee par pd au demarrage
+\, qui certifie que la variable est unique dans tous les patchs;
+#X text 37 516 LOCAL - variable unique/chaque demarrage;
+#X text 34 809 Nous pouvons utiliser les arguments de l'abstraction
+pour envoyer les valeures a ces fils.;
+#X text 33 754 Dans PD \, chaque abstractions et sous-patchs ont des
+parents. Le parent est le patch principal dans lequel est creer l'instance
+de l'abstraction ou du sous-patch.;
+#X floatatom 124 865 5 0 0 0 - - -;
+#X floatatom 198 864 5 0 0 0 - - -;
+#X floatatom 270 864 5 0 0 0 - - -;
+#X obj 198 888 s 2-fils;
+#X obj 270 889 s 3-petit-fils;
+#X floatatom 132 980 5 0 0 0 - - -;
+#X obj 132 1005 s 1-2-fils;
+#X text 33 305 La portee d'un message peut etre GLOBAL/LOCAL/UNIQUE
+:;
+#X text 34 726 UNIQUE - heriter la variable des parents/ message unique
+;
+#X text 41 44 Utilisation des objets send et receive permet d'envoyer
+des messages sans fils. Un peu comme une RADIO \, il faut que ces deux
+objets ait le meme nom pour etre connecte.;
+#X obj 45 864 mere 1;
+#X obj 124 889 s 1-mere;
+#X text 37 946 difficulte : 2 variables composent le nom du send/receive
+;
+#X obj 149 1338 dist;
+#X obj 194 1338 remote;
+#X obj 255 1338 matrix;
+#X obj 21 1304 cnv 15 500 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 34 1306 ROUTING DES MESSAGES;
+#X obj 30 1338 table routing;
+#X obj 317 1338 OSCroute;
+#X text 30 1037 Les signes dollar $ se placent toujours au debut du
+symbol. Pour avoir plusieurs dollars \, on peut utiliser les abstractions
+\, en les imbriquant les unes dans les autres avec \$1-maVariable.
+une autre methode avec makefilename (voir 11-page.pd);
+#X text 28 1366 voir 21-exercices.pd;
+#X obj 29 1141 cnv 15 500 20 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X text 40 1142 RESEAU;
+#X obj 44 1182 netreceive;
+#X obj 128 1182 netsend;
+#X obj 44 1219 OSCroute;
+#X connect 4 0 10 0;
+#X connect 5 0 21 0;
+#X connect 6 0 22 0;
+#X connect 11 0 12 0;
+#X connect 13 0 14 0;
+#X connect 16 0 15 0;
+#X connect 18 0 17 0;
+#X connect 23 0 31 0;
+#X connect 24 0 26 0;
+#X connect 25 0 24 0;
+#X connect 27 0 29 0;
+#X connect 30 0 28 0;
+#X connect 37 0 48 0;
+#X connect 38 0 40 0;
+#X connect 39 0 41 0;
+#X connect 42 0 43 0;
diff --git a/doc/tutorials/intro/shell_sketch.pd b/doc/tutorials/intro/shell_sketch.pd
new file mode 100644
index 0000000000000000000000000000000000000000..31cffaa64f4eb77b0baa59fa9b78124266d39ce7
--- /dev/null
+++ b/doc/tutorials/intro/shell_sketch.pd
@@ -0,0 +1,16 @@
+#N canvas 369 214 524 457 10;
+#X obj 92 138 soundfiler;
+#X obj 228 139 getdir;
+#X obj 168 319 shell;
+#X obj 169 373 print;
+#X obj 233 98 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 191 253 t a a;
+#X obj 225 275 print;
+#X msg 169 220 ls -1 "$1";
+#X connect 1 0 7 0;
+#X connect 2 0 3 0;
+#X connect 4 0 1 0;
+#X connect 5 0 2 0;
+#X connect 5 1 6 0;
+#X connect 7 0 5 0;
diff --git a/doc/tutorials/intro/sorting_messages_by_selectors.pd b/doc/tutorials/intro/sorting_messages_by_selectors.pd
new file mode 100644
index 0000000000000000000000000000000000000000..21955ca5eb5422af940cbfc8a3825bfed6f28240
--- /dev/null
+++ b/doc/tutorials/intro/sorting_messages_by_selectors.pd
@@ -0,0 +1,3 @@
+#N canvas 290 64 632 457 12;
+#X obj 10 10 cnv 15 420 40 empty empty sorting_messages_by_selector
+20 12 0 24 -228992 -66577 0;
diff --git a/doc/tutorials/intro/storing_a_number_globally.pd b/doc/tutorials/intro/storing_a_number_globally.pd
new file mode 100644
index 0000000000000000000000000000000000000000..42ceaaf64cd6815982d80d3117c216fdb348fd46
--- /dev/null
+++ b/doc/tutorials/intro/storing_a_number_globally.pd
@@ -0,0 +1,35 @@
+#N canvas 326 214 628 453 12;
+#X obj 10 10 cnv 15 400 40 empty empty storing_a_number_globally 20
+12 0 24 -228992 -66577 0;
+#X obj 223 131 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X floatatom 223 180 5 0 0 0 - - -;
+#X obj 223 156 value variable1;
+#X obj 58 133 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X floatatom 58 182 5 0 0 0 - - -;
+#X obj 58 158 value variable1;
+#X floatatom 88 134 5 0 0 0 - - -;
+#X floatatom 252 131 5 0 0 0 - - -;
+#X obj 273 268 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X floatatom 273 317 5 0 0 0 - - -;
+#X obj 58 270 bng 20 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X floatatom 58 319 5 0 0 0 - - -;
+#X floatatom 88 271 5 0 0 0 - - -;
+#X floatatom 302 268 5 0 0 0 - - -;
+#X obj 273 293 value something_else;
+#X obj 58 295 value something_else;
+#X connect 1 0 3 0;
+#X connect 3 0 2 0;
+#X connect 4 0 6 0;
+#X connect 6 0 5 0;
+#X connect 7 0 6 0;
+#X connect 8 0 3 0;
+#X connect 9 0 15 0;
+#X connect 11 0 16 0;
+#X connect 13 0 16 0;
+#X connect 14 0 15 0;
+#X connect 15 0 10 0;
+#X connect 16 0 12 0;
diff --git a/doc/tutorials/intro/symbol_conversion.pd b/doc/tutorials/intro/symbol_conversion.pd
new file mode 100644
index 0000000000000000000000000000000000000000..63c1446ba46e3feb0b2aab6f27017768beaf796d
--- /dev/null
+++ b/doc/tutorials/intro/symbol_conversion.pd
@@ -0,0 +1,20 @@
+#N canvas 68 53 638 461 12;
+#X obj 10 -38 cnv 15 400 40 empty empty symbol_conversion 20 12 0 24
+-228992 -66577 0;
+#X symbolatom 73 319 10 0 0 0 - - -;
+#X text 12 27 A symbolic atom is not the same thing as a symbol message.
+This is a key distinction which becomes especially relevant when processing
+more complicated messages.;
+#X msg 32 169 nope;
+#X obj 90 272 symbol;
+#X msg 90 226 yes;
+#X text 90 169 <-- click and look at Pd window;
+#X text 11 95 In addition to being a storage object \, [symbol] also
+serves as a conversion object. Many objects only receive symbolic data
+in the form of a symbol message.;
+#X text 186 319 <-- expects a symbol message;
+#X text 159 274 <-- converts symbolic input to symbol message;
+#X text 139 225 <-- click to see this one get converted;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
diff --git a/doc/tutorials/intro/typing_conventions.pd b/doc/tutorials/intro/typing_conventions.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5f3f8c2d8ce564a4cb6c56474315c2838bdf71be
--- /dev/null
+++ b/doc/tutorials/intro/typing_conventions.pd
@@ -0,0 +1,25 @@
+#N canvas 468 219 647 458 12;
+#X obj -29 10 cnv 15 400 40 empty empty typing_conventions 20 12 0
+24 -228992 -66577 0;
+#X text 17 160 an object is a word surrounded by two square brackets
+;
+#X text -18 135 [route] ==;
+#X obj 95 136 route;
+#X msg 106 203 my msg;
+#X text -18 202 [my msg( ==;
+#X text -18 290 You can even make ASCII patches:;
+#X msg 344 310 bang;
+#X obj 344 349 delay 500;
+#X text -1 318 [bang(;
+#X text 2 335 |;
+#X text -1 351 [delay 500];
+#X text 2 371 |;
+#X text 204 350 ==;
+#X text -1 388 [print why?];
+#X obj 344 388 print why?;
+#X text -26 72 When typing out various Pd elements \, there are a couple
+conventions:;
+#X text 17 230 an message is a word preceeded by an open square bracket
+and terminated by an open parenthesis;
+#X connect 7 0 8 0;
+#X connect 8 0 15 0;
diff --git a/doc/tutorials/intro/weighted_random.pd b/doc/tutorials/intro/weighted_random.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c81bf290fa31f25ce873e59da53da83175c61186
--- /dev/null
+++ b/doc/tutorials/intro/weighted_random.pd
@@ -0,0 +1,103 @@
+#N canvas 207 22 705 549 10;
+#X obj 14 64 cnv 15 270 210 empty empty empty 20 12 0 14 -196506 -66577
+0;
+#X obj 12 290 cnv 15 270 210 empty empty empty 20 12 0 14 -196506 -66577
+0;
+#X obj 326 62 cnv 15 270 210 empty empty empty 20 12 0 14 -196506 -66577
+0;
+#X obj 328 288 cnv 15 320 210 empty empty empty 20 12 0 14 -196506
+-66577 0;
+#X msg 45 325 bang;
+#X obj 45 351 random 100;
+#X obj 44 404 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 181 405 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 45 379 moses 10;
+#X obj 231 409 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 42 429 10%;
+#X text 112 428 20%;
+#X obj 181 379 moses 60;
+#X text 231 434 40%;
+#X text 179 429 30%;
+#X obj 112 402 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 113 380 moses 20;
+#X msg 360 116 bang;
+#X obj 360 142 random 100;
+#X obj 359 195 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 449 198 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 360 170 moses 10;
+#X obj 450 171 moses 30;
+#X obj 502 198 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 359 223 10%;
+#X text 449 224 20%;
+#X text 501 225 70%;
+#X msg 67 113 bang;
+#X obj 67 139 random 100;
+#X obj 66 195 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 117 193 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 66 167 moses 10;
+#X text 112 220 %90;
+#X text 66 222 %10;
+#X text 34 90 with two possible outcomes;
+#X text 344 87 with three possible outcomes;
+#X text 41 299 with four possible outcomes;
+#X msg 358 318 bang;
+#X obj 358 344 random 100;
+#X obj 357 397 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 494 398 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 425 421 20%;
+#X obj 494 372 moses 60;
+#X obj 425 395 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 358 372 moses 20;
+#X obj 425 373 moses 40;
+#X obj 563 398 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 613 398 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 562 372 moses 80;
+#X text 355 422 20%;
+#X text 492 422 20%;
+#X text 561 421 20%;
+#X text 615 422 20%;
+#X text 353 296 with five possible outcomes;
+#X text 35 10 weighted random possiblity patches;
+#X text 512 518 2006_Koray Tahiroglu;
+#X connect 4 0 5 0;
+#X connect 5 0 8 0;
+#X connect 8 0 6 0;
+#X connect 8 1 16 0;
+#X connect 12 0 7 0;
+#X connect 12 1 9 0;
+#X connect 16 0 15 0;
+#X connect 16 1 12 0;
+#X connect 17 0 18 0;
+#X connect 18 0 21 0;
+#X connect 21 0 19 0;
+#X connect 21 1 22 0;
+#X connect 22 0 20 0;
+#X connect 22 1 23 0;
+#X connect 27 0 28 0;
+#X connect 28 0 31 0;
+#X connect 31 0 29 0;
+#X connect 31 1 30 0;
+#X connect 37 0 38 0;
+#X connect 38 0 44 0;
+#X connect 42 0 40 0;
+#X connect 42 1 48 0;
+#X connect 44 0 39 0;
+#X connect 44 1 45 0;
+#X connect 45 0 43 0;
+#X connect 45 1 42 0;
+#X connect 48 0 46 0;
+#X connect 48 1 47 0;
diff --git a/doc/tutorials/networking/01.network_ports.pd b/doc/tutorials/networking/01.network_ports.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fa7e94f7906da56d15fecfdb578cc391e505b65a
--- /dev/null
+++ b/doc/tutorials/networking/01.network_ports.pd
@@ -0,0 +1,24 @@
+#N canvas 10 40 620 460 10;
+#X obj 8 10 cnv 15 400 40 empty empty network_ports 20 12 0 24 -228992
+-66577 0;
+#X obj 49 418 pddp/pddplink http://en.wikipedia.org/wiki/TCP_and_UDP_port
+;
+#X text 10 63 In computer speak \, a "port" is an interface thru which
+data is sent and received. Network ports are numbered \, and can be
+1-65535. Network services are usually registered to use a specific
+network port. HTTP uses port 80 \, sending email uses port 25 \, IMAP
+uses port 143;
+#X text 10 140 Before using a network port for your application \,
+you should check to make sure that it isn't already used. You can see
+a list of registered ports in a file called "services". On UNIX-based
+systems \, its located in /etc/services. On Windows \, its located
+in C:/WINDOWS/system32/drivers/etc/services;
+#X text 10 231 On UNIX-based systems \, ports 0-1024 can only be used
+by the administrator account "root". Windows does not have this restriction.
+Most of the ports below 1024 are claimed anyway \, so its best to use
+port numbers higher than 1024;
+#X text 9 331 root-only;
+#X text 101 330 often used;
+#X text 255 330 mostly available;
+#X text 6 348 0.......1024............10000..........................65535
+;
diff --git a/doc/tutorials/networking/02.netsend_netreceive.pd b/doc/tutorials/networking/02.netsend_netreceive.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5e1df40abad372abf8063565d7076ee79f8105d8
--- /dev/null
+++ b/doc/tutorials/networking/02.netsend_netreceive.pd
@@ -0,0 +1,36 @@
+#N canvas 10 40 620 460 10;
+#X obj 8 10 cnv 15 400 40 empty empty netsend_netreceive 20 12 0 24
+-228992 -66577 0;
+#X obj 56 211 send \$0-local-data;
+#X obj 56 342 receive \$0-local-data;
+#X obj 60 174 hsl 150 20 0 127 0 0 empty empty empty -2 -6 0 8 -225271
+-1 -1 0 1;
+#X obj 59 381 hsl 150 20 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 311 174 hsl 150 20 0 127 0 0 empty empty empty -2 -6 0 8 -225280
+-1 -1 0 1;
+#X obj 311 381 hsl 150 20 0 127 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 0 1;
+#X obj 308 261 netsend;
+#X obj 308 341 netreceive 34567;
+#X msg 326 222 connect localhost 34567;
+#X obj 308 280 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 415 360 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 329 279 <-- connection status;
+#X text 433 360 <-- connection status;
+#X msg 327 241 disconnect;
+#X msg 308 199 send \$1;
+#X text 45 78 At the most basic level \, networking in Pd works a lot
+like the standard [send] and [receive] objects \, except there is a
+network port number rather than a send/receive name:;
+#X connect 2 0 4 0;
+#X connect 3 0 1 0;
+#X connect 5 0 15 0;
+#X connect 7 0 10 0;
+#X connect 8 0 6 0;
+#X connect 8 1 11 0;
+#X connect 9 0 7 0;
+#X connect 14 0 7 0;
+#X connect 15 0 7 0;
diff --git a/doc/tutorials/networking/03.tcp_and_udp.pd b/doc/tutorials/networking/03.tcp_and_udp.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3d2ad90dfdf70ac78b6a27020ca69841ad525ebf
--- /dev/null
+++ b/doc/tutorials/networking/03.tcp_and_udp.pd
@@ -0,0 +1,36 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib libdir;
+#X obj 440 65 import maxlib oscx mrpeach;
+#X obj 10 10 cnv 15 400 40 empty empty tcp_and_udp 20 12 0 24 -228992
+-66577 0;
+#X text 11 66 There are two main protocols for transmitting data over
+networks: TCP and UDP.;
+#X text 35 119 TCP is the most common \, it stands for Transmission
+Control Protocol. Basically \, that means that the protocol manages
+the transmission of the data. With TCP \, when you send a packet of
+data \, its guaranteed to arrive.;
+#X text 34 202 By default \, most networking objects in Pd use TCP:
+;
+#X obj 54 223 netsend;
+#X obj 266 224 netclient;
+#X obj 359 224 netserver;
+#X text 178 265 UDP stands for User Datagram Protocol. It is a lightweight
+\, simple protocol that is meant to be as quick and small as possible.
+The downside is that the data packets are not guaranteed to arrive.
+;
+#X obj 35 180 pddp/pddplink http://en.wikipedia.org/wiki/Transmission_Control_Protocol
+;
+#X obj 177 325 pddp/pddplink http://en.wikipedia.org/wiki/User_Datagram_Protocol
+;
+#X obj 132 224 netreceive 32194;
+#X obj 305 356 netreceive 32194 1;
+#X obj 227 356 netsend 1;
+#X obj 447 356 sendOSC;
+#X obj 518 356 dumpOSC 32192;
+#X text 180 399 One advantage to UDP is that you do not need to maintain
+a connection to receive data. Whenever you open a UDP port \, you will
+start receiving data.;
+#X obj 442 224 tcpclient;
+#X obj 525 224 tcpserver;
+#X obj 143 356 udpreceive;
+#X obj 70 356 udpsend;
diff --git a/doc/tutorials/networking/04.netserver_and_netclient.pd b/doc/tutorials/networking/04.netserver_and_netclient.pd
new file mode 100644
index 0000000000000000000000000000000000000000..03729524a4b06d266eaec1c11a03600312b04983
--- /dev/null
+++ b/doc/tutorials/networking/04.netserver_and_netclient.pd
@@ -0,0 +1,57 @@
+#N canvas 46 48 620 460 10;
+#X declare -lib maxlib;
+#X obj 463 52 import maxlib;
+#X obj 8 10 cnv 15 400 40 empty empty netserver_and_netclient 20 12
+0 24 -228992 -66577 0;
+#X floatatom 61 243 5 0 0 0 - - -;
+#X floatatom 91 224 5 0 0 0 - - -;
+#X symbolatom 165 178 10 0 0 0 - - -;
+#X floatatom 122 201 5 0 0 0 - - -;
+#X text 160 203 socket number;
+#X obj 125 375 netclient;
+#X msg 164 344 disconnect;
+#X floatatom 184 397 5 0 0 0 - - -;
+#X msg 141 296 send \$1;
+#X obj 338 373 netclient;
+#X msg 355 343 disconnect;
+#X floatatom 395 394 5 0 0 0 - - -;
+#X msg 338 303 send \$1;
+#X floatatom 140 278 5 0 0 0 - - -;
+#X floatatom 337 285 5 0 0 0 - - -;
+#X obj 61 177 netserver 3001;
+#X msg 124 323 connect localhost 3001;
+#X msg 307 324 connect localhost 3001;
+#X msg 21 136 broadcast hello kuva!;
+#X text 99 244 data;
+#X text 133 225 connections;
+#X text 164 163 IP address;
+#X text 343 177 netserver connects;
+#X text 342 189 different clients over;
+#X text 342 203 a network \, broadcasting;
+#X text 342 215 stream of information;
+#X text 341 226 through a server;
+#X text 13 71 [netserver] and [netclient] gives you a bi-directional
+connection so you can send data back and forth thru it. Also \, [netserver]
+helps you manage multiple connections.;
+#X obj 125 419 pddp/print;
+#X obj 338 419 pddp/print;
+#X msg 161 136 broadcast goodbye avuk!;
+#X text 312 136 <-- click to send to all connected netclients;
+#X connect 7 0 30 0;
+#X connect 7 1 9 0;
+#X connect 8 0 7 0;
+#X connect 10 0 7 0;
+#X connect 11 0 31 0;
+#X connect 11 1 13 0;
+#X connect 12 0 11 0;
+#X connect 14 0 11 0;
+#X connect 15 0 10 0;
+#X connect 16 0 14 0;
+#X connect 17 0 2 0;
+#X connect 17 1 3 0;
+#X connect 17 2 5 0;
+#X connect 17 3 4 0;
+#X connect 18 0 7 0;
+#X connect 19 0 11 0;
+#X connect 20 0 17 0;
+#X connect 32 0 17 0;
diff --git a/doc/tutorials/networking/05.OSC.pd b/doc/tutorials/networking/05.OSC.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1a1872d0ee6e6f6a92393ba77c0813082c02c668
--- /dev/null
+++ b/doc/tutorials/networking/05.OSC.pd
@@ -0,0 +1,45 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib libdir;
+#X obj 493 25 import oscx;
+#X obj 8 10 cnv 15 400 40 empty empty OSC 20 12 0 24 -228992 -66577
+0;
+#X obj 80 298 sendOSC;
+#X floatatom 79 323 5 0 0 0 - - -;
+#X msg 113 271 disconnect;
+#X floatatom 123 322 5 0 0 0 - - -;
+#X msg 21 164 send /kuva \$1;
+#X floatatom 22 149 5 0 0 0 - - -;
+#X floatatom 122 148 5 0 0 0 - - -;
+#X floatatom 342 295 5 0 0 0 - - -;
+#X obj 338 312 print kuva;
+#X msg 122 164 send /space \$1;
+#X obj 340 231 dumpOSC 30200;
+#X msg 109 249 connect localhost 30200;
+#X floatatom 231 147 5 0 0 0 - - -;
+#X msg 231 163 send /asdf \$1;
+#X obj 339 259 OSCroute /kuva /space;
+#X obj 414 312 print space;
+#X obj 498 312 print other;
+#X floatatom 421 295 5 0 0 0 - - -;
+#X text 10 65 OSC is a protocol for sharing data across networks and
+applications. OSC stands for Open Sound Control. It was originally
+designed to replace MIDI \, but it has caught on instead for inter-application
+communication.;
+#X text 21 361 On the most basic level \, it works very similarly to
+[netsend] and [netreceive].;
+#X connect 2 0 3 0;
+#X connect 2 1 5 0;
+#X connect 4 0 2 0;
+#X connect 6 0 2 0;
+#X connect 7 0 6 0;
+#X connect 8 0 11 0;
+#X connect 11 0 2 0;
+#X connect 12 0 16 0;
+#X connect 13 0 2 0;
+#X connect 14 0 15 0;
+#X connect 15 0 2 0;
+#X connect 16 0 9 0;
+#X connect 16 0 10 0;
+#X connect 16 1 17 0;
+#X connect 16 1 19 0;
+#X connect 16 2 18 0;
diff --git a/doc/tutorials/networking/06.routing_OSC.pd b/doc/tutorials/networking/06.routing_OSC.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8c8a5a3fe3ce120481d78bdbdb7511a48cf1e132
--- /dev/null
+++ b/doc/tutorials/networking/06.routing_OSC.pd
@@ -0,0 +1,53 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib libdir;
+#X obj 470 51 import oscx;
+#X obj 8 10 cnv 15 400 40 empty empty routing_OSC 20 12 0 24 -228992
+-66577 0;
+#X text 13 61 OSC messages have two parts \, the identifier and the
+data. The idenifier is made up of symbols separated by slashes ("/").
+[OSCroute] is similar to [route] but is specifically for OSC messages.
+;
+#X obj 24 168 OSCroute /test;
+#X obj 24 223 OSCroute /message;
+#X obj 35 193 print first;
+#X obj 23 272 symbol;
+#X symbolatom 23 296 0 0 0 0 - - -;
+#X obj 362 272 symbol;
+#X symbolatom 362 296 0 0 0 0 - - -;
+#X obj 363 168 route test;
+#X obj 363 223 route message;
+#X obj 35 246 print second;
+#X msg 25 123 /test/message OSCdata;
+#X msg 363 124 test message pddata;
+#X obj 374 193 print 1st;
+#X obj 374 247 print 2nd;
+#X msg 33 145 /test/message otherOSCdata;
+#X msg 378 145 test message otherpddata;
+#X text 17 321 Like [route] \, [OSCroute] outputs anything that didn't
+match out of the right-most outlet. This includes patterns not starting
+with a / and patterns starting with a number.;
+#X obj 165 435 bng 15 250 50 0 empty empty match 18 8 0 12 -262144
+-1 -1;
+#X obj 257 435 bng 15 250 50 0 empty empty unmatched 18 8 0 12 -262144
+-1 -1;
+#X msg 204 375 test/message data;
+#X msg 42 376 /test/message data;
+#X obj 165 413 OSCroute /test;
+#X connect 3 0 4 0;
+#X connect 3 0 5 0;
+#X connect 4 0 6 0;
+#X connect 4 0 12 0;
+#X connect 6 0 7 0;
+#X connect 8 0 9 0;
+#X connect 10 0 11 0;
+#X connect 10 0 15 0;
+#X connect 11 0 8 0;
+#X connect 11 0 16 0;
+#X connect 13 0 3 0;
+#X connect 14 0 10 0;
+#X connect 17 0 3 0;
+#X connect 18 0 10 0;
+#X connect 22 0 24 0;
+#X connect 23 0 24 0;
+#X connect 24 0 20 0;
+#X connect 24 1 21 0;
diff --git a/doc/tutorials/networking/07.matching_with_wildcards.pd b/doc/tutorials/networking/07.matching_with_wildcards.pd
new file mode 100644
index 0000000000000000000000000000000000000000..612e807078aed56ad8f90fb03f833eb38192ed95
--- /dev/null
+++ b/doc/tutorials/networking/07.matching_with_wildcards.pd
@@ -0,0 +1,45 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib libdir;
+#X obj 477 26 import oscx;
+#X obj 8 10 cnv 15 400 40 empty empty matching_with_wildcards 20 12
+0 24 -228992 -66577 0;
+#X text 10 69 OSC gives you a very useful feature which regular [route]
+does not: wildcards. Wildcards are characters that match any pattern.
+The * is the most common \, it means match any amount of any character:
+;
+#X obj 38 236 bng 15 250 50 0 empty empty match 18 8 0 12 -262144 -1
+-1;
+#X obj 130 236 bng 15 250 50 0 empty empty unmatched 18 8 0 12 -262144
+-1 -1;
+#X msg 30 134 /test/message data;
+#X obj 37 216 OSCroute /*;
+#X msg 56 185 /1/2/3 data;
+#X msg 56 159 /some/other/message 1 2 3;
+#X text 142 214 <-- notice the * in the pattern;
+#X text 320 347 <-- notice the * in the pattern;
+#X msg 212 278 /inst2/note B;
+#X msg 110 279 /inst1/note C;
+#X msg 229 319 /inst3/note F;
+#X obj 202 346 OSCroute /*;
+#X msg 219 298 /player3/note D;
+#X obj 274 366 bng 15 250 50 0 empty empty unmatched 18 8 0 12 -262144
+-1 -1;
+#X obj 294 409 bng 15 250 50 0 empty empty unmatched 18 8 0 12 -262144
+-1 -1;
+#X obj 202 388 OSCroute /note;
+#X obj 202 410 symbol;
+#X symbolatom 202 432 10 0 0 0 - - -;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 6 1 4 0;
+#X connect 7 0 6 0;
+#X connect 8 0 6 0;
+#X connect 11 0 14 0;
+#X connect 12 0 14 0;
+#X connect 13 0 14 0;
+#X connect 14 0 18 0;
+#X connect 14 1 16 0;
+#X connect 15 0 14 0;
+#X connect 18 0 19 0;
+#X connect 18 1 17 0;
+#X connect 19 0 20 0;
diff --git a/doc/tutorials/networking/08.wildcard_messages.pd b/doc/tutorials/networking/08.wildcard_messages.pd
new file mode 100644
index 0000000000000000000000000000000000000000..83e41f6e1493009e9a77bc474f2749bb5aadb624
--- /dev/null
+++ b/doc/tutorials/networking/08.wildcard_messages.pd
@@ -0,0 +1,51 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib libdir;
+#X obj 468 43 import oscx;
+#X obj 8 10 cnv 15 400 40 empty empty wildcard_messages 20 12 0 24
+-228992 -66577 0;
+#X text 300 212 <-- notice the * in the pattern;
+#X msg 162 154 /inst2/note B;
+#X msg 151 135 /inst1/note C;
+#X msg 172 175 /inst3/note F;
+#X obj 355 309 bng 15 250 50 0 empty empty unmatched 18 8 0 12 -262144
+-1 -1;
+#X obj 64 378 symbol;
+#X symbolatom 64 400 10 0 0 0 - - -;
+#X obj 157 288 OSCroute /inst1 /inst2 /inst3;
+#X msg 199 213 /inst*/note F;
+#X obj 64 355 OSCroute /note;
+#X obj 172 379 symbol;
+#X symbolatom 172 401 10 0 0 0 - - -;
+#X obj 172 356 OSCroute /note;
+#X obj 282 379 symbol;
+#X symbolatom 282 401 10 0 0 0 - - -;
+#X obj 282 356 OSCroute /note;
+#X obj 64 418 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 172 418 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 282 418 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 11 70 With OSC \, its much more useful to put the wildcards
+in the messages that you are sending. In this example \, the wildcard
+allows one message to reach three instruments:;
+#X msg 220 250 /inst4/note F;
+#X text 322 249 <-- there is no /inst4 in [OSCroute];
+#X connect 3 0 9 0;
+#X connect 4 0 9 0;
+#X connect 5 0 9 0;
+#X connect 7 0 8 0;
+#X connect 8 0 18 0;
+#X connect 9 0 11 0;
+#X connect 9 1 14 0;
+#X connect 9 2 17 0;
+#X connect 9 3 6 0;
+#X connect 10 0 9 0;
+#X connect 11 0 7 0;
+#X connect 12 0 13 0;
+#X connect 13 0 19 0;
+#X connect 14 0 12 0;
+#X connect 15 0 16 0;
+#X connect 16 0 20 0;
+#X connect 17 0 15 0;
+#X connect 22 0 9 0;
diff --git a/doc/tutorials/networking/09.chat-server.pd b/doc/tutorials/networking/09.chat-server.pd
new file mode 100644
index 0000000000000000000000000000000000000000..595111418f6a3ea7b3abeed445e1cd127a151c52
--- /dev/null
+++ b/doc/tutorials/networking/09.chat-server.pd
@@ -0,0 +1,21 @@
+#N canvas 47 23 620 460 10;
+#X obj 211 231 pack float symbol;
+#X obj 18 20 cnv 15 400 40 empty empty chat_server 20 12 0 24 -228992
+-66577 0;
+#X symbolatom 232 283 30 0 0 1 last_client - -;
+#X floatatom 160 197 5 0 0 1 connections - -;
+#X obj 72 112 list prepend broadcast;
+#X obj 72 132 list trim;
+#X obj 142 284 list prepend;
+#X msg 211 252 symbol client\$1_\$2;
+#X obj 142 172 maxlib/netserver 47292;
+#X connect 0 0 7 0;
+#X connect 4 0 5 0;
+#X connect 5 0 8 0;
+#X connect 6 0 4 0;
+#X connect 7 0 6 1;
+#X connect 7 0 2 0;
+#X connect 8 0 6 0;
+#X connect 8 1 3 0;
+#X connect 8 2 0 0;
+#X connect 8 3 0 1;
diff --git a/doc/tutorials/networking/10.chat_client.pd b/doc/tutorials/networking/10.chat_client.pd
new file mode 100644
index 0000000000000000000000000000000000000000..365e9eb3d89cbbfe75f3f32f5184925dd14c4a7a
--- /dev/null
+++ b/doc/tutorials/networking/10.chat_client.pd
@@ -0,0 +1,52 @@
+#N canvas 514 22 638 458 10;
+#X msg 159 205 disconnect;
+#X obj 77 269 print;
+#X text 242 204 <-- disconnect when you are done to free the port;
+#N canvas 238 612 454 304 (subpatch) 0;
+#X obj 101 10 inlet;
+#X obj 100 100 tgl 25 0 empty \$0-tgl connected 0 -6 0 8 -4033 -262144
+-1 1 1;
+#X obj 121 35 select 1;
+#X obj 199 245 s \$0-tgl;
+#X msg 224 197 label \$1;
+#X obj 224 173 symbol;
+#X msg 220 133 connected;
+#X msg 298 132 -;
+#X msg 112 197 color \$1 \$2 \$3;
+#X msg 158 165 1 1 0;
+#X msg 71 165 -65281 0 -1;
+#X obj 171 55 bang;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
+#X connect 2 0 10 0;
+#X connect 2 0 6 0;
+#X connect 2 1 11 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 8 0 3 0;
+#X connect 9 0 8 0;
+#X connect 10 0 8 0;
+#X connect 11 0 9 0;
+#X connect 11 0 7 0;
+#X coords 0 -1 1 1 25 25 1 100 100;
+#X restore 241 253 pd;
+#X text 30 10 type your message in the box below and hit return to
+send;
+#X msg 137 176 connect localhost 47292;
+#X text 286 176 <-- first connect to the chat-server.pd;
+#X obj 137 304 pddp/print;
+#X symbolatom 49 104 50 0 0 0 - - -;
+#X obj 49 143 list prepend send;
+#X obj 49 165 list trim;
+#X text 52 305 last message:;
+#X obj 137 233 maxlib/netclient;
+#X connect 0 0 12 0;
+#X connect 5 0 12 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 12 0;
+#X connect 12 0 1 0;
+#X connect 12 0 7 0;
+#X connect 12 1 3 0;
diff --git a/doc/tutorials/networking/11.chat_exercise.pd b/doc/tutorials/networking/11.chat_exercise.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b425931d73e0cdc032f01b9bfc50efe4ccd39f07
--- /dev/null
+++ b/doc/tutorials/networking/11.chat_exercise.pd
@@ -0,0 +1,26 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib libdir;
+#X obj 437 59 import maxlib cyclone zexy;
+#X obj 8 10 cnv 15 400 40 empty empty chat_exercise 20 12 0 24 -225271
+-66577 0;
+#X obj 129 89 prepend broadcast;
+#X obj 202 191 prepend;
+#X obj 246 169 makesymbol client%s_%s;
+#X obj 246 148 pack float symbol;
+#X obj 202 118 netserver 47292;
+#X text 434 118 useful objects:;
+#X text 463 159 [entry];
+#X text 463 138 [prepend];
+#X text 11 60 Here is a basic chat room server:;
+#X text 14 218 Implement a client to send and receive messages using
+this server. Connect to the server "pdbox.at.or.at" on the same port
+\, 47292;
+#X msg 115 271 connect pdbox.at.or.at 47292;
+#X text 463 179 [netclient];
+#X connect 2 0 6 0;
+#X connect 3 0 2 0;
+#X connect 4 0 3 1;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 6 2 5 0;
+#X connect 6 3 5 1;
diff --git a/doc/tutorials/networking/TEMPLATE.pd b/doc/tutorials/networking/TEMPLATE.pd
new file mode 100644
index 0000000000000000000000000000000000000000..995ce85cc431e585431aa143c040b7502ade8896
--- /dev/null
+++ b/doc/tutorials/networking/TEMPLATE.pd
@@ -0,0 +1,3 @@
+#N canvas 15 58 640 460 10;
+#X obj 8 10 cnv 15 400 40 empty empty TEMPLATE 20 12 0 24 -228992 -66577
+0;
diff --git a/doc/tutorials/networking/TODO b/doc/tutorials/networking/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..77fa775202dbb484590e64c6cde801159aae76ca
--- /dev/null
+++ b/doc/tutorials/networking/TODO
@@ -0,0 +1,19 @@
+
+
+
+
+
+Topics to Add
+-------------
+
+- netsend/netreceive
+- tcp and udp
+- netclient/netserver
+
+- chat client/server exercise
+
+- OSC
+
+- running Pd as a daemon
+
+- netpd
diff --git a/doc/tutorials/playnow/additive.pd b/doc/tutorials/playnow/additive.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c326cf0059ec3341f1e1499525de92908bc02706
--- /dev/null
+++ b/doc/tutorials/playnow/additive.pd
@@ -0,0 +1,106 @@
+#N canvas 237 83 750 557 10;
+#X text 87 15 ADDITIVE SYNTHESIS;
+#X text 32 73 This patch demonstrates using an abstraction \, "partial"
+\, to make a simple additive synthesis instrument.;
+#X text 28 114 Partial takes as arguments an amplitude \, a relative
+frequency \, a detuning frequency \, and a relative duration. You set
+absolute duration and pitch using the controls below. Hit hte trigger
+to make sound.;
+#N canvas 47 404 460 310 guts 0;
+#X floatatom 59 226 0 0 0 0 - - -;
+#N canvas 159 26 536 283 output 0;
+#X obj 338 160 t b;
+#X obj 338 110 f;
+#X obj 338 60 inlet;
+#X text 344 29 mute;
+#X obj 338 185 f;
+#X msg 425 178 0;
+#X msg 338 85 bang;
+#X obj 338 135 moses 1;
+#X obj 397 117 moses 1;
+#X obj 83 148 dbtorms;
+#X obj 397 92 r master-lvl;
+#X obj 83 42 r master-lvl;
+#X obj 338 210 s master-lvl;
+#X obj 22 181 inlet~;
+#X obj 199 41 inlet;
+#X text 199 18 level;
+#X obj 199 100 s master-lvl;
+#X msg 96 65 set \$1;
+#X obj 96 89 outlet;
+#X msg 214 64 \; pd dsp 1;
+#X obj 83 194 line~;
+#X obj 22 212 *~;
+#X obj 22 241 dac~;
+#X obj 83 171 pack 0 50;
+#X text 20 158 audio;
+#X text 93 110 show level;
+#X obj 425 153 t b;
+#X connect 0 0 4 0;
+#X connect 1 0 7 0;
+#X connect 2 0 6 0;
+#X connect 4 0 12 0;
+#X connect 5 0 12 0;
+#X connect 6 0 1 0;
+#X connect 7 0 0 0;
+#X connect 7 1 26 0;
+#X connect 8 1 4 1;
+#X connect 9 0 23 0;
+#X connect 10 0 1 1;
+#X connect 10 0 8 0;
+#X connect 11 0 9 0;
+#X connect 11 0 17 0;
+#X connect 13 0 21 0;
+#X connect 14 0 16 0;
+#X connect 14 0 19 0;
+#X connect 17 0 18 0;
+#X connect 20 0 21 1;
+#X connect 21 0 22 0;
+#X connect 21 0 22 1;
+#X connect 23 0 20 0;
+#X connect 26 0 5 0;
+#X restore 21 253 pd output;
+#X msg 97 226 MUTE;
+#X text 131 225 <-- output amplitude;
+#X obj 21 195 catch~ sum;
+#X obj 23 112 ../../3.audio.examples/partial 1.8 0.94 0 0.55;
+#X obj 22 87 ../../3.audio.examples/partial 1 0.92 0 0.65;
+#X obj 23 63 ../../3.audio.examples/partial 1 0.56 1 0.9;
+#X obj 23 39 ../../3.audio.examples/partial 0.67 0.56 0 1;
+#X connect 0 0 1 1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 2;
+#X connect 4 0 1 0;
+#X restore 433 21 pd guts;
+#X obj 274 218 grid grid5 200 0 199 200 0 199 1 1 1 10 10 0 0;
+#X obj 467 424 * 40;
+#X obj 275 447 nbx 5 18 -1e+37 1e+37 0 0 frequency empty frequency
+-8 26 1 12 -233017 -1 -1 0 256;
+#X obj 467 447 nbx 5 18 -1e+37 1e+37 0 0 duration empty duration -2
+26 1 12 -233017 -1 -1 7960 256;
+#X obj 549 24 vsl 22 200 0 150 0 0 master-lvl empty volume -9 -8 1
+8 -225271 -1 -1 0 1;
+#X obj 63 404 bng 55 250 50 0 trigger empty trigger 0 -9 1 10 -24198
+-1 -1;
+#X text 72 370 click for one;
+#X msg 79 271 stop;
+#X obj 44 268 bng 25 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 63 306 metro 1500;
+#X obj 192 212 vsl 25 128 30 3000 0 0 empty empty empty 0 -8 1 8 -262131
+-1 -1 0 1;
+#X text 44 241 click for many;
+#X obj 275 423 * 20;
+#X text 10 519 (C) Copyright 2004 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 227 533 released under the GNU GPL;
+#X text 421 520 $Revision: 1.1 $$Date: 2005-05-05 20:35:48 $;
+#X text 422 533 $Author: eighthave $;
+#X connect 4 0 16 0;
+#X connect 4 1 5 0;
+#X connect 5 0 7 0;
+#X connect 11 0 13 0;
+#X connect 12 0 13 0;
+#X connect 13 0 9 0;
+#X connect 14 0 13 1;
+#X connect 16 0 6 0;
diff --git a/doc/tutorials/playnow/draw_sound.pd b/doc/tutorials/playnow/draw_sound.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e6c50130e7307639a2758ecaaa0288a8cf56c9aa
--- /dev/null
+++ b/doc/tutorials/playnow/draw_sound.pd
@@ -0,0 +1,254 @@
+#N canvas 47 53 869 629 10;
+#X obj 644 565 import cyclone;
+#X obj 668 35 pddp/dsp;
+#X obj 18 423 cnv 15 515 140 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 18 199 cnv 15 515 200 empty empty empty 20 12 0 14 -261681 -66577
+0;
+#X obj 18 -24 cnv 15 515 200 empty empty empty 20 12 0 14 -245545 -66577
+0;
+#N canvas 0 22 450 300 graph9 0;
+#X array draw_waveform 515 float 1;
+#A 0 -0.841756 -0.874256 -0.876756 -0.879256 -0.881756 -0.884256 -0.886756
+-0.889256 -0.891756 -0.894256 -0.896756 -0.899256 -0.901756 -0.903899
+-0.906042 -0.908184 -0.910327 -0.91247 -0.914613 -0.916756 -0.918899
+-0.921042 -0.923184 -0.925327 -0.92747 -0.929613 -0.931756 -0.931756
+-0.931756 -0.941756 -0.941756 -0.941756 -0.941756 -0.941756 -0.941756
+-0.941756 -0.941756 -0.941756 -0.941756 -0.941756 -0.891756 -0.871756
+-0.855089 -0.838423 -0.821756 -0.806756 -0.791756 -0.761756 -0.731756
+-0.611756 -0.571756 -0.561756 -0.521756 -0.491756 -0.471756 -0.441756
+-0.411756 -0.391756 -0.371756 -0.346756 -0.321756 -0.291757 -0.261757
+-0.231757 -0.211757 -0.191757 -0.171757 -0.151757 -0.131757 0.598243
+0.628243 0.658243 0.738243 0.778242 0.778242 0.838242 0.858242 0.918242
+0.928242 0.928242 0.928242 0.928242 0.908242 0.908242 0.888242 0.858242
+0.778242 0.758242 0.728243 0.713243 0.698243 0.628243 0.638243 0.638243
+0.648243 0.648243 0.648243 0.648243 0.653243 0.658243 0.658243 0.658243
+0.658243 0.658243 0.658243 0.658243 0.668243 0.668243 0.668243 0.678243
+0.688243 0.688243 0.688243 0.698243 0.698243 0.708243 0.713243 0.718243
+0.718243 0.718243 0.718243 0.728243 0.748242 0.748242 0.748242 0.768242
+0.778242 0.778242 0.798242 0.798242 0.808242 0.808242 0.818242 0.828242
+0.848242 0.848242 0.858242 0.858242 0.858242 0.868242 0.888242 0.888242
+0.888242 0.888242 0.888242 0.888242 0.718243 0.698243 0.688243 0.678243
+0.648243 0.628243 0.608243 0.578243 0.538243 0.538243 0.488243 0.408243
+0.388243 0.348243 0.328243 0.328243 0.288243 0.248243 0.21491 0.181576
+0.148243 0.128243 0.108243 0.0882431 0.0632432 0.0382432 0.0132432
+-0.0917567 -0.0917567 -0.171757 -0.321756 -0.326756 -0.331756 -0.471756
+-0.561756 -0.571756 -0.681756 -0.698423 -0.715089 -0.771756 -0.821756
+-0.871756 -0.841756 -0.821756 -0.791756 -0.786756 -0.741756 -0.701756
+-0.661756 -0.641756 -0.631756 -0.581756 -0.571756 -0.601756 -0.621756
+-0.631756 -0.641756 -0.651756 -0.651756 -0.661756 -0.666756 -0.671756
+-0.673756 -0.675756 -0.677756 -0.679756 -0.681756 -0.685089 -0.688423
+-0.691756 -0.696756 -0.711756 -0.721756 -0.721756 -0.721756 -0.721756
+-0.741756 -0.751756 -0.756756 -0.761756 -0.765089 -0.768423 -0.771756
+-0.771756 -0.791756 -0.791756 -0.801756 -0.801756 -0.811756 -0.821756
+-0.825756 -0.829756 -0.833756 -0.837756 -0.841756 -0.841756 -0.845756
+-0.849756 -0.853756 -0.857756 -0.861756 -0.866756 -0.871756 -0.871756
+-0.871756 -0.871756 -0.871756 -0.871756 -0.871756 -0.881756 -0.881756
+-0.881756 -0.881756 -0.881756 -0.881756 -0.881756 -0.881756 -0.884256
+-0.886756 -0.889256 -0.891756 -0.896042 -0.900327 -0.904613 -0.908899
+-0.913185 -0.91747 -0.921756 -0.926756 -0.931756 -0.941756 -0.941756
+-0.941756 -0.926756 -0.791756 -0.661756 -0.621756 -0.601756 -0.581756
+-0.561756 -0.531756 -0.501756 -0.491756 -0.471756 -0.45509 -0.438423
+-0.421756 -0.381756 -0.366756 -0.301757 -0.221757 -0.196757 -0.171757
+-0.111757 -0.0767567 -0.0417567 0.0182432 0.0515765 0.0849098 0.138243
+0.168243 0.168243 0.188243 0.198243 0.218243 0.228243 0.238243 0.258243
+0.263243 0.268243 0.308243 0.328243 0.328243 0.343243 0.438243 0.443243
+0.488243 0.588243 0.628243 0.768242 0.798242 0.798242 0.808242 0.818242
+0.838242 0.838242 0.848242 0.868242 0.878242 0.918242 0.938242 0.958242
+0.958242 0.914242 0.894242 0.887576 0.880909 0.874242 0.864242 0.854242
+0.844242 0.834242 0.824242 0.814242 0.806742 0.799242 0.791742 0.784242
+0.764242 0.744242 0.714242 0.724242 0.734242 0.744242 0.744242 0.754242
+0.759242 0.764242 0.774242 0.784242 0.784242 0.784242 0.784242 0.789242
+0.794242 0.794242 0.794242 0.794242 0.794242 0.794242 0.796742 0.799242
+0.801742 0.804242 0.814242 0.858242 0.858242 0.858242 0.858242 0.858242
+0.868242 0.868242 0.868242 0.868242 0.878242 0.878242 0.898242 0.898242
+0.898242 0.898242 0.908242 0.908242 0.908242 0.913242 0.918242 0.918242
+0.918242 0.918242 0.928242 0.928242 0.928242 0.938242 0.938242 0.938242
+0.941576 0.944909 0.958242 0.958242 0.958242 0.968242 0.968242 0.968242
+0.968242 0.968242 0.958242 0.928242 0.921576 0.914909 0.908242 0.898242
+0.890242 0.882242 0.874242 0.866242 0.728243 0.708243 0.678243 0.648243
+0.608243 0.598243 0.588243 0.558243 0.538243 0.528243 0.358243 0.338243
+0.268243 0.228243 0.198243 0.138243 0.113243 0.0882431 0.0362432 -0.0157568
+-0.0677567 -0.119757 -0.171757 -0.201757 -0.231757 -0.261757 -0.291757
+-0.321756 -0.351756 -0.381756 -0.411756 -0.441756 -0.471756 -0.501756
+-0.531756 -0.561756 -0.585923 -0.61009 -0.634256 -0.658423 -0.682589
+-0.706756 -0.730923 -0.755089 -0.779256 -0.803423 -0.827589 -0.851756
+-0.881756 -0.911756 -0.961756 -0.971756 -0.971756 -0.961756 -0.956756
+-0.951756 -0.931756 -0.931756 -0.921756 -0.906756 -0.881756 -0.871756
+-0.861756 -0.856756 -0.821756 -0.801756 -0.786756 -0.771756 -0.741756
+-0.711756 -0.701756 -0.711756 -0.711756 -0.721756 -0.741756 -0.746756
+-0.751756 -0.761756 -0.771756 -0.781756 -0.791756 -0.801756 -0.811756
+-0.811756 -0.831756;
+#X coords 0 1 514 -1 515 200 1;
+#X restore 18 199 graph;
+#N canvas 0 22 450 300 graph10 0;
+#X array draw_pitch 515 float 1;
+#A 0 9.86511 12.3626 14.8601 19.8551 -0.124878 19.8551 34.8401 44.8301
+69.8051 79.795 114.76 129.745 137.237 144.73 149.725 204.67 234.64
+254.62 267.107 314.56 329.545 344.53 429.445 464.41 469.405 479.395
+599.275 614.26 629.245 654.219 669.204 734.139 749.124 769.104 781.592
+804.069 824.049 844.029 844.029 873.999 938.934 933.939 908.964 898.974
+883.989 864.009 789.084 741.632 719.154 707.802 696.45 685.098 673.745
+662.393 651.041 639.689 628.337 616.984 605.632 594.28 579.919 565.558
+551.198 536.837 522.477 508.116 493.755 474.4 459.415 459.415 459.415
+449.425 444.43 449.425 454.42 454.42 459.415 609.265 681.692 699.174
+734.139 802.404 810.729 819.054 830.293 841.532 852.771 864.009 881.492
+898.974 916.457 933.939 938.934 928.944 918.954 913.959 908.964 903.969
+898.974 893.979 888.984 883.989 873.999 854.019 844.029 841.532 839.034
+831.542 824.049 814.059 806.567 799.074 789.084 784.089 774.099 769.104
+759.114 756.617 754.119 749.124 749.124 744.129 734.139 729.144 724.149
+719.154 716.241 713.327 710.413 707.499 704.586 701.672 698.758 695.844
+692.931 690.017 687.103 684.189 681.839 679.488 677.138 674.787 672.437
+670.086 667.735 665.385 663.034 660.684 658.333 655.982 653.632 651.281
+648.931 646.58 644.229 641.851 639.472 637.094 634.715 632.337 629.958
+627.58 625.201 622.823 620.444 618.066 615.687 613.308 610.93 608.551
+606.173 603.794 601.416 599.037 596.659 594.28 591.206 588.132 585.058
+581.984 578.91 575.836 572.763 569.689 566.615 563.541 560.467 557.393
+554.319 549.325 549.325 546.827 544.33 541.832 539.335 536.837 534.34
+531.842 529.345 527.039 524.734 522.429 520.123 517.818 515.512 513.207
+510.902 508.596 506.291 503.986 501.68 499.375 497.308 495.241 493.174
+491.107 489.04 486.973 484.906 482.839 480.773 478.706 476.639 474.572
+472.505 470.438 468.371 466.304 464.237 462.171 460.104 458.037 455.97
+453.903 451.836 449.769 447.702 445.635 443.568 441.502 439.435 437.514
+435.592 433.671 431.75 429.829 427.908 425.987 424.066 422.144 420.223
+418.302 416.381 414.46 412.539 410.618 408.696 406.775 404.854 402.933
+401.012 399.091 397.17 395.248 393.327 391.406 389.485 387.786 386.088
+384.39 382.692 380.993 379.295 377.597 375.898 374.2 372.502 370.803
+369.105 367.407 365.708 364.01 362.312 360.614 358.915 357.217 355.519
+353.82 352.122 350.424 348.725 347.027 345.329 343.631 341.932 340.234
+338.536 336.837 335.139 333.441 331.742 330.044 328.346 326.648 324.949
+323.251 321.553 319.854 318.156 316.458 314.759 313.061 311.363 309.664
+307.966 306.268 304.57 302.526 300.483 298.44 296.396 294.353 292.309
+290.266 288.223 286.179 284.136 282.092 280.049 278.006 275.962 273.919
+271.875 269.832 267.789 265.745 263.702 261.659 259.615 257.617 255.619
+253.621 251.623 249.625 247.627 245.629 243.631 241.633 239.635 237.637
+235.639 233.641 231.643 229.645 227.647 225.649 223.651 221.653 219.655
+218.545 217.435 216.325 215.215 214.105 212.995 211.885 210.775 209.665
+208.555 207.445 206.335 205.225 204.115 203.005 201.895 200.785 199.675
+198.218 196.761 195.304 193.847 192.391 190.934 189.477 188.02 186.563
+185.106 183.649 182.192 180.736 179.279 177.822 176.365 174.908 173.451
+171.994 170.537 169.08 167.624 166.167 164.71 162.926 161.142 159.358
+157.574 155.79 154.006 152.223 150.439 148.655 146.871 145.087 143.303
+141.519 139.735 137.951 136.167 134.383 132.599 130.815 129.032 127.248
+125.464 123.68 121.896 120.112 118.328 116.544 114.76 113.373 111.985
+110.598 109.21 107.823 106.435 105.048 103.66 102.273 100.885 99.4975
+98.11 96.7225 95.3351 93.9476 92.5601 91.1726 89.7851 88.4706 87.1561
+85.8416 84.5271 83.2127 81.8982 80.5837 79.2692 77.9548 76.6403 75.3258
+74.0113 72.6968 71.3824 70.0679 68.7534 67.4389 66.1245 64.81 63.5613
+62.3126 61.0638 59.8151 58.5663 57.3176 56.0688 54.8201 53.6448 52.4695
+51.2942 50.1189 48.9436 47.7683 46.593 45.4177 44.2424 43.0671 41.8918
+40.7166 39.5413 38.366 37.1907 36.0154 34.8401 32.3426 29.8451 28.1801
+26.5151 24.8501 24.8501 24.8501 23.1851 21.5201 19.8551 18.1901 16.5251
+14.8601 13.1951 11.5301 9.86511 8.20012 6.53512 4.87012 3.20512 1.54012
+-0.124877 -0.124878 -0.124878;
+#X coords 0 1000 514 1 515 200 1;
+#X restore 18 -24 graph;
+#N canvas 0 22 458 308 graph11 0;
+#X array draw_amplitude 515 float 1;
+#A 0 -0.0285711 -0.0285711 -0.0285711 -0.0285711 -0.0285711 -0.0285711
+-0.0285711 -0.0285711 -0.0285711 -0.0142856 -0.00952371 -0.00476185
+-3.10441e-10 0.00952371 0.0190474 0.0285711 0.0285711 0.0285711 0.0285711
+0.0285711 0.0285711 0.0285711 0.0285711 0.0285711 0.017857 0.00714278
+-0.00357139 -0.0142856 -0.0285711 -0.0428567 -0.0476185 -0.0523804
+-0.0714278 -0.099999 -0.099999 -0.12857 -0.12857 -0.12857 -0.142856
+-0.157141 -0.165304 -0.173468 -0.181631 -0.189794 -0.197957 -0.20612
+-0.214283 -0.219045 -0.223807 -0.228569 -0.228569 -0.228569 -0.228569
+-0.228569 -0.228569 -0.228569 -0.228569 -0.242855 -0.25714 -0.299997
+-0.30714 -0.314282 -0.328568 -0.342854 -0.359996 -0.377139 -0.394282
+-0.411424 -0.428567 -0.438091 -0.447614 -0.457138 -0.471424 -0.51428
+-0.523804 -0.533328 -0.542851 -0.571423 -0.585708 -0.599994 -0.614279
+-0.628565 -0.64285 -0.649993 -0.657136 -0.685707 -0.689278 -0.69285
+-0.696421 -0.699993 -0.707135 -0.714278 -0.721421 -0.728564 -0.735707
+-0.742849 -0.749992 -0.757135 -0.757135 -0.764278 -0.77142 -0.785706
+-0.785706 -0.785706 -0.785706 -0.785706 -0.785706 -0.785706 -0.785706
+-0.785706 -0.785706 -0.785706 -0.785706 -0.785706 -0.785706 -0.785706
+-0.785706 -0.785706 -0.785706 -0.785706 -0.792849 -0.799992 -0.807134
+-0.814277 -0.814277 -0.814277 -0.814277 -0.828563 -0.828563 -0.828563
+-0.828563 -0.828563 -0.828563 -0.828563 -0.828563 -0.828563 -0.828563
+-0.828563 -0.828563 -0.828563 -0.828563 -0.828563 -0.828563 -0.828563
+-0.828563 -0.828563 -0.828563 -0.828563 -0.824991 -0.82142 -0.817849
+-0.814277 -0.808563 -0.802849 -0.797135 -0.79142 -0.785706 -0.779992
+-0.774278 -0.768563 -0.762849 -0.757135 -0.751421 -0.745707 -0.739992
+-0.734278 -0.728564 -0.72285 -0.717135 -0.711421 -0.705707 -0.699993
+-0.694278 -0.688564 -0.68285 -0.677136 -0.671421 -0.661898 -0.652374
+-0.64285 -0.633327 -0.623803 -0.614279 -0.602375 -0.59047 -0.578565
+-0.566661 -0.554756 -0.542852 -0.527995 -0.513138 -0.498281 -0.483424
+-0.468567 -0.45371 -0.438853 -0.423996 -0.409139 -0.394282 -0.379425
+-0.364568 -0.349711 -0.334854 -0.319997 -0.30514 -0.290283 -0.275426
+-0.260569 -0.245712 -0.230855 -0.215998 -0.201141 -0.186284 -0.171427
+-0.15824 -0.145053 -0.131867 -0.11868 -0.105493 -0.0923068 -0.0791201
+-0.0659334 -0.0527467 -0.0395601 -0.0263734 -0.0131867 -2.63636e-08
+0.0131866 0.0263733 0.03956 0.0527467 0.0659333 0.07912 0.0923067 0.105493
+0.11868 0.131867 0.145053 0.15824 0.171427 0.178284 0.185141 0.191998
+0.198855 0.205712 0.212569 0.219426 0.226283 0.23314 0.239998 0.246855
+0.253712 0.260569 0.267426 0.274283 0.28114 0.287997 0.294854 0.301711
+0.308568 0.315425 0.322282 0.329139 0.335997 0.342854 0.349711 0.356568
+0.363425 0.370282 0.377139 0.383996 0.390853 0.39771 0.404567 0.411424
+0.418281 0.425138 0.431995 0.438853 0.44571 0.452567 0.459424 0.466281
+0.473138 0.479995 0.486852 0.493709 0.500566 0.507423 0.51428 0.518089
+0.521899 0.525708 0.529518 0.533327 0.537137 0.540946 0.544756 0.548566
+0.552375 0.556185 0.559994 0.563804 0.567613 0.571423 0.578565 0.585708
+0.588883 0.592057 0.595232 0.598407 0.601581 0.604756 0.60793 0.611105
+0.61428 0.617454 0.620629 0.623803 0.626978 0.630152 0.633327 0.636501
+0.639676 0.64285 0.64285 0.64285 0.64285 0.64285 0.64285 0.64285 0.64285
+0.64285 0.639843 0.636835 0.633828 0.63082 0.627813 0.624805 0.621798
+0.61879 0.615783 0.612775 0.609768 0.60676 0.603753 0.600745 0.597738
+0.594731 0.591723 0.588716 0.585708 0.579215 0.572721 0.566228 0.559734
+0.553241 0.546748 0.540254 0.533761 0.527267 0.520774 0.51428 0.505524
+0.496769 0.488013 0.479257 0.470502 0.461746 0.45299 0.444235 0.435479
+0.426723 0.417968 0.409212 0.400456 0.391701 0.382945 0.374189 0.365434
+0.356678 0.347922 0.339167 0.330411 0.321655 0.3129 0.304144 0.295389
+0.286633 0.277877 0.269122 0.260366 0.25161 0.242855 0.235712 0.228569
+0.214283 0.192855 0.171427 0.171427 0.164284 0.157141 0.149998 0.142856
+0.135713 0.12857 0.114285 0.099999 0.0857134 0.0714279 0.0602035 0.0489791
+0.0377547 0.0265304 0.015306 0.00408162 -0.00714275 -0.0183671 -0.0295915
+-0.0408159 -0.0520402 -0.0632646 -0.074489 -0.0857134 -0.0969377 -0.108162
+-0.119386 -0.130611 -0.141835 -0.15306 -0.164284 -0.175508 -0.186733
+-0.197957 -0.209181 -0.220406 -0.23163 -0.242854 -0.248568 -0.254283
+-0.259997 -0.265711 -0.271425 -0.277139 -0.282854 -0.288568 -0.294282
+-0.299996 -0.305711 -0.311425 -0.317139 -0.322853 -0.328568 -0.334282
+-0.339996 -0.34571 -0.351425 -0.357139 -0.362853 -0.368567 -0.374282
+-0.379996 -0.38571 -0.391424 -0.397138 -0.402853 -0.408567 -0.414281
+-0.419995 -0.42571 -0.431424 -0.437138 -0.442852 -0.448567 -0.454281
+-0.459995 -0.465709 -0.471424 -0.477138 -0.482852 -0.488566 -0.494281
+-0.499995 -0.499995 -0.489281 -0.478567 -0.467852 -0.457138 -0.447138
+-0.437139 -0.427139 -0.417139 -0.407139 -0.397139 -0.387139 -0.377139
+-0.367139 -0.357139 -0.346425 -0.335711 -0.324997 -0.314283 -0.271426
+-0.271426 -0.271426 -0.228569 -0.214284 -0.176189 -0.138094 -0.0999992
+-0.0714281 -0.0571425 -0.0428569 -0.0285714 0.0714276;
+#X coords 0 1 514 -1 515 140 1;
+#X restore 18 423 graph;
+#X obj 578 82 cnv 15 250 60 empty empty empty 20 12 0 14 -245545 -66577
+0;
+#X obj 579 274 cnv 15 250 80 empty empty empty 20 12 0 14 -228992 -66577
+0;
+#X obj 579 183 cnv 15 250 60 empty empty empty 20 12 0 14 -261681 -66577
+0;
+#X obj 627 461 nbx 3 18 -1e+37 1e+37 0 0 empty empty empty -9 -10 1
+14 -124831 -1 -1 0 256;
+#X obj 594 203 tabosc4~ draw_waveform;
+#X obj 594 462 *~;
+#X obj 583 499 dac~;
+#X obj 594 118 tabosc4~ draw_pitch;
+#X obj 597 94 hsl 200 18 0.01 50 1 0 empty empty pitch_scan_rate 20
+9 1 14 -225233 -1 -1 0 0;
+#X obj 594 326 *~;
+#X obj 610 308 tabosc4~ draw_amplitude;
+#X obj 613 287 hsl 200 18 0.01 50 1 0 empty empty amplitude_scan_rate
+20 9 1 14 -62784 -1 -1 0 0;
+#X obj 612 433 hsl 200 18 0.01 1 1 0 empty empty master_amplitude 20
+9 1 14 -24198 -1 -1 0 0;
+#X text 554 529 (C) Copyright 2004 Hans-Christoph Steiner;
+#X text 552 543 <hans@at.or.at> released under the GNU GPL;
+#X obj 593 -13 comment 250 14 Times ? 0 0 0 0 You can change the tune
+or the sound quality by drawing different shapes.;
+#X connect 12 0 17 0;
+#X connect 13 0 14 1;
+#X connect 13 0 14 0;
+#X connect 15 0 12 0;
+#X connect 16 0 15 0;
+#X connect 17 0 13 0;
+#X connect 18 0 17 1;
+#X connect 19 0 18 0;
+#X connect 20 0 11 0;
+#X connect 20 0 13 1;
diff --git a/doc/tutorials/playnow/filter.sweep.pd b/doc/tutorials/playnow/filter.sweep.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e7809d5a32b9ae81f72878d1fe25c964be950832
--- /dev/null
+++ b/doc/tutorials/playnow/filter.sweep.pd
@@ -0,0 +1,212 @@
+#N canvas 171 51 741 541 12;
+#X text 35 6 SWEEPING FILTERS;
+#X text 13 28 If you want actively changing center frequencies \, use
+"vcf~" instead of "bp~". The vcf~ module takes an audio signal to set
+center frequency. (Q is still set by messages though.) Vcf is somewhat
+more expensive than bp~.;
+#X text 13 95 Note the effect of negative and positive sweep speed.
+;
+#X obj 374 152 grid grid6 200 0 199 200 0 199 1 1 1 10 10 0 0;
+#X obj 374 357 / 2;
+#X obj 688 30 vsl 22 200 0 100 0 0 master-lvl empty volume -9 -8 1
+8 -225271 -1 -1 0 1;
+#N canvas 0 22 822 508 guts 0;
+#X floatatom 144 438 0 0 0 0 - - -;
+#N canvas 159 26 497 268 output 0;
+#X obj 338 160 t b;
+#X obj 338 110 f;
+#X obj 338 60 inlet;
+#X text 344 29 mute;
+#X obj 338 185 f;
+#X msg 425 178 0;
+#X msg 338 85 bang;
+#X obj 338 135 moses 1;
+#X obj 425 153 t b f;
+#X obj 397 117 moses 1;
+#X obj 83 148 dbtorms;
+#X obj 397 92 r master-lvl;
+#X obj 83 42 r master-lvl;
+#X obj 338 210 s master-lvl;
+#X obj 22 181 inlet~;
+#X obj 199 41 inlet;
+#X text 199 18 level;
+#X obj 199 100 s master-lvl;
+#X msg 96 65 set \$1;
+#X obj 96 89 outlet;
+#X msg 214 64 \; pd dsp 1;
+#X obj 83 194 line~;
+#X obj 22 212 *~;
+#X obj 22 241 dac~;
+#X obj 83 171 pack 0 50;
+#X text 20 158 audio;
+#X text 93 110 show level;
+#X connect 0 0 4 0;
+#X connect 1 0 7 0;
+#X connect 2 0 6 0;
+#X connect 4 0 13 0;
+#X connect 5 0 13 0;
+#X connect 6 0 1 0;
+#X connect 7 0 0 0;
+#X connect 7 1 8 0;
+#X connect 8 0 5 0;
+#X connect 9 1 4 1;
+#X connect 10 0 24 0;
+#X connect 11 0 1 1;
+#X connect 11 0 9 0;
+#X connect 12 0 10 0;
+#X connect 12 0 18 0;
+#X connect 14 0 22 0;
+#X connect 15 0 17 0;
+#X connect 15 0 20 0;
+#X connect 18 0 19 0;
+#X connect 21 0 22 1;
+#X connect 22 0 23 0;
+#X connect 22 0 23 1;
+#X connect 24 0 21 0;
+#X restore 115 466 pd output;
+#X msg 173 438 MUTE;
+#X text 212 437 <-- output amplitude;
+#X obj 115 111 line~;
+#X floatatom 115 63 0 0 0 0 - - -;
+#X obj 115 87 pack 0 100;
+#X obj 115 159 phasor~;
+#X obj 115 135 tabread4~ mtof;
+#X obj 248 283 +~;
+#X obj 264 260 line~;
+#X obj 264 236 pack 0 100;
+#X floatatom 264 212 0 0 0 0 - - -;
+#X floatatom 248 63 0 0 0 0 - - -;
+#X floatatom 271 137 0 0 0 0 - - -;
+#X obj 115 39 r pitch;
+#X obj 271 113 r depth;
+#X obj 248 39 r speed;
+#X obj 264 188 r offset;
+#X obj 195 364 r q;
+#X floatatom 195 388 0 0 0 0 - - -;
+#X obj 115 383 vcf~;
+#X obj 115 407 hip~ 5;
+#X obj 248 162 *~ 0;
+#X obj 248 87 phasor~ 0;
+#X obj 248 307 tabread4~ mtof;
+#X text 234 389 <-- Q (selectivity);
+#X text 125 176 sawtooth;
+#X text 124 190 oscillator;
+#X text 302 66 <-- sweep speed;
+#X text 339 88 LFO for sweep;
+#X text 325 140 <-- sweep depth;
+#X text 311 214 <-- base center frequency;
+#X text 292 282 add base to sweep;
+#X text 376 306 convert to Hz.;
+#X text 152 64 <-- pitch;
+#X obj 565 31 loadbang;
+#N canvas 0 22 600 392 conversion-tables 0;
+#N canvas 0 22 450 300 graph1 0;
+#X array dbtorms 123 float 1;
+#A 0 0 0 1.25893e-05 1.41254e-05 1.58489e-05 1.77828e-05 1.99526e-05
+2.23872e-05 2.51189e-05 2.81838e-05 3.16228e-05 3.54813e-05 3.98107e-05
+4.46684e-05 5.01187e-05 5.62341e-05 6.30957e-05 7.07946e-05 7.94328e-05
+8.91251e-05 0.0001 0.000112202 0.000125893 0.000141254 0.000158489
+0.000177828 0.000199526 0.000223872 0.000251189 0.000281838 0.000316228
+0.000354813 0.000398107 0.000446684 0.000501187 0.000562341 0.000630957
+0.000707946 0.000794328 0.000891251 0.001 0.00112202 0.00125893 0.00141254
+0.00158489 0.00177828 0.00199526 0.00223872 0.00251189 0.00281838 0.00316228
+0.00354813 0.00398107 0.00446684 0.00501187 0.00562341 0.00630957 0.00707946
+0.00794328 0.00891251 0.01 0.0112202 0.0125893 0.0141254 0.0158489
+0.0177828 0.0199526 0.0223872 0.0251189 0.0281838 0.0316228 0.0354813
+0.0398107 0.0446684 0.0501187 0.0562341 0.0630957 0.0707946 0.0794328
+0.0891251 0.1 0.112202 0.125893 0.141254 0.158489 0.177828 0.199526
+0.223872 0.251189 0.281838 0.316228 0.354813 0.398107 0.446684 0.501187
+0.562341 0.630957 0.707946 0.794328 0.891251 1 1.12202 1.25893 1.41254
+1.58489 1.77828 1.99526 2.23872 2.51189 2.81838 3.16228 3.54813 3.98107
+4.46684 5.01187 5.62341 6.30957 7.07946 7.94328 8.91251 10 11.2202
+12.5893;
+#X coords 0 10 123 0 200 100 1;
+#X restore 302 48 graph;
+#X text 504 141 0;
+#X text 506 41 10;
+#X text 321 151 ------ 123 samples ------;
+#N canvas 0 22 450 300 graph2 0;
+#X array mtof 130 float 1;
+#A 0 8.1758 8.66196 9.17702 9.72272 10.3009 10.9134 11.5623 12.2499
+12.9783 13.75 14.5676 15.4339 16.3516 17.3239 18.354 19.4454 20.6017
+21.8268 23.1247 24.4997 25.9565 27.5 29.1352 30.8677 32.7032 34.6478
+36.7081 38.8909 41.2034 43.6535 46.2493 48.9994 51.9131 55 58.2705
+61.7354 65.4064 69.2957 73.4162 77.7817 82.4069 87.3071 92.4986 97.9989
+103.826 110 116.541 123.471 130.813 138.591 146.832 155.563 164.814
+174.614 184.997 195.998 207.652 220 233.082 246.942 261.626 277.183
+293.665 311.127 329.628 349.228 369.994 391.995 415.305 440 466.164
+493.883 523.251 554.365 587.33 622.254 659.255 698.456 739.989 783.991
+830.609 880 932.328 987.767 1046.5 1108.73 1174.66 1244.51 1318.51
+1396.91 1479.98 1567.98 1661.22 1760 1864.66 1975.53 2093 2217.46 2349.32
+2489.02 2637.02 2793.83 2959.96 3135.96 3322.44 3520 3729.31 3951.07
+4186.01 4434.92 4698.64 4978.03 5274.04 5587.65 5919.91 6271.93 6644.88
+7040 7458.62 7902.13 8372.02 8869.84 9397.27 9956.06 10548.1 11175.3
+11839.8 12543.9 13289.8 14080;
+#X coords 0 12000 130 0 200 100 1;
+#X restore 309 225 graph;
+#X text 319 333 ------ 130 samples ------;
+#X text 518 318 0;
+#X text 520 218 12000;
+#X restore 498 177 pd conversion-tables;
+#X msg 565 55 \; pitch 48 \; speed -2 \; depth 27 \; offset 56 \; q
+2 \; pd dsp 1;
+#X connect 0 0 1 1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 2;
+#X connect 4 0 8 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 7 0 21 0;
+#X connect 8 0 7 0;
+#X connect 9 0 25 0;
+#X connect 10 0 9 1;
+#X connect 11 0 10 0;
+#X connect 12 0 11 0;
+#X connect 13 0 24 0;
+#X connect 14 0 23 1;
+#X connect 15 0 5 0;
+#X connect 16 0 14 0;
+#X connect 17 0 13 0;
+#X connect 18 0 12 0;
+#X connect 19 0 20 0;
+#X connect 20 0 21 2;
+#X connect 21 0 22 0;
+#X connect 22 0 1 0;
+#X connect 23 0 9 0;
+#X connect 24 0 23 0;
+#X connect 25 0 21 1;
+#X connect 36 0 38 0;
+#X restore 576 23 pd guts;
+#X obj 57 151 grid grid7 200 0 199 200 0 199 1 1 1 10 10 0 0;
+#X obj 250 356 - 100;
+#X obj 57 379 s pitch;
+#X obj 250 401 s speed;
+#X obj 250 378 / 10;
+#X obj 57 356 / 2;
+#X obj 374 380 s depth;
+#X obj 567 379 s offset;
+#X obj 567 357 / 1;
+#X obj 621 157 vsl 22 200 0 4 0 0 q empty Q 3 -8 1 8 -261689 -1 -1
+0 1;
+#X obj 55 439 nbx 5 18 -1e+37 1e+37 0 0 empty pitch pitch 2 27 1 12
+-233017 -1 -1 0 256;
+#X obj 249 439 nbx 5 18 -1e+37 1e+37 0 0 empty speed speed 2 27 1 12
+-233017 -1 -1 9.9 256;
+#X obj 377 439 nbx 5 18 -1e+37 1e+37 0 0 empty depth depth 2 27 1 12
+-233017 -1 -1 0 256;
+#X obj 559 439 nbx 5 18 -1e+37 1e+37 0 0 empty offset offset 2 27 1
+12 -233017 -1 -1 199 256;
+#X obj 629 439 nbx 5 18 -1e+37 1e+37 0 0 empty q Q 2 27 1 12 -233017
+-1 -1 2 256;
+#X text 58 492 (C) Copyright 2004 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 367 509 released under the GNU GPL;
+#X connect 3 0 4 0;
+#X connect 3 1 15 0;
+#X connect 4 0 13 0;
+#X connect 7 0 12 0;
+#X connect 7 1 8 0;
+#X connect 8 0 11 0;
+#X connect 11 0 10 0;
+#X connect 12 0 9 0;
+#X connect 15 0 14 0;
diff --git a/doc/tutorials/playnow/ring-modulator.pd b/doc/tutorials/playnow/ring-modulator.pd
new file mode 100644
index 0000000000000000000000000000000000000000..ea34db5b020b6fbdb54005432eeabb835950da32
--- /dev/null
+++ b/doc/tutorials/playnow/ring-modulator.pd
@@ -0,0 +1,51 @@
+#N canvas 645 105 460 529 10;
+#X obj 154 245 adc~;
+#X obj 177 340 *~;
+#X obj 203 310 osc~;
+#X obj 203 82 vsl 15 128 0.1 10 1 0 empty empty empty 0 -8 0 8 -261681
+-1 -1 0 0;
+#X obj 203 267 osc~;
+#X obj 203 289 *~ 1000;
+#X obj 138 340 *~;
+#X obj 93 82 vsl 15 128 0.1 10 1 0 empty empty empty 0 -8 0 8 -261681
+-1 -1 0 0;
+#X obj 93 310 osc~;
+#X obj 93 267 osc~;
+#X obj 93 289 *~ 1000;
+#X floatatom 99 218 5 0 0 0 - - -;
+#X floatatom 209 217 5 0 0 0 - - -;
+#X obj 148 466 dac~;
+#X obj 177 430 *~;
+#X obj 138 430 *~;
+#X obj 202 385 hsl 128 18 0 1 0 0 empty empty amplitude 5 10 1 14 -225271
+-1 -1 0 0;
+#X obj 341 119 pddp/dsp;
+#X text 25 18 This is a simple ring modulator. It modulates the sound
+coming in on the microphone with two Amplitude Modulators controlled
+by the orange sliders. Turn on the DSP \, turn up the volume \, and
+try messing with your voice.;
+#X text 243 506 released under the GNU GPL;
+#X text 28 493 (C) Copyright 2006 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 233 120 click here -->;
+#X text 233 134 to turn on;
+#X text 234 149 sound processing;
+#X text 220 403 ^-- turn up the volume here;
+#X connect 0 0 6 1;
+#X connect 0 1 1 0;
+#X connect 1 0 14 0;
+#X connect 2 0 1 1;
+#X connect 3 0 4 0;
+#X connect 3 0 12 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 15 0;
+#X connect 7 0 9 0;
+#X connect 7 0 11 0;
+#X connect 8 0 6 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X connect 14 0 13 1;
+#X connect 15 0 13 0;
+#X connect 16 0 14 1;
+#X connect 16 0 15 1;
diff --git a/doc/tutorials/playnow/vibrato.pd b/doc/tutorials/playnow/vibrato.pd
new file mode 100644
index 0000000000000000000000000000000000000000..a52d4eaf4d2be61f86048e1bf578258204524357
--- /dev/null
+++ b/doc/tutorials/playnow/vibrato.pd
@@ -0,0 +1,176 @@
+#N canvas 365 22 632 541 12;
+#X text 71 6 PORTAMENTO AND VIBRATO;
+#N canvas 0 22 452 302 graph1 0;
+#X array array62 131 float 1;
+#A 0 0.970031 1 0.970031 0.881921 0.740952 0.555571 0.336891 0.0980184
+-0.146729 -0.382682 -0.595698 -0.773009 -0.88 -0.9 -0.92 -0.92 -0.85773
+-0.707109 -0.514106 -0.290288 -0.0490716 0.195086 0.427551 0.63439
+0.803205 0.86 0.88 0.88 0.88 0.84 0.82 0.471402 0.242986 6.63397e-06
+-0.242974 -0.471391 -0.671554 -0.831465 -0.941541 -0.995184 -0.989178
+-0.923883 -0.803213 -0.68 -0.42 -0.24 0.1 0.4 0.6 0.7071 0.857723 0.956937
+0.998795 0.980787 0.903994 0.773018 0.595708 0.382694 0.146742 -0.0980052
+-0.336878 -0.55556 -0.7 -0.8 -0.88 -0.88 -0.88 -0.84 -0.82 -0.555582
+-0.336903 -0.0980316 0.146716 0.38267 0.595687 0.773001 0.903983 0.980782
+0.998796 0.956945 0.857737 0.707119 0.514117 0.290301 0.0490849 -0.195073
+-0.427539 -0.63438 -0.803197 -0.923873 -0.989174 -0.995187 -0.94155
+-0.83148 -0.671573 -0.471414 -0.242999 -1.99019e-05 0.242961 0.471379
+0.671544 0.831458 0.88 0.9 0.9 0.88 0.803221 0.63441 0.08 -0.14 -0.28
+-0.48 -0.64 -0.72 -0.857717 -0.956933 -0.998794 -0.98079 -0.904 -0.773026
+-0.595719 -0.382706 -0.146755 0.097992 0.336866 0.555549 0.740934 0.881909
+0.970025 1 0.970038;
+#X coords 0 1 130 -1 200 100 1;
+#X restore 391 404 graph;
+#X text 11 32 Portamento can be treated as a special case of an ADSR
+envelope \, with 100 percent sustain. Vibrato is properly computed
+in units of pitch \, but it's also easy to add vibrato to the envelope--before
+raising it to the fourth power \, so that it acts pseudo-logarithmically.
+Rather than add to the ADSR output \, we multiply a signal which controls
+relative frequency. The relative frequency change is one plus an oscillator.
+;
+#N canvas 153 366 686 470 guts 0;
+#X obj 30 8 r trigger;
+#X floatatom 68 403 0 0 0 0 - - -;
+#N canvas 159 26 531 288 output 0;
+#X obj 351 166 t b;
+#X obj 351 114 f;
+#X obj 351 62 inlet;
+#X text 358 30 mute;
+#X obj 351 192 f;
+#X msg 442 185 0;
+#X msg 351 88 bang;
+#X obj 351 140 moses 1;
+#X obj 413 122 moses 1;
+#X obj 86 154 dbtorms;
+#X obj 413 96 r master-lvl;
+#X obj 86 44 r master-lvl;
+#X obj 351 218 s master-lvl;
+#X obj 24 163 inlet~;
+#X obj 207 42 inlet;
+#X text 207 19 level;
+#X obj 207 104 s master-lvl;
+#X msg 100 67 set \$1;
+#X obj 100 93 outlet;
+#X msg 222 66 \; pd dsp 1;
+#X obj 86 202 line~;
+#X obj 23 221 *~;
+#X obj 23 250 dac~;
+#X obj 86 178 pack 0 50;
+#X text 22 140 audio;
+#X obj 442 159 t b;
+#X obj 21 191 hip~ 1;
+#X connect 0 0 4 0;
+#X connect 1 0 7 0;
+#X connect 2 0 6 0;
+#X connect 4 0 12 0;
+#X connect 5 0 12 0;
+#X connect 6 0 1 0;
+#X connect 7 0 0 0;
+#X connect 7 1 25 0;
+#X connect 8 1 4 1;
+#X connect 9 0 23 0;
+#X connect 10 0 1 1;
+#X connect 10 0 8 0;
+#X connect 11 0 9 0;
+#X connect 11 0 17 0;
+#X connect 13 0 26 0;
+#X connect 14 0 16 0;
+#X connect 14 0 19 0;
+#X connect 17 0 18 0;
+#X connect 20 0 21 1;
+#X connect 21 0 22 0;
+#X connect 21 0 22 1;
+#X connect 23 0 20 0;
+#X connect 25 0 5 0;
+#X connect 26 0 21 0;
+#X restore 29 432 pd output;
+#X msg 105 403 MUTE;
+#X obj 30 268 *~;
+#X obj 30 296 *~;
+#X floatatom 65 99 5 0 100 0 - - -;
+#X floatatom 30 99 1 0 100 0 - - -;
+#X obj 29 347 +~ 0.3;
+#X obj 29 373 cos~;
+#X obj 29 321 osc~;
+#X obj 65 122 mtof;
+#X obj 65 147 sqrt;
+#X obj 65 172 sqrt;
+#X obj 30 238 *~;
+#X obj 239 218 +~ 1;
+#X obj 239 164 tabosc4~ array62;
+#X floatatom 239 108 5 0 0 0 - - -;
+#X obj 239 135 / 6;
+#X obj 239 192 *~;
+#X floatatom 393 145 5 0 0 0 - - -;
+#X text 238 243 since we'll multiply \,;
+#X text 237 258 vibrato output should;
+#X text 237 275 be centered at 1 \, not 0;
+#X text 278 194 multiply by vib depth;
+#X obj 393 172 / 6923;
+#X text 64 239 apply vibrato;
+#X text 68 267 fourth;
+#X text 71 283 power;
+#X text 99 351 waveform;
+#X text 98 331 simple;
+#X text 468 166 4/(exp(log(2)/1200)-1);
+#X text 472 147 conversion factor is;
+#X text 386 101 vibrato depth;
+#X text 385 118 in cents;
+#X text 236 67 vibrato speed;
+#X text 235 84 in Hertz;
+#X obj 30 197 ../../doc/3.audio.examples/adsr 0 100 200 100 300;
+#X obj 65 39 r pitch;
+#X obj 232 10 r vibrato-speed;
+#X obj 391 10 r vibrato-depth;
+#X obj 44 65 t b f;
+#X connect 0 0 7 0;
+#X connect 1 0 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 2;
+#X connect 4 0 5 0;
+#X connect 4 0 5 1;
+#X connect 5 0 10 0;
+#X connect 6 0 11 0;
+#X connect 7 0 37 0;
+#X connect 8 0 9 0;
+#X connect 9 0 2 0;
+#X connect 10 0 8 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 37 1;
+#X connect 14 0 4 0;
+#X connect 14 0 4 1;
+#X connect 15 0 14 1;
+#X connect 16 0 19 0;
+#X connect 17 0 18 0;
+#X connect 18 0 16 0;
+#X connect 19 0 15 0;
+#X connect 20 0 25 0;
+#X connect 25 0 19 1;
+#X connect 37 0 14 0;
+#X connect 38 0 41 0;
+#X connect 39 0 17 0;
+#X connect 40 0 20 0;
+#X connect 41 0 7 0;
+#X connect 41 1 6 0;
+#X restore 491 32 pd guts;
+#X text 10 166 I made a table with 6 cycles of vibrato and made small
+changes with the mouse to get a not-exactly-repeating vibrato \, and
+thus have to divide vibrato frequency by 6 You can just use a sine
+or triangle wave if you prefer.;
+#X obj 581 35 vsl 22 200 0 100 0 0 master-lvl empty volume -9 -8 1
+8 -225271 -1 -1 0 1;
+#X obj 23 255 grid grid9 200 0 199 200 0 199 1 1 1 10 10 0 0;
+#X obj 25 487 nbx 5 18 -1e+37 1e+37 0 0 vibrato-speed empty speed 0
+26 1 12 -233017 -1 -1 0 256;
+#X obj 217 487 nbx 5 18 -1e+37 1e+37 0 0 vibrato-depth empty depth
+-2 26 1 12 -233017 -1 -1 5970 256;
+#X obj 392 296 tgl 55 0 trigger empty trigger 0 -9 1 10 -24198 -1 -1
+0 1;
+#X obj 291 259 vsl 22 200 0 127 0 0 pitch empty pitch 0 -9 1 8 -62784
+-1 -1 0 1;
+#X obj 25 463 * 0.2;
+#X obj 217 464 * 30;
+#X connect 6 0 11 0;
+#X connect 6 1 12 0;
+#X connect 11 0 7 0;
+#X connect 12 0 8 0;
diff --git a/doc/tutorials/playnow/viewfm.pd b/doc/tutorials/playnow/viewfm.pd
new file mode 100644
index 0000000000000000000000000000000000000000..158aecb68499efd59b67678aacfacfa1e66173ec
--- /dev/null
+++ b/doc/tutorials/playnow/viewfm.pd
@@ -0,0 +1,188 @@
+#N canvas 308 75 701 582 10;
+#X obj 229 244 osc~ 500;
+#X obj 266 327 *~;
+#X obj 282 304 osc~;
+#X obj 286 283 hsl 128 15 0.2 2000 1 0 empty empty modulating_frequency
+-2 -8 0 12 -143356 -1 -1 3100 0;
+#X obj 463 382 r \$0-master-lvl;
+#X obj 444 405 *~;
+#X obj 624 30 vsl 22 200 0 1 0 0 \$0-master-level empty amplitude -9
+-8 1 10 -225271 -1 -1 18900 1;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-wave 1027 float 1;
+#A 0 -0.609364 -0.596634 -0.583713 -0.5706 -0.557308 -0.54383 -0.530185
+-0.516359 -0.502378 -0.488223 -0.473926 -0.45946 -0.444862 -0.430107
+-0.415227 -0.400204 -0.385062 -0.36979 -0.354405 -0.338904 -0.323298
+-0.307588 -0.291781 -0.275883 -0.259896 -0.24383 -0.227685 -0.211472
+-0.19519 -0.178852 -0.162454 -0.146011 -0.129519 -0.112993 -0.0964304
+-0.0798424 -0.06323 -0.046602 -0.0299617 -0.0133158 0.00333072 0.0199724
+0.0366035 0.0532188 0.0698128 0.0863796 0.102915 0.119412 0.135867
+0.152271 0.168626 0.184916 0.201148 0.217303 0.23339 0.24939 0.26531
+0.281134 0.296868 0.312495 0.328021 0.343432 0.358729 0.373904 0.388952
+0.403871 0.418651 0.433295 0.447787 0.462138 0.476322 0.49036 0.504219
+0.517927 0.531442 0.544797 0.557955 0.570941 0.583724 0.596323 0.608715
+0.620912 0.632897 0.644675 0.656238 0.667581 0.678706 0.689598 0.70027
+0.710698 0.720905 0.730856 0.740586 0.750046 0.759284 0.768243 0.776973
+0.785425 0.793636 0.801568 0.809249 0.816652 0.823793 0.830658 0.837251
+0.843568 0.849603 0.855366 0.860836 0.866036 0.870935 0.875566 0.879886
+0.883944 0.88768 0.891155 0.894306 0.89719 0.899756 0.902047 0.904023
+0.905718 0.907103 0.908199 0.908993 0.909489 0.909689 0.909585 0.909192
+0.908489 0.907504 0.906202 0.904624 0.902723 0.900555 0.898061 0.895304
+0.892224 0.888878 0.88522 0.881291 0.877059 0.872552 0.867751 0.862673
+0.857311 0.851669 0.845752 0.839553 0.833089 0.826342 0.819341 0.812054
+0.804524 0.796709 0.788661 0.780327 0.771766 0.76293 0.753867 0.744541
+0.734989 0.725186 0.715156 0.704889 0.694396 0.683678 0.672736 0.661581
+0.650205 0.638628 0.626833 0.614848 0.602651 0.590275 0.57769 0.564939
+0.551984 0.538869 0.525565 0.512105 0.49847 0.484684 0.470735 0.456641
+0.442398 0.428014 0.413494 0.398841 0.384064 0.36916 0.354145 0.339011
+0.323777 0.308433 0.293 0.277466 0.261854 0.246151 0.23038 0.21453
+0.19862 0.182644 0.166616 0.150535 0.13441 0.118245 0.102045 0.0858168
+0.0695637 0.0532927 0.0370077 0.0207154 0.0044201 -0.0118723 -0.0281563
+-0.0444277 -0.0606788 -0.0769079 -0.0931049 -0.10927 -0.125392 -0.141472
+-0.157498 -0.17347 -0.189379 -0.205223 -0.220995 -0.236691 -0.252305
+-0.267831 -0.283267 -0.298603 -0.313842 -0.328967 -0.343989 -0.358884
+-0.373669 -0.388314 -0.402841 -0.417219 -0.431468 -0.445562 -0.459515
+-0.473305 -0.486943 -0.500413 -0.513718 -0.52685 -0.539806 -0.552583
+-0.565171 -0.577577 -0.589782 -0.601801 -0.613606 -0.625222 -0.636612
+-0.647812 -0.658772 -0.669536 -0.680056 -0.69037 -0.700437 -0.710287
+-0.719889 -0.729262 -0.738386 -0.747269 -0.755902 -0.764283 -0.772416
+-0.780286 -0.787907 -0.795256 -0.802358 -0.809176 -0.815748 -0.822026
+-0.828061 -0.833792 -0.839276 -0.844458 -0.849384 -0.854011 -0.858373
+-0.862439 -0.866231 -0.869732 -0.872949 -0.87588 -0.878519 -0.880876
+-0.882934 -0.884714 -0.886189 -0.887391 -0.88828 -0.888902 -0.889205
+-0.889246 -0.888963 -0.888418 -0.887557 -0.886427 -0.884987 -0.883274
+-0.881259 -0.878965 -0.876377 -0.873505 -0.870349 -0.866904 -0.863182
+-0.859167 -0.854883 -0.850304 -0.845467 -0.840332 -0.834948 -0.829263
+-0.823337 -0.817114 -0.81065 -0.8039 -0.796907 -0.789639 -0.782127
+-0.774351 -0.76633 -0.758057 -0.749538 -0.740777 -0.731772 -0.722536
+-0.713057 -0.703358 -0.693417 -0.683269 -0.67288 -0.662295 -0.651472
+-0.640461 -0.629222 -0.617798 -0.60616 -0.594339 -0.582316 -0.570113
+-0.557721 -0.545154 -0.53241 -0.519495 -0.506415 -0.493169 -0.47977
+-0.466211 -0.452511 -0.438657 -0.424674 -0.410543 -0.396294 -0.381905
+-0.367408 -0.352783 -0.338057 -0.323216 -0.30828 -0.293242 -0.278116
+-0.262901 -0.247606 -0.232233 -0.216788 -0.201278 -0.185705 -0.170078
+-0.154396 -0.138672 -0.122904 -0.107103 -0.0912683 -0.0754115 -0.0595317
+-0.0436392 -0.0277357 -0.0118285 0.00407809 0.0199788 0.035868 0.0517412
+0.0675923 0.0834169 0.0992094 0.114965 0.130678 0.146343 0.161957 0.177511
+0.193006 0.208428 0.223783 0.239053 0.254249 0.269347 0.284361 0.299268
+0.314081 0.328779 0.343371 0.357841 0.372193 0.386416 0.40051 0.414468
+0.428284 0.441959 0.45548 0.468855 0.482063 0.495119 0.507997 0.520719
+0.53325 0.54562 0.557788 0.569787 0.58158 0.593193 0.604595 0.615806
+0.626804 0.637598 0.648177 0.658541 0.668688 0.678608 0.688309 0.697773
+0.707017 0.716012 0.724786 0.7333 0.741594 0.749617 0.757417 0.764941
+0.772234 0.779252 0.78603 0.792532 0.798783 0.804761 0.810479 0.815927
+0.821105 0.826016 0.830648 0.835016 0.839096 0.842915 0.846439 0.849705
+0.852667 0.855376 0.857773 0.859918 0.861752 0.863327 0.864598 0.865602
+0.866308 0.866741 0.866882 0.866743 0.866318 0.865609 0.864619 0.86334
+0.861788 0.85994 0.857828 0.855415 0.852745 0.849771 0.846548 0.843017
+0.839239 0.835161 0.830834 0.826215 0.821344 0.816192 0.810784 0.805104
+0.799167 0.792965 0.786504 0.779791 0.772818 0.765604 0.758128 0.750421
+0.742452 0.734264 0.725814 0.717153 0.708234 0.699109 0.689737 0.680159
+0.670347 0.66033 0.65009 0.639648 0.628994 0.61814 0.607087 0.595836
+0.584397 0.572764 0.560956 0.548957 0.536794 0.524445 0.511943 0.499261
+0.486436 0.473438 0.460305 0.447011 0.433587 0.420015 0.406317 0.392485
+0.378533 0.364459 0.35027 0.335972 0.321566 0.307063 0.292459 0.277768
+0.262985 0.248127 0.233186 0.21818 0.203101 0.187966 0.172769 0.157525
+0.14223 0.126897 0.111525 0.0961227 0.0806933 0.065243 0.0497761 0.034298
+0.0188139 0.00332847 -0.0121529 -0.0276251 -0.0430836 -0.058522 -0.0739376
+-0.0893219 -0.104675 -0.119984 -0.135254 -0.15047 -0.165635 -0.180737
+-0.195779 -0.210748 -0.225647 -0.240463 -0.255198 -0.269844 -0.284396
+-0.298851 -0.313201 -0.327448 -0.341577 -0.355596 -0.369486 -0.38326
+-0.396891 -0.4104 -0.423756 -0.436982 -0.450047 -0.462972 -0.47573
+-0.488338 -0.500773 -0.513046 -0.525142 -0.537064 -0.548806 -0.560362
+-0.571735 -0.58291 -0.593898 -0.604678 -0.615269 -0.625639 -0.635818
+-0.645765 -0.655519 -0.665031 -0.674343 -0.683412 -0.69227 -0.700884
+-0.709278 -0.717426 -0.725343 -0.733015 -0.740447 -0.747634 -0.75457
+-0.761262 -0.767693 -0.773882 -0.779801 -0.78548 -0.790879 -0.79604
+-0.800912 -0.805547 -0.809888 -0.813986 -0.817792 -0.821348 -0.824617
+-0.827628 -0.830356 -0.832818 -0.835002 -0.836913 -0.83855 -0.839908
+-0.840996 -0.841799 -0.842338 -0.842585 -0.842575 -0.842266 -0.841707
+-0.840843 -0.839732 -0.838318 -0.836655 -0.834696 -0.832484 -0.829983
+-0.827223 -0.824184 -0.820882 -0.817308 -0.813469 -0.809366 -0.804994
+-0.800368 -0.79547 -0.790326 -0.784909 -0.779255 -0.773326 -0.76717
+-0.760738 -0.754084 -0.747161 -0.740016 -0.732613 -0.724988 -0.717115
+-0.709018 -0.700683 -0.692127 -0.683344 -0.67434 -0.665121 -0.655682
+-0.646039 -0.636177 -0.626123 -0.615853 -0.6054 -0.594735 -0.583898
+-0.572852 -0.561642 -0.550234 -0.538665 -0.52691 -0.514998 -0.502912
+-0.490673 -0.478272 -0.465722 -0.453022 -0.440178 -0.427196 -0.414075
+-0.400828 -0.387448 -0.373953 -0.360331 -0.346606 -0.332762 -0.318825
+-0.304776 -0.290643 -0.27641 -0.2621 -0.247702 -0.233234 -0.21869 -0.204083
+-0.189412 -0.174685 -0.159906 -0.145079 -0.13021 -0.115303 -0.100366
+-0.0853987 -0.070411 -0.0554039 -0.0403856 -0.0253583 -0.010329 0.00469862
+0.0197193 0.0347275 0.0497196 0.0646889 0.0796327 0.0945438 0.109419
+0.124253 0.139041 0.153778 0.168458 0.183079 0.197633 0.212119 0.226527
+0.24086 0.255103 0.269265 0.283324 0.297294 0.311152 0.324913 0.338553
+0.352084 0.365489 0.378774 0.391926 0.404948 0.41783 0.430572 0.443168
+0.455612 0.467906 0.480035 0.49201 0.503809 0.51545 0.526904 0.538197
+0.549291 0.560219 0.570941 0.581488 0.591826 0.601979 0.611919 0.621665
+0.631195 0.64052 0.64963 0.658522 0.667198 0.675647 0.683879 0.691873
+0.699651 0.70718 0.714493 0.721548 0.728388 0.734959 0.741312 0.747396
+0.753254 0.758844 0.764199 0.769289 0.774134 0.778717 0.783047 0.787117
+0.790926 0.794478 0.797761 0.800792 0.803546 0.806052 0.808273 0.81025
+0.811934 0.813379 0.814525 0.815431 0.816046 0.816414 0.816495 0.816324
+0.815874 0.815165 0.814183 0.812938 0.811426 0.809646 0.807607 0.805295
+0.802732 0.799892 0.796808 0.793444 0.789844 0.785961 0.781848 0.777453
+0.772829 0.767932 0.762804 0.757412 0.751786 0.745906 0.739791 0.733431
+0.726835 0.720004 0.712937 0.705644 0.698114 0.690369 0.682387 0.674201
+0.665778 0.657161 0.648309 0.63927 0.630003 0.620552 0.610883 0.601031
+0.590975 0.580738 0.570308 0.559699 0.548909 0.537944 0.526807 0.5155
+0.504032 0.492398 0.480614 0.468668 0.456584 0.444343 0.431974 0.419454
+0.406815 0.394035 0.381142 0.368119 0.354989 0.341741 0.328392 0.314936
+0.301385 0.287739 0.274004 0.260186 0.246286 0.232314 0.218267 0.204158
+0.189984 0.175758 0.161474 0.147149 0.132776 0.118369 0.103925 0.0894565
+0.0749619 0.06045 0.045923 0.0313872 0.0168467 0.00230663 -0.0122283
+-0.0267534 -0.0412639 -0.0557547 -0.0702221 -0.0846595 -0.0990649 -0.11343
+-0.127755 -0.142028 -0.156254 -0.170417 -0.184524 -0.19856 -0.212529
+-0.226419 -0.240233 -0.253959 -0.267599 -0.281144 -0.294592 -0.307938
+-0.321177 -0.334307 -0.347319 -0.360216 -0.372984 -0.385632 -0.398139
+-0.410522 -0.422752 -0.434853 -0.44679 -0.458591 -0.470223 -0.481708
+-0.493021 -0.504175 -0.515153 -0.525963 -0.536592 -0.547043 -0.55731
+-0.567386 -0.577277 -0.586967 -0.59647 -0.605762 -0.614866 -0.623748
+-0.63244 -0.6409 -0.649168 -0.657198 -0.665029 -0.672621 -0.680004
+-0.687148 -0.694076 -0.700763 -0.707225 -0.713448 -0.719436 -0.725187
+-0.730693 -0.735965 -0.740983 -0.745769 -0.750293 -0.754587 -0.758612
+-0.762409 -0.765928 -0.769221 -0.772235 -0.775017 -0.777523 -0.779791
+-0.781788 -0.783539 -0.785024 -0.786256 -0.787228 -0.787941 -0.788398
+-0.78859 -0.788533 -0.788206 -0.787632 -0.786783 -0.785696 -0.78433
+;
+#A 1000 -0.782732 -0.78085 -0.778739 -0.776349 -0.773728 -0.770835
+-0.767706 -0.764314 -0.760683 -0.756797 -0.752668 -0.748293 -0.743674
+-0.738816 -0.733712 -0.728378 -0.722796 -0.716994 -0.710942 -0.704679
+-0.698166 -0.691451 -0.684485 -0.677322 -0.669919 -0.662317 -0.654487
+;
+#X coords 0 1 1026 -1 513 140 1;
+#X restore 59 24 graph;
+#X obj 241 495 tabwrite~ \$0-wave;
+#X obj 271 469 metro 100;
+#X obj 231 225 hsl 128 15 20 2000 1 0 empty empty carrier_frequency
+-2 -8 1 12 -229338 -1 -1 5100 1;
+#X obj 271 389 t b f;
+#X msg 271 410 1;
+#X obj 286 433 /;
+#X floatatom 316 437 5 0 0 0 - - -;
+#X obj 271 367 / 100;
+#X text 8 532 (C) Copyright 2004 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 225 547 released under the GNU GPL;
+#X obj 585 264 pddp/dsp;
+#X obj 201 326 f;
+#X text 117 190 Watch how a basic FM synth changes the waveform.;
+#X obj 432 450 dac~;
+#X connect 0 0 1 0;
+#X connect 1 0 8 0;
+#X connect 1 0 5 0;
+#X connect 2 0 1 1;
+#X connect 3 0 2 0;
+#X connect 4 0 5 1;
+#X connect 5 0 21 0;
+#X connect 5 0 21 1;
+#X connect 9 0 8 0;
+#X connect 10 0 0 0;
+#X connect 10 0 19 0;
+#X connect 11 0 12 0;
+#X connect 11 1 13 1;
+#X connect 12 0 13 0;
+#X connect 13 0 9 0;
+#X connect 13 0 14 0;
+#X connect 15 0 11 0;
+#X connect 19 0 15 0;
diff --git a/doc/tutorials/playnow/voice-am.pd b/doc/tutorials/playnow/voice-am.pd
new file mode 100644
index 0000000000000000000000000000000000000000..38a507b00ea3fd3ebdba2b02f60839123054df8f
--- /dev/null
+++ b/doc/tutorials/playnow/voice-am.pd
@@ -0,0 +1,58 @@
+#N canvas 475 82 481 584 10;
+#X obj 246 34 adc~;
+#X obj 152 496 dac~;
+#X obj 72 106 fiddle~;
+#X obj 71 126 mtof;
+#X obj 159 223 osc~;
+#X floatatom 32 107 5 0 0 0 - - -;
+#X obj 155 467 *~;
+#X obj 248 299 *~;
+#X obj 280 270 line~;
+#X obj 160 343 cos~;
+#X obj 160 323 +~;
+#X obj 280 247 pack 0 50;
+#X floatatom 129 105 5 0 0 0 - - -;
+#X obj 143 276 *~;
+#X obj 119 201 / 100;
+#X obj 119 181 - 55;
+#X text 48 6 sing into the mic to control AM synthesis with your voice
+;
+#X text 17 539 (C) Copyright 2004 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 236 555 released under the GNU GPL;
+#X obj 186 460 nbx 3 18 -1e+37 1e+37 0 0 empty empty empty -9 -10 1
+14 -124831 -1 -1 0.267384 256;
+#X obj 175 437 hsl 200 18 0.01 1 1 0 empty empty master_amplitude 20
+9 1 14 -24198 -1 -1 14200 0;
+#X obj 355 84 pddp/dsp;
+#X obj 159 199 line~;
+#X msg 159 178 \$1 1;
+#X obj 119 246 line~;
+#X msg 119 225 \$1 1;
+#X obj 283 221 hsl 128 15 0.1 1 1 0 empty empty voice_level 10 8 0
+12 -225271 -1 -1 12700 1;
+#X connect 0 0 2 0;
+#X connect 0 0 7 0;
+#X connect 2 0 3 0;
+#X connect 2 0 5 0;
+#X connect 2 3 12 0;
+#X connect 2 3 15 0;
+#X connect 3 0 23 0;
+#X connect 4 0 13 1;
+#X connect 6 0 1 1;
+#X connect 6 0 1 0;
+#X connect 7 0 10 1;
+#X connect 8 0 7 1;
+#X connect 9 0 6 0;
+#X connect 10 0 9 0;
+#X connect 11 0 8 0;
+#X connect 13 0 10 0;
+#X connect 14 0 25 0;
+#X connect 15 0 14 0;
+#X connect 20 0 19 0;
+#X connect 20 0 6 1;
+#X connect 22 0 4 0;
+#X connect 23 0 22 0;
+#X connect 24 0 13 0;
+#X connect 25 0 24 0;
+#X connect 26 0 11 0;
diff --git a/doc/tutorials/playnow/voice-fm.pd b/doc/tutorials/playnow/voice-fm.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c6f066e40495d0bb54b2d2ece8ab879e658b0b38
--- /dev/null
+++ b/doc/tutorials/playnow/voice-fm.pd
@@ -0,0 +1,68 @@
+#N canvas 527 178 691 610 10;
+#X obj 72 16 adc~;
+#X obj 152 496 dac~;
+#X obj 72 103 fiddle~;
+#X obj 71 126 mtof;
+#X floatatom 32 107 5 0 0 0 - - -;
+#X obj 155 467 *~;
+#X obj 172 448 r \$0-master-amp;
+#X obj 549 24 vsl 22 200 0 1 0 0 \$0-master-amp empty volume -9 -8
+1 8 -225271 -1 -1 0 0;
+#X floatatom 129 105 5 0 0 0 - - -;
+#X obj 366 505 writesf~;
+#X msg 323 448 start;
+#X msg 384 468 stop;
+#X msg 366 419 open \$1;
+#X obj 367 342 +;
+#X floatatom 393 343 5 0 0 0 - - -;
+#X msg 365 319 1;
+#X obj 357 251 bng 25 250 50 0 empty empty empty 0 -6 0 8 -4033 -1
+-1;
+#X obj 358 287 t b b b;
+#X obj 342 412 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 119 299 osc~;
+#X obj 124 234 +~;
+#X obj 140 203 *~;
+#X obj 119 179 osc~;
+#X obj 17 187 phasor~;
+#X obj 157 164 * 5;
+#X obj 92 152 * 2;
+#X text 194 76 sing into the mic to control the FM synthesizer;
+#X text 17 539 (C) Copyright 2004 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 236 555 released under the GNU GPL;
+#X text 395 255 click to record;
+#X obj 367 379 makesymbol voice-fm-%s.wav;
+#X obj 539 249 pddp/dsp;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 0 4 0;
+#X connect 2 3 8 0;
+#X connect 2 3 24 0;
+#X connect 3 0 23 0;
+#X connect 3 0 25 0;
+#X connect 5 0 1 1;
+#X connect 5 0 1 0;
+#X connect 5 0 9 0;
+#X connect 6 0 5 1;
+#X connect 10 0 9 0;
+#X connect 11 0 9 0;
+#X connect 12 0 9 0;
+#X connect 13 0 14 0;
+#X connect 13 0 30 0;
+#X connect 14 0 13 1;
+#X connect 15 0 13 0;
+#X connect 16 0 17 0;
+#X connect 17 0 10 0;
+#X connect 17 1 15 0;
+#X connect 17 2 11 0;
+#X connect 19 0 5 0;
+#X connect 20 0 19 0;
+#X connect 21 0 20 1;
+#X connect 22 0 21 0;
+#X connect 23 0 20 0;
+#X connect 24 0 21 1;
+#X connect 25 0 22 0;
+#X connect 30 0 18 0;
+#X connect 30 0 12 0;
diff --git a/doc/tutorials/playnow/waveform_draw.pd b/doc/tutorials/playnow/waveform_draw.pd
new file mode 100644
index 0000000000000000000000000000000000000000..fdb65dc5eef43125fc7782086871ede95ea035d7
--- /dev/null
+++ b/doc/tutorials/playnow/waveform_draw.pd
@@ -0,0 +1,115 @@
+#N canvas 177 80 735 618 10;
+#N canvas 0 22 450 300 graph9 0;
+#X array draw_waveform 515 float 1;
+#A 0 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311
+0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311
+0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311
+0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0851311 0.0811311
+0.0771312 0.0744645 0.0744646 0.0728646 0.0712646 0.0696646 0.0680646
+0.0664646 0.0611314 0.0557981 0.0504649 0.042465 0.0367507 0.0310365
+0.0253223 0.0196081 0.0138939 0.00817968 0.00246547 -0.00553443 -0.0135343
+-0.0199342 -0.0263342 -0.0327341 -0.039134 -0.0455339 -0.0535338 -0.0615337
+-0.0695336 -0.0775335 -0.0855334 -0.101533 -0.101533 -0.101533 -0.106866
+-0.1122 -0.117533 -0.121533 -0.125533 -0.133533 -0.141533 -0.141533
+-0.157532 -0.157532 -0.157532 -0.162866 -0.168199 -0.173532 -0.178866
+-0.184199 -0.189532 -0.197532 -0.205532 -0.213532 -0.217532 -0.221532
+-0.225532 -0.237531 -0.237531 -0.237531 -0.242865 -0.248198 -0.253531
+-0.258864 -0.264198 -0.269531 -0.272198 -0.274864 -0.277531 -0.278762
+-0.279992 -0.281223 -0.282454 -0.283685 -0.284915 -0.286146 -0.287377
+-0.288608 -0.289838 -0.291069 -0.2923 -0.293531 -0.293531 -0.293531
+-0.285531 -0.277531 -0.269531 -0.261531 -0.237531 -0.221532 -0.205532
+-0.197532 -0.176199 -0.154866 -0.133533 -0.117533 -0.101533 -0.0735335
+-0.0455339 -0.0255342 -0.00553441 0.0304651 0.0664647 0.106464 0.114464
+0.162463 0.178463 0.186463 0.194463 0.202463 0.210463 0.210463 0.210463
+0.210463 -0.565527 -0.565527 -0.565527 -0.581527 -0.597527 -0.909523
+-1.02152 -0.101533 0.258462 0.290462 0.306462 0.314461 0.330461 0.362461
+0.370461 0.378461 0.386461 0.39446 0.40246 0.407794 0.413127 0.41846
+0.42646 0.45046 0.498459 0.538459 0.562458 0.578458 0.608172 0.6196
+0.631029 0.642457 0.650457 0.658457 0.666457 0.670457 0.698457 0.698457
+0.714456 0.726456 0.738456 0.744856 0.751256 0.757656 0.764056 0.770455
+0.775255 0.780055 0.784855 0.789655 0.794455 0.799255 0.804055 0.810455
+0.810455 0.810455 0.810455 0.810455 0.810455 0.810455 0.811788 0.813122
+0.814455 0.815788 0.817122 0.818455 0.819344 0.820233 0.821122 0.82201
+0.822899 0.823788 0.824677 0.825566 0.826455 0.826455 0.826455 0.826455
+0.826455 0.826455 0.826455 0.826455 0.826455 0.826455 0.826455 0.826455
+0.826455 0.826455 0.824055 0.821655 0.819255 0.816855 0.814455 0.812055
+0.809655 0.807255 0.804855 0.802455 0.800455 0.798455 0.830819 0.826819
+0.822819 0.816819 0.810819 0.804819 0.798819 0.793486 0.788153 0.782819
+0.782819 0.774819 0.75882 0.75882 0.75882 0.75482 0.75082 0.74282 0.73482
+0.72682 0.71882 0.71082 0.694821 0.686249 0.677678 0.669107 0.660535
+0.651964 0.643393 0.634821 0.62625 0.617679 0.609107 0.600536 0.591965
+0.583393 0.574822 0.476157 0.436157 0.390824 0.345492 0.300159 0.268159
+0.23616 0.20416 0.100161 0.0681619 0.0361623 -0.115836 -0.107836 -0.0998359
+-0.0998359 -0.0998359 -0.091836 -0.091836 -0.395832 -0.415832 -0.435832
+-0.455831 -0.475831 -0.495831 -0.515831 -0.545164 -0.574497 -0.60383
+-0.633162 -0.662495 -0.691828 -0.715828 -0.739828 -0.763827 -0.787827
+-0.811827 -0.833826 -0.855826 -0.877826 -0.899826 -0.939825 -0.939825
+-0.947825 -0.947825 -0.947825 -0.947825 -0.947825 -0.947825 -0.947825
+-0.947825 -0.943825 -0.939825 -0.929159 -0.918492 -0.907826 -0.899826
+-0.891826 -0.883826 -0.875826 -0.867826 -0.859826 -0.851826 -0.843826
+-0.835826 -0.827827 -0.819827 -0.811827 -0.806684 -0.801541 -0.796399
+-0.791256 -0.786113 -0.78097 -0.775827 -0.770685 -0.765542 -0.760399
+-0.755256 -0.750113 -0.744971 -0.739828 -0.731828 -0.723828 -0.715828
+-0.691828 -0.683828 -0.675829 -0.667828 -0.653329 -0.638829 -0.624329
+-0.609829 -0.595329 -0.58083 -0.56633 -0.55183 -0.53733 -0.52283 -0.508331
+-0.493831 -0.479331 -0.464831 -0.450331 -0.435832 -0.421832 -0.407832
+-0.393832 -0.363833 -0.339833 -0.315833 -0.163835 -0.107836 -0.0998359
+0.110828 0.118828 0.118828 0.126828 0.134828 0.134828 0.142828 0.142828
+0.142828 0.142828 0.142828 0.142828 0.142828 0.142828 0.142828 0.142828
+0.142828 0.142828 0.142828 0.142828 0.142828 0.142828 0.142828 0.142828
+0.142828 0.142828 0.142828 0.142828 0.142828 0.142828 0.142828 0.134828
+0.134828 0.134828 0.134828 0.126828 0.126828 0.126828 0.126828 0.110828
+0.110828 0.110828 0.110828 0.102828 0.0948282 0.0868283 0.0829908 0.0775172
+0.0720435 0.0665699 0.0610963 0.0556227 0.0501491 0.0446755 0.0392019
+0.0337282 0.0282546 0.022781 0.0173074 0.0118338 0.00636017 0.000886559
+-0.00458705 -0.0100607 -0.0155343 -0.0214829 -0.0274316 -0.0333802
+-0.0393288 -0.0452775 -0.0512261 -0.0571748 -0.0631234 -0.0690721 -0.0750207
+-0.0809693 -0.086918 -0.0928666 -0.0988153 -0.104764 -0.104764 -0.104764
+-0.104764 -0.104764 -0.104764 -0.104764 -0.104764 -0.102478 -0.100193
+-0.0979068 -0.0956211 -0.0933355 -0.0910498 -0.0887641 -0.0887641 -0.0887641
+-0.0887641 -0.0887641 -0.0887641 -0.0887641 -0.0887641 -0.0807642 -0.0807642
+-0.0807642 -0.0807642 -0.0807642 -0.0767643 -0.0727643 -0.0727643 -0.0687644
+-0.0647644 -0.0634311 -0.0620978 -0.0607645 -0.0594311 -0.0580978 -0.0567645
+-0.0535645 -0.0503646 -0.0471646 -0.0439647 -0.0407647 -0.016765;
+#X coords 0 1 514 -1 512 250 1;
+#X restore 119 35 graph;
+#X obj 118 396 sig~;
+#X obj 121 309 hsl 512 18 10.24 1024 1 0 empty empty pitch -2 -6 1
+14 -257472 -1 -1 0 0;
+#X obj 118 415 tabosc4~ draw_waveform;
+#X obj 118 490 *~;
+#X obj 118 539 dac~;
+#X obj 137 470 hsl 128 18 0.01 1 1 0 empty empty amplitude -2 -6 1
+14 -225271 -1 -1 0 0;
+#N canvas 0 22 450 300 graph10 0;
+#X array draw_pitch 131 float 1;
+#A 0 459.551 444.565 424.585 404.604 399.609 379.629 364.644 334.673
+299.707 269.736 239.766 214.79 179.824 149.854 139.863 134.868 119.883
+109.893 102.757 95.6208 88.4849 81.3491 74.2132 67.0773 59.9414 59.9414
+39.9609 32.4683 24.9756 14.9854 4.99512 -0 -0 34.9658 64.9365 74.9268
+89.9121 94.9072 114.888 122.38 129.873 137.366 144.858 159.844 174.829
+187.317 199.805 208.13 216.455 224.78 239.766 254.751 262.244 269.736
+289.717 304.702 319.688 339.668 354.653 384.624 397.944 411.265 424.585
+454.556 467.043 494.517 504.507 509.502 529.482 559.453 569.443 529.482
+499.512 484.526 472.039 459.551 399.609 284.722 4.99512 9.99023 9.99023
+24.9756 29.9707 44.9561 54.9463 64.9365 77.4243 89.9121 98.2373 106.562
+114.888 128.624 142.361 156.097 169.834 183.154 196.475 209.795 223.115
+236.436 249.756 256.416 263.076 269.736 304.702 309.697 329.678 364.644
+369.639 377.131 384.624 394.614 419.59 434.575 439.57 454.556 454.556
+459.551 469.541 474.536 0 0 0 0 0 0 0 0 0 0 0;
+#X coords 0 1000 130 1 300 200 1;
+#X restore 342 364 graph;
+#X obj 160 372 tabosc4~ draw_pitch;
+#X obj 163 350 hsl 128 18 0.01 1 1 0 empty empty pitch_scan_rate -2
+-6 1 14 -261689 -1 -1 0 0;
+#X text 60 579 (C) Copyright 2004 Hans-Christoph Steiner <hans@at.or.at>
+;
+#X text 277 593 released under the GNU GPL;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 1;
+#X connect 4 0 5 0;
+#X connect 6 0 4 1;
+#X connect 8 0 3 0;
+#X connect 9 0 8 0;
diff --git a/doc/tutorials/sound/00.controlling_dsp_processing.pd b/doc/tutorials/sound/00.controlling_dsp_processing.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c3365e4aa656d183980834f4b1d9975def739450
--- /dev/null
+++ b/doc/tutorials/sound/00.controlling_dsp_processing.pd
@@ -0,0 +1,32 @@
+#N canvas 10 40 620 460 10;
+#X obj 541 21 pddp/dsp;
+#X obj 11 8 cnv 15 400 40 empty empty TEMPLATE 20 12 0 24 -228992 -66577
+0;
+#X text 14 271 To see whether the DSP is on or off \, look at the checkbox
+on the main Pd window. You can also turn the DSP on and off using that
+checkbox.;
+#X text 13 106 You can turn the processing of audio data on and off.
+In order for your patch to run \, you need to make sure that "compute
+audio" is turned on. This is also known as the "DSP". There are a couple
+ways of turning the "DSP" on and off.;
+#X text 14 68 In Pd message processing is always running \, but audio
+processing can be turned on and off.;
+#X msg 51 227 \; pd dsp 1;
+#X msg 118 227 \; pd dsp 0;
+#X text 14 182 As with most programming languages \, in Pd "1" means
+on \, and "0" means off.;
+#X text 15 366 There are also keyboard shortcuts:;
+#X text 26 418 (On MacOS X \, you can also use Cmd-. and Cmd-/);
+#X text 37 385 off: Ctrl-.;
+#X text 44 400 on: Ctrl-/;
+#X obj 269 238 pddp/dsp;
+#X text 263 217 [pddp/dsp];
+#X obj 507 234 osc~ 250;
+#X obj 507 262 *~ 0.2;
+#X obj 499 292 dac~;
+#X text 463 205 (sine wave generator);
+#X text 13 323 You can also use the menu options: from the "Media"
+menu \, select "audio ON" or "audio OFF".;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 15 0 16 1;
diff --git a/doc/tutorials/sound/01.hello_world.pd b/doc/tutorials/sound/01.hello_world.pd
new file mode 100644
index 0000000000000000000000000000000000000000..eed42f10d383aa5d0cfc5c1388e063533be3d5ac
--- /dev/null
+++ b/doc/tutorials/sound/01.hello_world.pd
@@ -0,0 +1,28 @@
+#N canvas 10 40 620 460 10;
+#X obj 292 20 import cyclone;
+#X obj 533 20 pddp/dsp;
+#X obj 8 10 cnv 15 400 40 empty empty hello_world 20 12 0 24 -228992
+-66577 0;
+#X text 198 136 2 create an object called: osc~;
+#X text 198 106 1 create a message box with the text: 200;
+#X text 198 166 3 create an object called: dac~;
+#X text 198 196 4 connect the message box to the osc~ object's left
+inlet;
+#X text 198 226 5 connect the osc~ object to both inlets of the dac~
+object;
+#X text 198 256 6 make sure your volume is set very low;
+#X text 198 286 7 turn on DSP by clicking the box on the upper right
+corner;
+#X text 198 316 8 click the message box to hear sound;
+#N canvas 0 22 454 304 how 0;
+#X text 14 9 It seems every different keyboard has a different way
+to type the tilde "~". Here is a list of how to type the tilde on various
+keyboards:;
+#X text 16 141 Mac OS X;
+#X text 16 211 Windows;
+#X text 37 252 Spanish: Alt-4-space;
+#X text 37 162 German: Alt-N-space;
+#X text 16 91 GNU/Linux;
+#X text 37 232 Any keyboard with a number pad: Alt-126;
+#X text 37 59 US: shift and the most upper-left key \, below Esc;
+#X restore 316 365 pd how to type ~;
diff --git a/doc/tutorials/sound/02.audio_data.pd b/doc/tutorials/sound/02.audio_data.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6ec347477bf93292cef6258aa0c925a3bc340cce
--- /dev/null
+++ b/doc/tutorials/sound/02.audio_data.pd
@@ -0,0 +1,24 @@
+#N canvas 10 40 620 460 10;
+#X obj 292 20 import cyclone;
+#X obj 236 244 *~;
+#X obj 253 217 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 236 186 osc~ 500;
+#X obj 224 288 dac~;
+#X msg 232 142 250;
+#X msg 267 143 500;
+#X msg 200 142 125;
+#X obj 533 20 pddp/dsp;
+#X obj 8 10 cnv 15 400 40 empty empty audio_data 20 12 0 24 -228992
+-66577 0;
+#X text 75 265 audio (thick cord) -->;
+#X text 49 164 messages (thin cord) -->;
+#X text 14 70 For audio \, pd has a specific data type. Audio objects
+all have a trailing tilde ("~"). Audio coords are thick.;
+#X connect 1 0 4 0;
+#X connect 1 0 4 1;
+#X connect 2 0 1 1;
+#X connect 3 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 3 0;
+#X connect 7 0 3 0;
diff --git a/doc/tutorials/sound/02.make_some_noise.pd b/doc/tutorials/sound/02.make_some_noise.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e9604fe1fa4257040a34cfc9f0ad8fdd9732a54c
--- /dev/null
+++ b/doc/tutorials/sound/02.make_some_noise.pd
@@ -0,0 +1,15 @@
+#N canvas 10 40 620 460 10;
+#X obj 10 10 cnv 15 400 40 empty empty make_some_noise! 20 12 0 24
+-228992 -66577 0;
+#X obj 499 21 pddp/dsp;
+#X text 17 71 To keep things interesting \, let's make some noise.
+We can start with the [noise~] object and connect it to [dac~] to output
+sound. We multiply the audio by 0.1 to make it quiet.;
+#X obj 274 253 noise~;
+#X obj 257 365 dac~;
+#X obj 274 305 *~ 0.05;
+#X text 17 156 To hear the noise \, click on the box in the upper right
+corner \, to the left of where it says "dsp".;
+#X connect 3 0 5 0;
+#X connect 5 0 4 0;
+#X connect 5 0 4 1;
diff --git a/doc/tutorials/sound/03.dsp_processing.pd b/doc/tutorials/sound/03.dsp_processing.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b98412e73d3045b8ea8386fa5890649443d277ec
--- /dev/null
+++ b/doc/tutorials/sound/03.dsp_processing.pd
@@ -0,0 +1,40 @@
+#N canvas 10 40 620 460 10;
+#X obj 541 21 pddp/dsp;
+#X obj 11 8 cnv 15 400 40 empty empty dsp_processing 20 12 0 24 -228992
+-66577 0;
+#X text 13 69 Unlike message processing \, which is always running
+\, audio processing can be switched on and off. This is also known
+as "DSP" or Digital Signal Processing.;
+#X text 12 122 There are many ways to control the DSP: There is a checkbox
+in the Pd window \; you can send Pd a dsp message \; there are key
+commands \; and there are high-level objects \, like [pddp/dsp].;
+#X text 15 189 The dsp message:;
+#X msg 28 238 \; pd dsp 0;
+#X msg 119 238 \; pd dsp 1;
+#X text 34 218 off (0);
+#X text 123 217 on (1);
+#X msg 218 238 \; pd dsp \$1;
+#X obj 218 214 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 243 213 use a toggle;
+#X text 355 209 receive the message;
+#X obj 357 227 receive pd;
+#X obj 357 248 route dsp;
+#X obj 357 269 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 22 303 Key commands:;
+#X text 57 328 GNU/Linux and Windows:;
+#X text 148 314 Mac OS X:;
+#X text 227 299 (off);
+#X text 328 300 (on);
+#X text 224 328 Ctrl-.;
+#X text 224 314 Cmd-.;
+#X text 324 328 Ctrl-/;
+#X text 324 314 Cmd-/;
+#X text 21 361 Objects:;
+#X text 55 383 [pddp/dsp];
+#X obj 132 383 pddp/dsp;
+#X obj 331 383 output~;
+#X connect 10 0 9 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
diff --git a/doc/tutorials/sound/TEMPLATE.pd b/doc/tutorials/sound/TEMPLATE.pd
new file mode 100644
index 0000000000000000000000000000000000000000..73f86c936ba5f194b91625c3b1da3f913d464686
--- /dev/null
+++ b/doc/tutorials/sound/TEMPLATE.pd
@@ -0,0 +1,5 @@
+#N canvas 286 169 644 464 10;
+#X obj 541 21 pddp/dsp;
+#X obj 11 8 cnv 15 400 40 empty empty TEMPLATE 20 12 0 24 -228992 -66577
+0;
+#X obj 151 364 output~;
diff --git a/doc/tutorials/sound/TODO b/doc/tutorials/sound/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..5c2edd2568d3e3e05f91c6d07fcd93ee2c633958
--- /dev/null
+++ b/doc/tutorials/sound/TODO
@@ -0,0 +1,64 @@
+
+- replace [comment] with #X text
+
+- wavetable
+  - link to playnow/draw_sound
+
+- Load a sound file (high-level, no tables, no soundfiler)
+
+- Play sound file back with phasor~?
+
+- Scrub sound file with numberbox
+
+- Create sound (high-level FM abstraction?)
+
+- Change sound quality with numberbox
+
+- ggkarman has some very nice MIDI tuts
+
+File Order:
+
+- hello world
+    quick sine wave patch
+- audio data
+    differences between audio and message data
+- signal network
+    when the DSP is on, audio processing is always running
+- dsp processing
+    controlling the DSP
+- oscillators
+    [osc~], [cos~], [phasor~]
+- amplitude modulation
+    super simple AM
+- AM synthesis
+    nice AM example
+- frequency modulation
+- FM synthesis  
+    (80's keyboard sound!)
+- click
+    graph click and play it
+	 a click contains all frequencies
+- ramping up and down
+    [line~], [line]
+- 3.audio.examples/A04.line2.pd
+- filtering
+    removing audio by frequency
+	 working in the frequency domain rather than amplitude
+- filter types 
+    lowpass, highpass, bandpass, bandreject/notch
+- filter order
+- filter shapes
+- resonant frequency
+- filter Q
+- equalizer
+- reverb (rev1, rev2, freeverb~)
+- feedback delay network reverb (fbn~)
+- convolution reverb (partconv~)
+
+
+
+digital audio tutorial
+- digital audio
+    samples represent the amplitude at the slice of time
+- aliasing
+- the samples 
diff --git a/doc/tutorials/sound/amplitude_modulation.pd b/doc/tutorials/sound/amplitude_modulation.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cb898b26875acb105702d608446e00e5c3026c1f
--- /dev/null
+++ b/doc/tutorials/sound/amplitude_modulation.pd
@@ -0,0 +1,351 @@
+#N canvas 53 137 636 456 10;
+#X obj 23 406 dac~;
+#N canvas 0 22 450 300 graph1 0;
+#X array \$0-wavetable 2205 float 1;
+#A 0 -0.326067 -0.353269 -0.379974 -0.406149 -0.431757 -0.456769 -0.481156
+-0.504888 -0.527935 -0.550262 -0.57185 -0.592673 -0.612706 -0.631925
+-0.650301 -0.667814 -0.684447 -0.700175 -0.714979 -0.728848 -0.741767
+-0.75372 -0.764696 -0.77468 -0.78366 -0.791621 -0.798549 -0.804451
+-0.809321 -0.813156 -0.815952 -0.817708 -0.818424 -0.818101 -0.816736
+-0.814318 -0.810872 -0.806406 -0.800925 -0.794441 -0.786963 -0.778502
+-0.769071 -0.758674 -0.747334 -0.735061 -0.721879 -0.707809 -0.692872
+-0.677087 -0.660477 -0.643063 -0.62486 -0.605903 -0.586219 -0.565828
+-0.54476 -0.523046 -0.500716 -0.477799 -0.454321 -0.430315 -0.405815
+-0.380854 -0.355464 -0.329677 -0.303526 -0.277048 -0.250277 -0.223244
+-0.195988 -0.168545 -0.140949 -0.113237 -0.0854432 -0.0576034 -0.0297525
+-0.00192714 0.0258369 0.0535042 0.0810398 0.108409 0.135578 0.162512
+0.189178 0.215543 0.241568 0.267223 0.292479 0.317303 0.341667 0.365539
+0.388891 0.411695 0.433922 0.455538 0.476521 0.496846 0.51649 0.535432
+0.553649 0.571119 0.587821 0.603733 0.618835 0.633114 0.646551 0.659128
+0.670838 0.681668 0.691605 0.700641 0.708755 0.715947 0.722212 0.727545
+0.731941 0.735387 0.737891 0.739453 0.74007 0.739736 0.738464 0.736259
+0.733125 0.729069 0.724098 0.718213 0.711431 0.703756 0.695203 0.685791
+0.675535 0.664448 0.652548 0.639851 0.626377 0.612138 0.597147 0.58144
+0.565037 0.547962 0.530239 0.511891 0.492944 0.473424 0.453353 0.432756
+0.411662 0.390106 0.368115 0.345719 0.322947 0.29983 0.276397 0.252676
+0.228701 0.204503 0.180113 0.155565 0.130891 0.106121 0.0812891 0.0564253
+0.0315616 0.00673072 -0.0180358 -0.0427068 -0.0672502 -0.0916353 -0.115832
+-0.139809 -0.163536 -0.186983 -0.210122 -0.232924 -0.255362 -0.277408
+-0.299032 -0.32021 -0.340916 -0.36112 -0.380802 -0.39994 -0.418512
+-0.436494 -0.453866 -0.470608 -0.486698 -0.502112 -0.516834 -0.530852
+-0.544152 -0.556719 -0.568538 -0.579598 -0.589886 -0.599393 -0.608099
+-0.615994 -0.62308 -0.629352 -0.634804 -0.639432 -0.643232 -0.646203
+-0.648342 -0.64964 -0.650108 -0.649741 -0.648548 -0.646536 -0.643708
+-0.640072 -0.635636 -0.630401 -0.624377 -0.61758 -0.610021 -0.601708
+-0.592655 -0.582881 -0.572399 -0.561225 -0.549369 -0.536855 -0.523702
+-0.509929 -0.495556 -0.480602 -0.465084 -0.449031 -0.432461 -0.415395
+-0.397862 -0.379887 -0.361493 -0.342705 -0.32355 -0.304051 -0.284232
+-0.264122 -0.243747 -0.223138 -0.202321 -0.181323 -0.160172 -0.138896
+-0.117521 -0.0960768 -0.0745874 -0.053084 -0.0315944 -0.0101459 0.0112342
+0.032519 0.0536815 0.0746954 0.0955336 0.116169 0.136577 0.15673 0.176606
+0.19618 0.215428 0.234327 0.252854 0.270983 0.288694 0.305968 0.322783
+0.339117 0.354954 0.370276 0.385065 0.399303 0.41297 0.426056 0.438546
+0.450428 0.461686 0.472305 0.482279 0.491598 0.500247 0.50822 0.515513
+0.522119 0.528032 0.533248 0.537764 0.541568 0.544666 0.547048 0.548723
+0.549691 0.549955 0.549518 0.548383 0.546554 0.544037 0.540829 0.536938
+0.53238 0.527163 0.521298 0.514795 0.507665 0.499919 0.491571 0.482628
+0.473105 0.463017 0.452386 0.441226 0.429555 0.41739 0.404748 0.391648
+0.378102 0.364138 0.349773 0.335025 0.319919 0.304476 0.288717 0.272664
+0.256337 0.239759 0.222954 0.205945 0.188754 0.171404 0.153918 0.13632
+0.118634 0.100881 0.083086 0.0652726 0.0474637 0.029682 0.0119504 -0.00570859
+-0.0232722 -0.040718 -0.0580236 -0.0751675 -0.0921286 -0.108886 -0.125419
+-0.141708 -0.157733 -0.173473 -0.188907 -0.204018 -0.21879 -0.233205
+-0.247247 -0.2609 -0.274147 -0.286974 -0.299367 -0.311305 -0.322779
+-0.333777 -0.34429 -0.354306 -0.363815 -0.372808 -0.381275 -0.389205
+-0.39659 -0.403428 -0.409706 -0.415425 -0.420581 -0.425169 -0.429189
+-0.432636 -0.435505 -0.437798 -0.439519 -0.440667 -0.44124 -0.441243
+-0.440681 -0.439558 -0.437878 -0.43564 -0.432858 -0.429538 -0.425688
+-0.421314 -0.416425 -0.411028 -0.405136 -0.398756 -0.391901 -0.384585
+-0.376821 -0.368621 -0.359999 -0.350967 -0.341541 -0.33173 -0.321549
+-0.31102 -0.300157 -0.288978 -0.277498 -0.265735 -0.253705 -0.241426
+-0.228913 -0.216182 -0.203255 -0.190151 -0.176888 -0.163485 -0.149959
+-0.136329 -0.122614 -0.10883 -0.0949973 -0.0811341 -0.0672593 -0.0533915
+-0.0395489 -0.0257491 -0.0120101 0.00165066 0.0152156 0.0286674 0.0419894
+0.0551645 0.0681763 0.081009 0.0936473 0.106076 0.118279 0.130241 0.141951
+0.153393 0.164555 0.175425 0.185987 0.196232 0.206149 0.215724 0.224949
+0.233816 0.242315 0.250438 0.258176 0.265523 0.272468 0.279006 0.285131
+0.29084 0.296129 0.300994 0.305433 0.309442 0.313019 0.316164 0.318867
+0.321134 0.322966 0.324366 0.325335 0.325874 0.325987 0.325677 0.324947
+0.323796 0.322234 0.320264 0.317895 0.315133 0.311986 0.308461 0.304565
+0.300305 0.295689 0.290728 0.285432 0.279808 0.273869 0.267627 0.261092
+0.254275 0.247184 0.239835 0.23224 0.224411 0.216362 0.208101 0.199645
+0.191007 0.182199 0.173233 0.164126 0.154891 0.145541 0.136091 0.126553
+0.11694 0.107267 0.0975471 0.0877943 0.0780229 0.0682462 0.0584777
+0.0487303 0.0390171 0.0293511 0.0197446 0.0102102 0.000760823 -0.00859144
+-0.0178349 -0.0269579 -0.0359494 -0.0447983 -0.0534941 -0.0620259 -0.0703832
+-0.078556 -0.0865359 -0.0943137 -0.101881 -0.10923 -0.116352 -0.123241
+-0.129886 -0.136284 -0.142428 -0.14831 -0.153927 -0.159274 -0.164347
+-0.169141 -0.173653 -0.177878 -0.181815 -0.185462 -0.188817 -0.191877
+-0.194642 -0.197112 -0.199289 -0.201168 -0.202754 -0.204047 -0.205049
+-0.205764 -0.206192 -0.206337 -0.206199 -0.205786 -0.205098 -0.204142
+-0.202923 -0.201446 -0.199717 -0.197741 -0.195525 -0.193074 -0.190392
+-0.187486 -0.184368 -0.181043 -0.177519 -0.173805 -0.169908 -0.165836
+-0.161598 -0.157201 -0.152651 -0.147962 -0.143141 -0.138198 -0.133142
+-0.127982 -0.122728 -0.117387 -0.111969 -0.106484 -0.10094 -0.0953477
+-0.0897162 -0.0840548 -0.0783725 -0.0726783 -0.0669805 -0.0612881 -0.0556103
+-0.0499555 -0.044332 -0.0387479 -0.0332117 -0.0277313 -0.0223143 -0.0169678
+-0.0116996 -0.00651675 -0.00142592 0.00356629 0.00845359 0.0132298
+0.0178891 0.0224261 0.0268352 0.0311117 0.035251 0.0392487 0.043101
+0.046804 0.0503543 0.0537482 0.0569827 0.0600556 0.0629652 0.0657096
+0.0682872 0.070697 0.072938 0.0750096 0.0769116 0.0786419 0.0802025
+0.0815945 0.0828188 0.0838767 0.0847698 0.0854998 0.0860689 0.0864788
+0.0867319 0.0868315 0.0867804 0.0865828 0.0862424 0.085763 0.0851486
+0.0844036 0.0835311 0.0825368 0.0814257 0.0802027 0.0788721 0.0774401
+0.0759123 0.0742941 0.0725909 0.0708078 0.0689515 0.0670279 0.065043
+0.0630028 0.0609125 0.058779 0.0566084 0.0544061 0.0521786 0.0499323
+0.047673 0.0454068 0.0431396 0.0408772 0.038625 0.0363888 0.0341738
+0.0319861 0.029831 0.0277136 0.0256391 0.0236123 0.0216379 0.0197205
+0.0178641 0.016073 0.0143516 0.0127035 0.0111324 0.00964162 0.00823433
+0.00691344 0.00568162 0.00454127 0.00349465 0.00254373 0.00169029 0.000935777
+0.000281402 -0.00027188 -0.000723372 -0.00107263 -0.00131945 -0.00146392
+-0.00150636 -0.00144734 -0.00128774 -0.00102863 -0.000671379 -0.000217571
+0.000330957 0.00097213 0.00170364 0.00252294 0.00342727 0.00441361
+0.00547874 0.00661929 0.00783165 0.00911187 0.0104561 0.0118602 0.0133198
+0.0148305 0.0163875 0.0179861 0.0196212 0.0212879 0.0229807 0.0246948
+0.0264248 0.0281653 0.0299108 0.0316557 0.0333946 0.0351215 0.0368302
+0.0385156 0.0401722 0.0417944 0.0433765 0.044913 0.0463984 0.0478271
+0.0491936 0.0504919 0.0517169 0.0528639 0.0539282 0.0549047 0.0557887
+0.0565755 0.0572608 0.0578396 0.058308 0.0586625 0.0588987 0.0590135
+0.0590038 0.0588664 0.0585987 0.0581978 0.0576605 0.0569856 0.0561713
+0.0552159 0.0541176 0.0528755 0.0514891 0.0499579 0.0482815 0.0464595
+0.0444929 0.0423825 0.040129 0.0377338 0.0351982 0.0325238 0.0297131
+0.0267682 0.0236921 0.0204879 0.0171589 0.0137086 0.0101409 0.00645975
+0.00266967 -0.00122472 -0.00521835 -0.00930601 -0.0134823 -0.0177416
+-0.022078 -0.0264854 -0.0309576 -0.0354879 -0.0400695 -0.0446946 -0.0493569
+-0.0540491 -0.058764 -0.0634938 -0.0682311 -0.072968 -0.0776966 -0.0824076
+-0.0870939 -0.0917469 -0.0963583 -0.10092 -0.105425 -0.109864 -0.114228
+-0.11851 -0.122699 -0.12679 -0.130773 -0.134641 -0.138384 -0.141995
+-0.145468 -0.148793 -0.151963 -0.15497 -0.157808 -0.16047 -0.16295
+-0.16524 -0.167331 -0.169221 -0.170902 -0.172367 -0.173612 -0.174634
+-0.175426 -0.175984 -0.176305 -0.176383 -0.176215 -0.175796 -0.175123
+-0.174197 -0.173014 -0.171573 -0.169873 -0.167913 -0.165691 -0.163208
+-0.160461 -0.157451 -0.154182 -0.150655 -0.146871 -0.142833 -0.138543
+-0.134004 -0.12922 -0.124193 -0.118928 -0.113429 -0.107703 -0.101755
+-0.0955907 -0.0892165 -0.0826389 -0.075864 -0.0688996 -0.0617537 -0.0544346
+-0.0469498 -0.0393089 -0.0315208 -0.023595 -0.0155409 -0.00736833 0.000912122
+0.00929006 0.0177548 0.0262955 0.0349005 0.0435587 0.0522585 0.060988
+0.0697347 0.0784873 0.0872335 0.0959613 0.104658 0.113312 0.121909
+0.130437 0.138882 0.147233 0.155477 0.163603 0.171597 0.179448 0.187144
+0.194671 0.202017 0.209166 0.216111 0.22284 0.229343 0.235607 0.241623
+0.247379 0.252866 0.25807 0.262982 0.267591 0.271892 0.275875 0.279533
+0.282857 0.285839 0.288474 0.290749 0.292662 0.294207 0.295376 0.296167
+0.296576 0.296598 0.29623 0.295469 0.294309 0.292753 0.290798 0.288444
+0.285689 0.282533 0.278979 0.275028 0.27068 0.265938 0.260807 0.255291
+0.249394 0.24312 0.236475 0.229462 0.22209 0.214363 0.206293 0.197886
+0.189152 0.1801 0.17074 0.16108 0.151132 0.140904 0.13041 0.119662
+0.108674 0.0974573 0.0860259 0.0743932 0.0625731 0.0505798 0.0384274
+0.0261313 0.0137076 0.00117172 -0.0114604 -0.0241728 -0.0369493 -0.0497734
+-0.0626282 -0.0754961 -0.0883608 -0.101205 -0.11401 -0.126761 -0.139439
+-0.152029 -0.164511 -0.176868 -0.189083 -0.201139 -0.213019 -0.224707
+-0.236183 -0.247433 -0.25844 -0.269189 -0.279659 -0.289839 -0.299713
+-0.309267 -0.318485 -0.327353 -0.335853 -0.343976 -0.351705 -0.359027
+-0.365934 -0.372412 -0.378452 -0.384043 -0.389173 -0.393834 -0.398012
+-0.401697;
+#A 1000 -0.404884 -0.407568 -0.409744 -0.411404 -0.412544 -0.413158
+-0.413242 -0.412793 -0.411799 -0.410265 -0.408192 -0.40558 -0.402428
+-0.398738 -0.394512 -0.389751 -0.384455 -0.378628 -0.372277 -0.365404
+-0.35802 -0.35013 -0.341743 -0.332865 -0.323507 -0.313672 -0.303375
+-0.292628 -0.281442 -0.269824 -0.257793 -0.245361 -0.232542 -0.219349
+-0.205797 -0.191904 -0.177685 -0.163158 -0.14834 -0.133247 -0.117898
+-0.102313 -0.0865084 -0.070506 -0.0543255 -0.037987 -0.0215108 -0.00491751
+0.011772 0.0285363 0.0453537 0.0622019 0.0790595 0.0959048 0.112716
+0.129471 0.146148 0.162724 0.179179 0.195487 0.211625 0.227574 0.243313
+0.25882 0.274075 0.289055 0.303741 0.318112 0.332142 0.345816 0.35911
+0.372009 0.384495 0.396551 0.408157 0.419297 0.429953 0.440103 0.44974
+0.458846 0.467403 0.475401 0.482828 0.489672 0.495921 0.501559 0.506578
+0.510972 0.514732 0.51785 0.520315 0.522121 0.523268 0.523749 0.523553
+0.522686 0.521145 0.51893 0.516041 0.512477 0.508239 0.503325 0.497742
+0.491491 0.484583 0.477024 0.468821 0.459981 0.450514 0.440428 0.429733
+0.418429 0.40654 0.394078 0.381059 0.367495 0.353403 0.338798 0.323697
+0.308115 0.292068 0.275577 0.258662 0.241345 0.223647 0.205588 0.187191
+0.168477 0.149467 0.130187 0.11066 0.0909108 0.0709633 0.0508434 0.0305763
+0.0101873 -0.0102979 -0.0308529 -0.0514514 -0.0720671 -0.0926736 -0.113244
+-0.133751 -0.154168 -0.17447 -0.194628 -0.214615 -0.234406 -0.253975
+-0.273296 -0.292344 -0.311092 -0.329512 -0.347582 -0.365274 -0.382565
+-0.399433 -0.415856 -0.431811 -0.447275 -0.462226 -0.476644 -0.490502
+-0.503776 -0.516457 -0.528525 -0.539964 -0.550756 -0.560885 -0.570336
+-0.579094 -0.58714 -0.594456 -0.601036 -0.606873 -0.611957 -0.616279
+-0.619829 -0.622602 -0.624591 -0.62578 -0.626173 -0.625767 -0.624555
+-0.622541 -0.619727 -0.616112 -0.611699 -0.606488 -0.600477 -0.593679
+-0.586101 -0.577749 -0.568624 -0.558742 -0.548114 -0.536751 -0.524659
+-0.511854 -0.498353 -0.484171 -0.469325 -0.45383 -0.4377 -0.420957
+-0.403621 -0.385707 -0.367242 -0.348249 -0.32875 -0.308767 -0.288326
+-0.267451 -0.246164 -0.224492 -0.202462 -0.180103 -0.157444 -0.134511
+-0.111334 -0.0879416 -0.0643624 -0.0406261 -0.0167622 0.00719779 0.0312232
+0.0552836 0.0793482 0.103387 0.127368 0.151261 0.175035 0.198657 0.222098
+0.245325 0.268309 0.291021 0.313431 0.33551 0.357228 0.378553 0.399457
+0.419915 0.439899 0.459376 0.478325 0.496721 0.514539 0.531753 0.548332
+0.564261 0.579518 0.594081 0.60793 0.62104 0.633393 0.644975 0.655766
+0.665745 0.674904 0.683231 0.690712 0.697334 0.703088 0.707959 0.711936
+0.715009 0.717177 0.718438 0.718789 0.718226 0.716748 0.714354 0.711043
+0.706816 0.701658 0.695594 0.688628 0.680768 0.67202 0.662393 0.651898
+0.640546 0.628342 0.615301 0.601436 0.586768 0.571315 0.555095 0.538126
+0.520429 0.502024 0.482924 0.463159 0.442755 0.421732 0.400116 0.377936
+0.355219 0.331992 0.308283 0.284118 0.259531 0.234552 0.209213 0.183543
+0.157574 0.13134 0.104875 0.0782095 0.0513791 0.024418 -0.00263999
+-0.0297606 -0.0569095 -0.0840522 -0.111153 -0.138177 -0.165088 -0.191852
+-0.218437 -0.244807 -0.270928 -0.296767 -0.32229 -0.347463 -0.372247
+-0.396611 -0.420528 -0.443964 -0.466891 -0.489277 -0.511093 -0.53231
+-0.552899 -0.572824 -0.592059 -0.610583 -0.628371 -0.645401 -0.661649
+-0.677093 -0.691711 -0.705479 -0.718372 -0.730381 -0.741484 -0.751662
+-0.760907 -0.769205 -0.776544 -0.782913 -0.788291 -0.792674 -0.79606
+-0.798441 -0.799811 -0.800158 -0.799488 -0.797801 -0.795097 -0.791362
+-0.786615 -0.780858 -0.774097 -0.766338 -0.757589 -0.747849 -0.737138
+-0.725463 -0.712835 -0.699275 -0.6848 -0.669424 -0.653167 -0.636047
+-0.618084 -0.599294 -0.579693 -0.559314 -0.538185 -0.51633 -0.493776
+-0.47055 -0.446681 -0.422196 -0.397125 -0.371493 -0.345336 -0.318689
+-0.291587 -0.264062 -0.236149 -0.207882 -0.179296 -0.150426 -0.121309
+-0.0919825 -0.0624826 -0.0328481 -0.00311648 0.0266748 0.056488 0.0862853
+0.116027 0.145676 0.175195 0.204546 0.233688 0.262586 0.291203 0.319502
+0.347445 0.374994 0.402115 0.428774 0.454936 0.480568 0.505631 0.530093
+0.553926 0.57709 0.599558 0.621305 0.6423 0.662517 0.681927 0.700505
+0.718223 0.73505 0.750962 0.765948 0.779986 0.793057 0.805144 0.816229
+0.826296 0.835331 0.843312 0.850218 0.856055 0.860815 0.864491 0.867075
+0.868562 0.86895 0.868235 0.866403 0.863467 0.859419 0.854272 0.848033
+0.840708 0.832303 0.822829 0.812291 0.800696 0.788066 0.774416 0.759755
+0.744103 0.727482 0.709913 0.691415 0.672004 0.651706 0.630551 0.608563
+0.58577 0.562195 0.537867 0.51282 0.487084 0.460684 0.433661 0.406048
+0.37788 0.34919 0.320016 0.290391 0.260352 0.229937 0.199185 0.168137
+0.136831 0.105308 0.0736064 0.0417664 0.00982814 -0.022168 -0.05418
+-0.0861668 -0.118088 -0.149903 -0.181571 -0.213052 -0.244306 -0.275292
+-0.305971 -0.336299 -0.366238 -0.39575 -0.424798 -0.453346 -0.481356
+-0.508793 -0.53562 -0.561798 -0.587293 -0.612076 -0.636111 -0.659364
+-0.68181 -0.703419 -0.724164 -0.744017 -0.762938 -0.780914 -0.797923
+-0.81394 -0.828943 -0.842903 -0.855811 -0.867648 -0.878394 -0.888029
+-0.896549 -0.903942 -0.910198 -0.915306 -0.919259 -0.922039 -0.923651
+-0.92408 -0.923335 -0.921417 -0.918328 -0.914071 -0.908649 -0.902068
+-0.894336 -0.885449 -0.875411 -0.864251 -0.851983 -0.838621 -0.82418
+-0.808677 -0.792131 -0.774562 -0.755983 -0.736415 -0.715885 -0.694425
+-0.672061 -0.648821 -0.624733 -0.599827 -0.574132 -0.547673 -0.520491
+-0.492619 -0.464087 -0.434936 -0.405205 -0.374929 -0.344145 -0.312892
+-0.281206 -0.249132 -0.216709 -0.183979 -0.15098 -0.117757 -0.0843517
+-0.0508062 -0.0171627 0.0165353 0.0502448 0.0839231 0.117528 0.151016
+0.184344 0.217468 0.250348 0.282937 0.315197 0.347088 0.378567 0.409596
+0.440134 0.470143 0.49958 0.528402 0.556575 0.584067 0.610842 0.636866
+0.662106 0.686529 0.710103 0.732797 0.754569 0.775392 0.795249 0.814114
+0.831963 0.848772 0.864519 0.879184 0.892741 0.905167 0.916455 0.926578
+0.935533 0.943309 0.949895 0.955282 0.959463 0.962419 0.964151 0.964663
+0.963952 0.962008 0.95884 0.954452 0.948852 0.942044 0.93402 0.924806
+0.914413 0.902853 0.89014 0.876283 0.861298 0.84521 0.828033 0.809786
+0.790499 0.770197 0.748904 0.726647 0.703452 0.679348 0.654358 0.628512
+0.601851 0.574409 0.54622 0.517321 0.487747 0.457535 0.426722 0.395347
+0.36344 0.331052 0.298224 0.264998 0.231416 0.197519 0.163351 0.128955
+0.0943722 0.0596484 0.0248279 -0.0100443 -0.0449238 -0.0797665 -0.114528
+-0.149165 -0.183633 -0.217885 -0.25188 -0.285575 -0.318924 -0.351885
+-0.384417 -0.41648 -0.448032 -0.479031 -0.509433 -0.539205 -0.568309
+-0.596708 -0.624364 -0.651235 -0.677294 -0.702508 -0.726835 -0.750248
+-0.772722 -0.794228 -0.814737 -0.834223 -0.852662 -0.870016 -0.886273
+-0.901401 -0.915393 -0.928231 -0.939898 -0.950378 -0.959659 -0.967728
+-0.974574 -0.980169 -0.984511 -0.987607 -0.989452 -0.990044 -0.989382
+-0.987466 -0.984297 -0.979879 -0.974202 -0.96728 -0.959122 -0.949746
+-0.939162 -0.927384 -0.914427 -0.900306 -0.885034 -0.868624 -0.851107
+-0.832504 -0.812829 -0.792118 -0.770396 -0.747691 -0.724031 -0.699437
+-0.673945 -0.647591 -0.620408 -0.592431 -0.563686 -0.534218 -0.504065
+-0.473263 -0.441846 -0.40986 -0.377347 -0.344346 -0.3109 -0.277051
+-0.242839 -0.20831 -0.173506 -0.138473 -0.103256 -0.0679009 -0.0324514
+0.00304741 0.0385507 0.0740137 0.109391 0.144634 0.1797 0.214545 0.249124
+0.283394 0.317312 0.350835 0.383919 0.416522 0.448596 0.480102 0.511004
+0.541262 0.57084 0.599699 0.627802 0.655114 0.681593 0.707208 0.73193
+0.755717 0.778549 0.800397 0.821233 0.841031 0.859765 0.877397 0.893919
+0.90931 0.92355 0.936612 0.948484 0.959155 0.968611 0.976834 0.983809
+0.989538 0.994014 0.99723 0.999183 0.999863 0.999269 0.997409 0.994271
+0.989869 0.984214 0.977311 0.969169 0.9598 0.949213 0.937421 0.924428
+0.910249 0.894918 0.878454 0.860876 0.842208 0.822474 0.801697 0.779905
+0.757117 0.733354 0.708664 0.683077 0.656626 0.629344 0.601267 0.572429
+0.542867 0.51261 0.481706 0.450188 0.418101 0.385488 0.352389 0.318847
+0.284904 0.250601 0.215982 0.181093 0.145978 0.110682 0.0752484 0.0397247
+0.00415518 -0.031415 -0.0669402 -0.102375 -0.137674 -0.172794 -0.20769
+-0.242316 -0.276627 -0.310582 -0.344138 -0.377245 -0.409869 -0.441966
+-0.473498 -0.504424 -0.534705 -0.564303 -0.593172 -0.621279 -0.648586
+-0.675065 -0.700683 -0.725408 -0.749207 -0.772052 -0.793914 -0.814766
+-0.834558 -0.853283 -0.870922 -0.887453 -0.902855 -0.917109 -0.930197
+-0.942104 -0.952809 -0.962292 -0.970546 -0.977561 -0.983335 -0.987862
+-0.991135 -0.993152 -0.99391 -0.993397 -0.99162 -0.988587 -0.984299
+-0.978755 -0.971972 -0.963961 -0.954731 -0.944293 -0.932647 -0.919824
+-0.90584 -0.890714 -0.874464 -0.8571 -0.838657 -0.819158 -0.798622
+-0.777075 -0.754552 -0.731083 -0.706696 -0.681424 -0.655299 -0.628346
+-0.600607 -0.572109 -0.542898 -0.513012 -0.482489 -0.451369 -0.41969
+-0.387493 -0.354819 -0.321706 -0.288194 -0.254333 -0.220167 -0.185738
+-0.15109 -0.116267 -0.0813132 -0.0462729 -0.0111902 0.0238894 0.0589203
+0.0938583 0.128659 0.163279 0.197674 0.231801 0.265617 0.299075 0.332135
+0.364757 0.396893 0.428509 0.459564 0.49002 0.519838 0.548977 0.577398
+0.605072 0.631963 0.658038 0.683256 0.707592 0.731017 0.753502 0.775008
+0.795516 0.815004 0.833447 0.850823 0.867111 0.882283 0.896322 0.909214
+0.920933 0.931476 0.940833 0.948992 0.955943 0.961679 0.966192 0.969475
+0.971508 0.9723 0.971861 0.970191 0.967293 0.963171 0.957832 0.951284
+0.943534 0.93458 0.924433 0.913123 0.900664 0.887073 0.872369 0.85657
+0.839697 0.821769 0.802803 0.782834 0.76188 0.739974 0.717148 0.693432
+0.668855 0.643449 0.617241 0.590268;
+#A 2000 0.562569 0.534179 0.505131 0.475464 0.445218 0.414432 0.383146
+0.351395 0.319225 0.286678 0.253795 0.220617 0.187187 0.153547 0.11974
+0.0858104 0.0518008 0.0177557 -0.0162819 -0.050269 -0.0841625 -0.11792
+-0.151498 -0.184853 -0.21794 -0.25072 -0.283152 -0.315195 -0.346809
+-0.377955 -0.408594 -0.438686 -0.468194 -0.497069 -0.525285 -0.552808
+-0.579604 -0.605639 -0.630883 -0.655303 -0.678869 -0.701545 -0.723305
+-0.744122 -0.76397 -0.78283 -0.800679 -0.817496 -0.83326 -0.847953
+-0.861542 -0.874025 -0.885388 -0.895614 -0.904685 -0.9126 -0.919351
+-0.92493 -0.929325 -0.932528 -0.934546 -0.935378 -0.935023 -0.933485
+-0.930751 -0.926842 -0.921762 -0.915508 -0.908097 -0.899544 -0.889861
+-0.879061 -0.867159 -0.854172 -0.840107 -0.824989 -0.80883 -0.791666
+-0.773519 -0.754413 -0.734372 -0.713425 -0.691598 -0.66892 -0.645408
+-0.621098 -0.59603 -0.570238 -0.543754 -0.516612 -0.488849 -0.4605
+-0.431601 -0.402182 -0.372289 -0.341957 -0.31123 -0.280146 -0.248747
+-0.217071 -0.18516 -0.153053 -0.120791 -0.0884167 -0.0559714 -0.0234961
+0.00896693 0.0413766 0.073692 0.105872 0.137875 0.169661 0.20119 0.232422
+0.263319 0.293838 0.323943 0.353598 0.382764 0.411399 0.439474 0.466954
+0.493805 0.519994 0.545488 0.570252 0.594255 0.617466 0.639858 0.661406
+0.682086 0.701873 0.720742 0.738672 0.75564 0.771624 0.786587 0.80053
+0.813438 0.825296 0.836091 0.845811 0.854445 0.861984 0.868415 0.873725
+0.877908 0.880971 0.882914 0.883734 0.883434 0.882015 0.87948 0.875824
+0.871059 0.865197 0.858238 0.8502 0.841096 0.830941 0.819748 0.807533
+0.794301 0.780082 0.764898 0.748768 0.731709 0.713745 0.694905 0.675215
+0.654695 0.633373 0.611282 0.588453 0.564915 0.5407 0.515836 0.490354
+0.464293 0.43768 0.410556 0.382956 0.354918 0.326477 0.29767 0.268534
+0.239107 0.209421 0.179519 0.149441 0.119226 0.0889116 0.0585373 0.0281413
+-0.00223789 -0.0325618 -0.0627914 -0.092887 -0.122811 -0.152526 -0.181994
+-0.211179 -0.240045 -0.268555 -0.296673;
+#X coords 0 1 2204 -1 200 140 1;
+#X restore 290 149 graph;
+#X obj 196 382 metro 200;
+#X obj 196 364 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 33 382 *~;
+#X obj 49 364 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 524 21 pddp/dsp;
+#X obj 8 10 cnv 15 400 40 empty empty amplitude_modulation 20 12 0
+24 -228992 -66577 0;
+#X text 67 363 hear it;
+#X text 214 362 see it;
+#X obj 56 309 *~;
+#X obj 23 126 comment 200 12 Helvetica ? 0 0 0 0 The core pitch is
+generated by the "carrier frequency".;
+#X obj 16 63 comment 400 12 Helvetica ? 0 0 0 0 When you "modulate"
+the amplitude of a waveform using another waveform \, this is called
+AM synthesis. AM stands for Amplitude Modulation.;
+#X obj 36 159 hsl 150 20 50 500 0 1 empty empty carrier_frequency 10
+10 1 12 -262131 -1 -1 6622 0;
+#X obj 78 258 hsl 150 20 1 50 0 1 empty empty modulating_frequency
+10 10 1 12 -228992 -1 -1 2737 0;
+#X obj 73 287 osc~;
+#X obj 73 184 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 1 14
+-195568 -1 -1 249.993 256;
+#X obj 113 288 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 1 14
+-195568 -1 -1 10.0009 256;
+#X obj 34 187 osc~;
+#X obj 59 226 comment 200 12 Helvetica ? 0 0 0 0 The "modulating frequency"
+changes the quality of the sound.;
+#X obj 196 406 tabwrite~ \$0-wavetable;
+#X connect 2 0 20 0;
+#X connect 3 0 2 0;
+#X connect 4 0 0 0;
+#X connect 4 0 0 1;
+#X connect 5 0 4 1;
+#X connect 10 0 4 0;
+#X connect 10 0 20 0;
+#X connect 13 0 16 0;
+#X connect 13 0 18 0;
+#X connect 14 0 15 0;
+#X connect 14 0 17 0;
+#X connect 15 0 10 1;
+#X connect 18 0 10 0;
diff --git a/doc/tutorials/sound/building_waveforms_with_sines.pd b/doc/tutorials/sound/building_waveforms_with_sines.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d2e4b2a3977b2567438ef2de321243e25f7cd684
--- /dev/null
+++ b/doc/tutorials/sound/building_waveforms_with_sines.pd
@@ -0,0 +1,95 @@
+#N canvas 26 211 652 472 10;
+#X obj 541 21 pddp/dsp;
+#X obj 11 8 cnv 15 450 40 empty empty building_waveforms_with_sines
+20 12 0 24 -228992 -66577 0;
+#X obj 467 373 output~;
+#X obj 32 219 sixteen_harmonics wavetable;
+#X obj 522 238 random 64;
+#X obj 522 262 + 32;
+#X obj 522 285 mtof;
+#X msg 408 190 bang;
+#X obj 479 336 *~;
+#X obj 522 309 tabosc4~ wavetable;
+#X obj 440 105 cnv 15 100 60 empty empty empty 20 12 0 14 -241291 -66577
+0;
+#X obj 446 125 vsl 10 32 0 1 0 1 \$0-a \$0-a a 0 -8 0 8 -262144 -1
+-1 1900 0;
+#X obj 459 125 vsl 10 32 0 1 0 1 \$0-d \$0-d d 0 -8 0 8 -262144 -1
+-1 2700 0;
+#X obj 472 125 vsl 10 32 0 1 0 1 \$0-s \$0-s s 0 -8 0 8 -262144 -1
+-1 1000 0;
+#X obj 485 125 vsl 10 32 0 1 0 1 \$0-r \$0-r r 0 -8 0 8 -262144 -1
+-1 1500 0;
+#N canvas 95 141 435 501 env 0;
+#X obj 29 5 inlet;
+#X obj 29 457 outlet~;
+#X obj 29 423 vline~;
+#X msg 29 203 0 \, 1 \$1;
+#X msg 224 375 0 \$1;
+#X obj 254 307 * 500;
+#X obj 59 71 * 500;
+#X obj 100 253 pack;
+#X obj 224 240 random 1000;
+#X msg 100 274 \$2 \$1;
+#X obj 129 148 * 500;
+#X obj 100 189 max 10;
+#X obj 29 114 max 10;
+#X obj 224 352 max 10;
+#X obj 29 25 bang;
+#X obj 129 126 receive \$0-d;
+#X obj 59 50 receive \$0-a;
+#X obj 223 218 delay;
+#X obj 254 287 receive \$0-r;
+#X obj 224 331 float;
+#X obj 224 261 delay;
+#X obj 29 92 float;
+#X obj 46 139 delay;
+#X obj 100 170 float;
+#X obj 122 231 receive \$0-s;
+#X connect 0 0 14 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 4 0 2 0;
+#X connect 5 0 19 1;
+#X connect 6 0 21 1;
+#X connect 7 0 9 0;
+#X connect 8 0 20 0;
+#X connect 9 0 2 0;
+#X connect 10 0 23 1;
+#X connect 11 0 7 0;
+#X connect 11 0 17 0;
+#X connect 12 0 3 0;
+#X connect 12 0 22 0;
+#X connect 13 0 4 0;
+#X connect 14 0 21 0;
+#X connect 15 0 10 0;
+#X connect 16 0 6 0;
+#X connect 17 0 8 0;
+#X connect 18 0 5 0;
+#X connect 19 0 13 0;
+#X connect 20 0 19 0;
+#X connect 21 0 12 0;
+#X connect 22 0 23 0;
+#X connect 23 0 11 0;
+#X connect 24 0 7 1;
+#X restore 407 273 pd env;
+#X text 18 145 To start with \, we have something close to a square
+wave;
+#X text 15 62 Any waveform can be contructed using sine waves. This
+patch allows you to construct a waveform using harmonics.;
+#X obj 408 213 trigger bang bang;
+#X text 7 373 You can make a triangle wave by setting each harmonic
+to an amplitude that is the inverse of the harmonic number. That means
+for harmonic 2 \, set the slider to an amplitude of 1/2 \, or halfway
+in the middle. For harmonic 3 \, set it at 1/3 \, harmonic 4 \, set
+to 1/4 \, and so on...;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 9 0;
+#X connect 7 0 18 0;
+#X connect 8 0 2 0;
+#X connect 8 0 2 1;
+#X connect 9 0 8 1;
+#X connect 15 0 8 0;
+#X connect 18 0 15 0;
+#X connect 18 1 4 0;
diff --git a/doc/tutorials/sound/crossfade.pd b/doc/tutorials/sound/crossfade.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b71961ca136f16b8b5af26b0557fbe8af203bc17
--- /dev/null
+++ b/doc/tutorials/sound/crossfade.pd
@@ -0,0 +1,355 @@
+#N canvas 371 74 517 476 10;
+#X obj 128 95 hsl 200 20 0 1 0 0 empty empty crossfade 20 10 0 14 -257472
+-1 -1 0 1;
+#X obj 148 208 *~;
+#X obj 45 153 -;
+#X obj 45 208 *~;
+#X obj 54 418 dac~;
+#X obj 228 190 vsl 15 128 0 1 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 0 1;
+#X obj 18 189 vsl 15 128 0 1 0 0 empty empty empty 0 -8 0 8 -262144
+-1 -1 12700 1;
+#X obj 106 241 +~;
+#N canvas 0 22 450 300 graph1 0;
+#X array crossout 2205 float 1;
+#A 0 -0.998831 -0.99545 -0.989874 -0.982115 -0.972188 -0.960117 -0.945917
+-0.929617 -0.911267 -0.890907 -0.868582 -0.84434 -0.818223 -0.790293
+-0.76062 -0.729268 -0.696308 -0.661812 -0.625845 -0.588492 -0.549841
+-0.509977 -0.468988 -0.426964 -0.38399 -0.340167 -0.295594 -0.250369
+-0.204591 -0.158361 -0.111779 -0.0649502 -0.0179786 0.0290327 0.0759802
+0.122761 0.169268 0.215401 0.261058 0.306139 0.350545 0.394179 0.436934
+0.478723 0.519456 0.559044 0.597398 0.634435 0.670057 0.7042 0.736789
+0.767753 0.797023 0.824535 0.850208 0.874005 0.895874 0.915767 0.933639
+0.94945 0.963145 0.974715 0.984135 0.991384 0.996446 0.999305 0.99994
+0.998369 0.994596 0.988629 0.980481 0.970163 0.957688 0.9431 0.926431
+0.90772 0.887005 0.864326 0.839726 0.813274 0.785028 0.75505 0.723407
+0.690159 0.655379 0.619155 0.581564 0.54269 0.502619 0.461432 0.419222
+0.376087 0.332123 0.287427 0.242095 0.196226 0.149922 0.103288 0.0564262
+0.00943983 -0.0375681 -0.0844928 -0.13123 -0.177677 -0.223732 -0.269293
+-0.314262 -0.358531 -0.402007 -0.444595 -0.486203 -0.526738 -0.566112
+-0.604226 -0.641003 -0.676366 -0.710237 -0.742541 -0.773208 -0.802152
+-0.829324 -0.854666 -0.878122 -0.899642 -0.919177 -0.936664 -0.952082
+-0.965399 -0.976588 -0.985621 -0.992481 -0.997127 -0.999572 -0.999813
+-0.997848 -0.993682 -0.987322 -0.978761 -0.968041 -0.955185 -0.940223
+-0.923186 -0.904109 -0.883019 -0.85998 -0.835045 -0.808268 -0.779707
+-0.749422 -0.717469 -0.683933 -0.64889 -0.612414 -0.574588 -0.535489
+-0.495199 -0.453818 -0.411436 -0.368146 -0.324044 -0.279223 -0.233782
+-0.187826 -0.141456 -0.0947734 -0.0478815 -0.000882905 0.0461173 0.0930151
+0.139707 0.186092 0.232066 0.277526 0.32237 0.366502 0.409826 0.452246
+0.493668 0.533995 0.573138 0.611016 0.647546 0.682647 0.716244 0.748248
+0.778595 0.807225 0.834073 0.859082 0.882196 0.903348 0.9225 0.939618
+0.954663 0.967601 0.978406 0.987033 0.993477 0.997729 0.99978 0.999627
+0.997268 0.992688 0.985915 0.976967 0.965864 0.95263 0.937294 0.919869
+0.900413 0.878971 0.855591 0.830323 0.803222 0.774329 0.743729 0.711489
+0.677679 0.642374 0.60565 0.567576 0.52825 0.48776 0.446193 0.403642
+0.360198 0.315951 0.271009 0.225469 0.179432 0.132998 0.0862698 0.0393496
+-0.00765668 -0.0546458 -0.101514 -0.14816 -0.194478 -0.240363 -0.285717
+-0.330441 -0.374436 -0.417605 -0.45985 -0.501073 -0.54119 -0.580113
+-0.617756 -0.654037 -0.688868 -0.72217 -0.753878 -0.783923 -0.812239
+-0.838764 -0.863427 -0.886175 -0.906968 -0.92576 -0.94251 -0.957182
+-0.969727 -0.980123 -0.988357 -0.994411 -0.998271 -0.999929 -0.999364
+-0.996587 -0.991611 -0.984448 -0.975112 -0.963626 -0.949996 -0.934265
+-0.916472 -0.896658 -0.874866 -0.851143 -0.825526 -0.798083 -0.768881
+-0.737983 -0.705456 -0.671372 -0.635793 -0.59881 -0.560506 -0.520965
+-0.480276 -0.438525 -0.395797 -0.352197 -0.307819 -0.262763 -0.217126
+-0.17101 -0.124512 -0.0777405 -0.0307977 0.016213 0.0631884 0.110025
+0.156616 0.202861 0.248659 0.293907 0.338508 0.382361 0.425363 0.467426
+0.508457 0.548367 0.587067 0.624469 0.660482 0.695037 0.728059 0.759475
+0.789215 0.817209 0.843386 0.867702 0.890104 0.910542 0.928972 0.945344
+0.959615 0.97177 0.981781 0.989626 0.995288 0.998743 0.999981 0.999014
+0.995844 0.990476 0.982924 0.97319 0.961297 0.947285 0.931182 0.913026
+0.892855 0.870701 0.846618 0.820667 0.792907 0.763397 0.732202 0.69938
+0.665009 0.629172 0.591948 0.553417 0.513664 0.472769 0.430828 0.387937
+0.344191 0.299685 0.254517 0.208783 0.162587 0.116034 0.0692239 0.0222613
+-0.0247513 -0.0717087 -0.118507 -0.165044 -0.211216 -0.256923 -0.302064
+-0.346531 -0.390232 -0.433073 -0.474958 -0.515796 -0.555496 -0.593957
+-0.631108 -0.666865 -0.701152 -0.733893 -0.765013 -0.794428 -0.82209
+-0.847939 -0.871917 -0.893972 -0.91405 -0.932094 -0.948081 -0.961977
+-0.973751 -0.983377 -0.990827 -0.996073 -0.999122 -0.999966 -0.998605
+-0.995041 -0.989273 -0.981306 -0.971175 -0.958902 -0.944513 -0.928041
+-0.909512 -0.888962 -0.866452 -0.842031 -0.815753 -0.787674 -0.757848
+-0.726341 -0.693231 -0.658593 -0.622502 -0.585037 -0.546273 -0.506298
+-0.465207 -0.423089 -0.380039 -0.336149 -0.291512 -0.24623 -0.200405
+-0.154138 -0.107531 -0.0606859 -0.0137056 0.0333043 0.0802403 0.126999
+0.173478 0.219575 0.265184 0.310205 0.354542 0.398096 0.440773 0.482478
+0.523108 0.562582 0.600815 0.637722 0.673222 0.707239 0.739678 0.770484
+0.79959 0.826932 0.85245 0.876088 0.897772 0.917474 0.935153 0.950768
+0.964287 0.975677 0.984891 0.991933 0.996787 0.999441 0.999892 0.998133
+0.994151 0.987976 0.979622 0.969106 0.956453 0.941685 0.92482 0.905916
+0.885014 0.862159 0.837402 0.810792 0.782378 0.752239 0.720441 0.687053
+0.65215 0.615802 0.578085 0.539094 0.498913 0.457632 0.415341 0.372129
+0.328091 0.283329 0.237943 0.192032 0.145697 0.0990375 0.0521591 0.00516627
+-0.0418378 -0.0887497 -0.135467 -0.181883 -0.227896 -0.273405 -0.318311
+-0.362516 -0.405921 -0.448424 -0.489934 -0.530362 -0.569621 -0.607623
+-0.644285 -0.679515 -0.71324 -0.745391 -0.775898 -0.804694 -0.831715
+-0.856885 -0.88016 -0.901493 -0.920837 -0.93815 -0.953394 -0.966514
+-0.977498 -0.986326 -0.992978 -0.99744 -0.999702 -0.999734 -0.99756
+-0.993185 -0.986619 -0.977877 -0.966977 -0.95392 -0.938758 -0.921526
+-0.902262 -0.881006 -0.857806 -0.832693 -0.805743 -0.777016 -0.746576
+-0.714488 -0.68082 -0.645637 -0.609029 -0.571079 -0.531868 -0.491484
+-0.450013 -0.40754 -0.364168 -0.319994 -0.275114 -0.229626 -0.183629
+-0.137225 -0.0905179 -0.0436118 0.00339065 0.0503862 0.0972706 0.143939
+0.190288 0.236218 0.281627 0.326415 0.37048 0.413722 0.456051 0.497374
+0.5376 0.57664 0.614401 0.650799 0.68576 0.719209 0.751072 0.781278
+0.809749 0.836426 0.861256 0.884187 0.905168 0.924152 0.941082 0.955928
+0.968665 0.979265 0.987705 0.993967 0.998017 0.999859 0.999496 0.996928
+0.992161 0.985205 0.976056 0.964749 0.951314 0.935781 0.918183 0.898559
+0.876934 0.853371 0.827926 0.800655 0.771618 0.740878 0.708486 0.67453
+0.639087 0.602234 0.564053 0.524626 0.484028 0.442364 0.399724 0.356202
+0.311895 0.266897 0.221305 0.175226 0.12876 0.0820103 0.0350791 -0.0119302
+-0.0589129 -0.105765 -0.152383 -0.198665 -0.24451 -0.289814 -0.334473
+-0.378394 -0.42148 -0.463636 -0.504769 -0.544786 -0.583591 -0.621109
+-0.657256 -0.691953 -0.725124 -0.756689 -0.786573 -0.814721 -0.841072
+-0.865568 -0.888154 -0.908772 -0.927372 -0.943925 -0.958397 -0.970755
+-0.980971 -0.98901 -0.994856 -0.998507 -0.999955 -0.999198 -0.996236
+-0.991062 -0.983691 -0.974151 -0.962461 -0.948649 -0.932743 -0.914764
+-0.89476 -0.872782 -0.848879 -0.823103 -0.795512 -0.76615 -0.735093
+-0.702415 -0.668188 -0.632487 -0.59539 -0.556967 -0.517313 -0.476519
+-0.434673 -0.391869 -0.348199 -0.303753 -0.258637 -0.212951 -0.166795
+-0.120271 -0.0734803 -0.0265261 0.0204859 0.0674523 0.11427 0.160836
+0.207048 0.252798 0.297989 0.342523 0.386301 0.429228 0.471207 0.512136
+0.551934 0.590515 0.627793 0.663687 0.698114 0.730987 0.762246 0.791824
+0.819655 0.845678 0.869831 0.892048 0.912298 0.930534 0.946718 0.960814
+0.972783 0.982589 0.990227 0.995681 0.998938 0.999992 0.998831 0.995451
+0.989875 0.982116 0.97219 0.960119 0.945919 0.92962 0.91127 0.890911
+0.868585 0.844344 0.818228 0.790298 0.760625 0.729275 0.696315 0.661819
+0.625852 0.588499 0.549849 0.509985 0.468997 0.426973 0.383999 0.340176
+0.295603 0.250378 0.204601 0.158371 0.111789 0.06496 0.0179884 -0.0290229
+-0.0759704 -0.122751 -0.169259 -0.215391 -0.261049 -0.30613 -0.350536
+-0.39417 -0.436925 -0.478715 -0.519448 -0.559035 -0.59739 -0.634427
+-0.67005 -0.704193 -0.736782 -0.767746 -0.797017 -0.824529 -0.850203
+-0.874 -0.895869 -0.915763 -0.933636 -0.949447 -0.963142 -0.974713
+-0.984133 -0.991383 -0.996445 -0.999305 -0.99994 -0.998369 -0.994596
+-0.988628 -0.98048 -0.970162 -0.957686 -0.943098 -0.92643 -0.907717
+-0.887003 -0.864323 -0.839723 -0.81327 -0.785024 -0.755046 -0.723402
+-0.690154 -0.655374 -0.619149 -0.581558 -0.542684 -0.502612 -0.461425
+-0.419215 -0.37608 -0.332116 -0.287419 -0.242088 -0.196218 -0.149915
+-0.10328 -0.0564187 -0.0094323 0.0375756 0.0845003 0.131237 0.177684
+0.223739 0.269301 0.314269 0.358538 0.402014 0.444602 0.486209 0.526744
+0.566118 0.604232 0.641009 0.676371 0.710242 0.742546 0.773212 0.802157
+0.829328 0.85467 0.878126 0.899645 0.91918 0.936666 0.952084 0.965401
+0.976589 0.985623 0.992482 0.997127 0.999572 0.999813 0.997848 0.993683
+0.987323 0.978762 0.968042 0.955187 0.940225 0.923189 0.904113 0.883022
+0.859984 0.83505 0.808273 0.779712 0.749428 0.717475 0.68394 0.648897
+0.612422 0.574596 0.535497 0.495208 0.453827 0.411445 0.368155 0.324053
+0.279232 0.233791 0.187835 0.141465 0.0947832 0.0478913 0.000892714
+-0.0461075 -0.0930053 -0.139698 -0.186082 -0.232057 -0.277517 -0.322361
+-0.366493 -0.409817 -0.452237 -0.49366 -0.533987 -0.57313 -0.611008
+-0.647538 -0.68264 -0.716237 -0.748242 -0.778589 -0.807219 -0.834068
+-0.859077 -0.882191 -0.903344 -0.922497 -0.939615 -0.95466 -0.967599
+-0.978404 -0.987031 -0.993475 -0.997728 -0.99978 -0.999627 -0.997268
+-0.992688 -0.985914 -0.976966 -0.965862 -0.952628 -0.937293 -0.919867
+-0.900411 -0.878969 -0.855588 -0.830319 -0.803218 -0.774325 -0.743725
+-0.711484 -0.677674 -0.642369 -0.605644 -0.56757 -0.528244 -0.487753
+-0.446186 -0.403635 -0.360191 -0.315944 -0.271002 -0.225462 -0.179424
+-0.132991 -0.0862623 -0.0393421 0.00766421 0.0546533 0.101522 0.148167
+0.194485 0.24037 0.285724 0.330448 0.374443 0.417612 0.459857 0.501079
+0.541196 0.580119 0.617762 0.654043 0.688874 0.722175 0.753883 0.783928
+0.812244 0.838768 0.863431 0.886179 0.906971 0.925763 0.942513 0.957184
+0.969729 0.980125 0.988358 0.994412;
+#A 1000 0.998271 0.999929 0.999365 0.996587 0.991612 0.984449 0.975114
+0.963628 0.949998 0.934267 0.916475 0.896661 0.87487 0.851148 0.82553
+0.798089 0.768887 0.737988 0.705462 0.671379 0.6358 0.598817 0.560514
+0.520974 0.480284 0.438534 0.395806 0.352206 0.307828 0.262772 0.217136
+0.17102 0.124522 0.0777502 0.0308075 -0.0162032 -0.0631786 -0.110015
+-0.156607 -0.202852 -0.248649 -0.293898 -0.338499 -0.382352 -0.425354
+-0.467417 -0.508448 -0.548358 -0.587059 -0.624462 -0.660475 -0.69503
+-0.728052 -0.759468 -0.789209 -0.817204 -0.843381 -0.867697 -0.890099
+-0.910538 -0.928968 -0.94534 -0.959612 -0.971768 -0.981779 -0.989625
+-0.995287 -0.998743 -0.999981 -0.999014 -0.995843 -0.990476 -0.982923
+-0.973189 -0.961296 -0.947283 -0.931181 -0.913024 -0.892853 -0.870699
+-0.846615 -0.820664 -0.792903 -0.763393 -0.732198 -0.699375 -0.665004
+-0.629167 -0.591942 -0.553411 -0.513658 -0.472762 -0.430821 -0.387931
+-0.344184 -0.299678 -0.25451 -0.208775 -0.16258 -0.116026 -0.0692164
+-0.0222538 0.0247588 0.0717162 0.118515 0.165051 0.211223 0.25693 0.302071
+0.346538 0.390239 0.43308 0.474965 0.515802 0.555502 0.593963 0.631113
+0.666871 0.701158 0.733898 0.765018 0.794432 0.822094 0.847943 0.87192
+0.893975 0.914053 0.932097 0.948084 0.961979 0.973753 0.983378 0.990828
+0.996074 0.999122 0.999966 0.998605 0.995041 0.989274 0.981308 0.971177
+0.958904 0.944516 0.928044 0.909515 0.888966 0.866456 0.842036 0.815757
+0.787679 0.757854 0.726347 0.693238 0.6586 0.622509 0.585045 0.546281
+0.506306 0.465215 0.423098 0.380048 0.336158 0.291521 0.246239 0.200414
+0.154148 0.107541 0.0606956 0.0137155 -0.0332945 -0.0802305 -0.126989
+-0.173468 -0.219566 -0.265174 -0.310196 -0.354533 -0.398087 -0.440764
+-0.482469 -0.5231 -0.562574 -0.600807 -0.637714 -0.673215 -0.707232
+-0.739672 -0.770478 -0.799584 -0.826926 -0.852445 -0.876084 -0.897767
+-0.91747 -0.935149 -0.950765 -0.964284 -0.975675 -0.98489 -0.991932
+-0.996786 -0.999441 -0.999892 -0.998133 -0.994151 -0.987975 -0.979621
+-0.969105 -0.956452 -0.941683 -0.924818 -0.905914 -0.885011 -0.862156
+-0.837399 -0.810788 -0.782374 -0.752235 -0.720436 -0.687048 -0.652145
+-0.615796 -0.578079 -0.539087 -0.498907 -0.457626 -0.415334 -0.372122
+-0.328084 -0.283322 -0.237936 -0.192025 -0.145689 -0.09903 -0.0521516
+-0.00515874 0.0418453 0.0887572 0.135474 0.18189 0.227903 0.273412
+0.318319 0.362523 0.405928 0.448431 0.48994 0.530369 0.569627 0.607629
+0.644291 0.67952 0.713245 0.745396 0.775903 0.804699 0.83172 0.856889
+0.880163 0.901496 0.92084 0.938153 0.953396 0.966516 0.9775 0.986327
+0.992979 0.997441 0.999702 0.999734 0.99756 0.993186 0.98662 0.977878
+0.966979 0.953922 0.938761 0.921529 0.902265 0.88101 0.85781 0.832697
+0.805748 0.777022 0.746581 0.714494 0.680827 0.645644 0.609037 0.571087
+0.531877 0.491493 0.450021 0.407549 0.364177 0.320003 0.275123 0.229635
+0.183639 0.137234 0.0905276 0.0436216 -0.00338085 -0.0503764 -0.0972608
+-0.143929 -0.190279 -0.236209 -0.281618 -0.326406 -0.370471 -0.413713
+-0.456042 -0.497365 -0.537591 -0.576632 -0.614393 -0.650791 -0.685753
+-0.719203 -0.751065 -0.781272 -0.809744 -0.83642 -0.861251 -0.884183
+-0.905164 -0.924148 -0.941079 -0.955925 -0.968663 -0.979263 -0.987704
+-0.993966 -0.998016 -0.999859 -0.999496 -0.996928 -0.99216 -0.985204
+-0.976055 -0.964748 -0.951313 -0.935779 -0.918181 -0.898557 -0.876931
+-0.853368 -0.827923 -0.800652 -0.771614 -0.740873 -0.708481 -0.674525
+-0.639082 -0.602228 -0.564046 -0.524619 -0.484022 -0.442357 -0.399717
+-0.356195 -0.311887 -0.26689 -0.221298 -0.175218 -0.128753 -0.0820028
+-0.0350716 0.0119378 0.0589204 0.105772 0.152391 0.198673 0.244517
+0.289821 0.33448 0.378401 0.421486 0.463642 0.504776 0.544792 0.583598
+0.621115 0.657261 0.691958 0.72513 0.756694 0.786578 0.814726 0.841076
+0.865572 0.888158 0.908775 0.927374 0.943928 0.958399 0.970756 0.980972
+0.989011 0.994857 0.998507 0.999955 0.999198 0.996237 0.991063 0.983692
+0.974152 0.962463 0.948651 0.932746 0.914767 0.894763 0.872786 0.848883
+0.823108 0.795517 0.766155 0.735099 0.702422 0.668195 0.632494 0.595398
+0.556975 0.517322 0.476528 0.434682 0.391878 0.348208 0.303762 0.258646
+0.21296 0.166805 0.12028 0.0734901 0.0265359 -0.0204761 -0.0674425
+-0.11426 -0.160826 -0.207038 -0.252788 -0.29798 -0.342514 -0.386292
+-0.429219 -0.471198 -0.512127 -0.551926 -0.590507 -0.627786 -0.66368
+-0.698107 -0.73098 -0.76224 -0.791818 -0.819649 -0.845673 -0.869826
+-0.892044 -0.912294 -0.930531 -0.946715 -0.960811 -0.97278 -0.982587
+-0.990226 -0.99568 -0.998938 -0.999992 -0.998831 -0.995451 -0.989875
+-0.982115 -0.972189 -0.960118 -0.945918 -0.929618 -0.911268 -0.890908
+-0.868583 -0.844341 -0.818225 -0.790294 -0.760621 -0.72927 -0.69631
+-0.661814 -0.625847 -0.588494 -0.549843 -0.509979 -0.46899 -0.426966
+-0.383992 -0.340169 -0.295596 -0.250371 -0.204593 -0.158364 -0.111781
+-0.0649525 -0.0179808 0.0290304 0.075978 0.122759 0.169266 0.215399
+0.261056 0.306137 0.350543 0.394177 0.436932 0.478721 0.519454 0.559042
+0.597396 0.634433 0.670055 0.704198 0.736787 0.767751 0.797022 0.824534
+0.850207 0.874004 0.895873 0.915766 0.933639 0.949449 0.963144 0.974715
+0.984135 0.991384 0.996446 0.999305 0.99994 0.998369 0.994596 0.988629
+0.980482 0.970164 0.957688 0.943101 0.926432 0.907721 0.887006 0.864327
+0.839727 0.813275 0.785029 0.755052 0.723408 0.690161 0.655381 0.619156
+0.581566 0.542692 0.502621 0.461434 0.419224 0.376089 0.332125 0.287429
+0.242097 0.196228 0.149924 0.10329 0.0564285 0.00944211 -0.0375658
+-0.0844906 -0.131228 -0.177675 -0.22373 -0.269291 -0.31426 -0.358529
+-0.402005 -0.444593 -0.486201 -0.526736 -0.56611 -0.604224 -0.641001
+-0.676364 -0.710235 -0.742539 -0.773206 -0.802151 -0.829323 -0.854665
+-0.878121 -0.899641 -0.919177 -0.936663 -0.952081 -0.965399 -0.976587
+-0.985621 -0.992481 -0.997126 -0.999572 -0.999813 -0.997848 -0.993682
+-0.987322 -0.978761 -0.968041 -0.955186 -0.940224 -0.923187 -0.90411
+-0.88302 -0.859981 -0.835046 -0.808269 -0.779709 -0.749424 -0.71747
+-0.683935 -0.648892 -0.612416 -0.57459 -0.535491 -0.495201 -0.45382
+-0.411438 -0.368148 -0.324046 -0.279225 -0.233784 -0.187828 -0.141458
+-0.0947757 -0.0478838 -0.000885181 0.046115 0.0930128 0.139705 0.18609
+0.232064 0.277524 0.322368 0.3665 0.409824 0.452244 0.493666 0.533993
+0.573136 0.611014 0.647544 0.682646 0.716242 0.748247 0.778594 0.807223
+0.834072 0.859081 0.882195 0.903347 0.9225 0.939617 0.954662 0.967601
+0.978405 0.987032 0.993476 0.997729 0.99978 0.999627 0.997269 0.992688
+0.985915 0.976967 0.965864 0.95263 0.937295 0.91987 0.900414 0.878972
+0.855592 0.830324 0.803223 0.774331 0.743731 0.711491 0.677681 0.642376
+0.605652 0.567578 0.528252 0.487762 0.446195 0.403644 0.3602 0.315954
+0.271011 0.225471 0.179434 0.133001 0.0862721 0.0393519 -0.00765441
+-0.0546435 -0.101512 -0.148157 -0.194475 -0.240361 -0.285715 -0.330439
+-0.374434 -0.417603 -0.459848 -0.501071 -0.541188 -0.580111 -0.617754
+-0.654035 -0.688867 -0.722168 -0.753877 -0.783922 -0.812238 -0.838762
+-0.863426 -0.886174 -0.906967 -0.925759 -0.94251 -0.957181 -0.969727
+-0.980123 -0.988357 -0.994411 -0.998271 -0.999929 -0.999364 -0.996587
+-0.991611 -0.984448 -0.975113 -0.963627 -0.949997 -0.934265 -0.916473
+-0.896659 -0.874867 -0.851145 -0.825527 -0.798085 -0.768883 -0.737984
+-0.705457 -0.671374 -0.635795 -0.598812 -0.560508 -0.520967 -0.480278
+-0.438528 -0.3958 -0.352199 -0.307821 -0.262765 -0.217129 -0.171012
+-0.124514 -0.0777427 -0.0308 0.0162107 0.0631861 0.110023 0.156614
+0.202859 0.248656 0.293905 0.338506 0.382359 0.425361 0.467424 0.508455
+0.548365 0.587065 0.624468 0.66048 0.695036 0.728057 0.759473 0.789214
+0.817208 0.843385 0.867701 0.890103 0.910541 0.928971 0.945343 0.959615
+0.971769 0.98178 0.989626 0.995288 0.998743 0.999981 0.999014 0.995844
+0.990477 0.982924 0.97319 0.961298 0.947285 0.931183 0.913027 0.892856
+0.870702 0.846619 0.820669 0.792908 0.763398 0.732204 0.699381 0.665011
+0.629174 0.591949 0.553419 0.513666 0.472771 0.43083 0.38794 0.344193
+0.299687 0.25452 0.208785 0.162589 0.116036 0.0692262 0.0222636 -0.024749
+-0.0717064 -0.118505 -0.165041 -0.211214 -0.256921 -0.302061 -0.346529
+-0.39023 -0.433071 -0.474956 -0.515794 -0.555494 -0.593955 -0.631106
+-0.666864 -0.701151 -0.733891 -0.765011 -0.794426 -0.822089 -0.847937
+-0.871916 -0.89397 -0.914049 -0.932093 -0.948081 -0.961977 -0.97375
+-0.983376 -0.990827 -0.996073 -0.999121 -0.999966 -0.998605 -0.995041
+-0.989273 -0.981307 -0.971176 -0.958903 -0.944514 -0.928042 -0.909512
+-0.888963 -0.866453 -0.842032 -0.815754 -0.787675 -0.75785 -0.726342
+-0.693233 -0.658595 -0.622504 -0.585039 -0.546275 -0.5063 -0.465209
+-0.423092 -0.380041 -0.336151 -0.291514 -0.246232 -0.200407 -0.15414
+-0.107533 -0.0606881 -0.0137079 0.033302 0.080238 0.126997 0.173476
+0.219573 0.265182 0.310203 0.35454 0.398094 0.440771 0.482476 0.523107
+0.56258 0.600813 0.63772 0.673221 0.707237 0.739677 0.770483 0.799589
+0.826931 0.852449 0.876087 0.897771 0.917473 0.935152 0.950768 0.964286
+0.975676 0.984891 0.991933 0.996786 0.999441 0.999892 0.998133 0.994151
+0.987976 0.979622 0.969107 0.956454 0.941685 0.924821 0.905917 0.885015
+0.86216 0.837403 0.810793 0.782379 0.752241 0.720442 0.687055 0.652152
+0.615803 0.578087 0.539096 0.498915 0.457634 0.415343 0.372131 0.328093
+0.283332 0.237945 0.192034 0.145699 0.0990398 0.0521614 0.00516855
+-0.0418355 -0.0887475 -0.135464 -0.181881 -0.227894 -0.273403 -0.318309
+-0.362514 -0.405919 -0.448422 -0.489932 -0.53036 -0.569619 -0.607621
+-0.644283 -0.679513 -0.713238 -0.74539 -0.775897 -0.804693 -0.831714
+-0.856884 -0.880159 -0.901492 -0.920836 -0.938149 -0.953393 -0.966513
+-0.977498;
+#A 2000 -0.986326 -0.992978 -0.99744 -0.999701 -0.999734 -0.99756 -0.993185
+-0.986619 -0.977877 -0.966978 -0.95392 -0.938759 -0.921527 -0.902263
+-0.881008 -0.857807 -0.832694 -0.805744 -0.777018 -0.746577 -0.714489
+-0.680822 -0.645638 -0.609031 -0.571081 -0.53187 -0.491486 -0.450015
+-0.407542 -0.36417 -0.319996 -0.275116 -0.229628 -0.183632 -0.137227
+-0.0905202 -0.0436141 0.00338838 0.0503839 0.0972683 0.143936 0.190286
+0.236216 0.281625 0.326413 0.370478 0.41372 0.456049 0.497372 0.537598
+0.576638 0.614399 0.650797 0.685759 0.719208 0.75107 0.781277 0.809748
+0.836424 0.861255 0.884186 0.905167 0.924151 0.941081 0.955927 0.968665
+0.979265 0.987705 0.993966 0.998017 0.999859 0.999496 0.996928 0.992161
+0.985205 0.976056 0.96475 0.951315 0.935781 0.918184 0.89856 0.876935
+0.853372 0.827928 0.800657 0.771619 0.740879 0.708487 0.674532 0.639089
+0.602236 0.564054 0.524628 0.48403 0.442366 0.399726 0.356205 0.311897
+0.266899 0.221307 0.175228 0.128762 0.0820125 0.0350814 -0.011928 -0.0589106
+-0.105763 -0.152381 -0.198663 -0.244508 -0.289812 -0.334471 -0.378392
+-0.421478 -0.463634 -0.504767 -0.544784 -0.58359 -0.621107 -0.657254
+-0.691951 -0.725123 -0.756688 -0.786572 -0.81472 -0.841071 -0.865567
+-0.888153 -0.908771 -0.927371 -0.943925 -0.958396 -0.970754 -0.98097
+-0.98901 -0.994856 -0.998507 -0.999955 -0.999198 -0.996236 -0.991062
+-0.983691 -0.974151 -0.962462 -0.948649 -0.932744 -0.914765 -0.894761
+-0.872783 -0.84888 -0.823105 -0.795513 -0.766151 -0.735095 -0.702417
+-0.66819 -0.632489 -0.595392 -0.556969 -0.517315 -0.476521 -0.434676
+-0.391871 -0.348201 -0.303755 -0.258639 -0.212953 -0.166797 -0.120273
+-0.0734826 -0.0265283 0.0204837 0.06745 0.114268 0.160834 0.207045
+0.252795 0.297987 0.342521 0.386299 0.429226 0.471205 0.512134 0.551933
+0.590513 0.627792 0.663685 0.698112 0.730985 0.762245 0.791822 0.819654
+0.845677 0.86983 0.892047 0.912297 0.930534 0.946718 0.960814 0.972782
+0.982588 0.990227 0.995681 0.998938 0.999992;
+#X coords 0 1 2204 -1 200 140 1;
+#X restore 290 189 graph;
+#X obj 167 417 tabwrite~ crossout;
+#X obj 167 360 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 189 383 metro 200;
+#X obj 190 360 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X msg 45 133 1 \$1;
+#X floatatom 18 325 5 0 0 0 - - -;
+#X floatatom 228 325 5 0 0 0 - - -;
+#X obj 66 368 *~;
+#X obj 82 350 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 434 21 pddp/dsp;
+#X obj 61 187 osc~ 330;
+#X obj 164 188 osc~ 220;
+#X obj 8 10 cnv 15 400 40 empty empty crossfade 20 12 0 24 -228992
+-66577 0;
+#X text 44 442 hear it;
+#X text 203 442 see it;
+#X text 21 61 crossfade between two sine waves;
+#X connect 0 0 1 0;
+#X connect 0 0 5 0;
+#X connect 0 0 13 0;
+#X connect 1 0 7 1;
+#X connect 2 0 3 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X connect 5 0 15 0;
+#X connect 6 0 14 0;
+#X connect 7 0 9 0;
+#X connect 7 0 16 0;
+#X connect 10 0 9 0;
+#X connect 11 0 9 0;
+#X connect 12 0 11 0;
+#X connect 13 0 2 0;
+#X connect 16 0 4 0;
+#X connect 16 0 4 1;
+#X connect 17 0 16 1;
+#X connect 19 0 3 1;
+#X connect 20 0 1 1;
diff --git a/doc/tutorials/sound/detecting_pitch.pd b/doc/tutorials/sound/detecting_pitch.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d77b721b3c5860245f537e2296cfa873211aee26
--- /dev/null
+++ b/doc/tutorials/sound/detecting_pitch.pd
@@ -0,0 +1,36 @@
+#N canvas 91 86 636 456 10;
+#X obj 541 21 pddp/dsp;
+#X obj 11 8 cnv 15 400 40 empty empty detecting_pitch 20 12 0 24 -228992
+-66577 0;
+#X obj 119 136 fiddle~;
+#X text 28 81 Now its time to be the fool and start singing into the
+mic!;
+#X obj 119 108 adc~;
+#X obj 133 183 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 152 183 <-- banged on attack;
+#X obj 163 157 - 100;
+#X obj 118 227 mtof;
+#X obj 126 371 output~;
+#X obj 149 340 *~;
+#X obj 118 247 osc~;
+#X obj 180 223 mavg 200;
+#X obj 164 246 -;
+#X obj 164 266 / 100;
+#X obj 164 319 line~;
+#X msg 164 298 \$1 50;
+#X connect 2 0 8 0;
+#X connect 2 1 5 0;
+#X connect 2 3 7 0;
+#X connect 4 0 2 0;
+#X connect 4 1 2 0;
+#X connect 7 0 12 0;
+#X connect 7 0 13 0;
+#X connect 8 0 11 0;
+#X connect 10 0 9 1;
+#X connect 11 0 10 0;
+#X connect 12 0 13 1;
+#X connect 13 0 14 0;
+#X connect 14 0 16 0;
+#X connect 15 0 10 1;
+#X connect 16 0 15 0;
diff --git a/doc/tutorials/sound/feedback_delay_network.pd b/doc/tutorials/sound/feedback_delay_network.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5a1aa1b415257064fe3bc8f6f1bfec999d4d3623
--- /dev/null
+++ b/doc/tutorials/sound/feedback_delay_network.pd
@@ -0,0 +1,63 @@
+#N canvas 319 233 653 482 10;
+#X obj 541 21 pddp/dsp;
+#X obj 10 7 cnv 15 400 40 empty empty feedback_delay_network 20 12
+0 24 -228992 -66577 0;
+#X obj 274 374 output~;
+#X obj 23 106 noise~;
+#X obj 23 165 *~;
+#X obj 39 146 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 273 342 fdn~ 64 40000;
+#X obj 53 187 +~;
+#X obj 98 146 readsf~;
+#X msg 128 123 open ../../sound/voice.wav \, 1;
+#X obj 128 105 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X msg 382 266 exponential 32 10 5000;
+#X msg 385 153 linear 8 75 100;
+#X msg 385 130 linear 32 50 2175;
+#X msg 384 313 exponential 8 50 175;
+#X msg 382 290 exponential 64 1000 10;
+#X obj 169 146 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 84 441 pddp/pddplink http://www-ccrma.stanford.edu/~jos/pasp/FDN_Reverberation.html
+;
+#X msg 97 123 0;
+#X obj 97 105 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X text 17 53 Feedback delay networks were originally introduced to
+Pd for creating reverberation. But they also have a lot of possibilities
+when you abuse them:;
+#X msg 231 264 reset;
+#X text 20 426 For more info \, click the link:;
+#X text 329 105 try clicking different parameters sets:;
+#X msg 385 177 linear 32 100 105;
+#X text 41 348 WATCH OUT! THIS GETS LOUD!;
+#X msg 384 200 linear 64 10 15;
+#X obj 23 126 lop~ 1000;
+#X msg 384 221 linear 8 1 5;
+#X msg 384 241 linear 64 4 5;
+#X connect 3 0 27 0;
+#X connect 4 0 7 0;
+#X connect 5 0 4 1;
+#X connect 6 0 2 0;
+#X connect 6 1 2 1;
+#X connect 7 0 6 0;
+#X connect 8 0 7 1;
+#X connect 8 1 16 0;
+#X connect 9 0 8 0;
+#X connect 10 0 9 0;
+#X connect 11 0 6 0;
+#X connect 12 0 6 0;
+#X connect 13 0 6 0;
+#X connect 14 0 6 0;
+#X connect 15 0 6 0;
+#X connect 16 0 9 0;
+#X connect 18 0 8 0;
+#X connect 19 0 18 0;
+#X connect 21 0 6 0;
+#X connect 24 0 6 0;
+#X connect 26 0 6 0;
+#X connect 27 0 4 0;
+#X connect 28 0 6 0;
+#X connect 29 0 6 0;
diff --git a/doc/tutorials/sound/ramping_up_and_down.pd b/doc/tutorials/sound/ramping_up_and_down.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e79bcdb07223c4927704dd1246f97d147fdfa00e
--- /dev/null
+++ b/doc/tutorials/sound/ramping_up_and_down.pd
@@ -0,0 +1,42 @@
+#N canvas 415 228 644 464 10;
+#X obj 541 21 pddp/dsp;
+#X obj 11 8 cnv 15 400 40 empty empty ramping_up_and_down 20 12 0 24
+-228992 -66577 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array \$0-line 44100 float 0;
+#X coords 0 1 44100 -1 200 140 1;
+#X restore 401 170 graph;
+#X text 403 136 this array shows one second:;
+#X obj 194 231 cnv 15 100 60 empty empty empty 20 12 0 14 -233017 -66577
+0;
+#X obj 191 369 output~;
+#X obj 226 253 line~;
+#X obj 84 323 tabwrite~ \$0-line;
+#X obj 84 207 trigger bang anything;
+#X obj 226 323 *~;
+#X obj 242 302 osc~ 250;
+#X msg 84 110 1 1000;
+#X msg 103 133 0 1000;
+#X msg 122 156 1 100;
+#X msg 141 179 0 100;
+#X text 159 109 ramp to 1 in 1 second;
+#X text 177 133 ramp to 0 in 1 second;
+#X text 197 155 ramp to 1 in 100 ms;
+#X text 215 179 ramp to 0 in 100 ms;
+#X text 13 54 The [line] and [line~] objects generate ramps. Ramps
+are useful when you want to have a smooth transition from one thing
+to another.;
+#X text 334 378 More on ramping:;
+#X obj 330 425 pddp/open ../../doc/3.audio.examples/A04.line2;
+#X obj 330 404 pddp/open ../../doc/3.audio.examples/A03.line;
+#X connect 6 0 7 0;
+#X connect 6 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 1 6 0;
+#X connect 9 0 5 1;
+#X connect 9 0 5 0;
+#X connect 10 0 9 1;
+#X connect 11 0 8 0;
+#X connect 12 0 8 0;
+#X connect 13 0 8 0;
+#X connect 14 0 8 0;
diff --git a/doc/tutorials/sound/sixteen_harmonics.pd b/doc/tutorials/sound/sixteen_harmonics.pd
new file mode 100644
index 0000000000000000000000000000000000000000..98177e3a12a3023467aeb676c569d60f5824f29a
--- /dev/null
+++ b/doc/tutorials/sound/sixteen_harmonics.pd
@@ -0,0 +1,126 @@
+#N canvas 246 22 845 483 10;
+#X obj 14 20 vsl 12 96 0 1 0 1 \$0-1 \$0-1 1 4 104 2 10 -262131 -123526
+-1 9500 0;
+#X obj 26 20 vsl 12 96 0 1 0 1 \$0-2 \$0-2 2 4 104 2 10 -225271 -42246
+-1 4800 0;
+#X obj 38 20 vsl 12 96 0 1 0 1 \$0-3 \$0-3 3 4 104 2 10 -225271 -42246
+-1 3300 0;
+#X obj 50 20 vsl 12 96 0 1 0 1 \$0-4 \$0-4 4 4 104 2 10 -225271 -42246
+-1 2000 0;
+#X obj 62 20 vsl 12 96 0 1 0 1 \$0-5 \$0-5 5 4 104 2 10 -225271 -42246
+-1 1300 0;
+#X obj 74 20 vsl 12 96 0 1 0 1 \$0-6 \$0-6 6 4 104 2 10 -225271 -42246
+-1 800 0;
+#X obj 86 20 vsl 12 96 0 1 0 1 \$0-7 \$0-7 7 4 104 2 10 -225271 -42246
+-1 600 0;
+#X obj 98 20 vsl 12 96 0 1 0 1 \$0-8 \$0-8 8 4 104 2 10 -225271 -42246
+-1 500 0;
+#X obj 110 20 vsl 12 96 0 1 0 1 \$0-9 \$0-9 9 4 104 2 10 -262131 -123526
+-1 400 0;
+#X obj 122 20 vsl 12 96 0 1 0 1 \$0-10 \$0-10 10 1 104 2 10 -225271
+-42246 -1 300 0;
+#X obj 134 20 vsl 12 96 0 1 0 1 \$0-11 \$0-11 11 1 104 2 10 -225271
+-42246 -1 200 0;
+#X obj 146 20 vsl 12 96 0 1 0 1 \$0-12 \$0-12 12 1 104 2 10 -225271
+-42246 -1 200 0;
+#X obj 158 20 vsl 12 96 0 1 0 1 \$0-13 \$0-13 13 1 104 2 10 -225271
+-42246 -1 100 0;
+#X obj 170 20 vsl 12 96 0 1 0 1 \$0-14 \$0-14 14 1 104 2 10 -225271
+-42246 -1 100 0;
+#X obj 182 20 vsl 12 96 0 1 0 1 \$0-15 \$0-15 15 1 104 2 10 -225271
+-42246 -1 100 0;
+#X obj 194 20 vsl 12 96 0 1 0 1 \$0-16 \$0-16 16 1 104 2 10 -225271
+-42246 -1 100 0;
+#X obj 214 18 cnv 15 150 106 empty empty empty 20 12 0 14 -260818 -66577
+0;
+#N canvas 0 22 450 300 graph3 0;
+#X array \$1 4099 float 0;
+#X coords 0 1 4098 -1 140 96 1;
+#X restore 219 23 graph;
+#X obj 17 180 r \$0-1;
+#X obj 66 179 r \$0-2;
+#X obj 115 178 r \$0-3;
+#X obj 163 178 r \$0-4;
+#X obj 210 178 r \$0-5;
+#X obj 258 178 r \$0-6;
+#X obj 307 178 r \$0-7;
+#X obj 355 178 r \$0-8;
+#X obj 404 178 r \$0-9;
+#X obj 451 178 r \$0-10;
+#X obj 506 178 r \$0-11;
+#X obj 561 178 r \$0-12;
+#X obj 615 178 r \$0-13;
+#X obj 668 178 r \$0-14;
+#X obj 721 178 r \$0-15;
+#X obj 774 178 r \$0-16;
+#X msg 231 413 \; \$1 sinesum 4096 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9
+\$10 \$11 \$12 \$13 \$14 \$15 \$16 \$17 \; \$1 normalize;
+#X obj 23 322 symbol \$1;
+#X obj 231 390 pack s f f f f f f f f f f f f f f f f;
+#X obj 17 201 t b f;
+#X obj 211 198 t b f;
+#X obj 404 198 t b f;
+#X obj 615 199 t b f;
+#X obj 66 200 t b f;
+#X obj 258 199 t b f;
+#X obj 451 198 t b f;
+#X obj 668 199 t b f;
+#X obj 115 199 t b f;
+#X obj 307 199 t b f;
+#X obj 506 198 t b f;
+#X obj 721 199 t b f;
+#X obj 163 198 t b f;
+#X obj 355 198 t b f;
+#X obj 561 197 t b f;
+#X obj 774 198 t b f;
+#X connect 18 0 37 0;
+#X connect 19 0 41 0;
+#X connect 20 0 45 0;
+#X connect 21 0 49 0;
+#X connect 22 0 38 0;
+#X connect 23 0 42 0;
+#X connect 24 0 46 0;
+#X connect 25 0 50 0;
+#X connect 26 0 39 0;
+#X connect 27 0 43 0;
+#X connect 28 0 47 0;
+#X connect 29 0 51 0;
+#X connect 30 0 40 0;
+#X connect 31 0 44 0;
+#X connect 32 0 48 0;
+#X connect 33 0 52 0;
+#X connect 35 0 36 0;
+#X connect 36 0 34 0;
+#X connect 37 0 35 0;
+#X connect 37 1 36 1;
+#X connect 38 0 35 0;
+#X connect 38 1 36 5;
+#X connect 39 0 35 0;
+#X connect 39 1 36 9;
+#X connect 40 0 35 0;
+#X connect 40 1 36 13;
+#X connect 41 0 35 0;
+#X connect 41 1 36 2;
+#X connect 42 0 35 0;
+#X connect 42 1 36 6;
+#X connect 43 0 35 0;
+#X connect 43 1 36 10;
+#X connect 44 0 35 0;
+#X connect 44 1 36 14;
+#X connect 45 0 35 0;
+#X connect 45 1 36 3;
+#X connect 46 0 35 0;
+#X connect 46 1 36 7;
+#X connect 47 0 35 0;
+#X connect 47 1 36 11;
+#X connect 48 0 35 0;
+#X connect 48 1 36 15;
+#X connect 49 0 35 0;
+#X connect 49 1 36 4;
+#X connect 50 0 35 0;
+#X connect 50 1 36 8;
+#X connect 51 0 35 0;
+#X connect 51 1 36 12;
+#X connect 52 0 35 0;
+#X connect 52 1 36 16;
+#X coords 0 -1 1 1 360 125 1 10 5;
diff --git a/doc/tutorials/sound/voice_fm.pd b/doc/tutorials/sound/voice_fm.pd
new file mode 100644
index 0000000000000000000000000000000000000000..f72111f379892c593d49bd09e3d3235c5c6ee676
--- /dev/null
+++ b/doc/tutorials/sound/voice_fm.pd
@@ -0,0 +1,58 @@
+#N canvas 486 90 648 468 10;
+#X obj 541 21 pddp/dsp;
+#X obj 11 8 cnv 15 400 40 empty empty voice_fm 20 12 0 24 -228992 -66577
+0;
+#X obj 137 371 output~;
+#X obj 150 90 adc~;
+#X obj 150 133 fiddle~;
+#X obj 164 218 mtof;
+#X floatatom 100 155 5 0 0 0 pitch: - -;
+#X obj 183 294 +~;
+#X obj 199 263 *~;
+#X obj 199 218 osc~;
+#X text 17 60 sing into the mic to control the FM synthesizer;
+#X obj 195 437 pddp/pddplink http://en.wikipedia.org/wiki/Frequency_modulation_synthesis
+;
+#X text 86 437 For more info:;
+#X obj 199 196 * 2;
+#X obj 241 196 - 50;
+#X obj 241 218 * 20;
+#X obj 167 341 *~;
+#X obj 183 313 osc~;
+#X obj 118 314 line~;
+#X msg 118 287 1 10;
+#X msg 53 287 0 1000;
+#X obj 53 267 delay 100;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array \$0-wavetable 8820 float 0;
+#X coords 0 1 8819 -1 200 140 1;
+#X restore 388 139 graph;
+#X obj 260 346 metro 200;
+#X obj 260 328 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X text 278 326 see it;
+#X obj 260 370 tabwrite~ \$0-wavetable;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 4 0 6 0;
+#X connect 4 1 21 0;
+#X connect 4 1 19 0;
+#X connect 4 3 13 0;
+#X connect 4 3 14 0;
+#X connect 5 0 7 0;
+#X connect 7 0 17 0;
+#X connect 8 0 7 1;
+#X connect 9 0 8 0;
+#X connect 13 0 9 0;
+#X connect 14 0 15 0;
+#X connect 15 0 8 1;
+#X connect 16 0 2 0;
+#X connect 16 0 2 1;
+#X connect 16 0 26 0;
+#X connect 17 0 16 1;
+#X connect 18 0 16 0;
+#X connect 19 0 18 0;
+#X connect 20 0 18 0;
+#X connect 21 0 20 0;
+#X connect 23 0 26 0;
+#X connect 24 0 23 0;
diff --git a/doc/tutorials/start-here/+pour-commencer.pd b/doc/tutorials/start-here/+pour-commencer.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7b8a7e7c2b18f624ca914c211bee5a60a94dc6b2
--- /dev/null
+++ b/doc/tutorials/start-here/+pour-commencer.pd
@@ -0,0 +1,213 @@
+#N canvas 508 22 416 759 10;
+#X obj 19 36 pddp/dsp;
+#X obj 19 120 grid grid1 200 0 199 200 0 199 1 1 1 10 10 197 212;
+#X obj 19 337 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -8 0
+10 -262144 -1 -1 177 256;
+#X obj 212 337 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -8 0
+10 -262144 -1 -1 107 256;
+#N canvas 825 22 509 639 video 0;
+#X obj 138 565 pix_texture;
+#X obj 138 390 pix_film;
+#X obj 138 594 rectangle 4 3;
+#X obj 23 25 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 44 37 inlet;
+#X obj 243 37 inlet;
+#X obj 47 262 gemhead;
+#X obj 138 114 purepd/once;
+#X obj 138 146 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 183 353 5 0 0 0 - - -;
+#X obj 138 536 colorRGB;
+#X floatatom 149 499 5 0 0 0 - - -;
+#X floatatom 196 499 5 0 0 0 - - -;
+#X floatatom 244 499 5 0 0 0 - - -;
+#X obj 47 222 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 67 221 <-- Click here to turn video off;
+#X obj 309 110 button Open;
+#X obj 309 228 openpanel;
+#X msg 309 254 open \$1;
+#X msg 138 178 open ../../media/midr-mjpeg.mov RGBA;
+#X obj 160 418 unpack 0 0 0;
+#X floatatom 268 353 5 0 0 0 - - -;
+#X text 306 354 Video length;
+#X floatatom 183 291 5 0 0 0 - - -;
+#X obj 183 318 * \$1;
+#X obj 183 262 / 199;
+#X obj 244 419 / 199;
+#X text 256 91 Click here to open your own video file;
+#X floatatom 244 392 5 0 0 0 - - -;
+#X obj 244 447 * -1;
+#X obj 244 473 + 1;
+#X connect 0 0 2 0;
+#X connect 1 0 10 0;
+#X connect 1 1 20 0;
+#X connect 4 0 7 0;
+#X connect 4 0 25 0;
+#X connect 5 0 7 0;
+#X connect 5 0 28 0;
+#X connect 6 0 1 0;
+#X connect 7 0 8 0;
+#X connect 8 0 14 0;
+#X connect 8 0 19 0;
+#X connect 9 0 1 1;
+#X connect 10 0 0 0;
+#X connect 11 0 10 1;
+#X connect 12 0 10 2;
+#X connect 13 0 10 3;
+#X connect 14 0 6 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 1 0;
+#X connect 19 0 1 0;
+#X connect 20 0 21 0;
+#X connect 21 0 24 1;
+#X connect 23 0 24 0;
+#X connect 24 0 9 0;
+#X connect 25 0 23 0;
+#X connect 26 0 29 0;
+#X connect 26 0 11 0;
+#X connect 28 0 26 0;
+#X connect 29 0 30 0;
+#X connect 30 0 13 0;
+#X restore 228 436 pd video;
+#N canvas 938 22 393 718 3D_graphics 0;
+#X obj 20 23 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 121 156 gemhead;
+#X obj 121 229 colorRGB 1 1 1 1;
+#X text 99 186 red;
+#X text 205 186 green;
+#X obj 41 229 - 100;
+#X obj 41 252 / 25;
+#X floatatom 41 276 5 0 0 0 - - -;
+#X obj 240 229 - 100;
+#X obj 240 252 / 25;
+#X floatatom 240 276 5 0 0 0 - - -;
+#X obj 121 296 translateXYZ;
+#X obj 121 321 sphere 1 20;
+#X text 54 210 X;
+#X text 256 210 Y;
+#X text 237 323 Sphere;
+#X obj 41 369 receive pd;
+#X obj 41 391 route dsp;
+#X obj 41 413 select 1;
+#X obj 41 459 trigger bang bang;
+#X obj 192 459 trigger bang bang;
+#X text 202 438 off;
+#X text 50 437 on;
+#X msg 41 499 lighting 1;
+#X msg 111 499 1;
+#X msg 140 499 create;
+#X msg 192 499 destroy;
+#X msg 291 499 0;
+#X obj 111 549 gemwin;
+#X text 237 551 GEM_Window;
+#X obj 41 611 gemhead;
+#X obj 41 660 world_light -120;
+#X text 237 658 Lighting;
+#X obj 41 35 inlet;
+#X obj 240 35 inlet;
+#X obj 121 134 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 121 89 purepd/once;
+#X obj 121 112 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 61 186 / 199;
+#X obj 167 186 / 199;
+#X text 141 132 <-- Click here to turn 3D graphics off;
+#X connect 1 0 2 0;
+#X connect 2 0 11 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 0 11 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 9 0 11 2;
+#X connect 11 0 12 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 18 1 20 0;
+#X connect 19 0 23 0;
+#X connect 19 0 24 0;
+#X connect 19 1 25 0;
+#X connect 20 0 26 0;
+#X connect 20 1 27 0;
+#X connect 23 0 28 0;
+#X connect 24 0 28 0;
+#X connect 25 0 28 0;
+#X connect 26 0 28 0;
+#X connect 27 0 28 0;
+#X connect 30 0 31 0;
+#X connect 33 0 5 0;
+#X connect 33 0 36 0;
+#X connect 33 0 38 0;
+#X connect 34 0 8 0;
+#X connect 34 0 36 0;
+#X connect 34 0 39 0;
+#X connect 35 0 1 0;
+#X connect 36 0 37 0;
+#X connect 37 0 35 0;
+#X connect 38 0 2 1;
+#X connect 39 0 2 2;
+#X restore 105 436 pd 3D_graphics;
+#N canvas 931 22 341 313 audio 0;
+#X obj 17 18 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 160 140 pack 0 25;
+#X obj 160 199 line~;
+#X obj 237 118 bang;
+#X obj 237 140 delay 200;
+#X msg 237 162 0 250;
+#X obj 38 118 + 250;
+#X obj 38 140 osc~;
+#X obj 98 242 *~;
+#X obj 98 270 dac~;
+#X text 76 118 frequency;
+#X text 198 118 on;
+#X text 270 118 off;
+#X obj 38 30 inlet;
+#X obj 237 30 inlet;
+#X obj 160 118 / 199;
+#X connect 1 0 2 0;
+#X connect 2 0 8 1;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 1;
+#X connect 13 0 3 0;
+#X connect 13 0 15 0;
+#X connect 14 0 6 0;
+#X connect 15 0 1 0;
+#X restore 19 436 pd audio;
+#X text 16 12 (1) Clickez dans le carré pour démarrer et arrêter
+le son.;
+#X text 272 336 coordonnée en Y;
+#X text 79 336 coordonnée en X;
+#X text 17 466 (3) Voyez comment les coordonnées de la grille sont
+reliées aux "entrées" gauche et droite de [pd audio]. Essayez de
+les relier également aux entrées de [pd 3D_graphics] et [pd video].
+;
+#X text 16 573 Ensuite \, placez votre pointeur sur la "sortie" en
+bas d'une des boîtes qui affichent les coordonnées en X ou Y. Clickez
+et maintenez enfoncé le bouton de la souris tout en dessinant un trait
+jusqu'à lun entrée de [pd 3D_graphics] ou [pd video].;
+#X text 16 636 Leorsque le curseur redevient un anneau relachez le
+bouton pour terminer votre fil de patch.;
+#X text 16 81 (2) Clickez et déplacez votre curseur dans la grille
+ci-dessous pour générer des données et faire varier le son.;
+#X text 16 527 Pour faire cela \, vous devez commencer par entrer dans
+le mode d'édition en choisissant dans le menu Edition la ligne "Mode
+édition".;
+#X text 16 675 Pour quitter le mode d'édition \, retournez dans le
+menu Edition et clickez sur "Mode édition". Maintenant essayez d'interagir
+à nouveau avec la grille et voyez ce qu'il se passe.;
+#X connect 1 0 2 0;
+#X connect 1 1 3 0;
+#X connect 2 0 6 0;
+#X connect 3 0 6 1;
diff --git a/doc/tutorials/start-here/+start-here.pd b/doc/tutorials/start-here/+start-here.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0655016f1bf2ce95d934822afbda0207c46411c1
--- /dev/null
+++ b/doc/tutorials/start-here/+start-here.pd
@@ -0,0 +1,211 @@
+#N canvas 508 22 407 726 10;
+#X obj 19 36 pddp/dsp;
+#X obj 19 120 grid grid1 200 0 199 200 0 199 1 1 1 10 10 197 212;
+#X obj 19 337 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-262144 -1 -1 177 256;
+#X obj 212 337 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-262144 -1 -1 107 256;
+#X text 79 336 X position;
+#X text 273 336 Y position;
+#N canvas 825 22 509 639 video 0;
+#X obj 138 565 pix_texture;
+#X obj 138 390 pix_film;
+#X obj 138 594 rectangle 4 3;
+#X obj 23 25 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 44 37 inlet;
+#X obj 243 37 inlet;
+#X obj 47 262 gemhead;
+#X obj 138 114 purepd/once;
+#X obj 138 146 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 183 353 5 0 0 0 - - -;
+#X obj 138 536 colorRGB;
+#X floatatom 149 499 5 0 0 0 - - -;
+#X floatatom 196 499 5 0 0 0 - - -;
+#X floatatom 244 499 5 0 0 0 - - -;
+#X obj 47 222 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 67 221 <-- Click here to turn video off;
+#X obj 309 110 button Open;
+#X obj 309 228 openpanel;
+#X msg 309 254 open \$1;
+#X msg 138 178 open ../../media/midr-mjpeg.mov RGBA;
+#X obj 160 418 unpack 0 0 0;
+#X floatatom 268 353 5 0 0 0 - - -;
+#X text 306 354 Video length;
+#X floatatom 183 291 5 0 0 0 - - -;
+#X obj 183 318 * \$1;
+#X obj 183 262 / 199;
+#X obj 244 419 / 199;
+#X text 256 91 Click here to open your own video file;
+#X floatatom 244 392 5 0 0 0 - - -;
+#X obj 244 447 * -1;
+#X obj 244 473 + 1;
+#X connect 0 0 2 0;
+#X connect 1 0 10 0;
+#X connect 1 1 20 0;
+#X connect 4 0 7 0;
+#X connect 4 0 25 0;
+#X connect 5 0 7 0;
+#X connect 5 0 28 0;
+#X connect 6 0 1 0;
+#X connect 7 0 8 0;
+#X connect 8 0 14 0;
+#X connect 8 0 19 0;
+#X connect 9 0 1 1;
+#X connect 10 0 0 0;
+#X connect 11 0 10 1;
+#X connect 12 0 10 2;
+#X connect 13 0 10 3;
+#X connect 14 0 6 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 1 0;
+#X connect 19 0 1 0;
+#X connect 20 0 21 0;
+#X connect 21 0 24 1;
+#X connect 23 0 24 0;
+#X connect 24 0 9 0;
+#X connect 25 0 23 0;
+#X connect 26 0 29 0;
+#X connect 26 0 11 0;
+#X connect 28 0 26 0;
+#X connect 29 0 30 0;
+#X connect 30 0 13 0;
+#X restore 228 436 pd video;
+#N canvas 938 22 393 718 3D_graphics 0;
+#X obj 20 23 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 121 156 gemhead;
+#X obj 121 229 colorRGB 1 1 1 1;
+#X text 99 186 red;
+#X text 205 186 green;
+#X obj 41 229 - 100;
+#X obj 41 252 / 25;
+#X floatatom 41 276 5 0 0 0 - - -;
+#X obj 240 229 - 100;
+#X obj 240 252 / 25;
+#X floatatom 240 276 5 0 0 0 - - -;
+#X obj 121 296 translateXYZ;
+#X obj 121 321 sphere 1 20;
+#X text 54 210 X;
+#X text 256 210 Y;
+#X text 237 323 Sphere;
+#X obj 41 369 receive pd;
+#X obj 41 391 route dsp;
+#X obj 41 413 select 1;
+#X obj 41 459 trigger bang bang;
+#X obj 192 459 trigger bang bang;
+#X text 202 438 off;
+#X text 50 437 on;
+#X msg 41 499 lighting 1;
+#X msg 111 499 1;
+#X msg 140 499 create;
+#X msg 192 499 destroy;
+#X msg 291 499 0;
+#X obj 111 549 gemwin;
+#X text 237 551 GEM_Window;
+#X obj 41 611 gemhead;
+#X obj 41 660 world_light -120;
+#X text 237 658 Lighting;
+#X obj 41 35 inlet;
+#X obj 240 35 inlet;
+#X obj 121 134 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 121 89 purepd/once;
+#X obj 121 112 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 61 186 / 199;
+#X obj 167 186 / 199;
+#X text 141 132 <-- Click here to turn 3D graphics off;
+#X connect 1 0 2 0;
+#X connect 2 0 11 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 0 11 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 9 0 11 2;
+#X connect 11 0 12 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 18 1 20 0;
+#X connect 19 0 23 0;
+#X connect 19 0 24 0;
+#X connect 19 1 25 0;
+#X connect 20 0 26 0;
+#X connect 20 1 27 0;
+#X connect 23 0 28 0;
+#X connect 24 0 28 0;
+#X connect 25 0 28 0;
+#X connect 26 0 28 0;
+#X connect 27 0 28 0;
+#X connect 30 0 31 0;
+#X connect 33 0 5 0;
+#X connect 33 0 36 0;
+#X connect 33 0 38 0;
+#X connect 34 0 8 0;
+#X connect 34 0 36 0;
+#X connect 34 0 39 0;
+#X connect 35 0 1 0;
+#X connect 36 0 37 0;
+#X connect 37 0 35 0;
+#X connect 38 0 2 1;
+#X connect 39 0 2 2;
+#X restore 105 436 pd 3D_graphics;
+#N canvas 931 22 341 313 audio 0;
+#X obj 17 18 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 160 140 pack 0 25;
+#X obj 160 199 line~;
+#X obj 237 118 bang;
+#X obj 237 140 delay 200;
+#X msg 237 162 0 250;
+#X obj 38 118 + 250;
+#X obj 38 140 osc~;
+#X obj 98 242 *~;
+#X obj 98 270 dac~;
+#X text 76 118 frequency;
+#X text 198 118 on;
+#X text 270 118 off;
+#X obj 38 30 inlet;
+#X obj 237 30 inlet;
+#X obj 160 118 / 199;
+#X connect 1 0 2 0;
+#X connect 2 0 8 1;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 1;
+#X connect 13 0 3 0;
+#X connect 13 0 15 0;
+#X connect 14 0 6 0;
+#X connect 15 0 1 0;
+#X restore 19 436 pd audio;
+#X text 16 12 (1) Click inside the box next to dsp to turn on and off.
+;
+#X text 16 81 (2) Click and drag anywhere in the grid to generate data
+and make sound.;
+#X text 16 626 The cursor will become a ring again. Release to complete
+the patch cord.;
+#X text 16 527 To do this \, you must first enter edit mode by going
+to the Edit menu and clicking on "Edit mode.";
+#X text 16 665 Exit edit mode by going back to the Edit menu and clicking
+on "Edit mode." Now try interacting with the grid again to see what
+happens.;
+#X text 16 466 (3) Notice how the X and Y coordinates from the grid
+are connected to the left and right "inlets" of [pd audio]. Try connecting
+them to the inlets of [pd 3D_graphics] and [pd video] as well.;
+#X text 16 563 Next \, hover over the bottom "outlet" of an X or Y
+position number box until your cursor becomes a ring. Click and hold
+on the outlet \, then draw a line to an inlet of [pd 3D_graphics] or
+[pd video].;
+#X connect 1 0 2 0;
+#X connect 1 1 3 0;
+#X connect 2 0 8 0;
+#X connect 3 0 8 1;
diff --git "a/doc/tutorials/start-here/+\343\201\223\343\201\223\343\201\213\343\202\211\343\202\271\343\202\277\343\203\274\343\203\210.pd" "b/doc/tutorials/start-here/+\343\201\223\343\201\223\343\201\213\343\202\211\343\202\271\343\202\277\343\203\274\343\203\210.pd"
new file mode 100644
index 0000000000000000000000000000000000000000..3165a6c89b1dba2e902a3cc5bdf6b21e02a690d2
--- /dev/null
+++ "b/doc/tutorials/start-here/+\343\201\223\343\201\223\343\201\213\343\202\211\343\202\271\343\202\277\343\203\274\343\203\210.pd"
@@ -0,0 +1,211 @@
+#N canvas 509 79 480 726 12;
+#X obj 19 36 pddp/dsp;
+#X obj 19 120 grid grid1 200 0 199 200 0 199 1 1 1 10 10 197 212;
+#X obj 19 337 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-262144 -1 -1 177 256;
+#X obj 212 337 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-262144 -1 -1 107 256;
+#X text 79 336 Xの位置;
+#X text 273 336 Yの位置;
+#N canvas 825 22 509 639 video 0;
+#X obj 138 565 pix_texture;
+#X obj 138 390 pix_film;
+#X obj 138 594 rectangle 4 3;
+#X obj 23 25 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 44 37 inlet;
+#X obj 243 37 inlet;
+#X obj 47 262 gemhead;
+#X obj 138 114 purepd/once;
+#X obj 138 146 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X floatatom 183 353 5 0 0 0 - - -;
+#X obj 138 536 colorRGB;
+#X floatatom 149 499 5 0 0 0 - - -;
+#X floatatom 196 499 5 0 0 0 - - -;
+#X floatatom 244 499 5 0 0 0 - - -;
+#X obj 47 222 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X text 67 221 <--ここをクリックしてビデオをオフにします。
+;
+#X obj 309 110 button Open;
+#X obj 309 228 openpanel;
+#X msg 309 254 open \$1;
+#X msg 138 178 open ../../media/midr-mjpeg.mov RGBA;
+#X obj 160 418 unpack 0 0 0;
+#X floatatom 268 353 5 0 0 0 - - -;
+#X text 306 354 ビデオの長さ;
+#X floatatom 183 291 5 0 0 0 - - -;
+#X obj 183 318 * \$1;
+#X obj 183 262 / 199;
+#X obj 244 419 / 199;
+#X text 256 91 ここをクリックして他のビデオファイルを開きます。
+;
+#X floatatom 244 392 5 0 0 0 - - -;
+#X obj 244 447 * -1;
+#X obj 244 473 + 1;
+#X connect 0 0 2 0;
+#X connect 1 0 10 0;
+#X connect 1 1 20 0;
+#X connect 4 0 7 0;
+#X connect 4 0 25 0;
+#X connect 5 0 7 0;
+#X connect 5 0 28 0;
+#X connect 6 0 1 0;
+#X connect 7 0 8 0;
+#X connect 8 0 14 0;
+#X connect 8 0 19 0;
+#X connect 9 0 1 1;
+#X connect 10 0 0 0;
+#X connect 11 0 10 1;
+#X connect 12 0 10 2;
+#X connect 13 0 10 3;
+#X connect 14 0 6 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 1 0;
+#X connect 19 0 1 0;
+#X connect 20 0 21 0;
+#X connect 21 0 24 1;
+#X connect 23 0 24 0;
+#X connect 24 0 9 0;
+#X connect 25 0 23 0;
+#X connect 26 0 29 0;
+#X connect 26 0 11 0;
+#X connect 28 0 26 0;
+#X connect 29 0 30 0;
+#X connect 30 0 13 0;
+#X restore 228 436 pd video;
+#N canvas 938 22 393 718 3D_graphics 0;
+#X obj 20 23 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 121 156 gemhead;
+#X obj 121 229 colorRGB 1 1 1 1;
+#X text 99 186 赤;
+#X text 205 186 ç·‘;
+#X obj 41 229 - 100;
+#X obj 41 252 / 25;
+#X floatatom 41 276 5 0 0 0 - - -;
+#X obj 240 229 - 100;
+#X obj 240 252 / 25;
+#X floatatom 240 276 5 0 0 0 - - -;
+#X obj 121 296 translateXYZ;
+#X obj 121 321 sphere 1 20;
+#X text 54 210 X値;
+#X text 256 210 Y値;
+#X text 237 323 球体;
+#X obj 41 369 receive pd;
+#X obj 41 391 route dsp;
+#X obj 41 413 select 1;
+#X obj 41 459 trigger bang bang;
+#X obj 192 459 trigger bang bang;
+#X text 202 438 オフ;
+#X text 50 437 オン;
+#X msg 41 499 lighting 1;
+#X msg 111 499 1;
+#X msg 140 499 create;
+#X msg 192 499 destroy;
+#X msg 291 499 0;
+#X obj 111 549 gemwin;
+#X text 237 551 GEMウィンドウ;
+#X obj 41 611 gemhead;
+#X obj 41 660 world_light -120;
+#X text 237 658 ライティング;
+#X obj 41 35 inlet;
+#X obj 240 35 inlet;
+#X obj 121 134 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 121 89 purepd/once;
+#X obj 121 112 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 61 186 / 199;
+#X obj 167 186 / 199;
+#X text 141 132 <--ここをクリックして3Dグラフィックをオフにします。
+;
+#X connect 1 0 2 0;
+#X connect 2 0 11 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 0 11 1;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 9 0 11 2;
+#X connect 11 0 12 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 18 1 20 0;
+#X connect 19 0 23 0;
+#X connect 19 0 24 0;
+#X connect 19 1 25 0;
+#X connect 20 0 26 0;
+#X connect 20 1 27 0;
+#X connect 23 0 28 0;
+#X connect 24 0 28 0;
+#X connect 25 0 28 0;
+#X connect 26 0 28 0;
+#X connect 27 0 28 0;
+#X connect 30 0 31 0;
+#X connect 33 0 5 0;
+#X connect 33 0 36 0;
+#X connect 33 0 38 0;
+#X connect 34 0 8 0;
+#X connect 34 0 36 0;
+#X connect 34 0 39 0;
+#X connect 35 0 1 0;
+#X connect 36 0 37 0;
+#X connect 37 0 35 0;
+#X connect 38 0 2 1;
+#X connect 39 0 2 2;
+#X restore 105 436 pd 3D_graphics;
+#N canvas 931 22 341 313 audio 0;
+#X obj 17 18 cnv 15 300 40 empty empty empty 124 20 0 12 -228856 -66577
+0;
+#X obj 160 140 pack 0 25;
+#X obj 160 199 line~;
+#X obj 237 118 bang;
+#X obj 237 140 delay 200;
+#X msg 237 162 0 250;
+#X obj 38 118 + 250;
+#X obj 38 140 osc~;
+#X obj 98 242 *~;
+#X obj 98 270 dac~;
+#X text 76 118 周波数;
+#X text 198 118 オン;
+#X text 270 118 オフ;
+#X obj 38 30 inlet;
+#X obj 237 30 inlet;
+#X obj 160 118 / 199;
+#X connect 1 0 2 0;
+#X connect 2 0 8 1;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 8 0 9 1;
+#X connect 13 0 3 0;
+#X connect 13 0 15 0;
+#X connect 14 0 6 0;
+#X connect 15 0 1 0;
+#X restore 19 436 pd audio;
+#X text 11 12 (1)「dsp」の横のボックスをクリックしてDSPをオン・オフします。
+;
+#X text 11 61 (2)グリッドの好きなところをクリック・ドラッグしてください。;
+#X text 16 78 データが出力されて音が鳴ります。;
+#X text 11 626 カーソルが再びに丸になります。マウスボタンを離すとラインがつながります。
+;
+#X text 11 527 まず、編集メニュー - 編集をクリックして編集モードにします。;
+#X text 11 665 編集メニュー - 編集モードをもう一度クリックすると実行モードになります。
+再びグリッドの点を動かして何が起こるかを見てみましょう。;
+#X text 11 466 (3)グリッドの座標のX値とY値の出力が[pd audio]
+の左右のインレットにつながっています。さらにX値とY値の出力を;
+#X text 11 498 [pd 3D_graphics]と[pd video]のインレットにもつないでみましょう;
+#X text 11 563 X値とY値のナンバーボックスのアウトレットにカーソルを合わせると丸になります。
+マウスをクリックしてホールドしたままカーソルを移動させるとラインが描かれます。;
+#X text 11 595 それを[pd 3D_graphics]や[pd video]のインレットまで移動します。;
+#X connect 1 0 2 0;
+#X connect 1 1 3 0;
+#X connect 2 0 8 0;
+#X connect 3 0 8 1;
diff --git a/doc/tutorials/start-here/po/+start-here.pot b/doc/tutorials/start-here/po/+start-here.pot
new file mode 100644
index 0000000000000000000000000000000000000000..38c65dd296bd9603c5add6a20148e484b6eac94a
--- /dev/null
+++ b/doc/tutorials/start-here/po/+start-here.pot
@@ -0,0 +1,96 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Pure Data 0.43\n"
+"Report-Msgid-Bugs-To: http://bugs.puredata.info\n"
+"POT-Creation-Date: 2012-12-31 20:40-0500\n"
+"PO-Revision-Date: 2012-12-31 20:45-0500\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+
+msgid "X position"
+msgstr ""
+
+msgid "Y position"
+msgstr ""
+
+msgid "video"
+msgstr ""
+
+msgid "<-- Click here to turn video off"
+msgstr ""
+
+msgid "Video length"
+msgstr ""
+
+msgid "Click here to open your own video file"
+msgstr ""
+
+msgid "3D_graphics"
+msgstr ""
+
+msgid "red"
+msgstr ""
+
+msgid "green"
+msgstr ""
+
+msgid "X"
+msgstr ""
+
+msgid "Y"
+msgstr ""
+
+msgid "Sphere"
+msgstr ""
+
+msgid "off"
+msgstr ""
+
+msgid "on"
+msgstr ""
+
+msgid "GEM_Window"
+msgstr ""
+
+msgid "Lighting"
+msgstr ""
+
+msgid "<-- Click here to turn 3D graphics off"
+msgstr ""
+
+msgid "frequency"
+msgstr ""
+
+msgid "audio"
+msgstr ""
+
+msgid "(1) Click inside the box next to dsp to turn on and off. "
+msgstr ""
+
+msgid "(2) Click and drag anywhere in the grid to generate data and make sound."
+msgstr ""
+
+msgid "The cursor will become a ring again. Release to complete the patch cord."
+msgstr ""
+
+msgid "To do this, you must first enter edit mode by going to the Edit menu and clicking on\"Edit mode\""
+msgstr ""
+
+msgid "Exit edit mode by going back to the Edit menu and clicking on\"Edit mode\" Now try interacting with the grid again to see what happens."
+msgstr ""
+
+msgid "(3) Notice how the X and Y coordinates from the grid are connected to the left and right\"inlet\" of [pd audio]. Try connecting them to the inlets of [pd 3D_graphics] and [pd video] as well."
+msgstr ""
+
+msgid "Next, hover over the bottom\"outle\" of an X or Y position number box until your cursor becomes a ring. Click and hold on the outlet, then draw a line to an inlet of [pd 3D_graphics] or [pd video]."
+msgstr ""
diff --git a/doc/tutorials/start-here/po/generate-pot.py b/doc/tutorials/start-here/po/generate-pot.py
new file mode 100755
index 0000000000000000000000000000000000000000..890a57e2fc33fc724c0488562deea76f2cda8c9a
--- /dev/null
+++ b/doc/tutorials/start-here/po/generate-pot.py
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+
+import re
+
+f = open('../+start-here.pd', 'r')
+text = ''
+for line in f.readlines():
+    text += line
+
+print """# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Pure Data 0.43\\n"
+"Report-Msgid-Bugs-To: http://bugs.puredata.info\\n"
+"POT-Creation-Date: 2012-12-31 20:40-0500\\n"
+"PO-Revision-Date: 2012-12-31 20:45-0500\\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
+"Language-Team: LANGUAGE <LL@li.org>\\n"
+"Language: \\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=utf-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"""
+
+regex = re.compile('#X text [0-9]+ [0-9]+ ([^;]*);', re.MULTILINE | re.DOTALL)
+matches = [m.groups() for m in regex.finditer(text)]
+
+nonewlines = re.compile('\n', re.MULTILINE)
+nobackslashes = re.compile(' \\\\', re.MULTILINE)
+escapedoublequote = re.compile('[^\\\\]"', re.MULTILINE)
+
+ids = []
+for m in matches:
+    if m:
+        chunk = m[0]
+        chunk = re.sub(nonewlines, ' ', chunk)
+        chunk = re.sub(nobackslashes, '', chunk)
+        chunk = re.sub(escapedoublequote, '\\"', chunk)
+        if chunk not in ids:
+            ids.append(chunk)
+
+for id in ids:
+        print '\nmsgid "' + id + '"'
+        print 'msgstr ""'
diff --git a/doc/tutorials/visual/01.gemwin.pd b/doc/tutorials/visual/01.gemwin.pd
new file mode 100644
index 0000000000000000000000000000000000000000..b0f152b404b8065f12723e238f7b8658057734c0
--- /dev/null
+++ b/doc/tutorials/visual/01.gemwin.pd
@@ -0,0 +1,12 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 196 258 gemwin;
+#X obj 8 10 cnv 15 400 40 empty empty gemwin 20 12 0 24 -228992 -66577
+0;
+#X msg 138 180 create;
+#X msg 245 181 destroy;
+#X text 12 89 The most basic element in Gem is the gemwin \, which
+displays the world that you are creating. Here's how you open and close
+the gemwin:;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
diff --git a/doc/tutorials/visual/02.gemwin_as_reference.pd b/doc/tutorials/visual/02.gemwin_as_reference.pd
new file mode 100644
index 0000000000000000000000000000000000000000..2f6a0a4cfaf3ecdd920f64699297eacafb862810
--- /dev/null
+++ b/doc/tutorials/visual/02.gemwin_as_reference.pd
@@ -0,0 +1,20 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 64 322 gemwin;
+#X obj 8 10 cnv 15 400 40 empty empty gemwin_as_pointer 20 12 0 24
+-228992 -66577 0;
+#X msg 64 254 create;
+#X text 17 63 Gem is based on OpenGL \, which uses the graphics card
+to do the processing. That means that instead of directly controlling
+the data like you do with Pd messages or audio \, in Gem you are controlling
+a "pointer" to the data on the video card.;
+#X obj 302 323 gemwin;
+#X text 17 137 [gemwin] is a pointer to the output buffer of your video
+card. The screen you are looking at is that output buffer drawn to
+the screen.;
+#X msg 302 255 destroy;
+#X text 17 188 So even if there are multiple [gemwin] objects \, there
+is only one screen. Each [gemwin] object is then a pointer to the same
+window.;
+#X connect 2 0 0 0;
+#X connect 6 0 4 0;
diff --git a/doc/tutorials/visual/03.gemwin_control.pd b/doc/tutorials/visual/03.gemwin_control.pd
new file mode 100644
index 0000000000000000000000000000000000000000..50f009c71b2f6154bbb923f04afe471d9155d913
--- /dev/null
+++ b/doc/tutorials/visual/03.gemwin_control.pd
@@ -0,0 +1,18 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty gemwin_control 20 12 0 24 -228992
+-66577 0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X text 20 78 From now on in this tutorial \, the [gemwin_control]
+object will be used to control the gemwin. It is just a handy shortcut
+with a GUI for controlling the window creation/destruction and the
+rendering.;
+#X obj 166 273 gemwin_control;
+#X text 22 161 - The "window" checkbox sends [create( and [destroy(
+to [gemwin];
+#X text 24 197 - the "render" checkbox sends 1 or 0 to [gemwin] to
+control the rendering.;
+#X text 23 341 Each checkbox will turn green when enabled. When the
+whole object turns green \, that means everything is ready to display
+data in the gemwin.;
diff --git a/doc/tutorials/visual/04.render_chains.pd b/doc/tutorials/visual/04.render_chains.pd
new file mode 100644
index 0000000000000000000000000000000000000000..e951fa4339dd72461ca21c325ca9ae58285bafb9
--- /dev/null
+++ b/doc/tutorials/visual/04.render_chains.pd
@@ -0,0 +1,18 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty render_chains 20 12 0 24 -228992
+-66577 0;
+#X obj 208 217 gemhead;
+#X obj 209 172 tgl 15 1 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 207 266 square;
+#X text 31 74 Gem operates on "render chains". Render chains define
+the flow and ordering of the rendering of graphics to the Gem world
+that you see in the [gemwin].;
+#X text 29 353 Every render chain must start with a [gemhead] \, or
+it will not be generated. Render chains generally end with an shape
+object (sometimes called a "geo").;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
diff --git a/doc/tutorials/visual/05.basic_2d_objects.pd b/doc/tutorials/visual/05.basic_2d_objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..d79b7e9739a069ea8e1c5d7508afa834897ebb91
--- /dev/null
+++ b/doc/tutorials/visual/05.basic_2d_objects.pd
@@ -0,0 +1,51 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty basic_2d_objects 20 12 0 24 -228992
+-66577 0;
+#X obj 168 196 gemhead;
+#X obj 167 168 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 168 224 square;
+#X obj 28 196 gemhead;
+#X obj 27 168 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 98 196 gemhead;
+#X obj 97 168 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 28 224 circle;
+#X obj 98 224 triangle;
+#X text 8 147 two-dimensional (2D);
+#X obj 230 196 gemhead;
+#X obj 229 168 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 230 224 rectangle;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 306 196 gemhead;
+#X obj 305 168 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 306 224 colorSquare;
+#X obj 396 196 gemhead;
+#X obj 395 168 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 396 224 curve 5;
+#X obj 466 196 gemhead;
+#X obj 465 168 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 466 224 text2d;
+#X text 17 430 If you click and drag in the gemwin \, you can change
+your view perspective \, and see that these objects are only 2D.;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 9 0;
+#X connect 7 0 6 0;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 19 0 21 0;
+#X connect 20 0 19 0;
+#X connect 22 0 24 0;
+#X connect 23 0 22 0;
diff --git a/doc/tutorials/visual/06.lighting.pd b/doc/tutorials/visual/06.lighting.pd
new file mode 100644
index 0000000000000000000000000000000000000000..86d396811e11f15cb0f97bee0ac468d587d4f655
--- /dev/null
+++ b/doc/tutorials/visual/06.lighting.pd
@@ -0,0 +1,59 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty lighting 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 83 173 gemwin;
+#X msg 83 152 lighting \$1;
+#X obj 83 134 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 465 121 gemhead;
+#X obj 465 162 sphere 1 35;
+#X obj 22 233 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 22 253 world_light;
+#X text 465 103 example sphere;
+#X text 11 54 No world would be complete without lighting. Gem provides
+three different kinds of light sources. Like rendering \, the calculation
+of lighting needs to be turned on by sending a message to [gemwin]
+\, since lighting is a GPU-intensive operation.;
+#X obj 2 194 gemhead;
+#X obj 22 304 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 22 354 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 22 424 spot_light;
+#X obj 22 324 light;
+#X msg 54 403 0 0 1;
+#X msg 52 301 0 1 0;
+#X msg 62 231 1 0 0;
+#X text 125 225 A [world_light] is a light that is infinitely far away
+\, basically like sunlight. The rays coming from a [world_light] are
+always parallel.;
+#X text 124 306 [light] generates a point-light that is part of the
+scene. It is basically like a lamp. You can place the lamp directly
+in your scene.;
+#X msg 30 384 debug \$1;
+#X obj 46 365 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 124 386 A [spot_light] generates a spot light which you can
+move around. It can be used for pinpoint light or widened to cover
+a larger area. If you turn on the debug feature \, you will see a little
+cone where the light source is.;
+#X obj 465 142 translateXYZ 0 0 -2;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 25 0;
+#X connect 8 0 9 0;
+#X connect 12 0 9 0;
+#X connect 12 0 16 0;
+#X connect 12 0 15 0;
+#X connect 13 0 16 0;
+#X connect 14 0 15 0;
+#X connect 17 0 15 1;
+#X connect 18 0 16 1;
+#X connect 19 0 9 1;
+#X connect 22 0 15 0;
+#X connect 23 0 22 0;
+#X connect 25 0 7 0;
diff --git a/doc/tutorials/visual/07.basic_3d_objects.pd b/doc/tutorials/visual/07.basic_3d_objects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8d8aab10c335e451c18c224fb084888c153cf38e
--- /dev/null
+++ b/doc/tutorials/visual/07.basic_3d_objects.pd
@@ -0,0 +1,53 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty basic_3D_objects 20 12 0 24 -228992
+-66577 0;
+#X obj 39 190 gemhead;
+#X obj 38 162 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 39 218 cube;
+#X obj 99 190 gemhead;
+#X obj 98 162 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 99 218 sphere;
+#X obj 159 190 gemhead;
+#X obj 158 162 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 159 218 cone;
+#X obj 221 191 gemhead;
+#X obj 220 163 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 281 191 gemhead;
+#X obj 280 163 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 281 219 teapot;
+#X obj 221 219 tube;
+#X obj 341 191 gemhead;
+#X obj 340 163 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 341 219 torus;
+#X obj 465 16 gemwin_control;
+#X obj 466 59 import Gem;
+#X obj 401 191 gemhead;
+#X obj 400 163 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 401 219 cuboid;
+#X obj 63 322 gemhead;
+#X obj 63 349 world_light;
+#X msg 135 321 1 1 1;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 10 0 15 0;
+#X connect 11 0 10 0;
+#X connect 12 0 14 0;
+#X connect 13 0 12 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 21 0 23 0;
+#X connect 22 0 21 0;
+#X connect 24 0 25 0;
+#X connect 26 0 25 1;
diff --git a/doc/tutorials/visual/08.manipulations.pd b/doc/tutorials/visual/08.manipulations.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8c144f376e9d232145168436ad7d029dcc41df33
--- /dev/null
+++ b/doc/tutorials/visual/08.manipulations.pd
@@ -0,0 +1,109 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty manipulations 20 12 0 24 -228992
+-66577 0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 28 130 color;
+#X obj 28 342 translate;
+#X obj 331 96 gemhead;
+#X msg 219 78 lighting \$1;
+#X obj 219 57 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 219 101 gemwin;
+#X obj 205 432 world_light;
+#X obj 331 427 cube;
+#X obj 205 412 gemhead;
+#X obj 332 146 translateXYZ 0 0 0;
+#X obj 457 86 hsl 128 15 -2 2 0 0 empty empty X 12 8 1 12 -233017 -1
+-1 0 1;
+#X obj 457 106 hsl 128 15 -2 2 0 0 empty empty Y 12 8 1 12 -233017
+-1 -1 5900 1;
+#X obj 457 126 hsl 128 15 -2 2 0 0 empty empty Z 12 8 1 12 -233017
+-1 -1 0 1;
+#X obj 457 166 hsl 128 15 0 360 0 0 empty empty X 12 8 1 12 -233017
+-1 -1 0 1;
+#X obj 457 186 hsl 128 15 0 360 0 0 empty empty Y 12 8 1 12 -233017
+-1 -1 0 1;
+#X obj 457 206 hsl 128 15 0 360 0 0 empty empty Z 12 8 1 12 -233017
+-1 -1 0 1;
+#X obj 331 225 rotateXYZ 0 0 0;
+#X obj 457 246 hsl 128 15 0 3 0 1 empty empty X 12 8 1 12 -233017 -1
+-1 4233 1;
+#X obj 457 266 hsl 128 15 0 3 0 1 empty empty Y 12 8 1 12 -233017 -1
+-1 4233 1;
+#X obj 457 286 hsl 128 15 0 3 0 1 empty empty Z 12 8 1 12 -233017 -1
+-1 4233 1;
+#X obj 457 326 hsl 128 15 0 1 0 1 empty empty R 12 8 1 12 -261689 -1
+-1 12700 1;
+#X obj 457 346 hsl 128 15 0 1 0 1 empty empty G 12 8 1 12 -225271 -1
+-1 12700 1;
+#X obj 457 366 hsl 128 15 0 1 0 1 empty empty B 12 8 1 12 -228992 -1
+-1 12700 1;
+#X obj 331 385 colorRGB 1 1 1;
+#X obj 28 371 sphere;
+#X obj 27 83 gemhead;
+#X obj 60 300 hsl 128 15 -2 2 0 0 empty empty amount 6 8 1 12 -233017
+-1 -1 0 1;
+#X msg 73 318 1 0 1;
+#X msg 120 318 0 0.5 0.5;
+#X text 118 335 direction;
+#X obj 60 230 hsl 128 15 0 3 0 0 empty empty amount 6 8 1 12 -233017
+-1 -1 0 1;
+#X msg 73 248 1 0 1;
+#X msg 120 248 0 0.5 0.5;
+#X text 118 265 direction;
+#X obj 60 163 hsl 128 15 0 360 0 0 empty empty amount 6 8 1 12 -233017
+-1 -1 0 1;
+#X msg 73 181 1 0 1;
+#X msg 120 181 0 0.5 0.5;
+#X msg 39 103 1 1 1;
+#X msg 86 103 1 0 0;
+#X msg 133 103 0 0 1;
+#X obj 28 205 rotate;
+#X obj 28 272 scale 1 1 1;
+#X text 118 198 rotation axis;
+#X obj 331 305 scaleXYZ 1 1 1;
+#X obj 331 75 tgl 15 1 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 27 64 tgl 15 1 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X connect 3 0 43 0;
+#X connect 4 0 27 0;
+#X connect 5 0 12 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 0;
+#X connect 11 0 9 0;
+#X connect 12 0 19 0;
+#X connect 13 0 12 1;
+#X connect 14 0 12 2;
+#X connect 15 0 12 3;
+#X connect 16 0 19 1;
+#X connect 17 0 19 2;
+#X connect 18 0 19 3;
+#X connect 19 0 46 0;
+#X connect 20 0 46 1;
+#X connect 21 0 46 2;
+#X connect 22 0 46 3;
+#X connect 23 0 26 1;
+#X connect 24 0 26 2;
+#X connect 25 0 26 3;
+#X connect 26 0 10 0;
+#X connect 28 0 3 0;
+#X connect 29 0 4 1;
+#X connect 30 0 4 2;
+#X connect 31 0 4 2;
+#X connect 33 0 44 1;
+#X connect 34 0 44 2;
+#X connect 35 0 44 2;
+#X connect 37 0 43 1;
+#X connect 38 0 43 2;
+#X connect 39 0 43 2;
+#X connect 40 0 3 1;
+#X connect 41 0 3 1;
+#X connect 42 0 3 1;
+#X connect 43 0 44 0;
+#X connect 44 0 4 0;
+#X connect 46 0 26 0;
+#X connect 47 0 5 0;
+#X connect 48 0 28 0;
diff --git a/doc/tutorials/visual/09.gem_units.pd b/doc/tutorials/visual/09.gem_units.pd
new file mode 100644
index 0000000000000000000000000000000000000000..5929af78614226b120738e2b456aeac5c2f78289
--- /dev/null
+++ b/doc/tutorials/visual/09.gem_units.pd
@@ -0,0 +1,33 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty gem_units 20 12 0 24 -228992
+-66577 0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 179 155 gemhead;
+#X obj 178 127 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 84 329 gemhead;
+#X obj 83 301 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1
+;
+#X obj 84 387 circle 1;
+#X obj 179 183 circle 1;
+#X text 12 69 Everything in Gem uses the same units for measurement
+of space. First we have here a circle with a radius of 1:;
+#X text 15 235 Here a circle with a radius of one is moved 1 unit on
+the X-axis. You can see that the center points of the circles below
+are at the edge of the above circle.;
+#X obj 263 329 gemhead;
+#X obj 262 301 tgl 15 1 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X obj 263 387 circle 1;
+#X obj 263 359 translateXYZ 0 1 0;
+#X obj 84 359 translateXYZ 1 0 0;
+#X connect 3 0 8 0;
+#X connect 4 0 3 0;
+#X connect 5 0 15 0;
+#X connect 6 0 5 0;
+#X connect 11 0 14 0;
+#X connect 12 0 11 0;
+#X connect 14 0 13 0;
+#X connect 15 0 7 0;
diff --git a/doc/tutorials/visual/10.Exercise-make_your_object.pd b/doc/tutorials/visual/10.Exercise-make_your_object.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7323e1419c6753d518a105099b6237d803719bbd
--- /dev/null
+++ b/doc/tutorials/visual/10.Exercise-make_your_object.pd
@@ -0,0 +1,9 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty exercise 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X text 14 68 EXERCISE:;
+#X text 14 92 Build a patch that allows you to move an object around
+the Gem windows and change its color.;
diff --git a/doc/tutorials/visual/10.exercise.pd b/doc/tutorials/visual/10.exercise.pd
new file mode 100644
index 0000000000000000000000000000000000000000..7323e1419c6753d518a105099b6237d803719bbd
--- /dev/null
+++ b/doc/tutorials/visual/10.exercise.pd
@@ -0,0 +1,9 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty exercise 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X text 14 68 EXERCISE:;
+#X text 14 92 Build a patch that allows you to move an object around
+the Gem windows and change its color.;
diff --git a/doc/tutorials/visual/11.images.pd b/doc/tutorials/visual/11.images.pd
new file mode 100644
index 0000000000000000000000000000000000000000..54f4f956f490c7061a931861b95b74a38ce65f91
--- /dev/null
+++ b/doc/tutorials/visual/11.images.pd
@@ -0,0 +1,32 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty images 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 141 157 gemhead;
+#X obj 141 306 pix_draw;
+#X obj 141 269 pix_image;
+#X obj 157 189 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 10 40 620 460 openpanel 0;
+#X obj 114 62 inlet;
+#X obj 121 254 outlet;
+#X obj 114 125 openpanel;
+#X msg 114 162 set open \$1;
+#X obj 114 199 t b a;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 4 1 1 0;
+#X restore 157 210 pd openpanel;
+#X msg 157 238 open somefile.jpg;
+#X text 14 67 You can load up and display images in the Gem space.
+[pix_image] loads up the image \, and [pix_draw] draws it to the screen.
+;
+#X connect 3 0 5 0;
+#X connect 5 0 4 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 5 0;
diff --git a/doc/tutorials/visual/12.texturing.pd b/doc/tutorials/visual/12.texturing.pd
new file mode 100644
index 0000000000000000000000000000000000000000..60f0b458d47eec4bc2f47c969b8cbda5abe966b2
--- /dev/null
+++ b/doc/tutorials/visual/12.texturing.pd
@@ -0,0 +1,23 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty texturing 20 12 0 24 -228992
+-66577 0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 80 144 gemhead;
+#X obj 80 256 pix_image;
+#X obj 96 176 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X obj 80 293 pix_texture;
+#X text 9 66 You can write images to surfaces of objects. This is known
+as texturing. You use the [pix_texture] object followed by the shape
+to write to:;
+#X obj 81 351 cuboid 4 3 3;
+#X obj 96 197 openpanel;
+#X msg 96 225 open \$1;
+#X connect 3 0 4 0;
+#X connect 4 0 6 0;
+#X connect 5 0 9 0;
+#X connect 6 0 8 0;
+#X connect 9 0 10 0;
+#X connect 10 0 4 0;
diff --git a/doc/tutorials/visual/13.movies.pd b/doc/tutorials/visual/13.movies.pd
new file mode 100644
index 0000000000000000000000000000000000000000..24b8fc10b2355a6c0d232be7353b73c7a67748e2
--- /dev/null
+++ b/doc/tutorials/visual/13.movies.pd
@@ -0,0 +1,47 @@
+#N canvas 10 40 624 464 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty movies 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 118 90 gemhead;
+#X obj 130 120 bng 25 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#X text 173 95 movie-clip;
+#X obj 145 325 unpack 0 0 0;
+#X floatatom 131 348 5 0 0 3 length - -;
+#X floatatom 180 348 5 0 0 3 width - -;
+#X obj 185 306 bng 15 250 50 0 empty empty end_reached 20 7 0 10 -262144
+-1 -1;
+#X floatatom 176 260 5 0 10000 1 frame# - -;
+#X obj 130 149 openpanel;
+#X msg 130 169 open \$1;
+#X msg 136 212 auto \$1;
+#X obj 136 194 tgl 15 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1
+;
+#X msg 147 236 colorspace Grey;
+#X floatatom 227 349 5 0 0 0 - - -;
+#X obj 118 278 pix_film;
+#X obj 118 385 pix_texture;
+#X text 14 58 You can also uses videos as textures:;
+#X obj 118 435 cuboid 4 3 3;
+#X obj 118 410 translateXYZ 0 0 -3;
+#X msg 182 278 0;
+#X connect 3 0 17 0;
+#X connect 4 0 11 0;
+#X connect 6 0 7 0;
+#X connect 6 1 8 0;
+#X connect 6 2 16 0;
+#X connect 10 0 17 1;
+#X connect 11 0 12 0;
+#X connect 12 0 17 0;
+#X connect 13 0 17 0;
+#X connect 14 0 13 0;
+#X connect 15 0 17 0;
+#X connect 17 0 18 0;
+#X connect 17 1 6 0;
+#X connect 17 2 9 0;
+#X connect 17 2 22 0;
+#X connect 18 0 21 0;
+#X connect 21 0 20 0;
+#X connect 22 0 17 1;
diff --git a/doc/tutorials/visual/14.live_video.pd b/doc/tutorials/visual/14.live_video.pd
new file mode 100644
index 0000000000000000000000000000000000000000..18f2261e3c00443bb9bda3b00411bd71749869d1
--- /dev/null
+++ b/doc/tutorials/visual/14.live_video.pd
@@ -0,0 +1,47 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty live_video 20 12 0 24 -228992
+-66577 0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 6 76 gemhead;
+#X msg 143 139 freq 1234;
+#X msg 145 210 dimen 256 256;
+#X msg 145 230 dimen 64 64;
+#X msg 141 62 mode NTSC;
+#X msg 142 88 channel 2;
+#X obj 6 417 rectangle 4 3;
+#X msg 145 190 dimen 256 128;
+#X obj 6 393 pix_texture;
+#X text 223 83 depending on your capture-device you can switch between
+(e.g) Tuner \, COMPOSITE & S-VHS;
+#X text 211 63 defaults to PAL;
+#X text 221 141 set the frequency for the TV-Tuner;
+#X text 260 194 various dimension (might not work on your specific
+capture-device);
+#X obj 6 366 pix_video;
+#X msg 145 271 colorspace RGBA;
+#X text 263 271 could be RGBA \, YUV or Grey;
+#X msg 148 312 device 0;
+#X msg 148 342 driver 0;
+#X text 262 313 switch between capture-cards;
+#X text 252 343 switch between drivers (e.g: v4l and ieee1394);
+#X msg 150 380 enumerate;
+#X text 248 379 list all devices to the console;
+#X msg 156 422 dialog;
+#X text 222 423 configure the device via a pop-up dialog (on Windows(r))
+;
+#X connect 3 0 16 0;
+#X connect 4 0 16 0;
+#X connect 5 0 16 0;
+#X connect 6 0 16 0;
+#X connect 7 0 16 0;
+#X connect 8 0 16 0;
+#X connect 10 0 16 0;
+#X connect 11 0 9 0;
+#X connect 16 0 11 0;
+#X connect 17 0 16 0;
+#X connect 19 0 16 0;
+#X connect 20 0 16 0;
+#X connect 23 0 16 0;
+#X connect 25 0 16 0;
diff --git a/doc/tutorials/visual/15.pixel_processing.pd b/doc/tutorials/visual/15.pixel_processing.pd
new file mode 100644
index 0000000000000000000000000000000000000000..71cafdb8013ad87649ceb0bd952741e1096ce373
--- /dev/null
+++ b/doc/tutorials/visual/15.pixel_processing.pd
@@ -0,0 +1,45 @@
+#N canvas 10 40 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty pixel_processing 20 12 0 24 -228992
+-66577 0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X text 13 65 There is a very wide range of pixel-based effects in
+Gem. These objects start with the "pix_" prefix. You can see a list
+of them in the Help Browser \, in "5.reference->Gem" \, then scroll
+down to the objects starting with "pix_".;
+#X obj 92 170 gemhead;
+#X obj 92 379 square 3;
+#X obj 92 357 pix_texture;
+#X obj 92 249 pix_film;
+#X obj 156 249 t f;
+#X obj 105 192 bng 25 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
+-1;
+#N canvas 10 40 620 460 open 0;
+#X obj 85 49 inlet;
+#X obj 85 237 outlet;
+#X obj 85 145 openpanel;
+#X msg 85 179 open \$1;
+#X msg 259 213 auto 1;
+#X obj 268 179 loadbang;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X restore 105 221 pd open;
+#X obj 92 325 pix_motionblur;
+#X text 14 132 Here's an example of one effect:;
+#X obj 190 299 hsl 128 15 0 1 0 0 empty empty amount 8 8 1 12 -262144
+-1 -1 0 1;
+#X floatatom 203 323 5 0 0 0 - - -;
+#X connect 4 0 7 0;
+#X connect 6 0 5 0;
+#X connect 7 0 11 0;
+#X connect 7 2 8 0;
+#X connect 8 0 7 1;
+#X connect 9 0 10 0;
+#X connect 10 0 7 0;
+#X connect 11 0 6 0;
+#X connect 13 0 11 1;
+#X connect 13 0 14 0;
diff --git a/doc/tutorials/visual/16.Exercise-pix_effects.pd b/doc/tutorials/visual/16.Exercise-pix_effects.pd
new file mode 100644
index 0000000000000000000000000000000000000000..00388b9bee5d15d08fb4a79ece6d4cd67992c0bc
--- /dev/null
+++ b/doc/tutorials/visual/16.Exercise-pix_effects.pd
@@ -0,0 +1,8 @@
+#N canvas 10 40 624 464 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty exercise 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X text 11 63 Start with a image \, movie \, or live video and add
+some pixel effects of your choosing.;
diff --git a/doc/tutorials/visual/17.tracking.pd b/doc/tutorials/visual/17.tracking.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0cef535b06d5c24d20eda63fdee067bfbf0dc2ef
--- /dev/null
+++ b/doc/tutorials/visual/17.tracking.pd
@@ -0,0 +1,147 @@
+#N canvas 146 22 620 460 10;
+#X declare -lib Gem;
+#X obj 8 10 cnv 15 400 40 empty empty tracking 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
+#X obj 179 223 pix_grey;
+#X msg 204 251 reset;
+#X obj 179 280 pix_background;
+#X msg 272 259 \$1 \$1 \$1;
+#X obj 123 316 pix_blob;
+#N canvas 10 40 620 460 cursor 0;
+#X obj 17 14 inlet;
+#X obj 89 18 inlet;
+#X obj 101 346 translateXYZ;
+#X text 63 148 0.64;
+#X text 37 151 1;
+#X obj 23 63 t f f;
+#X obj 37 176 -;
+#X text 62 177 X-Range;
+#X text 196 176 Y-Range;
+#X obj 63 240 expr (8/$f1);
+#X obj 33 241 -;
+#X obj 51 267 *;
+#X obj 29 95 max 0;
+#X obj 71 95 min 10;
+#X obj 59 132 f;
+#X obj 33 131 f;
+#X obj 52 293 - 4;
+#X text 193 146 0.64;
+#X text 167 149 1;
+#X obj 153 61 t f f;
+#X obj 167 174 -;
+#X obj 193 238 expr (8/$f1);
+#X obj 163 239 -;
+#X obj 181 265 *;
+#X obj 159 93 max 0;
+#X obj 201 93 min 10;
+#X obj 189 130 f;
+#X obj 163 129 f;
+#X text 188 171 comment;
+#X obj 154 298 expr (-1*$f1)+4;
+#X obj 293 27 inlet;
+#X obj 283 63 * 10;
+#X obj 94 320 gemhead 15;
+#X obj 157 509 circle 0.1;
+#X obj 17 423 separator;
+#X obj 87 423 separator;
+#X obj 17 484 rectangle 0.2 0.01;
+#X obj 157 423 separator;
+#X msg 185 478 draw line;
+#X obj 185 457 loadbang;
+#X obj 77 386 colorRGB 1 0 0 1;
+#X obj 17 462 rectangle 0.01 0.2;
+#X msg 256 478 width \$1;
+#X obj 296 342 int;
+#X obj 275 413 + 1;
+#X connect 0 0 5 0;
+#X connect 1 0 19 0;
+#X connect 2 0 40 0;
+#X connect 5 0 10 0;
+#X connect 5 0 12 0;
+#X connect 5 1 13 0;
+#X connect 6 0 9 0;
+#X connect 9 0 11 1;
+#X connect 10 0 11 0;
+#X connect 11 0 16 0;
+#X connect 12 0 15 0;
+#X connect 13 0 14 0;
+#X connect 14 0 6 1;
+#X connect 14 0 10 1;
+#X connect 14 0 13 1;
+#X connect 15 0 6 0;
+#X connect 15 0 12 1;
+#X connect 16 0 2 1;
+#X connect 19 0 22 0;
+#X connect 19 0 24 0;
+#X connect 19 1 25 0;
+#X connect 20 0 21 0;
+#X connect 21 0 23 1;
+#X connect 22 0 23 0;
+#X connect 23 0 29 0;
+#X connect 24 0 27 0;
+#X connect 25 0 26 0;
+#X connect 26 0 20 1;
+#X connect 26 0 22 1;
+#X connect 26 0 25 1;
+#X connect 27 0 20 0;
+#X connect 27 0 24 1;
+#X connect 29 0 2 2;
+#X connect 30 0 31 0;
+#X connect 31 0 33 1;
+#X connect 31 0 43 0;
+#X connect 32 0 2 0;
+#X connect 34 0 41 0;
+#X connect 35 0 36 0;
+#X connect 37 0 33 0;
+#X connect 38 0 33 0;
+#X connect 39 0 38 0;
+#X connect 40 0 34 0;
+#X connect 40 0 35 0;
+#X connect 40 0 37 0;
+#X connect 42 0 33 0;
+#X connect 43 0 44 0;
+#X connect 44 0 42 0;
+#X restore 137 348 pd cursor;
+#X obj 392 163 separator;
+#X obj 392 184 pix_texture;
+#X obj 392 205 square 4;
+#X obj 378 368 pix_texture;
+#X obj 179 200 separator;
+#X obj 378 348 alpha;
+#X obj 378 328 colourRGB 1 1 1 0.65;
+#X obj 378 388 translateXYZ -2.4 -2.4 0;
+#X obj 378 408 square 1.5;
+#X obj 337 98 gemhead 10;
+#X obj 337 119 pix_video;
+#X text 376 309 Show pix_background output;
+#X text 136 369 Show centroid/size;
+#X text 368 257 Set noise threshold;
+#X text 391 145 Render source video;
+#X obj 275 237 hsl 128 15 0 1 0 1 empty empty empty -2 -8 0 10 -262130
+-1 -1 1200 1;
+#X floatatom 331 259 5 0 0 0 - - -;
+#X text 21 64 1) make sure no one is in the camera picture;
+#X text 21 84 2) click the [reset( message;
+#X text 21 104 3) set the noise threshold for best results;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 5 0 15 0;
+#X connect 6 0 5 1;
+#X connect 7 1 8 0;
+#X connect 7 2 8 1;
+#X connect 7 3 8 2;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 12 0 16 0;
+#X connect 13 0 3 0;
+#X connect 14 0 12 0;
+#X connect 15 0 14 0;
+#X connect 16 0 17 0;
+#X connect 18 0 19 0;
+#X connect 19 0 9 0;
+#X connect 19 0 13 0;
+#X connect 24 0 25 0;
+#X connect 24 0 6 0;
diff --git a/doc/tutorials/visual/TEMPLATE.pd b/doc/tutorials/visual/TEMPLATE.pd
new file mode 100644
index 0000000000000000000000000000000000000000..249560835bacccf253ec80f005e43f8179c89805
--- /dev/null
+++ b/doc/tutorials/visual/TEMPLATE.pd
@@ -0,0 +1,5 @@
+#N canvas 10 40 620 460 10;
+#X obj 8 10 cnv 15 400 40 empty empty TEMPLATE 20 12 0 24 -228992 -66577
+0;
+#X obj 465 16 gemwin_control;
+#X obj 466 60 import Gem;
diff --git a/doc/tutorials/visual/ch_gemwin.pd b/doc/tutorials/visual/ch_gemwin.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1ebbb4262945c3effa24f328db43d0233b463883
--- /dev/null
+++ b/doc/tutorials/visual/ch_gemwin.pd
@@ -0,0 +1,170 @@
+#N canvas 0 0 796 617 10;
+#X obj 285 171 f;
+#X obj 206 152 spigot;
+#X obj 267 143 sel 0 1;
+#X obj 237 124 t f f;
+#X obj 206 200 -;
+#X obj 206 249 +;
+#X obj 267 213 f;
+#X obj 159 168 f;
+#X obj 80 149 spigot;
+#X obj 141 140 sel 0 1;
+#X obj 111 121 t f f;
+#X obj 80 200 -;
+#X obj 80 249 +;
+#X obj 141 210 f;
+#X obj 406 162 f;
+#X obj 327 146 spigot;
+#X obj 388 137 sel 0 1;
+#X obj 358 118 t f f;
+#X obj 327 197 -;
+#X obj 388 207 f;
+#X obj 80 465 * 4;
+#X obj 135 467 * 4;
+#X obj 156 308 t b f;
+#X obj 94 372 cos;
+#X obj 106 430 * 1;
+#X obj 80 430 * 1;
+#X obj 132 373 sin;
+#X obj 107 466 * 4;
+#X obj 94 394 t b f;
+#X obj 94 348 / 200;
+#X obj 80 491 pack f f f;
+#X obj 458 49 gemmouse;
+#X obj 515 135 t b f;
+#X obj 515 164 |;
+#X obj 487 240 gemhead;
+#X obj 491 193 loadbang;
+#X msg 487 215 0;
+#X obj 487 315 curve 2;
+#X obj 487 266 color 1 0 0;
+#X obj 571 240 gemhead;
+#X obj 571 315 curve 2;
+#X obj 651 242 gemhead;
+#X obj 651 317 curve 2;
+#X msg 524 289 3 0 0;
+#X msg 608 289 0 3 0;
+#X msg 688 291 0 0 3;
+#X msg 80 516 view \$1 \$2 \$3 0 0 0 0 1 0;
+#X obj 571 266 color 0 1 0;
+#X obj 651 268 color 0 0 1;
+#X obj 80 308 sin;
+#X obj 106 309 cos;
+#X obj 327 246 + 200;
+#X obj 157 282 / 50;
+#X obj 80 283 / -200;
+#X obj 18 12 inlet;
+#X obj 20 579 outlet;
+#X obj 21 551 gemwin \$1;
+#X obj 60 14 inlet;
+#X obj 215 19 inlet;
+#X obj 132 15 inlet;
+#X obj 213 44 * 5;
+#X obj 59 82 / 127;
+#X obj 60 61 * 400;
+#X obj 131 82 / 127;
+#X obj 131 58 * 200;
+#X obj 131 36 * -3.14;
+#X obj 60 37 * 3.14;
+#X connect 0 0 4 1;
+#X connect 1 0 4 0;
+#X connect 2 0 6 0;
+#X connect 2 1 0 0;
+#X connect 3 0 1 1;
+#X connect 3 1 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 5 0 29 0;
+#X connect 6 0 5 1;
+#X connect 7 0 11 1;
+#X connect 8 0 11 0;
+#X connect 9 0 13 0;
+#X connect 9 1 7 0;
+#X connect 10 0 8 1;
+#X connect 10 1 9 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 1;
+#X connect 12 0 53 0;
+#X connect 13 0 12 1;
+#X connect 14 0 18 1;
+#X connect 15 0 18 0;
+#X connect 16 0 19 0;
+#X connect 16 1 14 0;
+#X connect 17 0 15 1;
+#X connect 17 1 16 0;
+#X connect 18 0 51 0;
+#X connect 19 0 51 1;
+#X connect 20 0 30 0;
+#X connect 21 0 30 2;
+#X connect 22 0 21 0;
+#X connect 22 0 20 0;
+#X connect 22 0 27 0;
+#X connect 22 1 21 1;
+#X connect 22 1 20 1;
+#X connect 22 1 27 1;
+#X connect 23 0 28 0;
+#X connect 24 0 21 0;
+#X connect 25 0 20 0;
+#X connect 26 0 27 0;
+#X connect 27 0 30 1;
+#X connect 28 0 24 0;
+#X connect 28 0 25 0;
+#X connect 28 1 24 1;
+#X connect 28 1 25 1;
+#X connect 29 0 23 0;
+#X connect 29 0 26 0;
+#X connect 30 0 46 0;
+#X connect 31 0 8 0;
+#X connect 31 0 7 1;
+#X connect 31 1 1 0;
+#X connect 31 1 0 1;
+#X connect 31 1 14 1;
+#X connect 31 1 15 0;
+#X connect 31 2 3 0;
+#X connect 31 2 10 0;
+#X connect 31 2 33 0;
+#X connect 31 3 17 0;
+#X connect 31 3 32 0;
+#X connect 32 0 33 0;
+#X connect 32 1 33 1;
+#X connect 33 0 34 0;
+#X connect 33 0 39 0;
+#X connect 33 0 41 0;
+#X connect 34 0 38 0;
+#X connect 35 0 36 0;
+#X connect 35 0 43 0;
+#X connect 35 0 44 0;
+#X connect 35 0 45 0;
+#X connect 35 0 53 0;
+#X connect 35 0 51 0;
+#X connect 36 0 34 0;
+#X connect 36 0 39 0;
+#X connect 36 0 41 0;
+#X connect 38 0 37 0;
+#X connect 39 0 47 0;
+#X connect 41 0 48 0;
+#X connect 43 0 37 2;
+#X connect 44 0 40 2;
+#X connect 45 0 42 2;
+#X connect 46 0 56 0;
+#X connect 47 0 40 0;
+#X connect 48 0 42 0;
+#X connect 49 0 25 0;
+#X connect 50 0 24 0;
+#X connect 51 0 19 1;
+#X connect 51 0 52 0;
+#X connect 52 0 22 0;
+#X connect 53 0 49 0;
+#X connect 53 0 50 0;
+#X connect 54 0 56 0;
+#X connect 56 0 55 0;
+#X connect 57 0 66 0;
+#X connect 58 0 60 0;
+#X connect 59 0 65 0;
+#X connect 60 0 52 0;
+#X connect 61 0 53 0;
+#X connect 62 0 61 0;
+#X connect 63 0 29 0;
+#X connect 64 0 63 0;
+#X connect 65 0 64 0;
+#X connect 66 0 62 0;
diff --git a/doc/tutorials/visual/gemwin_control-help.pd b/doc/tutorials/visual/gemwin_control-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6405963d4622c80f4915e02becea2906da59c011
--- /dev/null
+++ b/doc/tutorials/visual/gemwin_control-help.pd
@@ -0,0 +1,5 @@
+#N canvas 584 136 494 414 10;
+#X declare -lib Gem;
+#X text 55 51 control the gemwin and rendering \, and see status;
+#X obj 67 130 gemwin_control;
+#X obj 241 129 gemwin_control;
diff --git a/doc/tutorials/visual/gemwin_control.pd b/doc/tutorials/visual/gemwin_control.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0662738d49245d040d1e05ceeedbf687e3189c08
--- /dev/null
+++ b/doc/tutorials/visual/gemwin_control.pd
@@ -0,0 +1,149 @@
+#N canvas 224 95 721 590 10;
+#X obj 18 17 inlet;
+#X text 66 16 options pass-thru;
+#X obj 16 528 outlet;
+#X text 72 528 pass-thru;
+#X obj 17 503 ch_gemwin \$1;
+#X obj 386 467 send GLOBAL_GEMWIN_CONTROL;
+#X obj 101 103 cnv 15 128 22 empty GLOBAL_GEMWIN_CONTROL_CANVAS gemwin
+3 5 0 14 -233017 -33289 0;
+#X obj 200 102 tgl 17 0 \$0-render_toggle THIS_IS_TO_MAKE_THE_INLET_DISAPPEAR
+render -6 21 1 9 -233017 -33289 -33289 0 1;
+#X obj 159 102 tgl 17 0 \$0-window_toggle THIS_IS_TO_MAKE_THE_INLET_DISAPPEAR
+window -6 21 1 9 -233017 -33289 -33289 0 1;
+#X obj 155 49 receive GLOBAL_GEMWIN_CONTROL;
+#N canvas 77 396 766 363 window 0;
+#X obj 56 126 select 0;
+#X obj 107 146 bang;
+#X msg 107 166 reset \, create;
+#X msg 228 164 window set \$1;
+#X obj 321 115 select 0 1;
+#X msg 354 136 76;
+#X msg 321 136 10;
+#X msg 331 163 window color \$1 12 12;
+#X obj 93 235 outlet;
+#X obj 460 273 outlet;
+#X obj 58 6 inlet;
+#X text 106 7 window status;
+#X msg 527 164 render 0;
+#X obj 557 3 inlet;
+#X text 602 3 render status;
+#X obj 527 92 float;
+#X obj 58 47 trigger float bang;
+#X obj 58 28 route float;
+#X obj 527 143 select 1;
+#X text 488 66 turn off rendering \, if on;
+#X msg 27 166 destroy;
+#X text 146 26 TODO: don't receive message if status is the same;
+#X obj 527 118 change;
+#X connect 0 0 20 0;
+#X connect 0 1 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 8 0;
+#X connect 3 0 9 0;
+#X connect 4 0 6 0;
+#X connect 4 1 5 0;
+#X connect 5 0 7 0;
+#X connect 6 0 7 0;
+#X connect 7 0 9 0;
+#X connect 10 0 17 0;
+#X connect 12 0 9 0;
+#X connect 13 0 15 1;
+#X connect 15 0 22 0;
+#X connect 16 0 0 0;
+#X connect 16 0 4 0;
+#X connect 16 0 3 0;
+#X connect 16 1 15 0;
+#X connect 17 0 16 0;
+#X connect 18 0 12 0;
+#X connect 20 0 8 0;
+#X connect 22 0 18 0;
+#X restore 76 369 pd window logic;
+#X obj 41 153 receive \$0-window_toggle;
+#N canvas 472 123 678 374 render 0;
+#X obj 253 118 select 0 1;
+#X msg 286 149 76;
+#X msg 253 149 10;
+#X msg 138 187 render set \$1;
+#X msg 291 187 render color \$1 12 12;
+#X obj 23 286 outlet;
+#X text 75 288 to gemwin;
+#X obj 377 280 outlet;
+#X obj 160 10 inlet;
+#X text 206 10 render status;
+#X text 545 8 window status;
+#X obj 498 8 inlet;
+#X msg 468 184 window 1;
+#X obj 469 101 float;
+#X text 430 75 create window \, if not created;
+#X obj 469 152 select 0;
+#X obj 160 30 route float;
+#X obj 161 58 trigger float bang;
+#X msg 223 307 \; GLOBAL_GEMWIN_CONTROL_CANVAS color \$1 12 12;
+#X obj 469 128 change;
+#X obj 381 128 purepd/once;
+#X connect 0 0 2 0;
+#X connect 0 1 1 0;
+#X connect 1 0 4 0;
+#X connect 1 0 18 0;
+#X connect 2 0 4 0;
+#X connect 2 0 18 0;
+#X connect 3 0 7 0;
+#X connect 4 0 7 0;
+#X connect 8 0 16 0;
+#X connect 11 0 13 1;
+#X connect 12 0 7 0;
+#X connect 13 0 19 0;
+#X connect 15 0 12 0;
+#X connect 16 0 17 0;
+#X connect 17 0 3 0;
+#X connect 17 0 0 0;
+#X connect 17 0 5 0;
+#X connect 17 1 13 0;
+#X connect 17 1 20 0;
+#X connect 19 0 15 0;
+#X connect 20 0 12 0;
+#X restore 300 369 pd render logic;
+#X obj 313 153 receive \$0-render_toggle;
+#X obj 155 72 route window render status;
+#X obj 301 230 float;
+#X obj 76 233 float;
+#X obj 263 153 bang;
+#X msg 529 250 status;
+#X obj 414 203 loadbang;
+#X obj 300 296 spigot 0;
+#X obj 77 296 spigot 0;
+#X obj 414 224 trigger bang bang;
+#X msg 414 250 1;
+#X text 354 187 first get status from existing objects;
+#X obj 76 255 change;
+#X obj 301 251 change;
+#X connect 0 0 4 0;
+#X connect 4 0 2 0;
+#X connect 9 0 14 0;
+#X connect 10 0 4 0;
+#X connect 10 1 5 0;
+#X connect 11 0 16 0;
+#X connect 12 0 4 0;
+#X connect 12 1 5 0;
+#X connect 13 0 15 0;
+#X connect 14 0 8 0;
+#X connect 14 1 7 0;
+#X connect 14 2 17 0;
+#X connect 15 0 26 0;
+#X connect 16 0 25 0;
+#X connect 17 0 15 0;
+#X connect 17 0 16 0;
+#X connect 18 0 5 0;
+#X connect 19 0 22 0;
+#X connect 20 0 12 0;
+#X connect 20 0 10 1;
+#X connect 21 0 10 0;
+#X connect 21 0 12 1;
+#X connect 22 0 23 0;
+#X connect 22 1 18 0;
+#X connect 23 0 20 1;
+#X connect 23 0 21 1;
+#X connect 25 0 21 0;
+#X connect 26 0 20 0;
+#X coords 0 -1 1 1 130 28 1 100 100;