aboutsummaryrefslogtreecommitdiff
path: root/desiredata/doc/3.audio.examples
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2008-02-08 13:00:32 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2008-02-08 13:00:32 +0000
commit4d84d14ac1aa13958eaa2971b03f7f929a519105 (patch)
tree6579d3f2cea5410a10c4baac8d0f372fb0dff372 /desiredata/doc/3.audio.examples
parentb334d38aefbd8e0e159d7af6c20d63c5d2b64859 (diff)
reorganized
svn path=/trunk/; revision=9400
Diffstat (limited to 'desiredata/doc/3.audio.examples')
-rw-r--r--desiredata/doc/3.audio.examples/A00.intro.pd10
-rw-r--r--desiredata/doc/3.audio.examples/A00.intro.txt9
-rw-r--r--desiredata/doc/3.audio.examples/A01.sinewave.pd32
-rw-r--r--desiredata/doc/3.audio.examples/A02.amplitude.pd37
-rw-r--r--desiredata/doc/3.audio.examples/A03.line.pd55
-rw-r--r--desiredata/doc/3.audio.examples/A04.line2.pd59
-rw-r--r--desiredata/doc/3.audio.examples/A05.output.subpatch.pd30
-rw-r--r--desiredata/doc/3.audio.examples/A06.frequency.pd60
-rw-r--r--desiredata/doc/3.audio.examples/A07.frequency.mod.pd54
-rw-r--r--desiredata/doc/3.audio.examples/A08.review.pd41
-rw-r--r--desiredata/doc/3.audio.examples/B01.wavetables.pd50
-rw-r--r--desiredata/doc/3.audio.examples/B02.two-wavetables.pd147
-rw-r--r--desiredata/doc/3.audio.examples/B03.tabread4.pd130
-rw-r--r--desiredata/doc/3.audio.examples/B04.tabread4.interpolation.pd44
-rw-r--r--desiredata/doc/3.audio.examples/B05.tabread.FM.pd107
-rw-r--r--desiredata/doc/3.audio.examples/B06.table.switching.pd127
-rw-r--r--desiredata/doc/3.audio.examples/B07.sampler.pd52
-rw-r--r--desiredata/doc/3.audio.examples/B08.sampler.loop.pd64
-rw-r--r--desiredata/doc/3.audio.examples/B09.sampler.loop.smooth.pd72
-rw-r--r--desiredata/doc/3.audio.examples/B10.sampler.scratch.pd83
-rw-r--r--desiredata/doc/3.audio.examples/B11.sampler.nodoppler.pd85
-rw-r--r--desiredata/doc/3.audio.examples/B12.sampler.transpose.pd109
-rw-r--r--desiredata/doc/3.audio.examples/B13.sampler.overlap.pd158
-rw-r--r--desiredata/doc/3.audio.examples/B14.sampler.rockafella.pd166
-rw-r--r--desiredata/doc/3.audio.examples/C01.nyquist.pd102
-rw-r--r--desiredata/doc/3.audio.examples/C02.sawtooth-foldover.pd39
-rw-r--r--desiredata/doc/3.audio.examples/C03.zipper.noise.pd55
-rw-r--r--desiredata/doc/3.audio.examples/C04.control.to.signal.pd48
-rw-r--r--desiredata/doc/3.audio.examples/C05.sampler.oneshot.pd84
-rw-r--r--desiredata/doc/3.audio.examples/C06.signal.to.control.pd25
-rw-r--r--desiredata/doc/3.audio.examples/C07.envelope.follower.pd113
-rw-r--r--desiredata/doc/3.audio.examples/C08.analog.sequencer.pd156
-rw-r--r--desiredata/doc/3.audio.examples/C09.sample.hold.pd104
-rw-r--r--desiredata/doc/3.audio.examples/C10.monophonic.synth.pd107
-rw-r--r--desiredata/doc/3.audio.examples/D01.envelope.gen.pd50
-rw-r--r--desiredata/doc/3.audio.examples/D02.adsr.pd42
-rw-r--r--desiredata/doc/3.audio.examples/D03.envelope.dB.pd100
-rw-r--r--desiredata/doc/3.audio.examples/D04.envelope.quartic.pd81
-rw-r--r--desiredata/doc/3.audio.examples/D05.envelope.pitch.pd153
-rw-r--r--desiredata/doc/3.audio.examples/D06.envelope.portamento.pd148
-rw-r--r--desiredata/doc/3.audio.examples/D07.additive.pd50
-rw-r--r--desiredata/doc/3.audio.examples/D08.table.spectrum.pd91
-rw-r--r--desiredata/doc/3.audio.examples/D09.shepard.tone.pd108
-rw-r--r--desiredata/doc/3.audio.examples/D10.sampler.notes.pd263
-rw-r--r--desiredata/doc/3.audio.examples/D11.sampler.poly.pd175
-rw-r--r--desiredata/doc/3.audio.examples/D12.sampler.bis.pd203
-rw-r--r--desiredata/doc/3.audio.examples/D13.additive.qlist.pd47
-rw-r--r--desiredata/doc/3.audio.examples/D14.vibrato.pd104
-rw-r--r--desiredata/doc/3.audio.examples/E01.spectrum.pd179
-rw-r--r--desiredata/doc/3.audio.examples/E02.ring.modulation.pd197
-rw-r--r--desiredata/doc/3.audio.examples/E03.octave.divider.pd141
-rw-r--r--desiredata/doc/3.audio.examples/E04.difference.tone.pd45
-rw-r--r--desiredata/doc/3.audio.examples/E05.chebychev.pd257
-rw-r--r--desiredata/doc/3.audio.examples/E06.exponential.pd335
-rw-r--r--desiredata/doc/3.audio.examples/E07.evenodd.pd109
-rw-r--r--desiredata/doc/3.audio.examples/E08.phase.mod.pd196
-rw-r--r--desiredata/doc/3.audio.examples/E09.FM.spectrum.pd139
-rw-r--r--desiredata/doc/3.audio.examples/E10.complex.FM.pd156
-rw-r--r--desiredata/doc/3.audio.examples/F01.pulse.pd82
-rw-r--r--desiredata/doc/3.audio.examples/F02.just.say.pd152
-rw-r--r--desiredata/doc/3.audio.examples/F03.pulse.spectrum.pd126
-rw-r--r--desiredata/doc/3.audio.examples/F04.waveshaping.pulse.pd133
-rw-r--r--desiredata/doc/3.audio.examples/F05.ring.modulation.pd160
-rw-r--r--desiredata/doc/3.audio.examples/F06.packets.pd117
-rw-r--r--desiredata/doc/3.audio.examples/F07.packet.spectrum.pd147
-rw-r--r--desiredata/doc/3.audio.examples/F08.two.cosines.pd70
-rw-r--r--desiredata/doc/3.audio.examples/F09.declickit.pd94
-rw-r--r--desiredata/doc/3.audio.examples/F10.sweepable.FM.pd152
-rw-r--r--desiredata/doc/3.audio.examples/F11.anharmonic.FM.pd126
-rw-r--r--desiredata/doc/3.audio.examples/F12.paf.pd226
-rw-r--r--desiredata/doc/3.audio.examples/F13.paf.control.pd164
-rw-r--r--desiredata/doc/3.audio.examples/G01.delay.pd48
-rw-r--r--desiredata/doc/3.audio.examples/G02.delay.loop.pd44
-rw-r--r--desiredata/doc/3.audio.examples/G03.delay.variable.pd77
-rw-r--r--desiredata/doc/3.audio.examples/G04.control.blocksize.pd79
-rw-r--r--desiredata/doc/3.audio.examples/G05.execution.order.pd79
-rw-r--r--desiredata/doc/3.audio.examples/G06.octave.doubler.pd114
-rw-r--r--desiredata/doc/3.audio.examples/G07.shaker.pd80
-rw-r--r--desiredata/doc/3.audio.examples/G08.reverb.pd253
-rw-r--r--desiredata/doc/3.audio.examples/G09.pitchshift.pd162
-rw-r--r--desiredata/doc/3.audio.examples/H01.low-pass.pd185
-rw-r--r--desiredata/doc/3.audio.examples/H02.high-pass.pd173
-rw-r--r--desiredata/doc/3.audio.examples/H03.band-pass.pd57
-rw-r--r--desiredata/doc/3.audio.examples/H04.filter.sweep.pd58
-rw-r--r--desiredata/doc/3.audio.examples/H05.filter.floyd.pd132
-rw-r--r--desiredata/doc/3.audio.examples/H06.envelope.follower.pd86
-rw-r--r--desiredata/doc/3.audio.examples/H07.measure.spectrum.pd88
-rw-r--r--desiredata/doc/3.audio.examples/H08.heterodyning.pd85
-rw-r--r--desiredata/doc/3.audio.examples/H09.ssb.modulation.pd103
-rw-r--r--desiredata/doc/3.audio.examples/H10.measurement.pd90
-rw-r--r--desiredata/doc/3.audio.examples/H11.shelving.pd74
-rw-r--r--desiredata/doc/3.audio.examples/H12.peaking.pd112
-rw-r--r--desiredata/doc/3.audio.examples/H13.butterworth.pd74
-rw-r--r--desiredata/doc/3.audio.examples/H14.all.pass.pd85
-rw-r--r--desiredata/doc/3.audio.examples/H15.phaser.pd109
-rw-r--r--desiredata/doc/3.audio.examples/H16.adsr.filter.qlist.pd167
-rw-r--r--desiredata/doc/3.audio.examples/I01.Fourier.analysis.pd90
-rw-r--r--desiredata/doc/3.audio.examples/I02.Hann.window.pd181
-rw-r--r--desiredata/doc/3.audio.examples/I03.resynthesis.pd132
-rw-r--r--desiredata/doc/3.audio.examples/I04.noisegate.pd330
-rw-r--r--desiredata/doc/3.audio.examples/I05.compressor.pd237
-rw-r--r--desiredata/doc/3.audio.examples/I06.timbre.stamp.pd370
-rw-r--r--desiredata/doc/3.audio.examples/I07.phase.vocoder.pd548
-rw-r--r--desiredata/doc/3.audio.examples/I08.pvoc.reverb.pd421
-rw-r--r--desiredata/doc/3.audio.examples/I09.sheep.from.goats.pd411
-rw-r--r--desiredata/doc/3.audio.examples/I10.phase.bash.pd569
-rw-r--r--desiredata/doc/3.audio.examples/J01.even.odd.pd66
-rw-r--r--desiredata/doc/3.audio.examples/J02.trapezoids.pd84
-rw-r--r--desiredata/doc/3.audio.examples/J03.pulse.width.mod.pd48
-rw-r--r--desiredata/doc/3.audio.examples/J04.corners.pd112
-rw-r--r--desiredata/doc/3.audio.examples/J05.triangle.pd56
-rw-r--r--desiredata/doc/3.audio.examples/J06.enveloping.pd97
-rw-r--r--desiredata/doc/3.audio.examples/J07.oversampling.pd61
-rw-r--r--desiredata/doc/3.audio.examples/J08.classicsynth.pd135
-rw-r--r--desiredata/doc/3.audio.examples/J09.bandlimited.pd216
-rw-r--r--desiredata/doc/3.audio.examples/adsr.pd96
-rw-r--r--desiredata/doc/3.audio.examples/buttercoef3.pd80
-rw-r--r--desiredata/doc/3.audio.examples/butterworth3~.pd104
-rw-r--r--desiredata/doc/3.audio.examples/filter-graph1.pd84
-rw-r--r--desiredata/doc/3.audio.examples/filter-graph2.pd121
-rw-r--r--desiredata/doc/3.audio.examples/osc-voice.pd89
-rw-r--r--desiredata/doc/3.audio.examples/output~.pd66
-rw-r--r--desiredata/doc/3.audio.examples/partial.pd76
-rw-r--r--desiredata/doc/3.audio.examples/qlist-sampler.txt147
-rw-r--r--desiredata/doc/3.audio.examples/qlist.txt56
-rw-r--r--desiredata/doc/3.audio.examples/qlist2.txt5
-rw-r--r--desiredata/doc/3.audio.examples/reverb-echo.pd24
-rw-r--r--desiredata/doc/3.audio.examples/sampvoice.pd114
-rw-r--r--desiredata/doc/3.audio.examples/sampvoice2.pd122
-rw-r--r--desiredata/doc/3.audio.examples/shepvoice.pd47
-rw-r--r--desiredata/doc/3.audio.examples/sinevoice.pd67
-rw-r--r--desiredata/doc/3.audio.examples/spectrum-partial.pd57
132 files changed, 15865 insertions, 0 deletions
diff --git a/desiredata/doc/3.audio.examples/A00.intro.pd b/desiredata/doc/3.audio.examples/A00.intro.pd
new file mode 100644
index 00000000..69087781
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A00.intro.pd
@@ -0,0 +1,10 @@
+#N canvas 440 252 579 286 12;
+#X text 87 6 INTRODUCTION TO THE PD AUDIO EXAMPLE PATCHES;
+#X text 328 257 updated for Pd version 0.37;
+#X text 34 45 This is the second of three tutorial series on Pd. This
+one shows the time-domain audio processing features. (The first one
+showed how to use Pd to do "control" computations \, and the third
+is about frequency-domain techniques.);
+#X text 33 125 These patches are accompanied by an ONLINE BOOK:;
+#X text 100 158 http://www.crca.ucsd.edu/~msp/techniques.htm;
+#X text 37 189 which develops the underlying theory.;
diff --git a/desiredata/doc/3.audio.examples/A00.intro.txt b/desiredata/doc/3.audio.examples/A00.intro.txt
new file mode 100644
index 00000000..d982eedd
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A00.intro.txt
@@ -0,0 +1,9 @@
+This is the second of three tutorial series on Pd. This one shows the
+time-domain audio processing features. (The first one showed how to use Pd to
+do "control" computations, and the third is about frequency-domain techniques.)
+
+These patches are accompanied by an ONLINE BOOK:
+
+ http://www.crca.ucsd.edu/~msp/techniques.htm
+
+which develops the underlying theory.
diff --git a/desiredata/doc/3.audio.examples/A01.sinewave.pd b/desiredata/doc/3.audio.examples/A01.sinewave.pd
new file mode 100644
index 00000000..42b8aed0
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A01.sinewave.pd
@@ -0,0 +1,32 @@
+#N canvas 6 2 588 513 12;
+#X obj 108 109 osc~ 440;
+#X obj 108 168 dac~;
+#X text 187 111 <-- 440 Hz. sine wave at full blast;
+#X obj 108 138 *~ 0.05;
+#X text 202 3 MAKING A SINE WAVE;
+#X text 32 195 Audio computation can be turned on and off by sending
+messages to the global "pd" object as follows:;
+#X msg 98 239 \; pd dsp 1;
+#X msg 202 239 \; pd dsp 0;
+#X text 113 276 ON;
+#X text 222 276 OFF;
+#X text 29 297 You should see the Pd window change to reflect whether
+audio is on or off. You can also turn audio on and off using the "audio"
+menu \, but the buttons are provided as a shortcut.;
+#X text 30 368 When DSP is on \, you should hear a tone whose pitch
+is A 440 and whose amplitude is 0.05. If instead you are greeted with
+silence \, you might want to read the HTML documentation on setting
+up audio.;
+#X text 28 434 In general when you start a work session with Pd \,
+you will want to choose "test audio and MIDI" from the help window
+\, which opens a more comprehensive test patch than this one.;
+#X text 296 247 <-- click these;
+#X text 187 139 <-- reduce amplitude to 0.05;
+#X text 160 168 <----- send to the audio output device;
+#X text 32 23 Audio computation in Pd is done using "tilde objects"
+such as the three below. They use continuous audio streams to intercommunicate
+\, as well as communicating with other ("control") Pd objects using
+messages.;
+#X text 342 490 updated for Pd version 0.36;
+#X connect 0 0 3 0;
+#X connect 3 0 1 0;
diff --git a/desiredata/doc/3.audio.examples/A02.amplitude.pd b/desiredata/doc/3.audio.examples/A02.amplitude.pd
new file mode 100644
index 00000000..d24be18d
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A02.amplitude.pd
@@ -0,0 +1,37 @@
+#N canvas 73 190 702 512 12;
+#X obj 64 65 osc~ 440;
+#X obj 64 283 dac~;
+#X text 145 66 <-- 440 Hz. sine wave at full blast;
+#X msg 431 7 \; pd dsp 1;
+#X msg 514 7 \; pd dsp 0;
+#X text 456 45 ON;
+#X text 534 43 OFF;
+#X text 164 18 CONTROLLING AMPLITUDE;
+#X text 35 327 Amplitudes of audio signals can have any reasonable
+range \, but when you output a signal via the dac~ object \, the samples
+should range between -1 and +1. Values out of that range will be "clipped."
+;
+#X obj 64 202 *~ 0;
+#X floatatom 107 165 0 0 0 0 - - -;
+#X obj 95 132 dbtorms;
+#X floatatom 95 100 0 0 80 0 - - -;
+#X text 141 100 <-- set amplitude here in dB;
+#X text 211 133 <-- this converts dB to linear units;
+#X text 210 164 <-- this shows the linear gain;
+#X text 116 204 <-- multiply the sine wave by the gain \, reducing
+its amplitude. You can also use the "*~" object to multiply two signals.
+The "0" argument here instructs it that we'll just send it messages
+to set the multiplier.;
+#X text 35 396 Here we calculate a gain for the multiplier (*~) using
+a "dbtorms" object (acronym for "dB to RMS"). 100 dB is normalized
+to one \, and zero dB artificially outputs a true 0;
+#X text 34 452 Pd assumes you have a two channel audio system unless
+you tell it otherwise.;
+#X text 440 486 updated for Pd version 0.33;
+#X text 114 282 <-- and out. We're sending to both channels now.;
+#X connect 0 0 9 0;
+#X connect 9 0 1 0;
+#X connect 9 0 1 1;
+#X connect 11 0 9 1;
+#X connect 11 0 10 0;
+#X connect 12 0 11 0;
diff --git a/desiredata/doc/3.audio.examples/A03.line.pd b/desiredata/doc/3.audio.examples/A03.line.pd
new file mode 100644
index 00000000..392df533
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A03.line.pd
@@ -0,0 +1,55 @@
+#N canvas 369 106 647 598 12;
+#X obj 56 79 osc~ 440;
+#X obj 56 309 dac~;
+#X msg 446 79 \; pd dsp 1;
+#X msg 538 79 \; pd dsp 0;
+#X text 467 112 ON;
+#X text 555 112 OFF;
+#X obj 56 269 *~;
+#X obj 72 243 line~;
+#X text 129 243 <--- ramp generator;
+#X text 132 78 <-- sine wave;
+#X msg 72 103 0.1 2000;
+#X msg 72 177 0 2000;
+#X msg 72 125 0.1 50;
+#X msg 72 199 0 50;
+#X msg 72 147 0.1;
+#X msg 72 221 0;
+#X text 274 124 ON;
+#X text 154 105 <-- slow;
+#X text 144 126 <-- fast;
+#X text 111 146 <-- instantly;
+#X text 271 197 OFF;
+#X text 136 178 <-- slow;
+#X text 129 199 <-- fast;
+#X text 109 219 <-- instantly;
+#X text 112 161 ----------------------;
+#X text 97 308 <-- out;
+#X text 103 7 CONTROLLING AMPLITUDE USING LINE~;
+#X text 38 342 Line~'s left inlet is a target value \; it reaches that
+target in the time specified (in milliseconds) to its right inlet.
+;
+#X text 34 495 The line~ object (and its control brother \, line) treat
+their right inlet specially. The inlets don't retain values the way
+other inlets do but revert to zero whenever a target is received.;
+#X text 14 27 In this patch \, the multiplier is configured to multiply
+two signals. The amplitude is now a signal computed by the line~ object.
+;
+#X text 37 395 (In this example \, message boxes with two numbers each
+are connected to line~'s left inlet. Except in some special cases \,
+Pd objects with more than one inlet will automatically distribute lists
+of numbers across their inlets. In this case \, "0 50" becomes \, "50
+at right and 0 at left.");
+#X text 386 557 updated for Pd version 0.36;
+#X text 93 268 <-- multiply the sine wave by the ramp. There's no longer
+a "0" argument-- this tells Pd to expect a signal here.;
+#X connect 0 0 6 0;
+#X connect 6 0 1 0;
+#X connect 6 0 1 1;
+#X connect 7 0 6 1;
+#X connect 10 0 7 0;
+#X connect 11 0 7 0;
+#X connect 12 0 7 0;
+#X connect 13 0 7 0;
+#X connect 14 0 7 0;
+#X connect 15 0 7 0;
diff --git a/desiredata/doc/3.audio.examples/A04.line2.pd b/desiredata/doc/3.audio.examples/A04.line2.pd
new file mode 100644
index 00000000..c6dd1679
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A04.line2.pd
@@ -0,0 +1,59 @@
+#N canvas 30 68 949 754 12;
+#X obj 67 77 osc~ 440;
+#X obj 67 329 dac~;
+#X obj 67 242 *~;
+#X obj 86 180 line~;
+#X text 116 330 <-- out;
+#X text 124 9 LINES GRAPHED;
+#X text 24 33 Here again is a line~ controlling the amplitude of an
+osc~ \, but with the outputs graphed:;
+#X obj 149 89 r graphit;
+#X obj 151 179 r graphit;
+#X obj 151 246 r graphit;
+#X obj 86 149 r to-line;
+#X graph graph1 0 -1.02 44100 1.02 631 480 831 350;
+#X array product 44100 float 0;
+#X pop;
+#X graph graph1 0 -1.02 44100 1.02 631 150 831 20;
+#X array osc-output 44100 float 0;
+#X pop;
+#X graph graph1 0 -1.02 44100 1.02 631 315 831 185;
+#X array line-output 44100 float 0;
+#X pop;
+#X obj 149 119 tabwrite~ osc-output;
+#X obj 67 299 *~ 0.1;
+#X msg 38 401 \; pd dsp 1 \; to-line 0 \, 1 500 \; graphit bang;
+#X msg 210 401 \; pd dsp 1 \; to-line 1 \, 0 500 \; graphit bang;
+#X obj 151 209 tabwrite~ line-output;
+#X obj 151 276 tabwrite~ product;
+#X text 70 379 ramp up;
+#X text 235 378 ramp down;
+#X text 406 376 to 1/2;
+#X msg 375 400 \; pd dsp 1 \; to-line 0.5 1000 \; graphit bang;
+#X text 634 491 ------ 1 second ------;
+#X text 38 485 Click the message boxes above to try it. Note that in
+the first two boxes \, the line~ objects get two messages. The first
+one \, with no time value \, causes the line~ to jump immediately to
+the value. The third box takes line~'s previous value as a point of
+departure. What you see will depend on which box you last clicked and
+how long you waited between the two.;
+#X text 662 727 updated for Pd version 0.33;
+#X text 41 600 On most machines \, you will hear an interruption in
+the sound one second after you click on the first or third box. This
+is because the graphical updates are likely to eat more CPU time than
+your audio buffer has pre-buffered for. You can avoid this if you keep
+your graphs in sub-windows and open them only when you need them. In
+some future version of Pd this behavior will be improved. Until then
+\, you'll have to avoid having arrays getting re-drawn during music
+performances.;
+#X connect 0 0 2 0;
+#X connect 0 0 14 0;
+#X connect 2 0 15 0;
+#X connect 2 0 19 0;
+#X connect 3 0 2 1;
+#X connect 3 0 18 0;
+#X connect 7 0 14 0;
+#X connect 8 0 18 0;
+#X connect 9 0 19 0;
+#X connect 10 0 3 0;
+#X connect 15 0 1 0;
diff --git a/desiredata/doc/3.audio.examples/A05.output.subpatch.pd b/desiredata/doc/3.audio.examples/A05.output.subpatch.pd
new file mode 100644
index 00000000..d24fdba2
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A05.output.subpatch.pd
@@ -0,0 +1,30 @@
+#N canvas 300 159 635 486 12;
+#X text 261 20 CONTROLLING OUTPUT AMPLITUDE;
+#X obj 32 27 osc~ 440;
+#X obj 54 55 osc~ 550;
+#X obj 54 116 osc~ 660;
+#X obj 32 88 +~;
+#X obj 32 142 +~;
+#X text 108 177 <-- this is a subwindow--right click on it;
+#X text 149 197 and select "open" to see inside.;
+#X text 30 401 The output control automatically starts DSP whenever
+you touch the level control. Hitting "mute" toggles between the current
+level and zero.;
+#X obj 32 173 output~;
+#X text 383 463 updated for Pd version 0.36;
+#X text 143 115 <-- Here we make an A major triad as a test signal.
+;
+#X text 31 250 In this and subsequent patches \, we'll use a subwindow
+\, "output" \, to control overall amplitude. The amplitudes are in
+decibels \, with 100 being full blast. In this example \, you can't
+actually push the output amplitude past 90 or so without clipping.
+You'll know you're clipping if \, instead of an A major chord \, you
+hear a single \, distorted tone two octaves down. The clipping happens
+at Pd's last stage of audio output. Audio signals internal to Pd have
+essentially no level limit.;
+#X connect 1 0 4 0;
+#X connect 2 0 4 1;
+#X connect 3 0 5 1;
+#X connect 4 0 5 0;
+#X connect 5 0 9 0;
+#X connect 5 0 9 1;
diff --git a/desiredata/doc/3.audio.examples/A06.frequency.pd b/desiredata/doc/3.audio.examples/A06.frequency.pd
new file mode 100644
index 00000000..50cff7c0
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A06.frequency.pd
@@ -0,0 +1,60 @@
+#N canvas 8 17 693 642 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array osc-output 4410 float 0;
+#X coords 0 1.02 4410 -1.02 200 130 1;
+#X restore 473 167 graph;
+#X obj 98 261 tabwrite~ osc-output;
+#X msg 98 232 bang;
+#X floatatom 280 66 0 0 0 0 - - -;
+#X text 147 231 <-- click to graph;
+#X obj 15 206 r frequency;
+#X msg 280 37 set \$1;
+#X floatatom 6 66 0 0 0 0 - - -;
+#X obj 6 8 r frequency;
+#X msg 6 37 set \$1;
+#X obj 19 90 s frequency;
+#X obj 280 8 r pitch;
+#X obj 289 90 s pitch;
+#X obj 280 116 mtof;
+#X obj 280 145 s frequency;
+#X obj 6 145 s pitch;
+#X obj 6 116 ftom;
+#X text 105 66 <-- set frequency;
+#X text 372 65 <-- set MIDI pitch;
+#X text 15 429 Frequency and pitch are converted using the "ftom" and
+"mtof" objects. Frequency refers to the number of cycles per second.
+Pitch is "60" for Middle C \, 61 for C sharp \, 72 for the next C up
+\, and so on.;
+#X text 476 308 ---- 0.1 seconds ----;
+#X text 447 6 FREQUENCY AND PITCH;
+#X text 16 363 The osc~ object \, if you give it an argument \, expects
+floating-point messages to set its frequency. Without arguments \,
+its frequency is controlled by connecting an audio signal to its input.
+;
+#X text 14 496 Mtof and ftom work fine for microtones (non-integral
+"MIDI pitch" ) and don't have MIDI's range restriction-- for example
+\, MIDI -36 is about 1 Hz.;
+#X text 15 553 Note also the "set" messages going to the number boxes
+so that they can each update the other without bringing on an infinite
+loop. (get help on number boxes for details.);
+#X text 87 291 <-- output level;
+#X text 51 116 <-- convert frequency;
+#X text 106 134 to "MIDI" pitch;
+#X text 327 117 <-- convert "MIDI" pitch to frequency;
+#X obj 15 273 output~;
+#X text 437 619 updated for Pd version 0.36;
+#X obj 15 232 osc~;
+#X connect 2 0 1 0;
+#X connect 3 0 12 0;
+#X connect 3 0 13 0;
+#X connect 5 0 31 0;
+#X connect 6 0 3 0;
+#X connect 7 0 10 0;
+#X connect 7 0 16 0;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 11 0 6 0;
+#X connect 13 0 14 0;
+#X connect 16 0 15 0;
+#X connect 31 0 1 0;
+#X connect 31 0 29 0;
diff --git a/desiredata/doc/3.audio.examples/A07.frequency.mod.pd b/desiredata/doc/3.audio.examples/A07.frequency.mod.pd
new file mode 100644
index 00000000..aedb1cc1
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A07.frequency.mod.pd
@@ -0,0 +1,54 @@
+#N canvas 92 96 760 640 12;
+#X obj 259 168 *~;
+#X floatatom 259 83 0 0 0 0 - - -;
+#X floatatom 169 118 0 0 0 0 - - -;
+#X obj 169 188 +~;
+#N canvas 0 0 450 300 graph1 0;
+#X array fm-output 441 float 0;
+#X coords 0 1.02 440 -1.02 200 130 1;
+#X restore 527 40 graph;
+#X msg 244 228 bang;
+#X text 286 228 <-- click to graph;
+#X obj 244 252 tabwrite~ fm-output;
+#X floatatom 281 138 0 0 0 0 - - -;
+#X text 166 75 carrier;
+#X text 165 93 frequency;
+#X text 244 59 frequency;
+#X text 245 42 modulation;
+#X text 33 8 FREQUENCY MODULATION ("FM") USING TWO OSCILLATORS;
+#X obj 168 232 osc~;
+#X text 52 214 "carrier";
+#X text 34 232 oscillator -->;
+#X text 47 149 add modulator;
+#X text 46 167 to carrier;
+#X text 44 186 frequency -->;
+#X text 320 150 index;
+#X text 322 131 modulation;
+#X obj 259 108 osc~;
+#X text 531 172 --- 0.01 seconds ----;
+#X text 53 443 To get the FM sound \, set all three of carrier frequency
+\, modulation frequency \, and modulation index in the hundreds. Note
+that you get a timbral change as you sweep modulation index \, because
+this changes the amplitudes of the components of the output sound but
+not their frequencies.;
+#X obj 167 270 output~;
+#X text 489 613 updated for Pd version 0.37;
+#X text 54 332 This patch shows the classical FM synthesis technique
+developed by John Chowning. It's nothing but an oscillator with vibrato
+controlled by another "modulation" oscillator. First \, to understand
+the patch \, set carrier frequency to 400 or so \, modulation frequency
+between 5 and 10 \, and try modulation index values between 0 and 400
+\, say. You'll hear a sine wave with vibrato.;
+#X text 55 526 The component frequencies are equal to the carrier frequency
+\, plus or minus multiples of the modulator frequency. A more complete
+discussion of FM occurs in part 5 of this series.;
+#X connect 0 0 3 1;
+#X connect 1 0 22 0;
+#X connect 2 0 3 0;
+#X connect 3 0 14 0;
+#X connect 5 0 7 0;
+#X connect 8 0 0 1;
+#X connect 14 0 7 0;
+#X connect 14 0 25 0;
+#X connect 14 0 25 1;
+#X connect 22 0 0 0;
diff --git a/desiredata/doc/3.audio.examples/A08.review.pd b/desiredata/doc/3.audio.examples/A08.review.pd
new file mode 100644
index 00000000..9b190a19
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/A08.review.pd
@@ -0,0 +1,41 @@
+#N canvas 36 68 701 588 12;
+#X text 444 542 updated for Pd version 0.34;
+#X text 39 14 PART 1 REVIEW;
+#X obj 66 131 tabwrite~;
+#X obj 66 105 line~;
+#X obj 54 298 +;
+#X obj 66 79 +~;
+#X obj 66 209 cos~;
+#X obj 66 157 osc~;
+#X obj 66 183 phasor~;
+#X obj 54 324 pack;
+#X obj 52 511 r;
+#X obj 53 487 s;
+#X obj 54 408 inlet;
+#X obj 53 462 f;
+#X obj 53 436 t;
+#X obj 54 378 dbtorms;
+#X obj 97 351 mtof;
+#X obj 54 350 ftom;
+#X obj 105 408 outlet;
+#X obj 66 235 dac~;
+#X text 26 52 So far we've seen these audio ("tilde") objects:;
+#X text 123 104 -- ramp generator;
+#X text 157 131 -- sampler (which we've only used for graphing so far)
+;
+#X text 111 157 -- a cosine wave oscillator;
+#X text 139 183 -- phase generator for making your own oscillator;
+#X text 112 209 -- cosine waveshape lookup;
+#X text 112 236 -- audio output ("digital/analog converter" -- a misnomer)
+;
+#X text 31 266 ... and these "control" objects:;
+#X text 145 349 -- frequency to pitch conversion;
+#X text 126 378 -- decibel to amplitude conversion;
+#X text 167 409 -- input and output to a subpatch;
+#X text 90 437 ("trigger") -- message ordering and conversion;
+#X text 93 462 ("float") -- store a (floating point) number;
+#X text 90 488 ("send") -- wireless message sending;
+#X text 91 513 ("receive") ... and receiving;
+#X text 106 78 (etc.) -- arithmetic on audio signals;
+#X text 92 296 (etc.) -- arithmetic;
+#X text 99 323 -- combine two or more values in a single message;
diff --git a/desiredata/doc/3.audio.examples/B01.wavetables.pd b/desiredata/doc/3.audio.examples/B01.wavetables.pd
new file mode 100644
index 00000000..66549d3e
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B01.wavetables.pd
@@ -0,0 +1,50 @@
+#N canvas 19 22 722 608 12;
+#X floatatom 164 43 0 0 0 0 - - -;
+#N canvas 0 0 450 300 graph1 0;
+#X array table10 259 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.612 0.612 0.612 0.612 0.612 0.627692 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769
+-0.470769 -0.470769 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0.627692 0.627692 0.627692 0.643385 0.643385 0.643385
+0.659077 0 -0.502154 -0.502154 -0.502154 -0.486462 -0.486462 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0.580615 0.596308 0.596308 0.596308 0.596308
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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.02 258 -1.02 258 130 1;
+#X restore 445 47 graph;
+#X text 30 123 oscillator -->;
+#X text 456 587 updated for Pd version 0.34;
+#X text 33 8 WAVETABLE OSCILLATORS;
+#X text 36 106 wavetable;
+#X obj 164 70 mtof;
+#X floatatom 164 97 0 0 0 0 - - -;
+#X obj 164 123 tabosc4~ table10;
+#X text 94 42 pitch->;
+#X text 35 309 Note that I selected "save contents" in the properties
+dialog for table10 (right click on the table to see.) If this isn't
+set \, the waveform won't be remembered as part of the patch but will
+be reinitialized to zero when the patch is reopened.;
+#X msg 35 549 \; table10 cosinesum 256 0.2 -0.2 0.2 -0.2 0.2 -0.2 0.2
+;
+#X msg 578 240 \; table10 const 0;
+#X text 597 217 CLEAR TABLE;
+#X text 35 395 For efficiency's sake tabosc4~ requires that the table
+have a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259
+\, etc.) If you want wraparound to work smoothly \, you should make
+the last three points copies of the first three. This is done because
+tabread4~ does 4-point interpolation.;
+#X text 38 494 If you want a specific sinusoidal composition \, you
+can send table10 a message \, as below (see 11.arrays in the control
+examples):;
+#X text 36 240 Here \, in place of the "osc~" cosine wave oscillator
+\, we introduce the tabosc4~ oscillator which produces an arbitrary
+waveform. You can draw in the waveform with the mouse.;
+#X obj 164 151 output~;
+#X connect 0 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 17 0;
+#X connect 8 0 17 1;
diff --git a/desiredata/doc/3.audio.examples/B02.two-wavetables.pd b/desiredata/doc/3.audio.examples/B02.two-wavetables.pd
new file mode 100644
index 00000000..c4cc6d60
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B02.two-wavetables.pd
@@ -0,0 +1,147 @@
+#N canvas 74 98 749 466 12;
+#X graph graph1 0 -1.02 258 1.02 475 298 733 168;
+#X array waveform11 259 float 1;
+#A 0 -0.0896033 0 0.0896033 0.178356 0.265425 0.350007 0.431348 0.508756
+0.58161 0.649372 0.711597 0.767935 0.818137 0.862053 0.89963 0.930912
+0.956028 0.975187 0.988669 0.996811 1 0.998655 0.993223 0.984158 0.971919
+0.956953 0.939691 0.920538 0.899867 0.878018 0.85529 0.831945 0.808204
+0.784252 0.760239 0.736284 0.712477 0.688888 0.665568 0.642553 0.619872
+0.59755 0.575607 0.554066 0.532953 0.512296 0.49213 0.472491 0.453419
+0.434957 0.417147 0.400027 0.383632 0.367992 0.353126 0.339046 0.32575
+0.313227 0.301453 0.290394 0.280002 0.270224 0.260995 0.252248 0.24391
+0.235908 0.22817 0.220628 0.213219 0.205888 0.198586 0.191278 0.183936
+0.176545 0.169098 0.1616 0.154063 0.146505 0.138954 0.131437 0.123987
+0.116636 0.109415 0.102354 0.0954784 0.0888083 0.08236 0.0761442 0.0701659
+0.0644253 0.0589178 0.0536354 0.0485669 0.0436994 0.0390194 0.0345135
+0.0301695 0.0259776 0.0219306 0.0180245 0.0142591 0.0106377 0.00716724
+0.00385775 0.000722025 -0.00222511 -0.0049675 -0.00748845 -0.00977153
+-0.0118014 -0.0135644 -0.0150493 -0.0162479 -0.0171551 -0.0177693 -0.0180928
+-0.0181312 -0.0178936 -0.017392 -0.0166417 -0.0156601 -0.0144666 -0.0130822
+-0.0115294 -0.00983114 -0.0080113 -0.00609396 -0.0041034 -0.00206402
+-2.23572e-07 0.00206358 0.00410297 0.00609353 0.00801089 0.00983075
+0.011529 0.0130819 0.0144663 0.0156599 0.0166416 0.0173919 0.0178935
+0.0181312 0.0180929 0.0177695 0.0171552 0.0162481 0.0150496 0.0135647
+0.0118018 0.009772 0.00748897 0.00496807 0.00222573 -0.000721367 -0.00385706
+-0.00716651 -0.010637 -0.0142583 -0.0180237 -0.0219297 -0.0259767 -0.0301686
+-0.0345125 -0.0390184 -0.0436984 -0.0485658 -0.0536343 -0.0589167 -0.0644241
+-0.0701647 -0.0761429 -0.0823587 -0.0888069 -0.0954769 -0.102353 -0.109414
+-0.116634 -0.123985 -0.131435 -0.138952 -0.146504 -0.154061 -0.161598
+-0.169097 -0.176543 -0.183935 -0.191276 -0.198584 -0.205886 -0.213218
+-0.220627 -0.228169 -0.235906 -0.243908 -0.252246 -0.260993 -0.270222
+-0.28 -0.290392 -0.301451 -0.313224 -0.325747 -0.339043 -0.353123 -0.367989
+-0.383629 -0.400023 -0.417143 -0.434954 -0.453415 -0.472486 -0.492125
+-0.512292 -0.532948 -0.554062 -0.575602 -0.597545 -0.619868 -0.642548
+-0.665563 -0.688883 -0.712472 -0.736279 -0.760234 -0.784247 -0.808199
+-0.83194 -0.855285 -0.878013 -0.899863 -0.920533 -0.939687 -0.956949
+-0.971916 -0.984156 -0.993221 -0.998655 -1 -0.996813 -0.988671 -0.975191
+-0.956033 -0.930918 -0.899638 -0.862061 -0.818147 -0.767947 -0.71161
+-0.649386 -0.581625 -0.508772 -0.431366 -0.350025 -0.265443 -0.178375
+-0.0896226 -1.94061e-05 0.089584;
+#X pop;
+#X floatatom 202 171 0 0 100;
+#N canvas 159 26 532 285 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 426 180 0;
+#X msg 338 85 bang;
+#X obj 338 135 moses 1;
+#X obj 397 110 moses 1;
+#X obj 83 148 dbtorms;
+#X obj 397 85 r master-lvl;
+#X obj 83 42 r master-lvl;
+#X obj 338 210 s master-lvl;
+#X obj 20 155 inlet~;
+#X obj 199 41 inlet;
+#X text 199 18 level;
+#X obj 199 105 s master-lvl;
+#X msg 96 65 set \$1;
+#X obj 96 90 outlet;
+#X msg 214 65 \; pd dsp 1;
+#X obj 83 198 line~;
+#X obj 20 207 *~;
+#X obj 20 232 dac~;
+#X obj 83 173 pack 0 50;
+#X text 20 132 audio;
+#X text 96 114 show level;
+#X obj 426 155 t b;
+#X obj 20 181 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 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 27 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 connect 27 0 21 0;
+#X restore 164 199 pd output;
+#X msg 240 172 MUTE;
+#X text 30 123 oscillator -->;
+#X text 485 445 updated for Pd version 0.34;
+#X text 33 8 WAVETABLE OSCILLATORS;
+#X text 36 106 wavetable;
+#X text 88 54 pitch->;
+#X graph graph2 0 0 258 1000 475 155 734 15;
+#X array pitch11 259 float 1;
+#A 0 757.143 757.143 735.714 700 671.429 650 621.429 600 571.429 550
+521.429 507.143 485.714 464.286 442.857 428.571 414.286 400 378.571
+364.286 342.857 328.571 928.571 921.429 921.429 914.286 907.143 892.857
+885.714 878.571 864.286 850 828.571 807.143 792.857 785.714 775 764.286
+753.571 742.857 735.714 728.571 721.429 714.286 703.571 692.857 682.143
+671.429 650 628.571 617.857 607.143 596.429 585.714 575 564.286 553.571
+542.857 532.143 521.429 510.714 500 485.714 478.571 464.286 450 435.714
+428.571 400 392.857 385.714 378.571 357.143 350 342.857 335.714 328.571
+314.286 292.857 285.714 271.429 264.286 571.429 571.429 571.429 571.429
+571.429 564.286 564.286 278.571 271.429 271.429 278.571 278.571 278.571
+278.571 571.429 571.429 571.429 575 578.571 578.571 278.571 278.571
+285.714 285.714 278.571 278.571 278.571 878.571 878.571 878.571 878.571
+878.571 321.429 325 328.571 328.571 328.571 328.571 885.714 885.714
+885.714 885.714 207.143 207.143 207.143 200 207.143 207.143 207.143
+214.286 214.286 221.429 228.571 228.571 242.857 250 257.143 264.286
+278.571 292.857 307.143 321.429 335.714 350 371.429 392.857 421.429
+435.714 471.429 500 542.857 571.429 628.571 664.286 700 728.571 757.143
+792.857 828.571 885.714 928.571 978.571 1000 1007.14 1007.14 1000 1000
+992.857 985.714 885.714 914.286 671.429 671.429 671.429 671.429 671.429
+671.429 671.429 671.429 671.429 671.429 678.571 635.714 635.714 678.571
+714.286 714.286 678.571 635.714 635.714 635.714 742.857 742.857 685.714
+685.714 635.714 621.429 685.714 792.857 792.857 678.571 521.429 521.429
+521.429 864.286 857.143 857.143 471.429 471.429 471.429 471.429 921.429
+921.429 385.714 385.714 385.714 964.286 964.286 964.286 328.571 328.571
+328.571 328.571 885.714 885.714 885.714 685.714 214.286 214.286 207.143
+207.143 921.429 921.429 921.429 921.429 207.143 207.143 200 200 957.143
+957.143 950 214.286 214.286 207.143 207.143 957.143 957.143 950 200
+207.143 207.143 942.857 942.857 942.857 950 950;
+#X pop;
+#X obj 164 87 tabosc4~ pitch11;
+#X obj 164 123 tabosc4~ waveform11;
+#X obj 164 55 sig~ 0.5;
+#X text 13 319 Here's a tabosc4~ controlling the frequency of another
+one. If you get properties on the two arrays \, you'll see that the
+top graph has a vertical scale from 0 to 1000 \; we're looping through
+that at a frequency of 0.5 Hz. and the output is used as the frequency
+input of the second tabosc4~. I've detected Klingons \, Captain Kirk...
+;
+#X connect 1 0 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 2;
+#X connect 10 0 11 0;
+#X connect 11 0 2 0;
+#X connect 12 0 10 0;
diff --git a/desiredata/doc/3.audio.examples/B03.tabread4.pd b/desiredata/doc/3.audio.examples/B03.tabread4.pd
new file mode 100644
index 00000000..15fa6652
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B03.tabread4.pd
@@ -0,0 +1,130 @@
+#N canvas 55 137 820 651 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array waveform12 131 float 1;
+#A 0 -0.172615 -0.172615 -0.172615 -0.172615 -0.172615 -0.141231 -0.109846
+-0.0941538 -0.0627692 -0.0470769 0.0156923 0.0784615 0.125538 0.188308
+0.235385 0.298154 0.360923 0.392308 0.470769 0.533538 0.596308 0.643385
+0.674769 0.721846 0.753231 0.784615 0.816 0.831692 0.847385 0.878769
+0.894462 0.910154 0.910154 0.910154 0.910154 0.910154 0.894462 0.894462
+0.894462 0.894462 0.878769 0.863077 0.816 0.800308 0.768923 0.737538
+0.706154 0.674769 0.643385 0.596308 0.564923 0.533538 0.470769 0.423692
+0.376615 0.313846 0.266769 0.204 0.172615 0.109846 0.0627692 0.0156923
+0 -0.0313846 -0.0627692 -0.0784615 -0.0941538 -0.109846 -0.141231 -0.156923
+-0.172615 -0.204 -0.219692 -0.219692 -0.235385 -0.235385 -0.235385
+-0.219692 -0.219692 -0.219692 -0.204 -0.156923 -0.125538 -0.0784615
+0 0.172615 0.313846 0.470769 0.564923 0.627692 0.690462 0.721846 0.737538
+0.753231 0.768923 0.768923 0.753231 0.737538 0.706154 0.674769 0.612
+0.580615 0.549231 0.517846 0.486462 0.423692 0.392308 0.360923 0.282462
+0.219692 0.109846 -0.0156923 -0.0941538 -0.109846 -0.141231 -0.156923
+-0.172615 -0.188308 -0.204 -0.204 -0.219692 -0.204 -0.204 -0.219692
+-0.219692 -0.204 -0.204 -0.204 -0.204 -0.204 -0.188308;
+#X coords 0 1.02 130 -1.02 258 130 1;
+#X restore 462 30 graph;
+#X floatatom 194 299 0 0 100 0 - - -;
+#N canvas 159 26 532 285 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 426 180 0;
+#X msg 338 85 bang;
+#X obj 338 135 moses 1;
+#X obj 397 110 moses 1;
+#X obj 83 148 dbtorms;
+#X obj 397 85 r master-lvl;
+#X obj 83 42 r master-lvl;
+#X obj 338 210 s master-lvl;
+#X obj 20 155 inlet~;
+#X obj 199 41 inlet;
+#X text 199 18 level;
+#X obj 199 105 s master-lvl;
+#X msg 96 65 set \$1;
+#X obj 96 90 outlet;
+#X msg 214 65 \; pd dsp 1;
+#X obj 83 198 line~;
+#X obj 20 207 *~;
+#X obj 20 232 dac~;
+#X obj 83 173 pack 0 50;
+#X text 20 132 audio;
+#X text 96 114 show level;
+#X obj 426 155 t b;
+#X obj 20 181 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 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 27 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 connect 27 0 21 0;
+#X restore 156 327 pd output;
+#X msg 232 300 MUTE;
+#X text 33 8 WAVETABLE OSCILLATORS;
+#X obj 156 95 phasor~;
+#X obj 156 184 tabread4~ waveform12;
+#X obj 156 157 +~ 1;
+#X floatatom 156 66 4 0 0 0 - - -;
+#X floatatom 250 59 4 0 1000 0 - - -;
+#X obj 250 80 pack 0 50;
+#X obj 250 104 line~;
+#X obj 156 131 *~;
+#X text 21 81 phase;
+#X text 20 96 generation -->;
+#X text 25 117 range;
+#X text 24 132 adjustment -->;
+#X text 250 38 squeeze;
+#X text 133 40 frequency;
+#N canvas 0 0 450 300 graph3 0;
+#X array wave-out12 441 float 0;
+#X coords 0 1 440 -1 300 140 1;
+#X restore 481 190 graph;
+#X obj 177 247 tabwrite~ wave-out12;
+#X msg 177 216 bang;
+#X text 223 217 <--click to graph;
+#X text 25 360 The tabread4~ module is available for situations requiring
+more control than tabosc4~ offers. The relationship between the two
+is the same as between cos~ and osc~ \, although the units are different
+between cos~ and tabread4~. Cos~ assumes input is normalized from 0
+to 1 (and will wrap around as needed.) Tabread4~ takes values from
+1 to n-2 where n is the number of points in the table-- for a 259-point
+table such as we have here \, it's 1 to 129 (so the "good" segment
+is 128 samples long.);
+#X text 30 508 You would use tabread4~ (as opposed to tabosc4~) if
+you need direct control of the phase \, for instance if you to advance
+nonlinearly through the table. In the case shown here \, the "squeeze"
+factor makes the phase grow to a value at least \, and possibly much
+graeater than \, 129 (to which tabread4~ then limits it). So the resulting
+waveform is compressed in time.;
+#X obj 250 128 +~ 128;
+#X text 554 624 updated for Pd version 0.37;
+#X connect 1 0 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 2;
+#X connect 5 0 12 0;
+#X connect 6 0 2 0;
+#X connect 6 0 20 0;
+#X connect 7 0 6 0;
+#X connect 8 0 5 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 25 0;
+#X connect 12 0 7 0;
+#X connect 21 0 20 0;
+#X connect 25 0 12 1;
diff --git a/desiredata/doc/3.audio.examples/B04.tabread4.interpolation.pd b/desiredata/doc/3.audio.examples/B04.tabread4.interpolation.pd
new file mode 100644
index 00000000..18aef089
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B04.tabread4.interpolation.pd
@@ -0,0 +1,44 @@
+#N canvas 137 102 781 520 12;
+#X graph graph1 0 -1.02 10 1.02 468 159 648 29;
+#X array waveform13 11 float 1;
+#A 0 1 1 1 1 1 1 1 -1 -1 -1 -1;
+#X pop;
+#X text 533 502 updated for Pd version 0.34;
+#X obj 156 157 +~ 1;
+#X text 21 81 phase;
+#X text 20 96 generation -->;
+#X text 25 117 range;
+#X text 24 132 adjustment -->;
+#X graph graph3 0 -1.02 440 1.02 469 362 769 222;
+#X array wave-out13 441 float 0;
+#X pop;
+#X msg 177 216 bang;
+#X text 223 217 <--click to graph;
+#N canvas 11 418 523 216 other-stuff 0;
+#X obj 41 49 loadbang;
+#X msg 39 81 \; waveform13 0 1 1 1 1 1 1 1 -1 -1 -1 -1 \; waveform13
+xlabel -1.2 0 1 2 3 4 5 6 7 8 9 10 \; pd dsp 1;
+#X connect 0 0 1 0;
+#X restore 626 426 pd other-stuff;
+#X obj 156 247 tabwrite~ wave-out13;
+#X obj 156 184 tabread4~ waveform13;
+#X obj 156 131 *~ 8;
+#X obj 156 95 phasor~ 220;
+#X text 36 22 4-POINT INTERPOLATION IN DETAIL;
+#X obj 216 316 sig~ 220;
+#X obj 216 346 tabosc4~ waveform13;
+#X text 35 293 (this would be;
+#X text 36 313 equivalent to the;
+#X text 110 333 above) -->;
+#X text 18 409 This patch demonstrates 4-point interpolation in tabread4~.
+The 11-point table \, waveform13 \, contains a transition from from
+1 to -1 \, which is "smoothed" as seen in wave-out13. There's no such
+transition at the wraparoind point--the interpolation always happens
+between 4 consccutive samples of the table \, disregarding wraparound.
+;
+#X connect 2 0 12 0;
+#X connect 8 0 11 0;
+#X connect 12 0 11 0;
+#X connect 13 0 2 0;
+#X connect 14 0 13 0;
+#X connect 16 0 17 0;
diff --git a/desiredata/doc/3.audio.examples/B05.tabread.FM.pd b/desiredata/doc/3.audio.examples/B05.tabread.FM.pd
new file mode 100644
index 00000000..0dff773e
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B05.tabread.FM.pd
@@ -0,0 +1,107 @@
+#N canvas 55 137 777 467 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array pitchmod14 131 float 1;
+#A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077
+0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077
+0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077
+0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+-0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308
+-0.800308 -0.800308 -0.800308 -0.800308 -0.800308;
+#X coords 0 1.02 130 -1.02 258 130 1;
+#X restore 462 30 graph;
+#X floatatom 191 277 0 0 100 0 - - -;
+#N canvas 159 26 532 285 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 426 180 0;
+#X msg 338 85 bang;
+#X obj 338 135 moses 1;
+#X obj 397 110 moses 1;
+#X obj 83 148 dbtorms;
+#X obj 397 85 r master-lvl;
+#X obj 83 42 r master-lvl;
+#X obj 338 210 s master-lvl;
+#X obj 20 155 inlet~;
+#X obj 199 41 inlet;
+#X text 199 18 level;
+#X obj 199 105 s master-lvl;
+#X msg 96 65 set \$1;
+#X obj 96 90 outlet;
+#X msg 214 65 \; pd dsp 1;
+#X obj 83 198 line~;
+#X obj 20 207 *~;
+#X obj 20 232 dac~;
+#X obj 83 173 pack 0 50;
+#X text 20 132 audio;
+#X text 96 114 show level;
+#X obj 426 155 t b;
+#X obj 20 181 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 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 27 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 connect 27 0 21 0;
+#X restore 153 305 pd output;
+#X msg 229 278 MUTE;
+#X floatatom 153 95 4 0 0 0 - - -;
+#X text 153 69 frequency;
+#X floatatom 195 206 4 0 0 0 - - -;
+#X text 155 50 modulation;
+#X obj 152 157 *~;
+#X text 255 150 modulation;
+#X text 253 169 depth;
+#X floatatom 201 157 4 0 0 0 - - -;
+#X obj 152 205 +~;
+#X text 250 212 frequency;
+#X obj 152 237 osc~;
+#X obj 153 122 tabosc4~ pitchmod14;
+#X text 254 194 carrier;
+#X text 33 8 FREQUENCY MODULATION BY WAVETABLE;
+#X text 47 356 This tabosc4~ controls the pitch of a sinusoidal oscillator
+(osc~). Try changing the waveform as well as the three familiar parameters.
+;
+#X text 520 438 updated for Pd version 0.37;
+#X connect 1 0 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 2;
+#X connect 4 0 15 0;
+#X connect 6 0 12 1;
+#X connect 8 0 12 0;
+#X connect 11 0 8 1;
+#X connect 12 0 14 0;
+#X connect 14 0 2 0;
+#X connect 15 0 8 0;
diff --git a/desiredata/doc/3.audio.examples/B06.table.switching.pd b/desiredata/doc/3.audio.examples/B06.table.switching.pd
new file mode 100644
index 00000000..558f91c4
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B06.table.switching.pd
@@ -0,0 +1,127 @@
+#N canvas 55 137 835 504 12;
+#X graph graph1 0 -1.02 130 1.02 565 153 823 23;
+#X array waveshape15a 131 float 1;
+#A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077
+0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077
+0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077
+0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385
+-0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308
+-0.800308 -0.800308 -0.800308 -0.800308 -0.800308;
+#X pop;
+#X floatatom 194 299 0 0 100;
+#N canvas 159 26 532 285 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 426 180 0;
+#X msg 338 85 bang;
+#X obj 338 135 moses 1;
+#X obj 397 110 moses 1;
+#X obj 83 148 dbtorms;
+#X obj 397 85 r master-lvl;
+#X obj 83 42 r master-lvl;
+#X obj 338 210 s master-lvl;
+#X obj 20 155 inlet~;
+#X obj 199 41 inlet;
+#X text 199 18 level;
+#X obj 199 105 s master-lvl;
+#X msg 96 65 set \$1;
+#X obj 96 90 outlet;
+#X msg 214 65 \; pd dsp 1;
+#X obj 83 198 line~;
+#X obj 20 207 *~;
+#X obj 20 232 dac~;
+#X obj 83 173 pack 0 50;
+#X text 20 132 audio;
+#X text 96 114 show level;
+#X obj 426 155 t b;
+#X obj 20 181 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 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 27 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 connect 27 0 21 0;
+#X restore 156 327 pd output;
+#X msg 232 300 MUTE;
+#X text 581 481 updated for Pd version 0.34;
+#X text 33 8 SWITCHING BETWEEN TABLES;
+#X graph graph1 0 -1.02 130 1.02 565 308 823 178;
+#X array waveshape15b 131 float 1;
+#A 0 -0.659077 -0.643385 -0.643385 -0.627692 -0.612 -0.612 -0.596308
+-0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615
+-0.580615 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308
+-0.596308 -0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615
+-0.580615 -0.580615 -0.580615 -0.564923 -0.549231 -0.549231 -0.533538
+-0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846
+-0.517846 -0.533538 -0.549231 -0.580615 -0.580615 0.847385 0.847385
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077
+0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615
+-0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308
+-0.800308 -0.800308 -0.800308;
+#X pop;
+#X obj 156 274 tabosc4~ waveshape15a;
+#X obj 156 186 sig~ 110;
+#X msg 181 215 set waveshape15a;
+#X msg 182 244 set waveshape15b;
+#X text 20 51 During a performance you're unlikely to want to draw
+or recalculate wavetables on the fly \, because you don't want to give
+Pd computationally intensive atomic tasks that could make Pd miss a
+DAC deadline. Instead \, use "set" mesages to switch tabosc~ or tabread4~
+between pre-prepared tables. Indeed \, you will eventually want to
+save screen space by throwing all your wavetables in a subpatch somewhere.
+;
+#X obj 161 401 table waveshape15c 131;
+#X text 41 362 There's also a "text object" hook so that you can have
+arrays with parametrizable names and sizes:;
+#X text 31 431 You would use this if you want to include one or more
+arrays in an abstraction. In this invocation you can't save the state
+of the array--instead \, juts read it in from a file or calculate it
+at startup.;
+#X connect 1 0 2 1;
+#X connect 2 0 1 0;
+#X connect 3 0 2 2;
+#X connect 7 0 2 0;
+#X connect 8 0 7 0;
+#X connect 9 0 7 0;
+#X connect 10 0 7 0;
diff --git a/desiredata/doc/3.audio.examples/B07.sampler.pd b/desiredata/doc/3.audio.examples/B07.sampler.pd
new file mode 100644
index 00000000..632c1d03
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B07.sampler.pd
@@ -0,0 +1,52 @@
+#N canvas 11 3 915 618 12;
+#X obj 37 217 hip~ 5;
+#X text 96 219 high pass filter to cut DC;
+#N canvas 0 0 450 300 graph1 0;
+#X array sample-table 44104 float 0;
+#X coords 0 1.02 44103 -1.02 200 130 1;
+#X restore 585 20 graph;
+#X obj 37 185 tabread4~ sample-table;
+#X obj 37 150 line~;
+#X obj 37 101 * 441;
+#X floatatom 37 47 0 0 100 0 - - -;
+#X obj 37 125 pack 0 100;
+#X text 102 13 SCRATCH MACHINE;
+#X text 72 48 <-- read point in 100ths of a second;
+#X text 94 101 convert to SAMPLES (441 samples in 0.01 sec);
+#X obj 405 235 loadbang;
+#X text 246 174 read from the table;
+#X text 237 192 (the input is the index in samples);
+#X text 16 482 For more on reading and writing soundfiles to tables
+\, setting their lengths \, etc \, see "arrays" in the "control examples"
+series.;
+#X text 14 355 This patch introduces the "tabread4~" object \, which
+reads audio samples out of a floating-point array \, often called a
+"sample table." The input is the index of the sample to read \, counting
+from zero. The output is calculated using 4-point cubic interpolation
+\, which is adequate for most purposes. Because of the interpolation
+scheme \, tabread4~'s input cannot be less than one or greater than
+the table length minus two.;
+#X text 17 539 Fanatics take note: if you want really high-fidelity
+sampling \, use a high-quality resampling program to up-sample your
+soundfile to 88200 to drastically reduce interpolation error.;
+#X text 591 173 (one second plus three extra;
+#X text 593 192 for 4-point interpolation);
+#X text 385 304 message to read a soundfile into the table (automatically
+sent when you load this patch by the "loadbang" object.);
+#X text 84 150 convert smoothly to audio signal;
+#X text 84 62 (range is 0-100.) YOU ONLY HEAR OUTPUT;
+#X text 85 78 WHEN THIS IS 0-100 AND ACTIVELY CHANGING.;
+#X text 596 589 updated for Pd version 0.33;
+#X text 584 151 --- 44103 samples ---;
+#X msg 405 259 read ../sound/voice.wav sample-table;
+#X obj 405 284 soundfiler;
+#X obj 36 249 output~;
+#X connect 0 0 27 0;
+#X connect 0 0 27 1;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 7 0 4 0;
+#X connect 11 0 25 0;
+#X connect 25 0 26 0;
diff --git a/desiredata/doc/3.audio.examples/B08.sampler.loop.pd b/desiredata/doc/3.audio.examples/B08.sampler.loop.pd
new file mode 100644
index 00000000..db2362e8
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B08.sampler.loop.pd
@@ -0,0 +1,64 @@
+#N canvas 143 17 992 621 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array tabread4-out 44100 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 632 200 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array table17 44103 float 0;
+#X coords 0 1.02 44103 -1.02 200 130 1;
+#X restore 631 14 graph;
+#X obj 568 496 loadbang;
+#X obj 65 277 tabwrite~ tabread4-out;
+#X obj 34 308 hip~ 5;
+#X floatatom 34 54 0 0 0 0 - - -;
+#X text 241 215 read from the table;
+#X text 49 11 LOOPING SAMPLER;
+#X text 83 54 <-- frequency (Hz.);
+#X floatatom 65 107 0 0 0 0 - - -;
+#X obj 65 133 * 441;
+#X obj 34 160 *~ 0;
+#X obj 34 187 +~ 1;
+#X text 110 248 <-- click to display output;
+#X obj 34 80 phasor~ 0;
+#X msg 65 245 bang;
+#X text 110 108 <-- chunk size (100ths of a second);
+#X obj 561 395 adc~ 1;
+#X msg 575 422 bang;
+#X text 615 423 <-- click here to record your own sample;
+#X text 678 501 v-- re-read the original sample;
+#X text 14 540 In this patch you will frequently hear discontinuities
+at the looping point. If you're working in a studio \, you can sometimes
+find "good" loop points for samples. Another approach \, better for
+live situations \, is shown in the next patch.;
+#X text 80 159 <-- readjust phase for range 0 - (chunk size);
+#X text 79 187 <-- add one to avoid beginning of table;
+#X obj 568 549 soundfiler;
+#X text 629 153 ---- 44103 samples ----;
+#X text 643 336 ---- 1 second ------;
+#X obj 34 335 output~;
+#X text 742 591 updated for Pd version 0.37;
+#X obj 34 216 tabread4~ table17;
+#X obj 562 455 tabwrite~ table17;
+#X msg 568 524 read ../sound/voice.wav table17;
+#X text 16 409 This is a looping sampler in which you specify the number
+of loops per second (the frequency) and the size of the chunk to loop.
+If the frequency is less than about 20 \, you will hear repetition
+and the chunk size will sound like transposition. For frequencies above
+50 or so \, you hear a tone whose timbre is controlled by the chunk
+size (best kept below 10 or so.) Remember you can use the "shift" key
+on number boxes to make fine adjustments.;
+#X connect 2 0 31 0;
+#X connect 4 0 27 0;
+#X connect 4 0 27 1;
+#X connect 5 0 14 0;
+#X connect 9 0 10 0;
+#X connect 10 0 11 1;
+#X connect 11 0 12 0;
+#X connect 12 0 29 0;
+#X connect 14 0 11 0;
+#X connect 15 0 3 0;
+#X connect 17 0 30 0;
+#X connect 18 0 30 0;
+#X connect 29 0 4 0;
+#X connect 29 0 3 0;
+#X connect 31 0 24 0;
diff --git a/desiredata/doc/3.audio.examples/B09.sampler.loop.smooth.pd b/desiredata/doc/3.audio.examples/B09.sampler.loop.smooth.pd
new file mode 100644
index 00000000..818d9206
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B09.sampler.loop.smooth.pd
@@ -0,0 +1,72 @@
+#N canvas 75 15 973 599 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array cos-output 44100 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 724 191 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array table18 44103 float 0;
+#X coords 0 1.02 44103 -1.02 200 130 1;
+#X restore 721 16 graph;
+#X obj 584 491 loadbang;
+#X obj 45 249 hip~ 5;
+#X floatatom 46 50 0 0 0 0 - - -;
+#X text 85 49 <-- frequency (Hz.);
+#X floatatom 132 87 0 0 0 0 - - -;
+#X obj 132 114 * 441;
+#X obj 110 163 +~ 1;
+#X text 171 86 <-- chunk size (100ths of a second);
+#X obj 584 404 adc~ 1;
+#X msg 599 429 bang;
+#X text 40 9 ENVELOPING YOUR LOOPING SAMPLER;
+#X obj 45 139 -~ 0.5;
+#X obj 45 189 cos~;
+#X obj 45 222 *~;
+#X obj 584 545 soundfiler;
+#X text 736 148 -- 44103 samples ---;
+#X text 727 322 ----- 1 second ------;
+#X obj 46 77 phasor~;
+#X obj 45 164 *~ 0.5;
+#X obj 44 281 output~;
+#X obj 110 138 *~;
+#X text 28 362 Here we apply an amplitude envelope to protect against
+discontinuities at the loop point. The envelope is just a cosine wave
+from -90 degrees to +90 degrees \, (-pi/2 to pi/2 radians) \, i.e.
+\, the part that is zero or positive in sign. The "cos~" object's input
+is in cycles (units of 2pi radians) so -1/4 to +1/4 addresses the desired
+part of the waveform.;
+#X obj 167 247 tabwrite~ cos-output;
+#X obj 167 223 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 188 220 <-- click to graph envelope;
+#X text 28 476 To see the envelope \, put the phasor on 2 Hz or so
+\, click the "graph" button \, and look at "cos-output." This is multiplied
+by the tabread4~ output so that it doesn't click when the phase wraps
+around.;
+#X text 26 545 It is possible to get much more control over the shape
+of the envelope \, but this will be taken up later.;
+#X obj 110 189 tabread4~ table18;
+#X obj 584 456 tabwrite~ table18;
+#X msg 584 520 read ../sound/voice.wav table18;
+#X text 641 430 <-- click here to record to table;
+#X text 675 499 v-- re-read the original sound;
+#X text 708 565 updated for Pd version 0.37;
+#X connect 2 0 31 0;
+#X connect 3 0 21 0;
+#X connect 3 0 21 1;
+#X connect 4 0 19 0;
+#X connect 6 0 7 0;
+#X connect 7 0 22 1;
+#X connect 8 0 29 0;
+#X connect 10 0 30 0;
+#X connect 11 0 30 0;
+#X connect 13 0 20 0;
+#X connect 14 0 15 0;
+#X connect 14 0 24 0;
+#X connect 15 0 3 0;
+#X connect 19 0 13 0;
+#X connect 19 0 22 0;
+#X connect 20 0 14 0;
+#X connect 22 0 8 0;
+#X connect 25 0 24 0;
+#X connect 29 0 15 1;
+#X connect 31 0 16 0;
diff --git a/desiredata/doc/3.audio.examples/B10.sampler.scratch.pd b/desiredata/doc/3.audio.examples/B10.sampler.scratch.pd
new file mode 100644
index 00000000..38c67b76
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B10.sampler.scratch.pd
@@ -0,0 +1,83 @@
+#N canvas 53 232 936 654 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array table19 44103 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 680 8 graph;
+#X obj 40 382 hip~ 5;
+#X floatatom 99 51 0 0 0 0 - - -;
+#X text 146 50 <-- frequency (Hz.);
+#X floatatom 129 106 0 0 0 0 - - -;
+#X obj 129 135 * 441;
+#X obj 100 158 *~ 0;
+#X obj 100 181 +~ 1;
+#X msg 194 281 bang;
+#X text 164 106 <-- chunk size (100ths of a second);
+#X obj 591 369 adc~ 1;
+#X obj 591 395 hip~ 5;
+#X msg 609 423 bang;
+#N canvas 0 0 450 300 graph2 0;
+#X array graph19 44100 float 0;
+#X coords 0 44100 44100 0 200 130 1;
+#X restore 681 196 graph;
+#X obj 40 356 *~;
+#X obj 123 276 line~;
+#X obj 123 228 * 441;
+#X floatatom 123 205 0 0 0 0 - - -;
+#X obj 123 252 pack 0 100;
+#X obj 101 310 +~;
+#X text 34 474 In this patch we can loop in any "window" of the input
+sample. The "read point" (0-100) gives the starting point of the window
+and "chunk" is its size (both in 100ths of a second.) Try \, for example
+\, frequency 4 \, sharpness 10 \, chunk size 25 \, and vary the read
+point from -25 to 100 \, listening to the result.;
+#X text 242 281 <-- graph table index;
+#X text 684 337 ----- 1 second ------;
+#X obj 595 490 loadbang;
+#X text 631 514 v-- re-read the original sample;
+#X obj 605 559 soundfiler;
+#X text 678 147 ---- 44103 samples ---;
+#X obj 591 455 tabwrite~ table19;
+#X msg 605 535 read ../sound/voice.wav table19;
+#X text 688 628 updated for Pd version 0.37;
+#X msg 595 585 \; graph19 ylabel 48000 0 44100;
+#X obj 39 103 -~ 0.5;
+#X obj 99 76 phasor~;
+#X obj 39 127 *~ 0.5;
+#X obj 39 150 cos~;
+#X text 157 206 <-- read point (100ths of a second);
+#X obj 41 406 output~;
+#X text 651 422 <-- record;
+#X text 36 13 ENVELOPING THE LOOPING SAMPLER;
+#X text 37 574 You should hear some doppler shift as you change the
+read point. To see why \, click on "graph table index" and quickly
+start changing the read point--- you should see entertaining pictures
+in "table-index". The next patch shows how to prevent this if you wish
+to.;
+#X obj 100 336 tabread4~ table19;
+#X obj 194 307 tabwrite~ graph19;
+#X connect 1 0 36 0;
+#X connect 2 0 32 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 6 0 7 0;
+#X connect 7 0 19 0;
+#X connect 8 0 41 0;
+#X connect 10 0 11 0;
+#X connect 11 0 27 0;
+#X connect 12 0 27 0;
+#X connect 14 0 1 0;
+#X connect 15 0 19 1;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 18 0 15 0;
+#X connect 19 0 40 0;
+#X connect 19 0 41 0;
+#X connect 23 0 30 0;
+#X connect 23 0 28 0;
+#X connect 28 0 25 0;
+#X connect 31 0 33 0;
+#X connect 32 0 6 0;
+#X connect 32 0 31 0;
+#X connect 33 0 34 0;
+#X connect 34 0 14 0;
+#X connect 40 0 14 1;
diff --git a/desiredata/doc/3.audio.examples/B11.sampler.nodoppler.pd b/desiredata/doc/3.audio.examples/B11.sampler.nodoppler.pd
new file mode 100644
index 00000000..1ec362ac
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B11.sampler.nodoppler.pd
@@ -0,0 +1,85 @@
+#N canvas 177 116 924 622 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array table20 44103 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 631 10 graph;
+#X obj 582 447 loadbang;
+#X obj 13 425 hip~ 5;
+#X floatatom 87 49 0 0 0 0 - - -;
+#X text 126 48 <-- frequency (Hz.);
+#X floatatom 150 108 0 0 0 0 - - -;
+#X obj 150 133 * 441;
+#X obj 50 220 +~ 1;
+#X obj 87 73 phasor~ 0;
+#X msg 175 273 bang;
+#X text 189 107 <-- chunk size (100ths of a second);
+#X obj 576 343 adc~ 1;
+#X obj 576 367 hip~ 5;
+#X msg 591 390 bang;
+#X text 630 464 v-- re-read the original sample;
+#N canvas 0 0 450 300 graph2 0;
+#X array graph20 44100 float 0;
+#X coords 0 44100 44100 0 200 130 1;
+#X restore 633 179 graph;
+#X obj 13 401 *~;
+#X obj 72 308 line~;
+#X obj 149 242 * 441;
+#X floatatom 149 218 0 0 0 0 - - -;
+#X obj 72 284 pack 0 100;
+#X text 184 217 <-- read point in 100ths of a second;
+#X obj 51 356 +~;
+#X text 218 272 <-- graph table index;
+#X obj 72 332 samphold~;
+#X obj 74 170 samphold~;
+#X obj 51 196 *~;
+#X text 643 315 ----- 1 second ------;
+#X text 631 144 ---- 44103 samples ---;
+#X obj 591 508 soundfiler;
+#X text 21 8 SLIDING STABLE LOOPS WITHOUT DOPPLER SHIFT;
+#X msg 582 534 \; graph20 ylabel 48000 0 44100;
+#X text 631 390 <-- record;
+#X obj 13 451 output~;
+#X obj 12 103 -~ 0.5;
+#X obj 12 127 *~ 0.5;
+#X obj 12 150 cos~;
+#X obj 175 353 tabwrite~ graph20;
+#X obj 51 381 tabread4~ table20;
+#X obj 576 417 tabwrite~ table20;
+#X msg 591 484 read ../sound/voice.wav table20;
+#X text 11 518 This example differs from the previous one in having
+samphold~ objects which allow the chunk size and especially the read
+point to change only at points where the phase wraps around. This removes
+signal discontinuities (when the chunk size changes) and doppler shift
+when the read point is changing.;
+#X text 652 592 updated for Pd version 0.37;
+#X connect 1 0 31 0;
+#X connect 1 0 40 0;
+#X connect 2 0 33 0;
+#X connect 2 0 33 1;
+#X connect 3 0 8 0;
+#X connect 5 0 6 0;
+#X connect 6 0 25 0;
+#X connect 7 0 22 0;
+#X connect 8 0 24 1;
+#X connect 8 0 25 1;
+#X connect 8 0 26 0;
+#X connect 8 0 34 0;
+#X connect 9 0 37 0;
+#X connect 11 0 12 0;
+#X connect 12 0 39 0;
+#X connect 13 0 39 0;
+#X connect 16 0 2 0;
+#X connect 17 0 24 0;
+#X connect 18 0 20 0;
+#X connect 19 0 18 0;
+#X connect 20 0 17 0;
+#X connect 22 0 37 0;
+#X connect 22 0 38 0;
+#X connect 24 0 22 1;
+#X connect 25 0 26 1;
+#X connect 26 0 7 0;
+#X connect 34 0 35 0;
+#X connect 35 0 36 0;
+#X connect 36 0 16 0;
+#X connect 38 0 16 1;
+#X connect 40 0 29 0;
diff --git a/desiredata/doc/3.audio.examples/B12.sampler.transpose.pd b/desiredata/doc/3.audio.examples/B12.sampler.transpose.pd
new file mode 100644
index 00000000..fc7a7d14
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B12.sampler.transpose.pd
@@ -0,0 +1,109 @@
+#N canvas 107 88 930 596 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array table21 44103 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 645 291 graph;
+#X obj 467 506 loadbang;
+#X obj 19 508 hip~ 5;
+#X floatatom 10 254 0 0 0 0 - - -;
+#X obj 10 279 * 441;
+#X obj 10 401 +~ 1;
+#X text 47 253 <-- chunk size (100ths of a second);
+#X obj 471 402 adc~ 1;
+#X obj 471 427 hip~ 5;
+#X msg 486 449 bang;
+#X obj 44 482 *~;
+#X obj 106 404 line~;
+#X obj 106 354 * 441;
+#X floatatom 106 329 0 0 0 0 - - -;
+#X obj 106 379 pack 0 100;
+#X text 152 331 <-- read point in 100ths of a second;
+#X obj 44 433 +~;
+#X obj 106 429 samphold~;
+#X obj 10 329 samphold~;
+#X obj 10 304 sig~;
+#X obj 10 376 *~;
+#X text 18 5 CALCULATING LOOP FREQUENCY AS FUNCTION OF TRANSPOSITION
+;
+#X obj 124 485 r~ phase;
+#X obj 10 204 s~ phase;
+#X obj 68 304 r~ phase;
+#X obj 26 351 r~ phase;
+#X obj 164 405 r~ phase;
+#X obj 151 299 s chunk-size;
+#X floatatom 10 50 0 0 0 0 - - -;
+#X text 48 51 <-- transposition (10ths of a halftone);
+#X obj 151 274 * 0.01;
+#X text 264 287 chunk size;
+#X text 264 309 in seconds;
+#X obj 21 105 r chunk-size;
+#X obj 21 130 t b f;
+#X obj 10 154 /;
+#X text 80 131 divide speed change by chunk;
+#X text 78 152 size to get loop frequency;
+#X text 382 75 The transposition is frequency in Hz. divided by chunk
+size in seconds. This patch calculates the loop frequency as a function
+of desired transposition;
+#X text 384 126 Notice now that we get Doppler effects when the chunk
+size changes. You can suppress that if you don't want it \, by converting
+the chunk size to an audio signal \, sampling and holding it. But then
+there would be more work to deal with very low frequencies never triggering
+the sample and hold...;
+#X obj 467 560 soundfiler;
+#X obj 10 27 loadbang;
+#X obj 124 509 -~ 0.5;
+#X obj 124 533 *~ 0.5;
+#X obj 124 556 cos~;
+#X obj 19 533 output~;
+#X obj 44 458 tabread4~ table21;
+#X text 527 449 <-- record;
+#X text 560 513 v-- re-read original table;
+#X text 682 572 updated for Pd version 0.37;
+#X text 647 425 --- 44103 samples ---;
+#X obj 10 75 expr pow(2 \, $f1/120);
+#X text 199 75 speed change;
+#X text 387 208 You might also want to have a way to retrigger the
+loop to sync it with some other process. By the time we had all this
+built the patch would be fairly involved. For now \, we'll move on
+to the next topic...;
+#X obj 10 178 phasor~;
+#X obj 471 476 tabwrite~ table21;
+#X msg 467 533 read ../sound/voice.wav table21;
+#X connect 1 0 56 0;
+#X connect 2 0 45 0;
+#X connect 2 0 45 1;
+#X connect 3 0 4 0;
+#X connect 3 0 30 0;
+#X connect 4 0 19 0;
+#X connect 5 0 16 0;
+#X connect 7 0 8 0;
+#X connect 8 0 55 0;
+#X connect 9 0 55 0;
+#X connect 10 0 2 0;
+#X connect 11 0 17 0;
+#X connect 12 0 14 0;
+#X connect 13 0 12 0;
+#X connect 14 0 11 0;
+#X connect 16 0 46 0;
+#X connect 17 0 16 1;
+#X connect 18 0 20 0;
+#X connect 19 0 18 0;
+#X connect 20 0 5 0;
+#X connect 22 0 42 0;
+#X connect 24 0 18 1;
+#X connect 25 0 20 1;
+#X connect 26 0 17 1;
+#X connect 28 0 51 0;
+#X connect 30 0 27 0;
+#X connect 33 0 34 0;
+#X connect 34 0 35 0;
+#X connect 34 1 35 1;
+#X connect 35 0 54 0;
+#X connect 41 0 28 0;
+#X connect 42 0 43 0;
+#X connect 43 0 44 0;
+#X connect 44 0 10 1;
+#X connect 46 0 10 0;
+#X connect 51 0 35 0;
+#X connect 54 0 23 0;
+#X connect 56 0 40 0;
diff --git a/desiredata/doc/3.audio.examples/B13.sampler.overlap.pd b/desiredata/doc/3.audio.examples/B13.sampler.overlap.pd
new file mode 100644
index 00000000..35acc48b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B13.sampler.overlap.pd
@@ -0,0 +1,158 @@
+#N canvas 28 47 748 713 12;
+#X obj 19 511 hip~ 5;
+#X floatatom 25 38 0 0 100 0 - - -;
+#X obj 25 63 * 441;
+#X obj 20 380 +~ 1;
+#X text 69 35 <-- chunk size (100ths of a second);
+#X obj 20 458 *~;
+#X obj 26 211 line~;
+#X obj 26 161 * 441;
+#X floatatom 26 136 0 0 100 0 - - -;
+#X obj 26 186 pack 0 100;
+#X text 60 137 <-- read point in 100ths of a second;
+#X obj 20 409 +~;
+#X obj 76 408 samphold~;
+#X obj 20 308 samphold~;
+#X obj 20 355 *~;
+#X obj 185 369 r~ phase;
+#X obj 418 210 s~ phase;
+#X obj 108 308 r~ phase;
+#X obj 42 332 r~ phase;
+#X obj 96 383 r~ phase;
+#X obj 77 82 s chunk-size;
+#X floatatom 418 56 0 0 0 0 - - -;
+#X obj 77 57 * 0.01;
+#X text 189 58 chunk size;
+#X text 189 80 in seconds;
+#X obj 429 111 r chunk-size;
+#X obj 429 136 t b f;
+#X obj 418 160 /;
+#X obj 418 33 loadbang;
+#X obj 185 393 -~ 0.5;
+#X obj 185 417 *~ 0.5;
+#X obj 185 440 cos~;
+#X obj 19 536 output~;
+#X text 486 684 updated for Pd version 0.37;
+#X obj 418 81 expr pow(2 \, $f1/120);
+#X text 607 81 speed change;
+#X obj 418 184 phasor~;
+#X text 18 5 TWO OVERLAPPING SAMPLE READ ELEMENTS;
+#N canvas 30 567 660 275 table 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array table22 44103 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 442 61 graph;
+#X text 444 195 --- 44103 samples ---;
+#X obj 41 148 loadbang;
+#X obj 45 44 adc~ 1;
+#X obj 45 69 hip~ 5;
+#X msg 60 91 bang;
+#X obj 41 202 soundfiler;
+#X text 101 91 <-- record;
+#X text 134 155 v-- re-read original table;
+#X obj 45 118 tabwrite~ table22;
+#X msg 41 175 read ../sound/voice.wav table22;
+#X connect 2 0 10 0;
+#X connect 3 0 4 0;
+#X connect 4 0 9 0;
+#X connect 5 0 9 0;
+#X connect 10 0 6 0;
+#X restore 567 327 pd table;
+#X obj 25 110 s chunk-size-samples;
+#X text 211 112 ... and in samples;
+#X obj 26 234 s~ read-pt;
+#X obj 77 360 r~ read-pt;
+#X obj 505 203 +~ 0.5;
+#X obj 506 229 wrap~;
+#X obj 506 254 s~ phase2;
+#X obj 20 283 r chunk-size-samples;
+#X obj 274 391 +~ 1;
+#X obj 274 469 *~;
+#X obj 274 420 +~;
+#X obj 329 419 samphold~;
+#X obj 274 319 samphold~;
+#X obj 274 366 *~;
+#X obj 439 404 -~ 0.5;
+#X obj 439 428 *~ 0.5;
+#X obj 439 451 cos~;
+#X obj 330 371 r~ read-pt;
+#X obj 274 294 r chunk-size-samples;
+#X obj 363 320 r~ phase2;
+#X obj 296 343 r~ phase2;
+#X obj 439 380 r~ phase2;
+#X obj 339 394 r~ phase2;
+#X obj 19 487 +~;
+#X text 453 56 <-- transposition \, halftones/10;
+#X text 456 159 loop frequency;
+#X text 566 190 second phase signal;
+#X text 566 210 out of phase from;
+#X text 565 231 first one;
+#X text 70 265 copy 1;
+#X text 327 274 copy 2;
+#X text 118 503 Here is the previous patch modified to use two copies
+of the sample reader \, 180 degrees out of phase. The second sawtooth
+signal is derived from the first one by adding a constant (0.5) and
+wrapping the result to fit again between zero and one. The result is
+the "phase2" signal.;
+#X text 119 584 The computation of "chunk-size-samples" (as a message)
+and "read-pt" (an audio signal) is the same for both copies and is
+separated out at top left. At top right is the same loop frequency
+calculation as before.;
+#X text 120 654 Finally \, the two copies' outputs are added and the
+result sent to the audio output.;
+#X obj 20 434 tabread4~ table22;
+#X obj 274 445 tabread4~ table22;
+#X connect 0 0 32 0;
+#X connect 0 0 32 1;
+#X connect 1 0 2 0;
+#X connect 1 0 22 0;
+#X connect 2 0 39 0;
+#X connect 3 0 11 0;
+#X connect 5 0 62 0;
+#X connect 6 0 41 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 9 0 6 0;
+#X connect 11 0 73 0;
+#X connect 12 0 11 1;
+#X connect 13 0 14 0;
+#X connect 14 0 3 0;
+#X connect 15 0 29 0;
+#X connect 17 0 13 1;
+#X connect 18 0 14 1;
+#X connect 19 0 12 1;
+#X connect 21 0 34 0;
+#X connect 22 0 20 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 0;
+#X connect 26 1 27 1;
+#X connect 27 0 36 0;
+#X connect 28 0 21 0;
+#X connect 29 0 30 0;
+#X connect 30 0 31 0;
+#X connect 31 0 5 1;
+#X connect 34 0 27 0;
+#X connect 36 0 16 0;
+#X connect 36 0 43 0;
+#X connect 42 0 12 0;
+#X connect 43 0 44 0;
+#X connect 44 0 45 0;
+#X connect 46 0 13 0;
+#X connect 47 0 49 0;
+#X connect 48 0 62 1;
+#X connect 49 0 74 0;
+#X connect 50 0 49 1;
+#X connect 51 0 52 0;
+#X connect 52 0 47 0;
+#X connect 53 0 54 0;
+#X connect 54 0 55 0;
+#X connect 55 0 48 1;
+#X connect 56 0 50 0;
+#X connect 57 0 51 0;
+#X connect 58 0 51 1;
+#X connect 59 0 52 1;
+#X connect 60 0 53 0;
+#X connect 61 0 50 1;
+#X connect 62 0 0 0;
+#X connect 73 0 5 0;
+#X connect 74 0 48 0;
diff --git a/desiredata/doc/3.audio.examples/B14.sampler.rockafella.pd b/desiredata/doc/3.audio.examples/B14.sampler.rockafella.pd
new file mode 100644
index 00000000..20416b6b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/B14.sampler.rockafella.pd
@@ -0,0 +1,166 @@
+#N canvas 123 36 683 718 12;
+#X obj 6 529 hip~ 5;
+#X floatatom 8 47 4 0 100 0 - - -;
+#X obj 7 476 *~;
+#X floatatom 7 123 0 0 200 0 - - -;
+#X obj 7 378 +~;
+#X obj 6 330 samphold~;
+#X obj 7 354 *~;
+#X obj 172 385 r~ phase;
+#X obj 357 210 s~ phase;
+#X obj 94 331 r~ phase;
+#X obj 42 355 r~ phase;
+#X obj 8 90 s chunk-size;
+#X floatatom 357 42 0 0 0 0 - - -;
+#X text 124 82 chunk size;
+#X text 121 96 in seconds;
+#X obj 369 79 r chunk-size;
+#X obj 369 104 t b f;
+#X obj 172 409 -~ 0.5;
+#X obj 172 433 *~ 0.5;
+#X obj 172 456 cos~;
+#X obj 7 560 output~;
+#X text 417 698 updated for Pd version 0.37;
+#X obj 357 184 phasor~;
+#N canvas 30 567 660 275 table 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array table23 44103 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 442 61 graph;
+#X text 444 195 --- 44103 samples ---;
+#X obj 41 148 loadbang;
+#X obj 45 44 adc~ 1;
+#X obj 45 69 hip~ 5;
+#X msg 60 91 bang;
+#X obj 41 202 soundfiler;
+#X text 101 91 <-- record;
+#X text 134 155 v-- re-read original table;
+#X obj 45 118 tabwrite~ table23;
+#X msg 41 175 read ../sound/voice.wav table23;
+#X connect 2 0 10 0;
+#X connect 3 0 4 0;
+#X connect 4 0 9 0;
+#X connect 5 0 9 0;
+#X connect 10 0 6 0;
+#X restore 558 460 pd table;
+#X obj 7 263 s~ read-pt;
+#X obj 45 378 r~ read-pt;
+#X obj 444 203 +~ 0.5;
+#X obj 445 229 wrap~;
+#X obj 445 254 s~ phase2;
+#X obj 6 505 +~;
+#X text 391 43 <-- transposition \, halftones/10;
+#X obj 8 67 * 0.001;
+#X obj 7 215 phasor~;
+#X obj 7 402 *~ 44100;
+#X obj 7 452 tabread4~ table23;
+#X obj 6 305 r chunk-size;
+#X obj 6 428 +~ 1;
+#X floatatom 365 161 5 0 0 0 - - -;
+#X obj 15 169 s precession;
+#X obj 482 103 t b f;
+#X obj 482 78 r precession;
+#X obj 7 146 * 0.01;
+#X obj 258 485 *~;
+#X obj 258 387 +~;
+#X obj 257 339 samphold~;
+#X obj 258 363 *~;
+#X obj 423 418 -~ 0.5;
+#X obj 423 442 *~ 0.5;
+#X obj 423 465 cos~;
+#X obj 296 387 r~ read-pt;
+#X obj 258 411 *~ 44100;
+#X obj 258 461 tabread4~ table23;
+#X obj 257 314 r chunk-size;
+#X obj 257 437 +~ 1;
+#X obj 345 340 r~ phase2;
+#X obj 293 364 r~ phase2;
+#X obj 423 394 r~ phase2;
+#X text 37 123 <-- precession \, percent;
+#X obj 8 3 loadbang;
+#X text 158 3 TIME COMPRESSION/EXPANSION BY LOOPED SAMPLING;
+#X text 111 529 Here \, rather than ask you to push the read pointer
+back and forth in the sample \, we use a phasor~. This makes it possible
+to avoid the samphold~ on the read pointer (r~ read-pt) \, since \,
+knowing the precession \, we can correct for it in computing the frequency
+of the original phasor~ at right.;
+#X text 111 626 We've changed the control for "chunk size" to milliseconds
+for added convenience \, and delayed multiplying sample location by
+the sample rate (44100) until the last moment \, so that calculations
+using "read-pt" and "chunk size" can be in the same units (seconds.)
+;
+#X msg 8 25 25;
+#X floatatom 139 192 4 0 900 0 - - -;
+#X obj 139 212 * 0.001;
+#X msg 139 170 900;
+#X text 48 47 <-- chunk size (msec);
+#X obj 357 136 expr (pow(2 \, $f1/120)-$f3)/$f2;
+#X obj 139 237 t b f;
+#X obj 139 146 loadbang;
+#X text 182 188 <-- loop length;
+#X text 223 203 (msec);
+#X obj 7 239 *~;
+#X obj 7 191 /;
+#X connect 0 0 20 0;
+#X connect 0 0 20 1;
+#X connect 1 0 31 0;
+#X connect 2 0 29 0;
+#X connect 3 0 41 0;
+#X connect 4 0 33 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 7 0 17 0;
+#X connect 9 0 5 1;
+#X connect 10 0 6 1;
+#X connect 12 0 67 0;
+#X connect 15 0 16 0;
+#X connect 16 0 67 0;
+#X connect 16 1 67 1;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 19 0 2 1;
+#X connect 22 0 8 0;
+#X connect 22 0 26 0;
+#X connect 25 0 4 1;
+#X connect 26 0 27 0;
+#X connect 27 0 28 0;
+#X connect 29 0 0 0;
+#X connect 31 0 11 0;
+#X connect 32 0 72 0;
+#X connect 33 0 36 0;
+#X connect 34 0 2 0;
+#X connect 35 0 5 0;
+#X connect 36 0 34 0;
+#X connect 39 0 67 0;
+#X connect 39 1 67 2;
+#X connect 40 0 39 0;
+#X connect 41 0 38 0;
+#X connect 41 0 73 0;
+#X connect 42 0 29 1;
+#X connect 43 0 50 0;
+#X connect 44 0 45 0;
+#X connect 45 0 43 0;
+#X connect 46 0 47 0;
+#X connect 47 0 48 0;
+#X connect 48 0 42 1;
+#X connect 49 0 43 1;
+#X connect 50 0 53 0;
+#X connect 51 0 42 0;
+#X connect 52 0 44 0;
+#X connect 53 0 51 0;
+#X connect 54 0 44 1;
+#X connect 55 0 45 1;
+#X connect 56 0 46 0;
+#X connect 58 0 62 0;
+#X connect 62 0 1 0;
+#X connect 63 0 64 0;
+#X connect 64 0 68 0;
+#X connect 64 0 72 1;
+#X connect 65 0 63 0;
+#X connect 67 0 22 0;
+#X connect 67 0 37 0;
+#X connect 68 0 73 0;
+#X connect 68 1 73 1;
+#X connect 69 0 65 0;
+#X connect 72 0 24 0;
+#X connect 73 0 32 0;
diff --git a/desiredata/doc/3.audio.examples/C01.nyquist.pd b/desiredata/doc/3.audio.examples/C01.nyquist.pd
new file mode 100644
index 00000000..256da0e3
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C01.nyquist.pd
@@ -0,0 +1,102 @@
+#N canvas 601 188 580 659 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array table24 259 float 1;
+#A 0 -0.294693 0 0.294693 0.4 0.28948 0.10749 0.022875 0.0789655 0.181673
+0.218249 0.171348 0.115564 0.119192 0.169863 0.201356 0.178657 0.137857
+0.138353 0.188891 0.23571 0.22487 0.164534 0.115848 0.125265 0.176634
+0.214361 0.205655 0.169043 0.14204 0.134157 0.124033 0.0997798 0.0859507
+0.118173 0.195202 0.270956 0.301868 0.293569 0.285908 0.289835 0.256276
+0.128881 -0.0684912 -0.215994 -0.195335 -0.0145421 0.174701 0.203986
+0.0451069 -0.159794 -0.231026 -0.119011 0.0575033 0.135323 0.0628509
+-0.0665307 -0.124779 -0.0776696 0.000279083 0.0247376 -0.00546273 -0.0222151
+0.017933 0.0755681 0.0749102 4.97367e-06 -0.0729564 -0.0490464 0.0834901
+0.232853 0.286943 0.213202 0.0759584 -0.0357248 -0.0863297 -0.101697
+-0.115455 -0.125625 -0.107127 -0.0530433 0.012152 0.0608637 0.0902219
+0.111597 0.119683 0.0910146 0.0236817 -0.0326555 -0.0100379 0.100844
+0.216022 0.223032 0.094995 -0.0649958 -0.110291 0.00678482 0.180334
+0.247439 0.144699 -0.0319975 -0.124321 -0.0648335 0.0680811 0.141409
+0.100343 0.00354248 -0.0636733 -0.0891566 -0.131987 -0.227286 -0.316392
+-0.293048 -0.12222 0.100475 0.222686 0.173879 0.0281889 -0.0714016
+-0.0482686 0.0482418 0.108884 0.0773858 -0.00559103 -0.0590099 -0.0454391
+0.00509731 0.0411467 0.0421476 0.0225557 2.40108e-06 -0.0225508 -0.0421448
+-0.0411506 -0.00510821 0.0454302 0.0590142 0.0056084 -0.0773706 -0.108887
+-0.0482625 0.048252 0.0714103 -0.0281575 -0.173853 -0.222693 -0.100517
+0.122172 0.293026 0.316402 0.22731 0.132002 0.0891614 0.063682 -0.00352253
+-0.100324 -0.141412 -0.0681076 0.0648079 0.124324 0.0320316 -0.144663
+-0.247435 -0.180365 -0.00682225 0.110282 0.0650224 -0.0949583 -0.223017
+-0.216038 -0.100873 0.010022 0.0326611 -0.0236657 -0.0910033 -0.119682
+-0.111601 -0.0902271 -0.0608718 -0.0121649 0.0530291 0.107119 0.125625
+0.115458 0.101699 0.0863353 0.0357423 -0.0759289 -0.213176 -0.28694
+-0.232878 -0.0835252 0.0490278 0.0729642 1.4921e-05 -0.0749008 -0.0755765
+-0.0179463 0.0222127 0.00547055 -0.0247352 -0.000292052 0.0776522 0.12478
+0.0665546 -0.062824 -0.135322 -0.0575355 0.118973 0.23102 0.159828
+-0.0450604 -0.203969 -0.174729 0.014495 0.195309 0.21601 0.0685338
+-0.128843 -0.25626 -0.289835 -0.285909 -0.293565 -0.30187 -0.270969
+-0.195221 -0.118186 -0.0859518 -0.0997742 -0.124029 -0.134156 -0.142036
+-0.169035 -0.205649 -0.214364 -0.176646 -0.125273 -0.115843 -0.16452
+-0.22486 -0.235715 -0.188904 -0.13836 -0.137851 -0.178647 -0.201357
+-0.169874 -0.1192 -0.115557 -0.171333 -0.218246 -0.181691 -0.0789875
+-0.0228734 -0.107456 -0.289441 -0.399997 -0.294741 -7.20325e-05 0.294645
+;
+#X coords 0 1.02 258 -1.02 258 130 1;
+#X restore 93 408 graph;
+#X obj 33 288 line~;
+#X msg 33 237 500 \, 1423 4000;
+#X floatatom 41 262 5 0 0 0 - - -;
+#X text 24 556 Synthesis techniques vary in their tendency to make
+foldover. For higher pitched sounds you'll want to try out relatively
+folvover-resistant ones.;
+#X obj 33 342 output~;
+#X obj 201 281 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 0 0 618 384 make-tab 0;
+#X obj 13 28 inlet;
+#X obj 99 28 inlet;
+#X obj 183 28 inlet;
+#X obj 255 29 inlet;
+#X msg 38 176 \; table24 sinesum 256 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0
+1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 \, normalize
+0.4;
+#X msg 14 277 \; table24 sinesum 256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 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 \, normalize
+0.2;
+#X msg 183 101 \; table24 const 0 \, 0 1 1 1 1 1;
+#X msg 255 58 \; table24 const 0;
+#X connect 0 0 5 0;
+#X connect 1 0 4 0;
+#X connect 2 0 6 0;
+#X connect 3 0 7 0;
+#X restore 201 355 pd make-tab;
+#X obj 232 300 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 263 317 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 295 334 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 222 276 sine;
+#X text 252 297 complex;
+#X text 284 314 rectangle;
+#X text 313 332 clear;
+#X obj 33 315 tabosc4~ table24;
+#X text 56 2 THE NYQUIST THEOREM AND FOLDOVER;
+#X text 30 33 WARNING: PLAY THIS QUIETLY TO AVOID UNPLEASANTNESS AND
+POSSIBLE EAR DAMAGE.;
+#X text 29 77 Foldover occurs when you synthesize frequencies greater
+than the Nyquist frequency (half the sample rate). In this example
+\, the fundamental only reaches 1423 \, but the tables contain high
+partials. As the partials sweep upward you hear them reflect off the
+Nyquist frequency. Also \, partials can come into contact with each
+other causing beating. The value of 1423 was chosen to make the beating
+effect especially strong if you're running at a sample rate of 44100
+(the usual one.);
+#X text 330 616 updated for Pd version 0.37;
+#X text 219 245 waveforms:;
+#X connect 1 0 15 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 6 0 7 0;
+#X connect 8 0 7 1;
+#X connect 9 0 7 2;
+#X connect 10 0 7 3;
+#X connect 15 0 5 0;
+#X connect 15 0 5 1;
diff --git a/desiredata/doc/3.audio.examples/C02.sawtooth-foldover.pd b/desiredata/doc/3.audio.examples/C02.sawtooth-foldover.pd
new file mode 100644
index 00000000..f52fc548
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C02.sawtooth-foldover.pd
@@ -0,0 +1,39 @@
+#N canvas 180 71 562 473 12;
+#X obj 155 348 output~;
+#X text 310 443 updated for Pd version 0.37;
+#X text 56 2 FOLDOVER IN SAWTOOTH WAVES;
+#X obj 154 320 clip~ 0 1;
+#X obj 155 153 mtof;
+#X floatatom 155 131 3 0 0 0 - - -;
+#X obj 155 269 *~ 20;
+#X obj 155 295 -~ 19;
+#X obj 155 177 phasor~;
+#N canvas 0 0 560 183 /SUBPATCH/ 0;
+#X obj 25 74 loadbang;
+#X msg 25 99 61;
+#X obj 25 124 outlet;
+#X text 7 6 This sets the pitch initially to 61 when the patch is first
+opened.;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X restore 155 105 pd;
+#X text 190 130 <--pitch;
+#X obj 164 206 output~;
+#X text 237 205 <--sawtooth amplitude;
+#X text 233 373 <--pulse train amplitude;
+#X text 28 406 We'll explain more about making pulses later on... this
+example is mostly intended as ear training.;
+#X text 19 23 In more ordinary kinds of waveforms \, foldover comes
+across as a "cheap synth" sound. You can hear the foldover clearly
+in the pulse train here \, and less clearly (but still audibly) in
+the straight sawtooth \, especially at high pitches.;
+#X connect 3 0 0 0;
+#X connect 3 0 0 1;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 6 0 7 0;
+#X connect 7 0 3 0;
+#X connect 8 0 6 0;
+#X connect 8 0 11 0;
+#X connect 8 0 11 1;
+#X connect 9 0 5 0;
diff --git a/desiredata/doc/3.audio.examples/C03.zipper.noise.pd b/desiredata/doc/3.audio.examples/C03.zipper.noise.pd
new file mode 100644
index 00000000..a49f51ad
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C03.zipper.noise.pd
@@ -0,0 +1,55 @@
+#N canvas 298 115 555 414 12;
+#X obj 42 349 output~;
+#X text 302 376 updated for Pd version 0.37;
+#X text 56 2 ZIPPER NOISE;
+#X obj 43 321 *~;
+#X obj 125 350 output~;
+#X obj 126 322 *~;
+#X obj 65 262 line;
+#X obj 149 262 line~;
+#N canvas 0 0 450 300 metro 0;
+#X obj 88 39 loadbang;
+#X msg 87 65 1;
+#X obj 87 96 metro 500;
+#X obj 87 131 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 87 153 sel 0 1;
+#X obj 87 190 outlet;
+#X obj 151 192 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 4 1 6 0;
+#X restore 65 170 pd metro;
+#X obj 65 198 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 132 199 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 65 219 1 300;
+#X msg 132 221 0 300;
+#X obj 72 290 osc~ 880;
+#X text 30 28 Here is a related issue: if we use a (control) line object
+to change an amplitude \, it sends ramping control messages \, once
+every 20 msec by default. At left we use this to control the amplitude
+of a sinusoid. In effect we're multiplying the sinusoid by a staircase
+signal (50 increments per second.) Using the signal version \, line~
+\, fixes the problem. Line~ outputs a ramp that is incremented every
+sample.;
+#X connect 3 0 0 0;
+#X connect 3 0 0 1;
+#X connect 5 0 4 0;
+#X connect 5 0 4 1;
+#X connect 6 0 3 1;
+#X connect 7 0 5 1;
+#X connect 8 0 9 0;
+#X connect 8 1 10 0;
+#X connect 9 0 11 0;
+#X connect 10 0 12 0;
+#X connect 11 0 6 0;
+#X connect 11 0 7 0;
+#X connect 12 0 6 0;
+#X connect 12 0 7 0;
+#X connect 13 0 3 0;
+#X connect 13 0 5 0;
diff --git a/desiredata/doc/3.audio.examples/C04.control.to.signal.pd b/desiredata/doc/3.audio.examples/C04.control.to.signal.pd
new file mode 100644
index 00000000..eed326dd
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C04.control.to.signal.pd
@@ -0,0 +1,48 @@
+#N canvas 215 77 561 455 12;
+#X text 14 7 CONVERTING CONTROL TO SIGNALS;
+#X obj 29 350 output~;
+#X obj 107 352 output~;
+#N canvas 0 0 450 300 metro 0;
+#X obj 88 39 loadbang;
+#X msg 87 65 1;
+#X obj 87 131 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 87 153 sel 0 1;
+#X obj 87 190 outlet;
+#X obj 151 192 outlet;
+#X obj 87 96 metro 2;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 6 0 2 0;
+#X restore 30 242 pd metro;
+#X msg 30 268 1 2;
+#X msg 97 270 0 2;
+#X obj 30 305 line~;
+#X obj 108 306 vline~;
+#X text 13 107 Here we try out line~ and vline~ as triangle wave generators.
+The subpatch is still sending alternating bangs as in the last patch
+\, but now at an audible frequency \, every 2 msec.;
+#X text 17 172 The effect of line~ rounding breakpoints to the nearest
+block (on the order of a millisecond) is that each 4-millisecond-long
+cycle has a different shape. Using vline~ resolves the problem.;
+#X text 385 437 Updated for Pd 0.37;
+#X text 16 411 Sometimes you will want to use vline~ in place of sig~
+for the same reason.;
+#X text 15 27 For controlling amplitudes \, line~ \, with its block-aligned
+breakpoints \, is accurate enough for most purposes. But certain usages
+\, such as this patch \, demand more accuracy. The vline~ object \,
+somewhat more expensive than line~ \, can handle breakpoints to sub-sample
+accuracy.;
+#X connect 3 0 4 0;
+#X connect 3 1 5 0;
+#X connect 4 0 6 0;
+#X connect 4 0 7 0;
+#X connect 5 0 6 0;
+#X connect 5 0 7 0;
+#X connect 6 0 1 0;
+#X connect 6 0 1 1;
+#X connect 7 0 2 0;
+#X connect 7 0 2 1;
diff --git a/desiredata/doc/3.audio.examples/C05.sampler.oneshot.pd b/desiredata/doc/3.audio.examples/C05.sampler.oneshot.pd
new file mode 100644
index 00000000..f75d5517
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C05.sampler.oneshot.pd
@@ -0,0 +1,84 @@
+#N canvas 34 0 985 746 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array tab28 176403 float 0;
+#X coords 0 1.02 176403 -1.02 200 130 1;
+#X restore 740 126 graph;
+#X obj 577 486 loadbang;
+#X obj 31 340 hip~ 5;
+#X obj 587 345 adc~ 1;
+#X obj 587 375 hip~ 5;
+#X msg 558 306 bang;
+#X text 681 492 v-- re-read the original sample;
+#X text 20 6 ONE-SHOT SAMPLER USING LINE~ AS PHASE;
+#X obj 31 306 *~;
+#X obj 71 279 r cutoff;
+#X obj 31 194 r phase;
+#X msg 24 37 bang;
+#X obj 124 92 delay 5;
+#X text 77 37 <-- play the sample;
+#X msg 24 128 \; cutoff 0 5;
+#X text 34 85 cut the;
+#X text 34 104 sound off;
+#X text 204 77 Wait for the;
+#X text 202 97 cutoff to finish;
+#X text 349 121 set the upper line~ to start;
+#X text 349 140 at the first sample and go;
+#X text 348 161 forever (until the next trigger);
+#X text 18 486 To start a note \, first we have to mute the output
+in case ther's already something playing---otherwise we'll get a click.
+The "cutoff" line~ then takes 5 msec to get to zero. After that amount
+of delay \, we reset the phase to sample number 1 and set it in motion.
+We want the line~ output to increase by 1 each sample of output \,
+so we ask for it to do 4.41e+08 samples in 1e+07 milliseconds.;
+#X text 18 602 The cutoff mechanism is still safe if we happen to ask
+for two notes in under 5 msec. The second request would reset the delay
+\, so that there's no way the delay can possibly fire without the cutoff
+line~ at zero.;
+#X text 596 305 <-- record;
+#X obj 622 405 line~;
+#X obj 587 410 *~;
+#X text 738 267 ------ 4 seconds ------;
+#X obj 655 342 del 3990;
+#X msg 655 370 0 10;
+#X text 706 371 <--stop recording;
+#X text 19 672 We avoid clicking at the end of the table by getting
+the table's own contents to go smoothly to zero. To do this we added
+a level control to the recording patch that cuts off just before the
+recording reaches the end of the table.;
+#X text 576 599 this is.;
+#X text 578 575 My apologies to Jonathan Harvey whose bell;
+#X obj 577 545 soundfiler;
+#X text 19 443 Here's how to make a sampler with a line~ object \,
+instead of a phasor~ \, to generate the read location signal.;
+#X obj 71 306 vline~;
+#X obj 30 369 output~;
+#X obj 31 224 vline~;
+#X obj 558 439 tabwrite~ tab28;
+#X msg 577 516 read ../sound/bell.aiff tab28;
+#X obj 31 254 tabread4~ tab28;
+#X msg 124 127 \; phase 1 \, 4.41e+08 1e+07 \; cutoff 1;
+#X msg 497 386 0 \, 1 5;
+#X text 719 717 updated for Pd version 0.37;
+#X connect 1 0 40 0;
+#X connect 2 0 37 0;
+#X connect 2 0 37 1;
+#X connect 3 0 4 0;
+#X connect 4 0 26 0;
+#X connect 5 0 28 0;
+#X connect 5 0 43 0;
+#X connect 5 0 39 0;
+#X connect 8 0 2 0;
+#X connect 9 0 36 0;
+#X connect 10 0 38 0;
+#X connect 11 0 14 0;
+#X connect 11 0 12 0;
+#X connect 12 0 42 0;
+#X connect 25 0 26 1;
+#X connect 26 0 39 0;
+#X connect 28 0 29 0;
+#X connect 29 0 25 0;
+#X connect 36 0 8 1;
+#X connect 38 0 41 0;
+#X connect 40 0 34 0;
+#X connect 41 0 8 0;
+#X connect 43 0 25 0;
diff --git a/desiredata/doc/3.audio.examples/C06.signal.to.control.pd b/desiredata/doc/3.audio.examples/C06.signal.to.control.pd
new file mode 100644
index 00000000..1c3e4bf0
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C06.signal.to.control.pd
@@ -0,0 +1,25 @@
+#N canvas 215 77 561 455 12;
+#N canvas 0 0 269 179 metro 0;
+#X obj 88 39 loadbang;
+#X msg 87 65 1;
+#X obj 87 128 outlet;
+#X obj 87 96 metro 100;
+#X msg 178 70 \; pd dsp 1;
+#X connect 0 0 1 0;
+#X connect 0 0 4 0;
+#X connect 1 0 3 0;
+#X connect 3 0 2 0;
+#X restore 41 247 pd metro;
+#X text 374 425 Updated for Pd 0.37;
+#X obj 41 316 snapshot~;
+#X obj 66 286 phasor~ 1;
+#X floatatom 41 347 5 0 0 0 - - -;
+#X text 14 7 CONVERTING SIGNALS TO CONTROLS;
+#X text 15 35 The snapshot~ object allows you to convert from signals
+back to control streams (float messages) -- an opposite of signal~.
+The value output is always the end of the most recently computed audio
+block \, so that even if you bang it metronomically (as here) it need
+not give you samples that are exactly evenly spaced.;
+#X connect 0 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
diff --git a/desiredata/doc/3.audio.examples/C07.envelope.follower.pd b/desiredata/doc/3.audio.examples/C07.envelope.follower.pd
new file mode 100644
index 00000000..51f8f56b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C07.envelope.follower.pd
@@ -0,0 +1,113 @@
+#N canvas 66 7 617 909 12;
+#X text 164 5 ENVELOPE FOLLOWERS;
+#X text 10 25 The env~ object reports ths RMS signal level over the
+last 256 samples (by default) or any other power of 2 that's at least
+twice the block size. The analysis is done in an overlapped fashion
+so that results appear every N/2 points if N is the analysis window
+size. So the larger the window \, the stabler the result and the less
+frequently it appears. Computation time doesn't depend heavily on N.
+;
+#X text 11 135 Envelope followers are frequently used to detect attacks
+and periods of silence. (There are fancier attack detectors out there
+\, though.) Here is a simple threshold-based attack and rest detector.
+;
+#X obj 102 297 dbtorms;
+#X obj 23 293 osc~ 440;
+#X obj 23 339 env~;
+#X floatatom 78 329 0 0 0 0 - - -;
+#X floatatom 102 274 0 0 0 0 - - -;
+#X msg 451 320 \; pd dsp 1;
+#X obj 119 380 t b f;
+#X floatatom 119 403 0 0 0 0 - - -;
+#X obj 126 458 pack;
+#X obj 126 481 route 0 1;
+#X obj 126 504 > 55;
+#X obj 176 504 < 45;
+#X obj 126 527 sel 1;
+#X obj 176 527 sel 1;
+#X msg 90 538 1;
+#X msg 90 516 0;
+#X obj 126 564 print attack;
+#X obj 119 435 != 0;
+#X obj 24 612 t b f;
+#X floatatom 15 638 0 0 0 0 - - -;
+#X obj 27 688 pack;
+#X obj 27 711 route 0 1;
+#X obj 27 749 sel 1;
+#X msg 6 856 1;
+#X msg 7 879 0;
+#X obj 20 666 != 0;
+#X obj 58 639 < 45;
+#X obj 31 783 timer;
+#X obj 113 712 sel 0;
+#X obj 95 832 sel 0;
+#X obj 45 832 sel 1;
+#X obj 45 873 print rest;
+#X obj 31 806 > 1000;
+#X text 162 403 state -- 1 if waiting for low threshold \,;
+#X text 199 418 0 if we've attained it and now want the;
+#X text 202 434 high one.;
+#X text 209 480 route the RMS value according to state;
+#X text 239 506 if off \, 55 dB means attack. If on \, 45;
+#X text 240 527 dB or less means state changes to off.;
+#X text 132 359 ATTACK DETECTION;
+#X text 40 594 REST DETECTION;
+#X text 100 637 Here we always will test RMS against a low value;
+#X text 125 654 but as before we route the result according to;
+#X text 147 671 our state \, 1 if "resting" \, 0 if not.;
+#X text 163 709 regardless of state \, when RMS isn't low;
+#X text 185 724 reset the timer;
+#X text 202 846 RMS isn't low enough.;
+#X text 120 744 If we're not in rest \, and the RMS is low \,;
+#X text 143 761 check elapsed time sinse RMS last wasn't low.;
+#X text 122 802 If more than 1 second \, report a rest.;
+#X text 170 828 If we're at rest \, pop out of it when;
+#X text 11 201 Both detectors are state machines with two states \,
+on and off. If on \, a test is run to determine whether to turn off
+\, and vice versa. The tests are run at each output of the rms~ object.
+;
+#X text 355 884 updated for Pd version 0.37;
+#X text 109 320 note 3.01 dB difference between;
+#X text 113 336 peak and RMS amplitudes.;
+#X obj 451 297 loadbang;
+#X obj 23 316 *~;
+#X connect 3 0 59 1;
+#X connect 4 0 59 0;
+#X connect 5 0 6 0;
+#X connect 5 0 9 0;
+#X connect 5 0 21 0;
+#X connect 7 0 3 0;
+#X connect 9 0 10 0;
+#X connect 9 1 11 1;
+#X connect 10 0 20 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 12 1 14 0;
+#X connect 13 0 15 0;
+#X connect 14 0 16 0;
+#X connect 15 0 17 0;
+#X connect 15 0 19 0;
+#X connect 16 0 18 0;
+#X connect 17 0 10 0;
+#X connect 18 0 10 0;
+#X connect 20 0 11 0;
+#X connect 21 0 22 0;
+#X connect 21 1 29 0;
+#X connect 22 0 28 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 24 1 32 0;
+#X connect 25 0 30 1;
+#X connect 26 0 22 0;
+#X connect 27 0 22 0;
+#X connect 28 0 23 0;
+#X connect 29 0 23 1;
+#X connect 29 0 31 0;
+#X connect 30 0 35 0;
+#X connect 31 0 30 0;
+#X connect 32 0 27 0;
+#X connect 33 0 26 0;
+#X connect 33 0 34 0;
+#X connect 35 0 33 0;
+#X connect 58 0 8 0;
+#X connect 59 0 5 0;
diff --git a/desiredata/doc/3.audio.examples/C08.analog.sequencer.pd b/desiredata/doc/3.audio.examples/C08.analog.sequencer.pd
new file mode 100644
index 00000000..9ee9e6de
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C08.analog.sequencer.pd
@@ -0,0 +1,156 @@
+#N canvas 46 22 825 554 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array 29-sequence 9 float 1;
+#A 0 55 550 385 495 165 385 495 275 615;
+#X coords 0 500 8 0 200 100 1;
+#X restore 621 42 graph;
+#X obj 27 426 *~;
+#X obj 27 454 hip~ 5;
+#N canvas 0 0 450 300 graph1 0;
+#X array 29-envelope 103 float 1;
+#A 0 -0.1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 1.01111 1 0.988889 0.977778
+0.966667 0.955556 0.944444 0.933333 0.922222 0.911111 0.9 0.888889
+0.797778 0.737777 0.677777 0.647777 0.617777 0.557777 0.487777 0.467777
+0.447776 0.417776 0.397776 0.387776 0.377776 0.367776 0.347776 0.327776
+0.317776 0.297776 0.277776 0.267776 0.257776 0.257776 0.277776 0.297776
+0.327776 0.357776 0.377776 0.397776 0.407776 0.427776 0.437776 0.387776
+0.367776 0.347776 0.337776 0.287776 0.277776 0.277776 0.277776 0.267776
+0.267776 0.267776 0.297776 0.317776 0.347776 0.367776 0.367776 0.357776
+0.347776 0.337776 0.307776 0.287776 0.257776 0.227776 0.197776 0.167776
+0.167776 0.167776 0.167776 0.167776 0.157776 0.157776 0.157776 0.157776
+0.147776 0.147776 0.147776 0.137776 0.137776 0.111111 0.1 0.0888889
+0.0777778 0.0666667 0.0555556 0.0444444 0.0333333 0.0222222 0.0111111
+0 -0.0111111;
+#X coords 0 1 102 0 200 100 1;
+#X restore 622 146 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array 29-sample 259 float 1;
+#A 0 0.989177 1 0.989177 0.95694 0.903989 0.83147 0.740952 0.634394
+0.514103 0.382684 0.242981 0.0980184 -0.0490663 -0.195089 -0.336888
+-0.471395 -0.595698 -0.707105 -0.803206 -0.88192 -0.941543 -0.980785
+-0.998795 -0.995185 -0.970032 -0.923881 -0.85773 -0.773013 -0.671561
+-0.555573 -0.427558 -0.290288 -0.146734 -3.98038e-06 0.146726 0.290281
+0.427551 0.555566 0.671556 0.773007 0.857726 0.923878 0.97003 0.995184
+0.998796 0.980786 0.941546 0.881924 0.803211 0.707111 0.595704 0.471402
+0.336896 0.195097 0.0490743 -0.0980105 -0.242974 -0.382677 -0.514097
+-0.634388 -0.740946 -0.831465 -0.903986 -0.956938 -0.989175 -1 -0.989178
+-0.956943 -0.903993 -0.831474 -0.740957 -0.6344 -0.51411 -0.382692
+-0.242989 -0.0980263 0.0490584 0.195081 0.336881 0.471388 0.595691
+0.7071 0.803202 0.881916 0.941541 0.980783 0.998795 0.995186 0.970034
+0.923884 0.857734 0.773018 0.671567 0.55558 0.427566 0.290296 0.146742
+1.19412e-05 -0.146719 -0.290273 -0.427544 -0.55556 -0.67155 -0.773002
+-0.857722 -0.923875 -0.970028 -0.995183 -0.998796 -0.980788 -0.941549
+-0.881928 -0.803216 -0.707117 -0.595711 -0.471409 -0.336903 -0.195104
+-0.0490822 0.0980025 0.242966 0.38267 0.51409 0.634382 0.740941 0.831461
+0.903983 0.956936 0.989174 1 0.989179 0.956945 0.903996 0.831479 0.740962
+0.634406 0.514117 0.382699 0.242997 0.0980342 -0.0490504 -0.195073
+-0.336873 -0.471381 -0.595685 -0.707094 -0.803197 -0.881913 -0.941538
+-0.980782 -0.998795 -0.995187 -0.970036 -0.923887 -0.857738 -0.773023
+-0.671573 -0.555586 -0.427573 -0.290303 -0.14675 -1.99019e-05 0.146711
+0.290265 0.427537 0.555553 0.671544 0.772997 0.857718 0.923872 0.970026
+0.995183 0.998797 0.980789 0.941551 0.881931 0.803221 0.707122 0.595717
+0.471416 0.336911 0.195112 0.0490902 -0.0979946 -0.242958 -0.382662
+-0.514083 -0.634375 -0.740936 -0.831457 -0.903979 -0.956933 -0.989173
+-1 -0.98918 -0.956947 -0.904 -0.831483 -0.740968 -0.634412 -0.514124
+-0.382706 -0.243004 -0.0980421 0.0490425 0.195065 0.336866 0.471374
+0.595679 0.707088 0.803192 0.881909 0.941535 0.98078 0.998794 0.995187
+0.970038 0.92389 0.857742 0.773028 0.671579 0.555593 0.42758 0.290311
+0.146758 2.78627e-05 -0.146703 -0.290258 -0.42753 -0.555547 -0.671538
+-0.772992 -0.857714 -0.923868 -0.970024 -0.995182 -0.998797 -0.980791
+-0.941554 -0.881935 -0.803225 -0.707128 -0.595723 -0.471423 -0.336918
+-0.19512 -0.0490981 0.0979867 0.24295 0.382655 0.514076 0.634369 0.74093
+0.831452 0.903976 0.956931 0.989172 1 0.989181;
+#X coords 0 1 258 -1 200 100 1;
+#X restore 619 281 graph;
+#X text 566 533 updated for Pd version 0.37;
+#X obj 26 218 tabread~ 29-sequence;
+#X obj 106 241 wrap~;
+#X obj 106 265 *~ 100;
+#X obj 106 289 +~ 1;
+#X obj 26 242 phasor~;
+#X obj 26 266 -~ 0.5;
+#X obj 27 377 cos~;
+#X obj 84 336 *~;
+#X obj 28 488 output~;
+#X obj 84 408 tabread4~ 29-sample;
+#X obj 106 313 tabread4~ 29-envelope;
+#X obj 84 360 *~ 128;
+#X obj 84 384 +~ 129;
+#X obj 27 401 +~ 1;
+#X obj 26 194 *~ 9;
+#N canvas 328 85 609 424 make-tables 0;
+#X msg 109 52 bang;
+#X obj 109 77 t b b;
+#X obj 152 134 f;
+#X obj 190 134 + 1;
+#X msg 174 106 0;
+#X obj 109 103 until;
+#X obj 152 162 t f f;
+#X obj 27 190 moses 10;
+#X obj 18 272 tabwrite 29-envelope;
+#X obj 75 159 sel 102;
+#X obj 23 218 expr ($f1-1)/10;
+#X obj 35 243 expr (101-$f1)/90;
+#X msg 120 380 \; 29-sample cosinesum 256 0 0 0 0 0 0 1;
+#X msg 120 338 \; 29-sequence 0 55 550 385 495 165 385 495 275 615
+;
+#X text 30 8 bang to recalculate the envelope table (I did this but
+then went in and changed it with the mouse afterward.);
+#X text 84 299 The sequence is just a list of specified frequencies
+\; the wavetable is a cosine.;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 1 1 4 0;
+#X connect 2 0 3 0;
+#X connect 2 0 6 0;
+#X connect 2 0 9 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 6 1 8 1;
+#X connect 7 0 10 0;
+#X connect 7 1 11 0;
+#X connect 9 0 5 1;
+#X connect 10 0 8 0;
+#X connect 11 0 8 0;
+#X restore 689 401 pd make-tables;
+#X text 46 1 ANALOG-SYNTH-STYLE SEQUENCER;
+#X obj 26 170 phasor~ 0.6;
+#X text 27 27 Some control operations can be carried out entirely by
+tilde objects passing audio signals around. Here is an imitation of
+an analog sequencer and envelope generator. A phasor~ loops through
+the "sequence" table at 0.6 Hz \, generating 9 frequencies. Simultaneously
+\, by multiplying by 9 and wrapping \, we create a sawtooth at 9*0.6=5.4
+Hz \, which reads a second table for an envelope shape. This becomes
+the grain size for a samplerbased on the 18.sampler.looped example
+earlier.;
+#X text 97 194 main loop: sawtooth of amplitude 9;
+#X text 218 219 read frequency sequence;
+#X text 162 241 9x original frequency sawtooth;
+#X text 173 266 adjust for reading;
+#X text 346 266 envelope sample;
+#X text 123 336 multiply envelope by audio-frequency sawtooth;
+#X text 147 361 adjust amplitude and center for wavetable;
+#X text 62 428 multiply by raised-cosine smoothing function;
+#X text 478 401 how to make the tables:;
+#X connect 1 0 2 0;
+#X connect 2 0 14 0;
+#X connect 2 0 14 1;
+#X connect 6 0 10 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 16 0;
+#X connect 10 0 11 0;
+#X connect 11 0 13 0;
+#X connect 11 0 12 0;
+#X connect 12 0 19 0;
+#X connect 13 0 17 0;
+#X connect 15 0 1 1;
+#X connect 16 0 13 1;
+#X connect 17 0 18 0;
+#X connect 18 0 15 0;
+#X connect 19 0 1 0;
+#X connect 20 0 6 0;
+#X connect 20 0 7 0;
+#X connect 23 0 20 0;
diff --git a/desiredata/doc/3.audio.examples/C09.sample.hold.pd b/desiredata/doc/3.audio.examples/C09.sample.hold.pd
new file mode 100644
index 00000000..dc41aacd
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C09.sample.hold.pd
@@ -0,0 +1,104 @@
+#N canvas 120 85 930 452 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array samphold 44100 float 0;
+#X coords 0 1 44100 0 300 200 1;
+#X restore 606 36 graph;
+#N canvas 0 0 439 429 tables 0;
+#N canvas 0 0 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 1e-04 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 78 55 graph;
+#X text 280 148 0;
+#X text 282 48 10;
+#X text 97 158 ------ 123 samples ------;
+#N canvas 0 0 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 85 232 graph;
+#X text 95 340 ------ 130 samples ------;
+#X text 294 325 0;
+#X text 296 225 12000;
+#X restore 648 280 pd tables;
+#X text 67 8 SAMPLE AND HOLD;
+#X obj 141 266 phasor~ 5;
+#X obj 44 241 phasor~ 7;
+#X obj 44 266 samphold~;
+#X floatatom 44 216 0 0 0 0 - - -;
+#X floatatom 141 211 0 0 0 0 - - -;
+#X obj 216 319 tabwrite~ samphold;
+#X msg 216 294 bang;
+#X obj 44 341 tabread4~ mtof;
+#X obj 44 291 *~ 48;
+#X obj 44 316 +~ 36;
+#X obj 44 366 osc~;
+#X msg 216 236 0;
+#X text 259 293 <--graph output;
+#X obj 44 191 unpack;
+#X text 254 233 <-- reset phase;
+#X msg 311 131 32 96.33;
+#X msg 124 131 5 7;
+#X msg 44 131 1 5;
+#X msg 78 131 2 11;
+#X msg 161 131 3.7 8.8;
+#X msg 235 131 3.4 8.9;
+#X text 16 31 Another analog favorite \, the sample and hold unit freezes
+an audio signal on command. In the Pd version \, the second input of
+samphold~ triggers it \, and the first input becomes the output's new
+value whenever the trigger decreases from one sample to the next. This
+is ideal for updating values when a phasor wraps around.;
+#X text 679 428 updated for Pd version 0.37;
+#X obj 44 392 output~;
+#X connect 3 0 5 1;
+#X connect 4 0 5 0;
+#X connect 5 0 11 0;
+#X connect 5 0 8 0;
+#X connect 6 0 4 0;
+#X connect 7 0 3 0;
+#X connect 9 0 8 0;
+#X connect 10 0 13 0;
+#X connect 11 0 12 0;
+#X connect 12 0 10 0;
+#X connect 13 0 26 0;
+#X connect 13 0 26 1;
+#X connect 14 0 3 1;
+#X connect 14 0 4 1;
+#X connect 16 0 6 0;
+#X connect 16 1 7 0;
+#X connect 18 0 16 0;
+#X connect 19 0 16 0;
+#X connect 20 0 16 0;
+#X connect 21 0 16 0;
+#X connect 22 0 16 0;
+#X connect 23 0 16 0;
diff --git a/desiredata/doc/3.audio.examples/C10.monophonic.synth.pd b/desiredata/doc/3.audio.examples/C10.monophonic.synth.pd
new file mode 100644
index 00000000..66b14564
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/C10.monophonic.synth.pd
@@ -0,0 +1,107 @@
+#N canvas 57 27 578 769 12;
+#X obj 13 514 mtof;
+#X obj 13 463 stripnote;
+#X obj 164 519 select;
+#X obj 155 413 float;
+#X obj 164 381 t b f;
+#X obj 164 487 float;
+#X text 217 367 f - store pitch below;
+#X text 209 415 velocity stored here;
+#X text 128 459 off;
+#X text 216 486 recall pitch;
+#X text 132 2 MONOPHONIC MIDI SYNTH;
+#X obj 13 340 unpack;
+#X obj 13 273 notein;
+#X obj 13 300 pack;
+#X obj 94 570 line~;
+#X msg 94 544 \$1 100;
+#X msg 164 545 0 1000;
+#X text 15 75 First \, at top \, incoming MIDI notes are parsed and
+used to set pitch and trigger an ADSR envelope. Second \, the envelope
+generator itself has been extended to offer controls over the time
+and target values via number boxes.;
+#X text 17 21 This patch shows how to make a monophonic synthesizer
+that could be controlled from a MIDI or voltage-control keyboard--in
+this example we assume MIDI.;
+#X msg 152 290 55 64;
+#X msg 152 316 55 0;
+#X msg 95 291 48 64;
+#X msg 95 317 48 0;
+#X text 14 142 The note-off testing is complicated by the fact that
+we have to test both that the velocity is zero \, and further that
+the note-off pitch matches the pitch that is now playing (the most
+recent note-on pitch.);
+#X text 218 387 b - bang to recall velocity;
+#X obj 155 442 sel 0;
+#X text 177 463 on;
+#X obj 16 712 output~;
+#X obj 15 688 hip~ 5;
+#X obj 14 642 *~;
+#X obj 13 541 phasor~;
+#X obj 13 565 -~ 0.5;
+#X obj 14 593 cos~;
+#X obj 102 617 *~;
+#X obj 14 617 +~ 1;
+#X text 332 741 updated for Pd version 0.37;
+#X obj 102 665 cos~;
+#X msg 95 268 48 128;
+#X text 18 491 pitch;
+#X text 19 443 messages;
+#X text 210 441 test for note on or off;
+#X text 227 520 test against latest;
+#X text 270 535 note-on pitch;
+#X text 18 407 filter;
+#X text 19 425 note-on;
+#X obj 15 664 *~;
+#X obj 94 517 / 127;
+#X text 14 208 The synthesis technique is the same as in the previous
+patch \, done in a simpler (but less general) way with a cos~ object
+replacing the wavetable lookup.;
+#X text 148 571 envelope generator now controls amplitude;
+#X text 317 589 as well as grain size;
+#X obj 102 641 *~ 2;
+#X obj 123 594 +~ 0.5;
+#X text 148 687 The +~ 0.5 and *~ 2 are fudge factors.;
+#X text 148 648 This replaces the tabread4~;
+#X text 146 668 in the previous patch.;
+#X text 211 290 These buttons simulate MIDI input.;
+#X connect 0 0 30 0;
+#X connect 1 0 2 1;
+#X connect 1 0 0 0;
+#X connect 2 0 16 0;
+#X connect 3 0 25 0;
+#X connect 4 0 3 0;
+#X connect 4 1 5 1;
+#X connect 5 0 2 0;
+#X connect 11 0 1 0;
+#X connect 11 0 4 0;
+#X connect 11 1 1 1;
+#X connect 11 1 3 1;
+#X connect 12 0 13 0;
+#X connect 12 1 13 1;
+#X connect 13 0 11 0;
+#X connect 14 0 45 1;
+#X connect 14 0 51 0;
+#X connect 15 0 14 0;
+#X connect 16 0 14 0;
+#X connect 19 0 11 0;
+#X connect 20 0 11 0;
+#X connect 21 0 11 0;
+#X connect 22 0 11 0;
+#X connect 25 0 5 0;
+#X connect 25 1 46 0;
+#X connect 28 0 27 0;
+#X connect 28 0 27 1;
+#X connect 29 0 45 0;
+#X connect 30 0 31 0;
+#X connect 31 0 33 0;
+#X connect 31 0 32 0;
+#X connect 32 0 34 0;
+#X connect 33 0 50 0;
+#X connect 34 0 29 0;
+#X connect 36 0 29 1;
+#X connect 37 0 11 0;
+#X connect 45 0 28 0;
+#X connect 46 0 15 0;
+#X connect 50 0 36 0;
+#X connect 51 0 33 1;
diff --git a/desiredata/doc/3.audio.examples/D01.envelope.gen.pd b/desiredata/doc/3.audio.examples/D01.envelope.gen.pd
new file mode 100644
index 00000000..cd58d50c
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D01.envelope.gen.pd
@@ -0,0 +1,50 @@
+#N canvas 173 105 567 576 12;
+#X text 246 260 attack;
+#X text 317 261 release;
+#X obj 248 397 line~;
+#X msg 318 355 0 500;
+#X text 126 7 ENVELOPE GENERATORS;
+#X obj 65 369 phasor~ 50;
+#X obj 65 417 *~;
+#X obj 65 465 wrap~;
+#X msg 247 355 1 2500;
+#X obj 65 393 -~ 0.5;
+#X msg 182 331 10 200;
+#X obj 247 331 del 200;
+#X text 26 22 This patch uses an envelope generator to control a sound.
+When you hit "attack" two things happen. First \, the line~ object
+rises to 10 in 200 milliseconds. Then after a "delay" of the same 200
+msec \, the second message sends the line~ back down to 1 over another
+2500 msec. The "release" just ramps us down to zero at the end.;
+#X obj 65 513 output~;
+#X text 311 550 updated for Pd version 0.37;
+#X obj 65 441 +~ 0.5;
+#X obj 65 489 hip~ 5;
+#X obj 247 280 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 318 281 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 257 308 stop;
+#X text 28 121 You can hit the "attack" and/or "release" while something
+is still going on from a previous attack or release \, and the envelope
+generator does the ``right thing". In particular \, the release button
+sends a "stop" to the "del" object \, in case it is still scheduled
+to go off from a previous attack.;
+#X text 27 218 The synthesis method is a form of waveshaping \, which
+is the subject of a later chapter.;
+#X connect 2 0 6 1;
+#X connect 3 0 2 0;
+#X connect 5 0 9 0;
+#X connect 6 0 15 0;
+#X connect 7 0 16 0;
+#X connect 8 0 2 0;
+#X connect 9 0 6 0;
+#X connect 10 0 2 0;
+#X connect 11 0 8 0;
+#X connect 15 0 7 0;
+#X connect 16 0 13 0;
+#X connect 17 0 11 0;
+#X connect 17 0 10 0;
+#X connect 18 0 3 0;
+#X connect 18 0 19 0;
+#X connect 19 0 11 0;
diff --git a/desiredata/doc/3.audio.examples/D02.adsr.pd b/desiredata/doc/3.audio.examples/D02.adsr.pd
new file mode 100644
index 00000000..c2a6a940
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D02.adsr.pd
@@ -0,0 +1,42 @@
+#N canvas 40 23 609 630 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array adsr-output 44100 float 0;
+#X coords 0 1.02 44100 -1.02 200 130 1;
+#X restore 121 332 graph;
+#X text 121 464 ------ 1 second ------;
+#X obj 18 92 r trigger;
+#X obj 34 168 tabwrite~ adsr-output;
+#X obj 56 143 r graphit;
+#X msg 261 89 bang;
+#X text 305 90 <-- attack and delayed release;
+#X obj 272 113 del 500;
+#X text 376 196 <-- attack only;
+#X msg 261 177 \; pd dsp 1 \; trigger 1 \; graphit bang;
+#X text 377 273 <-- release only;
+#X msg 260 247 \; pd dsp 1 \; trigger 0 \; graphit bang;
+#X msg 272 138 \; trigger 0;
+#X text 324 452 -1;
+#X text 326 327 1;
+#X text 12 27 This patch introduces a simple "adsr" abstraction we'll
+use frequently. You can click on the "adsr" object to see what's inside.
+;
+#X text 16 516 The active ingredient of the ADSR envelope generator
+is a single line~ which gets passed messages to make the attack and
+release behavior. You can retrigger the ADSR envelope generator all
+you wish without having to wait for attacks or releases to finish;
+#X text 104 5 ENVELOPE GENERATOR ABSTRACTION;
+#X obj 18 118 adsr 1 100 200 50 300;
+#X text 356 601 updated for Pd version 0.37;
+#X obj 36 195 osc~ 440;
+#X obj 17 220 *~;
+#X obj 16 249 output~;
+#X connect 2 0 18 0;
+#X connect 4 0 3 0;
+#X connect 5 0 9 0;
+#X connect 5 0 7 0;
+#X connect 7 0 12 0;
+#X connect 18 0 3 0;
+#X connect 18 0 21 0;
+#X connect 20 0 21 1;
+#X connect 21 0 22 0;
+#X connect 21 0 22 1;
diff --git a/desiredata/doc/3.audio.examples/D03.envelope.dB.pd b/desiredata/doc/3.audio.examples/D03.envelope.dB.pd
new file mode 100644
index 00000000..70711f8a
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D03.envelope.dB.pd
@@ -0,0 +1,100 @@
+#N canvas 158 69 674 673 12;
+#X obj 32 80 r trigger;
+#X text 85 8 USING ADSR'S OUTPUT AS dB;
+#X obj 32 131 tabread4~ dbtorms;
+#N canvas 0 0 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 1e-04 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 387 83 graph;
+#N canvas 461 495 663 358 make-table 0;
+#X obj 97 195 moses 2;
+#X msg 81 44 bang;
+#X obj 81 73 t b b;
+#X obj 152 134 f;
+#X obj 190 134 + 1;
+#X msg 174 106 0;
+#X obj 81 102 until;
+#X obj 73 162 sel 122;
+#X msg 97 226 0;
+#X obj 141 227 dbtorms;
+#X obj 152 162 t f f;
+#X obj 97 259 tabwrite dbtorms;
+#X floatatom 435 103 0 0 0 0 - - -;
+#X floatatom 435 186 0 0 0 0 - - -;
+#X obj 435 157 tabread4 dbtorms;
+#X floatatom 331 183 0 0 0 0 - - -;
+#X obj 331 154 dbtorms;
+#X text 35 12 bang to recalculate the table;
+#X text 268 62 check accuracy of reading table against;
+#X text 268 81 the "real" dbtorms object.;
+#X connect 0 0 8 0;
+#X connect 0 1 9 0;
+#X connect 1 0 2 0;
+#X connect 2 0 6 0;
+#X connect 2 1 5 0;
+#X connect 3 0 4 0;
+#X connect 3 0 7 0;
+#X connect 3 0 10 0;
+#X connect 4 0 3 1;
+#X connect 5 0 3 1;
+#X connect 6 0 3 0;
+#X connect 7 0 6 1;
+#X connect 8 0 11 0;
+#X connect 9 0 11 0;
+#X connect 10 0 0 0;
+#X connect 10 1 11 1;
+#X connect 12 0 14 0;
+#X connect 12 0 16 0;
+#X connect 14 0 13 0;
+#X connect 16 0 15 0;
+#X restore 266 351 pd make-table;
+#X text 257 327 here's the patch I used to make the table:;
+#X obj 53 157 osc~ 440;
+#X text 589 176 0;
+#X text 590 77 10;
+#X text 406 186 ------ 123 samples ------;
+#X text 117 306 <-- attack;
+#X text 116 362 <-- release;
+#X msg 31 347 \; pd dsp 1 \; trigger 0;
+#X obj 32 182 *~;
+#X msg 30 292 \; pd dsp 1 \; trigger 1;
+#X obj 32 106 adsr 100 100 200 70 300;
+#X text 28 409 The table is indexed from 1 to 120 so that 1 gives a
+true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are
+for headroom.;
+#X text 25 459 (There's also a "real" dbtorms~ object... but it's almost
+certainly much more compute-intensive than tabread4~ \, since it has
+to call a library "exp" function.);
+#X text 26 518 Notice how the attack sounds different when you retrigger
+than when you start from zero. This is because if you go from the steady
+state you only rise 30 dB instead of 100 \, so it sounds slower...
+a slur effect. If you don't want this \, you might try increasing the
+amplitude of retriggered notes in comparison to isolated ones.;
+#X text 34 28 For more natural sounding amplitude control \, you can
+use the ADSR's output as log amplitude. In practice this is best done
+using a lookup table:;
+#X obj 31 211 output~;
+#X text 406 631 updated for Pd version 0.37;
+#X connect 0 0 15 0;
+#X connect 2 0 13 0;
+#X connect 6 0 13 1;
+#X connect 13 0 20 0;
+#X connect 13 0 20 1;
+#X connect 15 0 2 0;
diff --git a/desiredata/doc/3.audio.examples/D04.envelope.quartic.pd b/desiredata/doc/3.audio.examples/D04.envelope.quartic.pd
new file mode 100644
index 00000000..5b440ebe
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D04.envelope.quartic.pd
@@ -0,0 +1,81 @@
+#N canvas 130 66 646 584 12;
+#X obj 21 345 osc~;
+#X obj 21 370 *~;
+#X obj 81 350 line~;
+#X obj 21 320 line~;
+#X obj 163 455 osc~;
+#X obj 212 483 *~;
+#X obj 234 366 line~;
+#X obj 163 366 line~;
+#X obj 163 313 sqrt;
+#X obj 163 339 sqrt;
+#X obj 234 313 sqrt;
+#X obj 234 339 sqrt;
+#X obj 163 398 *~;
+#X obj 163 428 *~;
+#X obj 234 398 *~;
+#X obj 234 427 *~;
+#X obj 163 288 unpack;
+#X obj 234 288 unpack;
+#X obj 21 295 r freq;
+#X obj 81 326 r amp;
+#X obj 163 263 r freq;
+#X obj 234 263 r amp;
+#X msg 340 277 \; amp 0 5000 \;;
+#X msg 340 232 \; amp 1 5000 \;;
+#X msg 492 278 \; amp 0 1000 \;;
+#X msg 494 232 \; amp 1 1000 \;;
+#X msg 337 357 \; freq 1760 5000 \;;
+#X msg 338 404 \; freq 55 5000 \;;
+#X msg 493 357 \; freq 1760 1000 \;;
+#X msg 496 405 \; freq 55 1000 \;;
+#X text 90 15 QUARTIC AND LINEAR ENVELOPES COMPARED;
+#X obj 341 464 loadbang;
+#X msg 341 492 \; amp 1 \; freq 1760;
+#X text 22 265 LINEAR;
+#X text 168 236 QUARTIC;
+#X obj 21 397 output~;
+#X obj 212 509 output~;
+#X text 14 123 In the quartic example \, for both the amplitude and
+the frequency \, we have to take the fourth root of the target value
+(which we get by taking square root twice.) Then we raise the line~
+output to the fourth power by squaring twice (the *~ objects \, whose
+left and right inlets are the same.) The cost is mostly that of the
+four additional *~ objects.;
+#X text 350 553 updated for Pd version 0.37;
+#X text 19 39 This patch has two sine wave oscillators \, one with
+linear envelopes \, the other with quartic ones which sound more uniform.
+The message boxes sweep the amplitude and frequency up and down. You
+can compare the two to see that quartic-shaped changes sound more uniform
+than linear ones.;
+#X connect 0 0 1 0;
+#X connect 1 0 35 0;
+#X connect 1 0 35 1;
+#X connect 2 0 1 1;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 36 0;
+#X connect 5 0 36 1;
+#X connect 6 0 14 0;
+#X connect 6 0 14 1;
+#X connect 7 0 12 0;
+#X connect 7 0 12 1;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 10 0 11 0;
+#X connect 11 0 6 0;
+#X connect 12 0 13 0;
+#X connect 12 0 13 1;
+#X connect 13 0 4 0;
+#X connect 14 0 15 0;
+#X connect 14 0 15 1;
+#X connect 15 0 5 1;
+#X connect 16 0 8 0;
+#X connect 16 1 7 1;
+#X connect 17 0 10 0;
+#X connect 17 1 6 1;
+#X connect 18 0 3 0;
+#X connect 19 0 2 0;
+#X connect 20 0 16 0;
+#X connect 21 0 17 0;
+#X connect 31 0 32 0;
diff --git a/desiredata/doc/3.audio.examples/D05.envelope.pitch.pd b/desiredata/doc/3.audio.examples/D05.envelope.pitch.pd
new file mode 100644
index 00000000..b91477aa
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D05.envelope.pitch.pd
@@ -0,0 +1,153 @@
+#N canvas 222 84 686 544 12;
+#X obj 48 106 r trigger;
+#X obj 48 154 tabread4~ dbtorms;
+#X text 144 313 <-- attack;
+#X text 568 305 <-- release;
+#X obj 48 208 *~;
+#N canvas 151 343 812 522 make-table 0;
+#X msg 82 49 bang;
+#X obj 82 78 t b b;
+#X obj 141 142 f;
+#X obj 179 142 + 1;
+#X msg 150 112 0;
+#X obj 82 107 until;
+#X obj 141 176 t f f;
+#X floatatom 369 67 0 0 0 0 - - -;
+#X floatatom 369 127 0 0 0 0 - - -;
+#N canvas 0 0 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 1e-04 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 538 298 graph;
+#X text 740 391 0;
+#X text 742 291 10;
+#X text 544 403 ------ 123 samples ------;
+#N canvas 0 0 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 537 130 graph;
+#X obj 283 102 mtof;
+#X floatatom 282 127 0 0 0 0 - - -;
+#X text 541 237 ------ 130 samples ------;
+#X text 746 223 0;
+#X text 748 123 12000;
+#X obj 81 203 mtof;
+#X obj 72 167 sel 129;
+#X obj 80 229 tabwrite mtof;
+#X obj 369 99 tabread4 mtof;
+#X obj 71 418 moses 2;
+#X msg 55 267 bang;
+#X obj 55 296 t b b;
+#X obj 126 357 f;
+#X obj 164 357 + 1;
+#X msg 148 329 0;
+#X obj 55 325 until;
+#X obj 47 385 sel 122;
+#X msg 71 449 0;
+#X obj 115 450 dbtorms;
+#X obj 126 385 t f f;
+#X obj 71 482 tabwrite dbtorms;
+#X text 312 40 ... and test accuracy;
+#X text 23 15 patch to recalculate the mtof table;
+#X text 107 267 bang to recalculate dbtorms table;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 1 1 4 0;
+#X connect 2 0 3 0;
+#X connect 2 0 6 0;
+#X connect 2 0 20 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 0;
+#X connect 6 0 19 0;
+#X connect 6 1 21 1;
+#X connect 7 0 14 0;
+#X connect 7 0 22 0;
+#X connect 14 0 15 0;
+#X connect 19 0 21 0;
+#X connect 20 0 5 1;
+#X connect 22 0 8 0;
+#X connect 23 0 31 0;
+#X connect 23 1 32 0;
+#X connect 24 0 25 0;
+#X connect 25 0 29 0;
+#X connect 25 1 28 0;
+#X connect 26 0 27 0;
+#X connect 26 0 30 0;
+#X connect 26 0 33 0;
+#X connect 27 0 26 1;
+#X connect 28 0 26 1;
+#X connect 29 0 26 0;
+#X connect 30 0 29 1;
+#X connect 31 0 34 0;
+#X connect 32 0 34 0;
+#X connect 33 0 23 0;
+#X connect 33 1 34 1;
+#X restore 451 222 pd make-table;
+#X text 35 6 PITCH ENVELOPES;
+#X text 125 24 For pitch envelopes \, unlike amplitude envelopes \,
+discontinuities are allowed and sometimes you would rather the envelope
+generator actually jump to zero when it's triggered. The "adsr" object
+does this for you if you send a negative trigger instead of a positive
+one:;
+#X obj 280 106 r trigger2;
+#X obj 280 178 tabread4~ mtof;
+#X obj 280 202 osc~;
+#X msg 46 299 \; pd dsp 1 \; trigger 1 \; trigger2 1;
+#X text 358 297 <-- attack;
+#X msg 249 293 \; pd dsp 1 \; trigger 1 \; trigger2 -1;
+#X msg 472 293 \; pd dsp 1 \; trigger 0 \; trigger2 0;
+#X obj 280 154 +~ 69;
+#X text 358 314 restarting;
+#X text 363 331 pitch env;
+#X text 37 377 We have added a new table \, mtof \, for converting
+audio signals from pitch to frequency. Its range is 1-127 \, so you
+want to add a base pitch in before you start reading from it.;
+#X text 37 443 This is an extreme use of pitch enveloping. In a real
+situation you might want an envelope controlling vibrato depth or the
+like instead of straight pitch.;
+#X obj 48 130 adsr 100 50 200 90 1000;
+#X obj 280 130 adsr 20 200 100 100 1000;
+#X text 413 497 updated for Pd version 0.37;
+#X obj 48 233 output~;
+#X connect 0 0 20 0;
+#X connect 1 0 4 0;
+#X connect 4 0 23 0;
+#X connect 4 0 23 1;
+#X connect 8 0 21 0;
+#X connect 9 0 10 0;
+#X connect 10 0 4 1;
+#X connect 15 0 9 0;
+#X connect 20 0 1 0;
+#X connect 21 0 15 0;
diff --git a/desiredata/doc/3.audio.examples/D06.envelope.portamento.pd b/desiredata/doc/3.audio.examples/D06.envelope.portamento.pd
new file mode 100644
index 00000000..6542e8b5
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D06.envelope.portamento.pd
@@ -0,0 +1,148 @@
+#N canvas 222 84 642 346 12;
+#X floatatom 75 227 0 0 0;
+#N canvas 159 26 495 266 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 46 255 pd output;
+#X msg 123 227 MUTE;
+#X text 166 225 <-- output amplitude;
+#X obj 46 173 tabread4~ mtof;
+#X obj 46 197 osc~;
+#N canvas 247 30 505 439 tables 0;
+#N canvas 0 0 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 1e-04 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 129 49 graph;
+#X text 331 142 0;
+#X text 333 42 10;
+#X text 127 157 ------ 123 samples ------;
+#N canvas 0 0 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 136 226 graph;
+#X text 128 336 ------ 130 samples ------;
+#X text 340 318 0;
+#X text 342 218 12000;
+#X restore 490 225 pd tables;
+#X text 35 6 PORTAMENTO;
+#X obj 46 149 line~;
+#X obj 46 101 r pitch;
+#X msg 316 101 36;
+#X msg 345 101 48;
+#X msg 372 101 60;
+#X msg 429 101 72;
+#X msg 401 101 67;
+#X msg 483 101 76;
+#X msg 457 101 74;
+#X obj 451 165 s pitch;
+#X msg 514 101 84;
+#X msg 544 101 96;
+#X floatatom 143 125 0 0 0;
+#X text 173 126 <-- change speed;
+#X floatatom 451 139 0 0 0;
+#X obj 46 125 pack 0 100;
+#X obj 388 192 loadbang;
+#X msg 387 214 \; pitch 72;
+#X text 40 37 Portamento can be done using just line~ \, but you still
+might want to sweep in pitch \, not frequency:;
+#X text 363 293 updated for Pd version 0.35;
+#X connect 0 0 1 1;
+#X connect 1 0 0 0;
+#X connect 2 0 1 2;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
+#X connect 8 0 4 0;
+#X connect 9 0 23 0;
+#X connect 10 0 22 0;
+#X connect 11 0 22 0;
+#X connect 12 0 22 0;
+#X connect 13 0 22 0;
+#X connect 14 0 22 0;
+#X connect 15 0 22 0;
+#X connect 16 0 22 0;
+#X connect 18 0 22 0;
+#X connect 19 0 22 0;
+#X connect 20 0 23 1;
+#X connect 22 0 17 0;
+#X connect 23 0 8 0;
+#X connect 24 0 25 0;
diff --git a/desiredata/doc/3.audio.examples/D07.additive.pd b/desiredata/doc/3.audio.examples/D07.additive.pd
new file mode 100644
index 00000000..c35a47fe
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D07.additive.pd
@@ -0,0 +1,50 @@
+#N canvas 9 13 684 547 12;
+#X obj 37 449 catch~ sum;
+#X obj 349 274 s frequency;
+#X obj 463 274 s duration;
+#X floatatom 463 224 0 0 0 0 - - -;
+#X obj 463 249 * 100;
+#X obj 349 249 mtof;
+#X floatatom 349 224 0 0 0 0 - - -;
+#X text 82 7 ADDITIVE SYNTHESIS;
+#X text 501 214 duration in tenths;
+#X text 503 230 of a second;
+#X text 387 223 pitch;
+#X text 433 518 updated for Pd version 0.37;
+#X obj 37 488 output~;
+#X text 26 83 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 the trigger
+to make sound.;
+#X obj 36 164 partial 1 1 0.56 0;
+#X text 27 31 This patch demonstrates using an abstraction \, "partial"
+\, to make a simple additive synthesis instrument originally from Jean-Claude
+Risset.;
+#X obj 349 169 loadbang;
+#X msg 349 192 72;
+#X msg 463 194 40;
+#X obj 352 322 bng 25 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 385 324 <-- click to play a note;
+#X obj 352 358 s trigger;
+#X obj 36 189 partial 0.67 0.9 0.56 1;
+#X obj 36 214 partial 1 0.65 0.92 0;
+#X obj 36 239 partial 1.8 0.55 0.92 1.7;
+#X obj 36 264 partial 2.67 0.325 1.19 0;
+#X obj 36 289 partial 1.67 0.35 1.7 0;
+#X obj 36 314 partial 1.46 0.25 2 0;
+#X obj 36 339 partial 1.33 0.2 2.74 0;
+#X obj 36 364 partial 1.33 0.15 3 0;
+#X obj 36 389 partial 1 0.1 3.76 0;
+#X obj 36 414 partial 1.33 0.075 4.07 0;
+#X connect 0 0 12 0;
+#X connect 0 0 12 1;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 1 0;
+#X connect 6 0 5 0;
+#X connect 16 0 17 0;
+#X connect 16 0 18 0;
+#X connect 17 0 6 0;
+#X connect 18 0 3 0;
+#X connect 19 0 21 0;
diff --git a/desiredata/doc/3.audio.examples/D08.table.spectrum.pd b/desiredata/doc/3.audio.examples/D08.table.spectrum.pd
new file mode 100644
index 00000000..d9257e6c
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D08.table.spectrum.pd
@@ -0,0 +1,91 @@
+#N canvas 251 127 807 425 12;
+#N canvas 0 0 450 300 graph3 0;
+#X array spectrum-tab 127 float 1;
+#A 0 48.5713 48.5713 48.5713 48.2142 48.2142 48.2142 48.2142 48.2142
+48.2142 48.2142 48.2142 48.2142 48.2142 48.5713 48.5713 48.9284 48.9284
+48.9284 48.9284 48.9284 48.9284 48.9284 48.5713 48.5713 48.5713 48.2142
+48.2142 47.4999 47.1427 46.4285 46.4285 46.0713 46.0713 46.0713 45.7142
+44.9999 44.6428 43.5713 43.2142 42.8571 42.4999 41.7856 38.2143 36.7857
+34.6429 31.7857 30.3572 29.6429 28.5715 27.8572 26.7858 25.3572 25.7144
+23.9287 23.9287 23.5715 23.5715 23.5715 23.5715 23.2144 23.2144 23.2144
+22.8573 22.8573 23.5715 23.9287 23.5715 26.0715 26.0715 48.5713 48.5713
+48.5713 48.2142 47.4999 46.7856 46.7856 17.143 16.4287 16.0716 16.4287
+14.643 13.5716 13.5716 40.7142 40.7142 40.7142 14.643 13.2145 12.8573
+12.5002 12.5002 24.2858 29.6429 30.7143 16.4287 10.7145 11.7859 10.7145
+24.2858 23.5715 17.143 13.9288 9.64309 6.78597 5.71455 5.71455 4.28599
+3.92885 3.92885 3.92885 1.42887 1.42887 1.42887 1.07174 1.07174 1.07174
+0.714596 0.714596 0.714596 0.714596 0.714596 1.07174 1.07174 1.07174
+1.07174 0.714286 0.357143;
+#X coords 0 50 126 0 300 140 1;
+#X restore 496 136 graph;
+#N canvas 98 16 694 474 oscbank 0;
+#X obj 36 53 spectrum-partial 1;
+#X obj 36 79 spectrum-partial 2;
+#X obj 36 105 spectrum-partial 3;
+#X obj 36 131 spectrum-partial 4;
+#X obj 36 157 spectrum-partial 5;
+#X obj 36 183 spectrum-partial 6;
+#X obj 36 209 spectrum-partial 7;
+#X obj 36 235 spectrum-partial 8;
+#X obj 36 261 spectrum-partial 9;
+#X obj 36 287 spectrum-partial 10;
+#X obj 216 53 spectrum-partial 11;
+#X obj 122 382 loadbang;
+#X obj 122 407 metro 30;
+#X obj 122 433 s poll-table;
+#X text 107 21 This is the bank of oscillators--open one to see:;
+#X text 72 345 And here we send bangs to "poll-table" needed by the
+abstraction.;
+#X obj 216 79 spectrum-partial 12;
+#X obj 216 105 spectrum-partial 13;
+#X obj 216 131 spectrum-partial 14;
+#X obj 216 157 spectrum-partial 15;
+#X obj 216 183 spectrum-partial 16;
+#X obj 216 209 spectrum-partial 17;
+#X obj 216 235 spectrum-partial 18;
+#X obj 215 261 spectrum-partial 19;
+#X obj 215 287 spectrum-partial 20;
+#X obj 395 53 spectrum-partial 21;
+#X obj 395 78 spectrum-partial 22;
+#X obj 395 104 spectrum-partial 23;
+#X obj 395 130 spectrum-partial 24;
+#X obj 395 156 spectrum-partial 25;
+#X obj 395 182 spectrum-partial 26;
+#X obj 395 207 spectrum-partial 27;
+#X obj 396 234 spectrum-partial 28;
+#X obj 395 260 spectrum-partial 29;
+#X obj 395 287 spectrum-partial 30;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X restore 17 251 pd oscbank;
+#X obj 19 321 catch~ sum-bus;
+#X obj 16 153 s pitch;
+#X floatatom 16 125 4 0 0 0 - - -;
+#X text 43 18 DRAWABLE SPECTRA;
+#X floatatom 14 183 4 0 0 0 - - -;
+#X obj 14 211 s whammybar;
+#N canvas 0 0 650 341 table-setup 0;
+#X obj 39 227 loadbang;
+#X msg 39 261 \; spectrum-tab xlabel -5 0 12 24 36 48 60 72 84 96 108
+120;
+#X text 82 60 comment;
+#X connect 0 0 1 0;
+#X restore 17 283 pd table-setup;
+#X msg 596 65 \; spectrum-tab const 0;
+#X text 26 42 In this array \, you can draw a spectral envelope that
+will be synthesized by an oscillator bank. Each oscillator in the bank
+computes its own frequency and uses it to look up amplitude from the
+array.;
+#X text 113 254 <-- the oscillator bank;
+#X text 71 128 <-- pitch;
+#X text 61 185 <-- left or right shift (normally 0);
+#X text 157 318 <-- here we just collect the sum of all the partials
+which are computed in "oscbank".;
+#X text 662 44 CLEAR;
+#X text 148 283 <-- make the number labels;
+#X obj 19 358 output~;
+#X text 556 389 Updated for Pd version 0.37;
+#X connect 2 0 17 0;
+#X connect 2 0 17 1;
+#X connect 4 0 3 0;
+#X connect 6 0 7 0;
diff --git a/desiredata/doc/3.audio.examples/D09.shepard.tone.pd b/desiredata/doc/3.audio.examples/D09.shepard.tone.pd
new file mode 100644
index 00000000..8cb66603
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D09.shepard.tone.pd
@@ -0,0 +1,108 @@
+#N canvas 124 20 599 828 12;
+#X floatatom 169 520 0 0 0 0 - - -;
+#X floatatom 169 446 0 0 0 0 - - -;
+#X text 462 208 START;
+#X floatatom 190 303 0 0 0 0 - - -;
+#X obj 190 280 r incr;
+#X obj 168 255 metro 50;
+#X floatatom 168 373 5 0 0 0 - - -;
+#X obj 168 394 s phase;
+#X obj 168 350 +;
+#X obj 169 469 s dropoff+;
+#X obj 169 622 s interval+;
+#X floatatom 169 599 0 0 0 0 - - -;
+#X obj 169 543 s pitch+;
+#X obj 169 423 r dropoff;
+#X obj 169 497 r pitch;
+#X obj 169 576 r interval;
+#X obj 168 212 r metro;
+#X obj 228 345 f;
+#X obj 12 212 shepvoice 0;
+#X floatatom 83 708 0 0 0 0 - - -;
+#X obj 83 685 r rev;
+#X obj 138 685 r revtime;
+#X floatatom 138 708 0 0 0 0 - - -;
+#X obj 228 368 mod 10000;
+#X obj 168 327 f;
+#X obj 73 742 rev2~;
+#X obj 12 769 output~;
+#X obj 168 235 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X msg 446 225 \; dropoff 10 \; pitch 60 \; interval 120 \; metro 1
+\; rev 84 \; revtime 87 \; incr -2 \; pd dsp 1;
+#X text 27 7 SHEPARD TONE;
+#X text 339 804 updated for Pd version 0.37;
+#X obj 12 235 shepvoice 500;
+#X obj 12 258 shepvoice 1000;
+#X obj 12 281 shepvoice 1500;
+#X obj 12 304 shepvoice 2000;
+#X obj 12 327 shepvoice 2500;
+#X obj 12 350 shepvoice 3000;
+#X obj 12 373 shepvoice 3500;
+#X obj 12 396 shepvoice 4000;
+#X obj 12 419 shepvoice 4500;
+#X obj 12 442 shepvoice 5000;
+#X obj 12 465 shepvoice 5500;
+#X obj 12 488 shepvoice 6000;
+#X obj 12 511 shepvoice 6500;
+#X obj 12 534 shepvoice 7000;
+#X obj 12 557 shepvoice 7500;
+#X obj 12 580 shepvoice 8000;
+#X obj 12 603 shepvoice 8500;
+#X obj 12 626 shepvoice 9000;
+#X obj 12 649 shepvoice 9500;
+#X text 25 31 This patch is a bank of 20 sinusoids \, arranged so that
+their frequencies sweep upward or downward in parallel \, and their
+amplitudes fade in and out so that each one is quiet when it wraps
+around from one end to the other. The overall "phase" computed here
+is added to each voice's relative phase (its creation argument). The
+"incr" parameter controlls how fast the phase changes \, "dropoff"
+the slope at which the amplitudes fall off at the ends \, "pitch" the
+center pitch of the cluster \, "interval" the number of (tenths of
+halftones) between successive voices \, and "rev" and "revtime" the
+reverberator at bottom.;
+#X connect 0 0 12 0;
+#X connect 1 0 9 0;
+#X connect 3 0 24 1;
+#X connect 4 0 3 0;
+#X connect 5 0 24 0;
+#X connect 6 0 7 0;
+#X connect 8 0 17 0;
+#X connect 8 0 6 0;
+#X connect 11 0 10 0;
+#X connect 13 0 1 0;
+#X connect 14 0 0 0;
+#X connect 15 0 11 0;
+#X connect 16 0 27 0;
+#X connect 17 0 23 0;
+#X connect 18 0 31 0;
+#X connect 19 0 25 1;
+#X connect 20 0 19 0;
+#X connect 21 0 22 0;
+#X connect 22 0 25 2;
+#X connect 23 0 8 1;
+#X connect 24 0 8 0;
+#X connect 25 0 26 0;
+#X connect 25 1 26 1;
+#X connect 27 0 5 0;
+#X connect 31 0 32 0;
+#X connect 32 0 33 0;
+#X connect 33 0 34 0;
+#X connect 34 0 35 0;
+#X connect 35 0 36 0;
+#X connect 36 0 37 0;
+#X connect 37 0 38 0;
+#X connect 38 0 39 0;
+#X connect 39 0 40 0;
+#X connect 40 0 41 0;
+#X connect 41 0 42 0;
+#X connect 42 0 43 0;
+#X connect 43 0 44 0;
+#X connect 44 0 45 0;
+#X connect 45 0 46 0;
+#X connect 46 0 47 0;
+#X connect 47 0 48 0;
+#X connect 48 0 49 0;
+#X connect 49 0 25 0;
+#X connect 49 0 26 0;
+#X connect 49 0 26 1;
diff --git a/desiredata/doc/3.audio.examples/D10.sampler.notes.pd b/desiredata/doc/3.audio.examples/D10.sampler.notes.pd
new file mode 100644
index 00000000..6bfd1402
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D10.sampler.notes.pd
@@ -0,0 +1,263 @@
+#N canvas 12 0 1074 786 12;
+#X msg 257 7 bang;
+#X obj 257 35 delay 5;
+#X text 497 269 end of note;
+#X obj 363 35 r note;
+#N canvas 459 46 678 451 samples 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array sample1 176403 float 0;
+#X coords 0 1.02 176403 -1.02 200 130 1;
+#X restore 262 41 graph;
+#X text 264 376 ------ 4 seconds ------;
+#N canvas 0 0 450 300 graph1 0;
+#X array sample2 176403 float 0;
+#X coords 0 1.02 176403 -1.02 200 130 1;
+#X restore 262 226 graph;
+#X restore 33 277 pd samples;
+#N canvas 21 287 947 410 recorder 0;
+#X obj 318 43 inlet;
+#X obj 272 196 adc~ 1;
+#X obj 272 224 hip~ 5;
+#X obj 341 254 line~;
+#X obj 272 253 *~;
+#X msg 341 226 1;
+#X obj 400 191 del 3990;
+#X msg 377 226 0 10;
+#X obj 272 304 tabwrite~ sample1;
+#X obj 124 110 makefilename sample%1;
+#X msg 124 139 set \$1 \, bang;
+#X msg 446 162 stop;
+#X msg 400 162 bang;
+#X obj 557 182 loadbang;
+#X obj 660 137 openpanel;
+#X msg 660 109 bang;
+#X text 702 108 <-- browse for samples;
+#X text 628 233 v-- re-read original samples;
+#X obj 318 72 route record stop reload browse;
+#X obj 557 319 soundfiler;
+#X msg 557 261 read ../sound/bell.aiff sample1 \, read ../sound/voice2.wav
+sample2;
+#X msg 660 164 read \$1 sample1;
+#X obj 660 191 soundfiler;
+#X connect 0 0 18 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 3 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X connect 11 0 6 0;
+#X connect 12 0 6 0;
+#X connect 13 0 20 0;
+#X connect 14 0 21 0;
+#X connect 15 0 14 0;
+#X connect 18 0 9 0;
+#X connect 18 0 12 0;
+#X connect 18 0 5 0;
+#X connect 18 1 7 0;
+#X connect 18 1 11 0;
+#X connect 18 2 20 0;
+#X connect 18 3 15 0;
+#X connect 20 0 19 0;
+#X connect 21 0 22 0;
+#X restore 33 443 pd recorder;
+#X msg 33 305 record 1;
+#X msg 33 360 stop;
+#N canvas 359 226 666 626 playback 0;
+#X obj 20 45 line~;
+#X obj 39 237 line~;
+#X obj 20 268 *~;
+#X obj 39 208 r cutoff;
+#X obj 20 16 r phase;
+#X obj 20 592 outlet~;
+#X obj 20 564 hip~ 5;
+#X obj 32 79 r sample-number;
+#X obj 32 108 makefilename sample%d;
+#X msg 32 136 set \$1;
+#X obj 20 177 tabread4~ sample1;
+#X obj 38 304 r envelope;
+#X obj 38 362 dbtorms;
+#X obj 38 333 unpack;
+#X obj 38 391 sqrt;
+#X obj 38 420 sqrt;
+#X obj 38 448 line~;
+#X obj 20 535 *~;
+#X obj 38 477 *~;
+#X obj 38 506 *~;
+#X text 90 17 messages to the phase generating line~;
+#X text 171 80 setting the sample number.;
+#X text 221 109 compute the name;
+#X text 93 137 and send a "set" message to the tabread4~.;
+#X text 99 236 line~ for de-clicking;
+#X text 139 307 The envelope generator. Rather than sending our message
+straight to the line~ we unpack it in order to fool with the amplitude
+field.;
+#X text 109 363 convert amplitude to linear units.;
+#X text 104 392 take the fourth root. This because we want to raies
+the line~'s output to the 4th power afterward. This is an inexpensive
+way to give the rise and decay a more natural sounding evolution than
+just a straight line.;
+#X text 77 480 square the output twice to get the fourth power.;
+#X connect 0 0 10 0;
+#X connect 1 0 2 1;
+#X connect 2 0 17 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 2 0;
+#X connect 11 0 13 0;
+#X connect 12 0 14 0;
+#X connect 13 0 12 0;
+#X connect 13 1 16 1;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 18 0;
+#X connect 16 0 18 1;
+#X connect 17 0 6 0;
+#X connect 18 0 19 0;
+#X connect 18 0 19 1;
+#X connect 19 0 17 1;
+#X restore 33 480 pd playback;
+#X msg 33 332 record 2;
+#X text 645 25 ARGUMENTS FOR NOTES:;
+#X text 666 53 pitch in halftones;
+#X text 666 77 amplitude (dB);
+#X text 666 125 sample number;
+#X text 666 101 duration (msec);
+#X text 666 149 start location (msec);
+#X text 666 173 rise time (msec);
+#X text 666 197 decay time (msec);
+#X obj 363 62 unpack 0 0 0 0 0 0 0;
+#X text 50 6 CHOCOLATE SAMPLER;
+#X obj 521 168 f;
+#X obj 456 142 f;
+#X obj 387 142 f;
+#X obj 350 142 f;
+#X obj 318 142 f;
+#X obj 224 142 f;
+#X obj 224 169 mtof;
+#X obj 224 197 / 261.62;
+#X obj 224 224 * 4.41e+08;
+#X obj 224 252 +;
+#X obj 489 142 delay;
+#X obj 318 312 pack 0 0 0 0 0;
+#X obj 257 62 t b b b;
+#X text 498 346 This starts the note \, sending to "receives" in the
+playback subptach. The new receive "envelope" is an amplitude control
+in parallel with the cutoff control. The "sample-number" switches the
+tabread4~ between tables.;
+#X msg 156 44 \; pd dsp 1 \; cutoff 0 5;
+#X obj 387 197 + 1;
+#X msg 556 467 60 100 10000 1 0 0 0;
+#X obj 556 737 s note;
+#X msg 521 196 \; envelope 0 \$1;
+#X msg 675 691 62;
+#X msg 710 691 64;
+#X msg 641 691 60;
+#X msg 612 691 55;
+#X msg 743 691 72;
+#X msg 580 691 48;
+#X msg 642 734 60.5;
+#X msg 556 494 60 90 10000 1 0 0 0;
+#X msg 556 522 60 100 10000 2 0 0 0;
+#X msg 556 550 60 100 10000 1 3000 0 0;
+#X obj 387 169 * 44.1;
+#X msg 556 605 60 100 100 1 0 0 0;
+#X msg 556 632 60 100 100 1 0 0 1000;
+#X msg 556 577 60 100 10000 1 0 1000 0;
+#X msg 318 340 \; envelope 0 \, \$1 \$2 \; phase \$3 \, \$4 1e+07 \;
+sample-number \$5 \; cutoff 1 5 \;;
+#X text 117 305 <-- record;
+#X msg 33 388 reload;
+#X msg 33 415 browse;
+#X text 7 109 transposition works;
+#X text 7 133 by altering the phase;
+#X text 7 181 The mtof and / 261;
+#X text 7 205 calculate speed change;
+#X text 7 229 considering 60 as unity.;
+#X text 24 43 as before we;
+#X text 15 64 mute and wait;
+#X text 7 157 target ($4 below right.);
+#X text 450 303 combine amplitude \, rise time \, start phase \, end
+phase \, and sample number in one message;
+#X text 764 467 straight playback;
+#X text 764 493 change amplitude;
+#X text 767 521 change sample number;
+#X text 769 550 change start location;
+#X text 768 576 change rise time;
+#X text 768 609 change duration;
+#X text 769 633 ... and decay time;
+#X text 692 736 microtones OK too.;
+#X text 580 667 If you omit values they stay unchanged;
+#X text 552 426 Here are buttons to demonstrate the effect of varying
+the parameters one by one.;
+#X obj 34 511 output~;
+#X text 13 596 This patch take the same principle as the earlier "one-shot
+sampler" \, but allows you to parametrize sample playback. Since we
+must wait 5 msec before starting the playback \, we store all the parameters
+in "f" objects \, and recall them to construct the new note. Transposition
+is done by altering the amount to play back in the (artificial) ten
+thousand seconds (1e+07). The playback segment can be altered to start
+in the middle of the sample instead of the beginning \, and you can
+change the duration and rise and decay times.;
+#X text 823 763 updated for Pd version 0.37;
+#X connect 0 0 1 0;
+#X connect 0 0 34 0;
+#X connect 1 0 32 0;
+#X connect 3 0 18 0;
+#X connect 6 0 5 0;
+#X connect 7 0 5 0;
+#X connect 8 0 76 0;
+#X connect 8 0 76 1;
+#X connect 9 0 5 0;
+#X connect 18 0 25 1;
+#X connect 18 0 0 0;
+#X connect 18 1 24 1;
+#X connect 18 2 30 1;
+#X connect 18 3 23 1;
+#X connect 18 4 22 1;
+#X connect 18 5 21 1;
+#X connect 18 6 20 1;
+#X connect 20 0 38 0;
+#X connect 21 0 31 1;
+#X connect 22 0 49 0;
+#X connect 23 0 31 4;
+#X connect 24 0 31 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 0;
+#X connect 27 0 28 0;
+#X connect 28 0 29 0;
+#X connect 29 0 31 3;
+#X connect 30 0 20 0;
+#X connect 31 0 53 0;
+#X connect 32 0 24 0;
+#X connect 32 1 25 0;
+#X connect 32 2 21 0;
+#X connect 32 2 22 0;
+#X connect 32 2 23 0;
+#X connect 32 2 30 0;
+#X connect 35 0 31 2;
+#X connect 35 0 29 1;
+#X connect 36 0 37 0;
+#X connect 39 0 37 0;
+#X connect 40 0 37 0;
+#X connect 41 0 37 0;
+#X connect 42 0 37 0;
+#X connect 43 0 37 0;
+#X connect 44 0 37 0;
+#X connect 45 0 37 0;
+#X connect 46 0 37 0;
+#X connect 47 0 37 0;
+#X connect 48 0 37 0;
+#X connect 49 0 35 0;
+#X connect 50 0 37 0;
+#X connect 51 0 37 0;
+#X connect 52 0 37 0;
+#X connect 55 0 5 0;
+#X connect 56 0 5 0;
diff --git a/desiredata/doc/3.audio.examples/D11.sampler.poly.pd b/desiredata/doc/3.audio.examples/D11.sampler.poly.pd
new file mode 100644
index 00000000..a0863964
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D11.sampler.poly.pd
@@ -0,0 +1,175 @@
+#N canvas 91 72 1119 674 12;
+#N canvas 0 0 600 392 samples 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array sample1 176403 float 0;
+#X coords 0 1.02 176403 -1.02 200 130 1;
+#X restore 262 41 graph;
+#X text 282 385 ------ 4 seconds ------;
+#N canvas 0 0 450 300 graph1 0;
+#X array sample2 176403 float 0;
+#X coords 0 1.02 176403 -1.02 200 130 1;
+#X restore 262 226 graph;
+#X restore 931 97 pd samples;
+#N canvas 52 219 967 340 recorder 0;
+#X obj 220 21 inlet;
+#X obj 174 174 adc~ 1;
+#X obj 174 202 hip~ 5;
+#X obj 243 232 line~;
+#X obj 174 231 *~;
+#X msg 243 204 1;
+#X obj 302 169 del 3990;
+#X msg 279 204 0 10;
+#X obj 174 282 tabwrite~ sample1;
+#X msg 26 117 set \$1 \, bang;
+#X msg 348 140 stop;
+#X msg 302 140 bang;
+#X obj 220 50 route record stop reload browse;
+#X obj 411 158 loadbang;
+#X obj 514 113 openpanel;
+#X msg 514 85 bang;
+#X text 556 84 <-- browse for samples;
+#X text 482 209 v-- re-read original samples;
+#X obj 411 295 soundfiler;
+#X msg 411 237 read ../sound/bell.aiff sample1 \, read ../sound/voice2.wav
+sample2;
+#X msg 514 140 read \$1 sample1;
+#X obj 514 167 soundfiler;
+#X obj 26 88 makefilename sample%d;
+#X connect 0 0 12 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 8 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 3 0;
+#X connect 9 0 8 0;
+#X connect 10 0 6 0;
+#X connect 11 0 6 0;
+#X connect 12 0 11 0;
+#X connect 12 0 5 0;
+#X connect 12 0 22 0;
+#X connect 12 1 7 0;
+#X connect 12 1 10 0;
+#X connect 12 2 19 0;
+#X connect 12 3 15 0;
+#X connect 13 0 19 0;
+#X connect 14 0 20 0;
+#X connect 15 0 14 0;
+#X connect 19 0 18 0;
+#X connect 20 0 21 0;
+#X connect 22 0 9 0;
+#X restore 931 284 pd recorder;
+#X msg 931 146 record 1;
+#X msg 931 202 stop;
+#X msg 931 174 record 2;
+#X text 19 49 ARGUMENTS FOR NOTES:;
+#X text 19 71 pitch in halftones;
+#X text 19 95 amplitude (dB);
+#X text 19 143 sample number;
+#X text 19 119 duration (msec);
+#X text 19 167 start location (msec);
+#X text 19 191 rise time (msec);
+#X text 19 215 decay time (msec);
+#X msg 931 229 reload;
+#X msg 931 257 browse;
+#X text 47 10 POLYPHONIC SAMPLER;
+#X obj 547 329 sampvoice;
+#X obj 631 17 r note;
+#X obj 631 44 unpack 0 0 0 0 0 0 0;
+#X obj 604 76 t b f;
+#X obj 544 109 f;
+#X obj 580 109 + 1;
+#X obj 552 146 mod 1e+06;
+#X obj 544 175 makenote 64;
+#X obj 544 203 poly 8 1;
+#X obj 544 230 stripnote;
+#X obj 617 272 pack 0 0 0 0 0 0 0 0;
+#X obj 617 300 route 1 2 3 4 5 6 7 8;
+#X text 929 124 record \, etc.;
+#X text 335 203 allocate sampler voice;
+#X text 361 228 drop note off again;
+#X obj 704 516 qlist;
+#X obj 870 520 r comment;
+#X text 732 445 sailors to untie him...;
+#X text 735 395 Lashed to the mast of his boat \, Ulysses;
+#X text 735 420 hears beautiful singing. He begs his;
+#X text 7 263 Here we take the previous patch and make it polyphonic
+\, with 8 voices. The single voice which we had before has been made
+into an abstraction \, "sampvoice.pd" \, which we instantiate in 8
+copies. Earlier we used sends and receives to pass messages to "cutoff"
+\, etc \, but here if we did that the copies of sampvoice would be
+sending messages to each other \, so we combine the control and the
+audio computation in the sampvoice abstraction without using send and
+receive. Click on one to see how.;
+#X text 8 413 The "poly" object essentially repeats pitch and velocity
+pairs to its output \, but also sending a voice number from its left
+outlet. To use it \, we unpack the 7 parameters \, calculate the voice
+number \, repack the message as 8 parameters with voice number first
+\, and use "route" to send it to one of the 8 voices.;
+#X text 8 515 There's some bother because poly expects to track note
+on and note off messages separately as they would come from a MIDI
+keyboard. So we assign each note a unique fake "pitch" \, use makenote
+to generate the note-off messages \, and run poly on the resulting
+stream. We then discard both pitch and velocity (using the velocity
+only to strip note-offs) and rebuild the original message adding the
+voice number we just scored.;
+#X text 854 639 updated for Pd version 0.33;
+#X msg 704 486 read qlist-sampler.txt \, rewind \, tempo 1 \, bang
+;
+#X obj 548 551 output~;
+#X text 249 108 increment mod 1e+06 to make tag;
+#X text 276 127 (acts like a MIDI pitch to;
+#X text 277 146 identify the note to "poly");
+#X text 258 175 supply delayed note-off message;
+#X obj 547 522 sampvoice;
+#X obj 547 494 sampvoice;
+#X obj 547 467 sampvoice;
+#X obj 547 439 sampvoice;
+#X obj 547 412 sampvoice;
+#X obj 547 384 sampvoice;
+#X obj 547 356 sampvoice;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 13 0 1 0;
+#X connect 14 0 1 0;
+#X connect 16 0 52 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 18 1 26 2;
+#X connect 18 2 23 2;
+#X connect 18 2 26 3;
+#X connect 18 3 26 4;
+#X connect 18 4 26 5;
+#X connect 18 5 26 6;
+#X connect 18 6 26 7;
+#X connect 19 0 20 0;
+#X connect 19 1 26 1;
+#X connect 20 0 21 0;
+#X connect 20 0 23 0;
+#X connect 21 0 22 0;
+#X connect 22 0 20 1;
+#X connect 23 0 24 0;
+#X connect 23 1 24 1;
+#X connect 24 0 25 0;
+#X connect 24 2 25 1;
+#X connect 25 0 26 0;
+#X connect 26 0 27 0;
+#X connect 27 0 16 1;
+#X connect 27 1 52 1;
+#X connect 27 2 51 1;
+#X connect 27 3 50 1;
+#X connect 27 4 49 1;
+#X connect 27 5 48 1;
+#X connect 27 6 47 1;
+#X connect 27 7 46 1;
+#X connect 40 0 31 0;
+#X connect 46 0 41 0;
+#X connect 46 0 41 1;
+#X connect 47 0 46 0;
+#X connect 48 0 47 0;
+#X connect 49 0 48 0;
+#X connect 50 0 49 0;
+#X connect 51 0 50 0;
+#X connect 52 0 51 0;
diff --git a/desiredata/doc/3.audio.examples/D12.sampler.bis.pd b/desiredata/doc/3.audio.examples/D12.sampler.bis.pd
new file mode 100644
index 00000000..f0fa13fd
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D12.sampler.bis.pd
@@ -0,0 +1,203 @@
+#N canvas 104 78 1119 674 12;
+#N canvas 0 0 600 392 samples 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array sample1 176403 float 0;
+#X coords 0 1.02 176403 -1.02 200 130 1;
+#X restore 262 41 graph;
+#X text 282 385 ------ 4 seconds ------;
+#N canvas 0 0 450 300 graph1 0;
+#X array sample2 176403 float 0;
+#X coords 0 1.02 176403 -1.02 200 130 1;
+#X restore 262 226 graph;
+#X restore 785 563 pd samples;
+#N canvas 52 219 971 512 recorder 0;
+#X obj 174 304 adc~ 1;
+#X obj 174 332 hip~ 5;
+#X obj 243 362 line~;
+#X obj 174 361 *~;
+#X msg 243 334 1;
+#X obj 302 299 del 3990;
+#X msg 279 334 0 10;
+#X obj 174 412 tabwrite~ sample1;
+#X msg 26 247 set \$1 \, bang;
+#X msg 348 270 stop;
+#X msg 302 270 bang;
+#X obj 220 180 route record stop reload browse;
+#X obj 411 288 loadbang;
+#X obj 514 243 openpanel;
+#X msg 514 215 bang;
+#X text 556 214 <-- browse for samples;
+#X text 482 339 v-- re-read original samples;
+#X obj 411 425 soundfiler;
+#X msg 411 367 read ../sound/bell.aiff sample1 \, read ../sound/voice2.wav
+sample2;
+#X msg 514 270 read \$1 sample1;
+#X obj 514 297 soundfiler;
+#X msg 220 41 record 1;
+#X msg 220 97 stop;
+#X msg 220 69 record 2;
+#X msg 220 124 reload;
+#X msg 220 152 browse;
+#X text 218 19 record \, etc.;
+#X obj 26 218 makefilename sample%d;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 3 1;
+#X connect 3 0 7 0;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 2 0;
+#X connect 8 0 7 0;
+#X connect 9 0 5 0;
+#X connect 10 0 5 0;
+#X connect 11 0 10 0;
+#X connect 11 0 4 0;
+#X connect 11 0 27 0;
+#X connect 11 1 6 0;
+#X connect 11 1 9 0;
+#X connect 11 2 18 0;
+#X connect 11 3 14 0;
+#X connect 12 0 18 0;
+#X connect 13 0 19 0;
+#X connect 14 0 13 0;
+#X connect 18 0 17 0;
+#X connect 19 0 20 0;
+#X connect 21 0 11 0;
+#X connect 22 0 11 0;
+#X connect 23 0 11 0;
+#X connect 24 0 11 0;
+#X connect 25 0 11 0;
+#X connect 27 0 8 0;
+#X restore 785 586 pd recorder;
+#X text 782 458 sample number;
+#X obj 619 96 unpack 0 0 0 0 0 0 0;
+#X obj 563 124 poly 8 1;
+#X obj 654 270 route 1 2 3 4 5 6 7 8;
+#X obj 558 487 output~;
+#X obj 563 149 swap;
+#X obj 563 196 route 0;
+#X obj 563 173 pack;
+#X obj 605 221 unpack;
+#X obj 557 289 sampvoice2;
+#X obj 563 221 pack;
+#X text 933 411 amplitude;
+#X text 932 435 pitch;
+#X text 851 344 ARGUMENTS FOR:;
+#X text 784 386 pitch;
+#X text 784 410 amplitude;
+#X text 784 434 duration;
+#X text 13 4 POLY SAMPLER \, VERSION 2 FOR SEPARATE NOTE-ON/OFF MESSAGES
+;
+#X obj 619 71 r onoff;
+#X text 932 368 ON/OFF TRANSITIONS:;
+#X text 785 367 ENTIRE NOTES:;
+#X text 932 390 tag;
+#X text 782 485 sample onset;
+#X text 782 511 rise time;
+#X text 783 535 decay time;
+#X text 929 460 (same other 4);
+#X obj 836 159 f;
+#X obj 872 159 + 1;
+#X obj 836 185 mod 1e+06;
+#X obj 654 245 pack 0 0 0 0 0 0 0;
+#X obj 918 74 r note;
+#X obj 918 100 unpack 0 0 0 0 0 0 0;
+#X text 860 641 updated for Pd version 0.37;
+#X obj 895 127 t b f;
+#X obj 936 237 pack 0 0 0 0 0 0 0;
+#X obj 889 285 s onoff;
+#X obj 870 230 pipe;
+#X obj 870 253 pack;
+#X msg 103 528 \; onoff 1 90 60 1 0 0 100;
+#X msg 323 528 \; onoff 1 0;
+#X msg 104 570 \; onoff 2 90 48 1 0 0 100;
+#X msg 324 570 \; onoff 2 0;
+#X msg 104 627 \; note 51 90 1000 1 0 0 100;
+#X obj 557 312 sampvoice2;
+#X obj 557 336 sampvoice2;
+#X obj 557 360 sampvoice2;
+#X obj 557 383 sampvoice2;
+#X obj 557 407 sampvoice2;
+#X obj 557 430 sampvoice2;
+#X obj 557 454 sampvoice2;
+#X text 14 35 Here is a variation on the polyphonic sampler \, which
+can take separate messages to start and stop notes (so that you can
+attach it to a MIDI keyboard \, for example.) "Note" messages act as
+before \, but in an intermediate step they are split onto note-on and
+note-off messages \, sent to "onoff". You can alternatively send messages
+straight to onoff if you don't know the duration in advance.;
+#X text 12 150 Messages to "onoff" require a tag \, which is a number
+shared between the note-on and note-off message so that we can track
+down the voice to turn it off. If you're using MIDI input \, you can
+just re-use the pitch as a tag.;
+#X text 102 508 separate messages for not on and off:;
+#X text 101 608 single messages to do both as before:;
+#X text 10 221 Messages to "onoff" whose amplitude is zero are note-off
+messages (the other parameters of note-off messages are ignored). The
+"sampvoice2" abstraction is a modification of "sampvoice" which looks
+at the amplitude field to decide whether to begin or end a note.;
+#X text 10 301 To convert "note" messages to pairs of "onoff" messages
+\, first a counter generates a tag. The the "pipe" object delays a
+copy of the tag \, which the following "pack" object converts into
+a note-off message (a pair of numbers \, the tag and a zero.);
+#X text 9 382 Under "r onoff" \, the poly object allocates a voice
+number \, putting it out paired with velocity. After swapping the two
+and packing them into a single message \, the amplitude is checked
+against zero by the "route 0" object \; if zero \, the "pack" confects
+a 2-argument message (voice number and zero). Otherwise \, the "unpack"
+retrieves the nonzero amplitude for a note-on message \, to which we
+add all the other parameters and route to the appropriate voice.;
+#X connect 3 0 4 0;
+#X connect 3 1 31 1;
+#X connect 3 1 4 1;
+#X connect 3 2 31 2;
+#X connect 3 3 31 3;
+#X connect 3 4 31 4;
+#X connect 3 5 31 5;
+#X connect 3 6 31 6;
+#X connect 4 0 7 0;
+#X connect 4 2 7 1;
+#X connect 5 0 11 1;
+#X connect 5 1 45 1;
+#X connect 5 2 46 1;
+#X connect 5 3 47 1;
+#X connect 5 4 48 1;
+#X connect 5 5 49 1;
+#X connect 5 6 50 1;
+#X connect 5 7 51 1;
+#X connect 7 0 9 0;
+#X connect 7 1 9 1;
+#X connect 8 0 12 0;
+#X connect 8 1 10 0;
+#X connect 9 0 8 0;
+#X connect 10 1 31 0;
+#X connect 11 0 45 0;
+#X connect 12 0 5 0;
+#X connect 20 0 3 0;
+#X connect 28 0 29 0;
+#X connect 29 0 30 0;
+#X connect 30 0 28 1;
+#X connect 30 0 38 0;
+#X connect 30 0 36 0;
+#X connect 31 0 5 0;
+#X connect 32 0 33 0;
+#X connect 33 0 35 0;
+#X connect 33 1 36 1;
+#X connect 33 2 38 1;
+#X connect 33 3 36 3;
+#X connect 33 4 36 4;
+#X connect 33 5 36 5;
+#X connect 33 6 36 6;
+#X connect 35 0 28 0;
+#X connect 35 1 36 2;
+#X connect 36 0 37 0;
+#X connect 38 0 39 0;
+#X connect 39 0 37 0;
+#X connect 45 0 46 0;
+#X connect 46 0 47 0;
+#X connect 47 0 48 0;
+#X connect 48 0 49 0;
+#X connect 49 0 50 0;
+#X connect 50 0 51 0;
+#X connect 51 0 6 0;
+#X connect 51 0 6 1;
diff --git a/desiredata/doc/3.audio.examples/D13.additive.qlist.pd b/desiredata/doc/3.audio.examples/D13.additive.qlist.pd
new file mode 100644
index 00000000..2c9b3cb7
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D13.additive.qlist.pd
@@ -0,0 +1,47 @@
+#N canvas 233 179 667 449 12;
+#X obj 16 182 osc-voice amp1 pit1;
+#X obj 16 206 osc-voice amp2 pit2;
+#X obj 16 230 osc-voice amp3 pit3;
+#X obj 16 254 osc-voice amp4 pit4;
+#X obj 16 278 osc-voice amp5 pit5;
+#X obj 16 302 osc-voice amp6 pit6;
+#X obj 16 326 osc-voice amp7 pit7;
+#X obj 16 350 osc-voice amp8 pit8;
+#X obj 464 343 qlist;
+#X msg 394 185 stop;
+#X msg 524 300 read qlist.txt;
+#X obj 524 255 loadbang;
+#X text 258 164 start;
+#X text 395 161 stop;
+#X text 534 279 reread file;
+#X msg 467 199 rewind;
+#X msg 535 199 next;
+#X msg 251 212 tempo 100 \, bang;
+#X msg 250 188 tempo 1 \, bang;
+#X text 82 11 USING QLIST TO SEQUENCE AN OSCILLATOR BANK;
+#X text 479 178 single step;
+#X obj 532 392 r #;
+#X text 28 49 Here is an eight voice additive synthesis patch controlled
+by a qlist. Open a text editor on the file \, "qlist.txt" \, to see
+how the oscillators' amplitudes and frequencies are specified. The
+abstraction \, "osc-voice" \, shows an effective way to make patches
+react to qlists but also to mousing.;
+#X text 234 391 this is where qlist comments go:;
+#X obj 16 380 output~;
+#X text 394 423 updatged for Pd version 0.39;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 24 0;
+#X connect 7 0 24 1;
+#X connect 9 0 8 0;
+#X connect 10 0 8 0;
+#X connect 11 0 10 0;
+#X connect 15 0 8 0;
+#X connect 16 0 8 0;
+#X connect 17 0 8 0;
+#X connect 18 0 8 0;
diff --git a/desiredata/doc/3.audio.examples/D14.vibrato.pd b/desiredata/doc/3.audio.examples/D14.vibrato.pd
new file mode 100644
index 00000000..3f4d6ea2
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/D14.vibrato.pd
@@ -0,0 +1,104 @@
+#N canvas 80 10 709 653 12;
+#X obj 28 258 r trigger;
+#X obj 28 454 *~;
+#X obj 28 482 *~;
+#X floatatom 63 304 3 0 100 0 - - -;
+#X msg 460 493 \; trigger 0;
+#X obj 28 281 unpack;
+#X floatatom 28 304 1 0 100 0 - - -;
+#X obj 27 533 +~ 0.3;
+#X obj 27 559 cos~;
+#X obj 27 507 osc~;
+#X obj 63 323 mtof;
+#X obj 63 345 sqrt;
+#X obj 63 367 sqrt;
+#X text 572 461 <-- octave up;
+#X msg 460 416 \; trigger 1 60;
+#X msg 460 453 \; trigger 1 72;
+#X text 550 494 <-- release;
+#X text 556 512 is optional;
+#X obj 28 424 *~;
+#X obj 237 404 +~ 1;
+#N canvas 0 0 450 300 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 246 508 graph;
+#X obj 237 356 tabosc4~ array62;
+#X floatatom 237 312 3 0 0 0 - - -;
+#X obj 237 333 / 6;
+#X obj 237 380 *~;
+#X floatatom 391 333 3 0 0 0 - - -;
+#X text 236 438 since we'll multiply \,;
+#X text 235 453 vibrato output should;
+#X text 235 470 be centered at 1 \, not 0;
+#X text 273 384 multiply by vib depth;
+#X obj 391 361 / 6923;
+#X text 62 425 apply vibrato;
+#X text 66 453 fourth;
+#X text 69 469 power;
+#X text 97 537 waveform;
+#X text 96 517 simple;
+#X text 457 354 4/(exp(log(2)/1200)-1);
+#X text 461 335 conversion factor is;
+#X text 384 295 vibrato depth;
+#X text 383 312 in cents;
+#X text 228 274 vibrato speed;
+#X text 227 291 in Hertz;
+#X obj 28 392 adsr 0 100 200 100 300;
+#X obj 26 587 output~;
+#X text 88 9 USING ADSRS FOR PORTAMENTO AND ADDING VIBRATO TOO;
+#X text 43 30 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 possible to do the job without having
+to convert from pitch to frequency units at the audio rate. To do this
+we just raise the "pitch" to the fourth power \, so that it acts pseudo-exponentially.
+Rather than add vibrato to the ADSR output \, we multiply a signal
+which controls relative frequency. The relative frequency change is
+one plus an oscillator.;
+#X text 439 626 updated for Pd version 0.39;
+#X text 45 185 The table below holds 6 cycles of vibrato with small
+variations to get a not-exactly-repeating vibrato. We thus have to
+divide vibrato frequency by six. You can just use a sine or triangle
+wave if you prefer.;
+#X text 573 426 <-- middle C;
+#X connect 0 0 5 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 2 0 9 0;
+#X connect 3 0 10 0;
+#X connect 5 0 6 0;
+#X connect 5 1 3 0;
+#X connect 6 0 42 0;
+#X connect 7 0 8 0;
+#X connect 8 0 43 0;
+#X connect 8 0 43 1;
+#X connect 9 0 7 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 42 1;
+#X connect 18 0 1 0;
+#X connect 18 0 1 1;
+#X connect 19 0 18 1;
+#X connect 21 0 24 0;
+#X connect 22 0 23 0;
+#X connect 23 0 21 0;
+#X connect 24 0 19 0;
+#X connect 25 0 30 0;
+#X connect 30 0 24 1;
+#X connect 42 0 18 0;
diff --git a/desiredata/doc/3.audio.examples/E01.spectrum.pd b/desiredata/doc/3.audio.examples/E01.spectrum.pd
new file mode 100644
index 00000000..6754bda1
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E01.spectrum.pd
@@ -0,0 +1,179 @@
+#N canvas 190 29 773 821 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array E01-signal 882 float 0;
+#X coords 0 5 882 -5 200 130 1;
+#X restore 531 41 graph;
+#X obj 40 304 hip~ 5;
+#N canvas 0 0 450 300 graph1 0;
+#X array E01-spectrum 128 float 0;
+#X coords 0 4300 127 -40 257 130 1;
+#X restore 485 226 graph;
+#X text 134 243 <-- click to graph;
+#N canvas 45 83 558 569 fft 0;
+#X obj 19 62 inlet~;
+#X obj 85 214 inlet;
+#X obj 19 92 rfft~;
+#X obj 19 125 *~;
+#X obj 50 125 *~;
+#X obj 19 155 sqrt~;
+#X obj 85 248 tabwrite~ E01-spectrum;
+#X obj 332 109 block~ 4096 1;
+#X obj 19 181 biquad~ 0 0 0 0 1;
+#X text 83 93 Fourier series;
+#X text 88 146 magnitude;
+#X text 86 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 62 signal to analyze;
+#X text 182 166 delay two samples;
+#X text 181 182 for better graphing;
+#X obj 90 425 samplerate~;
+#X obj 90 402 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 90 472 5 0 0 0 - - -;
+#X obj 90 448 / 256;
+#X obj 90 378 loadbang;
+#X floatatom 90 541 5 0 0 0 - - -;
+#X obj 98 494 s fundamental;
+#X obj 90 517 ftom;
+#X text 146 540 <-just out of curiosity \, here's the pitch;
+#X text 14 319 At load time \, calculate a good choice of fundamental
+frequency for showing spectra: the 16th bin in a 4096-point spectrum
+\, so SR*16/4096 or SR/256.;
+#X text 135 216 "bang" into this inlet to graph it;
+#X connect 0 0 2 0;
+#X connect 1 0 6 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 8 0;
+#X connect 8 0 6 0;
+#X connect 16 0 19 0;
+#X connect 17 0 16 0;
+#X connect 18 0 22 0;
+#X connect 18 0 23 0;
+#X connect 19 0 18 0;
+#X connect 20 0 17 0;
+#X connect 23 0 21 0;
+#X restore 51 279 pd fft;
+#X text 531 173 ---- 0.02 seconds ----;
+#X obj 111 244 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 40 332 output~;
+#X obj 111 279 tabwrite~ E01-signal;
+#X text 523 800 updated for Pd version 0.37;
+#X text 516 359 1;
+#X text 550 359 2;
+#X text 582 359 3;
+#X text 614 359 4;
+#X text 647 359 5;
+#X text 677 359 6;
+#X text 708 359 7;
+#X text 484 359 0;
+#X text 520 378 -- partial number --;
+#X text 733 97 0;
+#X obj 42 42 r fundamental;
+#X obj 42 111 osc~;
+#X obj 63 136 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 41 161 *~;
+#X obj 85 111 osc~;
+#X obj 106 136 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 84 161 *~;
+#X obj 128 111 osc~;
+#X obj 149 136 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 127 161 *~;
+#X obj 128 88 * 2;
+#X obj 171 111 osc~;
+#X obj 192 136 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 170 161 *~;
+#X obj 214 111 osc~;
+#X obj 235 136 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 213 161 *~;
+#X obj 257 111 osc~;
+#X obj 278 136 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 256 161 *~;
+#X obj 42 88 * 0;
+#X obj 85 88 * 1;
+#X obj 171 88 * 3;
+#X obj 214 88 * 4;
+#X obj 257 88 * 5;
+#X text 303 136 <-- On/Off;
+#X text 337 152 for each;
+#X text 339 168 partial;
+#X text 595 11 WAVEFORM;
+#X text 578 204 SPECTRUM;
+#X text 25 415 The next series of patches demonstrates various kinds
+of modulation: AM \, waveshaping \, and FM. We will need a tool for
+graphing spectra which is introduced here. In this patch the signal
+to be analyzed is a simple sum of up to six partials of a fundamental
+frequency (which is 172 Hz \, close to F below middle C \, if your
+sample rate happens to be 44100 Hz. The fundamental is chosen to agree
+with the analysis patch ("pd FFT") and is computed within it).;
+#X text 25 546 The partials are numbered 0 through 5 \, where 0 means
+DC \, or zero frequency \, 1 is the fundamental \, and so on. The toggle
+switches allow you to turn them on and off separately. You have to
+press the "click to graph" button to update the two graphs.;
+#X text 745 344 0;
+#X text 743 223 1;
+#X text 744 282 0.5;
+#X text 26 631 The upper graph is just the (time domain) waveform \,
+about four periods long. The lower graph is the magnitude spectrum.
+Its peaks are the magnitudes of the partials. Note that a DC signal
+of amplitude one is considered a partial of magnitude 1 \, but the
+other partials \, which have peak amplitudes of 1 (and RMS 0.707) \,
+have peak magnitudes of only 0.5 in the spectrum.;
+#X obj 41 222 *~ 1;
+#X text 733 37 5;
+#X text 734 157 -5;
+#X text 81 221 sum;
+#X text 96 5 GRAPHING SPECTRA OF AUDIO SIGNALS;
+#X text 24 742 Here we're introducing a new feature: multiple signals
+connected to a signal inlet (as in the "*~ 1") are added. This is the
+most convenient way to sum the six partials.;
+#X connect 1 0 7 0;
+#X connect 1 0 7 1;
+#X connect 6 0 4 1;
+#X connect 6 0 8 0;
+#X connect 20 0 40 0;
+#X connect 20 0 41 0;
+#X connect 20 0 30 0;
+#X connect 20 0 42 0;
+#X connect 20 0 43 0;
+#X connect 20 0 44 0;
+#X connect 21 0 23 0;
+#X connect 22 0 23 1;
+#X connect 23 0 56 0;
+#X connect 24 0 26 0;
+#X connect 25 0 26 1;
+#X connect 26 0 56 0;
+#X connect 27 0 29 0;
+#X connect 28 0 29 1;
+#X connect 29 0 56 0;
+#X connect 30 0 27 0;
+#X connect 31 0 33 0;
+#X connect 32 0 33 1;
+#X connect 33 0 56 0;
+#X connect 34 0 36 0;
+#X connect 35 0 36 1;
+#X connect 36 0 56 0;
+#X connect 37 0 39 0;
+#X connect 38 0 39 1;
+#X connect 39 0 56 0;
+#X connect 40 0 21 0;
+#X connect 41 0 24 0;
+#X connect 42 0 31 0;
+#X connect 43 0 34 0;
+#X connect 44 0 37 0;
+#X connect 56 0 4 0;
+#X connect 56 0 1 0;
+#X connect 56 0 8 0;
diff --git a/desiredata/doc/3.audio.examples/E02.ring.modulation.pd b/desiredata/doc/3.audio.examples/E02.ring.modulation.pd
new file mode 100644
index 00000000..81004cf2
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E02.ring.modulation.pd
@@ -0,0 +1,197 @@
+#N canvas 269 43 755 746 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array E02-signal 882 float 0;
+#X coords 0 5 882 -5 200 130 1;
+#X restore 501 66 graph;
+#X obj 15 370 hip~ 5;
+#N canvas 0 0 450 300 graph1 0;
+#X array E02-spectrum 128 float 0;
+#X coords 0 4300 127 -40 257 130 1;
+#X restore 455 251 graph;
+#N canvas 45 83 558 569 fft 0;
+#X obj 19 61 inlet~;
+#X obj 95 214 inlet;
+#X obj 29 92 rfft~;
+#X obj 29 125 *~;
+#X obj 60 125 *~;
+#X obj 29 155 sqrt~;
+#X obj 332 109 block~ 4096 1;
+#X obj 29 181 biquad~ 0 0 0 0 1;
+#X text 93 93 Fourier series;
+#X text 98 146 magnitude;
+#X text 96 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 192 166 delay two samples;
+#X text 191 182 for better graphing;
+#X obj 16 425 samplerate~;
+#X obj 16 402 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 16 472 5 0 0 0 - - -;
+#X obj 16 448 / 256;
+#X obj 16 378 loadbang;
+#X floatatom 16 541 5 0 0 0 - - -;
+#X obj 24 494 s fundamental;
+#X obj 16 517 ftom;
+#X text 14 319 At load time \, calculate a good choice of fundamental
+frequency for showing spectra: the 16th bin in a 4096-point spectrum
+\, so SR*16/4096 or SR/256.;
+#X text 145 216 "bang" into this inlet to graph it;
+#X floatatom 191 480 5 0 0 0 - - -;
+#X obj 191 456 / 4096;
+#X text 187 425 One bin is SR/4096:;
+#X text 72 540 <-just out of curiosity \, here's the fundamental pitch
+;
+#X obj 191 502 s freq-step;
+#X obj 95 248 tabwrite~ E02-spectrum;
+#X obj 20 281 tabwrite~ E02-signal;
+#X connect 0 0 2 0;
+#X connect 0 0 31 0;
+#X connect 1 0 30 0;
+#X connect 1 0 31 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 30 0;
+#X connect 15 0 18 0;
+#X connect 15 0 26 0;
+#X connect 16 0 15 0;
+#X connect 17 0 21 0;
+#X connect 17 0 22 0;
+#X connect 18 0 17 0;
+#X connect 19 0 16 0;
+#X connect 22 0 20 0;
+#X connect 25 0 29 0;
+#X connect 26 0 25 0;
+#X restore 23 343 pd fft;
+#X text 501 198 ---- 0.02 seconds ----;
+#X obj 84 344 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 15 398 output~;
+#X text 501 720 updated for Pd version 0.37;
+#X text 486 384 1;
+#X text 520 384 2;
+#X text 552 384 3;
+#X text 584 384 4;
+#X text 617 384 5;
+#X text 647 384 6;
+#X text 678 384 7;
+#X text 454 384 0;
+#X text 490 403 -- partial number --;
+#X text 703 120 0;
+#X obj 18 32 r fundamental;
+#X obj 18 94 osc~;
+#X obj 39 119 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 17 144 *~;
+#X obj 61 94 osc~;
+#X obj 82 119 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 60 144 *~;
+#X obj 104 94 osc~;
+#X obj 125 119 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 103 144 *~;
+#X obj 104 71 * 2;
+#X obj 147 94 osc~;
+#X obj 168 119 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 146 144 *~;
+#X obj 190 94 osc~;
+#X obj 211 119 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 189 144 *~;
+#X obj 233 94 osc~;
+#X obj 254 119 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 232 144 *~;
+#X obj 18 71 * 0;
+#X obj 61 71 * 1;
+#X obj 147 71 * 3;
+#X obj 190 71 * 4;
+#X obj 233 71 * 5;
+#X text 282 118 <-- On/Off;
+#X text 565 46 WAVEFORM;
+#X text 548 229 SPECTRUM;
+#X text 715 367 0;
+#X text 713 246 1;
+#X text 714 305 0.5;
+#X text 703 60 5;
+#X text 704 180 -5;
+#X obj 16 239 *~;
+#X text 300 102 partials;
+#X obj 154 270 osc~;
+#X floatatom 154 210 3 0 200 0 - - -;
+#X obj 154 239 *;
+#X obj 187 239 r freq-step;
+#X text 226 177 modulation;
+#X text 222 192 frequency in;
+#X text 185 209 <-- "steps" of f/16;
+#X text 97 -1 RING MODULATION: multiplying a complex tone by a sinusoid
+;
+#X obj 84 299 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X text 107 343 <-- graph once;
+#X obj 84 321 metro 500;
+#X text 107 298 <-- graph repeatedly;
+#X text 35 463 Now we ring modulate the signal by multiplying it by
+another sinusoid. The modulation frequency is controlled in steps of
+f/16 where "f" is the fundamental frequency \, giving roughly 11 Hz.
+per step. Note that if the modulation frequency is set to zero we can't
+predict the overall amplitude because it depends on what phase the
+modulation oscillator happened to have at that moment.;
+#X text 32 579 If you choose a multiple of the fundamental as a modulation
+frequency (16 \, 32 \, 48 \, 64 \, ... "steps") the result is again
+periodic at the original frequency. If you select a half-integer times
+the fundamental (8 \, 24 \, 40 \, ... steps) the pitch drops by an
+octave and you get only odd partials. For most other settings you'll
+get an inharmonic complex of tones. These are sometimes heard as separate
+pitches and other times they seem to fuse into a single timbre with
+indeterminate pitch.;
+#X connect 1 0 6 0;
+#X connect 1 0 6 1;
+#X connect 5 0 3 1;
+#X connect 18 0 38 0;
+#X connect 18 0 39 0;
+#X connect 18 0 28 0;
+#X connect 18 0 40 0;
+#X connect 18 0 41 0;
+#X connect 18 0 42 0;
+#X connect 19 0 21 0;
+#X connect 20 0 21 1;
+#X connect 21 0 51 0;
+#X connect 22 0 24 0;
+#X connect 23 0 24 1;
+#X connect 24 0 51 0;
+#X connect 25 0 27 0;
+#X connect 26 0 27 1;
+#X connect 27 0 51 0;
+#X connect 28 0 25 0;
+#X connect 29 0 31 0;
+#X connect 30 0 31 1;
+#X connect 31 0 51 0;
+#X connect 32 0 34 0;
+#X connect 33 0 34 1;
+#X connect 34 0 51 0;
+#X connect 35 0 37 0;
+#X connect 36 0 37 1;
+#X connect 37 0 51 0;
+#X connect 38 0 19 0;
+#X connect 39 0 22 0;
+#X connect 40 0 29 0;
+#X connect 41 0 32 0;
+#X connect 42 0 35 0;
+#X connect 51 0 3 0;
+#X connect 51 0 1 0;
+#X connect 53 0 51 1;
+#X connect 54 0 55 0;
+#X connect 55 0 53 0;
+#X connect 56 0 55 1;
+#X connect 61 0 63 0;
+#X connect 63 0 5 0;
diff --git a/desiredata/doc/3.audio.examples/E03.octave.divider.pd b/desiredata/doc/3.audio.examples/E03.octave.divider.pd
new file mode 100644
index 00000000..251e4561
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E03.octave.divider.pd
@@ -0,0 +1,141 @@
+#N canvas 159 17 793 665 12;
+#X obj 477 135 loadbang;
+#X obj 31 289 hip~ 5;
+#X obj 477 53 adc~ 1;
+#X obj 477 190 soundfiler;
+#X obj 32 322 output~;
+#X text 544 646 updated for Pd version 0.37;
+#X obj 478 100 tabwrite~ E03-table;
+#X msg 477 162 read ../sound/voice.wav E03-table;
+#X obj 117 64 fiddle~ 2048;
+#X obj 118 95 unpack;
+#X obj 111 199 osc~;
+#X obj 118 119 moses 1;
+#X obj 77 199 *~;
+#X obj 145 147 mtof;
+#X obj 145 170 *;
+#X msg 194 125 0.5;
+#X floatatom 194 154 3 0 0 0 - - -;
+#X msg 232 125 15;
+#N canvas 0 0 446 202 /SUBPATCH/ 0;
+#X obj 261 30 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 100 20 inlet~;
+#X obj 99 87 *~;
+#X obj 98 159 outlet~;
+#X text 381 181 corner;
+#X connect 0 0 2 1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X coords 0 0 100 100 40 18 1;
+#X restore 78 248 pd;
+#N canvas 0 0 446 202 /SUBPATCH/ 0;
+#X obj 261 30 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 100 20 inlet~;
+#X obj 99 87 *~;
+#X obj 98 159 outlet~;
+#X text 381 181 corner;
+#X connect 0 0 2 1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X coords 0 0 100 100 40 18 1;
+#X restore 32 248 pd;
+#X obj 78 222 *~ 2;
+#X obj 194 100 loadbang;
+#N canvas 414 195 613 302 looper 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array E03-table 44103 float 0;
+#X coords 0 1.02 44103 -1.02 200 130 1;
+#X restore 349 22 graph;
+#X text 347 161 ---- 44103 samples ----;
+#X obj 35 77 +~ 1;
+#X obj 35 25 phasor~ 1;
+#X obj 35 50 *~ 44100;
+#X obj 35 106 tabread4~ E03-table;
+#X obj 35 132 outlet~;
+#X text 46 238 one-second sample reader loop. You can replace this
+with an adc~ if you want to go live.;
+#X connect 2 0 5 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X restore 118 18 pd looper;
+#X text 561 141 re-read original sample;
+#X obj 489 77 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 300 203 758 306 delay 0;
+#X obj 15 222 outlet~;
+#X obj 14 21 inlet~;
+#X obj 15 102 loadbang;
+#X obj 14 49 delwrite~ E03-del 40;
+#X obj 15 195 delread~ E03-del;
+#X obj 15 152 expr 1000*1024/$f1;
+#X obj 15 128 samplerate~;
+#X text 208 47 write to delay line which has enough memory to hold
+40 msec;
+#X text 125 128 get sample rate at load time;
+#X text 185 152 divide 1024 by sample rate to give time in seconds
+\; multiply by 1000 to convert to milliseconds.;
+#X text 168 197 read from the delay line at the calculater delay;
+#X text 317 268 1024-sample delay;
+#X connect 1 0 3 0;
+#X connect 2 0 6 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X restore 31 71 pd delay;
+#X text 242 4 OCTAVE DIVIDING VIA RING MODULATION;
+#X text 508 75 <-- record a sample;
+#X text 265 125 <-- choose an effect;
+#X text 157 231 on/off for original;
+#X text 128 247 <--and processed sounds;
+#X text 196 274 This patch demonstrates using ring modulation to alias
+a sound down one octave. The ring modulation itself ("osc~" and multiplier)
+is easy. (We step it up by a factor of 2 to balance the original better.)
+;
+#X text 198 340 Harder is getting the fundamental frequency of the
+original sound. We do this with the complicated "fiddle~" object \,
+which puts out a stream of analysis data for an incoming signal. The
+"2048" argument specifies the analysis window size. The analysis is
+most closely aligned with what the sound was doing at the middle of
+the window \, i.e. \, 1024 samples ago. The "pd delay" window delays
+the signal itself 1024 samples so it will be as tightly synchronized
+with the analysis data as possible. (If you're doing this on a real-time
+input \, you might drop the delay and settle for less perfect synchronization.)
+;
+#X text 198 512 About fiddle~ \, suffice it to say that the third outlet
+contains (pitch \, amplitude) pairs. We unpack the pitch and strip
+out any zeros (when fiddle~ fails to find a pitch it outputs zero but
+we'd rather stick with the most recent good one). This is converted
+from MIDI to Hertz \, and multiplied by 1/2 to control the modulation
+oscillator. (You can also try large-ish integers which leave the pitch
+intact but introduce funny formants.);
+#X msg 406 237 read ../../saucisse.wav E03-table;
+#X obj 25 16 adc~ 1;
+#X connect 0 0 7 0;
+#X connect 1 0 4 0;
+#X connect 1 0 4 1;
+#X connect 2 0 6 0;
+#X connect 7 0 3 0;
+#X connect 8 2 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 12 1;
+#X connect 11 1 13 0;
+#X connect 12 0 20 0;
+#X connect 13 0 14 0;
+#X connect 14 0 10 0;
+#X connect 15 0 16 0;
+#X connect 16 0 14 1;
+#X connect 17 0 16 0;
+#X connect 18 0 1 0;
+#X connect 19 0 1 0;
+#X connect 20 0 18 0;
+#X connect 21 0 15 0;
+#X connect 22 0 8 0;
+#X connect 22 0 25 0;
+#X connect 24 0 6 0;
+#X connect 25 0 19 0;
+#X connect 25 0 12 0;
+#X connect 34 0 3 0;
+#X connect 35 0 25 0;
diff --git a/desiredata/doc/3.audio.examples/E04.difference.tone.pd b/desiredata/doc/3.audio.examples/E04.difference.tone.pd
new file mode 100644
index 00000000..7272222b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E04.difference.tone.pd
@@ -0,0 +1,45 @@
+#N canvas 266 135 637 523 12;
+#X obj 19 128 +~;
+#X obj 18 209 output~;
+#X text 141 3 NONLINEAR DISTORTION AND DIFFERENCE TONES;
+#X obj 154 171 / 100;
+#X floatatom 154 151 5 0 500 0 - - -;
+#X obj 18 181 clip~ -1 1;
+#X floatatom 42 81 5 0 0 0 - - -;
+#X obj 42 103 osc~ 200;
+#X obj 18 155 *~;
+#X obj 42 35 loadbang;
+#X msg 154 127 50;
+#X obj 154 103 loadbang;
+#X text 385 494 updated for Pd version 0.37;
+#X text 94 80 <-- frequency of second tone;
+#X text 209 151 <-- before clipping;
+#X text 234 134 amplitude of sum;
+#X obj 18 9 osc~ 300;
+#X msg 42 58 225;
+#X text 99 226 This patch demonstrates how nonlinear distortion (also
+known as "waveshaping") can create difference tones from a pair of
+sinusoids. The sinusoids are initially tuned to 225 and 300 Hz \, a
+musical fourth \, and have amplitude of 50 percent (0.5) so that the
+sum is always less than 1 in absolute value. At these settings the
+"clip~" object passes its input through unchanged.;
+#X text 100 344 If the amplitude rises above 50 percent \, the clip~
+object starts altering the signal nonlinearly \, and the result is
+no longer as if the two sinusoids had been processed separately. Instead
+\, they "intermodulate" \, finding a common subharmonic if one exists.
+At 300 and 225 Hz \, the subharmonic is at 75 \, two octaves below
+the upper tone and a twelveth below the lower one. Change the frequency
+of the second tone and you will hear a variety of effects.;
+#X connect 0 0 8 0;
+#X connect 3 0 8 1;
+#X connect 4 0 3 0;
+#X connect 5 0 1 0;
+#X connect 5 0 1 1;
+#X connect 6 0 7 0;
+#X connect 7 0 0 1;
+#X connect 8 0 5 0;
+#X connect 9 0 17 0;
+#X connect 10 0 4 0;
+#X connect 11 0 10 0;
+#X connect 16 0 0 0;
+#X connect 17 0 6 0;
diff --git a/desiredata/doc/3.audio.examples/E05.chebychev.pd b/desiredata/doc/3.audio.examples/E05.chebychev.pd
new file mode 100644
index 00000000..90c628db
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E05.chebychev.pd
@@ -0,0 +1,257 @@
+#N canvas 224 60 657 571 12;
+#X obj 23 269 output~;
+#X obj 45 74 / 100;
+#X floatatom 45 54 5 0 100 0 - - -;
+#X obj 23 144 *~;
+#X text 403 539 updated for Pd version 0.37;
+#X obj 22 29 osc~ 220;
+#X obj 45 97 pack 0 50;
+#X obj 45 121 line~;
+#X text 97 54 <-- index in;
+#X text 117 68 hundredths;
+#X obj 23 169 *~ 128;
+#X obj 23 217 tabread4~ E05-tab;
+#N canvas 0 0 450 300 graph1 0;
+#X array E05-tab 259 float 1;
+#A 0 -1.20148 -1 -0.810724 -0.63326 -0.467216 -0.31221 -0.167866 -0.0338144
+0.0903053 0.204849 0.310166 0.406597 0.494477 0.574137 0.645895 0.71007
+0.766969 0.816895 0.860145 0.897008 0.927771 0.952708 0.972093 0.98619
+0.995261 0.999557 0.999329 0.994816 0.986257 0.97388 0.957912 0.938572
+0.916074 0.890625 0.86243 0.831684 0.798582 0.76331 0.726049 0.686977
+0.646266 0.60408 0.560583 0.515931 0.470276 0.423765 0.37654 0.328738
+0.280493 0.231934 0.183183 0.13436 0.0855808 0.0369554 -0.01141 -0.0594134
+-0.106956 -0.153946 -0.200292 -0.245909 -0.290715 -0.334633 -0.377589
+-0.419512 -0.460337 -0.5 -0.538443 -0.57561 -0.611449 -0.645912 -0.678953
+-0.710532 -0.740609 -0.76915 -0.796122 -0.821497 -0.845248 -0.867354
+-0.887794 -0.906551 -0.923612 -0.938965 -0.952601 -0.964516 -0.974704
+-0.983167 -0.989906 -0.994925 -0.99823 -0.999832 -0.999741 -0.997972
+-0.994539 -0.98946 -0.982757 -0.97445 -0.964564 -0.953125 -0.94016
+-0.925699 -0.909772 -0.892414 -0.873658 -0.85354 -0.832098 -0.809372
+-0.785401 -0.760228 -0.733895 -0.706446 -0.677928 -0.648387 -0.61787
+-0.586426 -0.554105 -0.520957 -0.487033 -0.452386 -0.417069 -0.381135
+-0.344638 -0.307632 -0.270174 -0.232319 -0.194122 -0.15564 -0.11693
+-0.0780487 -0.039053 0 0.039053 0.0780487 0.11693 0.15564 0.194122
+0.232319 0.270174 0.307632 0.344638 0.381135 0.417069 0.452386 0.487033
+0.520957 0.554105 0.586426 0.61787 0.648387 0.677928 0.706446 0.733895
+0.760228 0.785401 0.809372 0.832098 0.85354 0.873658 0.892414 0.909772
+0.925699 0.94016 0.953125 0.964564 0.97445 0.982757 0.98946 0.994539
+0.997972 0.999741 0.999832 0.99823 0.994925 0.989906 0.983167 0.974704
+0.964516 0.952601 0.938965 0.923612 0.906551 0.887794 0.867354 0.845248
+0.821497 0.796122 0.76915 0.740609 0.710532 0.678953 0.645912 0.611449
+0.57561 0.538443 0.5 0.460337 0.419512 0.377589 0.334633 0.290715 0.245909
+0.200292 0.153946 0.106956 0.0594134 0.01141 -0.0369554 -0.0855808
+-0.13436 -0.183183 -0.231934 -0.280493 -0.328738 -0.37654 -0.423765
+-0.470276 -0.515931 -0.560583 -0.60408 -0.646266 -0.686977 -0.726049
+-0.76331 -0.798582 -0.831684 -0.86243 -0.890625 -0.916074 -0.938572
+-0.957912 -0.97388 -0.986257 -0.994816 -0.999329 -0.999557 -0.995261
+-0.98619 -0.972093 -0.952708 -0.927771 -0.897008 -0.860145 -0.816895
+-0.766969 -0.71007 -0.645895 -0.574137 -0.494477 -0.406597 -0.310166
+-0.204849 -0.0903053 0.0338144 0.167866 0.31221 0.467216 0.63326 0.810724
+1 1.20148;
+#X coords 0 1 258 -1 200 140 1;
+#X restore 262 46 graph;
+#X text 497 28 subpatch to;
+#N canvas 113 0 849 700 make-table 0;
+#X obj 141 304 t b b;
+#X obj 213 329 f;
+#X obj 251 329 + 1;
+#X msg 235 306 0;
+#X obj 141 327 until;
+#X obj 213 359 t f f;
+#X obj 114 436 tabwrite E05-tab;
+#X obj 140 355 sel 258;
+#X text 203 172 normalize from -1 to 1;
+#X obj 141 285 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 88 386 expr ($f1-129)/128;
+#X obj 141 262 inlet;
+#X obj 171 534 t b b;
+#X obj 243 559 f;
+#X obj 281 559 + 1;
+#X msg 265 536 0;
+#X obj 171 557 until;
+#X obj 243 589 t f f;
+#X obj 144 666 tabwrite E05-tab;
+#X obj 170 585 sel 258;
+#X obj 171 515 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 118 616 expr ($f1-129)/128;
+#X obj 171 492 inlet;
+#X obj 444 228 t b b;
+#X obj 516 253 f;
+#X obj 554 253 + 1;
+#X msg 538 230 0;
+#X obj 444 251 until;
+#X obj 516 283 t f f;
+#X obj 417 360 tabwrite E05-tab;
+#X obj 443 279 sel 258;
+#X obj 391 334 expr 16*$f1*$f1*$f1*$f1*$f1-20*$f1*$f1*$f1+5*$f1;
+#X obj 444 209 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 391 310 expr ($f1-129)/128;
+#X obj 444 186 inlet;
+#X obj 504 476 t b b;
+#X obj 576 501 f;
+#X obj 614 501 + 1;
+#X msg 598 478 0;
+#X obj 504 499 until;
+#X obj 576 531 t f f;
+#X obj 477 624 tabwrite E05-tab;
+#X obj 503 527 sel 258;
+#X obj 504 457 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 448 558 expr ($f1-129)/128;
+#X obj 504 434 inlet;
+#X obj 88 410 expr 4*$f1*$f1*$f1-3*$f1;
+#X obj 118 640 expr 8*$f1*$f1*$f1*$f1-8*$f1*$f1+1;
+#X obj 448 582 expr 32*$f1*$f1*$f1*$f1*$f1*$f1 -48*$f1*$f1*$f1*$f1+18*$f1*$f1-1
+;
+#X text 641 622 6th C.P. and basta.;
+#X obj 83 92 t b b;
+#X obj 155 117 f;
+#X obj 193 117 + 1;
+#X msg 177 94 0;
+#X obj 83 115 until;
+#X obj 155 147 t f f;
+#X obj 56 224 tabwrite E05-tab;
+#X obj 82 143 sel 258;
+#X obj 83 73 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 30 174 expr ($f1-129)/128;
+#X obj 83 50 inlet;
+#X obj 30 198 expr 2*$f1*$f1-1;
+#X text 203 198 2nd C.P.;
+#X text 309 410 3rd C.P.;
+#X text 331 660 4th C.P.;
+#X text 613 357 5th C.P.;
+#X text 259 51 This patch computes Chebychev polynomials and stores
+them in a wavetable for use later.;
+#X connect 0 0 4 0;
+#X connect 0 1 3 0;
+#X connect 1 0 2 0;
+#X connect 1 0 5 0;
+#X connect 1 0 7 0;
+#X connect 2 0 1 1;
+#X connect 3 0 1 1;
+#X connect 4 0 1 0;
+#X connect 5 0 10 0;
+#X connect 5 1 6 1;
+#X connect 7 0 4 1;
+#X connect 9 0 0 0;
+#X connect 10 0 46 0;
+#X connect 11 0 9 0;
+#X connect 12 0 16 0;
+#X connect 12 1 15 0;
+#X connect 13 0 14 0;
+#X connect 13 0 17 0;
+#X connect 13 0 19 0;
+#X connect 14 0 13 1;
+#X connect 15 0 13 1;
+#X connect 16 0 13 0;
+#X connect 17 0 21 0;
+#X connect 17 1 18 1;
+#X connect 19 0 16 1;
+#X connect 20 0 12 0;
+#X connect 21 0 47 0;
+#X connect 22 0 20 0;
+#X connect 23 0 27 0;
+#X connect 23 1 26 0;
+#X connect 24 0 25 0;
+#X connect 24 0 28 0;
+#X connect 24 0 30 0;
+#X connect 25 0 24 1;
+#X connect 26 0 24 1;
+#X connect 27 0 24 0;
+#X connect 28 0 33 0;
+#X connect 28 1 29 1;
+#X connect 30 0 27 1;
+#X connect 31 0 29 0;
+#X connect 32 0 23 0;
+#X connect 33 0 31 0;
+#X connect 34 0 32 0;
+#X connect 35 0 39 0;
+#X connect 35 1 38 0;
+#X connect 36 0 37 0;
+#X connect 36 0 40 0;
+#X connect 36 0 42 0;
+#X connect 37 0 36 1;
+#X connect 38 0 36 1;
+#X connect 39 0 36 0;
+#X connect 40 0 44 0;
+#X connect 40 1 41 1;
+#X connect 42 0 39 1;
+#X connect 43 0 35 0;
+#X connect 44 0 48 0;
+#X connect 45 0 43 0;
+#X connect 46 0 6 0;
+#X connect 47 0 18 0;
+#X connect 48 0 41 0;
+#X connect 50 0 54 0;
+#X connect 50 1 53 0;
+#X connect 51 0 52 0;
+#X connect 51 0 55 0;
+#X connect 51 0 57 0;
+#X connect 52 0 51 1;
+#X connect 53 0 51 1;
+#X connect 54 0 51 0;
+#X connect 55 0 59 0;
+#X connect 55 1 56 1;
+#X connect 57 0 54 1;
+#X connect 58 0 50 0;
+#X connect 59 0 61 0;
+#X connect 60 0 58 0;
+#X connect 61 0 56 0;
+#X restore 489 146 pd make-table;
+#X obj 489 126 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 517 126 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 545 126 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 573 126 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 600 126 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 497 45 calculate;
+#X text 495 64 Chebychev;
+#X text 496 83 polynomials;
+#X text 490 107 2;
+#X text 517 107 3;
+#X text 546 107 4;
+#X text 572 108 5;
+#X text 601 107 6;
+#X text 134 2 waveshaping with Chebychev polynomials;
+#X obj 23 193 +~ 129;
+#X obj 23 242 hip~ 5;
+#X text 107 256 This patch demonstrates using Chebychev polynomials
+(of the first kind) to generate pure harmonics using waveshaping. The
+pure harmonic only comes out when the index is one (top of the scale).
+Smaller indices will give various mixes of harmonics. The table initially
+holds the fifth Chebychev polynomial \, so you can get the fifth harmonic.
+;
+#X text 106 355 There is an audible "rolling" sound as the index changes
+for the higher degree polynomials \, because the amplitudes of the
+lower partials can rise and fall several times apiece as the index
+rises from zero to one.;
+#X text 105 422 Indices greater than one will try to read values outside
+the table (which would be clipped appropriately). Anyway \, the polynomials
+increase rapidly in value outside the interval from -1 to 1 that we
+are using here.;
+#X text 106 491 When you get tired of Chebychef polynomials you can
+draw your own functions by hand and/or try other formulas.;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 10 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 7 0 3 1;
+#X connect 10 0 29 0;
+#X connect 11 0 30 0;
+#X connect 15 0 14 0;
+#X connect 16 0 14 1;
+#X connect 17 0 14 2;
+#X connect 18 0 14 3;
+#X connect 19 0 14 4;
+#X connect 29 0 11 0;
+#X connect 30 0 0 0;
+#X connect 30 0 0 1;
diff --git a/desiredata/doc/3.audio.examples/E06.exponential.pd b/desiredata/doc/3.audio.examples/E06.exponential.pd
new file mode 100644
index 00000000..02fe058b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E06.exponential.pd
@@ -0,0 +1,335 @@
+#N canvas 88 112 754 729 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array E06-signal 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 509 46 graph;
+#X obj 14 265 hip~ 5;
+#N canvas 0 0 450 300 graph1 0;
+#X array E06-spectrum 128 float 0;
+#X coords 0 4300 127 -40 257 130 1;
+#X restore 463 222 graph;
+#N canvas 45 83 558 569 fft 0;
+#X obj 19 61 inlet~;
+#X obj 208 212 inlet;
+#X obj 29 92 rfft~;
+#X obj 29 125 *~;
+#X obj 60 125 *~;
+#X obj 29 155 sqrt~;
+#X obj 332 109 block~ 4096 1;
+#X obj 29 181 biquad~ 0 0 0 0 1;
+#X text 93 93 Fourier series;
+#X text 98 146 magnitude;
+#X text 96 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 193 164 delay two samples;
+#X text 191 182 for better graphing;
+#X obj 16 425 samplerate~;
+#X obj 16 402 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 16 472 5 0 0 0 - - -;
+#X obj 16 448 / 256;
+#X obj 16 378 loadbang;
+#X floatatom 16 541 5 0 0 0 - - -;
+#X obj 24 494 s fundamental;
+#X obj 16 517 ftom;
+#X text 14 319 At load time \, calculate a good choice of fundamental
+frequency for showing spectra: the 16th bin in a 4096-point spectrum
+\, so SR*16/4096 or SR/256.;
+#X floatatom 191 480 5 0 0 0 - - -;
+#X obj 191 456 / 4096;
+#X text 187 425 One bin is SR/4096:;
+#X obj 191 502 s freq-step;
+#X obj 208 295 tabwrite~ E06-spectrum;
+#X obj 19 295 tabwrite~ E06-signal;
+#X text 71 540 <-fundamental pitch;
+#X obj 220 257 metro 500;
+#X obj 220 234 inlet;
+#X text 273 232 toggle to graph repeatedly;
+#X text 262 212 bang to graph once;
+#X connect 0 0 2 0;
+#X connect 0 0 29 0;
+#X connect 1 0 28 0;
+#X connect 1 0 29 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 28 0;
+#X connect 15 0 18 0;
+#X connect 15 0 25 0;
+#X connect 16 0 15 0;
+#X connect 17 0 21 0;
+#X connect 17 0 22 0;
+#X connect 18 0 17 0;
+#X connect 19 0 16 0;
+#X connect 22 0 20 0;
+#X connect 24 0 27 0;
+#X connect 25 0 24 0;
+#X connect 31 0 28 0;
+#X connect 31 0 29 0;
+#X connect 32 0 31 0;
+#X restore 22 238 pd fft;
+#X text 509 178 ---- 0.02 seconds ----;
+#X obj 82 217 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 14 293 output~;
+#X text 499 708 updated for Pd version 0.37;
+#X text 494 355 1;
+#X text 528 355 2;
+#X text 560 355 3;
+#X text 592 355 4;
+#X text 625 355 5;
+#X text 655 355 6;
+#X text 686 355 7;
+#X text 462 355 0;
+#X text 496 372 -- partial number --;
+#X text 711 100 0;
+#X obj 12 30 r fundamental;
+#X obj 12 57 osc~;
+#X text 573 26 WAVEFORM;
+#X text 557 204 SPECTRUM;
+#X text 723 338 0;
+#X text 721 217 1;
+#X text 722 276 0.5;
+#X obj 82 238 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#N canvas 0 0 450 300 graph1 0;
+#X array E06-tab 1003 float 1;
+#A 0 1.01005 1 0.99005 0.980199 0.970446 0.960789 0.951229 0.941765
+0.932394 0.923116 0.913931 0.904837 0.895834 0.88692 0.878095 0.869358
+0.860708 0.852144 0.843665 0.83527 0.826959 0.818731 0.810584 0.802519
+0.794534 0.786628 0.778801 0.771052 0.76338 0.755784 0.748264 0.740818
+0.733447 0.726149 0.718924 0.71177 0.704688 0.697676 0.690734 0.683861
+0.677057 0.67032 0.66365 0.657047 0.650509 0.644036 0.637628 0.631284
+0.625002 0.618783 0.612626 0.606531 0.600496 0.594521 0.588605 0.582748
+0.57695 0.571209 0.565525 0.559898 0.554327 0.548812 0.543351 0.537944
+0.532592 0.527292 0.522046 0.516851 0.511709 0.506617 0.501576 0.496585
+0.491644 0.486752 0.481909 0.477114 0.472367 0.467666 0.463013 0.458406
+0.453845 0.449329 0.444858 0.440432 0.436049 0.431711 0.427415 0.423162
+0.418952 0.414783 0.410656 0.40657 0.402524 0.398519 0.394554 0.390628
+0.386741 0.382893 0.379083 0.375311 0.371577 0.367879 0.364219 0.360595
+0.357007 0.353455 0.349938 0.346456 0.343008 0.339595 0.336216 0.332871
+0.329559 0.32628 0.323033 0.319819 0.316637 0.313486 0.310367 0.307279
+0.304221 0.301194 0.298197 0.29523 0.292293 0.289384 0.286505 0.283654
+0.280832 0.278037 0.275271 0.272532 0.26982 0.267135 0.264477 0.261846
+0.25924 0.256661 0.254107 0.251579 0.249075 0.246597 0.244143 0.241714
+0.239309 0.236928 0.23457 0.232236 0.229925 0.227638 0.225373 0.22313
+0.22091 0.218712 0.216536 0.214381 0.212248 0.210136 0.208045 0.205975
+0.203926 0.201897 0.199888 0.197899 0.19593 0.19398 0.19205 0.190139
+0.188247 0.186374 0.18452 0.182684 0.180866 0.179066 0.177284 0.17552
+0.173774 0.172045 0.170333 0.168638 0.16696 0.165299 0.163654 0.162026
+0.160414 0.158817 0.157237 0.155673 0.154124 0.15259 0.151072 0.149569
+0.14808 0.146607 0.145148 0.143704 0.142274 0.140858 0.139457 0.138069
+0.136695 0.135335 0.133989 0.132655 0.131336 0.130029 0.128735 0.127454
+0.126186 0.12493 0.123687 0.122456 0.121238 0.120032 0.118837 0.117655
+0.116484 0.115325 0.114178 0.113042 0.111917 0.110803 0.109701 0.108609
+0.107528 0.106459 0.105399 0.10435 0.103312 0.102284 0.101266 0.100259
+0.0992613 0.0982736 0.0972958 0.0963276 0.0953692 0.0944202 0.0934807
+0.0925506 0.0916297 0.0907179 0.0898153 0.0889216 0.0880368 0.0871608
+0.0862936 0.085435 0.0845849 0.0837432 0.08291 0.082085 0.0812682 0.0804596
+0.079659 0.0788664 0.0780817 0.0773047 0.0765356 0.075774 0.07502 0.0742736
+0.0735345 0.0728029 0.0720785 0.0713613 0.0706512 0.0699482 0.0692522
+0.0685631 0.0678809 0.0672055 0.0665368 0.0658748 0.0652193 0.0645703
+0.0639279 0.0632918 0.062662 0.0620385 0.0614212 0.0608101 0.060205
+0.0596059 0.0590129 0.0584257 0.0578443 0.0572688 0.0566989 0.0561348
+0.0555762 0.0550232 0.0544757 0.0539337 0.053397 0.0528657 0.0523397
+0.0518189 0.0513033 0.0507928 0.0502874 0.0497871 0.0492917 0.0488012
+0.0483156 0.0478349 0.0473589 0.0468877 0.0464212 0.0459593 0.045502
+0.0450492 0.044601 0.0441572 0.0437178 0.0432828 0.0428521 0.0424257
+0.0420036 0.0415857 0.0411719 0.0407622 0.0403566 0.0399551 0.0395575
+0.0391639 0.0387742 0.0383884 0.0380064 0.0376283 0.0372538 0.0368832
+0.0365162 0.0361528 0.0357931 0.035437 0.0350844 0.0347353 0.0343896
+0.0340475 0.0337087 0.0333733 0.0330412 0.0327124 0.0323869 0.0320647
+0.0317456 0.0314298 0.031117 0.0308074 0.0305009 0.0301974 0.0298969
+0.0295994 0.0293049 0.0290133 0.0287246 0.0284388 0.0281559 0.0278757
+0.0275983 0.0273237 0.0270518 0.0267827 0.0265162 0.0262523 0.0259911
+0.0257325 0.0254765 0.025223 0.024972 0.0247235 0.0244775 0.024234
+0.0239928 0.0237541 0.0235177 0.0232837 0.0230521 0.0228227 0.0225956
+0.0223708 0.0221482 0.0219278 0.0217096 0.0214936 0.0212797 0.021068
+0.0208584 0.0206508 0.0204453 0.0202419 0.0200405 0.0198411 0.0196437
+0.0194482 0.0192547 0.0190631 0.0188734 0.0186856 0.0184997 0.0183156
+0.0181334 0.017953 0.0177743 0.0175975 0.0174224 0.017249 0.0170774
+0.0169075 0.0167392 0.0165727 0.0164078 0.0162445 0.0160829 0.0159229
+0.0157644 0.0156076 0.0154523 0.0152985 0.0151463 0.0149956 0.0148464
+0.0146986 0.0145524 0.0144076 0.0142642 0.0141223 0.0139818 0.0138427
+0.0137049 0.0135686 0.0134336 0.0132999 0.0131675 0.0130365 0.0129068
+0.0127784 0.0126512 0.0125254 0.0124007 0.0122773 0.0121552 0.0120342
+0.0119145 0.0117959 0.0116786 0.0115624 0.0114473 0.0113334 0.0112206
+0.011109 0.0109985 0.010889 0.0107807 0.0106734 0.0105672 0.0104621
+0.010358 0.0102549 0.0101529 0.0100518 0.00995182 0.0098528 0.00975476
+0.0096577 0.0095616 0.00946646 0.00937227 0.00927902 0.00918669 0.00909528
+0.00900478 0.00891518 0.00882647 0.00873865 0.0086517 0.00856561 0.00848038
+0.008396 0.00831246 0.00822975 0.00814786 0.00806679 0.00798652 0.00790705
+0.00782838 0.00775048 0.00767337 0.00759701 0.00752142 0.00744658 0.00737249
+0.00729913 0.0072265 0.0071546 0.00708341 0.00701293 0.00694315 0.00687406
+0.00680567 0.00673795 0.0066709 0.00660453 0.00653881 0.00647375 0.00640933
+0.00634556 0.00628242 0.00621991 0.00615802 0.00609675 0.00603608 0.00597602
+0.00591656 0.00585769 0.0057994 0.0057417 0.00568457 0.00562801 0.00557201
+0.00551657 0.00546167 0.00540733 0.00535353 0.00530026 0.00524752 0.0051953
+0.00514361 0.00509243 0.00504176 0.00499159 0.00494193 0.00489275 0.00484407
+0.00479587 0.00474815 0.00470091 0.00465413 0.00460782 0.00456197 0.00451658
+0.00447164 0.00442715 0.0043831 0.00433948 0.00429631 0.00425356 0.00421123
+0.00416933 0.00412785 0.00408677 0.00404611 0.00400585 0.00396599 0.00392653
+0.00388746 0.00384878 0.00381048 0.00377257 0.00373503 0.00369786 0.00366107
+0.00362464 0.00358857 0.00355287 0.00351752 0.00348252 0.00344786 0.00341356
+0.00337959 0.00334597 0.00331267 0.00327971 0.00324708 0.00321477 0.00318278
+0.00315111 0.00311976 0.00308871 0.00305798 0.00302755 0.00299743 0.0029676
+0.00293808 0.00290884 0.0028799 0.00285124 0.00282287 0.00279478 0.00276698
+0.00273944 0.00271219 0.0026852 0.00265848 0.00263203 0.00260584 0.00257991
+0.00255424 0.00252883 0.00250366 0.00247875 0.00245409 0.00242967 0.00240549
+0.00238156 0.00235786 0.0023344 0.00231117 0.00228818 0.00226541 0.00224287
+0.00222055 0.00219846 0.00217658 0.00215492 0.00213348 0.00211225 0.00209124
+0.00207043 0.00204983 0.00202943 0.00200924 0.00198925 0.00196945 0.00194986
+0.00193045 0.00191125 0.00189223 0.0018734 0.00185476 0.0018363 0.00181803
+0.00179994 0.00178203 0.0017643 0.00174675 0.00172937 0.00171216 0.00169512
+0.00167826 0.00166156 0.00164502 0.00162866 0.00161245 0.00159641 0.00158052
+0.0015648 0.00154923 0.00153381 0.00151855 0.00150344 0.00148848 0.00147367
+0.00145901 0.00144449 0.00143012 0.00141589 0.0014018 0.00138785 0.00137404
+0.00136037 0.00134683 0.00133343 0.00132016 0.00130703 0.00129402 0.00128115
+0.0012684 0.00125578 0.00124328 0.00123091 0.00121866 0.00120654 0.00119453
+0.00118265 0.00117088 0.00115923 0.00114769 0.00113627 0.00112497 0.00111377
+0.00110269 0.00109172 0.00108086 0.0010701 0.00105946 0.00104891 0.00103848
+0.00102814 0.00101791 0.00100779 0.000997758 0.00098783 0.000978001
+0.00096827 0.000958635 0.000949097 0.000939653 0.000930303 0.000921047
+0.000911882 0.000902808 0.000893825 0.000884932 0.000876127 0.000867409
+0.000858778 0.000850233 0.000841773 0.000833397 0.000825105 0.000816895
+0.000808767 0.000800719 0.000792752 0.000784864 0.000777055 0.000769323
+0.000761668 0.000754089 0.000746586 0.000739157 0.000731803 0.000724521
+0.000717312 0.000710174 0.000703108 0.000696112 0.000689185 0.000682328
+0.000675539 0.000668817 0.000662162 0.000655574 0.00064905 0.000642592
+0.000636198 0.000629868 0.000623601 0.000617396 0.000611253 0.000605171
+0.000599149 0.000593188 0.000587285 0.000581442 0.000575656 0.000569928
+0.000564257 0.000558643 0.000553084 0.000547581 0.000542133 0.000536738
+0.000531398 0.00052611 0.000520875 0.000515692 0.000510561 0.000505481
+0.000500451 0.000495472 0.000490542 0.000485661 0.000480829 0.000476044
+0.000471307 0.000466618 0.000461975 0.000457378 0.000452827 0.000448321
+0.000443861 0.000439444 0.000435072 0.000430743 0.000426456 0.000422213
+0.000418012 0.000413853 0.000409735 0.000405658 0.000401622 0.000397626
+0.000393669 0.000389752 0.000385874 0.000382034 0.000378233 0.00037447
+0.000370744 0.000367055 0.000363402 0.000359786 0.000356206 0.000352662
+0.000349153 0.000345679 0.000342239 0.000338834 0.000335463 0.000332125
+0.00032882 0.000325548 0.000322309 0.000319102 0.000315927 0.000312783
+0.000309671 0.00030659 0.000303539 0.000300519 0.000297529 0.000294568
+0.000291637 0.000288735 0.000285862 0.000283018 0.000280202 0.000277414
+0.000274654 0.000271921 0.000269215 0.000266536 0.000263884 0.000261259
+0.000258659 0.000256085 0.000253537 0.000251014 0.000248517 0.000246044
+0.000243596 0.000241172 0.000238772 0.000236396 0.000234044 0.000231716
+0.00022941 0.000227127 0.000224867 0.00022263 0.000220415 0.000218221
+0.00021605 0.0002139 0.000211772 0.000209665 0.000207579 0.000205513
+0.000203468 0.000201444 0.000199439 0.000197455 0.00019549 0.000193545
+0.000191619 0.000189713 0.000187825 0.000185956 0.000184106 0.000182274
+0.00018046 0.000178665 0.000176887 0.000175127 0.000173384 0.000171659
+0.000169951 0.00016826 0.000166586 0.000164928 0.000163287 0.000161663
+0.000160054 0.000158461 0.000156885 0.000155324 0.000153778 0.000152248
+0.000150733 0.000149233 0.000147748 0.000146278 0.000144823 0.000143382
+0.000141955 0.000140543 0.000139144 0.00013776 0.000136389 0.000135032
+0.000133688 0.000132358 0.000131041 0.000129737 0.000128446 0.000127168
+0.000125903 0.00012465 0.00012341 0.000122182 0.000120966 0.000119763
+0.000118571 0.000117391 0.000116223 0.000115067 0.000113922 0.000112788
+0.000111666 0.000110555 0.000109455 0.000108366 0.000107287 0.00010622
+0.000105163 0.000104117 0.00010308 0.000102055 0.000101039 0.000100034
+9.90387e-05 9.80533e-05 9.70776e-05 9.61117e-05 9.51553e-05 9.42085e-05
+9.32711e-05 9.23431e-05 9.14242e-05 9.05145e-05 8.96139e-05 8.87222e-05
+8.78394e-05 8.69654e-05 8.61001e-05 8.52434e-05 8.43952e-05 8.35554e-05
+8.27241e-05 8.1901e-05 8.1086e-05 8.02792e-05 7.94804e-05 7.86896e-05
+7.79066e-05 7.71314e-05 7.6364e-05 7.56041e-05 7.48518e-05 7.4107e-05
+7.33696e-05 7.26396e-05 7.19169e-05 7.12012e-05 7.04928e-05 6.97914e-05
+6.9097e-05 6.84094e-05 6.77287e-05 6.70548e-05 6.63876e-05 6.5727e-05
+6.5073e-05 6.44256e-05 6.37845e-05 6.31498e-05 6.25215e-05 6.18994e-05
+6.12835e-05 6.06737e-05 6.007e-05 5.94723e-05 5.88805e-05 5.82947e-05
+5.77146e-05 5.71403e-05 5.65718e-05 5.60089e-05 5.54516e-05 5.48998e-05
+5.43536e-05 5.38128e-05 5.32773e-05 5.27472e-05 5.22224e-05 5.17027e-05
+5.11883e-05 5.06789e-05 5.01747e-05 4.96754e-05 4.91812e-05 4.86918e-05
+4.82073e-05 4.77276e-05 4.72527e-05 4.67826e-05 4.63171e-05;
+#A 1000 0 0 0;
+#X coords 0 1 1002 0 180 100 1;
+#X restore 254 118 graph;
+#N canvas 140 79 589 249 make-table 0;
+#X obj 164 81 t b b;
+#X obj 236 106 f;
+#X obj 274 106 + 1;
+#X msg 258 83 0;
+#X obj 164 104 until;
+#X obj 236 136 t f f;
+#X obj 164 62 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 104 164 expr exp(-($f1-1)/100);
+#X obj 163 132 sel 999;
+#X text 35 10 This patch computes a decaying exponential function \,
+100 points per unit.;
+#X obj 137 196 tabwrite E06-tab;
+#X connect 0 0 4 0;
+#X connect 0 1 3 0;
+#X connect 1 0 2 0;
+#X connect 1 0 5 0;
+#X connect 1 0 8 0;
+#X connect 2 0 1 1;
+#X connect 3 0 1 1;
+#X connect 4 0 1 0;
+#X connect 5 0 7 0;
+#X connect 5 1 10 1;
+#X connect 6 0 0 0;
+#X connect 7 0 10 0;
+#X connect 8 0 4 1;
+#X restore 302 258 pd make-table;
+#X text 251 95 waveshaping function;
+#X text 438 210 0;
+#X text 437 114 1;
+#X obj 12 168 +~ 1;
+#X obj 12 146 *~ 100;
+#X obj 12 83 +~ 1;
+#X floatatom 68 53 5 0 200 0 - - -;
+#X obj 68 96 pack 0 50;
+#X obj 68 120 line~;
+#X text 157 69 tenths;
+#X obj 68 73 / 10;
+#X obj 12 124 *~;
+#X obj 13 190 tabread4~ E06-tab;
+#X text 711 40 1;
+#X text 712 160 -1;
+#X text 103 237 <-- repeatedly;
+#X text 104 217 <-- graph once;
+#X text 121 0 Waveshaping using an exponential function;
+#X text 120 53 <--index in;
+#X text 250 218 0;
+#X text 417 220 10;
+#X text 14 652 When the index of modulation exceeds 5 we scan past
+the right hand border of the table (the thousandth point \, corresponding
+to exp(-10). This isn't a problem because the values are all close
+to zero there.;
+#X text 14 555 Table lookup is prepared as follows. First add one to
+the sinusoid and adjust its amplitude according to index \; it ranges
+from 0 to 2*index. Then adjust for the table's input scale (100 points
+per unit \, so multiply by 100) and add one to skip the interpolation
+point at the beginning of the table.;
+#X text 13 398 Here we use an exponential function as a waveshaping
+transfer function. The theory is shown in detail in the accompanying
+book \, but in short \, we adjust the sinusoid so that \, as the index
+increases \, we scan starting from the left of the transfer function
+(previously the reading location grew from the center). The table contains
+exp(-x) with x varying from 0 to 10 When the index is zero \, the output
+is the constant 1 and the spectrum holds only DC. As the index grows
+\, the output is a sequence of steadily narrower pulses \, whose spectrum
+gets progressively fatter.;
+#X connect 1 0 6 0;
+#X connect 1 0 6 1;
+#X connect 5 0 3 1;
+#X connect 18 0 19 0;
+#X connect 19 0 33 0;
+#X connect 25 0 3 2;
+#X connect 31 0 40 0;
+#X connect 32 0 31 0;
+#X connect 33 0 39 0;
+#X connect 34 0 38 0;
+#X connect 35 0 36 0;
+#X connect 36 0 39 1;
+#X connect 38 0 35 0;
+#X connect 39 0 32 0;
+#X connect 40 0 3 0;
+#X connect 40 0 1 0;
diff --git a/desiredata/doc/3.audio.examples/E07.evenodd.pd b/desiredata/doc/3.audio.examples/E07.evenodd.pd
new file mode 100644
index 00000000..9715e1ea
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E07.evenodd.pd
@@ -0,0 +1,109 @@
+#N canvas 187 149 784 591 12;
+#X obj 230 101 f;
+#X obj 264 77 + 1;
+#X obj 264 101 mod 11;
+#N canvas 0 0 450 300 graph1 0;
+#X array E07 11 float 0;
+#X coords 0 96 11 36 100 160 1;
+#X restore 528 15 graph;
+#X floatatom 320 53 0 10 999 0 - - -;
+#X obj 230 173 mtof;
+#X msg 26 92 1;
+#X obj 27 217 *~;
+#X obj 27 267 cos~;
+#X obj 27 292 hip~ 5;
+#X obj 27 244 +~ 0.1;
+#X floatatom 61 144 0 0 0 0 - - -;
+#X floatatom 166 145 0 0 200 0 - - -;
+#X floatatom 96 144 0 0 999 0 - - -;
+#X floatatom 131 144 0 0 999 0 - - -;
+#X msg 112 267 0;
+#X msg 112 245 0.1;
+#X msg 112 289 0.25;
+#X text 68 108 ADSR controls;
+#X text 106 125 A;
+#X text 141 125 D;
+#X text 176 125 S;
+#X floatatom 320 77 0 1 11 0 - - -;
+#X text 354 79 <--increment;
+#X text 355 56 <--msec;
+#X obj 26 193 *~ 0.01;
+#X obj 230 29 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 27 321 output~;
+#X text 527 562 updated for Pd version 0.37;
+#X obj 26 170 adsr 70 10 90 50 500;
+#X obj 230 150 +;
+#X floatatom 265 150 0 -48 120 0 - - -;
+#X text 299 152 <--transpose;
+#N canvas 0 0 538 208 make-table 0;
+#X obj 38 71 loadbang;
+#X text 16 11 This patch loads a sequence of pitches into array1. The
+values are floating-point \, so we could use microtones (60.5 \, for
+example) if we wish.;
+#X msg 38 99 \; array1 0 55 56 57 55 57 61 55 61 63 57 63 \; array1
+yticks 36 12 1 \; array1 ylabel 12 36 48 60 72 84 96;
+#X connect 0 0 2 0;
+#X restore 527 195 pd make-table;
+#X obj 176 50 sel 0;
+#X msg 26 69 0;
+#X text 48 125 level;
+#X obj 230 53 metro 130;
+#X obj 60 217 osc~;
+#X text 111 225 symmetry;
+#X text 157 265 even;
+#X text 165 288 odd;
+#X text 147 244 mixed;
+#X obj 230 126 tabread E07;
+#X text 253 26 <--ON/OFF;
+#X text 238 232 This patch uses a stepping sequencer to control a waveshaping
+instrument. A metronome (metro 130) drives a counter (f \, +1 \, and
+mod 11) which counts repeatedly through 11 values which are read from
+the stored table (tabread E07). The values may be read in sequence
+\, by twos or threes \, etc. \, according to the "increment" parameter.
+;
+#X text 239 328 The metronome also triggers an ADSR envelope \, whose
+parameters may also be changed using the "level" \, "A" \, "D" \, and
+"S" controls.;
+#X text 142 5 SEQUENCED WAVESHAPING SYNTHESIZER;
+#X text 240 380 The synthesis (osc~ \, *~ \, +~ 0.1 \, cos~) is a very
+simple application of the waveshaping technique. The oscillator (whose
+amplitude depends on the ADSR generator) is used as an index into the
+"cos~" wavetable. An additional offset ("symmetry") controls how the
+oscillator's waveform is centered on the wavetable. If the offset is
+zero \, the oscillator reads into the (even) cosine function (producing
+only even harmonics). If the offset is 0.25 \, we read 1/4 wave into
+the cosine function: the result is an odd function and we get odd harmonics.
+Between the two we get mixtures of even and odd.;
+#X connect 0 0 1 0;
+#X connect 0 0 43 0;
+#X connect 1 0 2 0;
+#X connect 2 0 0 1;
+#X connect 4 0 37 1;
+#X connect 5 0 38 0;
+#X connect 6 0 29 0;
+#X connect 7 0 10 0;
+#X connect 8 0 9 0;
+#X connect 9 0 27 0;
+#X connect 9 0 27 1;
+#X connect 10 0 8 0;
+#X connect 11 0 29 1;
+#X connect 12 0 29 4;
+#X connect 13 0 29 2;
+#X connect 14 0 29 3;
+#X connect 15 0 10 1;
+#X connect 16 0 10 1;
+#X connect 17 0 10 1;
+#X connect 22 0 1 1;
+#X connect 25 0 7 0;
+#X connect 26 0 34 0;
+#X connect 26 0 37 0;
+#X connect 29 0 25 0;
+#X connect 30 0 5 0;
+#X connect 31 0 30 1;
+#X connect 34 0 35 0;
+#X connect 35 0 29 0;
+#X connect 37 0 0 0;
+#X connect 37 0 6 0;
+#X connect 38 0 7 1;
+#X connect 43 0 30 0;
diff --git a/desiredata/doc/3.audio.examples/E08.phase.mod.pd b/desiredata/doc/3.audio.examples/E08.phase.mod.pd
new file mode 100644
index 00000000..53a6e052
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E08.phase.mod.pd
@@ -0,0 +1,196 @@
+#N canvas 36 68 722 738 12;
+#X obj 224 164 *~;
+#X floatatom 224 107 0 0 0 0 - - -;
+#X obj 312 144 line~;
+#X floatatom 128 121 0 0 0 0 - - -;
+#X obj 128 235 cos~;
+#X obj 128 191 +~;
+#X obj 224 132 osc~ 0;
+#X obj 312 118 pack 0 50;
+#X floatatom 312 65 0 0 0 0 - - -;
+#X obj 312 92 / 100;
+#X text 286 27 modulation index;
+#X text 286 42 in hundredths;
+#X text 125 78 carrier;
+#X text 124 96 frequency;
+#X text 209 83 frequency;
+#X text 210 66 modulation;
+#X text 33 132 carrier;
+#X text 33 147 phase -->;
+#X text 6 175 phase;
+#X text 5 190 modulation-->;
+#X text 12 217 output;
+#X text 11 234 waveform -->;
+#X text 129 1 PHASE MODULATION;
+#X text 16 378 Most implementations of "FM" actually use phase \, not
+frequency \, modulation \, because it extends in a more natural way
+to "multi-operator FM" with three or more oscillators.;
+#X text 16 434 To do phase modulation \, we split the "carrier oscillator"
+into its phase calculation (phasor~) and its waveform lookup (cos~).
+These together would be equivalent to an osc~ object \, but the "+~"
+between them adds the modulating oscillator's output to the phase.
+;
+#X text 20 652 We also have to use a line~ to smooth changes in the
+modulation index \, which wasn't necessary in the previous patch.;
+#X obj 128 148 phasor~;
+#X obj 117 557 cos~;
+#X obj 117 529 phasor~;
+#X text 60 539 this:;
+#X text 219 532 is the same;
+#X text 220 551 as this:;
+#X obj 335 544 osc~;
+#N canvas 0 0 450 300 graph2 0;
+#X array phase-out 441 float 1;
+#A 0 0.43245 0.433463 0.434452 0.435418 0.43636 0.43728 0.438178 0.439056
+0.439912 0.440749 0.441567 0.442366 0.443148 0.443912 0.444659 0.445391
+0.446107 0.446809 0.447497 0.448172 0.448834 0.449484 0.450122 0.450751
+0.451369 0.451978 0.452579 0.453172 0.453758 0.454338 0.454911 0.45548
+0.456045 0.456606 0.457164 0.457719 0.458274 0.458827 0.45938 0.459934
+0.460489 0.461046 0.461605 0.462168 0.462735 0.463306 0.463883 0.464466
+0.465056 0.465654 0.466259 0.466873 0.467497 0.468131 0.468776 0.469433
+0.470102 0.470783 0.471479 0.472188 0.472913 0.473653 0.474409 0.475182
+0.475973 0.476782 0.477611 0.478459 0.479327 0.480216 0.481127 0.48206
+0.483015 0.483994 0.484997 0.486024 0.487077 0.488156 0.48926 0.490392
+0.491552 0.49274 0.493957 0.495203 0.496479 0.497785 0.499123 0.500493
+0.501896 0.503332 0.504801 0.506304 0.507842 0.509415 0.511023 0.512667
+0.514348 0.516066 0.517821 0.519615 0.521447 0.523318 0.525228 0.527179
+0.52917 0.531202 0.533275 0.53539 0.537547 0.539747 0.541992 0.54428
+0.546613 0.548989 0.551411 0.553877 0.556389 0.558947 0.561551 0.564202
+0.5669 0.569645 0.572437 0.575278 0.578166 0.581104 0.58409 0.587125
+0.59021 0.593345 0.596529 0.599764 0.603051 0.606389 0.609778 0.613219
+0.61671 0.620254 0.62385 0.627497 0.631197 0.634949 0.638754 0.642612
+0.646522 0.650486 0.654503 0.658573 0.662696 0.666873 0.671104 -0.324611
+-0.320273 -0.315881 -0.311434 -0.306931 -0.302375 -0.297764 -0.2931
+-0.288381 -0.283608 -0.278781 -0.2739 -0.268964 -0.263975 -0.258931
+-0.253833 -0.248682 -0.243476 -0.238217 -0.232904 -0.227537 -0.222116
+-0.216642 -0.211115 -0.205534 -0.1999 -0.194211 -0.18847 -0.182675
+-0.176829 -0.170929 -0.164978 -0.158975 -0.152919 -0.146813 -0.140655
+-0.134446 -0.128186 -0.121875 -0.115514 -0.109103 -0.102642 -0.0961313
+-0.0895714 -0.0829625 -0.0763049 -0.0695988 -0.0628447 -0.056041 -0.0491896
+-0.0422913 -0.0353461 -0.0283546 -0.0213171 -0.0142339 -0.00710538
+6.80089e-05 0.00728586 0.0145478 0.0218535 0.0292025 0.0365944 0.0440286
+0.0515049 0.0590228 0.0665818 0.0741815 0.0818213 0.0895009 0.0972198
+0.104978 0.112776 0.120611 0.128484 0.136393 0.144339 0.15232 0.160337
+0.168388 0.176473 0.184592 0.192744 0.200929 0.209146 0.217393 0.225672
+0.233981 0.24232 0.250688 0.259084 0.267509 0.27596 0.284439 0.292944
+0.301475 0.310031 0.318611 0.327215 0.335842 0.344491 0.353162 0.361854
+0.370566 0.379298 0.38805 0.39682 0.405608 0.414413 0.423234 0.432072
+0.440924 0.449792 0.458673 0.467567 0.476474 0.485394 0.494324 0.503265
+0.512216 0.521176 0.530145 0.539121 0.548104 0.557094 0.566089 0.575089
+0.584094 0.593102 0.602113 0.611126 0.620141 0.629157 0.638173 0.647189
+0.656203 0.665215 0.674225 0.683232 0.692234 0.701231 0.710224 0.71921
+0.728189 0.737161 0.746124 0.755079 0.764024 0.772959 0.781884 0.790796
+0.799697 0.808584 0.817458 0.826318 0.835162 0.843992 0.852804 0.861601
+0.870379 0.879139 0.887879 0.8966 0.905301 0.913981 0.92264 0.931276
+0.93989 0.94848 0.957046 0.965588 0.974105 0.982595 0.99106 0.999497
+1.00791 1.01629 1.02464 1.03296 1.04126 1.04952 1.05775 1.06595 1.07412
+1.08225 1.09035 1.09841 1.10645 1.11444 1.1224 1.13033 1.13822 1.14607
+1.15388 1.16166 1.1694 1.17709 1.18475 1.19237 1.19995 1.20749 1.21498
+1.22244 1.22985 1.23722 1.24454 1.25182 1.25906 1.26625 1.2734 0.280502
+0.287559 0.29457 0.301536 0.308454 0.315325 0.32215 0.328926 0.335655
+0.342335 0.348967 0.35555 0.362084 0.368568 0.375003 0.381388 0.387722
+0.394004 0.400235 0.406415 0.412544 0.418621 0.424647 0.430621 0.436542
+0.442412 0.448228 0.453993 0.459704 0.465363 0.470969 0.476521 0.48202
+0.487466 0.492858 0.498196 0.503481 0.508712 0.513889 0.519011 0.524077
+0.52909 0.534049 0.538953 0.543804 0.5486 0.553342 0.55803 0.562664
+0.567243 0.571769 0.57624 0.580658 0.585021 0.589331 0.593587 0.597789
+0.601938 0.606033 0.610075 0.614064 0.617999 0.621879 0.625706 0.629481
+0.633203 0.636873 0.640491 0.644057 0.647571 0.651033 0.654445 0.657805
+0.661114 0.664372 0.66758 0.670739 0.673847 0.676905 0.679914 0.682875
+;
+#X array cos-out 441 float 1;
+#A 0 -0.911256 -0.913872 -0.916365 -0.918789 -0.921097 -0.923342 -0.925486
+-0.927564 -0.92956 -0.931483 -0.93335 -0.935129 -0.936867 -0.938528
+-0.940137 -0.941707 -0.943197 -0.944657 -0.946072 -0.947426 -0.948755
+-0.95004 -0.951276 -0.952491 -0.953672 -0.954806 -0.955924 -0.957024
+-0.958071 -0.959106 -0.960132 -0.961119 -0.962086 -0.963047 -0.963993
+-0.964903 -0.965811 -0.966718 -0.967595 -0.968461 -0.969329 -0.970192
+-0.971025 -0.971863 -0.972707 -0.973527 -0.974343 -0.975168 -0.975986
+-0.976786 -0.977597 -0.978414 -0.979202 -0.980003 -0.980816 -0.981596
+-0.982391 -0.983194 -0.983968 -0.984757 -0.985543 -0.98631 -0.987093
+-0.987851 -0.98861 -0.98937 -0.990102 -0.990852 -0.991557 -0.992275
+-0.99296 -0.993642 -0.994295 -0.994935 -0.995544 -0.996137 -0.996687
+-0.997227 -0.997705 -0.998173 -0.998575 -0.998944 -0.999273 -0.999527
+-0.999743 -0.999894 -0.999966 -0.999981 -0.999927 -0.999765 -0.999526
+-0.999202 -0.998785 -0.99824 -0.997586 -0.996816 -0.995923 -0.994897
+-0.99373 -0.992413 -0.990934 -0.989283 -0.987458 -0.985449 -0.983247
+-0.980843 -0.978222 -0.975372 -0.972288 -0.968961 -0.965377 -0.96153
+-0.95741 -0.952995 -0.948265 -0.943231 -0.937881 -0.932182 -0.926128
+-0.919728 -0.912938 -0.905762 -0.898197 -0.890198 -0.881799 -0.87293
+-0.863637 -0.853855 -0.843612 -0.832873 -0.821629 -0.809886 -0.797593
+-0.784764 -0.771394 -0.757466 -0.742953 -0.727864 -0.712189 -0.695918
+-0.679041 -0.661549 -0.643437 -0.624697 -0.605324 -0.585314 -0.564664
+-0.543374 -0.521441 -0.498869 -0.475658 -0.451811 -0.427334 -0.402219
+-0.376482 -0.350131 -0.323174 -0.295626 -0.267508 -0.238824 -0.2096
+-0.179853 -0.149603 -0.118875 -0.0876953 -0.0560885 -0.0240874 0.00827867
+0.040974 0.0739643 0.107208 0.140666 0.174297 0.208056 0.241893 0.275757
+0.309603 0.343385 0.377036 0.410498 0.443712 0.476616 0.509148 0.541242
+0.572835 0.603858 0.634244 0.66391 0.692797 0.720837 0.747961 0.774084
+0.799131 0.823051 0.845758 0.867169 0.887248 0.90588 0.923037 0.938628
+0.952605 0.964885 0.975433 0.984153 0.991037 0.995988 0.998986 0.999997
+0.998938 0.995807 0.990576 0.983211 0.973668 0.961961 0.948075 0.932007
+0.913757 0.893328 0.87073 0.845995 0.81915 0.790227 0.759268 0.726324
+0.691452 0.654714 0.616181 0.57593 0.534037 0.490599 0.445716 0.399491
+0.352033 0.303459 0.253886 0.203441 0.152259 0.100478 0.0482368 -0.00432081
+-0.057045 -0.109786 -0.162386 -0.214696 -0.266564 -0.317814 -0.368301
+-0.417864 -0.466337 -0.513584 -0.559424 -0.603732 -0.646344 -0.687125
+-0.725934 -0.762631 -0.797101 -0.829205 -0.858847 -0.8859 -0.91028
+-0.931885 -0.950636 -0.966466 -0.97929 -0.989092 -0.995773 -0.999358
+-0.999773 -0.997042 -0.991152 -0.982099 -0.969941 -0.954655 -0.936332
+-0.915008 -0.890737 -0.863625 -0.833713 -0.801132 -0.765979 -0.728348
+-0.688394 -0.646219 -0.601975 -0.555817 -0.507869 -0.45832 -0.407319
+-0.355036 -0.301652 -0.247328 -0.192258 -0.136617 -0.0805873 -0.0243537
+0.0319027 0.0879985 0.143752 0.198986 0.253526 0.307194 0.359834 0.411262
+0.461345 0.509907 0.556823 0.601935 0.645131 0.686266 0.725245 0.761935
+0.796272 0.828125 0.857461 0.884158 0.9082 0.929508 0.948044 0.9638
+0.976698 0.986778 0.99402 0.998404 0.999981 0.998763 0.994751 0.988022
+0.978621 0.966582 0.95197 0.93487 0.915357 0.893512 0.869405 0.843139
+0.814817 0.784538 0.752408 0.718535 0.68303 0.646007 0.607581 0.567872
+0.526996 0.485074 0.442227 0.398573 0.354231 0.30932 0.263957 0.218256
+0.172326 0.126282 0.0802317 0.0342922 -0.0114471 -0.0568861 -0.101931
+-0.146492 -0.190474 -0.233802 -0.276394 -0.318171 -0.359072 -0.399015
+-0.437958 -0.475821 -0.512573 -0.548149 -0.582512 -0.615632 -0.647446
+-0.677951 -0.707119 -0.734897 -0.761296 -0.786293 -0.80988 -0.83204
+-0.852773 -0.872085 -0.88998 -0.906462 -0.921542 -0.935229 -0.94754
+-0.95849 -0.968102 -0.976397 -0.9834 -0.989136 -0.993613 -0.996882
+-0.998976 -0.99993 -0.999748 -0.998484 -0.996188 -0.99286 -0.988563
+-0.983336 -0.977186 -0.970195 -0.962347 -0.953732 -0.944344 -0.934249
+-0.923482 -0.912051 -0.900028 -0.887441 -0.874296 -0.860659 -0.846562
+-0.832035 -0.817101 -0.801792 -0.786149 -0.770201 -0.753977 -0.737507
+-0.720826 -0.703952 -0.686912 -0.669731 -0.652436 -0.635043 -0.617572
+-0.600055 -0.582513 -0.564966 -0.547418 -0.529898 -0.512429 -0.495016
+-0.477676 -0.460438 -0.443287 -0.426265 -0.409364;
+#X coords 0 1 440 -1 200 140 1;
+#X restore 509 190 graph;
+#X obj 213 246 tabwrite~ phase-out;
+#X obj 213 273 tabwrite~ cos-out;
+#X msg 213 221 bang;
+#X text 260 220 <-- graph them;
+#X obj 126 296 output~;
+#X obj 127 270 hip~;
+#X text 408 98 ramped to avoid;
+#X text 407 114 clicks.);
+#X text 407 82 (the index is;
+#X text 435 704 updated for Pd version 0.37;
+#X text 21 588 The "modulation" index \, which in true FM is in units
+of Hertz \, is dimensionless for phase moduation. "Good" values tend
+to be between 0 and 1... in this patch the index is in hundredths.
+;
+#X connect 0 0 5 1;
+#X connect 1 0 6 0;
+#X connect 2 0 0 1;
+#X connect 3 0 26 0;
+#X connect 4 0 35 0;
+#X connect 4 0 39 0;
+#X connect 5 0 4 0;
+#X connect 5 0 34 0;
+#X connect 6 0 0 0;
+#X connect 7 0 2 0;
+#X connect 8 0 9 0;
+#X connect 9 0 7 0;
+#X connect 26 0 5 0;
+#X connect 28 0 27 0;
+#X connect 36 0 34 0;
+#X connect 36 0 35 0;
+#X connect 39 0 38 0;
+#X connect 39 0 38 1;
diff --git a/desiredata/doc/3.audio.examples/E09.FM.spectrum.pd b/desiredata/doc/3.audio.examples/E09.FM.spectrum.pd
new file mode 100644
index 00000000..21094b41
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E09.FM.spectrum.pd
@@ -0,0 +1,139 @@
+#N canvas 127 136 697 536 12;
+#X obj 94 188 *~;
+#X obj 136 188 line~;
+#X obj 18 179 cos~;
+#X obj 18 154 +~;
+#X obj 136 165 pack 0 50;
+#X floatatom 136 117 0 0 0 0 - - -;
+#X obj 136 141 / 100;
+#X obj 18 129 phasor~;
+#X obj 18 284 output~;
+#X obj 17 253 hip~;
+#X text 442 513 updated for Pd version 0.37;
+#N canvas 122 211 558 609 fft 1;
+#X obj 19 61 inlet~;
+#X obj 208 212 inlet;
+#X obj 29 92 rfft~;
+#X obj 29 125 *~;
+#X obj 60 125 *~;
+#X obj 29 155 sqrt~;
+#X obj 332 109 block~ 4096 1;
+#X obj 29 181 biquad~ 0 0 0 0 1;
+#X text 93 93 Fourier series;
+#X text 98 146 magnitude;
+#X text 96 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 193 164 delay two samples;
+#X text 191 182 for better graphing;
+#X obj 19 459 samplerate~;
+#X obj 19 436 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 19 506 5 0 0 0 - - -;
+#X obj 19 482 / 256;
+#X obj 19 412 loadbang;
+#X obj 75 528 s fundamental;
+#X text 17 359 At load time \, calculate a good choice of fundamental
+frequency for showing spectra: the 16th bin in a 4096-point spectrum
+\, so SR*16/4096 or SR/256.;
+#X obj 231 259 metro 500;
+#X obj 231 236 inlet;
+#X text 284 234 toggle to graph repeatedly;
+#X text 262 212 bang to graph once;
+#X obj 19 295 tabwrite~ E09-signal;
+#X obj 231 298 tabwrite~ E09-spectrum;
+#X obj 19 528 t b f;
+#X msg 19 551 \; cm 6;
+#X text 25 585 set carrier multiplier after fundamental;
+#X obj 29 205 /~ 4096;
+#X msg 209 322 \; pd dsp 1;
+#X connect 0 0 2 0;
+#X connect 0 0 26 0;
+#X connect 1 0 26 0;
+#X connect 1 0 27 0;
+#X connect 1 0 32 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 31 0;
+#X connect 15 0 18 0;
+#X connect 16 0 15 0;
+#X connect 17 0 28 0;
+#X connect 18 0 17 0;
+#X connect 19 0 16 0;
+#X connect 22 0 26 0;
+#X connect 22 0 27 0;
+#X connect 23 0 22 0;
+#X connect 23 0 32 0;
+#X connect 28 0 29 0;
+#X connect 28 1 20 0;
+#X connect 31 0 27 0;
+#X restore 62 243 pd fft;
+#X obj 122 222 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 122 243 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 143 242 <-- repeatedly;
+#X text 144 222 <-- graph once;
+#N canvas 0 0 450 300 graph1 0;
+#X array E09-signal 882 float 0;
+#X coords 0 1.02 882 -1.02 200 80 1;
+#X restore 433 28 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array E09-spectrum 259 float 0;
+#X coords 0 0.51 258 -0.008 259 130 1;
+#X restore 403 175 graph;
+#X text 442 114 ---- 0.02 seconds ----;
+#X text 433 306 2;
+#X text 464 306 4;
+#X text 403 306 0;
+#X text 441 321 -- partial number --;
+#X text 497 8 WAVEFORM;
+#X text 497 157 SPECTRUM;
+#X text 663 291 0;
+#X text 664 173 0.5;
+#X obj 93 117 osc~;
+#X obj 93 86 r fundamental;
+#X text 171 117 index (x100);
+#X text 496 306 6;
+#X text 529 306 8;
+#X text 557 306 10;
+#X text 589 306 12;
+#X text 621 306 14;
+#X text 43 3 SPECTRUM OF TWO-OPERATOR PHASE MODULATION;
+#X floatatom 18 58 3 0 15 0 - - -;
+#X obj 18 105 *;
+#X obj 18 33 r cm;
+#X text 52 57 carrier harmonic #;
+#X text 71 367 This patch measures the spectrum of two-operator phase
+modulation. The carrier frequency is initially six times the modulation
+frequency \, but you can change it with the "carrier harmonic #" control.
+Changing the index changes the relative strengths of the harmonics.
+Past a certain index (which depends on the carrier frequency) the lower
+sidebands begin to reflect about the left edge of the spectrum \, causing
+complicated interference effects.;
+#X connect 0 0 3 1;
+#X connect 1 0 0 1;
+#X connect 2 0 9 0;
+#X connect 2 0 11 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 7 0 3 0;
+#X connect 9 0 8 0;
+#X connect 9 0 8 1;
+#X connect 12 0 11 1;
+#X connect 13 0 11 2;
+#X connect 27 0 0 0;
+#X connect 28 0 27 0;
+#X connect 28 0 37 1;
+#X connect 36 0 37 0;
+#X connect 37 0 7 0;
+#X connect 38 0 36 0;
diff --git a/desiredata/doc/3.audio.examples/E10.complex.FM.pd b/desiredata/doc/3.audio.examples/E10.complex.FM.pd
new file mode 100644
index 00000000..094d68ed
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/E10.complex.FM.pd
@@ -0,0 +1,156 @@
+#N canvas 165 123 695 505 12;
+#X obj 94 247 *~;
+#X obj 109 223 line~;
+#X obj 18 179 cos~;
+#X obj 18 154 +~;
+#X obj 109 200 pack 0 50;
+#X floatatom 109 152 0 0 300 0 - - -;
+#X obj 109 176 / 100;
+#X obj 18 129 phasor~;
+#X obj 20 340 output~;
+#X obj 19 309 hip~;
+#X text 437 472 updated for Pd version 0.37;
+#N canvas 62 299 558 609 fft 0;
+#X obj 19 61 inlet~;
+#X obj 208 212 inlet;
+#X obj 29 92 rfft~;
+#X obj 29 125 *~;
+#X obj 60 125 *~;
+#X obj 29 155 sqrt~;
+#X obj 332 109 block~ 4096 1;
+#X obj 29 181 biquad~ 0 0 0 0 1;
+#X text 93 93 Fourier series;
+#X text 98 146 magnitude;
+#X text 96 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 193 164 delay two samples;
+#X text 191 182 for better graphing;
+#X obj 16 425 samplerate~;
+#X obj 16 402 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 16 472 5 0 0 0 - - -;
+#X obj 16 448 / 256;
+#X obj 16 378 loadbang;
+#X obj 72 494 s fundamental;
+#X text 14 319 At load time \, calculate a good choice of fundamental
+frequency for showing spectra: the 16th bin in a 4096-point spectrum
+\, so SR*16/4096 or SR/256.;
+#X obj 220 257 metro 500;
+#X obj 220 234 inlet;
+#X text 273 232 toggle to graph repeatedly;
+#X text 262 212 bang to graph once;
+#X obj 16 494 t b f;
+#X obj 19 295 tabwrite~ E10-signal;
+#X obj 208 295 tabwrite~ E10-spectrum;
+#X text 72 536 set carrier multiplier and modulation multipliers after
+fundamental;
+#X msg 16 516 \; cm 8 \; m1 2 \; m2 3;
+#X connect 0 0 2 0;
+#X connect 0 0 27 0;
+#X connect 1 0 27 0;
+#X connect 1 0 28 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 28 0;
+#X connect 15 0 18 0;
+#X connect 16 0 15 0;
+#X connect 17 0 26 0;
+#X connect 18 0 17 0;
+#X connect 19 0 16 0;
+#X connect 22 0 27 0;
+#X connect 22 0 28 0;
+#X connect 23 0 22 0;
+#X connect 26 0 30 0;
+#X connect 26 1 20 0;
+#X restore 65 311 pd fft;
+#X obj 125 290 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 125 311 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X text 146 310 <-- repeatedly;
+#X text 147 290 <-- graph once;
+#N canvas 0 0 450 300 graph1 0;
+#X array E10-spectrum 259 float 0;
+#X coords 0 2100 258 -20 259 130 1;
+#X restore 396 122 graph;
+#X text 426 253 2;
+#X text 457 253 4;
+#X text 396 253 0;
+#X text 434 268 -- partial number --;
+#X text 490 104 SPECTRUM;
+#X text 656 238 0;
+#X text 657 120 0.5;
+#X obj 93 128 osc~;
+#X obj 267 79 r fundamental;
+#X text 489 253 6;
+#X text 522 253 8;
+#X text 550 253 10;
+#X text 582 253 12;
+#X text 614 253 14;
+#X floatatom 18 58 3 0 15 0 - - -;
+#X obj 18 105 *;
+#X obj 18 33 r cm;
+#X text 43 3 SPECTRUM OF COMPLEX PHASE MODULATION;
+#X text 23 73 carrier;
+#X obj 93 107 *;
+#X floatatom 93 60 3 0 15 0 - - -;
+#X text 99 74 mod 1;
+#X obj 93 35 r m1;
+#X text 138 154 index1;
+#X obj 197 249 *~;
+#X obj 212 225 line~;
+#X obj 212 202 pack 0 50;
+#X floatatom 212 154 0 0 300 0 - - -;
+#X obj 212 178 / 100;
+#X obj 196 130 osc~;
+#X obj 196 109 *;
+#X floatatom 196 62 3 0 15 0 - - -;
+#X text 202 76 mod 2;
+#X text 246 154 index2;
+#X obj 196 37 r m2;
+#X text 126 349 Now we introduce a second modulator oscillator. The
+carrier is on the 8th harmonic and the two modulators are at 2 and
+3 times the fundamental. When either index of modulation is zero \,
+changing the other index gives the familiar 2-operator FM result. But
+if index2 is nonzero (try around 10 \, for example) then sliding index1
+upward from 0 introduces sidebands around each of the sidebands.;
+#X connect 0 0 3 1;
+#X connect 1 0 0 1;
+#X connect 2 0 9 0;
+#X connect 2 0 11 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 7 0 3 0;
+#X connect 9 0 8 0;
+#X connect 9 0 8 1;
+#X connect 12 0 11 1;
+#X connect 13 0 11 2;
+#X connect 24 0 0 0;
+#X connect 25 0 32 1;
+#X connect 25 0 36 1;
+#X connect 25 0 47 1;
+#X connect 31 0 32 0;
+#X connect 32 0 7 0;
+#X connect 33 0 31 0;
+#X connect 36 0 24 0;
+#X connect 37 0 36 0;
+#X connect 39 0 37 0;
+#X connect 41 0 3 1;
+#X connect 42 0 41 1;
+#X connect 43 0 42 0;
+#X connect 44 0 45 0;
+#X connect 45 0 43 0;
+#X connect 46 0 41 0;
+#X connect 47 0 46 0;
+#X connect 48 0 47 0;
+#X connect 51 0 48 0;
diff --git a/desiredata/doc/3.audio.examples/F01.pulse.pd b/desiredata/doc/3.audio.examples/F01.pulse.pd
new file mode 100644
index 00000000..5ef7e862
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F01.pulse.pd
@@ -0,0 +1,82 @@
+#N canvas 15 126 835 625 12;
+#X obj 272 163 line~;
+#X floatatom 53 64 0 0 0 0 - - -;
+#X obj 30 315 cos~;
+#N canvas 0 0 450 300 graph1 0;
+#X array pulse-output 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 583 409 graph;
+#X obj 53 91 phasor~ 0;
+#X obj 272 139 pack 0 50;
+#X floatatom 272 90 0 0 100 0 - - -;
+#X text 50 43 frequency;
+#X obj 53 115 -~ 0.5;
+#X obj 53 207 *~;
+#X obj 272 114 / 10;
+#X obj 30 265 clip~ -0.5 0.5;
+#X obj 30 418 hip~ 5;
+#N canvas 0 0 450 300 graph1 0;
+#X array phase-output 882 float 0;
+#X coords 0 1.02 882 -1.02 200 60 1;
+#X restore 583 150 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array clip-output 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 583 272 graph;
+#X text 113 114 phase -1/2 to 1/2;
+#X text 139 91 phase 0 to 1;
+#X text 119 5 PULSE GENERATOR;
+#X obj 19 234 tabwrite~ phase-output;
+#X obj 19 393 tabwrite~ pulse-output;
+#X text 103 419 high pass filter to cut DC;
+#X text 319 115 fix range;
+#X text 326 164 smooth it;
+#X text 314 187 add 1;
+#X text 41 148 <-- click to graph;
+#X text 83 209 increase amplitude;
+#X text 164 264 clip back to range -1/2 to 1/2;
+#X text 90 316 cosine wave lookup (-1/2 and 1/2 give -1);
+#X obj 272 188 +~ 1;
+#X obj 19 292 tabwrite~ clip-output;
+#X text 585 539 ---- 0.02 seconds ----;
+#X obj 19 148 bng 20 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 30 446 output~;
+#X obj 30 338 +~ 1;
+#X obj 30 361 *~ 0.5;
+#X text 574 589 updated for Pd version 0.37;
+#X text 88 337 add one (range now from 0 to 2);
+#X text 96 360 ...and now from 0 to 1;
+#X text 20 531 This patch computes a pulse train \, with an "index"
+control that essentually squeezes the pulses. If "bandwidth" is zero
+you get a pure cosine wave \, and for larger values of the bandwidth
+\, the cosine wave is squeezed to fill smaller portions of the waveform.
+;
+#X text 269 71 index;
+#X text 790 142 0.5;
+#X text 787 198 -0.5;
+#X text 785 264 1;
+#X text 787 390 -1;
+#X text 785 405 1;
+#X text 786 528 -1;
+#X connect 0 0 28 0;
+#X connect 1 0 4 0;
+#X connect 2 0 33 0;
+#X connect 4 0 8 0;
+#X connect 5 0 0 0;
+#X connect 6 0 10 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 9 0 18 0;
+#X connect 10 0 5 0;
+#X connect 11 0 2 0;
+#X connect 11 0 29 0;
+#X connect 12 0 32 0;
+#X connect 12 0 32 1;
+#X connect 28 0 9 1;
+#X connect 31 0 18 0;
+#X connect 31 0 29 0;
+#X connect 31 0 19 0;
+#X connect 33 0 34 0;
+#X connect 34 0 19 0;
+#X connect 34 0 12 0;
diff --git a/desiredata/doc/3.audio.examples/F02.just.say.pd b/desiredata/doc/3.audio.examples/F02.just.say.pd
new file mode 100644
index 00000000..b82b4953
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F02.just.say.pd
@@ -0,0 +1,152 @@
+#N canvas 32 67 900 421 12;
+#X obj 39 247 cos~;
+#X graph graph1 0 -1.02 44100 1.02 452 206 652 76;
+#X array env-output 44100 float 0;
+#X pop;
+#X floatatom 71 305 0 0 0;
+#N canvas 159 26 495 266 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 39 333 pd output;
+#X msg 115 306 MUTE;
+#X msg 162 93 bang;
+#X text 203 93 <-- click to graph;
+#X obj 39 168 -~ 0.5;
+#X obj 39 192 *~;
+#X obj 39 219 clip~ -0.5 0.5;
+#X obj 39 274 hip~ 5;
+#X obj 126 60 *~;
+#X floatatom 205 142 0 0 0;
+#X floatatom 205 168 0 0 0;
+#X obj 126 27 phasor~ -4;
+#X obj 126 191 +~ 0.5;
+#X obj 162 117 tabwrite~ env-output;
+#X text 451 211 --------- 1 second ---------;
+#X floatatom 205 194 0 0 0;
+#X obj 126 142 lop~ 130;
+#N canvas 168 232 351 420 freq 0;
+#X obj 180 176 t f f;
+#X obj 181 202 *;
+#X obj 60 320 line 0 30;
+#X obj 90 132 t b b;
+#X obj 90 107 metro 100;
+#X obj 61 287 pack;
+#X obj 60 376 outlet;
+#X floatatom 89 82 0 0 0;
+#X floatatom 54 243 0 0 0;
+#X floatatom 94 248 0 0 0;
+#X obj 60 348 pack 0 30;
+#X obj 55 202 + 150;
+#X obj 88 34 loadbang;
+#X msg 89 58 1;
+#X obj 56 175 random 300;
+#X obj 181 226 + 100;
+#X obj 179 152 random 35;
+#X connect 0 0 1 0;
+#X connect 0 1 1 1;
+#X connect 1 0 15 0;
+#X connect 2 0 10 0;
+#X connect 3 0 14 0;
+#X connect 3 1 16 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 0;
+#X connect 7 0 4 0;
+#X connect 8 0 5 0;
+#X connect 9 0 5 1;
+#X connect 10 0 6 0;
+#X connect 11 0 8 0;
+#X connect 12 0 13 0;
+#X connect 13 0 7 0;
+#X connect 14 0 11 0;
+#X connect 15 0 4 1;
+#X connect 15 0 9 0;
+#X connect 16 0 0 0;
+#X restore 38 94 pd freq;
+#X obj 39 119 line~;
+#X obj 39 144 phasor~;
+#X text 225 19 negative frequency;
+#X text 226 35 makes falling sawtooth;
+#X text 155 59 square it to make a curve;
+#X text 245 152 you can;
+#X text 243 170 adjust these;
+#X text 247 189 values;
+#X text 334 250 We interrupt this series of patches to bring you an
+important message from Nancy Reagan. If \, anywhere \, at any time
+\, someone offers you an illicit drug \, just say one word in reply...
+;
+#X text 334 313 Now that I'm sure you've heard this important message
+\, we can return to the essentially frivolous occupation of making
+turn-of-the-millenium western art music.;
+#X obj 126 165 *~ 6;
+#X text 561 384 updated for Pd version 0.34;
+#X text 156 305 <-- output;
+#X connect 0 0 10 0;
+#X connect 2 0 3 1;
+#X connect 3 0 2 0;
+#X connect 4 0 3 2;
+#X connect 5 0 16 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 0 0;
+#X connect 10 0 3 0;
+#X connect 11 0 16 0;
+#X connect 11 0 19 0;
+#X connect 12 0 19 1;
+#X connect 13 0 31 1;
+#X connect 14 0 11 0;
+#X connect 14 0 11 1;
+#X connect 15 0 8 1;
+#X connect 18 0 15 1;
+#X connect 19 0 31 0;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 22 0 7 0;
+#X connect 31 0 15 0;
diff --git a/desiredata/doc/3.audio.examples/F03.pulse.spectrum.pd b/desiredata/doc/3.audio.examples/F03.pulse.spectrum.pd
new file mode 100644
index 00000000..1d04bf85
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F03.pulse.spectrum.pd
@@ -0,0 +1,126 @@
+#N canvas 227 143 860 515 12;
+#X obj 189 166 line~;
+#X obj 42 187 cos~;
+#X obj 189 142 pack 0 50;
+#X floatatom 189 41 0 0 100 0 - - -;
+#X obj 43 114 -~ 0.5;
+#X obj 43 140 *~;
+#X obj 189 67 / 10;
+#X obj 189 91 moses 0;
+#X msg 189 115 0;
+#X obj 42 163 clip~ -0.5 0.5;
+#X text 184 23 bandwidth;
+#X obj 189 191 +~ 1;
+#X obj 42 211 +~ 1;
+#X text 63 1 PULSE SPECTRUM MEASUREMENT;
+#X text 14 357 Here is a measured amplitude spectrum for the pulse
+train. Nutice that \, other than a smallish spillover \, the energy
+sits in one "lobe" whose changing width justifies our calling the squeeze
+factor the "bandwidth.";
+#X text 16 428 The spectrum is in units of amplitude. THe sidelobes
+\, although they look small \, are actually only about 34 dB down.
+You can design more complicated pulse trains \, little Blackman window
+functions \, which control the sidelobes much better.;
+#X obj 42 293 output~;
+#X obj 41 262 hip~;
+#N canvas 122 211 558 609 fft 0;
+#X obj 19 61 inlet~;
+#X obj 208 212 inlet;
+#X obj 29 92 rfft~;
+#X obj 29 125 *~;
+#X obj 60 125 *~;
+#X obj 29 155 sqrt~;
+#X obj 332 109 block~ 4096 1;
+#X obj 29 181 biquad~ 0 0 0 0 1;
+#X text 93 93 Fourier series;
+#X text 98 146 magnitude;
+#X text 96 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 193 164 delay two samples;
+#X text 191 182 for better graphing;
+#X obj 264 434 samplerate~;
+#X obj 264 457 / 256;
+#X obj 238 261 metro 500;
+#X obj 238 238 inlet;
+#X text 291 236 toggle to graph repeatedly;
+#X text 262 212 bang to graph once;
+#X obj 29 205 /~ 4096;
+#X obj 19 295 tabwrite~ F03-signal;
+#X obj 235 299 tabwrite~ F03-spectrum;
+#X obj 264 409 bang~;
+#X msg 209 322 \; pd dsp 1;
+#X obj 264 482 s freq;
+#X connect 0 0 2 0;
+#X connect 0 0 22 0;
+#X connect 1 0 22 0;
+#X connect 1 0 23 0;
+#X connect 1 0 25 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 21 0;
+#X connect 15 0 16 0;
+#X connect 16 0 26 0;
+#X connect 17 0 22 0;
+#X connect 17 0 23 0;
+#X connect 18 0 17 0;
+#X connect 18 0 25 0;
+#X connect 21 0 23 0;
+#X connect 24 0 15 0;
+#X restore 95 264 pd fft;
+#X obj 155 243 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 155 264 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 176 263 <-- repeatedly;
+#X text 177 243 <-- graph once;
+#X obj 42 235 *~ 0.5;
+#X obj 43 90 phasor~;
+#N canvas 0 0 450 300 graph1 0;
+#X array F03-signal 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 640 321 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array F03-spectrum 259 float 0;
+#X coords 0 0.51 258 -0.008 256 130 1;
+#X restore 579 99 graph;
+#X text 640 454 ---- 0.02 seconds ----;
+#X text 608 230 2;
+#X text 639 230 4;
+#X text 578 230 0;
+#X text 616 245 -- partial number --;
+#X text 671 230 6;
+#X text 704 230 8;
+#X text 732 230 10;
+#X text 764 230 12;
+#X text 796 230 14;
+#X text 605 488 updated for Pd version 0.37;
+#X obj 43 63 r freq;
+#X connect 0 0 11 0;
+#X connect 1 0 12 0;
+#X connect 2 0 0 0;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 5 0 9 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 7 1 2 0;
+#X connect 8 0 2 0;
+#X connect 9 0 1 0;
+#X connect 11 0 5 1;
+#X connect 12 0 23 0;
+#X connect 17 0 16 0;
+#X connect 17 0 16 1;
+#X connect 19 0 18 1;
+#X connect 20 0 18 2;
+#X connect 23 0 17 0;
+#X connect 23 0 18 0;
+#X connect 24 0 4 0;
+#X connect 38 0 24 0;
diff --git a/desiredata/doc/3.audio.examples/F04.waveshaping.pulse.pd b/desiredata/doc/3.audio.examples/F04.waveshaping.pulse.pd
new file mode 100644
index 00000000..5724aeba
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F04.waveshaping.pulse.pd
@@ -0,0 +1,133 @@
+#N canvas 240 229 900 586 12;
+#X obj 220 171 line~;
+#X obj 220 147 pack 0 50;
+#X floatatom 220 46 0 0 0 0 - - -;
+#X obj 70 108 *~;
+#X obj 220 72 / 10;
+#X obj 220 96 moses 0;
+#X msg 220 120 0;
+#X text 215 28 bandwidth;
+#X obj 78 141 *~;
+#X obj 18 141 sig~ 1;
+#X obj 39 194 /~;
+#X obj 54 168 +~;
+#X text 111 141 X^2;
+#X text 84 171 1+X^2;
+#X text 71 196 1/(1+X^2);
+#X text 28 4 ANOTHER PULSE WIDTH MOD ALGORITHM;
+#N canvas 0 0 450 300 graph1 0;
+#X array F04-signal 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 646 328 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array F04-spectrum 259 float 0;
+#X coords 0 1.01 258 -0.008 256 200 1;
+#X restore 587 38 graph;
+#X text 646 461 ---- 0.02 seconds ----;
+#X text 614 237 2;
+#X text 645 237 4;
+#X text 584 237 0;
+#X text 622 252 -- partial number --;
+#X text 677 237 6;
+#X text 710 237 8;
+#X text 738 237 10;
+#X text 770 237 12;
+#X text 802 237 14;
+#X obj 40 277 output~;
+#X obj 39 246 hip~;
+#N canvas 122 211 558 609 fft 0;
+#X obj 19 61 inlet~;
+#X obj 224 210 inlet;
+#X obj 29 92 rfft~;
+#X obj 29 125 *~;
+#X obj 60 125 *~;
+#X obj 29 155 sqrt~;
+#X obj 332 109 block~ 4096 1;
+#X obj 29 181 biquad~ 0 0 0 0 1;
+#X text 93 93 Fourier series;
+#X text 98 146 magnitude;
+#X text 96 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 193 164 delay two samples;
+#X text 191 182 for better graphing;
+#X obj 264 434 samplerate~;
+#X obj 251 255 metro 500;
+#X obj 251 232 inlet;
+#X text 301 232 toggle to graph repeatedly;
+#X text 278 210 bang to graph once;
+#X obj 29 205 /~ 4096;
+#X obj 264 409 bang~;
+#X obj 264 457 / 512;
+#X obj 19 295 tabwrite~ F04-signal;
+#X obj 250 291 tabwrite~ F04-spectrum;
+#X obj 264 483 s freq/2;
+#X msg 224 321 \; pd dsp 1;
+#X connect 0 0 2 0;
+#X connect 0 0 23 0;
+#X connect 1 0 23 0;
+#X connect 1 0 24 0;
+#X connect 1 0 26 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 20 0;
+#X connect 15 0 22 0;
+#X connect 16 0 23 0;
+#X connect 16 0 24 0;
+#X connect 17 0 16 0;
+#X connect 17 0 26 0;
+#X connect 20 0 24 0;
+#X connect 21 0 15 0;
+#X connect 22 0 25 0;
+#X restore 93 248 pd fft;
+#X obj 153 227 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 153 248 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 174 247 <-- repeatedly;
+#X text 175 227 <-- graph once;
+#X obj 69 81 osc~;
+#X text 632 540 updated for Pd version 0.37;
+#X text 23 515 NOTE: The PAF algorithm is protected by patents belonging
+to IRCAM. Noncommercial use seems to be fine with them but contact
+them first if you want to sell something using this.;
+#X text 24 473 This is the form of pulse train used in the original
+Phase Aligned Formant (PAF) algorithm.;
+#X text 23 342 Here we use waveshaping to make another form of pulse
+train. This one has a neat spectrum: the partials drop off exponentially
+(with the "bandwidth" controlling the rate of dropoff.) In later patches
+we'll use a wavetable to do the waveshaping but for simplicity \, it's
+done algebraically here. The oscillator runs at half the fundamental
+frequency. The symmetry of the waveshaping doubles the frequency of
+the output.;
+#X text 849 222 0;
+#X text 846 35 1;
+#X obj 69 56 r freq/2;
+#X connect 0 0 3 1;
+#X connect 1 0 0 0;
+#X connect 2 0 4 0;
+#X connect 3 0 8 0;
+#X connect 3 0 8 1;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 5 1 1 0;
+#X connect 6 0 1 0;
+#X connect 8 0 11 1;
+#X connect 9 0 10 0;
+#X connect 9 0 11 0;
+#X connect 10 0 29 0;
+#X connect 10 0 30 0;
+#X connect 11 0 10 1;
+#X connect 29 0 28 0;
+#X connect 29 0 28 1;
+#X connect 31 0 30 1;
+#X connect 32 0 30 2;
+#X connect 35 0 3 0;
+#X connect 42 0 35 0;
diff --git a/desiredata/doc/3.audio.examples/F05.ring.modulation.pd b/desiredata/doc/3.audio.examples/F05.ring.modulation.pd
new file mode 100644
index 00000000..937b579e
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F05.ring.modulation.pd
@@ -0,0 +1,160 @@
+#N canvas 83 89 793 595 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array F05-signal 882 float 0;
+#X coords 0 1 882 -1 200 130 1;
+#X restore 554 218 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array F05-spectrum 256 float 0;
+#X coords 0 0.51 255 -0.008 256 130 1;
+#X restore 499 22 graph;
+#X text 552 349 ---- 0.02 seconds ----;
+#X text 507 563 updated for Pd version 0.37;
+#X text 495 155 0;
+#X text 534 174 -- partial number --;
+#X text 761 142 0;
+#X text 758 19 0.5;
+#X floatatom 51 61 0 0 100 0 - - -;
+#N canvas 329 22 680 421 pulse-train 0;
+#X obj 184 348 line~;
+#X obj 39 317 cos~;
+#X obj 184 324 pack 0 50;
+#X obj 39 245 -~ 0.5;
+#X obj 39 269 *~;
+#X obj 184 252 / 10;
+#X obj 184 276 moses 0;
+#X msg 184 300 0;
+#X obj 39 293 clip~ -0.5 0.5;
+#X obj 184 372 +~ 1;
+#X obj 39 341 +~ 1;
+#X obj 184 228 inlet;
+#X obj 39 389 outlet~;
+#X obj 39 365 *~ 0.5;
+#X text 53 5 This is a modified version of the pulse train generator
+from two examples back.;
+#X text 107 140 We have to add 1/2 and wrap so that the center of the
+pulse comes at phase zero (previously it was 1/2 cycle out of phase).
+This wasn't a problem before but now we have to be in phase with the
+oscillator we're multpplying with.;
+#X text 276 262 otherwise it's the same as before.;
+#X obj 40 85 phasor~;
+#X obj 40 58 r freq;
+#X connect 0 0 9 0;
+#X connect 1 0 10 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 4 0 8 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 6 1 2 0;
+#X connect 7 0 2 0;
+#X connect 8 0 1 0;
+#X connect 9 0 4 1;
+#X connect 10 0 13 0;
+#X connect 11 0 5 0;
+#X connect 13 0 12 0;
+#X connect 17 0 3 0;
+#X connect 18 0 17 0;
+#X restore 51 86 pd pulse-train;
+#X text 83 61 <-- bandwidth;
+#X obj 51 219 *~;
+#X text 113 123 <-- modulation frequency as;
+#X text 152 137 multiple of fundamental;
+#X obj 51 277 output~;
+#X obj 50 246 hip~;
+#N canvas 122 211 563 534 fft 0;
+#X obj 19 61 inlet~;
+#X obj 208 212 inlet;
+#X obj 29 92 rfft~;
+#X obj 29 125 *~;
+#X obj 60 125 *~;
+#X obj 29 155 sqrt~;
+#X obj 332 109 block~ 4096 1;
+#X obj 29 181 biquad~ 0 0 0 0 1;
+#X text 93 93 Fourier series;
+#X text 98 146 magnitude;
+#X text 96 131 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 193 164 delay two samples;
+#X text 191 182 for better graphing;
+#X obj 264 434 samplerate~;
+#X obj 245 262 metro 500;
+#X obj 245 233 inlet;
+#X text 298 231 toggle to graph repeatedly;
+#X text 262 212 bang to graph once;
+#X obj 29 205 /~ 4096;
+#X obj 264 409 bang~;
+#X obj 264 483 s freq;
+#X obj 264 457 / 256;
+#X obj 19 295 tabwrite~ F05-signal;
+#X obj 245 294 tabwrite~ F05-spectrum;
+#X msg 224 321 \; pd dsp 1;
+#X connect 0 0 2 0;
+#X connect 0 0 24 0;
+#X connect 1 0 24 0;
+#X connect 1 0 25 0;
+#X connect 1 0 26 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 20 0;
+#X connect 15 0 23 0;
+#X connect 16 0 24 0;
+#X connect 16 0 25 0;
+#X connect 17 0 16 0;
+#X connect 17 0 26 0;
+#X connect 20 0 25 0;
+#X connect 21 0 15 0;
+#X connect 23 0 22 0;
+#X restore 98 245 pd fft;
+#X obj 158 224 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 158 245 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X text 179 244 <-- repeatedly;
+#X text 180 224 <-- graph once;
+#X text 527 155 2;
+#X text 559 155 4;
+#X text 591 155 6;
+#X text 623 155 8;
+#X text 656 155 10;
+#X text 688 155 12;
+#X text 719 155 14;
+#X text 759 213 1;
+#X text 759 337 -1;
+#X text 122 185 modulating oscillator;
+#X text 153 6 RING MODULATED PULSE TRAINS;
+#X text 23 357 Now we take a pulse train and ring modulate it \, which
+effectively aliases the spectrum so that it is centered at any desired
+partial number. The "bandwidth" control still affects the shape of
+the peak \, independently of where it is centered. This generates a
+formant centered at the given partial.;
+#X floatatom 73 123 0 0 100 0 - - -;
+#X obj 73 182 osc~;
+#X obj 73 157 *;
+#X obj 107 157 r freq;
+#X text 23 457 This patch is limited to making formants centered on
+harmonics. The center frequency thus can't be moved smoothly up and
+down at will (try shift-clicking on modulation frequency to make fractions).
+Next we'll look at two techniques for sliding a formant frequency without
+losing harmonicity.;
+#X text 184 85 <-- pulse train;
+#X text 220 101 generator from before;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 11 0 15 0;
+#X connect 11 0 16 0;
+#X connect 15 0 14 0;
+#X connect 15 0 14 1;
+#X connect 17 0 16 1;
+#X connect 18 0 16 2;
+#X connect 33 0 35 0;
+#X connect 34 0 11 1;
+#X connect 35 0 34 0;
+#X connect 36 0 35 1;
diff --git a/desiredata/doc/3.audio.examples/F06.packets.pd b/desiredata/doc/3.audio.examples/F06.packets.pd
new file mode 100644
index 00000000..ef098bba
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F06.packets.pd
@@ -0,0 +1,117 @@
+#N canvas 207 159 864 663 12;
+#X obj 327 413 line~;
+#X obj 55 456 cos~;
+#N canvas 0 0 450 300 graph1 0;
+#X array pulse-output 882 float 0;
+#X coords 0 1 882 -1 200 130 1;
+#X restore 627 339 graph;
+#X obj 327 390 pack 0 50;
+#X floatatom 327 344 0 0 0 0 - - -;
+#X obj 55 355 -~ 0.5;
+#X obj 55 410 *~;
+#X obj 327 367 / 10;
+#X obj 55 433 clip~ -0.5 0.5;
+#X text 327 322 bandwidth;
+#X obj 327 436 +~ 1;
+#X obj 55 479 +~ 1;
+#X obj 206 491 cos~;
+#X obj 56 547 *~;
+#X floatatom 228 346 4 0 0 0 - - -;
+#X obj 228 366 / 10;
+#X text 627 472 --- 0.02 seconds ---;
+#X obj 206 465 *~;
+#N canvas 129 316 777 218 graph 1;
+#X obj 70 76 inlet~;
+#X obj 662 76 inlet;
+#X obj 67 143 tabwrite~ pulse-output;
+#X obj 298 81 inlet~;
+#X obj 472 74 inlet~;
+#X obj 295 148 tabwrite~ window;
+#X obj 477 149 tabwrite~ carrier;
+#X msg 654 140 \; pd dsp 1;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 1 0 5 0;
+#X connect 1 0 6 0;
+#X connect 1 0 7 0;
+#X connect 3 0 5 0;
+#X connect 4 0 6 0;
+#X restore 100 572 pd graph;
+#X obj 228 412 line~;
+#X obj 228 389 pack 0 50;
+#N canvas 0 0 450 300 graph3 0;
+#X array carrier 882 float 0;
+#X coords 0 1 881 -1 200 140 1;
+#X restore 627 188 graph;
+#N canvas 0 0 450 300 graph4 0;
+#X array window 882 float 0;
+#X coords 0 1 881 -1 200 140 1;
+#X restore 628 35 graph;
+#X text 204 573 <-- graph;
+#X floatatom 55 310 4 0 0 0 - - -;
+#X obj 55 331 phasor~ 100;
+#X text 31 2 WINDOWED PACKETS;
+#X text 51 266 fundamental;
+#X text 206 260 center;
+#X text 204 279 freq. (in;
+#X text 203 298 tenths of;
+#X text 202 318 fundamental);
+#X text 119 493 window;
+#X text 241 469 magnified phase;
+#X text 283 509 desired center frequency;
+#X text 255 492 <--this cosine goes at the;
+#X text 284 528 but its phase is reset each;
+#X text 282 547 fundamental period.;
+#X text 28 32 The simpler of two techniques for making slidable center
+frequencies is to synthesize enveloped sinusoidal wave packets. The
+packets should repeat at the fundamental frequency \, but the frequency
+of the packet itself controls the center frequency of the formant.
+The length of the packet varies inversely with bandwidth.;
+#X obj 55 604 output~;
+#X obj 55 580 hip~;
+#X obj 182 573 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 601 635 updated for Pd version 0.37;
+#X obj 55 502 *~ 0.5;
+#X text 831 161 -1;
+#X text 833 31 1;
+#X text 831 314 -1;
+#X text 835 184 1;
+#X text 832 458 -1;
+#X text 835 333 1;
+#X text 26 132 In the patch below \, the "clip~" followed by "cos~"
+and "+~ 1" is the enveloping ("windowing") function \, which appears
+in the top graph. The carrier \, on the other hand \, is a broken sinusoid
+made by amplifying the phasor~ (the "*~" controlled by "center freq.")
+and taking the cos~ of the result. The "breaks" in the sinusoid only
+occur when the enveloping signal is zero.;
+#X text 105 464 raised;
+#X text 113 479 cosine;
+#X text 51 285 frequency;
+#X connect 0 0 10 0;
+#X connect 1 0 11 0;
+#X connect 3 0 0 0;
+#X connect 4 0 7 0;
+#X connect 5 0 6 0;
+#X connect 5 0 17 0;
+#X connect 6 0 8 0;
+#X connect 7 0 3 0;
+#X connect 8 0 1 0;
+#X connect 10 0 6 1;
+#X connect 11 0 43 0;
+#X connect 12 0 13 1;
+#X connect 12 0 18 2;
+#X connect 13 0 18 0;
+#X connect 13 0 40 0;
+#X connect 14 0 15 0;
+#X connect 15 0 20 0;
+#X connect 17 0 12 0;
+#X connect 19 0 17 1;
+#X connect 20 0 19 0;
+#X connect 24 0 25 0;
+#X connect 25 0 5 0;
+#X connect 40 0 39 0;
+#X connect 40 0 39 1;
+#X connect 41 0 18 3;
+#X connect 43 0 13 0;
+#X connect 43 0 18 1;
diff --git a/desiredata/doc/3.audio.examples/F07.packet.spectrum.pd b/desiredata/doc/3.audio.examples/F07.packet.spectrum.pd
new file mode 100644
index 00000000..bef1483b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F07.packet.spectrum.pd
@@ -0,0 +1,147 @@
+#N canvas 83 221 774 628 12;
+#X obj 302 351 line~;
+#X obj 34 444 cos~;
+#X floatatom 71 560 0 0 0;
+#N canvas 176 241 532 273 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 398 111 moses 1;
+#X obj 83 148 dbtorms;
+#X obj 398 86 r master-lvl;
+#X obj 83 42 r master-lvl;
+#X obj 338 210 s master-lvl;
+#X obj 17 148 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 15 125 audio;
+#X text 93 110 show level;
+#X obj 17 177 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 5 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 26 0 21 0;
+#X restore 35 587 pd output;
+#X msg 111 560 MUTE;
+#X obj 302 327 pack 0 50;
+#X floatatom 302 255 0 0 0;
+#X obj 34 356 -~ 0.5;
+#X obj 34 395 *~;
+#X obj 302 279 / 10;
+#X obj 34 420 clip~ -0.5 0.5;
+#X text 302 233 bandwidth;
+#X obj 302 375 +~ 1;
+#X obj 35 467 +~ 1;
+#X obj 184 440 cos~;
+#X obj 35 496 *~;
+#X floatatom 206 269 4 0 0;
+#X obj 206 293 / 10;
+#X obj 184 414 *~;
+#X text 204 224 center;
+#X text 204 243 freq.;
+#X obj 302 303 max 0;
+#X obj 206 365 line~;
+#X obj 206 341 pack 0 50;
+#X obj 206 317 max 0;
+#X floatatom 34 308 4 0 0;
+#X obj 34 332 phasor~ 100;
+#X text 156 559 <-- output;
+#X text 30 283 freq.;
+#X text 30 264 fundamental;
+#X graph graph1 0 0 128 500 440 492 696 362;
+#X array spectrum 128 float 0;
+#X pop;
+#X msg 108 498 bang;
+#N canvas 204 17 358 238 fft 0;
+#X obj 46 48 inlet~;
+#X obj 159 181 tabwrite~ spectrum;
+#X obj 159 145 inlet;
+#X obj 46 78 rfft~;
+#X obj 46 111 *~;
+#X obj 77 111 *~;
+#X obj 46 141 sqrt~;
+#X obj 191 45 block~ 1024 1;
+#X connect 0 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 3 0 4 1;
+#X connect 3 1 5 0;
+#X connect 3 1 5 1;
+#X connect 4 0 6 0;
+#X connect 5 0 6 0;
+#X connect 6 0 1 0;
+#X restore 59 524 pd fft;
+#X text 439 502 0;
+#X text 687 499 5512;
+#X text 149 498 <-- graph;
+#X text 31 2 WINDOWED PACKET SPECTRUM;
+#X text 19 34 Here's the spectrum you get. Note that even if you put
+the center frequency right on a partial \, there is significant energy
+in neighboring partials (try fundamental 440 \, "center freq" 30 \,
+bandwidth 0.);
+#X text 18 104 The center frequency is in units of ten per partial
+\, or in other words a value of "30" means "centered on the third partial".
+;
+#X text 505 596 updated for Pd version 0.34;
+#X text 22 155 This technique only works if you're doing Hanning-window
+shaped PWM--you can't combine this naturally with FM or with the waveshaping
+technique we'll see later.;
+#X connect 0 0 12 0;
+#X connect 1 0 13 0;
+#X connect 2 0 3 1;
+#X connect 3 0 2 0;
+#X connect 4 0 3 2;
+#X connect 5 0 0 0;
+#X connect 6 0 9 0;
+#X connect 7 0 8 0;
+#X connect 7 0 18 0;
+#X connect 8 0 10 0;
+#X connect 9 0 21 0;
+#X connect 10 0 1 0;
+#X connect 12 0 8 1;
+#X connect 13 0 15 0;
+#X connect 14 0 15 1;
+#X connect 15 0 3 0;
+#X connect 15 0 32 0;
+#X connect 16 0 17 0;
+#X connect 17 0 24 0;
+#X connect 18 0 14 0;
+#X connect 21 0 5 0;
+#X connect 22 0 18 1;
+#X connect 23 0 22 0;
+#X connect 24 0 23 0;
+#X connect 25 0 26 0;
+#X connect 26 0 7 0;
+#X connect 31 0 32 1;
diff --git a/desiredata/doc/3.audio.examples/F08.two.cosines.pd b/desiredata/doc/3.audio.examples/F08.two.cosines.pd
new file mode 100644
index 00000000..ae4788f6
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F08.two.cosines.pd
@@ -0,0 +1,70 @@
+#N canvas 534 115 698 613 12;
+#X obj 157 408 cos~;
+#X floatatom 204 198 4 0 100 0 - - -;
+#X obj 204 222 / 10;
+#X text 461 275 --- 0.02 seconds ---;
+#X obj 157 378 *~;
+#X obj 204 294 line~;
+#X obj 204 246 max 0;
+#N canvas 0 0 450 300 graph3 0;
+#X array F08-carrier 882 float 0;
+#X coords 0 2 881 -2 200 140 1;
+#X restore 447 123 graph;
+#X floatatom 57 295 4 0 0 0 - - -;
+#X text 53 251 fundamental;
+#X text 53 270 frequency;
+#X obj 199 408 cos~;
+#X obj 240 321 wrap~;
+#X obj 204 348 -~;
+#X obj 199 378 +~;
+#X obj 204 445 -~;
+#X obj 219 475 *~;
+#X obj 197 500 +~;
+#X obj 204 270 pack 0 50;
+#X text 254 408 synthesize the two partials;
+#X text 447 590 updated for Pd version 0.37;
+#X obj 198 526 hip~;
+#X obj 199 552 output~;
+#X text 26 29 The other \, spiffier way is to make a sum of cosines
+to interpolate between adjacent harmonics. Suppose for example we want
+a center frequency of 5.3 (in units of the fundamental.) We just take
+partial 5 with amplitude 0.7 and partial 6 with amplitude 0.3:;
+#X obj 286 552 tabwrite~ F08-carrier;
+#X text 316 528 <-graph;
+#X obj 284 527 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 57 319 phasor~ 100;
+#X text 83 149 center frequency (in;
+#X text 82 169 tenths of fundamental);
+#X text 125 3 MOVABLE CENTER FREQUENCY BY ADDING TWO COSINES;
+#X text 295 320 the fractional part "q";
+#X text 253 347 subtract to get the integer part "k";
+#X text 249 380 multiply phase by k and k+1;
+#X text 252 444 c2 - c1;
+#X text 267 473 q * (c2 - c1);
+#X text 236 500 q * c2 + (1-q) * c1;
+#X connect 0 0 15 1;
+#X connect 0 0 17 0;
+#X connect 1 0 2 0;
+#X connect 2 0 6 0;
+#X connect 4 0 0 0;
+#X connect 4 0 14 0;
+#X connect 5 0 13 0;
+#X connect 5 0 12 0;
+#X connect 6 0 18 0;
+#X connect 8 0 27 0;
+#X connect 11 0 15 0;
+#X connect 12 0 13 1;
+#X connect 12 0 16 1;
+#X connect 13 0 4 1;
+#X connect 14 0 11 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 1;
+#X connect 17 0 21 0;
+#X connect 17 0 24 0;
+#X connect 18 0 5 0;
+#X connect 21 0 22 0;
+#X connect 21 0 22 1;
+#X connect 26 0 24 0;
+#X connect 27 0 4 0;
+#X connect 27 0 14 1;
diff --git a/desiredata/doc/3.audio.examples/F09.declickit.pd b/desiredata/doc/3.audio.examples/F09.declickit.pd
new file mode 100644
index 00000000..f35f5da8
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F09.declickit.pd
@@ -0,0 +1,94 @@
+#N canvas 10 49 579 665 12;
+#X obj 130 481 cos~;
+#X obj 130 451 *~;
+#X obj 172 481 cos~;
+#X obj 214 397 wrap~;
+#X obj 177 402 -~;
+#X obj 172 451 +~;
+#X obj 172 516 -~;
+#X obj 192 548 *~;
+#X obj 170 573 +~;
+#X obj 204 159 loadbang;
+#X obj 204 185 metro 400;
+#X obj 216 209 del 200;
+#X obj 252 326 samphold~;
+#N canvas 0 0 405 406 switch 0;
+#X obj 15 383 outlet~;
+#X obj 8 193 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 329 195 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 18 99 loadbang;
+#X obj 18 131 1;
+#X obj 53 261 sel 1;
+#X obj 53 287 0;
+#X obj 339 259 sel 1;
+#X obj 339 288 0;
+#X obj 47 316 inlet~;
+#X obj 15 344 *~;
+#X obj 340 312 inlet~;
+#X obj 308 340 *~;
+#X connect 1 0 5 0;
+#X connect 1 0 10 1;
+#X connect 2 0 7 0;
+#X connect 2 0 12 1;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 2 0;
+#X connect 7 0 8 0;
+#X connect 8 0 1 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 0;
+#X connect 11 0 12 0;
+#X connect 12 0 0 0;
+#X coords 0 0 1 1 80 35 1;
+#X restore 177 351 pd switch;
+#X text 31 2 CHANGING THE CENTER FREQUENCY QUICKLY;
+#X text 34 27 Since in the previous patch the amplitudes of the two
+cosines depend on "center frequency" we can't change that discontinuously
+without clicking \, as you hear in this patch. The fix is to use a
+samphold~ object to keep the center frequency frozen except at phase
+crossings. At the phase crossings the two weighted cosines add to one
+\, so we can discontinuously change the frequencies and weights there.
+;
+#X text 266 365 <--toggles to select which one;
+#X text 369 384 is actually used;
+#X obj 171 602 output~;
+#X floatatom 225 264 3 0 50 0 - - -;
+#X obj 178 263 pack;
+#X text 258 263 <--gliss time;
+#X text 324 647 updated for Pd version 0.37;
+#X obj 178 287 line~;
+#X msg 216 239 13.5;
+#X msg 178 239 4;
+#X obj 70 287 phasor~ 80;
+#X connect 0 0 6 1;
+#X connect 0 0 8 0;
+#X connect 1 0 0 0;
+#X connect 1 0 5 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 1;
+#X connect 3 0 7 1;
+#X connect 4 0 1 1;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 18 0;
+#X connect 8 0 18 1;
+#X connect 9 0 10 0;
+#X connect 10 0 25 0;
+#X connect 10 0 11 0;
+#X connect 11 0 24 0;
+#X connect 12 0 13 1;
+#X connect 13 0 4 0;
+#X connect 13 0 3 0;
+#X connect 19 0 20 1;
+#X connect 20 0 23 0;
+#X connect 23 0 13 0;
+#X connect 23 0 12 0;
+#X connect 24 0 20 0;
+#X connect 25 0 20 0;
+#X connect 26 0 1 0;
+#X connect 26 0 5 1;
+#X connect 26 0 12 1;
diff --git a/desiredata/doc/3.audio.examples/F10.sweepable.FM.pd b/desiredata/doc/3.audio.examples/F10.sweepable.FM.pd
new file mode 100644
index 00000000..17fc920b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F10.sweepable.FM.pd
@@ -0,0 +1,152 @@
+#N canvas 60 64 834 697 12;
+#X obj 168 476 cos~;
+#X obj 168 430 *~;
+#X obj 211 478 cos~;
+#X obj 252 379 wrap~;
+#X obj 215 378 -~;
+#X obj 211 455 +~;
+#X obj 209 513 -~;
+#X obj 230 539 *~;
+#X obj 215 348 samphold~;
+#X text 167 6 APPLYING TWO-COSINE CARRIER TO FM;
+#X floatatom 232 228 4 0 200 0 - - -;
+#X obj 232 251 / 10;
+#X text 232 147 center;
+#X obj 232 300 line~;
+#X text 232 167 freq. (in;
+#X text 232 187 tenths of;
+#X text 232 207 fundamental);
+#X obj 232 277 pack 0 50;
+#X obj 121 283 phasor~;
+#X floatatom 121 260 4 0 0 0 - - -;
+#X text 106 207 fundamental;
+#X text 106 227 (= mod freq);
+#X text 435 254 index;
+#X text 435 274 (percent);
+#X floatatom 435 295 4 0 500 0 - - -;
+#X obj 385 361 cos~;
+#X obj 435 364 line~;
+#X obj 385 384 *~;
+#X obj 435 318 / 100;
+#X obj 435 341 pack 0 50;
+#X obj 168 453 +~;
+#X text 388 410 modulating;
+#X text 388 430 oscillator;
+#X text 40 452 both phases-->;
+#X text 9 435 add modulator to;
+#X obj 233 632 output~;
+#X obj 232 601 hip~;
+#N canvas 122 211 558 609 fft 0;
+#X obj 23 55 inlet~;
+#X obj 210 303 inlet;
+#X obj 27 215 rfft~;
+#X obj 27 248 *~;
+#X obj 58 248 *~;
+#X obj 27 278 sqrt~;
+#X obj 334 200 block~ 4096 1;
+#X obj 27 304 biquad~ 0 0 0 0 1;
+#X text 91 216 Fourier series;
+#X text 96 269 magnitude;
+#X text 94 254 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 195 255 delay two samples;
+#X text 193 273 for better graphing;
+#X obj 292 79 samplerate~;
+#X obj 240 352 metro 500;
+#X obj 240 329 inlet;
+#X text 293 327 toggle to graph repeatedly;
+#X text 264 303 bang to graph once;
+#X obj 27 328 /~ 4096;
+#X obj 292 54 bang~;
+#X msg 211 413 \; pd dsp 1;
+#X obj 237 390 tabwrite~ F10-spectrum;
+#X obj 292 102 / 4096;
+#X obj 58 135 osc~;
+#X obj 58 163 +~ 1;
+#X obj 28 188 *~;
+#X text 113 138 hanning window;
+#X obj 254 79 0.5;
+#X connect 0 0 27 0;
+#X connect 1 0 22 0;
+#X connect 1 0 23 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 20 0;
+#X connect 15 0 24 0;
+#X connect 16 0 23 0;
+#X connect 17 0 16 0;
+#X connect 17 0 22 0;
+#X connect 20 0 23 0;
+#X connect 21 0 15 0;
+#X connect 21 0 29 0;
+#X connect 24 0 25 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 1;
+#X connect 27 0 2 0;
+#X connect 29 0 25 1;
+#X restore 286 601 pd fft;
+#X obj 346 580 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 346 601 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X text 367 600 <-- repeatedly;
+#X text 368 580 <-- graph once;
+#X text 580 663 updated for Pd version 0.37;
+#N canvas 0 0 450 300 graph1 0;
+#X array F10-spectrum 259 float 0;
+#X coords 0 0.51 258 -0.008 256 130 1;
+#X restore 560 386 graph;
+#X text 552 517 0;
+#X obj 207 565 +~;
+#X text 31 30 We can apply the two-cosine method to FM synthesis to
+get FM spectra which slide up and down: we just treat the cosines like
+carrier signals in an FM instrument. This doesn't work as well as you'd
+wish \, because the phases of the partials of the two FM instruments
+don't line up \, so that \, for indices of modulation above about 20%
+\, you get beating effects as the center frequency goes up and down.
+;
+#X text 614 527 -- frequency --;
+#X text 792 518 2700;
+#X connect 0 0 6 1;
+#X connect 0 0 45 0;
+#X connect 1 0 30 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 1;
+#X connect 3 0 7 1;
+#X connect 4 0 1 1;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 45 1;
+#X connect 8 0 4 0;
+#X connect 8 0 3 0;
+#X connect 10 0 11 0;
+#X connect 11 0 17 0;
+#X connect 13 0 8 0;
+#X connect 17 0 13 0;
+#X connect 18 0 8 1;
+#X connect 18 0 25 0;
+#X connect 18 0 1 0;
+#X connect 18 0 5 1;
+#X connect 19 0 18 0;
+#X connect 24 0 28 0;
+#X connect 25 0 27 0;
+#X connect 26 0 27 1;
+#X connect 27 0 30 1;
+#X connect 28 0 29 0;
+#X connect 29 0 26 0;
+#X connect 30 0 5 0;
+#X connect 30 0 0 0;
+#X connect 36 0 35 0;
+#X connect 36 0 35 1;
+#X connect 38 0 37 1;
+#X connect 39 0 37 2;
+#X connect 45 0 36 0;
+#X connect 45 0 37 0;
diff --git a/desiredata/doc/3.audio.examples/F11.anharmonic.FM.pd b/desiredata/doc/3.audio.examples/F11.anharmonic.FM.pd
new file mode 100644
index 00000000..333a6e44
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F11.anharmonic.FM.pd
@@ -0,0 +1,126 @@
+#N canvas 60 64 790 527 12;
+#X obj 122 381 cos~;
+#X floatatom 173 184 4 0 200 0 - - -;
+#X obj 173 207 / 10;
+#X text 173 103 center;
+#X text 173 123 freq. (in;
+#X text 173 143 tenths of;
+#X text 173 163 fundamental);
+#X floatatom 70 192 4 0 0 0 - - -;
+#X text 46 145 fundamental;
+#X text 46 165 (= mod freq);
+#X text 251 208 index;
+#X text 251 228 (percent);
+#X floatatom 251 249 4 0 500 0 - - -;
+#X obj 251 318 line~;
+#X obj 201 338 *~;
+#X obj 251 272 / 100;
+#X obj 251 295 pack 0 50;
+#X obj 122 358 +~;
+#X text 204 364 modulating;
+#X text 209 381 oscillator;
+#X obj 123 459 output~;
+#X obj 122 428 hip~;
+#N canvas 122 211 558 609 fft 0;
+#X obj 23 55 inlet~;
+#X obj 210 303 inlet;
+#X obj 27 215 rfft~;
+#X obj 27 248 *~;
+#X obj 58 248 *~;
+#X obj 27 278 sqrt~;
+#X obj 334 200 block~ 4096 1;
+#X obj 27 304 biquad~ 0 0 0 0 1;
+#X text 91 216 Fourier series;
+#X text 96 269 magnitude;
+#X text 94 254 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 195 255 delay two samples;
+#X text 193 273 for better graphing;
+#X obj 292 79 samplerate~;
+#X obj 240 352 metro 500;
+#X obj 240 329 inlet;
+#X text 293 327 toggle to graph repeatedly;
+#X text 264 303 bang to graph once;
+#X obj 27 328 /~ 4096;
+#X obj 292 54 bang~;
+#X msg 211 413 \; pd dsp 1;
+#X obj 292 102 / 4096;
+#X obj 58 135 osc~;
+#X obj 58 163 +~ 1;
+#X obj 28 188 *~;
+#X text 113 138 hanning window;
+#X obj 254 79 0.5;
+#X obj 240 390 tabwrite~ F11-spectrum;
+#X connect 0 0 26 0;
+#X connect 1 0 22 0;
+#X connect 1 0 29 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 20 0;
+#X connect 15 0 23 0;
+#X connect 16 0 29 0;
+#X connect 17 0 16 0;
+#X connect 17 0 22 0;
+#X connect 20 0 29 0;
+#X connect 21 0 15 0;
+#X connect 21 0 28 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 25 0 26 1;
+#X connect 26 0 2 0;
+#X connect 28 0 24 1;
+#X restore 176 428 pd fft;
+#X obj 236 407 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 236 428 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 257 427 <-- repeatedly;
+#X text 258 407 <-- graph once;
+#X text 530 479 updated for Pd version 0.37;
+#N canvas 0 0 450 300 graph1 0;
+#X array F11-spectrum 259 float 0;
+#X coords 0 0.51 258 -0.008 256 130 1;
+#X restore 514 291 graph;
+#X text 506 422 0;
+#X text 568 432 -- frequency --;
+#X text 743 427 2700;
+#X obj 173 256 *;
+#X obj 173 233 t b f;
+#X obj 201 315 osc~;
+#X obj 122 322 phasor~;
+#X text 31 30 Here's what happens if you just slide the carrier frequency
+around. The spectrum moves up and down all right \, but is only periodic
+at the original period when the center frequency roosts on a harmonic.
+;
+#X text 50 308 carrier;
+#X text 24 325 oscillator;
+#X text 167 6 HOW NOT TO APPLY TWO-COSINE CARRIER TO FM;
+#X connect 0 0 21 0;
+#X connect 0 0 22 0;
+#X connect 1 0 2 0;
+#X connect 2 0 33 0;
+#X connect 7 0 32 0;
+#X connect 7 0 34 0;
+#X connect 12 0 15 0;
+#X connect 13 0 14 1;
+#X connect 14 0 17 1;
+#X connect 15 0 16 0;
+#X connect 16 0 13 0;
+#X connect 17 0 0 0;
+#X connect 21 0 20 0;
+#X connect 21 0 20 1;
+#X connect 23 0 22 1;
+#X connect 24 0 22 2;
+#X connect 32 0 35 0;
+#X connect 33 0 32 0;
+#X connect 33 1 32 1;
+#X connect 34 0 14 0;
+#X connect 35 0 17 0;
diff --git a/desiredata/doc/3.audio.examples/F12.paf.pd b/desiredata/doc/3.audio.examples/F12.paf.pd
new file mode 100644
index 00000000..f220bd45
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F12.paf.pd
@@ -0,0 +1,226 @@
+#N canvas 262 0 692 819 12;
+#X obj 38 593 cos~;
+#X obj 38 570 *~;
+#X obj 81 593 cos~;
+#X obj 137 527 wrap~;
+#X obj 101 527 -~;
+#X obj 81 570 +~;
+#X obj 74 623 -~;
+#X obj 94 655 *~;
+#X obj 56 655 +~;
+#X obj 100 500 samphold~;
+#X floatatom 159 378 4 0 500 0 - - -;
+#X obj 159 401 / 10;
+#X text 157 311 center;
+#X obj 159 449 line~;
+#X text 157 359 fundamental);
+#X obj 159 426 pack 0 50;
+#X obj 39 446 phasor~;
+#X floatatom 39 425 4 0 0 0 - - -;
+#X text 19 398 fundamental;
+#X text 303 460 index;
+#X text 303 477 (percent);
+#X floatatom 303 498 4 0 500 0 - - -;
+#X obj 303 544 line~;
+#X obj 224 564 *~;
+#X obj 303 521 pack 0 50;
+#N canvas 0 0 450 300 graph4 0;
+#X array bell-curve 200 float 1;
+#A 0 1.12535e-07 1.54727e-07 2.12059e-07 2.89706e-07 3.94519e-07 5.35535e-07
+7.24633e-07 9.77371e-07 1.31404e-06 1.76105e-06 2.35258e-06 3.13275e-06
+4.15832e-06 5.50199e-06 7.25659e-06 9.54016e-06 1.25023e-05 1.63317e-05
+2.1266e-05 2.76026e-05 3.57128e-05 4.60584e-05 5.92113e-05 7.58768e-05
+9.69224e-05 0.00012341 0.000156634 0.000198167 0.000249912 0.000314163
+0.000393669 0.000491721 0.000612231 0.000759842 0.000940028 0.00115923
+0.00142498 0.00174605 0.00213263 0.00259648 0.00315111 0.00381201 0.00459678
+0.0055254 0.0066204 0.00790705 0.0094136 0.0111714 0.013215 0.0155826
+0.0183156 0.0214592 0.0250621 0.0291763 0.0338573 0.0391639 0.0451575
+0.0519019 0.0594631 0.0679081 0.0773047 0.0877205 0.0992216 0.111872
+0.125732 0.140858 0.1573 0.1751 0.194291 0.214896 0.236928 0.260383
+0.285247 0.311486 0.339053 0.367879 0.397882 0.428956 0.46098 0.493812
+0.527292 0.561244 0.595473 0.62977 0.663916 0.697676 0.730811 0.763074
+0.794216 0.823987 0.852144 0.878447 0.902668 0.924595 0.944027 0.960789
+0.974725 0.985703 0.99362 0.998401 1 0.998401 0.99362 0.985703 0.974725
+0.960789 0.944027 0.924595 0.902668 0.878447 0.852144 0.823987 0.794216
+0.763074 0.730811 0.697676 0.663916 0.62977 0.595473 0.561244 0.527292
+0.493812 0.46098 0.428956 0.397882 0.367879 0.339053 0.311486 0.285247
+0.260383 0.236928 0.214896 0.194291 0.1751 0.1573 0.140858 0.125732
+0.111872 0.0992216 0.0877205 0.0773047 0.0679081 0.0594631 0.0519019
+0.0451575 0.0391639 0.0338573 0.0291763 0.0250621 0.0214592 0.0183156
+0.0155826 0.013215 0.0111714 0.0094136 0.00790705 0.0066204 0.0055254
+0.00459678 0.00381201 0.00315111 0.00259648 0.00213263 0.00174605 0.00142498
+0.00115923 0.000940028 0.000759842 0.000612231 0.000491721 0.000393669
+0.000314163 0.000249912 0.000198167 0.000156634 0.00012341 9.69224e-05
+7.58768e-05 5.92113e-05 4.60584e-05 3.57128e-05 2.76026e-05 2.1266e-05
+1.63317e-05 1.25023e-05 9.54016e-06 7.25659e-06 5.50199e-06 4.15832e-06
+3.13275e-06 2.35258e-06 1.76105e-06 1.31404e-06 9.77371e-07 7.24633e-07
+5.35535e-07 3.94519e-07 2.89706e-07 2.12059e-07 1.54727e-07;
+#X coords 0 1 199 0 200 140 1;
+#X restore 443 555 graph;
+#N canvas 94 264 600 388 make-table 0;
+#X msg 81 44 bang;
+#X obj 81 73 t b b;
+#X obj 159 142 f;
+#X obj 197 142 + 1;
+#X msg 175 112 0;
+#X obj 81 102 until;
+#X obj 161 177 t f f;
+#X obj 76 306 tabwrite bell-curve;
+#X obj 52 270 expr exp(-$f1*$f1);
+#X obj 63 168 sel 199;
+#X obj 51 241 expr ($f1-100)/25;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 1 1 4 0;
+#X connect 2 0 3 0;
+#X connect 2 0 6 0;
+#X connect 2 0 9 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 0;
+#X connect 6 0 10 0;
+#X connect 6 1 7 1;
+#X connect 8 0 7 0;
+#X connect 9 0 5 1;
+#X connect 10 0 8 0;
+#X restore 507 515 pd make-table;
+#X obj 224 541 cos~;
+#X obj 224 518 -~ 0.25;
+#X obj 224 587 +~ 100;
+#X obj 224 610 tabread4~ bell-curve;
+#X obj 95 684 *~;
+#X text 131 682 <--ring mod step;
+#X text 256 635 waveshaper;
+#X text 425 791 updated for Pd version 0.37;
+#X text 157 326 frequency;
+#X text 157 342 (tenths of;
+#X text 441 698 0;
+#X text 632 697 200;
+#N canvas 0 0 450 300 graph1 0;
+#X array F12-spectrum 259 float 0;
+#X coords 0 0.51 258 -0.008 256 130 1;
+#X restore 421 308 graph;
+#X text 418 440 0;
+#X text 475 444 -- frequency --;
+#X text 644 441 2700;
+#X obj 95 756 output~;
+#X obj 94 725 hip~;
+#N canvas 122 211 558 609 fft 0;
+#X obj 23 55 inlet~;
+#X obj 210 303 inlet;
+#X obj 27 215 rfft~;
+#X obj 27 248 *~;
+#X obj 58 248 *~;
+#X obj 27 278 sqrt~;
+#X obj 334 200 block~ 4096 1;
+#X obj 27 304 biquad~ 0 0 0 0 1;
+#X text 91 216 Fourier series;
+#X text 96 269 magnitude;
+#X text 94 254 calculate;
+#X text 21 3 This subpatch computes the spectrum of the incoming signal
+with a (rectangular windowed) FFT. FFTs aren't properly introduced
+until much later.;
+#X text 83 61 signal to analyze;
+#X text 195 255 delay two samples;
+#X text 193 273 for better graphing;
+#X obj 292 79 samplerate~;
+#X obj 240 352 metro 500;
+#X obj 240 329 inlet;
+#X text 293 327 toggle to graph repeatedly;
+#X text 264 303 bang to graph once;
+#X obj 27 328 /~ 4096;
+#X obj 292 54 bang~;
+#X msg 211 413 \; pd dsp 1;
+#X obj 292 102 / 4096;
+#X obj 58 135 osc~;
+#X obj 58 163 +~ 1;
+#X obj 28 188 *~;
+#X text 113 138 hanning window;
+#X obj 254 79 0.5;
+#X obj 240 390 tabwrite~ F12-spectrum;
+#X connect 0 0 26 0;
+#X connect 1 0 22 0;
+#X connect 1 0 29 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 2 1 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 7 0;
+#X connect 7 0 20 0;
+#X connect 15 0 23 0;
+#X connect 16 0 29 0;
+#X connect 17 0 16 0;
+#X connect 17 0 22 0;
+#X connect 20 0 29 0;
+#X connect 21 0 15 0;
+#X connect 21 0 28 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 25 0 26 1;
+#X connect 26 0 2 0;
+#X connect 28 0 24 1;
+#X restore 148 725 pd fft;
+#X obj 208 704 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 208 725 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X text 229 724 <-- repeatedly;
+#X text 230 704 <-- graph once;
+#X text 17 21 Instead of using the two cosines as FM carrier oscillators
+\, we can use them as ring modulators for a natural or synthetic tone.
+Here we use waveshaping - to wit \, a sinusoid looking up a Gaussian
+bell curve. This has the nice properties that the partials are always
+positive cosines in phase \, and the spectrum spreads out smoothly
+as the index changes.;
+#X text 98 1 PAF: TWO-COSINE RING MODULATOR FOR WAVESHAPER;
+#X text 17 253 Then with ~* we do the ring modulation and we're done.
+This is the PAF (phase-aligned formant) synthesis algorithm (patented
+1993 by IRCAM).;
+#X obj 224 492 *~ 0.5;
+#X text 17 129 For phase coherency \, the waveshaper and the cosine
+pair are driven from the same phasor~ object. Since the waveshaping
+is done using a symmetric curve \, its output is at double the frequency
+of the input. So for each cycle of the phasor we compute a half-cycle
+of the sine function (by multiplying by 0.5 and subtracting 0.25 before
+the cosine lookup). We center the cosine output for lookup in a 200-point
+table containing a bell curve.;
+#X connect 0 0 6 1;
+#X connect 0 0 8 0;
+#X connect 1 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 1;
+#X connect 3 0 7 1;
+#X connect 4 0 1 1;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 31 0;
+#X connect 9 0 4 0;
+#X connect 9 0 3 0;
+#X connect 10 0 11 0;
+#X connect 11 0 15 0;
+#X connect 13 0 9 0;
+#X connect 15 0 13 0;
+#X connect 16 0 9 1;
+#X connect 16 0 5 1;
+#X connect 16 0 1 0;
+#X connect 16 0 53 0;
+#X connect 17 0 16 0;
+#X connect 21 0 24 0;
+#X connect 22 0 23 1;
+#X connect 23 0 29 0;
+#X connect 24 0 22 0;
+#X connect 27 0 23 0;
+#X connect 28 0 27 0;
+#X connect 29 0 30 0;
+#X connect 30 0 31 1;
+#X connect 31 0 44 0;
+#X connect 31 0 45 0;
+#X connect 44 0 43 0;
+#X connect 44 0 43 1;
+#X connect 46 0 45 1;
+#X connect 47 0 45 2;
+#X connect 53 0 28 0;
diff --git a/desiredata/doc/3.audio.examples/F13.paf.control.pd b/desiredata/doc/3.audio.examples/F13.paf.control.pd
new file mode 100644
index 00000000..59ebd334
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/F13.paf.control.pd
@@ -0,0 +1,164 @@
+#N canvas 89 36 756 792 12;
+#X obj 127 608 cos~;
+#X obj 127 585 *~;
+#X obj 170 608 cos~;
+#X obj 225 553 wrap~;
+#X obj 189 553 -~;
+#X obj 170 585 +~;
+#X obj 163 638 -~;
+#X obj 183 670 *~;
+#X obj 145 670 +~;
+#X obj 189 521 samphold~;
+#X floatatom 189 321 4 0 127 0 - - -;
+#X text 185 283 center;
+#X obj 189 388 line~;
+#X obj 189 365 pack 0 50;
+#X obj 80 464 phasor~;
+#X floatatom 80 370 4 0 127 0 - - -;
+#X text 71 331 fundamental;
+#X floatatom 387 384 4 0 127 0 - - -;
+#X obj 387 455 line~;
+#X obj 298 584 *~;
+#X obj 387 432 pack 0 50;
+#N canvas 94 264 600 388 make-table 0;
+#X msg 81 44 bang;
+#X obj 81 73 t b b;
+#X obj 159 142 f;
+#X obj 197 142 + 1;
+#X msg 175 112 0;
+#X obj 81 102 until;
+#X obj 161 177 t f f;
+#X obj 76 306 tabwrite bell-curve;
+#X obj 52 270 expr exp(-$f1*$f1);
+#X obj 63 168 sel 199;
+#X obj 51 241 expr ($f1-100)/25;
+#N canvas 0 0 450 300 graph4 0;
+#X array bell-curve 200 float 1;
+#A 0 1.12535e-07 1.54727e-07 2.12059e-07 2.89706e-07 3.94519e-07 5.35535e-07
+7.24633e-07 9.77371e-07 1.31404e-06 1.76105e-06 2.35258e-06 3.13275e-06
+4.15832e-06 5.50199e-06 7.25659e-06 9.54016e-06 1.25023e-05 1.63317e-05
+2.1266e-05 2.76026e-05 3.57128e-05 4.60584e-05 5.92113e-05 7.58768e-05
+9.69224e-05 0.00012341 0.000156634 0.000198167 0.000249912 0.000314163
+0.000393669 0.000491721 0.000612231 0.000759842 0.000940028 0.00115923
+0.00142498 0.00174605 0.00213263 0.00259648 0.00315111 0.00381201 0.00459678
+0.0055254 0.0066204 0.00790705 0.0094136 0.0111714 0.013215 0.0155826
+0.0183156 0.0214592 0.0250621 0.0291763 0.0338573 0.0391639 0.0451575
+0.0519019 0.0594631 0.0679081 0.0773047 0.0877205 0.0992216 0.111872
+0.125732 0.140858 0.1573 0.1751 0.194291 0.214896 0.236928 0.260383
+0.285247 0.311486 0.339053 0.367879 0.397882 0.428956 0.46098 0.493812
+0.527292 0.561244 0.595473 0.62977 0.663916 0.697676 0.730811 0.763074
+0.794216 0.823987 0.852144 0.878447 0.902668 0.924595 0.944027 0.960789
+0.974725 0.985703 0.99362 0.998401 1 0.998401 0.99362 0.985703 0.974725
+0.960789 0.944027 0.924595 0.902668 0.878447 0.852144 0.823987 0.794216
+0.763074 0.730811 0.697676 0.663916 0.62977 0.595473 0.561244 0.527292
+0.493812 0.46098 0.428956 0.397882 0.367879 0.339053 0.311486 0.285247
+0.260383 0.236928 0.214896 0.194291 0.1751 0.1573 0.140858 0.125732
+0.111872 0.0992216 0.0877205 0.0773047 0.0679081 0.0594631 0.0519019
+0.0451575 0.0391639 0.0338573 0.0291763 0.0250621 0.0214592 0.0183156
+0.0155826 0.013215 0.0111714 0.0094136 0.00790705 0.0066204 0.0055254
+0.00459678 0.00381201 0.00315111 0.00259648 0.00213263 0.00174605 0.00142498
+0.00115923 0.000940028 0.000759842 0.000612231 0.000491721 0.000393669
+0.000314163 0.000249912 0.000198167 0.000156634 0.00012341 9.69224e-05
+7.58768e-05 5.92113e-05 4.60584e-05 3.57128e-05 2.76026e-05 2.1266e-05
+1.63317e-05 1.25023e-05 9.54016e-06 7.25659e-06 5.50199e-06 4.15832e-06
+3.13275e-06 2.35258e-06 1.76105e-06 1.31404e-06 9.77371e-07 7.24633e-07
+5.35535e-07 3.94519e-07 2.89706e-07 2.12059e-07 1.54727e-07;
+#X coords 0 1 199 0 200 140 1;
+#X restore 342 85 graph;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 1 1 4 0;
+#X connect 2 0 3 0;
+#X connect 2 0 6 0;
+#X connect 2 0 9 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 0;
+#X connect 6 0 10 0;
+#X connect 6 1 7 1;
+#X connect 8 0 7 0;
+#X connect 9 0 5 1;
+#X connect 10 0 8 0;
+#X restore 536 647 pd make-table;
+#X obj 298 558 cos~;
+#X obj 298 533 -~ 0.25;
+#X obj 298 610 +~ 100;
+#X obj 298 633 tabread4~ bell-curve;
+#X obj 184 699 *~;
+#X text 330 658 waveshaper;
+#X text 31 2 CHANGING PAF CONTROLS TO NATURAL UNITS;
+#X obj 80 394 mtof;
+#X obj 211 413 expr 1/$f1;
+#X obj 189 341 mtof;
+#X text 184 298 freq.;
+#X obj 189 437 *~;
+#X text 385 357 bandwidth;
+#X obj 387 406 mtof;
+#X obj 387 491 *~;
+#X obj 387 515 *~ 25;
+#X text 18 23 The more "natural" units for describing a formant might
+be center frequency and bandwidth \, so that you can change the fundamental
+without having the formant shift up and down in parallel. Here all
+three frequencies are expressed in MIDI units. The bandwidth and center
+frequency have to be divided by the fundamental (the expr 1/$f1 takes
+its reciprocal and two *~ objects finish the division.);
+#X text 427 490 divide by fundamental;
+#X text 445 514 range for table;
+#X text 364 609 offset to middle of table;
+#X text 196 459 C.F. relative;
+#X text 197 475 to fundamental;
+#X text 69 346 (MIDI units);
+#X text 220 697 ring mod;
+#X obj 184 726 output~;
+#X text 483 762 updated for Pd version 0.37;
+#X text 19 137 Here we take a somewhat lax approach to sampholding
+the center frequency control. The frequency itself changes instantly
+\, but the center/fundamental frequency ratio waits for the next period.
+This gives a slight "chirp" if the fundamental is abruptly raised a
+couple of octaves. There's no easy way using Pd's built-in primitives
+to avoid this. Note however that there's a "paf~" extern available
+which solves this problem better and \, moreover \, runs much faster.
+;
+#X obj 298 508 *~ 0.5;
+#X connect 0 0 6 1;
+#X connect 0 0 8 0;
+#X connect 1 0 5 0;
+#X connect 1 0 0 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 1;
+#X connect 3 0 7 1;
+#X connect 4 0 1 1;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 26 0;
+#X connect 9 0 4 0;
+#X connect 9 0 3 0;
+#X connect 10 0 31 0;
+#X connect 12 0 33 0;
+#X connect 13 0 12 0;
+#X connect 14 0 9 1;
+#X connect 14 0 1 0;
+#X connect 14 0 5 1;
+#X connect 14 0 49 0;
+#X connect 15 0 29 0;
+#X connect 17 0 35 0;
+#X connect 18 0 36 0;
+#X connect 19 0 24 0;
+#X connect 20 0 18 0;
+#X connect 22 0 19 0;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 25 0 26 1;
+#X connect 26 0 46 0;
+#X connect 26 0 46 1;
+#X connect 29 0 30 0;
+#X connect 29 0 14 0;
+#X connect 30 0 33 1;
+#X connect 30 0 36 1;
+#X connect 31 0 13 0;
+#X connect 33 0 9 0;
+#X connect 35 0 20 0;
+#X connect 36 0 37 0;
+#X connect 37 0 19 1;
+#X connect 49 0 23 0;
diff --git a/desiredata/doc/3.audio.examples/G01.delay.pd b/desiredata/doc/3.audio.examples/G01.delay.pd
new file mode 100644
index 00000000..6b03ed12
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G01.delay.pd
@@ -0,0 +1,48 @@
+#N canvas 19 35 777 377 12;
+#X text 103 7 DELAYS;
+#X text 248 79 The delwrite~ object creates the delay line \; you give
+it a name and a size in milliseconds. Each delwrite~ should have a
+different name.;
+#N canvas 0 0 548 248 sample 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array G01-tab 61079 float 0;
+#X coords 0 1 61078 -1 200 140 1;
+#X restore 100 20 graph;
+#X obj 61 176 loadbang;
+#X obj 60 221 soundfiler;
+#X msg 61 199 read -resize ../sound/voice.wav G01-tab;
+#X connect 1 0 3 0;
+#X connect 3 0 2 0;
+#X restore 253 337 pd sample;
+#X floatatom 38 196 4 0 999 0 - - -;
+#X text 81 195 <-- delay time;
+#X text 46 230 read from delay line;
+#X obj 38 249 delread~ delay1;
+#X obj 14 87 tabplay~ G01-tab;
+#X obj 14 63 metro 1000;
+#X obj 14 39 loadbang;
+#X text 40 146 write to delay line;
+#X obj 16 303 output~;
+#X obj 15 275 +~;
+#X obj 24 165 delwrite~ delay1 1000;
+#X text 499 348 updated for Pd version 0.37-1;
+#X text 248 24 You can delay a signal using the delwrite~ and delread~
+objects. In this example \, a sample loops continuously and is added
+to a delayed copy of itself.;
+#X text 247 215 The delread~ object always delays the signal an integer
+number of samples and does no interpolation.;
+#X text 28 107 test signal to delay;
+#X text 248 130 Delread~'s arguments are the name of a delwrite (of
+which there should be exactly one) and an optional delay time in milliseconds
+between 0 and the length of the delay line. Each delwrite~ may have
+as many delread~s as you wish \, which can then function as multiple
+delay taps.;
+#X text 114 209 (msec);
+#X connect 3 0 6 0;
+#X connect 6 0 12 1;
+#X connect 7 0 12 0;
+#X connect 7 0 13 0;
+#X connect 8 0 7 0;
+#X connect 9 0 8 0;
+#X connect 12 0 11 0;
+#X connect 12 0 11 1;
diff --git a/desiredata/doc/3.audio.examples/G02.delay.loop.pd b/desiredata/doc/3.audio.examples/G02.delay.loop.pd
new file mode 100644
index 00000000..ba355b7c
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G02.delay.loop.pd
@@ -0,0 +1,44 @@
+#N canvas 130 225 601 527 12;
+#X floatatom 36 197 5 -30 130 0 - - -;
+#X floatatom 58 322 0 0 0 0 - - -;
+#X text 88 196 <-- pitch;
+#X text 88 321 <-- delay time;
+#X text 287 420 write to delay line;
+#X text 246 346 read from delay line;
+#X text 72 393 add the original and the delayed signal;
+#X obj 36 233 mtof;
+#X msg 111 233 1;
+#X obj 37 282 *~;
+#X obj 37 394 +~;
+#X obj 58 370 *~ 0.7;
+#X text 116 370 feedback gain;
+#X text 57 9 DELAYS WITH FEEDBACK;
+#X text 33 39 You can feed the result of a delread~ module back into
+its own delwrite~ \, as long as you're careful about stability. For
+delays below 30 msec \, you can frequently hear the resonant pitch.
+For longer delay times you get the famous old delay loop effect.;
+#X obj 111 281 *~;
+#X obj 111 257 adsr 1 100 1000 0 1000;
+#X obj 37 463 output~;
+#X text 32 118 We've added an amplitude control here so that the test
+oscillator only speaks while you're dragging the pitch up and down.
+Be sure to try shift-dragging on the pitch control.;
+#X text 330 495 updated for Pd version 0.37-1;
+#X obj 36 257 phasor~;
+#X obj 58 346 delread~ G02-del 160;
+#X obj 77 419 delwrite~ G02-del 2000;
+#X connect 0 0 7 0;
+#X connect 0 0 8 0;
+#X connect 1 0 21 0;
+#X connect 7 0 20 0;
+#X connect 8 0 16 0;
+#X connect 9 0 10 0;
+#X connect 10 0 17 0;
+#X connect 10 0 17 1;
+#X connect 10 0 22 0;
+#X connect 11 0 10 1;
+#X connect 15 0 9 1;
+#X connect 16 0 15 0;
+#X connect 16 0 15 1;
+#X connect 20 0 9 0;
+#X connect 21 0 11 0;
diff --git a/desiredata/doc/3.audio.examples/G03.delay.variable.pd b/desiredata/doc/3.audio.examples/G03.delay.variable.pd
new file mode 100644
index 00000000..c2ece553
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G03.delay.variable.pd
@@ -0,0 +1,77 @@
+#N canvas 100 17 660 504 12;
+#X obj 33 305 hip~ 10;
+#X floatatom 301 221 0 0 0 0 - - -;
+#X obj 301 269 line~;
+#X obj 301 245 pack 0 100;
+#X floatatom 226 191 0 0 0 0 - - -;
+#X floatatom 382 297 0 0 0 0 - - -;
+#X obj 382 369 line~;
+#X obj 382 345 pack 0 100;
+#X obj 382 321 * 0.01;
+#X floatatom 113 166 0 0 0 0 - - -;
+#X obj 113 237 line~;
+#X obj 113 213 pack 0 100;
+#X obj 33 257 *~;
+#X obj 33 281 cos~;
+#X floatatom 33 134 0 0 0 0 - - -;
+#X obj 33 158 mtof;
+#X obj 33 182 * 0.5;
+#X obj 33 329 clip~ -0.2 0.2;
+#X obj 113 189 * 0.01;
+#X obj 33 353 +~;
+#X obj 361 395 *~;
+#X obj 226 287 *~;
+#X obj 226 215 / 100;
+#X obj 33 377 hip~ 5;
+#X obj 226 263 +~ 1;
+#X obj 226 239 osc~ 0;
+#X obj 226 311 +~ 1.46;
+#X text 154 164 <-- timbre;
+#X text 66 135 <-- pitch;
+#X text 279 191 <-- cycle frequency (hundredths);
+#X text 354 222 <-- cycle depth (msec);
+#X text 431 298 <-- feedback (hundredths);
+#X text 89 6 VARIABLE DELAYS;
+#X obj 33 206 osc~ 0;
+#X text 46 32 This is a fuzzed FM generator going into a delay loop
+\, this time using a variable delay object (vd~). You can get several
+interesting effects this way. We have taken the precaution of clipping
+inside the loop to avoid instabilities. You can push the loop gain
+past 1 if you want \, it will just oscillate.;
+#X obj 32 409 output~;
+#X obj 226 335 vd~ G03-del;
+#X obj 361 443 delwrite~ G03-del 1000;
+#X obj 361 419 clip~ -1 1;
+#X text 387 481 updated for Pd version 0.37-1;
+#X connect 0 0 17 0;
+#X connect 1 0 3 0;
+#X connect 2 0 21 1;
+#X connect 3 0 2 0;
+#X connect 4 0 22 0;
+#X connect 5 0 8 0;
+#X connect 6 0 20 1;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 18 0;
+#X connect 10 0 12 1;
+#X connect 11 0 10 0;
+#X connect 12 0 13 0;
+#X connect 13 0 0 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 33 0;
+#X connect 17 0 19 0;
+#X connect 18 0 11 0;
+#X connect 19 0 23 0;
+#X connect 20 0 38 0;
+#X connect 21 0 26 0;
+#X connect 22 0 25 0;
+#X connect 23 0 20 0;
+#X connect 23 0 35 0;
+#X connect 23 0 35 1;
+#X connect 24 0 21 0;
+#X connect 25 0 24 0;
+#X connect 26 0 36 0;
+#X connect 33 0 12 0;
+#X connect 36 0 19 1;
+#X connect 38 0 37 0;
diff --git a/desiredata/doc/3.audio.examples/G04.control.blocksize.pd b/desiredata/doc/3.audio.examples/G04.control.blocksize.pd
new file mode 100644
index 00000000..efae501a
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G04.control.blocksize.pd
@@ -0,0 +1,79 @@
+#N canvas 100 17 637 513 12;
+#N canvas 195 311 647 354 delay-writer 0;
+#X obj 86 220 inlet~;
+#X obj 86 326 outlet~;
+#X obj 392 197 block~ 1;
+#X obj 164 267 *~ 0.99;
+#X obj 87 272 +~;
+#X obj 165 221 inlet;
+#X text 80 7 Because of the feedback \, the delwrite~ has to be computed
+after the delread~. So we set the blocksize to 1 to minimize the resulting
+delay.;
+#X text 390 219 this object sets the;
+#X text 389 236 block size for audio;
+#X text 388 255 computations in this;
+#X obj 165 244 delread~ G04-del;
+#X obj 98 302 delwrite~ G04-del 1000;
+#X text 79 183 incoming;
+#X text 81 198 pulses;
+#X text 165 182 delay;
+#X text 166 197 time;
+#X text 388 273 window. Must be a;
+#X text 388 292 power of two.;
+#X text 77 60 The smaller the blocksize the more expensive the computations
+are \, so don't reduce it lower than you have to. Also \, it's a good
+idea to isolate the portion of the patch that requires the smaller
+block size \, and only run that portion that way. Here \, the pulses
+that excite the delay line are computed outside this window \, and
+the output level control as well.;
+#X connect 0 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 1 0;
+#X connect 4 0 11 0;
+#X connect 5 0 10 0;
+#X connect 10 0 3 0;
+#X restore 153 420 pd delay-writer;
+#X obj 283 384 expr 1000/$f1;
+#X obj 283 358 mtof;
+#X msg 153 355 1;
+#X msg 192 355 0;
+#X obj 153 254 metro 500;
+#X obj 283 304 random 60;
+#X obj 153 228 loadbang;
+#X obj 283 330 + 30;
+#X text 86 9 CONTROLLING DELAY WITH BLOCK~;
+#X text 299 420 <-- here is the delay loop;
+#X text 63 43 In situations where a delay read feeds back to a delay
+write \, the minimum possible delay you can achieve is one block \,
+which by default is 64 samples \, or 1.45 msec at 44100 Hz. You can
+shorten the minimum delay by changing the block size. Do this in a
+subpatch (open it to see how).;
+#X obj 153 449 output~;
+#X obj 153 387 vline~;
+#X text 371 487 updated for Pd version 0.37-1;
+#X text 61 124 Here we use this principle to make a harpisichord-like
+sound by sending pulses into a recirculating delay line (which imitates
+the travel of the wave up and down the harpsichord string.) This is
+related to Karplus-Strong synthesis \, but the idea is probably much
+older than their paper.;
+#X text 33 328 this makes;
+#X text 32 346 a rectangular;
+#X text 31 384 long.;
+#X text 409 366 length of delay line is;
+#X text 410 384 1000/(frequency);
+#X obj 192 329 del 1;
+#X text 32 364 pulse 1 msec;
+#X connect 0 0 12 0;
+#X connect 0 0 12 1;
+#X connect 1 0 0 1;
+#X connect 2 0 1 0;
+#X connect 3 0 13 0;
+#X connect 4 0 13 0;
+#X connect 5 0 3 0;
+#X connect 5 0 6 0;
+#X connect 5 0 21 0;
+#X connect 6 0 8 0;
+#X connect 7 0 5 0;
+#X connect 8 0 2 0;
+#X connect 13 0 0 0;
+#X connect 21 0 4 0;
diff --git a/desiredata/doc/3.audio.examples/G05.execution.order.pd b/desiredata/doc/3.audio.examples/G05.execution.order.pd
new file mode 100644
index 00000000..d50c97a9
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G05.execution.order.pd
@@ -0,0 +1,79 @@
+#N canvas 100 17 683 605 12;
+#X floatatom 424 290 0 0 100 0 - - -;
+#X obj 59 404 +~;
+#X text 86 9 ORDER OF EXECUTION OF DELWRITE~ AND DELREAD~/VD~;
+#X text 42 29 If you're writing to and reading from a delay line \,
+you have to get the write sorted before the read or else you'll never
+get less than a block's delay. This patch compares a "wrong" flanger
+with a "right" one:;
+#X text 471 284 <-- delay in samples;
+#X obj 94 490 *~;
+#X obj 94 466 -~;
+#N canvas 0 0 600 400 delay-writer 0;
+#X obj 96 107 inlet~;
+#X obj 96 180 outlet~;
+#X obj 116 144 delwrite~ G05-d2 1000;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
+#X restore 283 403 pd delay-writer;
+#N canvas 0 0 280 330 delay-reader 0;
+#X obj 96 107 inlet~;
+#X obj 89 267 outlet~;
+#X obj 112 163 inlet~;
+#X obj 89 237 +~;
+#X obj 112 198 vd~ G05-d2;
+#X connect 0 0 3 0;
+#X connect 2 0 4 0;
+#X connect 3 0 1 0;
+#X connect 4 0 3 1;
+#X restore 282 431 pd delay-reader;
+#X obj 59 490 +~;
+#X obj 424 313 / 44.1;
+#X obj 59 534 output~;
+#X obj 135 490 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X text 159 490 <-- off to hear left-hand side \; on to hear right
+hand side.;
+#X text 393 575 updated for Pd version 0.37-1;
+#X obj 424 337 pack 0 30;
+#N canvas 0 0 450 300 pulse 0;
+#X obj 64 197 outlet~;
+#X obj 63 93 phasor~ 50;
+#X obj 63 119 *~ 100;
+#X obj 63 144 clip~ 0.75 1.25;
+#X obj 64 170 cos~;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X restore 60 302 pd pulse;
+#X obj 81 354 delwrite~ G05-d1 1000;
+#X obj 82 381 vd~ G05-d1;
+#X obj 424 362 line~;
+#X text 44 96 To get them to go off in the correct order \, put the
+delread~ and vd~ objects in subpatches. The audio connections between
+the subpatches force the "reader" to be sorted after the "writer".
+DSP sorting in Pd follows the hierarchy of subpatches.;
+#X text 43 175 To hear the difference scroll the delay time between
+0 and 100 samples. The patch at left doesn't let you get below 64 samples
+\, but the patch at right can go all the way down to one sample.;
+#X text 45 241 You can use the same strategy to avoid picking up unwanted
+64-sample delays in send~/receive~ and throw~/catch~ pairs.;
+#X connect 0 0 10 0;
+#X connect 1 0 6 1;
+#X connect 1 0 9 0;
+#X connect 5 0 9 1;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 8 0 6 0;
+#X connect 9 0 11 0;
+#X connect 9 0 11 1;
+#X connect 10 0 15 0;
+#X connect 12 0 5 1;
+#X connect 15 0 19 0;
+#X connect 16 0 1 0;
+#X connect 16 0 7 0;
+#X connect 16 0 17 0;
+#X connect 18 0 1 1;
+#X connect 19 0 8 1;
+#X connect 19 0 18 0;
diff --git a/desiredata/doc/3.audio.examples/G06.octave.doubler.pd b/desiredata/doc/3.audio.examples/G06.octave.doubler.pd
new file mode 100644
index 00000000..a95fe24e
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G06.octave.doubler.pd
@@ -0,0 +1,114 @@
+#N canvas 110 17 775 614 12;
+#X obj 463 303 loadbang;
+#X obj 553 222 adc~ 1;
+#X obj 463 358 soundfiler;
+#X obj 31 394 output~;
+#X obj 554 269 tabwrite~ E03-table;
+#X msg 463 330 read ../sound/voice.wav E03-table;
+#X obj 58 83 fiddle~ 2048;
+#X obj 126 106 unpack;
+#X obj 126 130 moses 1;
+#X obj 199 108 mtof;
+#N canvas 0 0 446 202 /SUBPATCH/ 0;
+#X obj 261 30 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X obj 100 20 inlet~;
+#X obj 99 87 *~;
+#X obj 98 159 outlet~;
+#X text 381 181 corner;
+#X connect 0 0 2 1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X coords 0 0 100 100 40 18 1;
+#X restore 77 329 pd;
+#N canvas 0 0 446 202 /SUBPATCH/ 0;
+#X obj 261 30 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 100 20 inlet~;
+#X obj 99 87 *~;
+#X obj 98 159 outlet~;
+#X text 381 181 corner;
+#X connect 0 0 2 1;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X coords 0 0 100 100 40 18 1;
+#X restore 31 329 pd;
+#N canvas 414 195 613 302 looper 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array E03-table 44103 float 0;
+#X coords 0 1.02 44103 -1.02 200 130 1;
+#X restore 349 22 graph;
+#X text 347 161 ---- 44103 samples ----;
+#X obj 35 77 +~ 1;
+#X obj 35 25 phasor~ 1;
+#X obj 35 50 *~ 44100;
+#X obj 35 106 tabread4~ E03-table;
+#X obj 35 132 outlet~;
+#X text 46 238 one-second sample reader loop. You can replace this
+with an adc~ if you want to go live.;
+#X connect 2 0 5 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X restore 31 30 pd looper;
+#X text 547 309 re-read original sample;
+#X obj 565 246 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 584 244 <-- record a sample;
+#X text 152 314 on/off for original;
+#X text 123 330 <--and processed sounds;
+#X text 240 3 OCTAVE DOUBLING VIA VARIABLE COMB FILTER;
+#X obj 31 367 +~;
+#X obj 252 157 samplerate~;
+#X obj 199 156 t f b;
+#X obj 59 58 delwrite~ G06-del 100;
+#X obj 79 234 delread~ G06-del;
+#X obj 101 282 vd~ G06-del;
+#X obj 78 306 +~;
+#X obj 230 210 +;
+#X obj 199 131 expr 500/$f1;
+#X obj 230 262 line~;
+#X obj 230 239 pack 0 20;
+#X text 243 108 fundamental frequency;
+#X text 311 131 1/2 period \, in msec;
+#X text 286 201 estimate fiddle~ delay;
+#X text 491 592 updated for Pd version 0.37-1;
+#X text 159 401 We already saw how to use ring modulation to alias
+a pitched sound down one octave. Here we do the reverse: filter out
+all odd harmonics using a variable-delay comb filter tuned one octave
+above the incoming sound. We use two taps into the delay line. The
+fixed one (delread~) adjusts for the delayed output of fiddle~. The
+variable one (vd~) adds to this an additional delay equal to 1/2 the
+measured period of the incoming sound. THese two are added. Odd harmonics
+are 180 degrees out of phase at the two taps and cancel. Even harmonics
+get through - so the sound goes up an octave \, without denaturing
+the timbre as a speed-up would.;
+#X obj 252 183 expr 2048000/$f1;
+#X text 288 216 as one window (in msec);
+#X connect 0 0 5 0;
+#X connect 1 0 4 0;
+#X connect 5 0 2 0;
+#X connect 6 2 7 0;
+#X connect 7 0 8 0;
+#X connect 8 1 9 0;
+#X connect 9 0 27 0;
+#X connect 10 0 19 1;
+#X connect 11 0 19 0;
+#X connect 12 0 6 0;
+#X connect 12 0 11 0;
+#X connect 12 0 22 0;
+#X connect 14 0 4 0;
+#X connect 19 0 3 0;
+#X connect 19 0 3 1;
+#X connect 20 0 35 0;
+#X connect 21 0 26 0;
+#X connect 21 1 20 0;
+#X connect 23 0 25 0;
+#X connect 24 0 25 1;
+#X connect 25 0 10 0;
+#X connect 26 0 29 0;
+#X connect 27 0 21 0;
+#X connect 28 0 24 0;
+#X connect 29 0 28 0;
+#X connect 35 0 26 1;
+#X connect 35 0 23 0;
diff --git a/desiredata/doc/3.audio.examples/G07.shaker.pd b/desiredata/doc/3.audio.examples/G07.shaker.pd
new file mode 100644
index 00000000..1da97e8e
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G07.shaker.pd
@@ -0,0 +1,80 @@
+#N canvas 159 89 808 531 12;
+#X obj 21 438 output~;
+#X obj 21 411 +~;
+#X obj 33 192 delwrite~ G07-del 30;
+#X obj 99 391 line~;
+#X obj 63 391 *~;
+#X obj 93 335 line~;
+#X obj 57 335 *~;
+#X obj 80 281 line~;
+#X obj 44 281 *~;
+#X obj 58 221 line~;
+#X obj 22 221 *~;
+#X text 51 8 THE "SHAKER";
+#X obj 279 86 + 1;
+#X obj 279 109 mod 4;
+#X obj 244 83 f;
+#X obj 284 160 random 1000;
+#X obj 244 135 t f b;
+#X obj 244 37 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X floatatom 347 34 5 10 1000 0 - - -;
+#X obj 244 242 route 0 1 2 3;
+#X obj 44 255 delread~ G07-del 30;
+#X obj 23 165 phasor~ 80;
+#X obj 57 309 delread~ G07-del 17;
+#X obj 63 365 delread~ G07-del 11;
+#X obj 347 59 * 4;
+#X obj 284 187 expr 2 * $f1/1000 - 0.7;
+#X floatatom 23 142 5 30 1000 0 - - -;
+#X obj 244 58 metro 50;
+#X obj 244 218 pack 0 0 200;
+#X text 23 118 frequency;
+#X text 225 17 on/off;
+#X text 344 13 time constant (msec);
+#X text 536 511 updated for Pd version 0.37-1;
+#X text 266 306 This is a time-varying comb filter \, combining four
+delayed copies of the input signal. The amplitude of each delayed copy
+varies randomly between -0.7 and +1.3. Each time the metronome goes
+off \, one of the four delay's gains is changed in sequence. The change
+occurs over the next four ticks of the metronome (so \, if the metronome
+ticks every 50 msec \, each message to a line~ has a second argument
+of 200.);
+#X text 268 424 Any collection of four gains for the four delayed copies
+of the signal (including the original) defines some sort of irregular
+comb filter. The peaks and valleys of the comb filter shift constantly
+as the gains change to new \, random values.;
+#X connect 1 0 0 0;
+#X connect 1 0 0 1;
+#X connect 3 0 4 1;
+#X connect 4 0 1 1;
+#X connect 5 0 6 1;
+#X connect 6 0 1 1;
+#X connect 7 0 8 1;
+#X connect 8 0 1 1;
+#X connect 9 0 10 1;
+#X connect 10 0 1 0;
+#X connect 12 0 13 0;
+#X connect 13 0 14 1;
+#X connect 14 0 12 0;
+#X connect 14 0 16 0;
+#X connect 15 0 25 0;
+#X connect 16 0 28 0;
+#X connect 16 1 15 0;
+#X connect 17 0 27 0;
+#X connect 18 0 24 0;
+#X connect 18 0 27 1;
+#X connect 19 0 9 0;
+#X connect 19 1 7 0;
+#X connect 19 2 5 0;
+#X connect 19 3 3 0;
+#X connect 20 0 8 0;
+#X connect 21 0 2 0;
+#X connect 21 0 10 0;
+#X connect 22 0 6 0;
+#X connect 23 0 4 0;
+#X connect 24 0 28 2;
+#X connect 25 0 28 1;
+#X connect 26 0 21 0;
+#X connect 27 0 14 0;
+#X connect 28 0 19 0;
diff --git a/desiredata/doc/3.audio.examples/G08.reverb.pd b/desiredata/doc/3.audio.examples/G08.reverb.pd
new file mode 100644
index 00000000..09941436
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G08.reverb.pd
@@ -0,0 +1,253 @@
+#N canvas 390 121 616 352 12;
+#N canvas 0 0 499 321 test-input 0;
+#X obj 75 253 outlet~;
+#X obj 74 201 -~;
+#X obj 74 177 *~ 3;
+#X obj 111 183 *~ 2;
+#X floatatom 74 81 0 0 0 0 - - -;
+#X obj 74 153 clip~ 0 0.667;
+#X text 124 80 <-- pitch;
+#X obj 74 105 mtof;
+#X msg 195 142 1;
+#X obj 74 225 *~;
+#X obj 74 129 phasor~ 0;
+#X obj 195 190 tabread4~ dbtorms;
+#X obj 195 166 adsr 100 100 2000 0 2000;
+#X obj 73 54 inlet;
+#N canvas 0 0 600 392 conversion-tables 0;
+#N canvas 0 0 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 1e-04 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 70 45 graph;
+#X text 272 138 0;
+#X text 274 38 10;
+#X text 89 148 ------ 123 samples ------;
+#N canvas 0 0 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 77 222 graph;
+#X text 87 330 ------ 130 samples ------;
+#X text 286 315 0;
+#X text 288 215 12000;
+#N canvas 244 212 672 338 regenerate-tables 0;
+#X msg 415 84 bang;
+#X obj 415 113 t b b;
+#X obj 474 177 f;
+#X obj 512 177 + 1;
+#X msg 483 147 0;
+#X obj 415 142 until;
+#X obj 474 211 t f f;
+#X obj 414 238 mtof;
+#X obj 405 202 sel 129;
+#X obj 413 264 tabwrite mtof;
+#X obj 35 227 moses 2;
+#X msg 19 76 bang;
+#X obj 19 105 t b b;
+#X obj 90 166 f;
+#X obj 128 166 + 1;
+#X msg 112 138 0;
+#X obj 19 134 until;
+#X obj 11 194 sel 122;
+#X msg 35 258 0;
+#X obj 79 259 dbtorms;
+#X obj 90 194 t f f;
+#X obj 35 291 tabwrite dbtorms;
+#X text 18 49 bang to recalculate dbtorms table;
+#X text 356 50 bang to recalculate the mtof table;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 1 1 4 0;
+#X connect 2 0 3 0;
+#X connect 2 0 6 0;
+#X connect 2 0 8 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 6 1 9 1;
+#X connect 7 0 9 0;
+#X connect 8 0 5 1;
+#X connect 10 0 18 0;
+#X connect 10 1 19 0;
+#X connect 11 0 12 0;
+#X connect 12 0 16 0;
+#X connect 12 1 15 0;
+#X connect 13 0 14 0;
+#X connect 13 0 17 0;
+#X connect 13 0 20 0;
+#X connect 14 0 13 1;
+#X connect 15 0 13 1;
+#X connect 16 0 13 0;
+#X connect 17 0 16 1;
+#X connect 18 0 21 0;
+#X connect 19 0 21 0;
+#X connect 20 0 10 0;
+#X connect 20 1 21 1;
+#X restore 375 76 pd regenerate-tables;
+#X restore 260 101 pd conversion-tables;
+#X connect 1 0 9 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 1;
+#X connect 4 0 7 0;
+#X connect 4 0 8 0;
+#X connect 5 0 2 0;
+#X connect 7 0 10 0;
+#X connect 8 0 12 0;
+#X connect 9 0 0 0;
+#X connect 10 0 3 0;
+#X connect 10 0 5 0;
+#X connect 11 0 9 1;
+#X connect 12 0 11 0;
+#X connect 13 0 4 0;
+#X restore 39 114 pd test-input;
+#X text 135 6 REVERBERATOR;
+#X floatatom 39 87 0 10 130 0 - - -;
+#X text 76 87 <-- pitch;
+#N canvas 96 169 958 610 reverb 0;
+#X obj 13 19 inlet~;
+#X obj 13 43 reverb-echo echo-del1 5.43216;
+#X obj 277 215 +~;
+#X obj 319 215 +~;
+#X obj 67 276 outlet~;
+#X obj 137 276 outlet~;
+#X obj 238 334 +~;
+#X obj 347 335 +~;
+#X obj 280 334 -~;
+#X obj 387 334 -~;
+#X obj 237 390 +~;
+#X obj 281 391 +~;
+#X obj 325 392 -~;
+#X obj 364 392 -~;
+#X obj 324 474 *~ 0;
+#X obj 282 473 *~ 0;
+#X obj 237 472 *~ 0;
+#X obj 365 475 *~ 0;
+#X obj 632 365 inlet;
+#X obj 632 437 / 200;
+#X obj 632 389 min 100;
+#X obj 632 412 max 0;
+#X obj 238 583 delwrite~ loop-del1 60;
+#X obj 283 561 delwrite~ loop-del2 71.9345;
+#X obj 364 515 delwrite~ loop-del4 95.945;
+#X obj 298 154 delread~ loop-del1 60;
+#X obj 340 179 delread~ loop-del2 71.9345;
+#X obj 408 233 delread~ loop-del4 95.945;
+#X obj 386 208 delread~ loop-del3 86.7545;
+#X obj 325 538 delwrite~ loop-del3 86.7545;
+#X obj 13 67 reverb-echo echo-del2 8.45346;
+#X obj 13 91 reverb-echo echo-del3 13.4367;
+#X obj 13 115 reverb-echo echo-del4 21.5463;
+#X obj 13 139 reverb-echo echo-del5 34.3876;
+#X obj 13 163 reverb-echo echo-del6 55.5437;
+#X text 286 42 "early echo" generators \, which also increase echo
+density. Open one to see what they do.;
+#X text 300 115 Get the outputs of the recirculating delays. Add the
+inputs to two of them.;
+#X text 420 313 Do a power-conserving mix of them in pairs. First combine
+(1 \, 2) and (3 \, 4)...;
+#X text 402 385 ...then (1 \, 3) and (2 \, 4);
+#X text 446 469 The two mixing stages have a combined gain of 2 \,
+so the recirculation gain is limited to 0.5.;
+#X text 586 542 Put the signals back into the;
+#X text 584 557 recirculating delays.;
+#X text 29 296 Tap outputs from here.;
+#X text 708 381 0 to 100 to control reverb;
+#X text 719 396 time.;
+#X text 691 364 feedback gain on a scale of;
+#X connect 0 0 1 0;
+#X connect 1 0 30 0;
+#X connect 1 1 30 1;
+#X connect 2 0 4 0;
+#X connect 2 0 6 0;
+#X connect 2 0 8 0;
+#X connect 3 0 5 0;
+#X connect 3 0 6 1;
+#X connect 3 0 8 1;
+#X connect 6 0 10 0;
+#X connect 6 0 12 0;
+#X connect 7 0 12 1;
+#X connect 7 0 10 1;
+#X connect 8 0 11 0;
+#X connect 8 0 13 0;
+#X connect 9 0 11 1;
+#X connect 9 0 13 1;
+#X connect 10 0 16 0;
+#X connect 11 0 15 0;
+#X connect 12 0 14 0;
+#X connect 13 0 17 0;
+#X connect 14 0 29 0;
+#X connect 15 0 23 0;
+#X connect 16 0 22 0;
+#X connect 17 0 24 0;
+#X connect 18 0 20 0;
+#X connect 19 0 17 1;
+#X connect 19 0 16 1;
+#X connect 19 0 15 1;
+#X connect 19 0 14 1;
+#X connect 20 0 21 0;
+#X connect 21 0 19 0;
+#X connect 25 0 2 1;
+#X connect 26 0 3 1;
+#X connect 27 0 7 1;
+#X connect 27 0 9 1;
+#X connect 28 0 7 0;
+#X connect 28 0 9 0;
+#X connect 30 0 31 0;
+#X connect 30 1 31 1;
+#X connect 31 0 32 0;
+#X connect 31 1 32 1;
+#X connect 32 0 33 0;
+#X connect 32 1 33 1;
+#X connect 33 0 34 0;
+#X connect 33 1 34 1;
+#X connect 34 0 2 0;
+#X connect 34 1 3 0;
+#X restore 58 179 pd reverb;
+#X floatatom 134 155 0 0 100 0 - - -;
+#X text 169 155 <-- feedback (100 maximum);
+#X obj 38 206 output~;
+#X text 342 317 updated for Pd version 0.37-1;
+#X text 149 180 <-- open to see how it works;
+#X text 34 269 Many improvements are possible. Much better reverberators
+can be found in the "extras" library.;
+#X text 29 30 Here is a simple recirculating reverberator. "Feedback"
+should be between 0 and 100 - if 100 \, the reverberation lasts forever.
+;
+#X connect 0 0 4 0;
+#X connect 0 0 7 0;
+#X connect 2 0 0 0;
+#X connect 4 0 7 0;
+#X connect 4 1 7 1;
+#X connect 5 0 4 1;
diff --git a/desiredata/doc/3.audio.examples/G09.pitchshift.pd b/desiredata/doc/3.audio.examples/G09.pitchshift.pd
new file mode 100644
index 00000000..7687dc66
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/G09.pitchshift.pd
@@ -0,0 +1,162 @@
+#N canvas 93 36 964 554 12;
+#X floatatom 19 87 0 0 0 0 - - -;
+#X obj 82 358 *~;
+#X obj 205 295 line~;
+#X floatatom 237 112 0 0 0 0 - - -;
+#X text 68 9 PITCH SHIFTER;
+#X obj 205 269 pack 0 200;
+#X obj 237 86 r window;
+#X obj 19 61 r transpose;
+#X obj 19 143 exp;
+#X floatatom 19 169 6 0 0 0 - - -;
+#X obj 19 259 /;
+#X obj 146 189 * 0.001;
+#X obj 314 365 line~;
+#X obj 314 340 pack 0 200;
+#X floatatom 314 289 0 0 0 0 - - -;
+#X obj 314 263 r delay;
+#X obj 82 384 +~;
+#X obj 19 410 cos~;
+#X obj 19 437 *~;
+#X obj 19 466 +~;
+#X obj 106 317 wrap~;
+#X obj 251 360 *~;
+#X obj 251 393 +~;
+#X obj 188 420 cos~;
+#X obj 188 447 *~;
+#X msg 492 56 \; transpose 0 \; window 100 \; delay 0;
+#X obj 492 30 loadbang;
+#X obj 146 216 t b f;
+#X floatatom 19 285 6 0 0 0 - - -;
+#X obj 106 290 +~ 0.5;
+#X obj 19 358 -~ 0.5;
+#X obj 19 384 *~ 0.5;
+#X obj 188 359 -~ 0.5;
+#X obj 188 392 *~ 0.5;
+#X obj 19 196 - 1;
+#X obj 19 117 * 0.05776;
+#X obj 19 222 * -1;
+#X text 53 86 <-- transposition;
+#X text 96 99 (halftones);
+#X text 82 163 speed;
+#X text 81 177 change;
+#X text 281 111 <--window (msec);
+#X text 54 252 tape head;
+#N canvas 0 0 612 637 test-input 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array array1 155948 float 0;
+#X coords 0 1 155947 -1 200 150 1;
+#X restore 150 141 graph;
+#X obj 139 518 tabread4~ array1;
+#X obj 139 333 r totsamps;
+#X obj 139 413 /;
+#X obj 139 465 *~ 0;
+#X obj 139 439 phasor~ 0;
+#X obj 139 492 +~ 1;
+#X msg 139 386 44100;
+#X obj 139 360 t b f;
+#X obj 182 469 r totsamps;
+#X text 153 538 sample loop for;
+#X text 153 555 test signal;
+#X obj 162 30 loadbang;
+#X obj 139 590 outlet~;
+#X obj 393 169 r readfile;
+#X obj 393 199 symbol;
+#X msg 392 228 read -resize \$1 array1;
+#X obj 392 256 soundfiler;
+#X obj 392 284 s totsamps;
+#X msg 161 64 \; readfile ../sound/bell.aiff;
+#X connect 1 0 13 0;
+#X connect 2 0 8 0;
+#X connect 3 0 5 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 6 0 1 0;
+#X connect 7 0 3 0;
+#X connect 8 0 7 0;
+#X connect 8 1 3 1;
+#X connect 9 0 4 1;
+#X connect 12 0 19 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X restore 264 11 pd test-input;
+#X text 425 153 This is a classic rotating-tape-head style pitch shifter
+using the vd~ variable delay object. Ther are two moving tape heads
+\, each of which is loudest at the middle of its trajectory \, and
+enveloped out at the moment it has to jump back (or forward) to start
+another scratch. Most of the brain work is in computing how fast the
+tape heads have to move to get the desired transposition.;
+#X text 425 272 The "window size" is the total trajectory of the read
+points in the delay line \, in milliseconds. The delay times are controlled
+by a phasor~ object. The second delay time \, 180 degrees out of phase
+from the first one \, is computed using the "wrap" object.;
+#X text 423 362 The "window size" is the total trajectory of the read
+points in the delay line \, in milliseconds. The delay times are controlled
+by a phasor~ object. The second delay time \, 180 degrees out of phase
+from the first one \, is computed using the "wrap" object.;
+#X text 422 454 The cos~ objects compute the fadein and fadeout of
+the two delay line outputs. They each traverse the positive half of
+the cosine waveform (phase -0.25 to +0.25) over the time the phase
+goes from one end to the other.;
+#X obj 19 493 output~;
+#X obj 19 316 phasor~;
+#X text 689 534 updated for Pd version 0.37-1;
+#X obj 314 316 max 1.5;
+#X text 317 222 delay;
+#X text 314 240 (msec);
+#X obj 237 139 max 1;
+#X text 55 265 rotation freq;
+#X obj 82 410 vd~ G09-del;
+#X obj 251 422 vd~ G09-del;
+#X obj 264 42 delwrite~ G09-del 5000;
+#X connect 0 0 35 0;
+#X connect 1 0 16 0;
+#X connect 2 0 1 1;
+#X connect 2 0 21 1;
+#X connect 3 0 54 0;
+#X connect 5 0 2 0;
+#X connect 6 0 3 0;
+#X connect 7 0 0 0;
+#X connect 8 0 9 0;
+#X connect 9 0 34 0;
+#X connect 10 0 28 0;
+#X connect 11 0 27 0;
+#X connect 12 0 16 1;
+#X connect 12 0 22 1;
+#X connect 13 0 12 0;
+#X connect 14 0 51 0;
+#X connect 15 0 14 0;
+#X connect 16 0 56 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 19 0 48 0;
+#X connect 19 0 48 1;
+#X connect 20 0 21 0;
+#X connect 20 0 32 0;
+#X connect 21 0 22 0;
+#X connect 22 0 57 0;
+#X connect 23 0 24 0;
+#X connect 24 0 19 1;
+#X connect 26 0 25 0;
+#X connect 27 0 10 0;
+#X connect 27 1 10 1;
+#X connect 28 0 49 0;
+#X connect 29 0 20 0;
+#X connect 30 0 31 0;
+#X connect 31 0 17 0;
+#X connect 32 0 33 0;
+#X connect 33 0 23 0;
+#X connect 34 0 36 0;
+#X connect 35 0 8 0;
+#X connect 36 0 10 0;
+#X connect 43 0 58 0;
+#X connect 49 0 1 0;
+#X connect 49 0 30 0;
+#X connect 49 0 29 0;
+#X connect 51 0 13 0;
+#X connect 54 0 11 0;
+#X connect 54 0 5 0;
+#X connect 56 0 18 1;
+#X connect 57 0 24 1;
diff --git a/desiredata/doc/3.audio.examples/H01.low-pass.pd b/desiredata/doc/3.audio.examples/H01.low-pass.pd
new file mode 100644
index 00000000..81a713b8
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H01.low-pass.pd
@@ -0,0 +1,185 @@
+#N canvas 97 42 601 612 12;
+#X obj 72 411 mtof;
+#X floatatom 72 388 5 0 0 0 - #0-pit -;
+#X obj 41 542 output~;
+#X obj 41 457 lop~;
+#X obj 42 354 noise~;
+#X text 124 387 <-- cutoff (pitch units);
+#X text 135 434 <-- cutoff (Hertz);
+#X floatatom 72 436 5 0 0 0 - - -;
+#X text 348 582 updated for Pd version 0.39;
+#X text 88 459 low-pass filter;
+#X obj 130 535 tabwrite~ H01-graph;
+#X obj 130 510 metro 250;
+#X obj 130 490 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 148 487 graphing on/off;
+#N canvas 0 0 450 300 graph2 0;
+#X array H01-graph 882 float 3;
+#A 0 -0.107788 -0.0695636 -0.0991016 -0.104581 -0.0683972 -0.0547128
+-0.0857414 -0.0731684 -0.0892636 -0.115914 -0.0935128 -0.0572466 -0.0387586
+-0.0429956 -0.03826 -0.0628797 -0.0383263 -0.0720175 -0.0923909 -0.0707558
+-0.0792164 -0.102187 -0.0888189 -0.119908 -0.083863 -0.0677126 -0.0554309
+-0.044719 -0.0248649 -0.0482707 -0.0692472 -0.103905 -0.101273 -0.117807
+-0.100956 -0.0905779 -0.0676211 -0.0299763 -0.0190183 0.00623894 -0.000664497
+0.0291359 0.0310484 0.0412564 0.0375735 0.0676889 0.0348717 0.00747152
+0.0416666 0.0529021 0.0418099 0.0405759 0.0303367 -0.00428127 0.0140712
+-0.0111072 0.0243947 -0.0104408 -0.0142505 -0.0287291 -0.0119835 0.00876151
+-0.0281321 -0.0325635 -0.0618363 -0.0379124 -0.0447592 -0.0507954 -0.0403398
+-0.0277581 -0.00226383 0.000989536 -0.0323217 -0.0164512 -0.0156964
+-0.0436928 -0.045223 -0.0706908 -0.0382667 -0.00177098 0.0290649 0.0149072
+0.0483574 0.0453535 0.0100187 -0.00270613 0.0298578 0.0470317 0.0301263
+0.0478455 0.0134859 0.0488288 0.0766369 0.0916206 0.11869 0.0944563
+0.102745 0.086215 0.0845207 0.0662227 0.0609466 0.0952278 0.0771313
+0.103073 0.101067 0.0915918 0.100309 0.0651311 0.0553397 0.0623315
+0.050316 0.0844677 0.0996978 0.0715106 0.084598 0.0947672 0.115172
+0.134093 0.118854 0.106047 0.120693 0.0961966 0.0571329 0.0854602 0.084371
+0.0538877 0.0744577 0.0563968 0.0753962 0.0748331 0.0605493 0.0795627
+0.0600295 0.0432455 0.0582205 0.0920203 0.0640656 0.0253824 -0.008527
+-0.0243436 -0.0588714 -0.0239946 0.00784105 0.0119875 0.0161209 0.00780566
+0.00216991 -0.0288565 -0.0521791 -0.0658445 -0.0868191 -0.0673713 -0.0889776
+-0.0546807 -0.0256506 -0.0375237 -0.0118962 -0.0477717 -0.0384217 -0.0385089
+-0.0696784 -0.098759 -0.121121 -0.127174 -0.157189 -0.121443 -0.0989412
+-0.0615983 -0.0711882 -0.0760313 -0.0566161 -0.056104 -0.0875121 -0.0734271
+-0.037525 -0.0681574 -0.0689616 -0.0900591 -0.0574559 -0.04051 -0.0333117
+-0.0260634 -0.0202531 -0.0302473 -0.0346772 -0.052936 -0.0798849 -0.0780231
+-0.111591 -0.112165 -0.129226 -0.11253 -0.138539 -0.122338 -0.138645
+-0.132606 -0.112523 -0.139122 -0.169654 -0.132431 -0.136376 -0.130106
+-0.110972 -0.113595 -0.131592 -0.141568 -0.108734 -0.075847 -0.0711363
+-0.0525791 -0.0216604 -0.0196736 -0.0186081 -0.0186695 -0.00602199
+0.0257979 0.0132076 0.0225488 0.00748564 0.0165994 0.00166184 -0.00116405
+0.0028765 0.01807 0.0157059 0.0473739 0.0708991 0.0862786 0.0650413
+0.038138 0.015989 0.0521245 0.0605891 0.0431341 0.00429233 0.028138
+0.00477928 0.00181729 -0.028107 -0.0360127 -0.00712468 -0.0312668 -0.0523252
+-0.0479352 -0.0513783 -0.0250772 -0.0142933 -0.047864 -0.0252179 -0.0219197
+0.0153334 0.0518051 0.082624 0.0535017 0.0535462 0.0506847 0.0717359
+0.0774448 0.0591473 0.0602611 0.0708395 0.0654832 0.0261038 0.0107588
+0.00770543 0.0203729 0.033363 0.029335 0.0483838 0.0607855 0.0245724
+0.0550305 0.0593506 0.0753188 0.081294 0.096557 0.117197 0.105438 0.111979
+0.0953627 0.0978146 0.084516 0.0952146 0.117297 0.0851524 0.0863281
+0.049295 0.0757788 0.0866482 0.0738062 0.0984422 0.0885168 0.116305
+0.0949217 0.0562471 0.0898681 0.0643755 0.0681146 0.0863296 0.0516047
+0.0595782 0.0605373 0.0295923 0.0568693 0.0749412 0.0804035 0.108818
+0.0786603 0.0506026 0.0129134 0.0381891 0.0305477 0.0364073 0.0411764
+0.0721042 0.0629199 0.03039 0.0474877 0.0100055 0.0283331 0.0424028
+0.0700528 0.0932837 0.116089 0.146493 0.171112 0.198628 0.1636 0.135356
+0.164266 0.144544 0.132615 0.128501 0.129495 0.141165 0.145633 0.141941
+0.170706 0.193988 0.204823 0.228202 0.219125 0.204054 0.227319 0.231326
+0.230171 0.204664 0.230591 0.189557 0.202459 0.184563 0.212896 0.202201
+0.221436 0.214395 0.195221 0.209657 0.214416 0.202139 0.222888 0.237836
+0.245874 0.22457 0.194835 0.159835 0.142986 0.120742 0.119331 0.147719
+0.17693 0.157802 0.153323 0.151851 0.155677 0.148854 0.139333 0.145233
+0.166518 0.140436 0.150237 0.126701 0.135908 0.166416 0.15391 0.152768
+0.181048 0.149057 0.136385 0.1213 0.144767 0.113465 0.0980506 0.0852771
+0.106682 0.130461 0.10524 0.0793894 0.07123 0.0447812 0.0792345 0.0479509
+0.0700904 0.0308896 0.0279068 0.0312166 0.010152 -0.00943106 0.0010242
+-0.00752998 0.0143407 0.0027725 0.033508 0.0621824 0.0643498 0.0827609
+0.113321 0.11629 0.139206 0.101752 0.0988734 0.107286 0.128068 0.14154
+0.148363 0.124029 0.0968996 0.127442 0.100244 0.0940884 0.0805303 0.103963
+0.0874826 0.0588413 0.0720198 0.0853478 0.0902383 0.0788942 0.0475014
+0.0707652 0.0384297 0.0538394 0.0763012 0.0483987 0.0713554 0.0473328
+0.0415702 0.0532321 0.0475937 0.0208587 0.0030926 0.00438177 -0.0204396
+-0.00825569 0.0180096 0.0456204 0.0765333 0.0938012 0.110089 0.115665
+0.13934 0.144259 0.155082 0.164549 0.192087 0.159342 0.176142 0.149727
+0.174968 0.170935 0.134127 0.123663 0.11653 0.113447 0.102327 0.0764594
+0.0887578 0.079355 0.0692447 0.0727442 0.0913222 0.115159 0.137636
+0.154978 0.176904 0.156243 0.13039 0.104399 0.0853428 0.0666318 0.0615526
+0.0907602 0.0502914 0.0434091 0.00788628 -0.0191843 -0.0395026 -0.0596938
+-0.0723036 -0.0806951 -0.0861116 -0.0864571 -0.0488058 -0.0711986 -0.0797166
+-0.0688114 -0.0318625 -0.0673463 -0.0444878 -0.0250519 -0.024727 -0.0310858
+-0.00561093 -0.0207001 -0.0340927 -0.0551734 -0.0817888 -0.0705976
+-0.0835859 -0.0866976 -0.0565736 -0.0797509 -0.0968247 -0.0655236 -0.0760219
+-0.0670947 -0.0342146 -0.0274503 -0.0263804 -0.0317333 -0.039663 -0.0119034
+-0.046866 -0.0359958 -0.0318836 -0.0499625 -0.0574402 -0.029796 0.0028338
+-0.0262898 -0.041154 -0.0473188 -0.0255545 -0.058172 -0.0601881 -0.0914168
+-0.102286 -0.135733 -0.13837 -0.13175 -0.139201 -0.160906 -0.136196
+-0.11435 -0.073056 -0.0694626 -0.0599314 -0.0349573 -0.00661064 -0.0128436
+-0.0368892 -0.00783622 -0.0285016 -0.0257515 -0.000656539 0.000578916
+0.00997914 0.0309158 0.00448781 -0.0276183 -0.00975017 -0.0431335 -0.0420573
+-0.0318631 -0.0461821 -0.0493957 -0.0468264 -0.0278063 -0.0239267 -0.0240269
+-0.0446192 -0.0791041 -0.0634024 -0.0949552 -0.122094 -0.130089 -0.110653
+-0.07832 -0.0717672 -0.0448359 -0.0454325 -0.075843 -0.0655465 -0.0499949
+-0.0848139 -0.107986 -0.0831531 -0.0721088 -0.103859 -0.0650817 -0.0753315
+-0.0991717 -0.072808 -0.0810555 -0.0679525 -0.0566175 -0.0827188 -0.0822597
+-0.0497494 -0.0154982 -0.00131288 0.0318942 -0.00235687 -0.0344436
+-0.0249813 -0.00212817 0.0348011 0.0207401 0.00218581 -0.0346692 -0.000621661
+-0.0106329 -0.0261485 0.00856931 -0.0171581 0.0152674 0.0466481 0.0456615
+0.0728295 0.0601254 0.0639082 0.0949887 0.09166 0.118261 0.120631 0.120818
+0.150657 0.154468 0.134964 0.0965974 0.0907992 0.069314 0.0611587 0.0707784
+0.0627047 0.0717109 0.0659585 0.0296832 0.0352495 0.00141861 0.010894
+0.0426848 0.0419218 0.0141017 0.0413311 0.037778 0.0154291 0.0312945
+0.00510286 -0.00271059 -0.0291284 -0.045397 -0.0762688 -0.0445058 -0.057707
+-0.0779557 -0.0735523 -0.0922772 -0.0727918 -0.0429784 -0.00911861
+-0.0379944 -0.0658339 -0.0784915 -0.0792981 -0.0453014 -0.0197867 -0.00123178
+0.000799734 -0.00204599 0.0349492 0.0623098 0.0770006 0.0882193 0.0484045
+0.0760622 0.0945022 0.0567368 0.0286078 0.00189384 0.0315546 0.0374527
+0.0395075 0.0591211 0.0415475 0.0732162 0.0588977 0.0850963 0.0465228
+0.0698241 0.0407602 0.0431113 0.0065717 0.00936337 0.0222241 0.0327647
+0.0270807 -0.0111891 0.0063837 -0.0086459 -0.0364951 -0.0200965 -0.0318325
+-0.0576028 -0.0557316 -0.0675803 -0.0887475 -0.0980934 -0.0881446 -0.117229
+-0.125822 -0.13378 -0.142539 -0.108397 -0.13497 -0.138471 -0.164523
+-0.174647 -0.18636 -0.157472 -0.148646 -0.108121 -0.104372 -0.0695942
+-0.0542974 -0.0701001 -0.100999 -0.0658883 -0.0947834 -0.113894 -0.0981114
+-0.108426 -0.100378 -0.102227 -0.0818266 -0.103135 -0.0720306 -0.0440222
+-0.0219618 -0.0453231 -0.019184 0.0157131 -0.013545 -0.0248696 -0.0166098
+-0.0489199 -0.0269982 -0.0224125 -0.0413912 -0.0728588 -0.0586017 -0.0349842
+-0.0338855 -0.0588961 -0.0928709 -0.11376 -0.0790886 -0.100094 -0.126293
+-0.10676 -0.136216 -0.109541 -0.136053 -0.112742 -0.136117 -0.146529
+-0.156998 -0.163319 -0.137112 -0.146644 -0.138866 -0.159482 -0.185248
+-0.206002 -0.16925 -0.178855 -0.140085 -0.105426 -0.095303 -0.0736452
+-0.066341 -0.0689736 -0.0914969 -0.0725721 -0.0824288 -0.049098 -0.0139474
+-0.00957104 0.0134051 -0.0091349 0.00555033 0.0117049 -0.0230348 -0.0545547
+-0.050228 -0.0431037 -0.0668625 -0.029803 -0.0551605 -0.0175891 -0.0435808
+-0.0240586 -0.0455508 -0.00746894 0.0213663 0.0569028 0.0190693 0.000740271
+0.000412262 -0.0233437 -0.0205415 -0.0240432 0.00448952 0.00916993
+0.00155166 -0.00567939 -0.00725616 0.0138388 0.0162082 -0.00138934
+-0.0077004 -0.0261998 -0.0100701 -0.0337348 -0.0154704 -0.0291058 -0.0299364
+-0.00924212 0.0247502 -0.0060416 -0.0118114 -0.0158459 0.0158545 -0.00827235
+-0.00602365 -0.0132283 0.0105079 0.0432025 0.0698796 0.0576105 0.0538253
+0.066991 0.0715161 0.0405482 0.0741857 0.0802094 0.113967 0.126283
+0.111464 0.0926309 0.0545991 0.0568134 0.0770984 0.0533353 0.0142316
+-0.0181225 0.00490977 0.0275315 0.0202685 0.00414232 0.0273551 0.0158572
+-0.00476758 -0.0362654 -0.0701252 -0.0547324 -0.0708724 -0.0970369
+-0.099428 -0.102544 -0.0736354 -0.0556618 -0.0863601;
+#X coords 0 1 882 -1 200 140 1;
+#X restore 384 386 graph;
+#X text 408 528 --- 0.02 sec ---;
+#X text 28 30 This and the following patches show how to use filters
+in Pd \, starting with the simplest one: the one-pole low-pass filter.
+Here we test it with an input of white noise. The lop~ object does
+the filtering. Its left inlet takes an audio signal to be filtered
+\, and its right inlet takes messages to set its cutoff frequency in
+Hertz.;
+#X text 26 129 The lop~ object is normalized to pass DC (the lowest
+frequency) with a gain of one. Higher frequencies are progressively
+more and more attenuated. The lower the cutoff frequency \, the lower
+the total power of the filtered noise. If you graph the output you'll
+see that the waveform gets smoother (and smaller overall) as the cutoff
+frequency is lowered.;
+#X text 28 243 At the cutoff frequency the gain is about -3 dB \, and
+above that the gain drops a further 6 dB per octave. (Sometimes one
+uses the word "rolloff" instead of "cutoff" to emphasize the gradual
+way the gain drops off with frequency.);
+#X text 108 353 white noise \, test signal;
+#X text 185 6 ONE-POLE LOW-PASS FILTER;
+#N canvas 0 0 450 300 loadbang 0;
+#X obj 85 16 loadbang;
+#X obj 85 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 85 59 f \$0;
+#X text 18 179 boxes.;
+#X text 16 161 This subpatch loads initial values in number;
+#X msg 84 83 \; \$1-pit 60;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 129 582 pd loadbang;
+#X connect 0 0 7 0;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
+#X connect 3 0 2 1;
+#X connect 3 0 10 0;
+#X connect 4 0 3 0;
+#X connect 7 0 3 1;
+#X connect 11 0 10 0;
+#X connect 12 0 11 0;
diff --git a/desiredata/doc/3.audio.examples/H02.high-pass.pd b/desiredata/doc/3.audio.examples/H02.high-pass.pd
new file mode 100644
index 00000000..3342c64e
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H02.high-pass.pd
@@ -0,0 +1,173 @@
+#N canvas 29 10 607 643 12;
+#X obj 38 563 output~;
+#X text 336 611 updated for Pd version 0.39;
+#X obj 126 544 metro 250;
+#X obj 126 524 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 144 521 graphing on/off;
+#N canvas 0 0 450 300 graph2 0;
+#X array H02-graph 882 float 3;
+#A 0 0.86084 0.876465 0.891113 0.904785 0.917725 0.929688 0.940918
+0.950928 0.960205 0.968506 0.97583 0.982178 0.987793 0.992188 0.995605
+0.998047 0.999512 1 0.999756 0.998291 0.99585 0.992432 0.988037 0.982666
+0.976318 0.968994 0.960938 0.95166 0.94165 0.930664 0.918701 0.905762
+0.89209 0.877441 0.862061 0.845703 0.828613 0.810547 0.791748 0.772217
+0.751953 0.730957 0.709229 0.686768 0.663574 0.639893 0.615479 0.590576
+0.564941 0.538818 0.511963 0.484863 0.457275 0.429199 0.400635 0.371826
+0.342529 0.312744 0.282959 0.252686 0.222168 0.19165 0.160645 0.129639
+0.0986328 0.0673828 0.0358887 0.00463867 -0.0266113 -0.0581055 -0.0893555
+-0.120361 -0.151611 -0.182373 -0.213135 -0.243652 -0.273926 -0.303955
+-0.33374 -0.363037 -0.39209 -0.420654 -0.448975 -0.476807 -0.50415
+-0.530762 -0.557129 -0.583008 -0.608154 -0.632568 -0.656738 -0.679932
+-0.702637 -0.724609 -0.74585 -0.766357 -0.786133 -0.805176 -0.823242
+-0.840576 -0.857178 -0.873047 -0.887939 -0.901855 -0.915039 -0.927246
+-0.938477 -0.94873 -0.958252 -0.966797 -0.974365 -0.980957 -0.986572
+-0.991211 -0.994873 -0.997559 -0.999268 -1 -0.999756 -0.998535 -0.996338
+-0.993164 -0.989014 -0.983887 -0.977783 -0.970947 -0.962891 -0.953857
+-0.944092 -0.933105 -0.921387 -0.908936 -0.895264 -0.880859 -0.865479
+-0.849365 -0.83252 -0.814697 -0.796143 -0.776855 -0.756592 -0.73584
+-0.714111 -0.691895 -0.668945 -0.645264 -0.621094 -0.596191 -0.570801
+-0.544678 -0.518066 -0.491211 -0.463623 -0.435547 -0.407227 -0.378418
+-0.349121 -0.31958 -0.289795 -0.259521 -0.229248 -0.198486 -0.167725
+-0.136719 -0.105713 -0.0744629 -0.0432129 -0.0117188 0.0195312 0.0507812
+0.0822754 0.113281 0.144531 0.175293 0.206055 0.236816 0.26709 0.297119
+0.326904 0.356445 0.385498 0.414307 0.442627 0.470459 0.497803 0.524902
+0.55127 0.577148 0.602539 0.627197 0.651367 0.674805 0.69751 0.719727
+0.740967 0.761719 0.781738 0.800781 0.819336 0.836914 0.853516 0.869385
+0.884521 0.898682 0.912109 0.924561 0.936035 0.946533 0.956299 0.964844
+0.972656 0.979492 0.985352 0.990234 0.994141 0.99707 0.999023 1 1 0.999023
+0.99707 0.994141 0.990234 0.985352 0.979248 0.972412 0.964844 0.956055
+0.946289 0.935791 0.924316 0.911865 0.898438 0.884277 0.869141 0.853271
+0.836426 0.818848 0.800537 0.78125 0.76123 0.740723 0.719238 0.697021
+0.674316 0.650879 0.626709 0.601807 0.57666 0.550781 0.52417 0.497314
+0.469971 0.441895 0.413574 0.38501 0.355713 0.326416 0.296631 0.266357
+0.236084 0.205566 0.174805 0.143799 0.112793 0.081543 0.050293 0.0187988
+-0.0124512 -0.0437012 -0.0749512 -0.106201 -0.137451 -0.168457 -0.199219
+-0.229736 -0.260254 -0.290283 -0.320068 -0.349609 -0.378906 -0.407715
+-0.436035 -0.464111 -0.491699 -0.518799 -0.545166 -0.571289 -0.59668
+-0.621582 -0.645752 -0.669434 -0.692383 -0.7146 -0.736328 -0.75708
+-0.7771 -0.796631 -0.815186 -0.832764 -0.849854 -0.865967 -0.881104
+-0.895508 -0.90918 -0.921631 -0.93335 -0.944092 -0.954102 -0.962891
+-0.970947 -0.978027 -0.984131 -0.989258 -0.993408 -0.996582 -0.998779
+-0.999756 -1 -0.999268 -0.997559 -0.994873 -0.991211 -0.986328 -0.980713
+-0.974121 -0.966553 -0.958008 -0.94873 -0.938232 -0.927002 -0.914551
+-0.901611 -0.887451 -0.872559 -0.856934 -0.840332 -0.822998 -0.804688
+-0.785645 -0.765869 -0.745361 -0.724121 -0.702148 -0.679443 -0.65625
+-0.63208 -0.607666 -0.582275 -0.556641 -0.530273 -0.503418 -0.476074
+-0.448242 -0.420166 -0.391357 -0.362305 -0.333008 -0.303223 -0.273193
+-0.24292 -0.212402 -0.181885 -0.150879 -0.119873 -0.088623 -0.057373
+-0.026123 0.00537109 0.0366211 0.0678711 0.0991211 0.130371 0.161377
+0.192139 0.2229 0.253418 0.283447 0.313477 0.343018 0.372314 0.401123
+0.429688 0.457764 0.485352 0.512695 0.539307 0.56543 0.591064 0.615967
+0.640381 0.664062 0.687256 0.709717 0.731445 0.752441 0.772705 0.792236
+0.811035 0.828857 0.845947 0.862305 0.877686 0.892334 0.906006 0.918945
+0.930908 0.941895 0.951904 0.961182 0.969238 0.976562 0.98291 0.988037
+0.992432 0.99585 0.998291 0.999756 1 0.999512 0.998047 0.995605 0.991943
+0.987549 0.982178 0.97583 0.968506 0.960205 0.950928 0.940674 0.929443
+0.91748 0.904541 0.890869 0.876221 0.860596 0.844238 0.826904 0.808838
+0.790039 0.770508 0.75 0.729004 0.707275 0.684814 0.661621 0.637695
+0.613281 0.588135 0.5625 0.536377 0.509521 0.482422 0.45459 0.426514
+0.397949 0.369141 0.339844 0.310059 0.280029 0.25 0.219482 0.188721
+0.157959 0.126953 0.0957031 0.0644531 0.0332031 0.00170898 -0.029541
+-0.060791 -0.092041 -0.123291 -0.154297 -0.185303 -0.21582 -0.246338
+-0.276611 -0.306641 -0.336426 -0.365723 -0.394775 -0.42334 -0.451416
+-0.479248 -0.506592 -0.533203 -0.55957 -0.585205 -0.610352 -0.63501
+-0.658691 -0.682129 -0.70459 -0.726562 -0.747803 -0.768066 -0.787842
+-0.806885 -0.824951 -0.842285 -0.858643 -0.874268 -0.88916 -0.903076
+-0.916016 -0.928223 -0.939453 -0.949707 -0.958984 -0.967529 -0.974854
+-0.981445 -0.987061 -0.991455 -0.995117 -0.997803 -0.999512 -1 -0.999756
+-0.998535 -0.996094 -0.99292 -0.98877 -0.983398 -0.977295 -0.970215
+-0.962158 -0.953125 -0.943115 -0.932129 -0.92041 -0.907715 -0.894043
+-0.879639 -0.864258 -0.8479 -0.831055 -0.812988 -0.794434 -0.774902
+-0.754883 -0.733887 -0.712158 -0.689941 -0.666748 -0.643066 -0.618896
+-0.593994 -0.568359 -0.542236 -0.515625 -0.488525 -0.460938 -0.433105
+-0.404541 -0.375732 -0.346436 -0.316895 -0.286865 -0.256836 -0.226318
+-0.195801 -0.165039 -0.134033 -0.102783 -0.0715332 -0.0402832 -0.0090332
+0.0224609 0.0537109 0.0849609 0.116211 0.147217 0.178223 0.208984 0.239502
+0.269775 0.299805 0.32959 0.359131 0.388184 0.416748 0.445068 0.4729
+0.500244 0.527344 0.553711 0.579346 0.604736 0.629395 0.65332 0.676758
+0.699463 0.72168 0.74292 0.763672 0.783447 0.80249 0.820801 0.838379
+0.85498 0.87085 0.885742 0.899902 0.913086 0.925537 0.937012 0.94751
+0.957031 0.965576 0.973389 0.97998 0.98584 0.990723 0.994385 0.997314
+0.999023 1 1 0.998779 0.996826 0.993652 0.989746 0.984619 0.97876 0.971924
+0.963867 0.955078 0.945312 0.934814 0.923096 0.910645 0.897217 0.882812
+0.867676 0.851807 0.834961 0.817139 0.798828 0.779541 0.759521 0.73877
+0.717285 0.695068 0.672119 0.648682 0.624512 0.599609 0.574219 0.54834
+0.521729 0.494873 0.467285 0.439453 0.411133 0.382324 0.353027 0.32373
+0.293701 0.263672 0.233398 0.202637 0.171875 0.140869 0.109863 0.0786133
+0.0473633 0.0161133 -0.0153809 -0.0466309 -0.0778809 -0.109131 -0.140137
+-0.171143 -0.201904 -0.232666 -0.262939 -0.292969 -0.322754 -0.352295
+-0.381592 -0.4104 -0.438721 -0.466553 -0.494141 -0.52124 -0.547607
+-0.57373 -0.599121 -0.623779 -0.647949 -0.671631 -0.694336 -0.716797
+-0.738281 -0.759033 -0.779053 -0.79834 -0.81665 -0.834473 -0.851318
+-0.867432 -0.882568 -0.896729 -0.910156 -0.922852 -0.934326 -0.945068
+-0.954834 -0.963867 -0.97168 -0.978516 -0.984619 -0.989502 -0.993652
+-0.996826 -0.998779 -1 -1 -0.999268 -0.997314 -0.994629 -0.990723 -0.98584
+-0.980225 -0.973633 -0.96582 -0.957275 -0.947754 -0.937256 -0.925781
+-0.913574 -0.900391 -0.88623 -0.871338 -0.855469 -0.838867 -0.821289
+-0.802979 -0.783936 -0.76416 -0.743408 -0.722168 -0.700195 -0.67749
+-0.654053 -0.629883 -0.605225 -0.580078 -0.554199 -0.527832 -0.500977
+-0.473633 -0.445801 -0.41748 -0.388916 -0.359863 -0.330322 -0.300537
+-0.270508 -0.240234 -0.209717 -0.178955 -0.147949 -0.116943 -0.0856934
+-0.0544434 -0.0231934 0.00805664 0.0395508 0.0708008 0.102051 0.133057
+0.164062 0.195068 0.225586 0.256104 0.286133 0.316162 0.345703 0.375
+0.403809 0.432373 0.460449 0.488037 0.515137 0.541748 0.567871 0.593262
+0.618164 0.642578 0.66626 0.689209 0.71167 0.733398 0.754395 0.774414
+0.793945 0.812744 0.830566 0.847656 0.86377 0.87915 0.893555 0.907227
+0.919922 0.931885 0.942871 0.952881 0.961914 0.969971 0.977051 0.983398
+0.988525 0.99292 0.996094 0.998535 0.999756 1 0.999512 0.997803 0.995361
+0.991699 0.987061 0.981689 0.975098 0.967773 0.959229 0.949951 0.939697
+0.928467 0.916504 0.90332 0.889404 0.874756 0.859131 0.842529 0.825439
+0.807129 0.78833 0.768555 0.748291 0.727051 0.705078 0.682617 0.659424
+0.635498 0.611084 0.585938 0.560059 0.533936 0.50708 0.47998 0.452148
+0.424072 0.395508 0.366455 0.337158 0.307373 0.277344 0.24707 0.216553
+0.186035 0.155029 0.124023 0.0927734 0.0615234 0.0302734 -0.000976562
+-0.0324707 -0.0637207 -0.0949707 -0.125977 -0.157227 -0.187988 -0.21875
+-0.249268 -0.279297 -0.309326 -0.339111 -0.368408;
+#X coords 0 1 882 -1 200 140 1;
+#X restore 381 407 graph;
+#X text 405 549 --- 0.02 sec ---;
+#X text 24 31 Many synthesis algorithms and transformations can have
+outputs with a zero-freqency component (commonly called DC for "direct
+current"). These are inaudible and sometimes cause distortion in audio
+output devices \, or when converting to fixed-point soundfile formats.
+It is often desirable to filter an audio signal to remove its DC component.
+;
+#X text 23 147 The simplest way to do this is to use a one-pole low-pass
+filter \, tuned to a low frequency such as 3 Hertz \, and to subtract
+its output from the original. This difference is called a one-pole
+\, one-zero high-pass filter \, and it is used so often that Pd provides
+one in the "hip~" object.;
+#X obj 38 354 +~ 1;
+#X obj 37 491 hip~ 5;
+#X text 100 491 high-pass filter;
+#X floatatom 86 450 5 0 0 0 - - -;
+#X msg 86 380 0;
+#X text 122 329 sinusoidal test signal;
+#X text 83 354 add "DC";
+#X text 124 380 zero for no filtering;
+#X msg 86 403 3;
+#X text 121 404 3 (or so) to remove DC;
+#X text 126 427 higher freqencies affect;
+#X text 166 443 the audible part of;
+#X text 166 459 the signal as well.;
+#X obj 38 329 osc~ 220;
+#X msg 86 426 220;
+#X text 23 229 The simplest way to do this is to use a one-pole low-pass
+filter \, tuned to a low frequency such as 3 Hertz \, and to subtract
+its output from the original. This difference is computed by a one-pole
+\, one-zero high-pass filter. These are used so often that Pd provides
+one in the "hip~" object.;
+#X text 131 4 ONE-POLE \, ONE-ZERO HIGH-PASS FILTER;
+#X obj 126 569 tabwrite~ H02-graph;
+#X connect 2 0 26 0;
+#X connect 3 0 2 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 0;
+#X connect 10 0 0 1;
+#X connect 10 0 26 0;
+#X connect 12 0 10 1;
+#X connect 13 0 12 0;
+#X connect 17 0 12 0;
+#X connect 22 0 9 0;
+#X connect 23 0 12 0;
diff --git a/desiredata/doc/3.audio.examples/H03.band-pass.pd b/desiredata/doc/3.audio.examples/H03.band-pass.pd
new file mode 100644
index 00000000..976fee54
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H03.band-pass.pd
@@ -0,0 +1,57 @@
+#N canvas 44 0 604 533 12;
+#X obj 43 278 mtof;
+#X floatatom 43 255 5 0 150 0 - #0-pit -;
+#X obj 32 446 output~;
+#X obj 32 225 noise~;
+#X text 95 254 <-- cutoff (pitch units);
+#X text 106 301 <-- cutoff (Hertz);
+#X floatatom 43 303 5 0 0 0 - - -;
+#X text 330 494 updated for Pd version 0.39;
+#X obj 121 414 metro 250;
+#X obj 121 394 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 139 391 graphing on/off;
+#N canvas 0 0 450 300 graph2 0;
+#X array H03-graph 882 float 2;
+#X coords 0 1 882 -1 200 140 1;
+#X restore 375 290 graph;
+#X text 399 432 --- 0.02 sec ---;
+#X text 98 224 white noise \, test signal;
+#X obj 32 361 bp~;
+#X text 73 363 band-pass filter;
+#X obj 121 439 tabwrite~ H03-graph;
+#X floatatom 54 331 5 0 1000 0 - #0-q -;
+#X text 106 329 <-- q;
+#N canvas 0 0 450 300 loadbang 0;
+#X obj 85 16 loadbang;
+#X obj 85 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 85 59 f \$0;
+#X text 18 179 boxes.;
+#X text 16 161 This subpatch loads initial values in number;
+#X msg 85 83 \; \$1-pit 72 \; \$1-q 1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 139 482 pd loadbang;
+#X text 154 8 RESONANT (BAND-PASS) FILTER;
+#X text 26 129 The two controls specify \, first \, the center frequency
+\, and second \, the sharpness of the filter \, commonly called "q".
+If you increase q to 10 or 20 \, you will see a drop in total signal
+power \, and moreover \, you'll see and hear the resonant frequency
+more clearly in the result.;
+#X text 28 30 A simple resonant band-pass filter is provided in the
+bp~ object. Resonant filters can be tuned to a specific "center frequency"
+and then will pass that frequency while attenuating other frequencies
+(the further from the center frequency \, the more attenuation). This
+patch uses a white noise source to demonstrate bp~.;
+#X connect 0 0 6 0;
+#X connect 1 0 0 0;
+#X connect 3 0 14 0;
+#X connect 6 0 14 1;
+#X connect 8 0 16 0;
+#X connect 9 0 8 0;
+#X connect 14 0 2 0;
+#X connect 14 0 2 1;
+#X connect 14 0 16 0;
+#X connect 17 0 14 2;
diff --git a/desiredata/doc/3.audio.examples/H04.filter.sweep.pd b/desiredata/doc/3.audio.examples/H04.filter.sweep.pd
new file mode 100644
index 00000000..e4f3cf09
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H04.filter.sweep.pd
@@ -0,0 +1,58 @@
+#N canvas 360 15 553 524 12;
+#X floatatom 44 146 5 0 150 0 - #0-pitch -;
+#X text 126 9 SWEEPING FILTERS;
+#X obj 44 193 phasor~;
+#X obj 59 351 +~;
+#X floatatom 81 326 5 0 100 0 - #0-offset -;
+#X floatatom 60 222 5 0 0 0 - #0-speed -;
+#X floatatom 82 273 5 0 100 0 - #0-depth -;
+#X floatatom 75 404 5 0 1000 0 - #0-q -;
+#X obj 44 426 vcf~;
+#X obj 59 375 tabread4~ mtof;
+#X text 127 403 <-- Q (selectivity);
+#X text 115 182 sawtooth;
+#X text 116 198 oscillator;
+#X text 112 221 <-- sweep speed;
+#X text 137 245 LFO for sweep;
+#X text 134 274 <-- sweep depth;
+#X text 131 326 <-- base center frequency;
+#X text 103 350 add base to sweep;
+#X text 192 375 convert to Hz.;
+#X text 97 144 <-- pitch;
+#X obj 43 457 output~;
+#X obj 44 169 mtof;
+#X obj 60 244 phasor~;
+#X obj 60 298 *~;
+#X text 294 496 updated for Pd version 0.39;
+#N canvas 706 247 450 300 startup 0;
+#X obj 85 16 loadbang;
+#X obj 85 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 85 59 f \$0;
+#X text 9 257 boxes.;
+#X text 18 209 This subpatch loads initial values in number;
+#X msg 85 83 \; \$1-pitch 48 \; \$1-speed -2 \; \$1-depth 27 \; \$1-offset
+56 \; \$1-q 2;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 168 491 pd startup;
+#X text 14 109 Note the different effects of negative and positive
+sweep speeds.;
+#X text 13 32 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 computationally
+somewhat more expensive than bp~.;
+#X connect 0 0 21 0;
+#X connect 2 0 8 0;
+#X connect 3 0 9 0;
+#X connect 4 0 3 1;
+#X connect 5 0 22 0;
+#X connect 6 0 23 1;
+#X connect 7 0 8 2;
+#X connect 8 0 20 0;
+#X connect 8 0 20 1;
+#X connect 9 0 8 1;
+#X connect 21 0 2 0;
+#X connect 22 0 23 0;
+#X connect 23 0 3 0;
diff --git a/desiredata/doc/3.audio.examples/H05.filter.floyd.pd b/desiredata/doc/3.audio.examples/H05.filter.floyd.pd
new file mode 100644
index 00000000..2187f05d
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H05.filter.floyd.pd
@@ -0,0 +1,132 @@
+#N canvas 708 41 555 646 12;
+#N canvas 0 0 600 392 conversion-tables 0;
+#N canvas 0 0 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 1e-04 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 0 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 121 588 pd conversion-tables;
+#X obj 31 411 line~;
+#X obj 31 387 pack 0 100;
+#X floatatom 31 339 3 0 150 0 - #0-cf -;
+#X floatatom 47 461 3 0 999 0 - #0-q -;
+#X obj 16 512 vcf~;
+#X obj 31 436 tabread4~ mtof;
+#X text 81 461 <-- Q (selectivity);
+#X text 88 5 ANOTHER SWEEPING FILTER EXAMPLE;
+#X obj 15 267 clip~ 0 0.5;
+#X obj 15 291 *~ 2;
+#X obj 15 315 -~;
+#X text 119 268 trick to;
+#X text 120 285 make symmetric;
+#X text 118 302 triangle wave;
+#X obj 22 147 f;
+#X obj 55 145 + 1;
+#X obj 22 217 mtof;
+#X obj 55 169 mod 8;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-array1 8 float 2;
+#X coords 0 96 8 36 200 100 1;
+#X restore 340 144 graph;
+#X text 73 336 <-- center frequency;
+#X obj 22 123 metro 85;
+#X text 107 147 sequencer for;
+#X text 122 164 8 note loop;
+#X obj 16 576 output~;
+#X obj 22 104 tgl 15 0 empty \$1-metro empty 0 -6 0 8 -262144 -1 -1
+1 1;
+#N canvas 876 177 375 255 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-cf 61 \; \$1-q 10 \; \$1-metro 1 \; \$1-array1
+0 45 48 50 48 55 53 55 57;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 121 611 pd startup;
+#X text 96 364 at least 61;
+#X obj 22 241 phasor~;
+#X text 294 616 updated for Pd version 0.39;
+#X obj 22 193 tabread \$0-array1;
+#X obj 16 540 vcf~;
+#X obj 31 362 max 61;
+#X text 82 409 smooth & convert to Hz.;
+#X obj 47 482 max 3;
+#X text 105 483 at least 3;
+#X text 11 28 Here's an approximate reconstruction of an old riff by
+Pink Floyd. Because we're filtering a waveform with odd partials \,
+it's easier to pick out the partials in the filtered sound than if
+we had had both even and odd ones.;
+#X text 78 527 rejection of the stop bands without having;
+#X text 79 509 Put two vcf objects in series for better;
+#X text 77 545 to make the passband excessively narrow.;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 32 0;
+#X connect 4 0 34 0;
+#X connect 5 0 31 0;
+#X connect 6 0 5 1;
+#X connect 6 0 31 1;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 5 0;
+#X connect 15 0 16 0;
+#X connect 15 0 30 0;
+#X connect 16 0 18 0;
+#X connect 17 0 28 0;
+#X connect 18 0 15 1;
+#X connect 21 0 15 0;
+#X connect 25 0 21 0;
+#X connect 28 0 9 0;
+#X connect 28 0 11 1;
+#X connect 30 0 17 0;
+#X connect 31 0 24 0;
+#X connect 31 0 24 1;
+#X connect 32 0 2 0;
+#X connect 34 0 5 2;
+#X connect 34 0 31 2;
diff --git a/desiredata/doc/3.audio.examples/H06.envelope.follower.pd b/desiredata/doc/3.audio.examples/H06.envelope.follower.pd
new file mode 100644
index 00000000..8f536fba
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H06.envelope.follower.pd
@@ -0,0 +1,86 @@
+#N canvas 87 74 585 621 12;
+#X floatatom 354 464 4 0 0 0 - - -;
+#X floatatom 150 316 3 0 999 0 - #0-osc2 -;
+#X obj 150 336 osc~;
+#X text 162 12 ENVELOPE FOLLOWER;
+#X text 22 33 An envelope follower measures the mean square power of
+an signal as it changes over time. (You can convert mean square power
+to RMS ampitude or to decibels if you wish.) The term "mean square"
+means simply that the signal should be squared \, and then averaged.
+The averageing is done using a low-pass filter such as lop~.;
+#X obj 62 466 lop~;
+#X floatatom 93 444 3 0 100 0 - #0-lop -;
+#X obj 61 356 +~;
+#X text 187 317 <-- frequency of second oscillator;
+#X obj 62 330 osc~ 500;
+#X obj 62 413 *~;
+#X obj 62 522 snapshot~;
+#X floatatom 62 573 5 0 999 0 - - -;
+#X obj 62 545 sqrt;
+#X text 335 361 built-in envelope;
+#X obj 354 491 dbtorms;
+#X floatatom 354 518 5 0 999 0 - - -;
+#N canvas 536 459 382 265 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-osc2 400 \; \$1-lop 10 \; \$1-metro 1 \; pd dsp
+1;
+#X obj 223 132 metro 250;
+#X obj 223 107 r \$0-metro;
+#X obj 223 156 s \$0-tick;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 0;
+#X restore 217 598 pd startup;
+#X text 115 414 square the signal;
+#X text 124 440 <-- responsiveness;
+#X text 159 501 take snapshot;
+#X text 108 548 convert to RMS;
+#X text 327 599 updated for Pd version 0.39;
+#X text 334 381 follower for comparison;
+#X text 107 466 low-pass filter;
+#X text 114 573 output;
+#X obj 70 497 r \$0-tick;
+#X text 159 517 every 1/4 second;
+#X obj 389 439 r \$0-tick;
+#X obj 354 439 f;
+#X obj 376 414 env~;
+#X text 20 242 The env~ object at right \, which is a built-in envelope
+follower using a higher-quality low-pass filter than lop~ \, is shown
+for comparison. Its output is artificially slowed down to match the
+homemade one at left.;
+#X obj 150 359 *~;
+#X obj 185 360 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X text 204 358 <-- on/off;
+#X text 20 128 Here we're adding two oscillators so the result should
+be an RMS of one if the second oscillator is on \, 0.707 otherwise.
+Note two effects: first \, the more responsive the envelope follower
+\, the less accurate the result (but the faster it responds). Second
+\, if the two oscillators are tuned close to each other their beating
+affects the nombers coming out.;
+#X connect 0 0 15 0;
+#X connect 1 0 2 0;
+#X connect 2 0 32 0;
+#X connect 5 0 11 0;
+#X connect 6 0 5 1;
+#X connect 7 0 10 0;
+#X connect 7 0 10 1;
+#X connect 7 0 30 0;
+#X connect 9 0 7 0;
+#X connect 10 0 5 0;
+#X connect 11 0 13 0;
+#X connect 13 0 12 0;
+#X connect 15 0 16 0;
+#X connect 26 0 11 0;
+#X connect 28 0 29 0;
+#X connect 29 0 0 0;
+#X connect 30 0 29 1;
+#X connect 32 0 7 1;
+#X connect 33 0 32 1;
diff --git a/desiredata/doc/3.audio.examples/H07.measure.spectrum.pd b/desiredata/doc/3.audio.examples/H07.measure.spectrum.pd
new file mode 100644
index 00000000..f290ca4a
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H07.measure.spectrum.pd
@@ -0,0 +1,88 @@
+#N canvas 407 54 626 729 12;
+#X floatatom 145 654 5 0 0 0 - - -;
+#X obj 44 565 bp~;
+#X obj 44 536 bp~;
+#X obj 55 467 mtof;
+#X floatatom 55 490 7 0 0 0 - - -;
+#X floatatom 98 520 3 0 999 0 - #0-q -;
+#X floatatom 55 447 7 0 150 0 - #0-pitch -;
+#X obj 145 586 env~ 4096;
+#X obj 45 370 *~ 0;
+#X obj 44 395 +~ 1;
+#X obj 145 608 + 0.5;
+#X obj 145 631 int;
+#X text 12 41 In this example we use two cascaded bandpass filters
+to troll for partials in Jonathan Harvey's famous bell sample.;
+#X text 16 233 You can hear partials around 48 \, 51.3 \, 55 (faint!)
+\, 57 (fainter!) \, 60 \, two beating partials around 65 \, 67 \, 69
+\, 70.9 \, 71.75 \, 72.6 \, 74 \, 74.65 \, 75.6 \, 77 \, 81.2 \, 84.6
+\, 86.5 \, and probably many more. There's also one down at 36 \, but
+it's easier to see it on the meter than hear it.;
+#X text 124 447 <-- center pitch;
+#X text 120 463 (shift-drag to fine tune);
+#X text 131 491 <-- center frequency;
+#X text 138 520 <-- Q (filter selectivity);
+#X obj 44 614 output~;
+#X text 341 680 updated for Pd version 0.39;
+#X text 14 82 Note that filters can give unexpected level changes.
+The bp~ object is designed to have roughly unit gain at the pass band
+\, so the higher you set "Q" the more amplitude is lost. You can correct
+for this by pushing the output amplitude \, but be sure to remember
+to reset the output amplitude before you reduce Q again. I set the
+Q to 100 and the output amplitude to 110 or 120 (with the room gain
+way down.) Then holding the shift key \, slowly drag the center pitch
+upward listening for modes.;
+#N canvas 316 21 483 471 startup 0;
+#X obj 53 335 r readfile;
+#X obj 53 388 soundfiler;
+#X obj 59 23 loadbang;
+#X obj 59 49 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 59 70 f \$0;
+#X obj 60 271 /;
+#X msg 60 248 44100;
+#X obj 60 223 t b f;
+#X obj 60 199 r \$0-totsamps;
+#X obj 60 294 s \$0-loopf;
+#X msg 59 102 \; readfile symbol \$1-array \; \$1-totsamps 143718 \;
+\$1-pitch 69 \; \$1-q 0;
+#X msg 53 361 read -resize ../sound/bell.aiff \$1;
+#X connect 0 0 11 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 10 0;
+#X connect 5 0 9 0;
+#X connect 6 0 5 0;
+#X connect 7 0 6 0;
+#X connect 7 1 5 1;
+#X connect 8 0 7 0;
+#X connect 11 0 1 0;
+#X restore 456 625 pd startup;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-array 155948 float 0;
+#X coords 0 1 155947 -1 200 150 1;
+#X restore 396 322 graph;
+#X obj 45 322 r \$0-loopf;
+#X obj 45 346 phasor~;
+#X obj 44 419 tabread4~ \$0-array;
+#X obj 89 370 r \$0-totsamps;
+#X text 109 12 MEASURING SPECTRA USING BANDPASS FILTERS;
+#X connect 1 0 7 0;
+#X connect 1 0 18 0;
+#X connect 1 0 18 1;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 1;
+#X connect 4 0 1 1;
+#X connect 5 0 2 2;
+#X connect 5 0 1 2;
+#X connect 6 0 3 0;
+#X connect 7 0 10 0;
+#X connect 8 0 9 0;
+#X connect 9 0 25 0;
+#X connect 10 0 11 0;
+#X connect 11 0 0 0;
+#X connect 23 0 24 0;
+#X connect 24 0 8 0;
+#X connect 25 0 2 0;
+#X connect 26 0 8 1;
diff --git a/desiredata/doc/3.audio.examples/H08.heterodyning.pd b/desiredata/doc/3.audio.examples/H08.heterodyning.pd
new file mode 100644
index 00000000..5bdf28e3
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H08.heterodyning.pd
@@ -0,0 +1,85 @@
+#N canvas 280 49 607 705 12;
+#X text 336 665 updated for Pd version 0.39;
+#X text 109 12 MORE ON MEASURING SPECTRA: HETERODYNING;
+#X obj 46 289 phasor~ 100;
+#X obj 99 343 phasor~;
+#X floatatom 99 320 5 0 999 0 - #0-freq -;
+#X obj 99 395 cos~;
+#X obj 148 395 cos~;
+#X obj 148 370 +~ 0.25;
+#X obj 47 547 snapshot~;
+#N canvas 536 459 382 265 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X obj 223 132 metro 250;
+#X obj 223 107 r \$0-metro;
+#X obj 223 156 s \$0-tick;
+#X msg 22 91 \; \$1-freq 100 \; \$1-lop 2 \; \$1-metro 1 \; pd dsp
+1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 8 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X restore 382 573 pd startup;
+#X obj 47 446 *~;
+#X obj 91 446 *~;
+#X obj 48 471 lop~;
+#X obj 92 471 lop~;
+#X floatatom 153 435 3 0 100 0 - #0-lop -;
+#X text 186 435 <-- responsiveness;
+#X obj 136 547 snapshot~;
+#X floatatom 47 575 5 0 0 0 - - -;
+#X floatatom 136 575 5 0 0 0 - - -;
+#X obj 161 496 r \$0-tick;
+#X obj 161 517 t b b;
+#X obj 47 643 expr sqrt($f1*$f1+$f2*$f2);
+#X floatatom 47 669 5 0 0 0 - - -;
+#X text 56 248 signal to;
+#X text 58 268 analyze;
+#X text 51 44 Another method for picking out the strengths of partials
+in a sound is heterodyning. We guess the frequency of a partial (as
+in the previous patch) but this time we multiply by a complex exponential
+to frequency-shift the partial down to zero (DC).;
+#X text 47 126 Then a low-pass filter (applied separately on the real
+and imaginary parts) removes all but the DC component thus obtained.
+The result is two audio signals (which we take snapshots of) holding
+the real and imaginary parts of the complex amplitude of the partial
+we want. Compared to the previous method \, this had the advantage
+of reporting the phase of the partial as well as its frequency.;
+#X text 240 358 modulate;
+#X text 237 394 to DC;
+#X text 154 321 <-- test frequency;
+#X text 236 376 test frequency;
+#X text 132 471 low-pass filter;
+#X text 55 596 real;
+#X text 59 611 part;
+#X text 207 589 part;
+#X text 198 574 imaginary;
+#X text 105 670 magnitude;
+#X connect 2 0 10 0;
+#X connect 2 0 11 0;
+#X connect 3 0 5 0;
+#X connect 3 0 7 0;
+#X connect 4 0 3 0;
+#X connect 5 0 10 1;
+#X connect 6 0 11 1;
+#X connect 7 0 6 0;
+#X connect 8 0 17 0;
+#X connect 10 0 12 0;
+#X connect 11 0 13 0;
+#X connect 12 0 8 0;
+#X connect 13 0 16 0;
+#X connect 14 0 13 1;
+#X connect 14 0 12 1;
+#X connect 16 0 18 0;
+#X connect 17 0 21 0;
+#X connect 18 0 21 1;
+#X connect 19 0 20 0;
+#X connect 20 0 8 0;
+#X connect 20 1 16 0;
+#X connect 21 0 22 0;
diff --git a/desiredata/doc/3.audio.examples/H09.ssb.modulation.pd b/desiredata/doc/3.audio.examples/H09.ssb.modulation.pd
new file mode 100644
index 00000000..c0fbf2df
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H09.ssb.modulation.pd
@@ -0,0 +1,103 @@
+#N canvas 7 6 605 578 12;
+#X obj 188 393 cos~;
+#X obj 231 371 +~ -0.25;
+#X obj 231 394 cos~;
+#X obj 23 438 *~;
+#X obj 89 438 *~;
+#X obj 22 462 -~;
+#X floatatom 188 322 5 0 0 0 - - -;
+#X text 30 242 sample loop for;
+#X text 30 260 test signal;
+#X text 35 321 pair of allpass;
+#X text 34 338 filters to make;
+#X text 34 356 90 degree phase;
+#X text 32 373 shifted versions;
+#X text 238 323 <-- shift frequency;
+#X text 310 356 cosine and sine waves;
+#X text 55 7 SINGLE SIDEBAND MODULATION;
+#X text 300 7 (AKA FREQUENCY SHIFTING);
+#N canvas 555 154 448 326 bell-loop 0;
+#X obj 23 142 /;
+#X obj 23 214 +~ 1;
+#X msg 23 117 44100;
+#X obj 23 91 t b f;
+#X obj 24 264 outlet~;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-array 155948 float 0;
+#X coords 0 1 155947 -1 200 150 1;
+#X restore 234 88 graph;
+#X obj 23 67 r \$0-totsamps;
+#X obj 65 190 r \$0-totsamps;
+#X obj 23 190 *~;
+#X obj 23 166 phasor~;
+#X obj 23 238 tabread4~ \$0-array;
+#X connect 0 0 9 0;
+#X connect 1 0 10 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 3 1 0 1;
+#X connect 6 0 3 0;
+#X connect 7 0 8 1;
+#X connect 8 0 1 0;
+#X connect 9 0 8 0;
+#X connect 10 0 4 0;
+#X restore 24 279 pd bell-loop;
+#N canvas 711 110 483 471 startup 0;
+#X obj 53 335 r readfile;
+#X obj 53 388 soundfiler;
+#X obj 59 23 loadbang;
+#X obj 59 49 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 59 70 f \$0;
+#X obj 60 271 /;
+#X msg 60 248 44100;
+#X obj 60 223 t b f;
+#X obj 60 199 r \$0-totsamps;
+#X obj 60 294 s \$0-loopf;
+#X msg 53 361 read -resize ../sound/bell.aiff \$1;
+#X msg 59 102 \; readfile symbol \$1-array \; \$1-totsamps 143718;
+#X connect 0 0 10 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 11 0;
+#X connect 5 0 9 0;
+#X connect 6 0 5 0;
+#X connect 7 0 6 0;
+#X connect 7 1 5 1;
+#X connect 8 0 7 0;
+#X connect 10 0 1 0;
+#X restore 157 530 pd startup;
+#X obj 21 495 output~;
+#X text 352 547 updated for Pd version 0.39;
+#X obj 188 347 phasor~;
+#X text 123 438 <-- complex multipier;
+#X text 122 455 (calculates real part);
+#X text 309 371 to form the real and;
+#X text 309 387 imaginary part of a;
+#X text 309 404 complex sinusoid;
+#X text 43 37 The signal sideband modulator gives you only one sideband
+for each frequency in the input signal (whereas ring modulation gave
+both a positive and negative sideband). You can set the shift frequency
+positive to shift all frequencies upward \, or negative to shift them
+downwards.;
+#X text 42 117 The technique is to filter the input into two versions
+\, 90 degrees out of phase \, which can be interpreted as the real
+and imaginary part of a complex signal with positive frequencies only.
+You can then form the (complex) product of this with a (complex) sinusoid
+to modulate upward or downward in frequency.;
+#X obj 23 400 hilbert~;
+#X text 42 213 The "Hilbert~" object is an abstraction in pd/extra.
+;
+#X connect 0 0 3 1;
+#X connect 1 0 2 0;
+#X connect 2 0 4 1;
+#X connect 3 0 5 0;
+#X connect 4 0 5 1;
+#X connect 5 0 19 0;
+#X connect 5 0 19 1;
+#X connect 6 0 21 0;
+#X connect 17 0 29 0;
+#X connect 21 0 1 0;
+#X connect 21 0 0 0;
+#X connect 29 0 3 0;
+#X connect 29 1 4 0;
diff --git a/desiredata/doc/3.audio.examples/H10.measurement.pd b/desiredata/doc/3.audio.examples/H10.measurement.pd
new file mode 100644
index 00000000..d0a04774
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H10.measurement.pd
@@ -0,0 +1,90 @@
+#N canvas 25 22 868 421 12;
+#X obj 25 338 filter-graph2 tab1 tab2;
+#N canvas 0 0 450 300 graph2 0;
+#X array tab1 100 float 1;
+#A 0 0.830737 0.844715 0.882793 0.953057 1.0592 1.19383 1.30927 1.28362
+1.08532 0.848171 0.656605 0.517756 0.418204 0.345252 0.291106 0.249389
+0.216703 0.190566 0.169369 0.1519 0.137418 0.12526 0.114871 0.105957
+0.0982917 0.0916027 0.0857987 0.0806894 0.076187 0.0722001 0.0686727
+0.0655318 0.0627325 0.060178 0.0580025 0.056008 0.0542273 0.0526222
+0.0511875 0.0499289 0.0488555 0.0478795 0.0470241 0.0462859 0.0456642
+0.0451251 0.0447277 0.0444219 0.0442324 0.0443406 0.0449216 0.0393798
+0.0442362 0.0444218 0.0447274 0.0451473 0.0456706 0.0462777 0.0470196
+0.0478395 0.0488555 0.0499664 0.0512245 0.0526221 0.05419 0.0559661
+0.0580025 0.0602342 0.0627325 0.0655169 0.0686727 0.0722052 0.076187
+0.0806893 0.085799 0.0916177 0.0982915 0.10592 0.11479 0.12526 0.137483
+0.151997 0.169411 0.190532 0.216594 0.24918 0.291106 0.345511 0.418206
+0.517664 0.656606 0.848216 1.08532 1.28264 1.30927 1.19534 1.05919
+0.951738 0.882758 0.851605;
+#X coords 0 2 99 0 200 140 1;
+#X restore 634 -1 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array tab2 100 float 3;
+#A 0 8.59501e-06 0.0327982 0.0790568 0.143062 0.250239 0.425263 0.697661
+1.04745 1.37257 1.59826 1.73194 1.8042 1.83798 1.84726 1.84029 1.8221
+1.79589 1.76375 1.72711 1.68696 1.64405 1.5989 1.55192 1.50343 1.45366
+1.40283 1.35108 1.29854 1.24532 1.19151 1.13718 1.0824 1.02722 0.971679
+0.915831 0.859703 0.803332 0.746743 0.689957 0.633001 0.57589 0.518653
+0.461293 0.403871 0.346275 0.288763 0.230985 0.173676 0.11652 0.0674726
+-0.000119478 6.21552 6.16648 6.10932 6.05201 5.99424 5.93673 5.87913
+5.82171 5.76435 5.70711 5.65 5.59304 5.53626 5.47967 5.4233 5.36717
+5.31132 5.25578 5.2006 5.14582 5.09149 5.03768 4.98446 4.93192 4.88017
+4.82934 4.77958 4.73108 4.6841 4.63895 4.59604 4.55589 4.51925 4.48711
+4.4609 4.44271 4.43574 4.44501 4.4788 4.55106 4.68474 4.91043 5.23555
+5.58534 5.85774 6.03276 6.13994 6.20394 6.24278;
+#X coords 0 6.283 99 0 200 140 1;
+#X restore 639 200 graph;
+#X text 621 56 1;
+#X text 633 342 0;
+#X text 615 265 pi;
+#X text 608 195 2pi;
+#X obj 25 203 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 33 249 5 0 0 0 - - -;
+#X text 621 -8 2;
+#X text 104 -6 MEASURING FILTER FREQUENCY AND PHASE RESPONSE;
+#X text 610 382 updated for Pd version 0.39;
+#X text 691 145 frequency;
+#X text 631 141 0;
+#X text 814 144 44100;
+#N canvas 876 177 375 255 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-freq 3000 \; \$1-q 3;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 285 350 pd startup;
+#X floatatom 238 257 5 0 10000 0 - #0-freq -;
+#X floatatom 249 280 3 0 999 0 - #0-q -;
+#X text 12 18 You can use the "filter-graph1" and "filter-graph2" abstractions
+as shown to test filters. Connect them as shown with a filter between
+them. Try varying the parameters and/or substituting other filters.
+;
+#X text 575 127 gain=0;
+#X text 574 327 phase=0;
+#X obj 25 226 filter-graph1 100 44100;
+#X obj 227 310 bp~;
+#X text 44 202 <-- compute;
+#X text 34 266 index;
+#X text 290 254 <-- center frequency;
+#X text 288 279 <-- "Q";
+#X text 9 86 "filter-graph1" takes as arguments the number of points
+to graph and the frequency range. "filter-graph2 takes as arguments
+the name of a table to hold the (frequency dependent) gain \, and another
+\, if specified \, for the phase.;
+#X text 8 153 You can edit this patch to replace "bp" with any other
+filter you're curious about.;
+#X connect 7 0 21 0;
+#X connect 16 0 22 1;
+#X connect 17 0 22 2;
+#X connect 21 0 0 0;
+#X connect 21 0 8 0;
+#X connect 21 1 0 1;
+#X connect 21 1 22 0;
+#X connect 21 2 0 2;
+#X connect 22 0 0 3;
diff --git a/desiredata/doc/3.audio.examples/H11.shelving.pd b/desiredata/doc/3.audio.examples/H11.shelving.pd
new file mode 100644
index 00000000..8eee1178
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H11.shelving.pd
@@ -0,0 +1,74 @@
+#N canvas 25 22 868 421 12;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-tab1 100 float 1;
+#A 0 1.39998 1.39868 1.3942 1.39349 1.38496 1.3772 1.36745 1.35633
+1.34208 1.32931 1.31817 1.30372 1.28879 1.27458 1.25944 1.24351 1.22874
+1.21386 1.19924 1.18487 1.17063 1.15653 1.14284 1.13144 1.11914 1.10722
+1.09603 1.08515 1.07479 1.06474 1.05519 1.04606 1.03715 1.02899 1.02092
+1.0128 1.00624 0.999291 0.992705 0.986255 0.980081 0.974014 0.969307
+0.964106 0.959111 0.954207 0.949901 0.945593 0.941227 0.937556 0.933778
+0.930231 0.926681 0.923353 0.920059 0.917466 0.914627 0.911849 0.9092
+0.906745 0.904264 0.901469 0.900065 0.898006 0.896023 0.893895 0.892373
+0.890666 0.889038 0.887483 0.885924 0.884597 0.883215 0.881537 0.880075
+0.879619 0.878522 0.877414 0.876234 0.87571 0.874819 0.873886 0.873124
+0.87241 0.871807 0.870763 0.870512 0.869952 0.869465 0.868958 0.868403
+0.86826 0.867939 0.866731 0.867094 0.867762 0.867796 0.864339 0.872811
+0.920535;
+#X coords 0 5 99 0 200 300 1;
+#X restore 621 28 graph;
+#X obj 29 245 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 37 289 3 0 0 0 - - -;
+#X text 676 334 frequency;
+#N canvas 876 177 375 255 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-pole 60 \; \$1-zero 20;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 289 390 pd startup;
+#X floatatom 281 265 3 -99 99 0 - #0-pole -;
+#X text 559 316 gain=0;
+#X text 108 34 SHELVING FILTER;
+#X obj 29 378 filter-graph2 \$0-tab1;
+#X obj 29 266 filter-graph1 100 22050;
+#X text 796 330 22050;
+#X obj 232 314 rpole~;
+#X obj 281 288 / 100;
+#X floatatom 335 264 4 -100 100 0 - #0-zero -;
+#X obj 335 287 / 100;
+#X obj 231 346 rzero~;
+#X text 608 21 5;
+#X text 616 327 0;
+#X text 604 258 1;
+#X text 16 58 This patch demonstrates using the raw filters \, rpole~
+and rzero~ (raw \, real-valued one-pole and one-zero filters) \, to
+make a shelving filter.;
+#X text 14 109 If the pole is at p and the zero is at q \, the gain
+at DC is (1-q)/(1-p) and the gain at Nyquist is (1+q)/(1+p). If the
+pole location is close to plus or minus one \, this can give large
+gains unless q is in the same vicinity. (try \, for example \, p=90%
+\, q=70%).;
+#X text 11 191 The crossover region varies from DC to Nyquist as p
+and q decrease from 100% to -100%.;
+#X text 278 241 pole;
+#X text 334 241 zero;
+#X text 383 263 (in hundredths);
+#X text 610 387 updated for Pd version 0.39;
+#X connect 1 0 9 0;
+#X connect 5 0 12 0;
+#X connect 9 0 2 0;
+#X connect 9 0 8 0;
+#X connect 9 1 8 1;
+#X connect 9 1 11 0;
+#X connect 9 2 8 2;
+#X connect 11 0 15 0;
+#X connect 12 0 11 1;
+#X connect 13 0 14 0;
+#X connect 14 0 15 1;
+#X connect 15 0 8 3;
diff --git a/desiredata/doc/3.audio.examples/H12.peaking.pd b/desiredata/doc/3.audio.examples/H12.peaking.pd
new file mode 100644
index 00000000..e005e01a
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H12.peaking.pd
@@ -0,0 +1,112 @@
+#N canvas 41 39 854 640 12;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-tab1 100 float 1;
+#A 0 0.960563 0.960996 0.962862 0.970269 0.977017 0.985214 1.00122
+1.02249 1.05453 1.10332 1.18193 1.31034 1.5315 1.91468 2.37977 2.37001
+1.92679 1.57244 1.36114 1.23298 1.15262 1.09943 1.06243 1.03636 1.0162
+1.00108 0.990295 0.981066 0.973613 0.967183 0.962328 0.958092 0.95445
+0.951329 0.948619 0.946121 0.943931 0.941728 0.940557 0.93934 0.938046
+0.936816 0.935569 0.934901 0.933719 0.933252 0.932534 0.931875 0.93121
+0.930347 0.929637 0.929717 0.929279 0.928865 0.928444 0.927868 0.92761
+0.926893 0.927202 0.926932 0.926666 0.926305 0.925926 0.926007 0.925702
+0.925624 0.92545 0.925285 0.924954 0.924532 0.924071 0.924718 0.924596
+0.924454 0.924247 0.923846 0.924172 0.923627 0.924005 0.92393 0.923866
+0.923769 0.923157 0.923666 0.923974 0.923561 0.923498 0.923437 0.922882
+0.922781 0.92203 0.923331 0.923265 0.922948 0.922413 0.922799 0.925651
+0.921397 0.931729 0.976084;
+#X coords 0 5 99 0 200 300 1;
+#X restore 616 193 graph;
+#X obj 41 404 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 49 448 3 0 0 0 - - -;
+#X text 671 499 frequency;
+#N canvas 876 177 375 255 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-pole 60 \; \$1-zero 20;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 328 602 pd startup;
+#X floatatom 276 368 3 0 99 0 - #0-pole -;
+#X text 554 481 gain=0;
+#X obj 41 600 filter-graph2 \$0-tab1;
+#X obj 41 425 filter-graph1 100 22050;
+#X text 791 495 22050;
+#X obj 276 391 / 100;
+#X floatatom 330 367 4 0 100 0 - #0-zero -;
+#X obj 330 390 / 100;
+#X text 594 182 5;
+#X text 611 492 0;
+#X text 599 423 1;
+#X text 596 596 updated for Pd version 0.39;
+#X text 183 10 PEAKING FILTER;
+#X floatatom 406 366 3 0 180 0 - #0-pole -;
+#X text 415 328 angle;
+#X text 399 344 (degrees);
+#X obj 460 435 sin;
+#X obj 405 436 cos;
+#X obj 405 387 * 3.14159;
+#X obj 405 411 / 180;
+#X obj 241 515 *;
+#X obj 405 460 t b f;
+#X obj 460 460 t b f;
+#X obj 209 543 cpole~;
+#X obj 226 574 czero~;
+#X text 266 332 pole and zero;
+#X text 284 347 radii (%);
+#X obj 277 516 *;
+#X obj 314 542 *;
+#X obj 349 542 *;
+#X text 21 34 To get a peaking filter \, start with a shelving filter
+but rotate the pole and zero to the point on the unit circle you want
+to amplify or attenuate. The rpole~ and rzero~ filters are replaced
+with their complex-valued siblings \, cpole~ and czero~. These filters
+take a (real \, imaginary) pair to filter and another (real-imaginary)
+pair to specify the pole or zero. As for rpole~ and rzero~ \, the coefficients
+may change at audio rate.;
+#X text 22 162 The outputs of cpole~ and czero~ are also in the form
+of a (real-imaginary) pair. Both outlets of cpole~ are connected to
+czero~ in this example \, but then since we want a real-valued filter
+\, we only take the real part of the (complex) output of czero~.;
+#X text 23 246 Here the pole and zero radii (p and q) control the center-frequency
+gain by the formula (1-q)/(1-p). The closer to 1 the radii \, the narrower
+the band affected. The non-peak gain \, (1+q)/(1+p) \, is close to
+1 as long as p and q are at least 50% or so.;
+#X connect 1 0 8 0;
+#X connect 5 0 10 0;
+#X connect 8 0 2 0;
+#X connect 8 0 7 0;
+#X connect 8 1 7 1;
+#X connect 8 1 28 0;
+#X connect 8 2 7 2;
+#X connect 10 0 25 0;
+#X connect 10 0 32 0;
+#X connect 11 0 12 0;
+#X connect 12 0 33 0;
+#X connect 12 0 34 0;
+#X connect 18 0 23 0;
+#X connect 21 0 27 0;
+#X connect 22 0 26 0;
+#X connect 23 0 24 0;
+#X connect 24 0 22 0;
+#X connect 24 0 21 0;
+#X connect 25 0 28 2;
+#X connect 26 0 25 0;
+#X connect 26 0 33 0;
+#X connect 26 1 25 1;
+#X connect 26 1 33 1;
+#X connect 27 0 32 0;
+#X connect 27 0 34 0;
+#X connect 27 1 34 1;
+#X connect 27 1 32 1;
+#X connect 28 0 29 0;
+#X connect 28 1 29 1;
+#X connect 29 0 7 3;
+#X connect 32 0 28 3;
+#X connect 33 0 29 2;
+#X connect 34 0 29 3;
diff --git a/desiredata/doc/3.audio.examples/H13.butterworth.pd b/desiredata/doc/3.audio.examples/H13.butterworth.pd
new file mode 100644
index 00000000..4cdcb628
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H13.butterworth.pd
@@ -0,0 +1,74 @@
+#N canvas 49 22 840 502 12;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-tab1 100 float 1;
+#A 0 0.999974 0.998121 0.998981 1.00106 1.00019 1.00133 1.00017 0.997406
+0.995891 0.986251 0.976591 0.959539 0.93749 0.903172 0.859824 0.805118
+0.744756 0.682757 0.617726 0.555802 0.496807 0.443599 0.395099 0.351557
+0.313317 0.279982 0.250867 0.225225 0.202565 0.182842 0.165875 0.150662
+0.13708 0.125107 0.11452 0.105018 0.0965065 0.0887956 0.0819179 0.0757449
+0.0701302 0.0650313 0.0604129 0.056344 0.0525467 0.0490616 0.04589
+0.0429836 0.0403206 0.0378735 0.0355742 0.0334788 0.0315483 0.0297412
+0.0280809 0.0265134 0.0251207 0.0237881 0.0225431 0.0213794 0.0203074
+0.0192861 0.0183551 0.0174563 0.0166231 0.0158432 0.0151 0.0144158
+0.0137608 0.0131513 0.0125729 0.0120266 0.0115073 0.0110253 0.0105541
+0.0101301 0.00971218 0.0093198 0.00894806 0.00859575 0.00825236 0.00794149
+0.00763651 0.00734779 0.00707258 0.0068092 0.00656191 0.0063171 0.00609739
+0.00587868 0.0056713 0.00547262 0.00528366 0.00509866 0.00493017 0.00476291
+0.00460384 0.00445121 0.00430475 0.00416536;
+#X coords 0 5 99 0 200 300 1;
+#X restore 615 71 graph;
+#X obj 32 250 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 40 294 3 0 0 0 - - -;
+#X text 670 377 frequency;
+#N canvas 876 177 375 255 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-lf 80 \; \$1-hf 150 \;;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 324 431 pd startup;
+#X text 553 359 gain=0;
+#X obj 32 446 filter-graph2 \$0-tab1;
+#X text 593 60 5;
+#X text 610 370 0;
+#X text 598 301 1;
+#X text 575 435 updated for Pd version 0.39;
+#X text 186 -4 BUTTERWORTH FILTER;
+#X obj 216 398 butterworth3~;
+#X floatatom 244 340 3 0 100 0 - #0-lf -;
+#X floatatom 291 339 3 85 150 0 - #0-hf -;
+#X obj 244 366 mtof;
+#X obj 291 366 mtof;
+#X text 790 373 5000;
+#X obj 32 271 filter-graph1 100 5000;
+#X text 232 318 poles;
+#X text 288 318 zeros;
+#X text 24 20 The butterworth filter can be configured for low-pass
+\, high-pass \, and shelving \, depending on the placement of the poles
+and zeros. For low-pass \, the poles are placed to set the cutoff frequency
+and the zeros are at -1 (the Nyquist). Leaving the poles fixed and
+moving the zeros then gives shelving filters. In this example \, the
+actual filtering is relegated to an abstraction (butterworth3~) which
+takes frequencies corresponding to the pole and zero placement.;
+#X text 24 147 The butterworth3~ abstraction computes filter coeffients
+using control messages \, and so it is not suitable for continuously
+time-varying Butterworth filters. For that \, it is often appropriate
+to use time-saving approximations \, but precisely which approximations
+to use will depend on the way the filter is to be used.;
+#X connect 1 0 18 0;
+#X connect 12 0 6 3;
+#X connect 13 0 15 0;
+#X connect 14 0 16 0;
+#X connect 15 0 12 1;
+#X connect 16 0 12 2;
+#X connect 18 0 2 0;
+#X connect 18 0 6 0;
+#X connect 18 1 6 1;
+#X connect 18 1 12 0;
+#X connect 18 2 6 2;
diff --git a/desiredata/doc/3.audio.examples/H14.all.pass.pd b/desiredata/doc/3.audio.examples/H14.all.pass.pd
new file mode 100644
index 00000000..d493df7b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H14.all.pass.pd
@@ -0,0 +1,85 @@
+#N canvas 25 22 868 421 12;
+#X obj 25 338 filter-graph2 tab1 tab2;
+#N canvas 0 0 450 300 graph2 0;
+#X array tab1 100 float 1;
+#A 0 0.999994 1.0015 1.00454 0.999907 0.99994 0.999773 1.00002 1.0004
+0.999993 0.998703 1 0.999993 1 0.999699 0.999312 0.99924 0.999999 1
+0.999937 0.999782 0.999733 0.999322 0.9998 1 0.999998 0.999945 0.999998
+0.999779 0.999998 1 0.999991 0.999998 0.999999 0.99949 1 0.999165 1
+0.999991 0.999833 0.999694 1.00014 0.999247 1.00001 0.999976 1.00001
+0.99974 0.999947 0.998428 1.00052 1.00383 1.00011 0.991395 1.0006 1.00077
+0.999952 0.999955 1.00003 0.999937 0.999955 0.999616 0.999266 0.99916
+1 0.999989 0.999831 0.999696 1 0.999239 0.999998 0.999998 0.999993
+0.999998 0.999998 0.999426 0.999998 0.999999 0.999998 0.999916 0.999714
+0.99951 0.999825 0.999998 0.999999 0.999962 0.999837 0.999605 1 0.999164
+0.999996 0.99999 1 0.99999 0.999991 0.998888 1.00002 0.999955 0.999942
+0.999432 1.00007 1.00956;
+#X coords 0 2 99 0 200 140 1;
+#X restore 634 -1 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array tab2 100 float 3;
+#A 0 8.595e-06 0.0615936 0.127096 0.18809 0.251487 0.314087 0.376949
+0.439804 0.502669 0.565481 0.628309 0.691149 0.753982 0.816816 0.879645
+0.942477 1.00531 1.06814 1.13097 1.1938 1.25663 1.31947 1.3823 1.44513
+1.50796 1.5708 1.63363 1.69646 1.75929 1.82212 1.88496 1.94779 2.01062
+2.07345 2.13628 2.19912 2.26195 2.32478 2.38761 2.45045 2.51327 2.5761
+2.63893 2.70178 2.76457 2.82751 2.89011 2.9535 3.01727 3.08969 3.14147
+3.19331 3.26573 3.3295 3.39289 3.45549 3.51843 3.58122 3.64407 3.7069
+3.76973 3.83255 3.89539 3.95822 4.02105 4.08388 4.14672 4.20955 4.27238
+4.33521 4.39804 4.46088 4.52371 4.58654 4.64937 4.7122 4.77504 4.83787
+4.9007 4.96353 5.02637 5.0892 5.15203 5.21486 5.27769 5.34052 5.40335
+5.46619 5.52902 5.59185 5.65469 5.71752 5.78033 5.8432 5.90605 5.96891
+6.03151 6.09491 6.1559 6.21446;
+#X coords 0 6.283 99 0 200 140 1;
+#X restore 639 200 graph;
+#X text 621 56 1;
+#X text 633 342 0;
+#X text 615 265 pi;
+#X text 608 195 2pi;
+#X obj 25 203 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 33 249 5 0 0 0 - - -;
+#X text 621 -8 2;
+#X text 610 382 updated for Pd version 0.39;
+#X text 691 145 frequency;
+#X text 631 141 0;
+#X text 814 144 44100;
+#N canvas 876 177 375 255 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-pole 80;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 398 370 pd startup;
+#X text 575 127 gain=0;
+#X text 574 327 phase=0;
+#X obj 25 226 filter-graph1 100 44100;
+#X text 44 202 <-- compute;
+#X text 34 266 index;
+#X text 104 -6 ALL-PASS FILTERS;
+#X floatatom 346 264 3 -99 99 0 - #0-pole -;
+#X obj 239 306 rpole~;
+#X obj 346 287 / 100;
+#X obj 239 281 rzero_rev~;
+#X text 341 240 pole (%);
+#X text 14 20 The all-pass filter has a phase response that depends
+on its coefficient \, and a flat frequency response. The coefficient
+(p) gives the location of the pole. There is a zero at 1/p \, unless
+p=0. If p=0 the filter is effectively a one-sample delay. Negative
+values of $p$ are allowed \, as long as p is between -1 and 1;
+#X connect 7 0 17 0;
+#X connect 17 0 0 0;
+#X connect 17 0 8 0;
+#X connect 17 1 0 1;
+#X connect 17 1 24 0;
+#X connect 17 2 0 2;
+#X connect 21 0 23 0;
+#X connect 22 0 0 3;
+#X connect 23 0 24 1;
+#X connect 23 0 22 1;
+#X connect 24 0 22 0;
diff --git a/desiredata/doc/3.audio.examples/H15.phaser.pd b/desiredata/doc/3.audio.examples/H15.phaser.pd
new file mode 100644
index 00000000..4de372c1
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H15.phaser.pd
@@ -0,0 +1,109 @@
+#N canvas 25 22 703 596 12;
+#X text 448 562 updated for Pd version 0.39;
+#X text 167 -1 PHASER;
+#N canvas 876 177 375 255 startup 0;
+#X obj 22 24 loadbang;
+#X obj 22 48 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 22 67 f \$0;
+#X text 35 195 This subpatch loads initial;
+#X text 31 219 values in number boxes.;
+#X msg 22 91 \; \$1-pole 80;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 5 0;
+#X restore 323 561 pd startup;
+#N canvas 0 0 660 424 chord 0;
+#X obj 87 97 -~ 0.5;
+#X obj 87 146 clip~ -0.5 0.5;
+#X obj 87 169 cos~;
+#X obj 91 252 hip~ 5;
+#X obj 91 315 outlet~;
+#X obj 87 122 *~ 3;
+#X obj 87 74 phasor~ 220;
+#X obj 221 97 -~ 0.5;
+#X obj 221 146 clip~ -0.5 0.5;
+#X obj 221 169 cos~;
+#X obj 221 122 *~ 3;
+#X obj 356 100 -~ 0.5;
+#X obj 356 149 clip~ -0.5 0.5;
+#X obj 356 172 cos~;
+#X obj 356 125 *~ 3;
+#X obj 491 100 -~ 0.5;
+#X obj 491 149 clip~ -0.5 0.5;
+#X obj 491 172 cos~;
+#X obj 491 125 *~ 3;
+#X obj 221 74 phasor~ 251;
+#X obj 356 77 phasor~ 281;
+#X obj 491 77 phasor~ 311;
+#X text 147 32 test sound for phaser;
+#X obj 91 285 *~ 0.2;
+#X connect 0 0 5 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 23 0;
+#X connect 5 0 1 0;
+#X connect 6 0 0 0;
+#X connect 7 0 10 0;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 8 0;
+#X connect 11 0 14 0;
+#X connect 12 0 13 0;
+#X connect 13 0 3 0;
+#X connect 14 0 12 0;
+#X connect 15 0 18 0;
+#X connect 16 0 17 0;
+#X connect 17 0 3 0;
+#X connect 18 0 16 0;
+#X connect 19 0 7 0;
+#X connect 20 0 11 0;
+#X connect 21 0 15 0;
+#X connect 23 0 4 0;
+#X restore 73 271 pd chord;
+#X obj 72 533 output~;
+#X obj 95 325 rpole~;
+#X obj 95 300 rzero_rev~;
+#X obj 95 374 rpole~;
+#X obj 95 349 rzero_rev~;
+#X obj 95 422 rpole~;
+#X obj 95 397 rzero_rev~;
+#X obj 95 471 rpole~;
+#X obj 95 446 rzero_rev~;
+#X obj 72 501 +~;
+#X text 23 17 The phaser ranks \, along with fuzz and wah-wah \, as
+one of the great guitar pedals. A phaser simply adds an all-passed
+copy of the signal to the original \, making phase reinforcement and
+cancellation at frequencies that depend on the all-pass coefficients.
+In this example the coefficients range from 0.88 to 0.98 \, controlled
+by a phasor~ object (no relation). The phasor~ is converted to a symmetrical
+triangle wave (abs($v1-0.5)) and then ranged appropriately.;
+#X obj 250 417 phasor~ 0.3;
+#X text 22 158 Many variations of this have been invented. A deeper
+effect can be obtained by using 12 all-pass filters and adding the
+outputs of the 4th \, 8th. and 12th one to the original. Various stereo
+configurations are possible. Some people use 6 instead of the 4 stages
+used here. Controls can be added to change the frequency of sweeping
+and the range of the all-pass coeefficients.;
+#X obj 250 449 expr~ 1 - 0.03 - 0.6*abs($v1-0.5)*abs($v1-0.5);
+#X connect 3 0 6 0;
+#X connect 3 0 13 0;
+#X connect 5 0 8 0;
+#X connect 6 0 5 0;
+#X connect 7 0 10 0;
+#X connect 8 0 7 0;
+#X connect 9 0 12 0;
+#X connect 10 0 9 0;
+#X connect 11 0 13 1;
+#X connect 12 0 11 0;
+#X connect 13 0 4 0;
+#X connect 13 0 4 1;
+#X connect 15 0 17 0;
+#X connect 17 0 6 1;
+#X connect 17 0 5 1;
+#X connect 17 0 8 1;
+#X connect 17 0 7 1;
+#X connect 17 0 10 1;
+#X connect 17 0 9 1;
+#X connect 17 0 12 1;
+#X connect 17 0 11 1;
diff --git a/desiredata/doc/3.audio.examples/H16.adsr.filter.qlist.pd b/desiredata/doc/3.audio.examples/H16.adsr.filter.qlist.pd
new file mode 100644
index 00000000..f112d2b6
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/H16.adsr.filter.qlist.pd
@@ -0,0 +1,167 @@
+#N canvas 131 52 921 585 12;
+#X obj 12 219 r trigger;
+#X obj 12 437 *~;
+#X obj 12 330 *~ 0.01;
+#X obj 12 365 *~;
+#X obj 12 395 *~;
+#X obj 59 359 r pitch;
+#X obj 59 409 mtof;
+#X floatatom 59 384 4 0 0 0 - - -;
+#X floatatom 36 271 4 0 0 0 - - -;
+#X obj 36 246 r level;
+#X floatatom 110 271 4 0 0 0 - - -;
+#X obj 110 246 r attack;
+#X floatatom 195 271 4 0 0 0 - - -;
+#X obj 195 246 r decay;
+#X floatatom 270 271 4 0 0 0 - - -;
+#X floatatom 364 271 4 0 0 0 - - -;
+#X obj 270 246 r sustain;
+#X obj 364 246 r release;
+#X obj 499 158 r note;
+#X msg 500 236 \; trigger 1;
+#X obj 602 225 del;
+#X msg 602 247 \; trigger 0;
+#X obj 14 166 qlist;
+#X obj 14 7 r qlist;
+#X msg 35 34 bang;
+#X msg 35 59 rewind;
+#X obj 42 88 r tempo;
+#X floatatom 42 113 4 0 0 0 - - -;
+#X msg 42 138 tempo \$1;
+#X obj 499 201 t b f;
+#X obj 550 198 s pitch;
+#X obj 624 176 r duration;
+#X floatatom 624 201 4 0 0 0 - - -;
+#X floatatom 499 181 4 0 0 0 - - -;
+#X obj 268 319 r trigger;
+#X floatatom 294 375 4 0 0 0 - - -;
+#X floatatom 366 405 4 0 0 0 - - -;
+#X floatatom 456 405 4 0 0 0 - - -;
+#X floatatom 542 405 4 0 0 0 - - -;
+#X floatatom 638 405 4 0 0 0 - - -;
+#X obj 294 350 r level2;
+#X obj 366 380 r attack2;
+#X obj 456 380 r decay2;
+#X obj 542 380 r sustain2;
+#X obj 638 380 r release2;
+#X obj 59 434 tabosc4~ array1;
+#X floatatom 218 365 4 0 0 0 - - -;
+#X obj 12 481 vcf~;
+#X floatatom 119 487 4 0 0 0 - - -;
+#X obj 119 462 r q;
+#X obj 12 305 adsr 0 0 0 0 0;
+#X obj 268 443 adsr 0 0 0 0 0;
+#X obj 294 400 / 69.23;
+#X obj 218 390 mtof;
+#X obj 218 415 sqrt;
+#X obj 218 440 sqrt;
+#X obj 176 335 r filter;
+#X obj 219 493 *~;
+#X obj 219 518 *~;
+#X obj 268 468 +~ 1;
+#X obj 218 465 *~;
+#X text 118 214 ADSR for amplitude:;
+#N canvas 0 258 703 380 otherstuff 0;
+#X obj 289 86 loadbang;
+#X obj 418 85 loadbang;
+#N canvas 0 0 450 300 graph2 0;
+#X array array1 67 float 1;
+#A 0 0 0 0 0 0.714286 0.742857 0.757143 0.771429 0.778571 0.785714
+0.785714 0.785714 0.785714 0.790476 0.795238 0.614286 0.585714 0.442857
+0.271429 -0.128571 -0.142857 -0.157143 -0.171429 -0.642857 -0.528571
+-0.614286 -0.685714 -0.828571 -0.828571 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0.557143 0.571429 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 66 -1 200 140 1;
+#X restore 62 81 graph;
+#X msg 418 115 \; qlist read qlist2.txt;
+#X msg 289 111 \; level 100 \; attack 20 \; decay 300 \; sustain 70
+\; release 300 \; duration 300 \; pitch 72 \; filter 38 \; level2 49
+\; attack2 19 \; decay2 300 \; sustain2 17 \; release2 700 \; q 3 \;
+tempo 4;
+#X connect 0 0 4 0;
+#X connect 1 0 3 0;
+#X restore 134 560 pd otherstuff;
+#X text 87 33 <--start loop;
+#X text 104 61 <--stop loop;
+#X text 90 113 <--set tempo;
+#X text 257 562 <--loadbangs and table;
+#X msg 447 517 \; qlist read qlist2.txt;
+#X text 441 493 click to reload qlist2.txt;
+#X obj 12 509 output~;
+#X text 229 19 This is an analog-synth sound made using a wavetable
+oscillator and a "vcf~' object. Unkike the "floyd" example earlier
+\, we use a qlist object to do the sequencing. This can also be adapted
+to make a keyboard synth.;
+#X text 227 85 The qlist reads the file \, "qlist2.txt" \, which contains
+four "note" messages and a message at the end that restarts the qlist
+at the beginning. The "note" messages are translated into a pitch change
+and triggers for the ADSRs.;
+#X text 667 551 updated for Pd version 0.39;
+#X text 379 305 ADSR for filter. Here \, it works better to make the
+envelope modify a constant "filter pitch"--so the "filter" receive
+gets the "mtof" treatment and the ADSR is an offset in halftones.;
+#X text 231 1 ANALOG_STYLE SYNTH USING QLIST;
+#X connect 0 0 50 0;
+#X connect 1 0 47 0;
+#X connect 2 0 3 0;
+#X connect 2 0 3 1;
+#X connect 3 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 1 0;
+#X connect 5 0 7 0;
+#X connect 6 0 45 0;
+#X connect 7 0 6 0;
+#X connect 8 0 50 1;
+#X connect 9 0 8 0;
+#X connect 10 0 50 2;
+#X connect 11 0 10 0;
+#X connect 12 0 50 3;
+#X connect 13 0 12 0;
+#X connect 14 0 50 4;
+#X connect 15 0 50 5;
+#X connect 16 0 14 0;
+#X connect 17 0 15 0;
+#X connect 18 0 33 0;
+#X connect 20 0 21 0;
+#X connect 23 0 22 0;
+#X connect 24 0 22 0;
+#X connect 25 0 22 0;
+#X connect 26 0 27 0;
+#X connect 27 0 28 0;
+#X connect 28 0 22 0;
+#X connect 29 0 20 0;
+#X connect 29 0 19 0;
+#X connect 29 1 30 0;
+#X connect 31 0 32 0;
+#X connect 32 0 20 1;
+#X connect 33 0 29 0;
+#X connect 34 0 51 0;
+#X connect 35 0 52 0;
+#X connect 36 0 51 2;
+#X connect 37 0 51 3;
+#X connect 38 0 51 4;
+#X connect 39 0 51 5;
+#X connect 40 0 35 0;
+#X connect 41 0 36 0;
+#X connect 42 0 37 0;
+#X connect 43 0 38 0;
+#X connect 44 0 39 0;
+#X connect 45 0 1 1;
+#X connect 46 0 53 0;
+#X connect 47 0 69 0;
+#X connect 47 0 69 1;
+#X connect 48 0 47 2;
+#X connect 49 0 48 0;
+#X connect 50 0 2 0;
+#X connect 51 0 59 0;
+#X connect 52 0 51 1;
+#X connect 53 0 54 0;
+#X connect 54 0 55 0;
+#X connect 55 0 60 0;
+#X connect 56 0 46 0;
+#X connect 57 0 58 0;
+#X connect 57 0 58 1;
+#X connect 58 0 47 1;
+#X connect 59 0 60 1;
+#X connect 60 0 57 0;
+#X connect 60 0 57 1;
diff --git a/desiredata/doc/3.audio.examples/I01.Fourier.analysis.pd b/desiredata/doc/3.audio.examples/I01.Fourier.analysis.pd
new file mode 100644
index 00000000..31bcce63
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I01.Fourier.analysis.pd
@@ -0,0 +1,90 @@
+#N canvas 25 8 688 708 12;
+#X floatatom 38 264 7 0 0 0 - - -;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-real 64 float 2;
+#X coords 0 64 64 -64 256 200 1;
+#X restore 423 184 graph;
+#X floatatom 38 168 5 0 32 0 - - -;
+#X obj 78 240 samplerate~;
+#X obj 38 215 t f b;
+#X obj 38 240 *;
+#X obj 80 568 metro 250;
+#X obj 38 637 tabwrite~ \$0-real;
+#X obj 67 614 tabwrite~ \$0-imaginary;
+#X obj 38 384 osc~;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-imaginary 64 float 2;
+#X coords 0 64 64 -64 256 200 1;
+#X restore 423 417 graph;
+#X obj 69 360 f;
+#X floatatom 91 316 3 0 100 0 - - -;
+#X obj 91 337 / 100;
+#X obj 38 191 / 64;
+#X text 504 163 real part;
+#X text 489 398 imaginary part;
+#X obj 80 545 loadbang;
+#X text 94 166 <- frequency;
+#X text 133 182 (as multiple;
+#X text 135 198 of SR/64 \, the;
+#X text 133 215 fundamental);
+#X text 170 345 of a cycle;
+#X text 431 638 updated for PD version 0.39;
+#X obj 89 590 s \$0-snap;
+#X obj 69 286 r \$0-snap;
+#X text 127 315 <- phase in;
+#X text 161 331 hundredths;
+#X text 113 264 <- frequency \, Hz.;
+#X text 87 415 given the real and imaginary part;
+#X text 88 431 of a complex-valued signal. Here;
+#X text 87 447 the imaginary part is zero (the;
+#X text 86 400 fft~ computes the Fourier transform \,;
+#X text 186 541 real and imaginary;
+#X text 186 557 outputs are graphed;
+#X text 185 574 separately.;
+#X text 86 464 input is real-valued). The output;
+#X text 85 482 is a (real \, imaginary) pair for each;
+#X text 86 500 frequency from 0 to 63 (in units of;
+#X text 87 520 SR/64).;
+#X text 145 -36 The "fft~" object has separate inlets for the real
+and imaginary parts of a complex-valued signal and outputs its Fourier
+transform \, again using separate outlets for the real and imaginary
+part. The transform is done on one block of samples (here the block
+size is 64 \, Pd's default.) The outputs give the complex amplitudes
+of the harmonics of the input signal \, from DC up. The harmonics are
+tuned to the fundamental frequency of the analysis \, 1/64th of the
+sample rate. If the frequency (in harmonics) is an integer \, the result
+is two harmonics symmetric about the Nyquist frequency. Fractional
+frequencies spill across harmonics. Changing the initial phase rotates
+energy from real to imaginary and back.;
+#X text 26 -24 ANALYSIS;
+#X text 27 -42 FOURIER;
+#X msg 38 79 0;
+#X msg 38 100 10;
+#X msg 38 121 10.5;
+#X text 159 283 bang-on-snapshot;
+#X text 157 297 from below;
+#X text 100 363 sync phase with snapshots;
+#X obj 37 423 fft~;
+#X msg 274 614 \; pd dsp 1;
+#X connect 0 0 9 0;
+#X connect 2 0 14 0;
+#X connect 3 0 5 1;
+#X connect 4 0 5 0;
+#X connect 4 1 3 0;
+#X connect 5 0 0 0;
+#X connect 6 0 7 0;
+#X connect 6 0 8 0;
+#X connect 6 0 24 0;
+#X connect 9 0 49 0;
+#X connect 11 0 9 1;
+#X connect 12 0 13 0;
+#X connect 13 0 11 1;
+#X connect 14 0 4 0;
+#X connect 17 0 6 0;
+#X connect 17 0 50 0;
+#X connect 25 0 11 0;
+#X connect 43 0 2 0;
+#X connect 44 0 2 0;
+#X connect 45 0 2 0;
+#X connect 49 0 7 0;
+#X connect 49 1 8 0;
diff --git a/desiredata/doc/3.audio.examples/I02.Hann.window.pd b/desiredata/doc/3.audio.examples/I02.Hann.window.pd
new file mode 100644
index 00000000..1cf8b46a
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I02.Hann.window.pd
@@ -0,0 +1,181 @@
+#N canvas 281 223 567 589 12;
+#N canvas 228 148 651 544 fft-analysis 0;
+#X obj 15 164 *~;
+#X obj 14 99 inlet~;
+#X obj 15 218 rfft~;
+#X obj 36 140 tabreceive~ \$0-hann;
+#X obj 14 306 *~;
+#X obj 56 306 *~;
+#X obj 15 356 sqrt~;
+#X obj 14 498 tabwrite~ \$0-magnitude;
+#X obj 23 386 loadbang;
+#X obj 23 470 metro 250;
+#X obj 23 449 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X msg 31 411 \; pd dsp 1;
+#X obj 15 8 block~ 512;
+#X text 225 131 tabreceive~ outputs array contents \,;
+#X text 225 149 constantly \, every block. Here it's;
+#X text 223 169 used to get the Hann window to;
+#X text 225 187 multiply by the input.;
+#X text 120 7 block~ object does no computation but declares this;
+#X text 120 24 window to be operating at a different block size from
+;
+#X text 122 58 Fourier transform.;
+#X text 121 40 the parent window. This determines the size of the;
+#X text 76 99 The inlet~ automatically re-blocks to the new block size.
+;
+#X obj 15 332 +~;
+#X text 94 308 Take the magnitude by squaring real and imaginary part
+\, adding and taking square root.;
+#X text 110 424 periodically graph the output. It appears every 512
+samples (about 12 milliseconds) but we only update the graph 4 times
+per second. The graph is back on the main (parent) window.;
+#X text 82 215 forward real FFT. Like "fft~" \, but only one inlet
+(for the real part) and only the first half of the output signals are
+used. (The others are determined by symmetry: they're complex conjugates
+of the first half \, in reverse order.) This takes 1/2 the CPU time
+of "fft".;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 2 0 4 0;
+#X connect 2 0 4 1;
+#X connect 2 1 5 0;
+#X connect 2 1 5 1;
+#X connect 3 0 0 1;
+#X connect 4 0 22 0;
+#X connect 5 0 22 1;
+#X connect 6 0 7 0;
+#X connect 8 0 10 0;
+#X connect 8 0 11 0;
+#X connect 9 0 7 0;
+#X connect 10 0 9 0;
+#X connect 22 0 6 0;
+#X restore 26 289 pd fft-analysis;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-magnitude 256 float 0;
+#X coords 0 256 255 0 256 100 1;
+#X restore 287 208 graph;
+#X text 110 6 WINDOWING AND BLOCKING FOURIER TRANSFORMS;
+#X obj 25 264 osc~;
+#X floatatom 25 218 5 0 0 0 - - -;
+#X obj 25 240 * 10;
+#X text 305 559 updated for Pd version 0.39;
+#X text 349 183 magnitude;
+#X text 284 311 0;
+#X text 522 311 255;
+#X text 273 297 0;
+#X text 255 253 128;
+#X text 254 203 256;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 512 float 1;
+#A 0 0 3.76403e-05 0.000150591 0.000338793 0.000602275 0.000940949
+0.00135478 0.00184369 0.00240764 0.00304651 0.00376022 0.00454867 0.00541174
+0.0063493 0.00736117 0.00844723 0.00960734 0.0108413 0.0121489 0.01353
+0.0149843 0.0165117 0.0181119 0.0197847 0.0215298 0.0233469 0.0252359
+0.0271963 0.0292279 0.0313304 0.0335035 0.0357469 0.0380601 0.040443
+0.042895 0.0454159 0.0480052 0.0506626 0.0533877 0.05618 0.0590392
+0.0619648 0.0649563 0.0680134 0.0711355 0.0743222 0.077573 0.0808874
+0.0842649 0.0877051 0.0912073 0.0947711 0.0983959 0.102081 0.105826
+0.109631 0.113494 0.117416 0.121395 0.125431 0.129524 0.133672 0.137876
+0.142134 0.146446 0.150811 0.155229 0.159699 0.16422 0.168792 0.173413
+0.178084 0.182803 0.18757 0.192384 0.197244 0.20215 0.2071 0.212095
+0.217133 0.222214 0.227337 0.2325 0.237704 0.242948 0.24823 0.25355
+0.258907 0.264301 0.26973 0.275194 0.280691 0.286222 0.291785 0.297379
+0.303003 0.308658 0.314341 0.320052 0.32579 0.331555 0.337344 0.343159
+0.348997 0.354857 0.36074 0.366643 0.372567 0.37851 0.384471 0.390449
+0.396444 0.402454 0.40848 0.414519 0.420571 0.426634 0.432709 0.438794
+0.444889 0.450991 0.457101 0.463218 0.469339 0.475466 0.481596 0.487729
+0.493864 0.5 0.506136 0.512271 0.518404 0.524534 0.53066 0.536782 0.542899
+0.549009 0.555111 0.561205 0.56729 0.573365 0.579429 0.585481 0.59152
+0.597545 0.603556 0.609551 0.615529 0.62149 0.627433 0.633357 0.63926
+0.645143 0.651003 0.656841 0.662656 0.668445 0.67421 0.679948 0.685659
+0.691342 0.696997 0.702621 0.708215 0.713778 0.719309 0.724806 0.73027
+0.735699 0.741092 0.74645 0.75177 0.757052 0.762295 0.767499 0.772663
+0.777786 0.782867 0.787905 0.7929 0.79785 0.802756 0.807616 0.81243
+0.817197 0.821916 0.826587 0.831209 0.83578 0.840301 0.844771 0.849189
+0.853554 0.857866 0.862124 0.866328 0.870476 0.874569 0.878605 0.882584
+0.886506 0.890369 0.894174 0.897919 0.901605 0.905229 0.908793 0.912295
+0.915736 0.919113 0.922428 0.925678 0.928865 0.931987 0.935044 0.938036
+0.940961 0.94382 0.946613 0.949338 0.951995 0.954585 0.957106 0.959558
+0.96194 0.964254 0.966497 0.96867 0.970773 0.972804 0.974765 0.976654
+0.978471 0.980216 0.981889 0.983489 0.985016 0.98647 0.987852 0.989159
+0.990393 0.991553 0.992639 0.993651 0.994589 0.995452 0.99624 0.996954
+0.997593 0.998156 0.998645 0.999059 0.999398 0.999661 0.999849 0.999962
+1 0.999962 0.999849 0.999661 0.999398 0.999059 0.998645 0.998156 0.997592
+0.996953 0.996239 0.995451 0.994588 0.99365 0.992638 0.991552 0.990392
+0.989158 0.987851 0.986469 0.985015 0.983488 0.981887 0.980215 0.978469
+0.976652 0.974763 0.972803 0.970771 0.968669 0.966495 0.964252 0.961939
+0.959556 0.957104 0.954583 0.951993 0.949336 0.946611 0.943819 0.940959
+0.938034 0.935042 0.931985 0.928863 0.925676 0.922425 0.919111 0.915733
+0.912293 0.908791 0.905227 0.901602 0.897917 0.894171 0.890367 0.886503
+0.882582 0.878602 0.874566 0.870473 0.866325 0.862121 0.857863 0.853551
+0.849186 0.844768 0.840298 0.835777 0.831205 0.826584 0.821913 0.817194
+0.812427 0.807613 0.802753 0.797847 0.792896 0.787901 0.782863 0.777782
+0.77266 0.767496 0.762292 0.757048 0.751766 0.746446 0.741089 0.735695
+0.730266 0.724802 0.719305 0.713774 0.708211 0.702617 0.696993 0.691338
+0.685655 0.679944 0.674206 0.668441 0.662652 0.656837 0.650999 0.645139
+0.639256 0.633353 0.627429 0.621486 0.615525 0.609547 0.603552 0.597541
+0.591516 0.585477 0.579425 0.573361 0.567286 0.561201 0.555107 0.549004
+0.542895 0.536778 0.530656 0.52453 0.518399 0.512266 0.506132 0.499996
+0.49386 0.487725 0.481592 0.475462 0.469335 0.463213 0.457097 0.450987
+0.444885 0.43879 0.432705 0.42663 0.420566 0.414515 0.408476 0.40245
+0.39644 0.390445 0.384466 0.378505 0.372563 0.366639 0.360736 0.354853
+0.348993 0.343155 0.33734 0.331551 0.325786 0.320048 0.314337 0.308654
+0.303 0.297375 0.291781 0.286218 0.280687 0.27519 0.269726 0.264297
+0.258904 0.253547 0.248226 0.242944 0.237701 0.232497 0.227333 0.222211
+0.21713 0.212092 0.207097 0.202146 0.19724 0.19238 0.187566 0.182799
+0.17808 0.17341 0.168788 0.164217 0.159696 0.155226 0.150808 0.146443
+0.142131 0.137873 0.133669 0.129521 0.125428 0.121392 0.117413 0.113491
+0.109628 0.105823 0.102078 0.0983929 0.0947681 0.0912044 0.0877022
+0.0842621 0.0808846 0.0775702 0.0743194 0.0711327 0.0680107 0.0649537
+0.0619622 0.0590366 0.0561775 0.0533853 0.0506602 0.0480029 0.0454136
+0.0428928 0.0404408 0.038058 0.0357448 0.0335015 0.0313284 0.029226
+0.0271944 0.025234 0.0233452 0.0215281 0.019783 0.0181104 0.0165102
+0.0149829 0.0135286 0.0121476 0.01084 0.00960615 0.0084461 0.0073601
+0.00634828 0.00541082 0.00454783 0.00375944 0.00304583 0.00240701 0.00184315
+0.00135431 0.000940561 0.000601947 0.000338584 0.000150442 3.75807e-05
+;
+#X coords 0 1 511 0 200 120 1;
+#X restore 278 401 graph;
+#X msg 156 415 0;
+#X obj 50 464 osc~;
+#X obj 50 416 samplerate~;
+#X obj 50 487 *~ -0.5;
+#X obj 50 510 +~ 0.5;
+#X obj 42 535 tabwrite~ \$0-hann;
+#X text 264 393 1;
+#X text 257 511 0;
+#X text 273 524 0;
+#X obj 50 440 / 512;
+#X obj 42 393 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 321 373 Hann window;
+#X text 98 462 period 512;
+#X text 40 368 recalculate Hann;
+#X text 75 383 window table;
+#X text 100 233 tens of Hz.;
+#X text 80 215 <- frequency \,;
+#X text 98 270 click here and;
+#X text 170 286 <- see;
+#X text 21 32 In this example we use a sub-patch ("pd fft-analysis")
+to re-block the Fourier transform to 512 points. The signal is multiplied
+by the Hann window function (which is just a raised cosine.) The magnitude
+\, which is computed in the sub-patch \, is graphed below in this window.
+The point at 255 corresponds to just below the Nyquist frequency. Phase
+isn't shown \, and unlike the previous patch we don't control the initial
+phase of the oscillator. (For fun \, try drawing other window functions
+with the mouse...);
+#X text 459 527 511;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 3 0;
+#X connect 14 0 15 1;
+#X connect 15 0 17 0;
+#X connect 16 0 23 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
+#X connect 23 0 15 0;
+#X connect 24 0 16 0;
+#X connect 24 0 14 0;
+#X connect 24 0 19 0;
diff --git a/desiredata/doc/3.audio.examples/I03.resynthesis.pd b/desiredata/doc/3.audio.examples/I03.resynthesis.pd
new file mode 100644
index 00000000..f709d29f
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I03.resynthesis.pd
@@ -0,0 +1,132 @@
+#N canvas 73 310 580 406 12;
+#N canvas 265 48 643 640 fft-analysis 0;
+#X obj 15 164 *~;
+#X obj 14 99 inlet~;
+#X obj 15 218 rfft~;
+#X obj 36 140 tabreceive~ \$0-hann;
+#X obj 14 353 *~;
+#X obj 56 353 *~;
+#X obj 15 8 block~ 512 4;
+#X text 85 88 The inlet~ now re-uses 3/4 of the previous block \, along
+with the 128 new samples.;
+#X text 221 141 window function as before.;
+#X obj 76 196 tabreceive~ \$0-gain;
+#X obj 77 225 *~;
+#X obj 16 506 *~;
+#X obj 37 481 tabreceive~ \$0-hann;
+#X obj 77 283 /~ 768;
+#X text 98 301 divide by 3N/2 (factor of N because rfft and rifft aren't
+normalized \, and 3/2 is the gain of overlap-4 reconstruction when
+Hann window function is applied twice.);
+#X text 120 216 Just to show we're doing something \, we multiply each
+channel by a gain controlled by an array in the main window. The control
+is quartic-scaled for easy editing.;
+#X obj 78 251 *~;
+#X text 92 357 Multiply the (complex-valued) spectrum amplitudes by
+the (real-valued) gain-and-normalization-factor;
+#X obj 15 399 rifft~;
+#X text 89 396 Real-valued inverse Fourier transform. This uses only
+the first N/@ points of its inputs \, supplying the rest by symmerty
+(so it's OK that rfft~ obly puts out those N/2 points.) There's only
+one outlet because the output is real-valued.;
+#X obj 16 566 outlet~;
+#X text 88 499 Multiply by the Hann window function again \, necessary
+because the operation we performed might result in a signal that doesn't
+go smoothly to zero at both ends.;
+#X text 89 566 This repackages the output into 64-sample chunks for
+the parent window. Since we're operating with an overlap \, the outlet~
+object performs an overlapped sum of the blocks computed in this window.
+;
+#X text 129 8 block~ object specifies vector size of 512 and overlap
+four. This window now computes blocks of 512 samples at intervals of
+128 samples computed on the parent patch.;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 2 0 4 0;
+#X connect 2 1 5 0;
+#X connect 3 0 0 1;
+#X connect 4 0 18 0;
+#X connect 5 0 18 1;
+#X connect 9 0 10 0;
+#X connect 9 0 10 1;
+#X connect 10 0 16 0;
+#X connect 10 0 16 1;
+#X connect 11 0 20 0;
+#X connect 12 0 11 1;
+#X connect 13 0 4 1;
+#X connect 13 0 5 1;
+#X connect 16 0 13 0;
+#X connect 18 0 11 0;
+#X restore 26 289 pd fft-analysis;
+#X text 290 362 updated for Pd version 0.39;
+#N canvas 35 66 592 433 Hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 512 float 0;
+#X coords 0 1 511 0 200 120 1;
+#X restore 293 249 graph;
+#X msg 171 263 0;
+#X obj 65 312 osc~;
+#X obj 65 264 samplerate~;
+#X obj 65 335 *~ -0.5;
+#X obj 65 358 +~ 0.5;
+#X obj 57 383 tabwrite~ \$0-hann;
+#X text 279 241 1;
+#X text 272 359 0;
+#X text 288 372 0;
+#X obj 65 288 / 512;
+#X obj 57 241 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 336 221 Hann window;
+#X text 113 310 period 512;
+#X text 90 215 recalculate Hann;
+#X text 125 230 window table;
+#X obj 57 146 loadbang;
+#X msg 79 179 \; pd dsp 1;
+#X text 40 27 The Hann window is now recomputed on 'loadbang' to make
+the file smaller (it doesn't have to be saved with the array.);
+#X text 474 375 511;
+#X connect 1 0 2 1;
+#X connect 2 0 4 0;
+#X connect 3 0 10 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 10 0 2 0;
+#X connect 11 0 3 0;
+#X connect 11 0 1 0;
+#X connect 11 0 6 0;
+#X connect 16 0 11 0;
+#X connect 16 0 17 0;
+#X restore 192 318 pd Hann-window;
+#X obj 27 323 output~;
+#X obj 25 264 noise~;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-gain 256 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 256 -0.01 512 60 1;
+#X restore 22 168 graph;
+#X msg 192 264 const 0;
+#X obj 192 293 s \$0-gain;
+#X text 138 0 FOURIER RESYNTHESIS;
+#X text 6 218 0;
+#X text 6 159 1;
+#X text 19 228 0;
+#X text 516 231 22K;
+#X text 270 261 <- reset gain;
+#X text 224 148 GAIN;
+#X text 21 24 Using Fourier resynthesis you can take an incoming sound
+\, operate on its spectrum \, and hear the result. Here we start with
+white noise and apply a frequency-dependent gain \, which works as
+a graphic equalizer. There are N/2 = 256 points \, each spaced SR/512
+Hz. apart (although their frequency ranges overlap). Open the "fft-analysis"
+patch to see the workings.;
+#X connect 0 0 3 0;
+#X connect 0 0 3 1;
+#X connect 4 0 0 0;
+#X connect 6 0 7 0;
diff --git a/desiredata/doc/3.audio.examples/I04.noisegate.pd b/desiredata/doc/3.audio.examples/I04.noisegate.pd
new file mode 100644
index 00000000..0a8bd12a
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I04.noisegate.pd
@@ -0,0 +1,330 @@
+#N canvas 42 28 657 564 12;
+#X floatatom 316 376 0 0 0 0 - - -;
+#X floatatom 81 384 0 0 100 0 - - -;
+#N canvas 98 0 648 669 fft-analysis 0;
+#X obj 35 589 *~;
+#X obj 143 305 *~;
+#X obj 158 150 *~;
+#X obj 35 72 *~;
+#X obj 76 527 *~;
+#X obj 35 44 inlet~;
+#X obj 35 528 *~;
+#X obj 34 101 rfft~;
+#X obj 35 558 rifft~;
+#X obj 36 616 outlet~;
+#X obj 119 149 *~;
+#X obj 119 176 +~;
+#X obj 165 278 r mask-level;
+#X obj 100 422 /~;
+#X obj 355 23 block~ 1024 4;
+#X text 176 446 is signal power and "m" is mask.;
+#X obj 131 332 -~;
+#X obj 131 355 max~ 0;
+#X obj 99 448 q8_sqrt~;
+#X text 175 464 (zero if s < m).;
+#X obj 144 256 tabreceive~ \$0-mask;
+#X obj 76 72 tabreceive~ \$0-hann;
+#X obj 69 590 tabreceive~ \$0-hann;
+#N canvas 91 250 910 495 calculate-mask 0;
+#X obj 125 379 inlet~;
+#X msg 371 283 0;
+#X msg 371 166 0;
+#X obj 240 196 float;
+#X obj 294 200 + 1;
+#X obj 240 144 bang~;
+#X obj 240 169 spigot;
+#X floatatom 411 218 0 0 0 0 - - -;
+#X obj 315 408 -~;
+#X obj 371 258 sel 0;
+#X obj 327 443 *~;
+#X obj 293 443 +~;
+#X floatatom 351 313 0 0 0 0 - - -;
+#X obj 240 219 t f f;
+#X obj 370 113 r make-mask;
+#X obj 371 141 t b f;
+#X obj 411 165 /;
+#X text 483 212 number of;
+#X text 491 227 frames;
+#X floatatom 481 166 0 0 0 0 - - -;
+#X obj 480 113 r window-msec;
+#X obj 481 136 / 4;
+#X text 521 133 hop size (analysis;
+#X text 546 149 period) in msec;
+#X obj 359 408 tabreceive~ \$0-mask;
+#X obj 292 468 tabsend~ \$0-mask;
+#X obj 371 218 <;
+#X obj 235 258 expr 1/($f1+1);
+#X text 134 17 calculate a mask using N msec of background noise;
+#X text 43 354 current power (for each channel);
+#X text 367 430 average the current power into the last mask to get
+the new mask. The new value is weighted 1/n on the nth iteration.;
+#X text 390 312 weight to average in new power to mask;
+#X text 11 203 loop counting to desired;
+#X text 78 219 number of frames;
+#X text 72 39 This loops for "make-mask" milliseconds \, averaging
+power in each channel over that amount of time. This is done by a moving
+average whose weight is adjusted to average each new value equally
+with each of the accumulating ones.;
+#X connect 0 0 8 0;
+#X connect 1 0 12 0;
+#X connect 2 0 3 1;
+#X connect 2 0 26 0;
+#X connect 3 0 13 0;
+#X connect 3 0 4 0;
+#X connect 4 0 3 1;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X connect 7 0 26 1;
+#X connect 8 0 10 0;
+#X connect 9 0 1 0;
+#X connect 10 0 11 1;
+#X connect 11 0 25 0;
+#X connect 12 0 10 1;
+#X connect 13 0 26 0;
+#X connect 13 1 27 0;
+#X connect 14 0 15 0;
+#X connect 15 0 2 0;
+#X connect 15 1 16 0;
+#X connect 16 0 7 0;
+#X connect 20 0 21 0;
+#X connect 21 0 16 1;
+#X connect 21 0 19 0;
+#X connect 24 0 8 1;
+#X connect 24 0 11 0;
+#X connect 26 0 6 1;
+#X connect 26 0 9 0;
+#X connect 27 0 12 0;
+#X restore 132 203 pd calculate-mask;
+#X text 91 98 real Fourier transform;
+#X obj 357 57 loadbang;
+#X msg 357 80 \; pd dsp 1 \; window-size 1024;
+#X text 193 355 ... but not less than zero;
+#X text 101 561 real inverse Fourier transform;
+#X text 196 498 normalize by 2/(3N) where N is window size;
+#X text 168 332 current power ("s") minus level-adjusted mask ("m")
+;
+#X text 156 175 compute power (call it "s") in each channel;
+#X obj 123 395 +~ 1e-20;
+#X text 203 395 protect against division by zero;
+#X text 179 426 compute sqrt((s-m)/s) where "s";
+#X text 296 204 <- subwindow calculates noise mask;
+#X obj 98 499 /~ 1536;
+#X connect 0 0 9 0;
+#X connect 1 0 16 1;
+#X connect 2 0 11 1;
+#X connect 3 0 7 0;
+#X connect 4 0 8 1;
+#X connect 5 0 3 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 0;
+#X connect 7 0 10 0;
+#X connect 7 0 10 1;
+#X connect 7 1 4 0;
+#X connect 7 1 2 0;
+#X connect 7 1 2 1;
+#X connect 8 0 0 0;
+#X connect 10 0 11 0;
+#X connect 11 0 16 0;
+#X connect 11 0 23 0;
+#X connect 11 0 32 0;
+#X connect 12 0 1 1;
+#X connect 13 0 18 0;
+#X connect 16 0 17 0;
+#X connect 17 0 13 0;
+#X connect 18 0 36 0;
+#X connect 20 0 1 0;
+#X connect 21 0 3 1;
+#X connect 22 0 0 1;
+#X connect 25 0 26 0;
+#X connect 32 0 13 1;
+#X connect 36 0 6 1;
+#X connect 36 0 4 1;
+#X restore 80 441 pd fft-analysis;
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 1024 float 0;
+#X coords 0 1 1023 0 300 100 1;
+#X restore 82 311 graph;
+#X obj 378 165 osc~;
+#X obj 378 190 *~ -0.5;
+#X obj 378 214 +~ 0.5;
+#X obj 331 247 tabwrite~ \$0-hann;
+#X obj 37 88 r window-size;
+#X obj 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 38 251 s window-sec;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 177 252 s window-hz;
+#X obj 49 201 * 1000;
+#X obj 49 228 s window-msec;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X obj 330 105 r window-hz;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 8 calculate Hann window table (variable window size) and
+constants window-hz (fundamental frequency of analysis) \, window-sec
+and window-msec (analysis window size in seconds and msec).;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 7 0 9 1;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 14 0 6 0;
+#X connect 14 0 9 0;
+#X connect 14 1 7 0;
+#X connect 14 2 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 0;
+#X connect 18 0 1 1;
+#X connect 19 0 1 0;
+#X connect 19 1 4 0;
+#X connect 19 1 18 0;
+#X restore 331 478 pd hann-window;
+#X text 197 355 noise;
+#N canvas 132 255 660 373 insample 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sample 155948 float 0;
+#X coords 0 1 155947 -1 400 150 1;
+#X restore 236 25 graph;
+#X obj 19 23 r read-sample;
+#X obj 19 74 unpack s f;
+#X obj 116 74 s insamprate;
+#X obj 19 184 soundfiler;
+#X obj 19 208 s insamplength;
+#X text 113 252 read a sample;
+#X obj 33 251 loadbang;
+#X obj 19 100 t s b;
+#X obj 75 99 symbol \$0-sample;
+#X obj 19 135 pack s s;
+#X msg 19 160 read -resize \$1 \$2;
+#X obj 74 46 44100;
+#X msg 33 275 \; read-sample ../sound/bell.aiff;
+#X msg 31 322 \; read-sample ../sound/voice.wav;
+#X obj 19 47 t a b;
+#X connect 1 0 15 0;
+#X connect 2 0 8 0;
+#X connect 2 1 3 0;
+#X connect 4 0 5 0;
+#X connect 7 0 13 0;
+#X connect 8 0 10 0;
+#X connect 8 1 9 0;
+#X connect 9 0 10 1;
+#X connect 10 0 11 0;
+#X connect 11 0 4 0;
+#X connect 12 0 3 0;
+#X connect 15 0 2 0;
+#X connect 15 1 12 0;
+#X restore 331 456 pd insample;
+#X obj 316 401 s mask-level;
+#X floatatom 202 379 0 0 100 0 - - -;
+#X text 317 325 on;
+#X text 362 326 off;
+#X text 317 309 masking;
+#X text 290 5 DENOISER;
+#X msg 361 349 0;
+#N canvas 190 43 812 571 test-signal 0;
+#X obj 75 328 line~;
+#X obj 75 250 f;
+#X obj 251 164 r insamprate;
+#X obj 583 219 *~;
+#X obj 76 442 *~;
+#X obj 583 110 noise~;
+#X obj 370 493 +~;
+#X obj 98 415 dbtorms;
+#X obj 605 193 dbtorms;
+#X obj 98 390 inlet;
+#X obj 605 169 inlet;
+#X obj 371 541 outlet~;
+#X obj 236 139 r insamplength;
+#X msg 75 304 0 \, \$1 \$2;
+#X obj 75 276 pack 0 0;
+#X obj 236 248 /;
+#X obj 251 190 * 0.001;
+#X obj 251 219 t b f;
+#X obj 370 516 hip~ 5;
+#X obj 75 136 loadbang;
+#X obj 75 182 metro 1000;
+#X obj 583 135 bp~ 10000 3;
+#X obj 75 161 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X text 270 247 sample duration \, msec;
+#X text 126 84 looped sample playback;
+#X obj 75 356 tabread4~ \$0-sample;
+#X text 580 83 filtered noise;
+#X text 105 15 TEST SIGNAL: looped sample plus noise. The inlets control
+amplitude of each in dB.;
+#X connect 0 0 25 0;
+#X connect 1 0 14 0;
+#X connect 2 0 16 0;
+#X connect 3 0 6 1;
+#X connect 4 0 6 0;
+#X connect 5 0 21 0;
+#X connect 6 0 18 0;
+#X connect 7 0 4 1;
+#X connect 8 0 3 1;
+#X connect 9 0 7 0;
+#X connect 10 0 8 0;
+#X connect 12 0 1 1;
+#X connect 12 0 15 0;
+#X connect 13 0 0 0;
+#X connect 14 0 13 0;
+#X connect 15 0 14 1;
+#X connect 15 0 20 1;
+#X connect 16 0 17 0;
+#X connect 17 0 15 0;
+#X connect 17 1 15 1;
+#X connect 18 0 11 0;
+#X connect 19 0 22 0;
+#X connect 20 0 1 0;
+#X connect 21 0 3 0;
+#X connect 22 0 20 0;
+#X connect 25 0 4 0;
+#X restore 81 409 pd test-signal;
+#X text 69 357 sampler;
+#X text 443 311 calculate noise mask;
+#X obj 80 488 output~;
+#X msg 462 338 \; make-mask 2000;
+#X msg 316 348 15;
+#N canvas 0 0 592 442 mask-table 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-mask 512 float 0;
+#X coords 0 500 511 0 400 300 1;
+#X restore 110 76 graph;
+#X text 25 14 This table ($0-mask) is the average power measured in
+each channel of the spectrum \, presumed to represent the noise floor.
+;
+#X restore 331 500 pd mask-table;
+#X text 80 322 amplitudes (dB);
+#X text 68 26 This patch attempts to scrub the noise floor from a sample
+in two steps. First using the "make-mask" message (which is caught
+in the "fft-analysis" window) \, you estimate the background spectrum.
+You would normally do this at a moment when only the background noise
+is audible. Then \, turn on "masking" (to 15 by default \, but try
+other values) and the patch will try to clean the background noise
+out of a signal.;
+#X text 67 149 For this demonstration \, you control the amplitudes
+of a looping sample and a filtered noise source. Normally you'd hit
+"calculate noise mask" with only hte noise turned on \, then turn both
+the noise and the sampler on \, and also "masking" \, to see if the
+patch can clean the noise out of the signal. Open the "fft-analysis"
+window to see the algorithm \, or the "insample" window to change samples
+\, or "mask-table" to see the current mask (the average signal power
+of the noise to clean out of the signal).;
+#X connect 0 0 6 0;
+#X connect 1 0 13 0;
+#X connect 2 0 16 0;
+#X connect 2 0 16 1;
+#X connect 7 0 13 1;
+#X connect 12 0 0 0;
+#X connect 13 0 2 0;
+#X connect 18 0 0 0;
diff --git a/desiredata/doc/3.audio.examples/I05.compressor.pd b/desiredata/doc/3.audio.examples/I05.compressor.pd
new file mode 100644
index 00000000..10fe3375
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I05.compressor.pd
@@ -0,0 +1,237 @@
+#N canvas 557 371 620 428 12;
+#N canvas 297 254 646 523 fft-analysis 0;
+#X obj 115 409 *~;
+#X obj 75 409 *~;
+#X obj 76 114 *~;
+#X obj 77 88 inlet~;
+#X obj 76 137 rfft~;
+#X obj 75 466 *~;
+#X obj 171 177 *~;
+#X obj 75 432 rifft~;
+#X obj 75 489 outlet~;
+#X obj 137 177 *~;
+#X obj 137 200 +~;
+#X obj 461 85 block~ 1024 4;
+#X obj 137 351 clip~;
+#X obj 178 306 r squelch;
+#X obj 110 114 tabreceive~ \$0-hann;
+#X obj 177 329 expr 0.01*$f1*$f1;
+#X obj 461 116 loadbang;
+#X obj 137 381 *~ 0.00065;
+#X obj 137 225 +~ 1e-20;
+#X obj 136 262 q8_rsqrt~;
+#X obj 109 466 tabreceive~ \$0-hann;
+#X text 31 5 As in the previous patch \, this works by multiplying
+each channel of the Fourier analysis by a real number computed from
+the magnitude. If the magnutude is "m" \, the correction factor is
+1/m \, but only to an upper limit controlled by the "squelch" parameter.
+;
+#X text 211 174 squared magnitude;
+#X text 219 225 protect against divide-by-zero;
+#X text 223 261 quick 8-bit-accurate reciprocal square root;
+#X text 222 277 (done by table lookup - about 0.25% accurate);
+#X text 193 351 limit the gain to squelch*squelch/100;
+#X text 238 381 normalize for 1024-point \, overlap-4 Hann;
+#X text 151 409 multiply gain by real and complex part;
+#X text 152 429 of the amplitude;
+#X text 130 137 outputs complex amplitudes;
+#X msg 461 139 \; pd dsp 1 \; window-size 1024 \; squelch 10 \; squelch-set
+set 10;
+#X connect 0 0 7 1;
+#X connect 1 0 7 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 4 0 9 0;
+#X connect 4 0 9 1;
+#X connect 4 0 1 0;
+#X connect 4 1 6 0;
+#X connect 4 1 6 1;
+#X connect 4 1 0 0;
+#X connect 5 0 8 0;
+#X connect 6 0 10 1;
+#X connect 7 0 5 0;
+#X connect 9 0 10 0;
+#X connect 10 0 18 0;
+#X connect 12 0 17 0;
+#X connect 13 0 15 0;
+#X connect 14 0 2 1;
+#X connect 15 0 12 2;
+#X connect 16 0 31 0;
+#X connect 17 0 0 1;
+#X connect 17 0 1 1;
+#X connect 18 0 19 0;
+#X connect 19 0 12 0;
+#X connect 20 0 5 1;
+#X restore 42 330 pd fft-analysis;
+#X floatatom 57 196 0 0 500 0 - squelch-set -;
+#X obj 57 220 s squelch;
+#N canvas 190 43 427 657 test-signal 0;
+#X obj 90 444 line~;
+#X obj 90 369 f;
+#X obj 90 524 outlet~;
+#X msg 90 423 0 \, \$1 \$2;
+#X obj 90 397 pack 0 0;
+#X obj 190 344 /;
+#X obj 317 295 * 0.001;
+#X obj 90 497 hip~ 5;
+#X obj 35 246 loadbang;
+#X msg 90 322 1;
+#X obj 90 344 metro 1000;
+#X obj 259 272 t b b f;
+#X obj 117 270 t b f;
+#X obj 90 469 tabread4~ \$0-sample;
+#X text 21 28 test signal: looped sample playback;
+#X obj 67 131 hip~ 5;
+#X obj 67 107 adc~ 1;
+#X obj 129 131 s insamprate;
+#X obj 67 70 inlet;
+#X obj 129 107 samplerate~;
+#X obj 116 246 r \$0-samplength;
+#X obj 259 246 r \$0-insamprate;
+#X obj 67 154 tabwrite~ \$0-sample;
+#X connect 0 0 13 0;
+#X connect 1 0 4 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 1;
+#X connect 5 0 10 1;
+#X connect 6 0 5 1;
+#X connect 7 0 2 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 11 0 9 0;
+#X connect 11 1 5 0;
+#X connect 11 2 6 0;
+#X connect 12 0 9 0;
+#X connect 12 1 5 0;
+#X connect 12 1 1 1;
+#X connect 13 0 7 0;
+#X connect 15 0 22 0;
+#X connect 16 0 15 0;
+#X connect 18 0 19 0;
+#X connect 18 0 16 0;
+#X connect 19 0 17 0;
+#X connect 20 0 12 0;
+#X connect 21 0 11 0;
+#X restore 43 303 pd test-signal;
+#X obj 43 359 output~;
+#N canvas 388 86 722 350 insample 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sample 155948 float 0;
+#X coords 0 1 155947 -1 400 150 1;
+#X restore 259 24 graph;
+#X obj 19 23 r read-sample;
+#X obj 19 74 unpack s f;
+#X obj 19 184 soundfiler;
+#X text 356 250 read a sample;
+#X obj 276 249 loadbang;
+#X obj 19 100 t s b;
+#X obj 75 99 symbol \$0-sample;
+#X obj 19 135 pack s s;
+#X msg 19 160 read -resize \$1 \$2;
+#X obj 74 46 44100;
+#X obj 19 47 t a b;
+#X msg 276 273 \; read-sample ../sound/bell.aiff;
+#X obj 29 208 s \$0-samplength;
+#X obj 116 74 s \$0-insamprate;
+#X obj 19 247 /;
+#X obj 19 271 * 1000;
+#X obj 19 294 s \$0-samp-msec;
+#X obj 57 247 r \$0-insamprate;
+#X connect 1 0 11 0;
+#X connect 2 0 6 0;
+#X connect 2 1 14 0;
+#X connect 3 0 13 0;
+#X connect 3 0 15 0;
+#X connect 5 0 12 0;
+#X connect 6 0 8 0;
+#X connect 6 1 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 14 0;
+#X connect 11 0 2 0;
+#X connect 11 1 10 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X connect 18 0 15 1;
+#X restore 223 313 pd insample;
+#X text 362 406 updated for Pd version 0.39;
+#X text 56 43 Here we divide each complex channel in the Fourier analysis
+by its own magnitude to "flatten" the spectrum. The "squelch" control
+limits the amplitude boost the algorithm will apply. If infinite \,
+you'll get a white spectrum. If less \, the louder parts of the spectrum
+will be flattened but the quieter ones will only be boosted by the
+squelch value.;
+#X text 73 6 DYNAMIC RANGE COMPRESSION BY FOURIER ANALYSIS CHANNEL
+;
+#X floatatom 223 366 5 0 0 0 - #0-samp-msec -;
+#X obj 43 282 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 62 281 <- record;
+#X text 276 365 sample length \, msec;
+#X msg 292 183 ../sound/bell.aiff;
+#X msg 292 208 ../sound/voice.wav;
+#X msg 292 233 ../sound/voice2.wav;
+#X text 91 197 <- squelch;
+#X text 295 161 change input sound;
+#X obj 292 259 s read-sample;
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 1024 float 0;
+#X coords 0 1 1023 0 300 100 1;
+#X restore 82 311 graph;
+#X obj 378 165 osc~;
+#X obj 378 190 *~ -0.5;
+#X obj 378 214 +~ 0.5;
+#X obj 331 247 tabwrite~ \$0-hann;
+#X obj 37 88 r window-size;
+#X obj 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 38 251 s window-sec;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 177 252 s window-hz;
+#X obj 49 201 * 1000;
+#X obj 49 228 s window-msec;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X obj 330 105 r window-hz;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 8 calculate Hann window table (variable window size) and
+constants window-hz (fundamental frequency of analysis) \, window-sec
+and window-msec (analysis window size in seconds and msec).;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 7 0 9 1;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 14 0 6 0;
+#X connect 14 0 9 0;
+#X connect 14 1 7 0;
+#X connect 14 2 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 0;
+#X connect 18 0 1 1;
+#X connect 19 0 1 0;
+#X connect 19 1 4 0;
+#X connect 19 1 18 0;
+#X restore 223 335 pd hann-window;
+#X connect 0 0 4 0;
+#X connect 0 0 4 1;
+#X connect 1 0 2 0;
+#X connect 3 0 0 0;
+#X connect 10 0 3 0;
+#X connect 13 0 18 0;
+#X connect 14 0 18 0;
+#X connect 15 0 18 0;
diff --git a/desiredata/doc/3.audio.examples/I06.timbre.stamp.pd b/desiredata/doc/3.audio.examples/I06.timbre.stamp.pd
new file mode 100644
index 00000000..0fd540cd
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I06.timbre.stamp.pd
@@ -0,0 +1,370 @@
+#N canvas 72 0 668 530 12;
+#N canvas 147 0 795 617 fft-analysis 0;
+#X obj 94 511 *~;
+#X obj 55 511 *~;
+#X obj 413 356 *~;
+#X obj 372 356 *~;
+#X obj 372 379 +~;
+#X obj 54 183 *~;
+#X obj 54 158 inlet~;
+#X obj 54 206 rfft~;
+#X obj 54 560 *~;
+#X obj 141 245 *~;
+#X obj 372 333 rfft~;
+#X obj 54 535 rifft~;
+#X obj 54 583 outlet~;
+#X obj 107 245 *~;
+#X obj 107 268 +~;
+#X text 458 408 modulus;
+#X obj 107 420 *~;
+#X obj 600 13 block~ 1024 4;
+#X obj 107 398 clip~;
+#X obj 87 184 tabreceive~ \$0-hann;
+#X obj 599 53 loadbang;
+#X obj 148 346 r squelch;
+#X obj 147 369 expr 0.01*$f1*$f1;
+#X obj 107 294 +~ 1e-20;
+#X obj 108 480 *~ 0.00065;
+#X obj 87 560 tabreceive~ \$0-hann;
+#X obj 373 307 *~;
+#X obj 373 282 inlet~;
+#X obj 406 308 tabreceive~ \$0-hann;
+#X obj 107 321 q8_rsqrt~;
+#X obj 372 402 q8_sqrt~;
+#X text 458 425 of control;
+#X text 456 442 amplitude;
+#X text 196 248 reciprocal;
+#X text 199 267 modulus of;
+#X text 195 287 filter input;
+#X text 196 306 amplitude;
+#X msg 599 76 \; pd dsp 1 \; window-size 1024 \; squelch 30 \; squelch-set
+set 30;
+#X text 115 159 filter input;
+#X text 438 282 control source;
+#X text 434 332 Fourier transform;
+#X text 28 17 Internal workings of the timbre stamping algorithm. First
+the "filter input" is treated as in the compressor patch \, multiplying
+each channel amplitude by one over its modulus (but limited by the
+"squelch" parameter.) It is then multiplied by the modulus of the channel
+amplitude for the control source (which is Fourier analyzed in parallel
+with the filter input.);
+#X text 145 422 multiply the two amplitude;
+#X text 143 439 factors (for compression;
+#X text 145 455 and to apply new timbre);
+#X connect 0 0 11 1;
+#X connect 1 0 11 0;
+#X connect 2 0 4 1;
+#X connect 3 0 4 0;
+#X connect 4 0 30 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 7 0 13 0;
+#X connect 7 0 13 1;
+#X connect 7 0 1 0;
+#X connect 7 1 9 0;
+#X connect 7 1 9 1;
+#X connect 7 1 0 0;
+#X connect 8 0 12 0;
+#X connect 9 0 14 1;
+#X connect 10 0 3 0;
+#X connect 10 0 3 1;
+#X connect 10 1 2 0;
+#X connect 10 1 2 1;
+#X connect 11 0 8 0;
+#X connect 13 0 14 0;
+#X connect 14 0 23 0;
+#X connect 16 0 24 0;
+#X connect 18 0 16 0;
+#X connect 19 0 5 1;
+#X connect 20 0 37 0;
+#X connect 21 0 22 0;
+#X connect 22 0 18 2;
+#X connect 23 0 29 0;
+#X connect 24 0 0 1;
+#X connect 24 0 1 1;
+#X connect 25 0 8 1;
+#X connect 26 0 10 0;
+#X connect 27 0 26 0;
+#X connect 28 0 26 1;
+#X connect 29 0 18 0;
+#X connect 30 0 16 1;
+#X restore 86 444 pd fft-analysis;
+#X text 137 12 CORT&ZACK's SECRET;
+#X text 27 422 filter;
+#X text 29 437 input;
+#X text 232 441 source;
+#X text 233 422 control;
+#X floatatom 53 300 0 0 500 0 - squelch-set -;
+#X obj 53 324 s squelch;
+#X obj 86 468 output~;
+#X msg 157 278 ../sound/bell.aiff;
+#X msg 157 303 ../sound/voice.wav;
+#X msg 157 328 ../sound/voice2.wav;
+#X obj 157 354 s read-sound1;
+#X msg 373 280 ../sound/bell.aiff;
+#X msg 373 305 ../sound/voice.wav;
+#X msg 373 330 ../sound/voice2.wav;
+#X obj 373 355 s read-sound2;
+#X text 386 256 control source;
+#X text 169 255 filter input;
+#X text 255 231 change input sounds;
+#X floatatom 454 409 5 0 0 0 - #0-samp-msec -;
+#X obj 87 394 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 215 395 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 190 43 661 593 test-signals 0;
+#X obj 90 444 line~;
+#X obj 90 369 f;
+#X obj 90 524 outlet~;
+#X msg 90 423 0 \, \$1 \$2;
+#X obj 90 397 pack 0 0;
+#X obj 190 344 /;
+#X obj 249 325 * 0.001;
+#X obj 90 497 hip~ 5;
+#X obj 35 246 loadbang;
+#X msg 90 322 1;
+#X obj 90 344 metro 1000;
+#X obj 191 302 t b b f;
+#X obj 117 270 t b f;
+#X obj 90 469 tabread4~ \$0-sample;
+#X text 21 28 test signal: looped sample playback;
+#X obj 40 159 hip~ 5;
+#X obj 40 135 adc~ 1;
+#X obj 102 159 s insamprate;
+#X obj 40 98 inlet;
+#X obj 102 135 samplerate~;
+#X obj 116 246 r \$0-samplength;
+#X obj 191 276 r \$0-insamprate;
+#X obj 40 182 tabwrite~ \$0-sample;
+#X obj 398 437 line~;
+#X obj 398 362 f;
+#X obj 398 517 outlet~;
+#X msg 398 416 0 \, \$1 \$2;
+#X obj 398 390 pack 0 0;
+#X obj 498 337 /;
+#X obj 557 318 * 0.001;
+#X obj 398 490 hip~ 5;
+#X obj 343 239 loadbang;
+#X msg 398 315 1;
+#X obj 398 337 metro 1000;
+#X obj 499 295 t b b f;
+#X obj 425 263 t b f;
+#X obj 348 152 hip~ 5;
+#X obj 348 128 adc~ 1;
+#X obj 348 91 inlet;
+#X obj 410 128 samplerate~;
+#X obj 410 152 s insamprate2;
+#X obj 348 175 tabwrite~ \$0-sample2;
+#X obj 424 239 r \$0-samplength2;
+#X obj 499 269 r \$0-insamprate2;
+#X obj 398 462 tabread4~ \$0-sample2;
+#X connect 0 0 13 0;
+#X connect 1 0 4 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 1;
+#X connect 5 0 10 1;
+#X connect 6 0 5 1;
+#X connect 7 0 2 0;
+#X connect 8 0 9 0;
+#X connect 9 0 10 0;
+#X connect 10 0 1 0;
+#X connect 11 0 9 0;
+#X connect 11 1 5 0;
+#X connect 11 2 6 0;
+#X connect 12 0 9 0;
+#X connect 12 1 5 0;
+#X connect 12 1 1 1;
+#X connect 13 0 7 0;
+#X connect 15 0 22 0;
+#X connect 16 0 15 0;
+#X connect 18 0 19 0;
+#X connect 18 0 16 0;
+#X connect 19 0 17 0;
+#X connect 20 0 12 0;
+#X connect 21 0 11 0;
+#X connect 23 0 44 0;
+#X connect 24 0 27 0;
+#X connect 26 0 23 0;
+#X connect 27 0 26 0;
+#X connect 28 0 27 1;
+#X connect 28 0 33 1;
+#X connect 29 0 28 1;
+#X connect 30 0 25 0;
+#X connect 31 0 32 0;
+#X connect 32 0 33 0;
+#X connect 33 0 24 0;
+#X connect 34 0 32 0;
+#X connect 34 1 28 0;
+#X connect 34 2 29 0;
+#X connect 35 0 32 0;
+#X connect 35 1 28 0;
+#X connect 35 1 24 1;
+#X connect 36 0 41 0;
+#X connect 37 0 36 0;
+#X connect 38 0 39 0;
+#X connect 38 0 37 0;
+#X connect 39 0 40 0;
+#X connect 42 0 35 0;
+#X connect 43 0 34 0;
+#X connect 44 0 30 0;
+#X restore 87 415 pd test-signals;
+#X text 104 393 <- record ->;
+#N canvas 388 86 722 350 insample2 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sample2 62079 float 0;
+#X coords 0 1 62078 -1 400 150 1;
+#X restore 298 24 graph;
+#X obj 19 74 unpack s f;
+#X obj 19 184 soundfiler;
+#X text 356 250 read a sample;
+#X obj 276 249 loadbang;
+#X obj 19 100 t s b;
+#X obj 19 135 pack s s;
+#X msg 19 160 read -resize \$1 \$2;
+#X obj 74 46 44100;
+#X obj 19 47 t a b;
+#X obj 19 247 /;
+#X obj 19 271 * 1000;
+#X obj 19 23 r read-sound2;
+#X obj 116 74 s \$0-insamprate2;
+#X obj 75 99 symbol \$0-sample2;
+#X obj 29 208 s \$0-samplength2;
+#X obj 57 247 r \$0-insamprate2;
+#X obj 19 294 s \$0-samp2-msec;
+#X msg 276 273 \; read-sound2 ../sound/voice.wav;
+#X connect 1 0 5 0;
+#X connect 1 1 13 0;
+#X connect 2 0 10 0;
+#X connect 2 0 15 0;
+#X connect 4 0 18 0;
+#X connect 5 0 6 0;
+#X connect 5 1 14 0;
+#X connect 6 0 7 0;
+#X connect 7 0 2 0;
+#X connect 8 0 13 0;
+#X connect 9 0 1 0;
+#X connect 9 1 8 0;
+#X connect 10 0 11 0;
+#X connect 11 0 17 0;
+#X connect 12 0 9 0;
+#X connect 14 0 6 1;
+#X connect 16 0 10 1;
+#X restore 334 430 pd insample2;
+#N canvas 388 86 722 350 insample1 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sample 155948 float 0;
+#X coords 0 1 155947 -1 400 150 1;
+#X restore 259 24 graph;
+#X obj 19 74 unpack s f;
+#X obj 19 184 soundfiler;
+#X text 356 250 read a sample;
+#X obj 276 249 loadbang;
+#X obj 19 100 t s b;
+#X obj 75 99 symbol \$0-sample;
+#X obj 19 135 pack s s;
+#X msg 19 160 read -resize \$1 \$2;
+#X obj 74 46 44100;
+#X obj 19 47 t a b;
+#X obj 29 208 s \$0-samplength;
+#X obj 116 74 s \$0-insamprate;
+#X obj 19 247 /;
+#X obj 19 271 * 1000;
+#X obj 19 294 s \$0-samp-msec;
+#X obj 57 247 r \$0-insamprate;
+#X obj 19 23 r read-sound1;
+#X msg 276 273 \; read-sound1 ../sound/bell.aiff;
+#X connect 1 0 5 0;
+#X connect 1 1 12 0;
+#X connect 2 0 11 0;
+#X connect 2 0 13 0;
+#X connect 4 0 18 0;
+#X connect 5 0 7 0;
+#X connect 5 1 6 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 8 0 2 0;
+#X connect 9 0 12 0;
+#X connect 10 0 1 0;
+#X connect 10 1 9 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 16 0 13 1;
+#X connect 17 0 10 0;
+#X restore 334 408 pd insample1;
+#X floatatom 453 432 5 0 0 0 - #0-samp2-msec -;
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 1024 float 0;
+#X coords 0 1 1023 0 300 100 1;
+#X restore 82 311 graph;
+#X obj 378 165 osc~;
+#X obj 378 190 *~ -0.5;
+#X obj 378 214 +~ 0.5;
+#X obj 331 247 tabwrite~ \$0-hann;
+#X obj 37 88 r window-size;
+#X obj 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 38 251 s window-sec;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 177 252 s window-hz;
+#X obj 49 201 * 1000;
+#X obj 49 228 s window-msec;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X obj 330 105 r window-hz;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 8 calculate Hann window table (variable window size) and
+constants window-hz (fundamental frequency of analysis) \, window-sec
+and window-msec (analysis window size in seconds and msec).;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 7 0 9 1;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 14 0 6 0;
+#X connect 14 0 9 0;
+#X connect 14 1 7 0;
+#X connect 14 2 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 0;
+#X connect 18 0 1 1;
+#X connect 19 0 1 0;
+#X connect 19 1 4 0;
+#X connect 19 1 18 0;
+#X restore 334 455 pd hann-window;
+#X text 509 412 sample lengths \,;
+#X text 510 427 msec;
+#X text 27 35 This is a Fourier-based "vocoder" (perhaps better called
+a "timbre stamp") like the one the Convolution brothers use. The "control
+source" is analyzed to get its spectral envelope \, which is then stamped
+onto the "filter input" by adjusting the amplitudes of its Fourier
+transform. The "filter input" is first whitened by the compression
+algorithm from the previous patch in this series. The best value of
+"squelch" to use depends critically on what kind of sounds are used
+for the filter input and the control source.;
+#X text 402 498 updated for Pd version 0.39;
+#X connect 0 0 8 0;
+#X connect 0 0 8 1;
+#X connect 6 0 7 0;
+#X connect 9 0 12 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 13 0 16 0;
+#X connect 14 0 16 0;
+#X connect 15 0 16 0;
+#X connect 21 0 23 0;
+#X connect 22 0 23 1;
+#X connect 23 0 0 0;
+#X connect 23 1 0 1;
diff --git a/desiredata/doc/3.audio.examples/I07.phase.vocoder.pd b/desiredata/doc/3.audio.examples/I07.phase.vocoder.pd
new file mode 100644
index 00000000..735b8cd2
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I07.phase.vocoder.pd
@@ -0,0 +1,548 @@
+#N canvas 425 33 744 599 12;
+#X floatatom 494 315 5 0 0 0 - transpo-set -;
+#X floatatom 167 383 3 0 0 0 - speed-set -;
+#X floatatom 55 385 7 0 0 0 - location-set -;
+#N canvas 90 42 821 693 fft-analysis 0;
+#X obj 51 477 *~;
+#X obj 18 477 *~;
+#X obj 18 499 -~;
+#X obj 167 475 *~;
+#X obj 136 475 *~;
+#X obj 136 497 +~;
+#X obj 109 193 *~;
+#X obj 78 193 *~;
+#X obj 50 193 *~;
+#X obj 19 193 *~;
+#X obj 19 218 +~;
+#X obj 127 379 *~;
+#X obj 20 622 *~;
+#X obj 238 430 rfft~;
+#X obj 108 161 rfft~;
+#X obj 19 564 rifft~;
+#X obj 21 646 outlet~;
+#X obj 97 379 *~;
+#X obj 97 401 +~;
+#X obj 124 218 -~;
+#X obj 18 431 *~;
+#X obj 51 432 *~;
+#X obj 127 622 r window-size;
+#X obj 426 595 r window-size;
+#X obj 426 644 block~;
+#X obj 19 349 +~ 1e-15;
+#X obj 19 598 *~;
+#X obj 52 598 tabreceive~ \$0-hann;
+#X obj 127 643 expr 2/(3*$f1);
+#X obj 591 563 loadbang;
+#X msg 591 589 \; pd dsp 1 \; window-size 2048 \; transpo 0 \; rewind
+bang;
+#X msg 426 619 set \$1 4;
+#X obj 97 425 q8_rsqrt~;
+#N canvas 139 105 1006 799 read-windows 0;
+#X obj 18 693 *~;
+#X obj 340 448 r window-size;
+#X obj 156 300 f;
+#X obj 102 91 r window-size;
+#X obj 102 139 /;
+#X obj 195 695 *~;
+#X obj 156 255 bang~;
+#X obj 17 551 line~;
+#X obj 102 164 * 1000;
+#X obj 288 224 r speed;
+#X obj 178 276 r location;
+#X obj 198 302 +;
+#X obj 288 272 *;
+#X obj 183 470 +;
+#X obj 143 446 t f f;
+#X msg 17 523 \$1 \, \$2 \$3;
+#X obj 17 496 pack 0 0 0;
+#X obj 178 371 / 1000;
+#X obj 156 394 *;
+#X text 188 394 reading location (samples);
+#X obj 51 597 / 4;
+#X obj 288 245 * 0.01;
+#X floatatom 340 498 7 0 0 0 - - -;
+#X obj 340 474 *;
+#X obj 499 365 r transpo;
+#X obj 499 387 * 0.01;
+#X obj 501 408 + 69;
+#X obj 502 429 mtof;
+#X obj 502 451 / 440;
+#X obj 375 474 t b f;
+#X obj 19 719 outlet~;
+#X obj 195 720 outlet~;
+#X obj 218 664 tabreceive~ \$0-hann;
+#X obj 803 386 r location;
+#X msg 803 409 0;
+#X obj 803 432 s speed;
+#X obj 768 508 r speed;
+#X msg 768 532 set \$1;
+#X obj 768 557 s speed-set;
+#X text 411 498 stretched window size (samples);
+#X obj 877 507 r transpo;
+#X msg 877 533 set \$1;
+#X obj 877 558 s transpo-set;
+#X obj 808 94 r location;
+#X msg 826 278 set \$1;
+#X obj 808 140 t b f;
+#X obj 826 257 f;
+#X obj 754 171 int;
+#X obj 754 203 sel 0;
+#X msg 813 174 1;
+#X msg 813 197 0;
+#X obj 754 228 del 300;
+#X obj 826 302 s location-set;
+#X obj 17 637 tabread4~ \$0-sample;
+#X obj 194 637 tabread4~ \$0-sample;
+#X obj 178 347 r \$0-insamprate;
+#X obj 528 586 r rewind;
+#X msg 528 744 \; location \$1;
+#X floatatom 111 187 5 0 0 0 - - -;
+#X obj 102 115 t f b;
+#X obj 142 139 samplerate~;
+#X obj 102 208 / 4;
+#X obj 233 306 s see-loc;
+#X obj 817 116 r see-loc;
+#X obj 193 420 / 2;
+#X obj 156 420 -;
+#X text 229 417 back up 1/2 window;
+#X obj 16 597 -~;
+#X text 43 6 Read two windows out of the recorded sample \, one 1/4
+ahead of the other. The mid point of the front window is specified
+by "location". If "speed" is nonzero \, "location" automatically precesses.
+;
+#X obj 528 720 * -0.5;
+#X text 91 587 "back" window 1/4 cycle behind "front" one;
+#X text 137 205 computation period (msec) for overlap of 4;
+#X text 164 186 msec in a window;
+#X obj 528 666 /;
+#X obj 528 691 * 1000;
+#X obj 528 642 t f b;
+#X obj 568 666 samplerate~;
+#X obj 528 619 f;
+#X msg 845 711 \; rewind bang \; speed \$1;
+#X obj 845 684 r auto;
+#X obj 730 685 r no-detune;
+#X msg 730 707 \; detune 0;
+#X text 326 275 loop to precess the location according;
+#X text 325 291 to the "speed" parameter.;
+#X text 611 31 if location changes \, update number box;
+#X text 610 50 in main window via "location-set" \, but;
+#X text 613 69 taking care to limit frequency of updates.;
+#X text 756 462 reflect control changes;
+#X text 756 479 in main window.;
+#X text 754 344 setting location by hand;
+#X text 752 362 sets speed to zero.;
+#X text 760 653 misc controls;
+#X text 496 527 "rewind" control takes us;
+#X text 499 545 to a location depending on;
+#X text 499 564 stretched window size.;
+#X connect 0 0 30 0;
+#X connect 1 0 23 0;
+#X connect 2 0 11 0;
+#X connect 2 0 18 0;
+#X connect 3 0 59 0;
+#X connect 4 0 8 0;
+#X connect 5 0 31 0;
+#X connect 6 0 2 0;
+#X connect 7 0 67 0;
+#X connect 7 0 54 0;
+#X connect 8 0 58 0;
+#X connect 8 0 61 0;
+#X connect 9 0 21 0;
+#X connect 10 0 2 1;
+#X connect 11 0 2 1;
+#X connect 11 0 62 0;
+#X connect 12 0 11 1;
+#X connect 13 0 16 1;
+#X connect 14 0 16 0;
+#X connect 14 1 13 0;
+#X connect 15 0 7 0;
+#X connect 16 0 15 0;
+#X connect 17 0 18 1;
+#X connect 18 0 65 0;
+#X connect 20 0 67 1;
+#X connect 21 0 12 0;
+#X connect 22 0 20 0;
+#X connect 22 0 13 1;
+#X connect 22 0 64 0;
+#X connect 22 0 77 1;
+#X connect 23 0 22 0;
+#X connect 24 0 25 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 0;
+#X connect 27 0 28 0;
+#X connect 28 0 29 0;
+#X connect 29 0 23 0;
+#X connect 29 1 23 1;
+#X connect 32 0 5 1;
+#X connect 32 0 0 1;
+#X connect 33 0 34 0;
+#X connect 34 0 35 0;
+#X connect 36 0 37 0;
+#X connect 37 0 38 0;
+#X connect 40 0 41 0;
+#X connect 41 0 42 0;
+#X connect 43 0 45 0;
+#X connect 44 0 52 0;
+#X connect 45 0 47 0;
+#X connect 45 1 46 1;
+#X connect 46 0 44 0;
+#X connect 47 0 48 0;
+#X connect 48 0 49 0;
+#X connect 48 0 51 0;
+#X connect 49 0 47 1;
+#X connect 50 0 47 1;
+#X connect 51 0 50 0;
+#X connect 51 0 46 0;
+#X connect 53 0 0 0;
+#X connect 54 0 5 0;
+#X connect 55 0 17 0;
+#X connect 56 0 77 0;
+#X connect 59 0 4 0;
+#X connect 59 1 60 0;
+#X connect 60 0 4 1;
+#X connect 61 0 16 2;
+#X connect 61 0 12 1;
+#X connect 63 0 45 0;
+#X connect 64 0 65 1;
+#X connect 65 0 14 0;
+#X connect 67 0 53 0;
+#X connect 69 0 57 0;
+#X connect 73 0 74 0;
+#X connect 74 0 69 0;
+#X connect 75 0 73 0;
+#X connect 75 1 76 0;
+#X connect 76 0 73 1;
+#X connect 77 0 75 0;
+#X connect 79 0 78 0;
+#X connect 80 0 81 0;
+#X restore 109 133 pd read-windows;
+#X obj 137 543 tabsend~ prev-imag;
+#X obj 136 567 tabsend~ prev-real;
+#X obj 20 8 tabreceive~ prev-real;
+#X obj 73 29 tabreceive~ prev-imag;
+#X text 272 5 recall previous output amplitude. Its phase will be added
+to the phase difference we measure from two windows in the the recorded
+sound.;
+#X obj 121 69 *~;
+#X obj 89 69 *~;
+#X obj 89 91 +~;
+#X obj 159 94 q8_rsqrt~;
+#X obj 159 71 +~ 1e-20;
+#X obj 73 119 *~;
+#X obj 19 118 *~;
+#X obj 181 290 r lock;
+#X obj 29 245 lrshift~ 1;
+#X obj 24 269 lrshift~ -1;
+#X obj 141 245 lrshift~ 1;
+#X obj 133 269 lrshift~ -1;
+#X obj 35 300 *~;
+#X obj 159 312 *~;
+#X obj 19 325 +~;
+#X obj 125 331 +~;
+#X text 247 66 divide by the magnitude to make a unit-magnitude complex
+amplitude (phase only). The 1e-20 is to prevent overflows. q8_rsqrt~
+is reciprocal square root.;
+#X text 247 165 Take FT of the window in back. Multiply its conjugate
+by the normalized previous output. The result has the magnitude of
+the input sound and phase (previous output phase) minus (back window
+phase).;
+#X text 249 370 Normalize again \, this time taking care to salt each
+channel with 1e-15 so that we get a unit complex number even if everything
+was zero heretofore.;
+#X text 288 427 Now take the FT of the forward window and multiply
+it by the unit complex number from above. The magnitude will be that
+of the forward window and the phase will be the previous output phase
+plus the phase difference between the two analysis windows -- except
+that if "lock" is on \, they will be modified to agree progressively
+better with the inter-channel phase relationships of the input.;
+#X text 249 242 If "lock" is on \, encourage neighboring channels to
+stay in phase by adding the two neighboring complex amplitudes. The
+result will tend toward the channel with the strongest amplitude. If
+the phase relationships between channels in the output and those in
+the input are in parallel \, then neighboring channels of the quotient
+will all have the same phase and this will not change any phases. (lrshift
+shifts the signal to the left or right depending on its argument.)
+;
+#X text 387 560 'set' message to block;
+#X text 390 577 allows variable size;
+#X text 259 126 Read two windows \, one 1/4 length behind the other
+\, of the input sound \, with Hann window function (see inside).;
+#X connect 0 0 2 1;
+#X connect 1 0 2 0;
+#X connect 2 0 35 0;
+#X connect 2 0 15 0;
+#X connect 3 0 5 1;
+#X connect 4 0 5 0;
+#X connect 5 0 34 0;
+#X connect 5 0 15 1;
+#X connect 6 0 19 1;
+#X connect 7 0 19 0;
+#X connect 8 0 10 1;
+#X connect 9 0 10 0;
+#X connect 10 0 48 0;
+#X connect 10 0 47 0;
+#X connect 10 0 53 0;
+#X connect 11 0 18 1;
+#X connect 12 0 16 0;
+#X connect 13 0 1 1;
+#X connect 13 0 3 1;
+#X connect 13 1 0 1;
+#X connect 13 1 4 1;
+#X connect 14 0 9 1;
+#X connect 14 0 7 1;
+#X connect 14 1 6 1;
+#X connect 14 1 8 1;
+#X connect 15 0 26 0;
+#X connect 17 0 18 0;
+#X connect 18 0 32 0;
+#X connect 19 0 49 0;
+#X connect 19 0 50 0;
+#X connect 19 0 54 0;
+#X connect 20 0 1 0;
+#X connect 20 0 4 0;
+#X connect 21 0 0 0;
+#X connect 21 0 3 0;
+#X connect 22 0 28 0;
+#X connect 23 0 31 0;
+#X connect 25 0 17 1;
+#X connect 25 0 17 0;
+#X connect 25 0 20 0;
+#X connect 26 0 12 0;
+#X connect 27 0 26 1;
+#X connect 28 0 12 1;
+#X connect 29 0 30 0;
+#X connect 31 0 24 0;
+#X connect 32 0 20 1;
+#X connect 32 0 21 1;
+#X connect 33 0 14 0;
+#X connect 33 1 13 0;
+#X connect 36 0 40 1;
+#X connect 36 0 40 0;
+#X connect 36 0 45 0;
+#X connect 37 0 39 1;
+#X connect 37 0 39 0;
+#X connect 37 0 44 0;
+#X connect 39 0 41 1;
+#X connect 40 0 41 0;
+#X connect 41 0 43 0;
+#X connect 42 0 44 1;
+#X connect 42 0 45 1;
+#X connect 43 0 42 0;
+#X connect 44 0 8 0;
+#X connect 44 0 7 0;
+#X connect 45 0 9 0;
+#X connect 45 0 6 0;
+#X connect 46 0 51 1;
+#X connect 46 0 52 1;
+#X connect 47 0 51 0;
+#X connect 48 0 51 0;
+#X connect 49 0 52 0;
+#X connect 50 0 52 0;
+#X connect 51 0 53 1;
+#X connect 52 0 54 1;
+#X connect 53 0 25 0;
+#X connect 54 0 11 0;
+#X connect 54 0 11 1;
+#X connect 54 0 21 0;
+#X restore 55 480 pd fft-analysis;
+#N canvas 260 23 647 768 phase-tables 0;
+#N canvas 0 0 450 300 graph2 0;
+#X array prev-imag 4096 float 0;
+#X coords 0 1000 4096 -1000 400 300 1;
+#X restore 169 326 graph;
+#N canvas 0 0 450 300 graph3 0;
+#X array prev-real 4096 float 0;
+#X coords 0 500 4096 -500 400 300 1;
+#X restore 170 17 graph;
+#X restore 440 504 pd phase-tables;
+#X obj 494 338 s transpo;
+#X text 164 364 hundredths;
+#X text 493 294 in cents;
+#X text 389 359 normal;
+#X obj 56 517 output~;
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 1024 float 0;
+#X coords 0 1 1023 0 300 100 1;
+#X restore 82 311 graph;
+#X obj 378 165 osc~;
+#X obj 378 190 *~ -0.5;
+#X obj 378 214 +~ 0.5;
+#X obj 331 247 tabwrite~ \$0-hann;
+#X obj 37 88 r window-size;
+#X obj 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 38 251 s window-sec;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 177 252 s window-hz;
+#X obj 49 201 * 1000;
+#X obj 49 228 s window-msec;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X obj 330 105 r window-hz;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 8 calculate Hann window table (variable window size) and
+constants window-hz (fundamental frequency of analysis) \, window-sec
+and window-msec (analysis window size in seconds and msec).;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 7 0 9 1;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 14 0 6 0;
+#X connect 14 0 9 0;
+#X connect 14 1 7 0;
+#X connect 14 2 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 0;
+#X connect 18 0 1 1;
+#X connect 19 0 1 0;
+#X connect 19 1 4 0;
+#X connect 19 1 18 0;
+#X restore 440 528 pd hann-window;
+#N canvas 388 86 694 447 insample 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sample 160161 float 0;
+#X coords 0 1 160160 -1 400 150 1;
+#X restore 281 135 graph;
+#X obj 28 133 r read-sample;
+#X obj 28 184 unpack s f;
+#X obj 28 294 soundfiler;
+#X text 365 360 read a sample;
+#X obj 285 359 loadbang;
+#X obj 28 210 t s b;
+#X obj 84 209 symbol \$0-sample;
+#X obj 28 245 pack s s;
+#X msg 28 270 read -resize \$1 \$2;
+#X obj 83 156 44100;
+#X obj 28 157 t a b;
+#X obj 38 318 s \$0-samplength;
+#X obj 125 184 s \$0-insamprate;
+#X obj 28 357 /;
+#X obj 28 381 * 1000;
+#X obj 28 404 s \$0-samp-msec;
+#X obj 66 357 r \$0-insamprate;
+#X obj 29 70 hip~ 5;
+#X obj 29 46 adc~ 1;
+#X obj 29 9 inlet;
+#X obj 91 46 samplerate~;
+#X obj 29 93 tabwrite~ \$0-sample;
+#X obj 91 70 s \$0-insamprate;
+#X msg 285 383 \; read-sample ../sound/voice.wav;
+#X obj 276 20 inlet;
+#X obj 276 42 openpanel;
+#X obj 276 67 s read-sample;
+#X connect 1 0 11 0;
+#X connect 2 0 6 0;
+#X connect 2 1 13 0;
+#X connect 3 0 12 0;
+#X connect 3 0 14 0;
+#X connect 5 0 24 0;
+#X connect 6 0 8 0;
+#X connect 6 1 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 13 0;
+#X connect 11 0 2 0;
+#X connect 11 1 10 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 14 1;
+#X connect 18 0 22 0;
+#X connect 19 0 18 0;
+#X connect 20 0 21 0;
+#X connect 20 0 19 0;
+#X connect 21 0 23 0;
+#X connect 25 0 26 0;
+#X connect 26 0 27 0;
+#X restore 441 480 pd insample;
+#X floatatom 552 480 5 0 0 0 - #0-samp-msec -;
+#X msg 229 486 ../sound/bell.aiff;
+#X msg 229 511 ../sound/voice.wav;
+#X msg 229 536 ../sound/voice2.wav;
+#X obj 229 562 s read-sample;
+#X obj 441 439 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 460 438 <- record;
+#X obj 493 387 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 55 407 s location;
+#X obj 167 407 s speed;
+#X obj 262 386 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 262 408 s rewind;
+#X msg 345 336 200;
+#X msg 345 358 100;
+#X msg 345 380 20;
+#X text 386 335 contract;
+#X text 390 380 expand;
+#X obj 493 407 s lock;
+#X text 494 277 detune;
+#X text 55 330 location;
+#X text 52 346 (stops;
+#X text 57 361 motion);
+#X text 165 348 motion in;
+#X text 232 464 read input sound;
+#X text 103 7 PHASE VOCODER FOR TIME STETCHING AND CONTRACTION;
+#X text 604 479 length \, msec;
+#X floatatom 607 419 5 0 0 0 - window-size -;
+#X msg 607 307 512;
+#X msg 607 329 1024;
+#X msg 607 351 2048;
+#X msg 607 373 4096;
+#X obj 607 395 s window-size;
+#X text 607 274 window size \,;
+#X text 607 289 samples;
+#X text 648 306 <- set;
+#X text 100 306 ------- location controls -------;
+#X text 660 419 (check);
+#X obj 345 407 s auto;
+#X text 23 35 This patch takes a sound \, analyzes windows in it both
+for channel magnitude and for phase precession in each channel (compared
+to another operlapping window). The real-time output recreates the
+same magnitudes and phase precession \, althought the phases themselves
+are in general different. You can control either the location or its
+motion (setting location stops motion \, while setting a non-zero motion
+causes the location to change automatically). "Rewind" goes back to
+the beginning. You can use different window sizes (use the message
+boxes - the number box is for readout). The "lock" feature forces phase
+coherency between neighboring channels \, which makes a more present
+sound but can add artifacts to the sound. Look in "pd fft-analysis"
+to see the workings.;
+#X text 483 568 updated for Pd version 0.39;
+#X obj 551 316 bng 15 250 50 0 no-detune empty empty 0 -6 0 8 -262144
+-1 -1;
+#X obj 535 460 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 466 458 file ->;
+#X connect 0 0 5 0;
+#X connect 1 0 21 0;
+#X connect 2 0 20 0;
+#X connect 3 0 9 0;
+#X connect 3 0 9 1;
+#X connect 13 0 16 0;
+#X connect 14 0 16 0;
+#X connect 15 0 16 0;
+#X connect 17 0 11 0;
+#X connect 19 0 29 0;
+#X connect 22 0 23 0;
+#X connect 24 0 49 0;
+#X connect 25 0 49 0;
+#X connect 26 0 49 0;
+#X connect 39 0 43 0;
+#X connect 40 0 43 0;
+#X connect 41 0 43 0;
+#X connect 42 0 43 0;
+#X connect 53 0 11 1;
diff --git a/desiredata/doc/3.audio.examples/I08.pvoc.reverb.pd b/desiredata/doc/3.audio.examples/I08.pvoc.reverb.pd
new file mode 100644
index 00000000..6898c216
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I08.pvoc.reverb.pd
@@ -0,0 +1,421 @@
+#N canvas 502 83 570 415 12;
+#N canvas 105 328 986 609 fft 0;
+#X obj 18 500 *~;
+#X obj 291 455 *~;
+#X obj 258 454 *~;
+#X obj 356 456 *~;
+#X obj 324 455 *~;
+#X obj 324 477 +~;
+#X obj 258 479 -~;
+#X obj 560 383 *~;
+#X obj 54 124 *~;
+#X obj 22 124 *~;
+#X obj 22 145 +~;
+#X obj 325 82 *~;
+#X obj 293 82 *~;
+#X obj 608 312 *~;
+#X obj 576 312 *~;
+#X obj 93 63 *~;
+#X obj 18 522 outlet~;
+#X obj 18 475 *~;
+#X obj 126 63 inlet~;
+#X obj 93 84 rfft~;
+#X obj 18 451 rifft~;
+#X obj 576 334 rsqrt~;
+#X obj 293 103 +~;
+#X obj 484 383 *~;
+#X obj 56 499 sig~ 0.0002;
+#N canvas 167 161 699 396 decision 0;
+#X obj 49 101 inlet~;
+#X obj 50 341 outlet~;
+#X obj 50 183 -~;
+#X obj 50 226 clip~ 0 1;
+#X obj 50 204 *~ 1e+20;
+#X obj 196 98 inlet~;
+#X text 137 213 stronger than;
+#X text 139 228 old one;
+#X obj 274 202 -~;
+#X obj 288 177 lrshift~ 1;
+#X obj 274 250 clip~ 0 1;
+#X obj 274 228 *~ 1e+20;
+#X obj 450 202 -~;
+#X obj 450 250 clip~ 0 1;
+#X obj 450 228 *~ 1e+20;
+#X obj 464 177 lrshift~ -1;
+#X obj 50 283 *~;
+#X obj 50 312 *~;
+#X text 135 199 1 if new signal;
+#X text 55 73 new;
+#X text 203 70 old;
+#X text 51 12 Choose whether to replace the "lod" signal with the "new"
+one. The "new" one must be stronger than the old one and also must
+be stronger than its two neighboring channels;
+#X text 267 283 1 if we're louder than neighbor;
+#X connect 0 0 2 0;
+#X connect 0 0 9 0;
+#X connect 0 0 8 0;
+#X connect 0 0 12 0;
+#X connect 0 0 15 0;
+#X connect 2 0 4 0;
+#X connect 3 0 16 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 1;
+#X connect 8 0 11 0;
+#X connect 9 0 8 1;
+#X connect 10 0 16 1;
+#X connect 11 0 10 0;
+#X connect 12 0 14 0;
+#X connect 13 0 17 1;
+#X connect 14 0 13 0;
+#X connect 15 0 12 1;
+#X connect 16 0 17 0;
+#X connect 17 0 1 0;
+#X restore 23 172 pd decision;
+#X obj 576 356 *~;
+#N canvas 276 481 755 363 divide-by-prev 0;
+#X obj 283 99 inlet~;
+#X obj 385 101 inlet~;
+#X obj 284 249 outlet~;
+#X obj 386 249 outlet~;
+#X obj 107 251 outlet~;
+#X obj 208 253 outlet~;
+#X obj 250 180 *~;
+#X obj 217 180 *~;
+#X obj 182 181 *~;
+#X obj 149 181 *~;
+#X obj 149 203 +~;
+#X obj 217 202 -~;
+#X obj 92 49 tabreceive~ \$0-last-real;
+#X obj 190 72 tabreceive~ \$0-last-imag;
+#X connect 0 0 2 0;
+#X connect 0 0 9 0;
+#X connect 0 0 6 0;
+#X connect 1 0 3 0;
+#X connect 1 0 8 0;
+#X connect 1 0 7 0;
+#X connect 6 0 11 1;
+#X connect 7 0 11 0;
+#X connect 8 0 10 1;
+#X connect 9 0 10 0;
+#X connect 10 0 4 0;
+#X connect 11 0 5 0;
+#X connect 12 0 9 1;
+#X connect 12 0 7 1;
+#X connect 13 0 8 1;
+#X connect 13 0 6 1;
+#X restore 603 192 pd divide-by-prev;
+#N canvas 650 183 602 327 switch 0;
+#X obj 19 163 inlet~;
+#X obj 107 99 inlet~;
+#X obj 169 100 inlet~;
+#X obj 273 97 inlet~;
+#X obj 333 97 inlet~;
+#X obj 367 185 -~;
+#X obj 338 231 +~;
+#X obj 372 229 *~;
+#X obj 250 182 -~;
+#X obj 220 228 +~;
+#X obj 254 228 *~;
+#X obj 219 278 outlet~;
+#X obj 338 274 outlet~;
+#X text 46 28 switch between two pairs of inputs. If first inlet is
+one \, take the left-hand pair \, otherwise the right-hand one.;
+#X text 15 140 switch;
+#X text 92 76 pass this if one;
+#X text 269 77 pass this if zero;
+#X connect 0 0 10 1;
+#X connect 0 0 7 1;
+#X connect 1 0 8 0;
+#X connect 2 0 5 0;
+#X connect 3 0 9 0;
+#X connect 3 0 8 1;
+#X connect 4 0 6 0;
+#X connect 4 0 5 1;
+#X connect 5 0 7 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 8 0 10 0;
+#X connect 9 0 11 0;
+#X connect 10 0 9 1;
+#X restore 327 275 pd switch;
+#N canvas 650 183 602 327 switch 0;
+#X obj 19 163 inlet~;
+#X obj 107 99 inlet~;
+#X obj 169 100 inlet~;
+#X obj 273 97 inlet~;
+#X obj 333 97 inlet~;
+#X obj 367 185 -~;
+#X obj 338 231 +~;
+#X obj 372 229 *~;
+#X obj 250 182 -~;
+#X obj 220 228 +~;
+#X obj 254 228 *~;
+#X obj 219 278 outlet~;
+#X obj 338 274 outlet~;
+#X text 46 28 switch between two pairs of inputs. If first inlet is
+one \, take the left-hand pair \, otherwise the right-hand one.;
+#X text 15 140 switch;
+#X text 92 76 pass this if one;
+#X text 269 77 pass this if zero;
+#X connect 0 0 10 1;
+#X connect 0 0 7 1;
+#X connect 1 0 8 0;
+#X connect 2 0 5 0;
+#X connect 3 0 9 0;
+#X connect 3 0 8 1;
+#X connect 4 0 6 0;
+#X connect 4 0 5 1;
+#X connect 5 0 7 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 8 0 10 0;
+#X connect 9 0 11 0;
+#X connect 10 0 9 1;
+#X restore 484 266 pd switch;
+#X obj 655 270 r revtime;
+#X obj 54 476 tabreceive~ \$0-hann;
+#X obj 94 35 tabreceive~ \$0-hann;
+#X obj 505 112 tabreceive~ \$0-inc-real;
+#X obj 587 134 tabreceive~ \$0-inc-imag;
+#X obj 752 220 tabsend~ \$0-last-imag;
+#X obj 702 243 tabsend~ \$0-last-real;
+#X obj 559 426 tabsend~ \$0-inc-imag;
+#X obj 484 449 tabsend~ \$0-inc-real;
+#X msg 665 293 set \$1;
+#X obj 665 317 s revtime-set;
+#X obj 800 483 loadbang;
+#X msg 800 509 \; pd dsp 1 \; window-size 4096 \; revtime 20;
+#X obj 800 411 r window-size;
+#X msg 800 433 set \$1 4;
+#X obj 800 455 block~;
+#X obj 655 341 expr 1 - 0.2/max(0.2 \, $f1);
+#X text 20 206 choose whether to;
+#X text 18 224 punch in new (amplitude \,;
+#X text 16 243 increment) pair;
+#X obj 367 26 tabreceive~ \$0-amp-real;
+#X obj 443 50 tabreceive~ \$0-amp-imag;
+#X obj 325 537 tabsend~ \$0-amp-imag;
+#X obj 258 560 tabsend~ \$0-amp-real;
+#X text 361 6 previous output amplitude \, encoding both magnitude
+and phase;
+#X text 453 87 previous phase increment (unit-magnitude complex number)
+;
+#X obj 506 134 +~ 1e-15;
+#X obj 366 50 +~ 1e-15;
+#X text 363 482 propagate amplitudes by multiplying in the;
+#X text 361 499 increments \, which advance the phase and drop;
+#X text 365 514 magnitude according to revtime.;
+#X text 608 370 normalize increments between 0 and;
+#X text 606 388 1 according to revtime.;
+#X text 78 453 IFFT and output;
+#X connect 0 0 16 0;
+#X connect 1 0 6 1;
+#X connect 2 0 6 0;
+#X connect 3 0 5 1;
+#X connect 4 0 5 0;
+#X connect 5 0 52 0;
+#X connect 6 0 53 0;
+#X connect 7 0 1 0;
+#X connect 7 0 3 0;
+#X connect 7 0 37 0;
+#X connect 8 0 10 1;
+#X connect 9 0 10 0;
+#X connect 10 0 25 0;
+#X connect 11 0 22 1;
+#X connect 12 0 22 0;
+#X connect 13 0 21 0;
+#X connect 14 0 21 0;
+#X connect 15 0 19 0;
+#X connect 17 0 0 0;
+#X connect 18 0 15 1;
+#X connect 19 0 9 0;
+#X connect 19 0 9 1;
+#X connect 19 0 27 0;
+#X connect 19 0 28 1;
+#X connect 19 1 8 0;
+#X connect 19 1 8 1;
+#X connect 19 1 27 1;
+#X connect 19 1 28 2;
+#X connect 20 0 17 0;
+#X connect 21 0 26 0;
+#X connect 22 0 25 1;
+#X connect 23 0 2 0;
+#X connect 23 0 4 0;
+#X connect 23 0 38 0;
+#X connect 24 0 0 1;
+#X connect 25 0 28 0;
+#X connect 25 0 29 0;
+#X connect 26 0 23 1;
+#X connect 26 0 7 1;
+#X connect 27 0 29 1;
+#X connect 27 1 29 2;
+#X connect 27 2 36 0;
+#X connect 27 3 35 0;
+#X connect 28 0 20 0;
+#X connect 28 0 3 1;
+#X connect 28 0 2 1;
+#X connect 28 1 20 1;
+#X connect 28 1 1 1;
+#X connect 28 1 4 1;
+#X connect 29 0 14 0;
+#X connect 29 0 14 1;
+#X connect 29 0 23 0;
+#X connect 29 1 13 0;
+#X connect 29 1 13 1;
+#X connect 29 1 7 0;
+#X connect 30 0 39 0;
+#X connect 30 0 46 0;
+#X connect 31 0 17 1;
+#X connect 32 0 15 0;
+#X connect 33 0 56 0;
+#X connect 34 0 29 4;
+#X connect 39 0 40 0;
+#X connect 41 0 42 0;
+#X connect 43 0 44 0;
+#X connect 44 0 45 0;
+#X connect 46 0 26 1;
+#X connect 50 0 57 0;
+#X connect 51 0 11 0;
+#X connect 51 0 11 1;
+#X connect 51 0 28 4;
+#X connect 56 0 29 3;
+#X connect 57 0 12 0;
+#X connect 57 0 12 1;
+#X connect 57 0 28 3;
+#X restore 141 301 pd fft;
+#X floatatom 377 233 0 0 1000 0 - revtime-set -;
+#X floatatom 68 239 0 0 0 0 - - -;
+#X text 131 9 PIANO REVERB;
+#X text 418 236 reverb time;
+#X obj 141 331 output~;
+#X obj 36 333 output~;
+#X text 23 25 This is a phase vocoder acting as a reverberator. The
+sound is more coherent (less "whispered") than a real room or a standard
+delay-based reverberator.;
+#X text 25 80 The technique is to "punch" the incoming sound into channels
+where (1) there's a peak \, and (2) the incoming sound drowns out whatever
+might already be there. If the sound already in any channel is louder
+than the input the input for that channel is ignored.;
+#N canvas 0 0 508 303 test-sound 0;
+#X obj 35 33 inlet;
+#X obj 36 144 osc~;
+#X obj 164 173 line~;
+#X floatatom 36 95 0 0 0 0 - - -;
+#X obj 37 71 mtof;
+#X obj 36 169 cos~;
+#X obj 36 193 hip~ 20;
+#X obj 36 118 t f b;
+#X obj 164 63 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 209 144 pack 0 30;
+#X obj 194 90 del 20;
+#X obj 164 116 pack 1 20;
+#X obj 38 224 *~;
+#X obj 42 270 outlet~;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 2 0 12 1;
+#X connect 3 0 7 0;
+#X connect 4 0 3 0;
+#X connect 5 0 6 0;
+#X connect 6 0 12 0;
+#X connect 7 0 1 0;
+#X connect 7 1 8 0;
+#X connect 8 0 10 0;
+#X connect 8 0 11 0;
+#X connect 9 0 2 0;
+#X connect 10 0 9 0;
+#X connect 11 0 2 0;
+#X connect 12 0 13 0;
+#X restore 68 266 pd test-sound;
+#X text 56 217 short tone;
+#X obj 377 257 s revtime;
+#X text 24 164 For each window \, the amplitude in each channel is
+propagated by a constant phase increment and multiplied downward by
+a gain that determines the "reverb time".;
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 4096 float 0;
+#X coords 0 1 4095 0 300 100 1;
+#X restore 82 311 graph;
+#X obj 378 165 osc~;
+#X obj 378 190 *~ -0.5;
+#X obj 378 214 +~ 0.5;
+#X obj 331 247 tabwrite~ \$0-hann;
+#X obj 37 88 r window-size;
+#X obj 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 38 251 s window-sec;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 177 252 s window-hz;
+#X obj 49 201 * 1000;
+#X obj 49 228 s window-msec;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X obj 330 105 r window-hz;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 8 calculate Hann window table (variable window size) and
+constants window-hz (fundamental frequency of analysis) \, window-sec
+and window-msec (analysis window size in seconds and msec).;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 7 0 9 1;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 14 0 6 0;
+#X connect 14 0 9 0;
+#X connect 14 1 7 0;
+#X connect 14 2 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 0;
+#X connect 18 0 1 1;
+#X connect 19 0 1 0;
+#X connect 19 1 4 0;
+#X connect 19 1 18 0;
+#X restore 360 305 pd hann-window;
+#N canvas 52 71 774 520 tables 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-last-real 2048 float 0;
+#X coords 0 500 2048 -500 200 150 1;
+#X restore 103 15 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-last-imag 2048 float 0;
+#X coords 0 500 2048 500 200 150 1;
+#X restore 497 6 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-amp-real 2048 float 0;
+#X coords 0 500 2048 -500 200 150 1;
+#X restore 105 185 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-amp-imag 2048 float 0;
+#X coords 0 500 2048 -500 200 150 1;
+#X restore 501 178 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-inc-real 2048 float 0;
+#X coords 0 1 2048 -1 200 150 1;
+#X restore 105 357 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-inc-imag 2048 float 0;
+#X coords 0 1 2048 -1 200 150 1;
+#X restore 503 342 graph;
+#X restore 360 326 pd tables;
+#X text 307 383 Updated for Pd version 0.39;
+#X text 26 389 reverb in;
+#X text 133 388 reverb out;
+#X connect 0 0 5 0;
+#X connect 0 0 5 1;
+#X connect 1 0 11 0;
+#X connect 2 0 9 0;
+#X connect 9 0 0 0;
+#X connect 9 0 6 0;
+#X connect 9 0 6 1;
diff --git a/desiredata/doc/3.audio.examples/I09.sheep.from.goats.pd b/desiredata/doc/3.audio.examples/I09.sheep.from.goats.pd
new file mode 100644
index 00000000..87a779ed
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I09.sheep.from.goats.pd
@@ -0,0 +1,411 @@
+#N canvas -6 5 609 588 12;
+#N canvas 300 81 867 775 fft-analysis 0;
+#X obj 85 664 *~;
+#X obj 35 712 *~;
+#X obj 316 148 *~;
+#X obj 34 58 *~;
+#X obj 34 35 inlet~;
+#X obj 34 82 rfft~;
+#X obj 35 688 rifft~;
+#X obj 35 737 outlet~;
+#X obj 277 147 *~;
+#X obj 277 198 rsqrt~;
+#X obj 105 421 -~;
+#X obj 34 663 *~;
+#X obj 68 58 tabreceive~ \$0-hann;
+#X obj 644 51 loadbang;
+#X obj 644 133 r window-size;
+#X obj 69 711 tabreceive~ \$0-hann;
+#X obj 131 327 *~;
+#X msg 644 155 set \$1 4;
+#X obj 644 179 block~;
+#X msg 643 75 \; pd dsp 1 \; window-size 1024;
+#X obj 125 616 /~ 1000;
+#X obj 197 616 r window-size;
+#X obj 254 229 *~;
+#X obj 113 220 *~;
+#X obj 277 171 +~ 1e-20;
+#X obj 152 246 lrshift~ 1;
+#X obj 313 254 lrshift~ 1;
+#X obj 152 272 lrshift~ -1;
+#X obj 314 281 lrshift~ -1;
+#X obj 292 335 *~;
+#X obj 105 475 clip~ 0 1;
+#X obj 106 448 *~ 1e+20;
+#X obj 105 392 +~;
+#X obj 105 508 *~;
+#X obj 144 508 lrshift~ 1;
+#X obj 251 508 lrshift~ -1;
+#X obj 125 540 *~;
+#X obj 410 411 -~;
+#X obj 410 459 clip~ 0 1;
+#X obj 411 435 *~ 1e+20;
+#X obj 410 488 *~;
+#X obj 449 488 lrshift~ 1;
+#X obj 553 487 lrshift~ -1;
+#X obj 430 517 *~;
+#X obj 430 540 *~ -1;
+#X obj 430 563 +~ 1;
+#X obj 125 582 +~;
+#X obj 255 335 *~;
+#X obj 98 327 *~;
+#X text 195 476 0 if clean;
+#X text 170 541 0 if a neighbor is clean;
+#X obj 97 301 +~;
+#X obj 130 300 +~;
+#X obj 255 309 +~;
+#X obj 292 308 +~;
+#X text 169 558 1 if all neighbors dirty;
+#X text 470 584 1 if a neighbor dirty;
+#X text 472 568 0 if all neighbors clean;
+#X obj 224 679 lrshift~ -1;
+#X obj 224 655 sig~ 1;
+#X obj 125 638 *~;
+#X obj 220 442 expr $f1*$f1/1250;
+#X obj 432 385 expr $f1*$f1/1250;
+#X obj 220 417 r dirty;
+#X obj 432 360 r clean;
+#X text 362 148 normalize the amplitudes;
+#X text 439 253 add neighboring amplitude to this one;
+#X text 437 269 and take squared magnitude of result -;
+#X text 437 286 do this for both the left neightbor and;
+#X text 436 303 the right one;
+#X text 94 82 forward real Hann-windowed FT;
+#X text 284 658 I had trouble with the DC bin - this zeros it.;
+#X text 594 366 adjust threshold to quadratic;
+#X text 594 382 units and scale;
+#X text 142 389 total incoherence;
+#X text 496 414 compare incoherence with the threshold;
+#X text 532 511 multiply by left and right;
+#X text 531 529 neighbors \, so 0 if any of;
+#X text 531 546 the 3 is "clean".;
+#X text 497 429 If greater (dirty) \, the "clip" outputs;
+#X text 498 444 1 \, otherwise (if clean) \, zero.;
+#X text 161 583 add to let in channels;
+#X text 159 597 for either criterion;
+#X connect 0 0 6 1;
+#X connect 1 0 7 0;
+#X connect 2 0 24 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 5 0 11 0;
+#X connect 5 0 8 0;
+#X connect 5 0 8 1;
+#X connect 5 0 23 0;
+#X connect 5 1 0 0;
+#X connect 5 1 2 0;
+#X connect 5 1 2 1;
+#X connect 5 1 22 0;
+#X connect 6 0 1 0;
+#X connect 8 0 24 0;
+#X connect 9 0 23 1;
+#X connect 9 0 22 1;
+#X connect 10 0 31 0;
+#X connect 11 0 6 0;
+#X connect 12 0 3 1;
+#X connect 13 0 19 0;
+#X connect 14 0 17 0;
+#X connect 15 0 1 1;
+#X connect 16 0 32 0;
+#X connect 17 0 18 0;
+#X connect 20 0 60 0;
+#X connect 21 0 20 1;
+#X connect 22 0 26 0;
+#X connect 22 0 28 0;
+#X connect 22 0 53 0;
+#X connect 22 0 54 0;
+#X connect 23 0 25 0;
+#X connect 23 0 27 0;
+#X connect 23 0 51 0;
+#X connect 23 0 52 0;
+#X connect 24 0 9 0;
+#X connect 25 0 51 1;
+#X connect 26 0 53 1;
+#X connect 27 0 52 1;
+#X connect 28 0 54 1;
+#X connect 29 0 32 1;
+#X connect 30 0 33 0;
+#X connect 30 0 35 0;
+#X connect 30 0 34 0;
+#X connect 31 0 30 0;
+#X connect 32 0 10 0;
+#X connect 32 0 37 0;
+#X connect 33 0 36 0;
+#X connect 34 0 33 1;
+#X connect 35 0 36 1;
+#X connect 36 0 46 0;
+#X connect 37 0 39 0;
+#X connect 38 0 40 0;
+#X connect 38 0 42 0;
+#X connect 38 0 41 0;
+#X connect 39 0 38 0;
+#X connect 40 0 43 0;
+#X connect 41 0 40 1;
+#X connect 42 0 43 1;
+#X connect 43 0 44 0;
+#X connect 44 0 45 0;
+#X connect 45 0 46 1;
+#X connect 46 0 20 0;
+#X connect 47 0 32 1;
+#X connect 48 0 32 0;
+#X connect 51 0 48 0;
+#X connect 51 0 48 1;
+#X connect 52 0 16 0;
+#X connect 52 0 16 1;
+#X connect 53 0 47 0;
+#X connect 53 0 47 1;
+#X connect 54 0 29 0;
+#X connect 54 0 29 1;
+#X connect 58 0 60 1;
+#X connect 59 0 58 0;
+#X connect 60 0 11 1;
+#X connect 60 0 0 1;
+#X connect 61 0 10 1;
+#X connect 62 0 37 1;
+#X connect 63 0 61 0;
+#X connect 64 0 62 0;
+#X restore 49 410 pd fft-analysis;
+#X floatatom 355 287 0 0 100 0 - - -;
+#X text 138 10 PITCHED/UNPITCHED SEPARATION;
+#X obj 48 443 output~;
+#X floatatom 48 356 0 0 100 0 - - -;
+#X text 105 337 noise;
+#X floatatom 108 356 0 0 100 0 - - -;
+#N canvas 214 193 769 642 test-signal 0;
+#X obj 75 328 line~;
+#X obj 75 250 f;
+#X obj 517 236 *~;
+#X obj 76 442 *~;
+#X obj 517 127 noise~;
+#X obj 371 494 +~;
+#X obj 98 415 dbtorms;
+#X obj 539 210 dbtorms;
+#X obj 98 390 inlet;
+#X obj 539 186 inlet;
+#X obj 373 568 outlet~;
+#X msg 75 304 0 \, \$1 \$2;
+#X obj 75 276 pack 0 0;
+#X obj 236 248 /;
+#X obj 251 190 * 0.001;
+#X obj 251 219 t b f;
+#X obj 372 543 hip~ 5;
+#X obj 75 136 loadbang;
+#X obj 75 182 metro 1000;
+#X obj 517 152 bp~ 10000 3;
+#X obj 75 161 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X text 270 247 sample duration \, msec;
+#X text 126 84 looped sample playback;
+#X obj 75 356 tabread4~ \$0-sample;
+#X text 514 100 filtered noise;
+#X text 105 15 TEST SIGNAL: looped sample plus noise. The inlets control
+amplitude of each in dB.;
+#X obj 236 139 r \$0-samplength;
+#X obj 251 164 r \$0-insamprate;
+#X obj 658 244 *~;
+#X obj 680 218 dbtorms;
+#X obj 680 194 inlet;
+#X text 655 108 osc;
+#X obj 658 134 osc~ 440;
+#X obj 372 519 *~ 3;
+#X connect 0 0 23 0;
+#X connect 1 0 12 0;
+#X connect 2 0 5 1;
+#X connect 3 0 5 0;
+#X connect 4 0 19 0;
+#X connect 5 0 33 0;
+#X connect 6 0 3 1;
+#X connect 7 0 2 1;
+#X connect 8 0 6 0;
+#X connect 9 0 7 0;
+#X connect 11 0 0 0;
+#X connect 12 0 11 0;
+#X connect 13 0 12 1;
+#X connect 13 0 18 1;
+#X connect 14 0 15 0;
+#X connect 15 0 13 0;
+#X connect 15 1 13 1;
+#X connect 16 0 10 0;
+#X connect 17 0 20 0;
+#X connect 18 0 1 0;
+#X connect 19 0 2 0;
+#X connect 20 0 18 0;
+#X connect 23 0 3 0;
+#X connect 26 0 1 1;
+#X connect 26 0 13 0;
+#X connect 27 0 14 0;
+#X connect 28 0 5 1;
+#X connect 29 0 28 1;
+#X connect 30 0 29 0;
+#X connect 32 0 28 0;
+#X connect 33 0 16 0;
+#X restore 48 380 pd test-signal;
+#X text 32 334 sampler;
+#X text 56 314 amplitudes (dB);
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 1024 float 0;
+#X coords 0 1 1023 0 300 100 1;
+#X restore 82 311 graph;
+#X obj 378 165 osc~;
+#X obj 378 190 *~ -0.5;
+#X obj 378 214 +~ 0.5;
+#X obj 331 247 tabwrite~ \$0-hann;
+#X obj 37 88 r window-size;
+#X obj 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 38 251 s window-sec;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 177 252 s window-hz;
+#X obj 49 201 * 1000;
+#X obj 49 228 s window-msec;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X obj 330 105 r window-hz;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 8 calculate Hann window table (variable window size) and
+constants window-hz (fundamental frequency of analysis) \, window-sec
+and window-msec (analysis window size in seconds and msec).;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 7 0 9 1;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 14 0 6 0;
+#X connect 14 0 9 0;
+#X connect 14 1 7 0;
+#X connect 14 2 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 0;
+#X connect 18 0 1 1;
+#X connect 19 0 1 0;
+#X connect 19 1 4 0;
+#X connect 19 1 18 0;
+#X restore 457 458 pd hann-window;
+#N canvas 52 71 774 520 tables 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-last-real 2048 float 0;
+#X coords 0 500 2048 -500 200 150 1;
+#X restore 103 15 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-last-imag 2048 float 0;
+#X coords 0 500 2048 500 200 150 1;
+#X restore 497 6 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-precess-real 2048 float 0;
+#X coords 0 500 2048 -500 200 150 1;
+#X restore 105 185 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-precess-imag 2048 float 0;
+#X coords 0 500 2048 -500 200 150 1;
+#X restore 501 178 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-inc-real 2048 float 0;
+#X coords 0 1 2048 -1 200 150 1;
+#X restore 105 357 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array \$0-inc-imag 2048 float 0;
+#X coords 0 1 2048 -1 200 150 1;
+#X restore 503 342 graph;
+#X restore 457 479 pd tables;
+#N canvas 388 86 722 350 insample 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sample 62079 float 0;
+#X coords 0 1 62078 -1 400 150 1;
+#X restore 259 24 graph;
+#X obj 19 23 r read-sample;
+#X obj 19 74 unpack s f;
+#X obj 19 184 soundfiler;
+#X text 356 250 read a sample;
+#X obj 276 249 loadbang;
+#X obj 19 100 t s b;
+#X obj 75 99 symbol \$0-sample;
+#X obj 19 135 pack s s;
+#X msg 19 160 read -resize \$1 \$2;
+#X obj 74 46 44100;
+#X obj 19 47 t a b;
+#X msg 276 273 \; read-sample ../sound/bell.aiff;
+#X obj 29 208 s \$0-samplength;
+#X obj 116 74 s \$0-insamprate;
+#X obj 19 247 /;
+#X obj 19 271 * 1000;
+#X obj 19 294 s \$0-samp-msec;
+#X obj 57 247 r \$0-insamprate;
+#X connect 1 0 11 0;
+#X connect 2 0 6 0;
+#X connect 2 1 14 0;
+#X connect 3 0 13 0;
+#X connect 3 0 15 0;
+#X connect 5 0 12 0;
+#X connect 6 0 8 0;
+#X connect 6 1 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 14 0;
+#X connect 11 0 2 0;
+#X connect 11 1 10 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 0;
+#X connect 18 0 15 1;
+#X restore 233 501 pd insample;
+#X msg 233 403 ../sound/bell.aiff;
+#X msg 233 426 ../sound/voice.wav;
+#X msg 233 449 ../sound/voice2.wav;
+#X text 236 383 change input sound;
+#X obj 233 473 s read-sample;
+#X floatatom 233 523 5 0 0 0 - #0-samp-msec -;
+#X text 286 522 sample length \, msec;
+#X floatatom 233 285 0 0 100 0 - - -;
+#X floatatom 169 356 0 0 100 0 - - -;
+#X text 167 336 osc;
+#X msg 471 325 512;
+#X msg 471 346 1024;
+#X msg 471 368 2048;
+#X obj 471 413 s window-size;
+#X msg 471 390 4096;
+#X obj 233 308 s clean;
+#X text 233 331 0=silent;
+#X text 231 351 100=all;
+#X obj 355 310 s dirty;
+#X text 351 331 100=silent;
+#X text 353 348 0=all;
+#X text 354 563 updated for Pd version 0.39;
+#X text 11 212 Two separate thresholds may be adjusted to listen to
+the "clean" or "dirty" part of the signal. You'll hear anything less
+incoherent than the clean threshold \, OR more incoherent than the
+dirty one.;
+#X text 13 35 This patch applies a very simple coherence test to distinguish
+between sinusoids and noise in an input signal. It works very imperfectly
+(since noise is random \, no matter what test we place on it it will
+sometimes spoof its way in.) Here we just test that neighboring channels
+are 180 degrees (pi radians) out of phase \, as they should be in the
+main lobe in response to a sinusoid. If any three channels are so arranged
+\, all three are considered as contributing to a sinusoid. To do this
+we make an "incoherence" measure which is zero if the phase relationship
+is perfect and progressively larger otherwise.;
+#X connect 0 0 3 0;
+#X connect 0 0 3 1;
+#X connect 1 0 31 0;
+#X connect 4 0 7 0;
+#X connect 6 0 7 1;
+#X connect 7 0 0 0;
+#X connect 13 0 17 0;
+#X connect 14 0 17 0;
+#X connect 15 0 17 0;
+#X connect 20 0 28 0;
+#X connect 21 0 7 2;
+#X connect 23 0 26 0;
+#X connect 24 0 26 0;
+#X connect 25 0 26 0;
+#X connect 27 0 26 0;
diff --git a/desiredata/doc/3.audio.examples/I10.phase.bash.pd b/desiredata/doc/3.audio.examples/I10.phase.bash.pd
new file mode 100644
index 00000000..4c66f9b7
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/I10.phase.bash.pd
@@ -0,0 +1,569 @@
+#N canvas 165 311 718 552 12;
+#X floatatom 407 323 0 0 0 0 - - -;
+#N canvas 122 165 801 538 fft 0;
+#X obj 39 153 *~;
+#X obj 7 153 *~;
+#X obj 7 98 *~;
+#X obj 7 70 inlet~;
+#X obj 7 125 rfft~;
+#X obj 7 227 *~;
+#X obj 7 306 rifft~;
+#X obj 43 99 tabreceive~ \$0-hann;
+#X obj 7 200 q8_sqrt~;
+#X obj 337 158 samplerate~;
+#X obj 328 124 bang~;
+#X obj 337 183 t f b;
+#X obj 444 4 loadbang;
+#X obj 636 19 r window-size;
+#X obj 636 65 block~;
+#X obj 337 207 osc~;
+#X msg 381 207 0;
+#X obj 8 333 *~;
+#X obj 44 334 tabreceive~ \$0-hann;
+#X obj 9 363 outlet~;
+#X obj 77 281 r window-size;
+#X obj 7 281 /~ 1000;
+#X msg 636 41 set \$1 2;
+#X obj 387 267 r \$0-start;
+#X obj 328 320 spigot;
+#X msg 387 292 1;
+#X msg 354 292 0;
+#X obj 328 516 outlet;
+#X obj 364 372 r window-size;
+#X obj 364 441 t f b;
+#X obj 396 464 samplerate~;
+#X obj 364 464 /;
+#X obj 364 487 * 1000;
+#X obj 328 493 del;
+#X obj 364 395 / 2;
+#X obj 364 418 - 1;
+#X msg 443 28 \; pd dsp 1 \; window-size 1024 \; pitch 48 \; specshift
+0;
+#X text 96 196 magnitude of FT;
+#X text 18 249 align partials to middle of window;
+#X text 39 232 alternate every other sign to;
+#X text 383 122 control computations to do every frame;
+#X text 414 180 set sample rate of the oscillator to;
+#X text 416 195 Nyquist (here we're operating at twice;
+#X text 418 211 the global "samplerate~" because of;
+#X text 417 228 the overlap-2 blocking.) Also set phase;
+#X text 417 244 to zero at beginning of frame.;
+#X text 424 287 When analysis starts \, set a delay to;
+#X text 425 304 one frame minus a sample (i.e. \, just;
+#X text 424 321 one 64-sample block before the next;
+#X text 423 338 frame) which is synchronized with the;
+#X text 423 352 first frame emerging from outlet~ at;
+#X text 499 368 left. In the parent window;
+#X text 497 385 this is used to start;
+#X text 497 402 recording synchronously.;
+#X text 14 384 output phase-aligned frames;
+#X text 395 514 output a bang to start recording;
+#X connect 0 0 8 0;
+#X connect 1 0 8 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 4 0 1 1;
+#X connect 4 1 0 0;
+#X connect 4 1 0 1;
+#X connect 5 0 21 0;
+#X connect 6 0 17 0;
+#X connect 7 0 2 1;
+#X connect 8 0 5 0;
+#X connect 9 0 11 0;
+#X connect 10 0 9 0;
+#X connect 10 0 24 0;
+#X connect 11 0 15 0;
+#X connect 11 1 16 0;
+#X connect 12 0 36 0;
+#X connect 13 0 22 0;
+#X connect 15 0 5 1;
+#X connect 16 0 15 1;
+#X connect 17 0 19 0;
+#X connect 18 0 17 1;
+#X connect 20 0 21 1;
+#X connect 21 0 6 0;
+#X connect 22 0 14 0;
+#X connect 23 0 25 0;
+#X connect 24 0 26 0;
+#X connect 24 0 33 0;
+#X connect 25 0 24 1;
+#X connect 26 0 24 1;
+#X connect 28 0 34 0;
+#X connect 29 0 31 0;
+#X connect 29 1 30 0;
+#X connect 30 0 31 1;
+#X connect 31 0 32 0;
+#X connect 32 0 33 1;
+#X connect 33 0 27 0;
+#X connect 34 0 35 0;
+#X connect 35 0 29 0;
+#X restore 22 459 pd fft;
+#X floatatom 586 377 0 0 120 0 - pitch-set -;
+#X floatatom 583 330 0 0 0 0 - specshift-set -;
+#X obj 583 353 s specshift;
+#X obj 407 443 s loco;
+#X obj 586 400 s pitch;
+#X obj 407 346 pack 0 100;
+#X obj 588 453 output~;
+#X text 214 -1 PHASE BASHING;
+#X text 455 515 updated for Pd version 0.39;
+#X floatatom 199 389 5 0 0 0 - #0-samp-msec -;
+#X text 197 403 sample length \, msec;
+#X msg 198 288 ../sound/bell.aiff;
+#X msg 198 313 ../sound/voice.wav;
+#X msg 198 338 ../sound/voice2.wav;
+#X text 201 266 change input sound;
+#X obj 198 364 s read-sample;
+#N canvas 190 43 657 626 test-signal 0;
+#X obj 88 381 line~;
+#X obj 88 306 f;
+#X obj 88 536 outlet~;
+#X msg 88 360 0 \, \$1 \$2;
+#X obj 88 334 pack 0 0;
+#X obj 190 303 /;
+#X obj 269 283 * 0.001;
+#X obj 211 260 t b b f;
+#X obj 152 225 t b f;
+#X obj 88 406 tabread4~ \$0-sample;
+#X obj 286 391 adc~ 1;
+#X obj 414 280 inlet;
+#X obj 454 339 samplerate~;
+#X obj 151 201 r \$0-samplength;
+#X obj 211 234 r \$0-insamprate;
+#X obj 87 189 inlet;
+#X obj 454 363 s \$0-insamprate;
+#X obj 285 423 *~;
+#X obj 363 380 del;
+#X obj 414 312 t b b;
+#X msg 402 379 1;
+#X msg 401 404 0;
+#X obj 87 473 hip~ 5;
+#X obj 88 444 +~;
+#X text 73 123 play sample;
+#X text 71 143 once;
+#X obj 482 420 s \$0-start;
+#X connect 0 0 9 0;
+#X connect 1 0 4 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 1;
+#X connect 5 0 18 1;
+#X connect 6 0 5 1;
+#X connect 7 1 5 0;
+#X connect 7 2 6 0;
+#X connect 8 1 5 0;
+#X connect 8 1 1 1;
+#X connect 9 0 23 0;
+#X connect 10 0 17 0;
+#X connect 11 0 19 0;
+#X connect 12 0 16 0;
+#X connect 13 0 8 0;
+#X connect 14 0 7 0;
+#X connect 15 0 1 0;
+#X connect 15 0 26 0;
+#X connect 17 0 23 1;
+#X connect 18 0 21 0;
+#X connect 19 0 20 0;
+#X connect 19 0 18 0;
+#X connect 19 0 26 0;
+#X connect 19 1 12 0;
+#X connect 20 0 17 1;
+#X connect 21 0 17 1;
+#X connect 22 0 2 0;
+#X connect 23 0 22 0;
+#X restore 22 436 pd test-signal;
+#X obj 143 417 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-hann 2048 float 0;
+#X coords 0 1 2047 0 300 100 1;
+#X restore 82 311 graph;
+#X obj 378 165 osc~;
+#X obj 378 190 *~ -0.5;
+#X obj 378 214 +~ 0.5;
+#X obj 331 247 tabwrite~ \$0-hann;
+#X obj 37 88 r window-size;
+#X obj 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 38 251 s window-sec;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 177 252 s window-hz;
+#X obj 49 201 * 1000;
+#X obj 49 228 s window-msec;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X obj 330 105 r window-hz;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 8 calculate Hann window table (variable window size) and
+constants window-hz (fundamental frequency of analysis) \, window-sec
+and window-msec (analysis window size in seconds and msec).;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 14 0;
+#X connect 6 0 8 0;
+#X connect 6 0 12 0;
+#X connect 7 0 6 1;
+#X connect 7 0 9 1;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 14 0 6 0;
+#X connect 14 0 9 0;
+#X connect 14 1 7 0;
+#X connect 14 2 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 19 0;
+#X connect 18 0 1 1;
+#X connect 19 0 1 0;
+#X connect 19 1 4 0;
+#X connect 19 1 18 0;
+#X restore 195 441 pd hann-window;
+#X msg 28 269 512;
+#X msg 28 290 1024;
+#X msg 28 312 2048;
+#X obj 28 357 s window-size;
+#X msg 28 334 4096;
+#N canvas 388 86 736 499 insample 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sample 62079 float 0;
+#X coords 0 1 62078 -1 400 150 1;
+#X restore 259 24 graph;
+#X obj 19 23 r read-sample;
+#X obj 19 74 unpack s f;
+#X obj 19 184 soundfiler;
+#X text 118 379 read a sample;
+#X obj 38 378 loadbang;
+#X obj 19 100 t s b;
+#X obj 75 99 symbol \$0-sample;
+#X obj 19 135 pack s s;
+#X msg 19 160 read -resize \$1 \$2;
+#X obj 74 46 44100;
+#X obj 19 47 t a b;
+#X obj 29 208 s \$0-samplength;
+#X obj 116 74 s \$0-insamprate;
+#X obj 19 281 /;
+#X obj 19 305 * 1000;
+#X obj 19 328 s \$0-samp-msec;
+#X obj 57 281 r \$0-insamprate;
+#X msg 38 402 \; read-sample ../sound/voice.wav;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-nophase 62079 float 0;
+#X coords 0 1 62078 -1 400 150 1;
+#X restore 256 185 graph;
+#X msg 376 403 resize \$1;
+#X obj 376 379 r \$0-samplength;
+#X obj 376 428 s \$0-nophase;
+#X connect 1 0 11 0;
+#X connect 2 0 6 0;
+#X connect 2 1 13 0;
+#X connect 3 0 12 0;
+#X connect 3 0 14 0;
+#X connect 5 0 18 0;
+#X connect 6 0 8 0;
+#X connect 6 1 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 13 0;
+#X connect 11 0 2 0;
+#X connect 11 1 10 0;
+#X connect 14 0 15 0;
+#X connect 15 0 16 0;
+#X connect 17 0 14 1;
+#X connect 20 0 22 0;
+#X connect 21 0 20 0;
+#X restore 195 464 pd insample;
+#X obj 22 416 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 33 384 ---analyze---;
+#X text 20 399 sample;
+#X obj 94 489 tabwrite~ \$0-nophase;
+#X obj 21 492 output~;
+#X msg 415 384 0 \, 400 4000;
+#X msg 415 419 0 \, 400 10000;
+#X text 47 18 This patch takes an incoming sound \, does an overlap-2
+FFT analysis of it \, and bashes the phases of the spectra so that
+when regenerated the components will all have zero phase at the middle
+of each window. You can use the windows as waveforms and cross-fade
+them at will without getting phase modulation. This might be useful
+for making synthetic instruments that mimic the spectral variation
+of recorded sounds.;
+#X text 398 305 (hundredths of sec);
+#X text 401 289 location in sample;
+#X text 420 365 normal speed;
+#X text 422 403 slow;
+#X text 458 262 ------ playback -------;
+#N canvas 81 424 887 624 playback 0;
+#X obj 101 479 r invblk;
+#X obj 28 499 *~;
+#X obj 61 501 clip~ 1 1000;
+#X floatatom 38 89 0 0 0 0 - - -;
+#X floatatom 510 93 0 0 0 0 - - -;
+#X obj 496 392 *~;
+#X obj 626 369 samphold~;
+#X obj 733 369 samphold~;
+#X obj 538 369 samphold~;
+#X obj 481 500 clip~ -0.5 0.5;
+#X obj 481 523 cos~;
+#X obj 651 427 +~;
+#X obj 653 506 -~;
+#X obj 642 533 *~;
+#X obj 642 558 +~;
+#X obj 621 582 *~;
+#X obj 40 408 *~;
+#X obj 197 362 samphold~;
+#X obj 302 367 samphold~;
+#X obj 508 290 phasor~;
+#X obj 174 288 wrap~;
+#X obj 510 68 r pitch;
+#X obj 510 140 mtof;
+#X obj 269 199 line~;
+#X obj 268 224 -~;
+#X text 8 42 spectral stretch;
+#X obj 89 367 samphold~;
+#X obj 665 187 t b f;
+#X obj 699 210 /;
+#X obj 665 209 1;
+#X obj 29 524 clip~ -0.5 0.5;
+#X obj 29 546 cos~;
+#X obj 211 425 +~;
+#X obj 212 505 -~;
+#X obj 194 526 *~;
+#X obj 201 549 +~;
+#X text 45 426 offset into;
+#X text 50 440 sample;
+#X text 368 169 samples;
+#X text 368 154 period in;
+#X text 204 378 weight for;
+#X text 204 393 next block;
+#X obj 760 312 wrap~;
+#X obj 700 232 s invblk;
+#X obj 558 453 r invblk;
+#X obj 665 138 r window-size;
+#X obj 38 65 r specshift;
+#X obj 261 64 r loco;
+#X obj 482 473 *~;
+#X obj 518 474 clip~ 1 1000;
+#X obj 510 117 - 12;
+#X obj 38 136 + 69;
+#X obj 38 159 mtof;
+#X obj 38 182 / 440;
+#X obj 28 284 *~ 1;
+#X obj 760 287 +~ 0.5;
+#X obj 60 479 *~ 1;
+#X obj 518 453 *~ 1;
+#X obj 481 545 +~ 1;
+#X obj 29 569 +~ 1;
+#X obj 267 292 *~ 1;
+#X obj 212 453 +~ 0;
+#X obj 652 456 +~ 0;
+#X obj 28 366 -~ 0.5;
+#X obj 479 369 -~ 0.5;
+#X obj 286 603 outlet~;
+#X obj 212 479 tabread4~ \$0-nophase;
+#X obj 249 504 tabread4~ \$0-nophase;
+#X obj 652 480 tabread4~ \$0-nophase;
+#X obj 688 505 tabread4~ \$0-nophase;
+#X obj 268 247 +~ 0.5;
+#X text 60 248 grain size;
+#X text 62 264 in samples;
+#X text 97 383 grain size;
+#X text 311 389 middle;
+#X text 311 404 of block;
+#X text 165 248 fractional;
+#X text 164 265 part of loc;
+#X text 295 224 integer part of loc;
+#X text 328 247 middle of block;
+#X text 310 290 cvt to samples;
+#X text 522 265 run two copies 180 degrees out of phase;
+#X text 29 589 window shaped;
+#X text 27 604 by raised cos;
+#X text 265 522 weighted sum of;
+#X text 265 538 2 windows;
+#X obj 180 573 *~;
+#X obj 286 577 +~;
+#X obj 704 163 s blksize;
+#X obj 683 429 r blksize;
+#X obj 243 427 r blksize;
+#X obj 297 270 r blksize;
+#X obj 665 162 / 2;
+#X obj 366 132 /;
+#X obj 366 105 samplerate~;
+#X obj 365 82 t b f;
+#X obj 38 112 * 0.125;
+#X text 223 44 read location in sec/100;
+#X obj 200 120 samplerate~;
+#X obj 167 72 / 100;
+#X obj 167 96 t f b;
+#X obj 167 119 *;
+#X obj 200 144 r blksize;
+#X obj 167 144 /;
+#X text 113 162 read location \, blocks;
+#X obj 260 89 unpack;
+#X msg 630 52 set \$1;
+#X obj 771 32 r pitch;
+#X msg 771 55 set \$1;
+#X obj 630 30 r specshift;
+#X text 723 190 1/(block size);
+#X obj 630 76 s specshift-set;
+#X obj 770 78 s pitch-set;
+#X text 607 104 analysis overlap was 2 so our;
+#X text 606 120 block size is (window size)/2;
+#X text 12 -1 OVERLAPPED \, WINDOWED SAMPLE PLAYBACK;
+#X text 357 0 - with controls for pitch \, location \, and spectral
+shift;
+#X connect 0 0 56 1;
+#X connect 1 0 30 0;
+#X connect 2 0 1 1;
+#X connect 3 0 96 0;
+#X connect 4 0 50 0;
+#X connect 5 0 11 0;
+#X connect 6 0 13 0;
+#X connect 7 0 11 1;
+#X connect 8 0 5 1;
+#X connect 8 0 57 0;
+#X connect 9 0 10 0;
+#X connect 10 0 58 0;
+#X connect 11 0 62 0;
+#X connect 11 0 69 0;
+#X connect 12 0 13 1;
+#X connect 13 0 14 0;
+#X connect 14 0 15 1;
+#X connect 15 0 87 1;
+#X connect 16 0 32 0;
+#X connect 17 0 34 0;
+#X connect 18 0 32 1;
+#X connect 19 0 26 1;
+#X connect 19 0 18 1;
+#X connect 19 0 17 1;
+#X connect 19 0 55 0;
+#X connect 19 0 63 0;
+#X connect 20 0 24 1;
+#X connect 20 0 17 0;
+#X connect 20 0 6 0;
+#X connect 21 0 4 0;
+#X connect 22 0 19 0;
+#X connect 22 0 95 0;
+#X connect 23 0 20 0;
+#X connect 23 0 24 0;
+#X connect 24 0 70 0;
+#X connect 26 0 16 1;
+#X connect 26 0 56 0;
+#X connect 27 0 29 0;
+#X connect 27 1 28 1;
+#X connect 28 0 43 0;
+#X connect 29 0 28 0;
+#X connect 30 0 31 0;
+#X connect 31 0 59 0;
+#X connect 32 0 61 0;
+#X connect 32 0 67 0;
+#X connect 33 0 34 1;
+#X connect 34 0 35 0;
+#X connect 35 0 86 1;
+#X connect 42 0 8 1;
+#X connect 42 0 6 1;
+#X connect 42 0 7 1;
+#X connect 42 0 64 0;
+#X connect 44 0 57 1;
+#X connect 45 0 92 0;
+#X connect 46 0 3 0;
+#X connect 47 0 105 0;
+#X connect 48 0 9 0;
+#X connect 49 0 48 1;
+#X connect 50 0 22 0;
+#X connect 51 0 52 0;
+#X connect 52 0 53 0;
+#X connect 53 0 54 1;
+#X connect 54 0 26 0;
+#X connect 54 0 8 0;
+#X connect 55 0 42 0;
+#X connect 56 0 2 0;
+#X connect 57 0 49 0;
+#X connect 58 0 15 0;
+#X connect 59 0 86 0;
+#X connect 60 0 18 0;
+#X connect 60 0 7 0;
+#X connect 61 0 66 0;
+#X connect 62 0 68 0;
+#X connect 63 0 16 0;
+#X connect 63 0 1 0;
+#X connect 64 0 5 0;
+#X connect 64 0 48 0;
+#X connect 66 0 33 0;
+#X connect 67 0 33 1;
+#X connect 67 0 35 1;
+#X connect 68 0 12 0;
+#X connect 69 0 12 1;
+#X connect 69 0 14 1;
+#X connect 70 0 60 0;
+#X connect 86 0 87 0;
+#X connect 87 0 65 0;
+#X connect 89 0 62 1;
+#X connect 90 0 61 1;
+#X connect 91 0 60 1;
+#X connect 92 0 88 0;
+#X connect 92 0 27 0;
+#X connect 93 0 54 0;
+#X connect 94 0 93 0;
+#X connect 95 0 94 0;
+#X connect 95 1 93 1;
+#X connect 96 0 51 0;
+#X connect 98 0 101 1;
+#X connect 99 0 100 0;
+#X connect 100 0 101 0;
+#X connect 100 1 98 0;
+#X connect 101 0 103 0;
+#X connect 102 0 103 1;
+#X connect 103 0 23 0;
+#X connect 105 0 99 0;
+#X connect 105 1 23 1;
+#X connect 106 0 111 0;
+#X connect 107 0 108 0;
+#X connect 108 0 112 0;
+#X connect 109 0 106 0;
+#X restore 589 428 pd playback;
+#X text 585 290 spectral shift;
+#X text 583 306 (hundredths of;
+#X text 646 323 octave);
+#X text 126 398 live;
+#X text 45 141 You can save the analyses and needn't be running the
+FFT patch to do the resynthesis. You can read a sample \, select window
+size \, and press "sample" to analyze it \, or else analyze a "live"
+input. You'll hear the phase-bashed sample as the analysis runs. You
+can regenerate the sound with specified pitch \, sample location \,
+and spectral shift \, using the "playback" controls.;
+#X text 83 278 analysis;
+#X text 80 264 (redo;
+#X text 83 294 after;
+#X text 84 309 changing;
+#X text 84 325 window;
+#X text 85 339 size);
+#X connect 0 0 7 0;
+#X connect 1 0 30 0;
+#X connect 1 0 31 0;
+#X connect 1 0 31 1;
+#X connect 1 1 30 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 7 0 5 0;
+#X connect 13 0 17 0;
+#X connect 14 0 17 0;
+#X connect 15 0 17 0;
+#X connect 18 0 1 0;
+#X connect 19 0 18 1;
+#X connect 21 0 24 0;
+#X connect 22 0 24 0;
+#X connect 23 0 24 0;
+#X connect 25 0 24 0;
+#X connect 27 0 18 0;
+#X connect 32 0 5 0;
+#X connect 33 0 5 0;
+#X connect 40 0 8 0;
+#X connect 40 0 8 1;
diff --git a/desiredata/doc/3.audio.examples/J01.even.odd.pd b/desiredata/doc/3.audio.examples/J01.even.odd.pd
new file mode 100644
index 00000000..71c9fdf5
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J01.even.odd.pd
@@ -0,0 +1,66 @@
+#N canvas 213 27 782 599 12;
+#X obj 80 156 wrap~;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-phasor 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 567 35 graph;
+#X obj 24 57 -~ 0.5;
+#X obj 80 184 -~ 0.5;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sum 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 567 189 graph;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-difference 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 566 343 graph;
+#X text 570 475 ---- 0.02 seconds ----;
+#X text 528 567 updated for Pd version 0.39;
+#X obj 22 335 output~;
+#X obj 138 78 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 29 270 output~;
+#X text 41 -1 Splitting a sawtooth wave into even and odd harmonics
+;
+#X obj 24 29 phasor~ 100;
+#X text 87 58 remove DC bias;
+#X text 132 29 original sawtooth;
+#X text 144 173 180-degree-out-of-phase;
+#X text 147 188 sawtooth;
+#X text 145 212 form the sum and difference;
+#X obj 23 224 +~;
+#X obj 59 223 -~;
+#X text 4 408 This patch splits a sawtooth wave into its even and odd
+harmonics. The wrap~ object is used to make the phased copy. Adding
+and subtracting this to and from the original gives the results shown
+and heard. (Listen to the two outputs separately \, then together.)
+;
+#X text 102 291 output level;
+#X text 93 367 for sum;
+#X text 95 350 output level;
+#X text 100 308 for difference;
+#X text 157 77 <-- click to graph;
+#X msg 148 97 \; pd DSP 1;
+#X obj 138 247 tabwrite~ \$0-difference;
+#X obj 138 270 tabwrite~ \$0-sum;
+#X obj 138 138 tabwrite~ \$0-phasor;
+#X text 4 491 This is a classic technique for gaining separate control
+over the even and odd harmonics in a synthetic sound. It can also be
+used conceptually to understand the harmonic content of a square wave
+in terms of that of a sawtooth \, or vice versa.;
+#X connect 0 0 3 0;
+#X connect 2 0 0 0;
+#X connect 2 0 18 0;
+#X connect 2 0 19 0;
+#X connect 2 0 29 0;
+#X connect 3 0 18 1;
+#X connect 3 0 19 1;
+#X connect 9 0 26 0;
+#X connect 9 0 27 0;
+#X connect 9 0 28 0;
+#X connect 9 0 29 0;
+#X connect 12 0 2 0;
+#X connect 18 0 8 0;
+#X connect 18 0 28 0;
+#X connect 19 0 10 1;
+#X connect 19 0 27 0;
diff --git a/desiredata/doc/3.audio.examples/J02.trapezoids.pd b/desiredata/doc/3.audio.examples/J02.trapezoids.pd
new file mode 100644
index 00000000..1e7e5d27
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J02.trapezoids.pd
@@ -0,0 +1,84 @@
+#N canvas 262 74 690 585 12;
+#X obj 137 133 wrap~;
+#X obj 137 155 -~ 0.5;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sum 882 float 0;
+#X coords 0 1.02 881 -1.02 200 130 1;
+#X restore 421 155 graph;
+#X text 420 293 ---- 0.02 seconds ----;
+#X text 427 550 updated for Pd version 0.39;
+#X obj 53 335 output~;
+#X obj 147 369 tabwrite~ \$0-sum;
+#X obj 137 111 -~;
+#X obj 159 70 / 100;
+#X floatatom 159 49 4 -100 100 0 - - -;
+#X obj 158 220 / 100;
+#X floatatom 158 199 4 -100 100 0 - - -;
+#X obj 136 242 *~;
+#X obj 209 134 wrap~;
+#X obj 209 156 -~ 0.5;
+#X obj 209 112 -~;
+#X obj 231 71 / 100;
+#X floatatom 231 50 4 -100 100 0 - - -;
+#X obj 230 221 / 100;
+#X floatatom 230 200 4 -100 100 0 - - -;
+#X obj 208 243 *~;
+#X obj 280 135 wrap~;
+#X obj 280 157 -~ 0.5;
+#X obj 280 113 -~;
+#X obj 302 72 / 100;
+#X floatatom 302 51 4 -100 100 0 - - -;
+#X obj 301 222 / 100;
+#X floatatom 301 201 4 -100 100 0 - - -;
+#X obj 279 244 *~;
+#X text 138 30 -- PHASES (percent) --;
+#X text 164 180 AMPLITUDES (percent);
+#X obj 111 268 +~;
+#X obj 112 294 +~;
+#X text 31 3 Making trapezoidal waves from sawtooth waves;
+#X obj 158 321 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 25 77 phasor~ 88.2;
+#X obj 158 343 metro 193;
+#X text 4 476 If the amplitudes sum to zero (with negative ones to
+balance positive ones) \, the slope of each linear segment becomes
+zero. Otherrwise \, the segments have just enough slope to make up
+for the three jumps ane get to the same starting value after each cycle..
+;
+#X text 4 408 Here we combine three sawtooth waves with controllable
+relative phases and amplitudes (in percent \, between -100 and 100.)
+Each sawtooth wave gives rise to one jump (upward or downward) per
+cycle.;
+#X connect 0 0 1 0;
+#X connect 1 0 12 0;
+#X connect 7 0 0 0;
+#X connect 8 0 7 1;
+#X connect 9 0 8 0;
+#X connect 10 0 12 1;
+#X connect 11 0 10 0;
+#X connect 12 0 31 0;
+#X connect 13 0 14 0;
+#X connect 14 0 20 0;
+#X connect 15 0 13 0;
+#X connect 16 0 15 1;
+#X connect 17 0 16 0;
+#X connect 18 0 20 1;
+#X connect 19 0 18 0;
+#X connect 20 0 31 1;
+#X connect 21 0 22 0;
+#X connect 22 0 28 0;
+#X connect 23 0 21 0;
+#X connect 24 0 23 1;
+#X connect 25 0 24 0;
+#X connect 26 0 28 1;
+#X connect 27 0 26 0;
+#X connect 28 0 32 1;
+#X connect 31 0 32 0;
+#X connect 32 0 6 0;
+#X connect 32 0 5 0;
+#X connect 32 0 5 1;
+#X connect 34 0 36 0;
+#X connect 35 0 7 0;
+#X connect 35 0 15 0;
+#X connect 35 0 23 0;
+#X connect 36 0 6 0;
diff --git a/desiredata/doc/3.audio.examples/J03.pulse.width.mod.pd b/desiredata/doc/3.audio.examples/J03.pulse.width.mod.pd
new file mode 100644
index 00000000..06301686
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J03.pulse.width.mod.pd
@@ -0,0 +1,48 @@
+#N canvas 46 315 784 514 12;
+#X floatatom 95 64 0 0 0 0 - - -;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-difference 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 565 325 graph;
+#X text 81 39 frequency;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-phasor1 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 565 24 graph;
+#X text 57 9 CLASSICAL PULSE WIDTH MODULATION;
+#X obj 111 156 phasor~ 0;
+#X obj 111 132 + 0.2;
+#X obj 95 206 -~;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-phasor2 882 float 0;
+#X coords 0 1.02 882 -1.02 200 130 1;
+#X restore 565 176 graph;
+#X text 24 314 This patch demonstrates pulse width modulation \, which
+is accomplished simply by subtracting two sawtooth waves at a varying
+phase difference. Here their frequencies are set to differ by 1/5 Hz.
+so that the relative phase wanders continuously.;
+#X text 570 457 ---- 0.02 seconds ----;
+#X text 524 487 updated for Pd version 0.39;
+#X obj 96 247 output~;
+#X obj 200 124 tabwrite~ \$0-phasor1;
+#X obj 200 182 tabwrite~ \$0-phasor2;
+#X obj 200 236 tabwrite~ \$0-difference;
+#X obj 95 97 phasor~;
+#X obj 200 82 metro 193;
+#X obj 200 62 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
+;
+#X text 219 60 <-- start/stop graphing;
+#X connect 0 0 6 0;
+#X connect 0 0 16 0;
+#X connect 5 0 7 1;
+#X connect 5 0 14 0;
+#X connect 6 0 5 0;
+#X connect 7 0 12 0;
+#X connect 7 0 12 1;
+#X connect 7 0 15 0;
+#X connect 16 0 7 0;
+#X connect 16 0 13 0;
+#X connect 17 0 13 0;
+#X connect 17 0 14 0;
+#X connect 17 0 15 0;
+#X connect 18 0 17 0;
diff --git a/desiredata/doc/3.audio.examples/J04.corners.pd b/desiredata/doc/3.audio.examples/J04.corners.pd
new file mode 100644
index 00000000..72671d3d
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J04.corners.pd
@@ -0,0 +1,112 @@
+#N canvas 612 -7 619 714 12;
+#X obj 117 132 wrap~;
+#X obj 117 154 -~ 0.5;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sum 882 float 0;
+#X coords 0 0.25 881 -0.25 200 130 1;
+#X restore 411 70 graph;
+#X text 410 208 ---- 0.02 seconds ----;
+#X text 354 676 updated for Pd version 0.39;
+#X obj 33 427 output~;
+#X obj 127 461 tabwrite~ \$0-sum;
+#X obj 117 110 -~;
+#X obj 139 69 / 100;
+#X floatatom 139 48 4 -100 100 0 - - -;
+#X obj 138 312 / 100;
+#X floatatom 138 291 4 -100 100 0 - - -;
+#X obj 116 334 *~;
+#X obj 203 133 wrap~;
+#X obj 203 155 -~ 0.5;
+#X obj 203 111 -~;
+#X obj 225 70 / 100;
+#X floatatom 225 49 4 -100 100 0 - - -;
+#X obj 225 313 / 100;
+#X floatatom 225 292 4 -100 100 0 - - -;
+#X obj 203 335 *~;
+#X obj 290 134 wrap~;
+#X obj 290 156 -~ 0.5;
+#X obj 290 112 -~;
+#X obj 311 71 / 100;
+#X floatatom 311 50 4 -100 100 0 - - -;
+#X obj 313 314 / 100;
+#X floatatom 313 293 4 -100 100 0 - - -;
+#X obj 291 336 *~;
+#X text 129 26 -- PHASES (percent) --;
+#X text 140 267 AMPLITUDES (percent);
+#X obj 91 360 +~;
+#X obj 92 386 +~;
+#X obj 138 413 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 138 435 metro 193;
+#X obj 20 80 phasor~;
+#X floatatom 20 59 5 0 0 0 - - -;
+#X text 12 36 frequency;
+#X obj 116 184 *~;
+#X obj 203 184 *~;
+#X obj 290 184 *~;
+#X obj 116 209 *~ 0.5;
+#X obj 116 234 -~ 0.0833;
+#X obj 203 209 *~ 0.5;
+#X obj 290 209 *~ 0.5;
+#X obj 204 234 -~ 0.0833;
+#X obj 291 234 -~ 0.0833;
+#X text 30 3 Making waveforms with corners using parabolic waves;
+#X text 14 499 Here we combine three parabolic waves (in the same way
+as \, two patches ago \, we combined sawtooth waves). The parabolic
+wave is obtained from the sawtooth wave (assuming it runs from -0.5
+to 0.5) by the formula: y=x*x/2 - 1/12. This is normalized so that
+the corner has a slope change of minus one unit per cycle \, and adjusted
+to remove any DC component.;
+#X text 12 593 In general \, the segments of the result will be curved
+\, but if the three magnitudes sum algebraicly to zero \, the segments
+will be linear.;
+#X text 371 67 0.25;
+#X text 362 184 -0.25;
+#X text 14 644 Note the reduced scale of the graph (from -0.25 to 0.25)
+compared to the previous examples.;
+#X connect 0 0 1 0;
+#X connect 1 0 38 0;
+#X connect 1 0 38 1;
+#X connect 7 0 0 0;
+#X connect 8 0 7 1;
+#X connect 9 0 8 0;
+#X connect 10 0 12 1;
+#X connect 11 0 10 0;
+#X connect 12 0 31 0;
+#X connect 13 0 14 0;
+#X connect 14 0 39 0;
+#X connect 14 0 39 1;
+#X connect 15 0 13 0;
+#X connect 16 0 15 1;
+#X connect 17 0 16 0;
+#X connect 18 0 20 1;
+#X connect 19 0 18 0;
+#X connect 20 0 31 1;
+#X connect 21 0 22 0;
+#X connect 22 0 40 0;
+#X connect 22 0 40 1;
+#X connect 23 0 21 0;
+#X connect 24 0 23 1;
+#X connect 25 0 24 0;
+#X connect 26 0 28 1;
+#X connect 27 0 26 0;
+#X connect 28 0 32 1;
+#X connect 31 0 32 0;
+#X connect 32 0 6 0;
+#X connect 32 0 5 0;
+#X connect 32 0 5 1;
+#X connect 33 0 34 0;
+#X connect 34 0 6 0;
+#X connect 35 0 7 0;
+#X connect 35 0 15 0;
+#X connect 35 0 23 0;
+#X connect 36 0 35 0;
+#X connect 38 0 41 0;
+#X connect 39 0 43 0;
+#X connect 40 0 44 0;
+#X connect 41 0 42 0;
+#X connect 42 0 12 0;
+#X connect 43 0 45 0;
+#X connect 44 0 46 0;
+#X connect 45 0 20 0;
+#X connect 46 0 28 0;
diff --git a/desiredata/doc/3.audio.examples/J05.triangle.pd b/desiredata/doc/3.audio.examples/J05.triangle.pd
new file mode 100644
index 00000000..fda0ef05
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J05.triangle.pd
@@ -0,0 +1,56 @@
+#N canvas 111 30 606 531 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-sum 882 float 0;
+#X coords 0 0.5 881 -0.5 200 130 1;
+#X restore 382 119 graph;
+#X text 381 257 ---- 0.02 seconds ----;
+#X text 350 505 updated for Pd version 0.39;
+#X obj 46 242 output~;
+#X obj 140 276 tabwrite~ \$0-sum;
+#X obj 130 107 / 100;
+#X floatatom 130 86 4 0 100 0 - - -;
+#X obj 206 108 / 100;
+#X floatatom 206 87 4 0 100 0 - - -;
+#X obj 151 228 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 151 250 metro 193;
+#X obj 19 95 phasor~;
+#X floatatom 19 74 5 0 0 0 - - -;
+#X text 11 51 frequency;
+#X text 126 50 SLOPES (percent);
+#X obj 108 137 *~;
+#X obj 19 129 *~ -1;
+#X obj 19 154 +~ 1;
+#X obj 184 156 *~;
+#X obj 108 189 min~;
+#X text 341 118 0.5;
+#X text 338 237 -0.5;
+#X text 30 4 Making waveforms with corners by specifying line segment
+slopes;
+#X text 136 67 up;
+#X text 209 68 down;
+#X text 29 317 Occasionally a second method for making corners is more
+convenient. Here we specify the slopes of the rising and falling segments
+(as always \, in units per cycle). We then make a triangle wave with
+a corner at (0 \, 0) and another one \, placed somewhere within the
+cycle. The slopes of the two lines determine the second point \, which
+will have an x value of t/(s+t) (if we let s denote the rising slope
+and t the falling one \, both as positive numbers). The y value is
+st/(s+t). If we wish instead to specify the corner location (x \, y)
+(with x in cycles \, 0<x<1) we set s = y/x and t = y/(1-x). The DC
+value is y/2.;
+#X connect 5 0 15 1;
+#X connect 6 0 5 0;
+#X connect 7 0 18 1;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 10 0 4 0;
+#X connect 11 0 15 0;
+#X connect 11 0 16 0;
+#X connect 12 0 11 0;
+#X connect 15 0 19 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 1;
+#X connect 19 0 3 0;
+#X connect 19 0 4 0;
diff --git a/desiredata/doc/3.audio.examples/J06.enveloping.pd b/desiredata/doc/3.audio.examples/J06.enveloping.pd
new file mode 100644
index 00000000..52bae857
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J06.enveloping.pd
@@ -0,0 +1,97 @@
+#N canvas 4 -26 874 736 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-waveform 882 float 0;
+#X coords 0 1.02 881 -1.02 200 130 1;
+#X restore 639 379 graph;
+#X floatatom 47 25 0 0 20 0 - - -;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-env 22050 float 0;
+#X coords 0 1.02 22049 -1.02 200 130 1;
+#X restore 638 189 graph;
+#X obj 47 52 phasor~;
+#X text 126 2 ENVELOPE GENERATORS FROM LINE SEGMENTS;
+#X obj 19 514 output~;
+#X text 610 698 updated for Pd version 0.39;
+#X obj 46 98 *~;
+#X obj 11 165 -~;
+#X obj 10 214 *~;
+#X floatatom 68 75 3 0 100 0 - - -;
+#X obj 16 244 min~;
+#X floatatom 68 123 3 0 100 0 - - -;
+#X obj 68 146 / 100;
+#X floatatom 68 172 3 0 100 0 - - -;
+#X obj 60 386 *~ 2;
+#X obj 60 409 min~;
+#X obj 110 386 -~ 1;
+#X obj 60 358 phasor~ 200;
+#X obj 18 477 *~;
+#X obj 27 326 tabwrite~ \$0-env;
+#X obj 38 306 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 68 195 * -1;
+#X obj 69 457 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 61 478 tabwrite~ \$0-waveform;
+#X obj 111 409 *~ -3;
+#X obj 60 432 -~ 0.5;
+#X text 639 514 ----- 0.02 second ----;
+#X text 86 24 <-- frequency (Hz.);
+#X text 636 322 ----- 0.5 second ------;
+#X text 107 72 <-- slope of rise segment. Just multiply this by the
+phase to make the segment.;
+#X text 129 140 Subtract this to make the phasor cross zero at the
+desired point of the cycle.;
+#X text 107 173 <-- slope of decay segment.;
+#X text 112 190 multiply the phasor (with the zero crossing shifted
+as above) by the desired slope \, negating it so the segment points
+downward.;
+#X text 63 244 minimum of rise and decay segments (makes a triangle
+wave);
+#X obj 17 267 clip~ 0 1;
+#X text 109 266 clip the triangle wave to between 0 and 1 \, to make
+the sustain and silent regions.;
+#X text 108 121 <-- Duty cycle (end of decay segment as % of cycle.)
+;
+#X text 60 304 <-- click to graph envelope shape;
+#X text 91 456 <-- click to graph audio waveform;
+#X text 172 364 this makes a quick-and-dirty triangle wave;
+#X text 172 382 as described in the previous patch. It's;
+#X text 172 419 to listen to.;
+#X text 97 511 You can make a phasor-generated envelope generator using
+"min" and "clip" to combine line segments. Here a rise segment starts
+at phase 0 \, and a decay segment passes through zero at a controllable
+point (the "duty cycle" \, as a percentage of a cycle.) Each has a
+controllable slope (in units per cycle). The resulting triangle wave
+(the minimum of the rise and decay segments) is limited to 1 \, thus
+making a flat "sustain" segment (unless the rise and decay segments
+meet at a value less than one \, in which case there is none). Limiting
+below by 0 prevents us from following the decay segment into negative
+values. Reasonable values to start with are 6 Hz. frequency \, rise
+and decay slope 10 \, duty cycle 75%.;
+#X text 173 401 used here so we'll have something;
+#X connect 1 0 3 0;
+#X connect 3 0 7 0;
+#X connect 3 0 8 0;
+#X connect 7 0 11 1;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 10 0 7 1;
+#X connect 11 0 35 0;
+#X connect 12 0 13 0;
+#X connect 13 0 8 1;
+#X connect 14 0 22 0;
+#X connect 15 0 16 0;
+#X connect 16 0 26 0;
+#X connect 17 0 25 0;
+#X connect 18 0 15 0;
+#X connect 18 0 17 0;
+#X connect 19 0 5 0;
+#X connect 19 0 5 1;
+#X connect 21 0 20 0;
+#X connect 22 0 9 1;
+#X connect 23 0 24 0;
+#X connect 25 0 16 1;
+#X connect 26 0 24 0;
+#X connect 26 0 19 1;
+#X connect 35 0 19 0;
+#X connect 35 0 20 0;
diff --git a/desiredata/doc/3.audio.examples/J07.oversampling.pd b/desiredata/doc/3.audio.examples/J07.oversampling.pd
new file mode 100644
index 00000000..0b124c03
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J07.oversampling.pd
@@ -0,0 +1,61 @@
+#N canvas 343 48 578 498 12;
+#N canvas 158 4 728 420 16x 0;
+#X obj 21 151 *~ 0.064;
+#X obj 21 174 rpole~ 0.93538;
+#X obj 21 197 *~ 0.00431;
+#X obj 21 220 cpole~ 0.96559 0.05592;
+#X obj 21 246 cpole~ 0.96559 -0.05592;
+#X obj 21 269 *~ 0.125;
+#X obj 21 292 rzero~ -1;
+#X obj 21 315 rzero~ -1;
+#X obj 21 338 rzero~ -1;
+#X obj 21 66 phasor~;
+#X obj 204 29 block~ 1024 1 16;
+#X obj 21 31 inlet;
+#X obj 21 372 outlet~;
+#X text 170 151 These objects make a 3-pole \, 3-zero Butterwirth low-pass
+filter with cutoff at 15kHz (assuming 44100 sample rate.) The filter
+was designed using the "buttercoef3" abstraction introduced in patch
+H13.butterworth.pd in this series.;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 12 0;
+#X connect 9 0 0 0;
+#X connect 11 0 9 0;
+#X restore 23 148 pd 16x;
+#X floatatom 23 111 7 0 0 0 - - -;
+#X obj 109 149 phasor~;
+#X obj 22 194 output~;
+#X obj 108 194 output~;
+#X obj 23 83 mtof;
+#X floatatom 23 59 3 -24 135 0 - - -;
+#X text 131 18 UPSAMPLING TO CONTROL FOLDOVER;
+#X text 56 57 <-- pitch;
+#X text 126 250 not;
+#X text 22 265 sampled;
+#X text 26 249 16x up-;
+#X text 20 293 The "pd 16x" subpatch at left contains a phasor~ object
+\, but is locally upsampled by a factor of sixteen. Without upsampling
+\, partials as low as 24 Khz. fold back over into the audible range.
+With upsampling \, the first audibly folding over partial is at almost
+700 Hz \, 29 times higher. The relevant partials will be 29 times \,
+or almost 30 dB \, quieter when upsampled.;
+#X text 21 403 A third-order Butterworth filter is used inside the
+"pd 16x" subpatch - without that \, the internal signal would fold
+over as it gets downsampled at the outlet~ object.;
+#X text 324 464 Updated for Pd version 0.39;
+#X connect 0 0 3 0;
+#X connect 0 0 3 1;
+#X connect 1 0 0 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 2 0 4 1;
+#X connect 5 0 1 0;
+#X connect 6 0 5 0;
diff --git a/desiredata/doc/3.audio.examples/J08.classicsynth.pd b/desiredata/doc/3.audio.examples/J08.classicsynth.pd
new file mode 100644
index 00000000..ae9ce754
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J08.classicsynth.pd
@@ -0,0 +1,135 @@
+#N canvas 203 294 592 528 12;
+#N canvas 158 4 781 654 16x 0;
+#X obj 69 345 *~ 0.064;
+#X obj 69 368 rpole~ 0.93538;
+#X obj 69 391 *~ 0.00431;
+#X obj 69 414 cpole~ 0.96559 0.05592;
+#X obj 69 440 cpole~ 0.96559 -0.05592;
+#X obj 69 463 *~ 0.125;
+#X obj 69 486 rzero~ -1;
+#X obj 69 509 rzero~ -1;
+#X obj 69 532 rzero~ -1;
+#X obj 63 97 phasor~;
+#X obj 69 566 outlet~;
+#X obj 86 151 wrap~;
+#X obj 86 127 -~;
+#X obj 86 175 *~;
+#X obj 63 204 +~;
+#X obj 271 156 phasor~;
+#X obj 294 210 wrap~;
+#X obj 294 186 -~;
+#X obj 294 234 *~;
+#X obj 271 263 +~;
+#X obj 64 271 +~;
+#X obj 457 31 block~ 1024 1 16;
+#X obj 62 29 inlet;
+#X obj 250 34 r osc-params;
+#X obj 250 57 unpack 0 0 0 0 0 0;
+#X obj 272 100 *~;
+#X obj 272 128 +~;
+#X msg 341 338 \; osc-params 0.5 -0.5 0.5 0.5 1 0.5;
+#X obj 341 312 loadbang;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 1;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 10 0;
+#X connect 9 0 12 0;
+#X connect 9 0 14 0;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 13 0 14 1;
+#X connect 14 0 20 0;
+#X connect 15 0 17 0;
+#X connect 15 0 19 0;
+#X connect 16 0 18 0;
+#X connect 17 0 16 0;
+#X connect 18 0 19 1;
+#X connect 19 0 20 1;
+#X connect 20 0 0 0;
+#X connect 22 0 9 0;
+#X connect 22 0 25 0;
+#X connect 23 0 24 0;
+#X connect 24 0 12 1;
+#X connect 24 1 13 1;
+#X connect 24 2 17 1;
+#X connect 24 3 18 1;
+#X connect 24 4 25 1;
+#X connect 24 5 26 1;
+#X connect 25 0 26 0;
+#X connect 26 0 15 0;
+#X connect 28 0 27 0;
+#X restore 41 160 pd 16x;
+#X obj 44 255 output~;
+#X text 333 501 Updated for Pd version 0.39;
+#X text 151 7 THE CLASSIC SUBTRACTIVE SYNTH SOUND;
+#X obj 152 132 *~;
+#X obj 151 102 +~ 0.2;
+#X obj 151 156 *~ 2000;
+#X obj 108 221 *~;
+#X obj 43 218 *~;
+#X obj 41 122 mtof;
+#X obj 41 13 r \$0-note;
+#X obj 41 62 makenote 1;
+#X obj 404 150 + 20;
+#X obj 404 102 metro 300;
+#X obj 404 80 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 404 201 s \$0-note;
+#X obj 404 125 random 70;
+#X obj 42 192 vcf~ 3;
+#X floatatom 228 112 3 0 0 0 - - -;
+#X floatatom 228 157 7 0 0 0 - - -;
+#X obj 228 133 mtof;
+#X obj 108 196 adsr 2 30 200 50 500;
+#X obj 151 77 adsr 1 10 200 50 500;
+#X obj 404 175 pack 0 200;
+#X obj 41 92 poly 1 1;
+#X obj 41 36 unpack;
+#X floatatom 480 80 3 0 0 0 - - -;
+#X floatatom 489 154 3 0 0 0 - - -;
+#X text 31 323 Now that we can make reasonably high-quality classic
+waveforms using upsampling \, we combine an upsampled oscillator with
+a "vcf" filter and ADSR generators to control the filter resonant frequency
+and the amplitude to make the classic subtractive synthesis sound.
+Send an "s \$0-note" object a (pitch \, duration) pair to play a note.
+(Classic VC synths did not have velocity sensitive keyboards!) You
+can add controls to change the parameters of the ADSR envelopes and/or
+the vcf~ "Q" parameter. THe oscillators' waveforms and tuning relationship
+is controlled by other parameters set within the "pd 16x" window.;
+#X connect 0 0 17 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 5 0 4 1;
+#X connect 6 0 17 1;
+#X connect 7 0 8 1;
+#X connect 8 0 1 0;
+#X connect 8 0 1 1;
+#X connect 9 0 0 0;
+#X connect 10 0 25 0;
+#X connect 11 0 24 0;
+#X connect 11 1 24 1;
+#X connect 12 0 23 0;
+#X connect 13 0 16 0;
+#X connect 14 0 13 0;
+#X connect 16 0 12 0;
+#X connect 17 0 8 0;
+#X connect 18 0 20 0;
+#X connect 19 0 6 1;
+#X connect 20 0 19 0;
+#X connect 21 0 7 0;
+#X connect 21 0 7 1;
+#X connect 22 0 5 0;
+#X connect 23 0 15 0;
+#X connect 24 1 9 0;
+#X connect 24 2 22 0;
+#X connect 24 2 21 0;
+#X connect 25 0 11 0;
+#X connect 25 1 11 2;
+#X connect 26 0 13 1;
+#X connect 27 0 23 1;
diff --git a/desiredata/doc/3.audio.examples/J09.bandlimited.pd b/desiredata/doc/3.audio.examples/J09.bandlimited.pd
new file mode 100644
index 00000000..38247473
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/J09.bandlimited.pd
@@ -0,0 +1,216 @@
+#N canvas 33 1 608 881 12;
+#X floatatom 201 163 0 0 0 0 - - -;
+#X obj 53 387 -~;
+#X obj 201 237 /~;
+#X obj 208 214 clip~ 1 999999;
+#X obj 76 195 phasor~;
+#X obj 88 257 *~;
+#X obj 88 281 clip~ -0.5 0.5;
+#X floatatom 76 147 0 0 0 0 - - -;
+#X floatatom 201 115 0 0 0 0 - - -;
+#X obj 201 139 mtof;
+#X text 208 45 band limit (MIDI units);
+#X obj 201 67 loadbang;
+#X obj 88 305 *~ 1000;
+#X obj 88 329 +~ 501;
+#X obj 76 219 -~ 0.5;
+#X text 219 397 graph output;
+#X obj 76 101 samplerate~;
+#X obj 76 125 / 512;
+#N canvas 49 311 450 300 fft 0;
+#X obj 31 41 inlet~;
+#X obj 35 85 rfft~;
+#X obj 34 118 *~;
+#X obj 78 118 *~;
+#X obj 34 161 sqrt~;
+#X obj 37 201 expr~ 50 + 20 * log($v1)/log(10);
+#X obj 38 235 max~ 0;
+#X obj 254 28 block~ 512;
+#X obj 33 263 tabsend~ \$0-fft;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 1 1 3 0;
+#X connect 1 1 3 1;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 8 0;
+#X restore 126 423 pd fft;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-fft 256 float 3;
+#A 0 8.35364 88.2226 82.204 78.6857 76.1917 74.2598 72.6836 71.3537
+70.204 69.1927 68.2904 67.4768 66.7365 66.0581 65.4323 64.8524 64.3122
+63.8074 63.3336 62.8881 62.4675 62.0699 61.693 61.3352 60.9946 60.6703
+60.3606 60.0649 59.7817 59.5107 59.2506 59.0011 58.7612 58.5307 58.3086
+58.0948 57.8885 57.6896 57.4975 57.3119 57.1324 56.9588 56.7906 56.6279
+56.4699 56.3169 56.1681 56.0239 55.8835 55.7472 55.6144 55.4853 55.3594
+55.2368 55.1171 55.0005 54.8864 54.7751 54.6661 54.5596 54.4552 54.3531
+54.2528 54.1546 54.0581 53.9635 53.8703 53.7788 53.6886 53.5999 53.5124
+53.4262 53.341 53.257 53.1738 53.0917 53.0103 52.9299 52.85 52.771
+52.6924 52.6146 52.537 52.4601 52.3835 52.3073 52.2313 52.1556 52.0801
+52.0048 51.9295 51.8545 51.7793 51.7042 51.629 51.5538 51.4784 51.4029
+51.3271 51.2513 51.175 51.0985 51.0216 50.9444 50.8667 50.7887 50.7102
+50.6312 50.5516 50.4716 50.3909 50.3097 50.2277 50.1452 50.0619 49.978
+49.8932 49.8078 49.7214 49.6344 49.5464 49.4576 49.3678 49.2771 49.1854
+49.0929 48.9992 48.9046 48.8089 48.7121 48.6142 48.5152 48.415 48.3137
+48.2111 48.1073 48.0022 47.8959 47.7882 47.6792 47.5688 47.4571 47.3439
+47.2293 47.1131 46.9956 46.8764 46.7558 46.6334 46.5096 46.384 46.2568
+46.1278 45.9972 45.8646 45.7304 45.5942 45.4563 45.3163 45.1746 45.0306
+44.8849 44.7369 44.5869 44.4347 44.2804 44.1238 43.965 43.8038 43.6404
+43.4744 43.3062 43.1352 42.9619 42.7858 42.6072 42.4257 42.2417 42.0546
+41.8649 41.6719 41.4762 41.2771 41.0752 40.8697 40.6613 40.4491 40.2338
+40.0147 39.7922 39.5657 39.3357 39.1016 38.8637 38.6214 38.3752 38.1243
+37.8694 37.6096 37.3454 37.076 36.8021 36.5227 36.2385 35.9484 35.6533
+35.3519 35.0451 34.7318 34.4127 34.0866 33.7542 33.4145 33.0681 32.7138
+32.3524 31.9824 31.6049 31.2182 30.8233 30.4185 30.0049 29.5806 29.1467
+28.7012 28.2454 27.7769 27.297 26.8034 26.2972 25.7759 25.2407 24.6887
+24.1212 23.5348 22.9309 22.3055 21.6598 20.9892 20.2947 19.5705 18.8168
+18.0266 17.1987 16.3231 15.3963 14.404 13.3362 12.1694 10.8809 9.42496
+7.74107 5.71798 3.15337 0 0;
+#X coords 0 100 256 0 200 140 1;
+#X restore 375 275 graph;
+#X floatatom 375 425 5 0 0 0 - - -;
+#X floatatom 375 471 5 0 0 0 - - -;
+#X obj 52 443 output~;
+#X obj 88 353 tabread4~ \$0-transition;
+#X obj 201 186 * 0.4;
+#X msg 201 91 136.766;
+#X obj 375 447 tabread \$0-fft;
+#X obj 195 400 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 195 422 tabwrite~ \$0-out;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-out 882 float 0;
+#X coords 0 1 882 -1 200 140 1;
+#X restore 378 108 graph;
+#X text 75 15 BAND-LIMITED SAWTOOTH GENERATOR USING A TRANSITION TABLE
+;
+#X obj 76 60 loadbang;
+#X obj 76 83 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 39 657 Now any time we wish to make a discontinuity in the
+output signal \, we make it look exactly like the bandlimited square
+wave looks. We do this by reading through the table we recorded \,
+carefully adding a "digital" \, non-band-limited \, sawtooth to "array1"
+so that the discontinuities in the two cancel out and what you have
+left is the transition in the table.;
+#N canvas 151 52 754 678 transition-table 0;
+#X obj 428 534 cos~;
+#X obj 262 534 cos~;
+#X obj 214 529 cos~;
+#X msg 158 598 bang;
+#X text 242 138 back the phase up one sample;
+#X msg 295 444 -0.0005;
+#X obj 262 508 *~ 3;
+#X obj 427 510 *~ 5;
+#X obj 262 559 *~ 0.33333;
+#X obj 427 560 *~ -0.2;
+#X obj 214 557 *~ -1;
+#X msg 159 425 bang;
+#X obj 213 468 phasor~ 22.05;
+#X obj 214 590 *~ 0.57692;
+#X obj 204 259 cos~;
+#X obj 156 254 cos~;
+#X msg 100 323 bang;
+#X msg 13 195 \; pd dsp 1;
+#X msg 237 169 -0.0005;
+#X obj 204 233 *~ 3;
+#X obj 204 284 *~ 0.33333;
+#X obj 156 282 *~ -1;
+#X msg 100 150 bang;
+#X obj 155 193 phasor~ 22.05;
+#X obj 156 315 *~ 0.75;
+#X obj 214 617 tabwrite~ \$0-transition;
+#X obj 156 342 tabwrite~ \$0-transition;
+#X obj 100 128 loadbang;
+#X text 292 216 twice the table length;
+#X text 280 193 period is 2000 samples \,;
+#X text 80 369 This one is used - first and third harmonics only.;
+#X text 28 644 This alternate one puts in harmonics 1 \, 3 \, and 5
+;
+#N canvas 0 0 450 300 graph1 0;
+#X array \$0-transition 1002 float 0;
+#X coords 0 1 1002 -1 200 140 1;
+#X restore 539 32 graph;
+#X text 537 179 ----- 1002 samples ----;
+#X text 24 27 This network puts a half cycle of a band-limited square
+wave into the table "array1.";
+#X text 22 64 Logically the half-cycle is in samples 1 through 1000
+\; samples 0 and 1001 are provided so that the 4-point interpolation
+will work everywhere.;
+#X connect 0 0 9 0;
+#X connect 1 0 8 0;
+#X connect 2 0 10 0;
+#X connect 3 0 25 0;
+#X connect 5 0 12 1;
+#X connect 6 0 1 0;
+#X connect 7 0 0 0;
+#X connect 8 0 13 0;
+#X connect 9 0 13 0;
+#X connect 10 0 13 0;
+#X connect 11 0 5 0;
+#X connect 11 0 3 0;
+#X connect 12 0 2 0;
+#X connect 12 0 6 0;
+#X connect 12 0 7 0;
+#X connect 13 0 25 0;
+#X connect 14 0 20 0;
+#X connect 15 0 21 0;
+#X connect 16 0 26 0;
+#X connect 18 0 23 1;
+#X connect 19 0 14 0;
+#X connect 20 0 24 0;
+#X connect 21 0 24 0;
+#X connect 22 0 18 0;
+#X connect 22 0 17 0;
+#X connect 22 0 16 0;
+#X connect 23 0 15 0;
+#X connect 23 0 19 0;
+#X connect 24 0 26 0;
+#X connect 27 0 22 0;
+#X restore 182 465 pd transition-table;
+#X text 351 853 updated for Pd version 0.39;
+#X text 37 515 A more sophisticated way to control foldover in sawtooth
+waves is to replace the once-a-cycle jump with a bandlimited transition.
+To get a band-limited transition we synthesize a band-limited square
+wave and harvest the transition from the middle of the top half to
+the middle of the bottom half. Here we use a square wave at SR/10 \,
+so that only partials 1 and 3 fit below the Nyquist. The transition
+should take 1/2 period \, or 5 samples. The table is calculated and
+stored in the "transition-table" subpatch.;
+#X text 40 767 The "band limit" controls how fast the transition table
+is read. If it is set to the Nyquist frequency the table is read at
+0.4 times the Nyquist \, or five samples a cycle. Lowering the band
+limit cuts off the partials of the generated sawtooth wave at frequencies
+below the Nyquist.;
+#X connect 0 0 24 0;
+#X connect 1 0 18 0;
+#X connect 1 0 22 0;
+#X connect 1 0 22 1;
+#X connect 1 0 28 0;
+#X connect 2 0 5 1;
+#X connect 3 0 2 1;
+#X connect 4 0 14 0;
+#X connect 5 0 6 0;
+#X connect 6 0 12 0;
+#X connect 7 0 4 0;
+#X connect 7 0 3 0;
+#X connect 8 0 9 0;
+#X connect 9 0 0 0;
+#X connect 11 0 25 0;
+#X connect 12 0 13 0;
+#X connect 13 0 23 0;
+#X connect 14 0 5 0;
+#X connect 14 0 1 1;
+#X connect 16 0 17 0;
+#X connect 17 0 7 0;
+#X connect 20 0 26 0;
+#X connect 23 0 1 0;
+#X connect 24 0 2 0;
+#X connect 25 0 8 0;
+#X connect 26 0 21 0;
+#X connect 27 0 28 0;
+#X connect 31 0 32 0;
+#X connect 32 0 16 0;
diff --git a/desiredata/doc/3.audio.examples/adsr.pd b/desiredata/doc/3.audio.examples/adsr.pd
new file mode 100644
index 00000000..351f354c
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/adsr.pd
@@ -0,0 +1,96 @@
+#N canvas 371 139 752 655 12;
+#X obj 105 111 inlet;
+#X obj 435 151 inlet;
+#X text 101 86 trigger;
+#X obj 105 139 sel 0;
+#X obj 244 155 t b;
+#X obj 166 264 f \$1;
+#X obj 166 289 pack 0 \$2;
+#X obj 492 151 inlet;
+#X obj 438 281 del \$2;
+#X obj 458 429 line~;
+#X obj 462 304 f \$4;
+#X obj 501 379 pack 0 \$3;
+#X obj 554 151 inlet;
+#X obj 616 151 inlet;
+#X obj 689 150 inlet;
+#X msg 105 170 stop;
+#X obj 612 306 pack 0 \$5;
+#X text 435 129 level;
+#X obj 501 355 * \$1;
+#X obj 458 454 outlet~;
+#X text 102 378 and pack with;
+#X text 103 398 attack time;
+#X text 31 126 if zero;
+#X text 32 143 release;
+#X text 12 160 and cancel;
+#X text 43 177 decay;
+#X text 284 272 on attack \, set a;
+#X text 278 305 recall sustain value;
+#X text 315 378 pack with decay time;
+#X text 605 332 on release ramp;
+#X text 606 349 back to zero;
+#X obj 462 329 * 0.01;
+#X text 47 567 Objects such as "f" and "pack" can be given dollar sign
+arguments to initialize their contents from adsr's creation arguments.
+Inlets are supplied to change them on the fly.;
+#X text 13 2 ADSR ENVELOPE;
+#X text 488 129 attack;
+#X text 555 128 decay;
+#X text 609 129 sustain;
+#X text 686 129 release;
+#X text 202 71 attack;
+#X obj 204 92 moses;
+#X obj 194 122 t b b;
+#X msg 128 290 0;
+#X text 20 273 optionally;
+#X text 10 291 bash to zero;
+#X text 25 246 ATTACK:;
+#X text 49 477 When you send this patch a positive trigger it schedules
+a line~ to do an attack and decay \, and if zero \, it starts the release
+ramp.;
+#X text 495 629 Updated for Pd version 0.37;
+#X text 255 89 test for negative trigger;
+#X text 253 113 if so \, zero;
+#X text 254 129 the output;
+#X text 278 165 in any case;
+#X text 303 355 multiply by peak level;
+#X text 280 286 delay for sustain;
+#X text 276 328 convert from percent;
+#X text 155 340 ... then;
+#X text 103 359 recall peak level;
+#X text 439 113 peak;
+#X text 281 149 ... do this;
+#X text 47 529 Negative triggers cause the output to jump to zero and
+then attack (instead of attacking from the current location).;
+#X text 208 1 Arguments: level \, attack time \, decay time \, sustain
+level \, release time. A \, D \, and R are in msec and S is in percent.
+This patch is used as an abstraction in various examples.;
+#X connect 0 0 3 0;
+#X connect 1 0 5 1;
+#X connect 1 0 18 1;
+#X connect 3 0 15 0;
+#X connect 3 0 16 0;
+#X connect 3 1 39 0;
+#X connect 4 0 5 0;
+#X connect 4 0 8 0;
+#X connect 5 0 6 0;
+#X connect 6 0 9 0;
+#X connect 7 0 6 1;
+#X connect 7 0 8 1;
+#X connect 8 0 10 0;
+#X connect 9 0 19 0;
+#X connect 10 0 31 0;
+#X connect 11 0 9 0;
+#X connect 12 0 11 1;
+#X connect 13 0 10 1;
+#X connect 14 0 16 1;
+#X connect 15 0 8 0;
+#X connect 16 0 9 0;
+#X connect 18 0 11 0;
+#X connect 31 0 18 0;
+#X connect 39 0 40 0;
+#X connect 39 1 4 0;
+#X connect 40 0 4 0;
+#X connect 40 1 41 0;
+#X connect 41 0 9 0;
diff --git a/desiredata/doc/3.audio.examples/buttercoef3.pd b/desiredata/doc/3.audio.examples/buttercoef3.pd
new file mode 100644
index 00000000..6d15d6af
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/buttercoef3.pd
@@ -0,0 +1,80 @@
+#N canvas 139 346 714 532 10;
+#X obj 63 51 inlet;
+#X floatatom 522 134 5 0 0 0 - - -;
+#X obj 101 153 t f f;
+#X msg 101 108 0.667;
+#X msg 82 283 0;
+#X obj 517 270 loadbang;
+#X obj 528 298 inlet;
+#X obj 517 322 f;
+#X obj 517 346 expr 1 - 2*$f1;
+#X obj 63 79 t b b b f;
+#X obj 205 228 * -1;
+#X obj 163 228 t f f;
+#X obj 63 391 f;
+#X obj 30 463 outlet;
+#X text 515 237 1 to normalize at Nyquist;
+#X text 59 30 characteristic frequency \, 0(DC) to 1(Nyquist);
+#X obj 283 470 outlet;
+#X obj 439 472 outlet;
+#X text 439 494 imag2a;
+#X text 283 492 real1;
+#X text 374 494 real2;
+#X obj 500 473 outlet;
+#X text 500 495 imag2b;
+#X obj 373 470 outlet;
+#X text 27 485 normalizer1;
+#X obj 173 470 outlet;
+#X text 170 492 normalizer2;
+#X obj 156 436 expr (($f2-$f1)*($f2-$f1)+$f3*$f3);
+#X obj 63 412 t f f;
+#X obj 101 176 expr (1 - $f2*$f2) / (1 + $f2*$f2 + 2*$f2*cos($f1))
+;
+#X obj 163 205 expr 2*$f2*sin($f1) / (1 + $f2*$f2 + 2*$f2*cos($f1))
+;
+#X obj 82 307 expr (1 - $f2*$f2) / (1 + $f2*$f2 + 2*$f2*cos($f1));
+#X obj 522 89 clip 0 1;
+#X obj 522 111 expr tan($f1*1.57);
+#X obj 101 131 expr $f1*1.5708;
+#X text 515 251 0 to normalize at DC;
+#X text 119 4 3-pole (or zero) Butterworth filter coefficient calculator
+;
+#X text 145 109 "theta" in units of pi/2;
+#X text 211 138 conjugate pair of pole/zero locations:;
+#X text 197 155 real part: (1-r*r)/(1+r*r-2rcos(th));
+#X text 245 226 imaginary part: 2rsin(th)/(...);
+#X text 270 282 real-valued one \, theta=0;
+#X obj 30 439 expr abs($f1-$f2);
+#X connect 0 0 9 0;
+#X connect 1 0 29 1;
+#X connect 1 0 30 1;
+#X connect 1 0 31 1;
+#X connect 2 0 29 0;
+#X connect 2 1 30 0;
+#X connect 3 0 34 0;
+#X connect 4 0 31 0;
+#X connect 5 0 7 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 12 1;
+#X connect 9 0 12 0;
+#X connect 9 1 4 0;
+#X connect 9 2 3 0;
+#X connect 9 3 32 0;
+#X connect 10 0 21 0;
+#X connect 11 0 17 0;
+#X connect 11 0 27 2;
+#X connect 11 1 10 0;
+#X connect 12 0 28 0;
+#X connect 27 0 25 0;
+#X connect 28 0 42 0;
+#X connect 28 1 27 0;
+#X connect 29 0 23 0;
+#X connect 29 0 27 1;
+#X connect 30 0 11 0;
+#X connect 31 0 16 0;
+#X connect 31 0 42 1;
+#X connect 32 0 33 0;
+#X connect 33 0 1 0;
+#X connect 34 0 2 0;
+#X connect 42 0 13 0;
diff --git a/desiredata/doc/3.audio.examples/butterworth3~.pd b/desiredata/doc/3.audio.examples/butterworth3~.pd
new file mode 100644
index 00000000..9b6511c6
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/butterworth3~.pd
@@ -0,0 +1,104 @@
+#N canvas -21 471 656 598 10;
+#X obj 59 313 rpole~;
+#X obj 58 379 cpole~;
+#X obj 82 410 cpole~;
+#X obj 58 351 *~;
+#X msg 488 421 clear;
+#X obj 127 160 loadbang;
+#X obj 131 468 rzero~;
+#X obj 131 519 czero~;
+#X obj 156 545 czero~;
+#X obj 131 497 /~;
+#X obj 397 257 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+50;
+#X obj 59 289 *~;
+#X obj 131 446 /~;
+#X obj 171 207 samplerate~;
+#X obj 171 228 / 2;
+#X obj 127 250 / 22050;
+#X obj 127 208 f \$1;
+#X obj 127 228 t f b;
+#X obj 135 181 inlet;
+#X obj 397 164 loadbang;
+#X obj 405 185 inlet;
+#X obj 263 162 loadbang;
+#X obj 307 209 samplerate~;
+#X obj 307 230 / 2;
+#X obj 263 252 / 22050;
+#X obj 263 230 t f b;
+#X obj 271 183 inlet;
+#X obj 58 163 inlet~;
+#X obj 488 166 inlet;
+#X obj 155 568 outlet~;
+#X obj 263 210 f \$2;
+#X obj 397 212 f \$3;
+#X text 58 142 audio;
+#X text 133 140 lp freq;
+#X text 263 142 hp freq;
+#X text 395 146 hi/lo norm;
+#X text 490 143 clear;
+#X text 68 10 3-pole \, 3-zero butterworth lp/hp/shelving filter. Args:
+lp freq \, hp freq \, normalize-hi. Inlets: input signal \, lo freq
+\, hi freq \, hi norm \, reset.;
+#X text 70 75 For high-pass: set LP freq =0 and hi/lo to 1;
+#X text 70 56 For low-pass: set HP freq >= SR/2 and hi/lo to 0;
+#X text 69 92 Shelving: HP and LP specify shelving band. Gain difference
+is about HP/LP cubed (so HP=2LP should give about 18 dB \, for example.)
+;
+#X obj 127 272 buttercoef3;
+#X obj 198 429 buttercoef3;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 12 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 4 0 1 0;
+#X connect 4 0 2 0;
+#X connect 4 0 6 0;
+#X connect 4 0 7 0;
+#X connect 4 0 8 0;
+#X connect 5 0 16 0;
+#X connect 6 0 9 0;
+#X connect 7 0 8 0;
+#X connect 7 1 8 1;
+#X connect 8 0 29 0;
+#X connect 9 0 7 0;
+#X connect 10 0 41 1;
+#X connect 10 0 42 1;
+#X connect 11 0 0 0;
+#X connect 12 0 6 0;
+#X connect 13 0 14 0;
+#X connect 14 0 15 1;
+#X connect 15 0 41 0;
+#X connect 16 0 17 0;
+#X connect 17 0 15 0;
+#X connect 17 1 13 0;
+#X connect 18 0 16 0;
+#X connect 19 0 31 0;
+#X connect 20 0 31 0;
+#X connect 21 0 30 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 1;
+#X connect 24 0 42 0;
+#X connect 25 0 24 0;
+#X connect 25 1 22 0;
+#X connect 26 0 30 0;
+#X connect 27 0 11 0;
+#X connect 28 0 4 0;
+#X connect 30 0 25 0;
+#X connect 31 0 10 0;
+#X connect 41 0 11 1;
+#X connect 41 1 3 1;
+#X connect 41 2 0 1;
+#X connect 41 3 1 2;
+#X connect 41 3 2 2;
+#X connect 41 4 1 3;
+#X connect 41 5 2 3;
+#X connect 42 0 12 1;
+#X connect 42 1 9 1;
+#X connect 42 2 6 1;
+#X connect 42 3 7 2;
+#X connect 42 3 8 2;
+#X connect 42 4 7 3;
+#X connect 42 5 8 3;
diff --git a/desiredata/doc/3.audio.examples/filter-graph1.pd b/desiredata/doc/3.audio.examples/filter-graph1.pd
new file mode 100644
index 00000000..747c283e
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/filter-graph1.pd
@@ -0,0 +1,84 @@
+#N canvas -4 364 603 514 10;
+#X obj 145 292 f;
+#X obj 175 292 + 1;
+#X obj 46 160 t b b;
+#X msg 161 268 0;
+#X obj 125 355 sel 1;
+#X msg 48 218 0;
+#X msg 46 191 1;
+#X floatatom 452 292 7 0 0 0 - - -;
+#X obj 442 333 phasor~;
+#X obj 415 384 cos~;
+#X obj 450 384 cos~;
+#X obj 449 361 -~ 0.25;
+#X obj 46 134 inlet;
+#X obj 394 413 outlet~;
+#X obj 451 413 outlet~;
+#X obj 216 329 t f f;
+#X obj 217 391 outlet;
+#X msg 114 122 \; pd dsp 1;
+#X obj 125 332 >= \$1;
+#X msg 498 333 0;
+#X obj 145 237 metro;
+#X text 166 7 filter-graph1 -- generate sinusoids to test a filter
+;
+#X text 168 23 arg 1: number of steps - arg2: frequency range;
+#X text 40 53 This \, together with its companion filter-graph2 \,
+measure a filter's frequency and phase response. Here we count from
+0 to n-1 (where n is the table size) and output the index and a complex
+sinusoid at each frequency to test.;
+#X text 222 192 fudge to estimate settling time;
+#X obj 487 67 loadbang;
+#X obj 487 105 t b b;
+#X obj 519 151 max 1;
+#X obj 487 128 f \$2;
+#X obj 519 128 f \$1;
+#X obj 487 151 /;
+#X obj 442 265 *;
+#X obj 217 367 pack;
+#X floatatom 500 183 5 0 0 0 - - -;
+#X floatatom 248 237 5 0 0 0 - - -;
+#X obj 487 86 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 202 173 expr max(50 \, 40000/($f2*max($f1 \, 1)));
+#X connect 0 0 1 0;
+#X connect 0 0 15 0;
+#X connect 0 0 18 0;
+#X connect 1 0 0 1;
+#X connect 2 0 6 0;
+#X connect 2 1 3 0;
+#X connect 2 1 17 0;
+#X connect 3 0 0 1;
+#X connect 4 0 5 0;
+#X connect 5 0 20 0;
+#X connect 6 0 20 0;
+#X connect 8 0 11 0;
+#X connect 8 0 9 0;
+#X connect 9 0 13 0;
+#X connect 10 0 14 0;
+#X connect 11 0 10 0;
+#X connect 12 0 2 0;
+#X connect 15 0 32 0;
+#X connect 15 1 31 0;
+#X connect 15 1 36 0;
+#X connect 18 0 4 0;
+#X connect 19 0 8 1;
+#X connect 20 0 0 0;
+#X connect 20 0 19 0;
+#X connect 25 0 35 0;
+#X connect 26 0 28 0;
+#X connect 26 1 29 0;
+#X connect 27 0 30 1;
+#X connect 28 0 30 0;
+#X connect 29 0 27 0;
+#X connect 30 0 31 1;
+#X connect 30 0 33 0;
+#X connect 30 0 36 1;
+#X connect 31 0 7 0;
+#X connect 31 0 8 0;
+#X connect 31 0 32 1;
+#X connect 32 0 16 0;
+#X connect 35 0 26 0;
+#X connect 36 0 20 1;
+#X connect 36 0 34 0;
+#X connect 36 0 32 1;
diff --git a/desiredata/doc/3.audio.examples/filter-graph2.pd b/desiredata/doc/3.audio.examples/filter-graph2.pd
new file mode 100644
index 00000000..a800957d
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/filter-graph2.pd
@@ -0,0 +1,121 @@
+#N canvas 72 200 758 579 10;
+#X obj 266 177 *~;
+#X obj 317 175 *~;
+#X obj 182 276 t b b;
+#X obj 368 382 atan2;
+#X obj 267 302 snapshot~;
+#X obj 341 301 snapshot~;
+#X obj 450 259 butterworth3~ 80 100000 0;
+#X obj 64 135 inlet;
+#X obj 368 410 expr $f1 + 6.283 * ($f1 < -0.01);
+#X obj 71 417 t b f b;
+#X obj 448 457 symbol \$2;
+#X obj 519 457 symbol;
+#X obj 463 434 t b b;
+#X obj 447 504 t b;
+#X obj 474 505 t b;
+#X msg 447 525 0;
+#X msg 474 526 1;
+#X obj 447 481 sel symbol;
+#X floatatom 447 549 5 0 0 0 - - -;
+#X obj 195 493 f;
+#X obj 265 135 inlet~;
+#X obj 318 135 inlet~;
+#X obj 418 134 inlet~;
+#X obj 374 495 f;
+#X obj 368 442 spigot;
+#X obj 333 495 t f b;
+#X obj 154 493 t f b;
+#X obj 154 521 tabwrite \$1;
+#X obj 333 520 tabwrite \$2;
+#X obj 637 259 env~ 2048;
+#X obj 311 362 f;
+#X obj 267 324 t f f b;
+#X obj 311 382 dbtopow;
+#X obj 137 411 expr sqrt($f1*$f1 + $f2*$f2)/$f3;
+#X obj 63 245 sel 0;
+#X obj 87 270 - 1;
+#X obj 64 156 unpack;
+#X obj 117 157 expr 10000/$f1;
+#X text 257 102 test sinusoid:;
+#X text 272 116 cos;
+#X text 325 115 sin;
+#X text 397 97 output of filter;
+#X text 398 113 we're testing;
+#X text 31 103 index and time to next step;
+#X text 39 82 ----- from filter-graph1's 3 outlets: -------;
+#X text 117 193 low-pass filters;
+#X text 118 177 cutoff freq. for;
+#X obj 368 360 swap;
+#X obj 620 215 t b;
+#X text 583 184 clear filters;
+#X text 582 198 to start;
+#X text 578 452 cbeck if any table;
+#X text 577 467 is specified for phase;
+#X text 577 483 (don't compute it if;
+#X text 578 498 not.);
+#X text 31 3 filter-graph2: measures frequency and phase response of
+a filter \, which should be driven by a "filter-graph1" object. We
+need the three outputs of filter-graph1 \, plus the filter output.
+;
+#X text 438 55 1: table name for frequency response;
+#X text 518 39 creation arguments:;
+#X text 438 71 2 (optional): table name for phase response;
+#X obj 266 260 butterworth3~ 80 100000 0;
+#X connect 0 0 59 0;
+#X connect 1 0 6 0;
+#X connect 2 0 4 0;
+#X connect 2 1 5 0;
+#X connect 3 0 8 0;
+#X connect 4 0 31 0;
+#X connect 5 0 33 1;
+#X connect 5 0 47 1;
+#X connect 6 0 5 0;
+#X connect 7 0 36 0;
+#X connect 8 0 24 0;
+#X connect 9 0 2 0;
+#X connect 9 1 19 1;
+#X connect 9 1 23 1;
+#X connect 9 2 12 0;
+#X connect 10 0 17 0;
+#X connect 11 0 17 1;
+#X connect 12 0 10 0;
+#X connect 12 1 11 0;
+#X connect 13 0 15 0;
+#X connect 14 0 16 0;
+#X connect 15 0 18 0;
+#X connect 16 0 18 0;
+#X connect 17 0 13 0;
+#X connect 17 1 14 0;
+#X connect 18 0 24 1;
+#X connect 19 0 27 1;
+#X connect 20 0 0 0;
+#X connect 20 0 29 0;
+#X connect 21 0 1 0;
+#X connect 22 0 1 1;
+#X connect 22 0 0 1;
+#X connect 23 0 28 1;
+#X connect 24 0 25 0;
+#X connect 25 0 28 0;
+#X connect 25 1 23 0;
+#X connect 26 0 27 0;
+#X connect 26 1 19 0;
+#X connect 29 0 30 1;
+#X connect 30 0 32 0;
+#X connect 31 0 33 0;
+#X connect 31 1 47 0;
+#X connect 31 2 30 0;
+#X connect 32 0 33 2;
+#X connect 33 0 26 0;
+#X connect 34 1 35 0;
+#X connect 34 1 48 0;
+#X connect 35 0 9 0;
+#X connect 36 0 34 0;
+#X connect 36 1 37 0;
+#X connect 37 0 6 1;
+#X connect 37 0 59 1;
+#X connect 47 0 3 0;
+#X connect 47 1 3 1;
+#X connect 48 0 6 4;
+#X connect 48 0 59 4;
+#X connect 59 0 4 0;
diff --git a/desiredata/doc/3.audio.examples/osc-voice.pd b/desiredata/doc/3.audio.examples/osc-voice.pd
new file mode 100644
index 00000000..48bb81ea
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/osc-voice.pd
@@ -0,0 +1,89 @@
+#N canvas 153 209 946 576 12;
+#X obj 163 390 line~;
+#X obj 401 438 line~;
+#X obj 163 511 *~;
+#X obj 383 229 r \$1;
+#X obj 363 316 dbtorms;
+#X obj 383 281 unpack;
+#X obj 383 255 t l b;
+#X obj 401 412 pack;
+#X obj 447 283 30;
+#X obj 163 286 unpack;
+#X obj 163 260 r \$2;
+#X obj 163 470 osc~;
+#X obj 163 312 mtof;
+#X obj 363 342 sqrt;
+#X obj 363 368 sqrt;
+#X obj 163 338 sqrt;
+#X obj 163 364 sqrt;
+#X obj 163 418 *~;
+#X obj 163 444 *~;
+#X obj 401 464 *~;
+#X obj 400 492 *~;
+#X obj 96 486 inlet~;
+#X obj 96 538 outlet~;
+#X obj 96 512 +~;
+#X floatatom 293 342 0 0 0;
+#X msg 294 316 set \$1;
+#X obj 294 368 s \$1;
+#X floatatom 96 336 0 0 0;
+#X msg 96 310 set \$1;
+#X obj 96 362 s \$2;
+#X text 370 201 amplitude;
+#X text 157 233 pitch;
+#X text 27 36 The amplitude and pitch are controlled by quartic envelopes
+as in the previous example. Here we introduce two new features. First
+\, there are number boxes to show the most recent targets for amplitude
+and frequency \, which you can also use to change the values. Also
+\, if amplitude gets a message without an explicit time value \, we
+supply a default of "30".;
+#X text 27 149 Other small differences from the previous patch: pitch
+and amplitude are now in MIDI and dB \, and there's a summing bus arrangement
+(the inlet~ \, +~ \, and outlet~).;
+#X text 15 295 see or;
+#X text 16 315 change;
+#X text 16 336 pitch-->;
+#X text 233 325 and;
+#X text 233 342 amp-->;
+#X text 488 283 "30" is short for "float 30." This is;
+#X text 495 302 more CPU efficient than a message.;
+#X text 451 403 The "pack" always gets a 30 \, but if you send a pair
+of numbers to amplitude \, the second one overrides the 30;
+#X text 439 254 first bang the "30" \, then pass the list on;
+#X text 62 7 This abstraction is used in patch 68.qlist.pd.;
+#X connect 0 0 17 0;
+#X connect 0 0 17 1;
+#X connect 1 0 19 0;
+#X connect 1 0 19 1;
+#X connect 2 0 23 1;
+#X connect 3 0 6 0;
+#X connect 4 0 13 0;
+#X connect 5 0 4 0;
+#X connect 5 0 25 0;
+#X connect 5 1 7 1;
+#X connect 6 0 5 0;
+#X connect 6 1 8 0;
+#X connect 7 0 1 0;
+#X connect 8 0 7 1;
+#X connect 9 0 12 0;
+#X connect 9 0 28 0;
+#X connect 9 1 0 1;
+#X connect 10 0 9 0;
+#X connect 11 0 2 0;
+#X connect 12 0 15 0;
+#X connect 13 0 14 0;
+#X connect 14 0 7 0;
+#X connect 15 0 16 0;
+#X connect 16 0 0 0;
+#X connect 17 0 18 0;
+#X connect 17 0 18 1;
+#X connect 18 0 11 0;
+#X connect 19 0 20 0;
+#X connect 19 0 20 1;
+#X connect 20 0 2 1;
+#X connect 21 0 23 0;
+#X connect 23 0 22 0;
+#X connect 24 0 26 0;
+#X connect 25 0 24 0;
+#X connect 27 0 29 0;
+#X connect 28 0 27 0;
diff --git a/desiredata/doc/3.audio.examples/output~.pd b/desiredata/doc/3.audio.examples/output~.pd
new file mode 100644
index 00000000..81ad3b7f
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/output~.pd
@@ -0,0 +1,66 @@
+#N canvas 0 0 615 578 12;
+#X obj 353 490 t b;
+#X obj 353 437 f;
+#X obj 353 515 f;
+#X msg 467 514 0;
+#X obj 353 467 moses 1;
+#X obj 467 486 t b f;
+#X obj 433 447 moses 1;
+#X obj 29 97 dbtorms;
+#X obj 85 170 inlet~;
+#X msg 299 310 \; pd dsp 1;
+#X obj 29 170 line~;
+#X obj 64 242 *~;
+#X obj 64 272 dac~;
+#X obj 29 127 pack 0 50;
+#X text 121 146 audio in;
+#X text 138 464 test if less than 1 -->;
+#X text 104 491 if true convert to bang -->;
+#X text 100 96 <-- convert from dB to linear units;
+#X floatatom 323 219 3 0 100 0 dB - -;
+#X obj 350 240 bng 15 250 50 0 empty empty mute -38 7 0 12 -262144
+-1 -1;
+#X text 118 126 <-- make a ramp to avoid clicks or zipper noise;
+#X obj 148 170 inlet~;
+#X obj 154 241 *~;
+#X text 373 378 MUTE logic:;
+#X obj 323 174 r \$0-master-lvl;
+#X obj 353 541 s \$0-master-lvl;
+#X obj 323 279 s \$0-master-out;
+#X obj 29 71 r \$0-master-out;
+#X obj 433 418 r \$0-master-out;
+#X text 60 10 Level control abstraction \, used in many of the Pd example
+patches. The "level" and "mute" controls show up on the parent \, calling
+patch.;
+#X text 66 517 previous nonzero master-lvl -->;
+#X text 138 421 recall previous;
+#X text 138 439 value of master-lvl -->;
+#X text 39 319 automatically start DSP -->;
+#X obj 85 192 hip~ 3;
+#X obj 147 192 hip~ 3;
+#X connect 0 0 2 0;
+#X connect 1 0 4 0;
+#X connect 2 0 25 0;
+#X connect 3 0 25 0;
+#X connect 4 0 0 0;
+#X connect 4 1 5 0;
+#X connect 5 0 3 0;
+#X connect 6 1 2 1;
+#X connect 7 0 13 0;
+#X connect 8 0 34 0;
+#X connect 10 0 22 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 13 0 10 0;
+#X connect 18 0 9 0;
+#X connect 18 0 26 0;
+#X connect 19 0 1 0;
+#X connect 21 0 35 0;
+#X connect 22 0 12 1;
+#X connect 24 0 18 0;
+#X connect 27 0 7 0;
+#X connect 28 0 1 1;
+#X connect 28 0 6 0;
+#X connect 34 0 11 1;
+#X connect 35 0 22 1;
+#X coords 0 0 1 1 65 55 1 300 200;
diff --git a/desiredata/doc/3.audio.examples/partial.pd b/desiredata/doc/3.audio.examples/partial.pd
new file mode 100644
index 00000000..03bb925d
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/partial.pd
@@ -0,0 +1,76 @@
+#N canvas 18 78 880 448 12;
+#X obj 465 234 sqrt;
+#X text 17 88 trigger;
+#X text 33 175 relative frequency;
+#X obj 17 341 *~;
+#X obj 227 322 line~;
+#X obj 227 349 *~;
+#X obj 227 376 *~;
+#X msg 227 285 0 \$1;
+#X obj 465 261 sqrt;
+#X obj 17 113 r trigger;
+#X obj 465 180 float \$1;
+#X obj 249 235 r duration;
+#X obj 39 226 r frequency;
+#X obj 227 158 t b b;
+#X text 303 209 relative duration;
+#X obj 17 368 throw~ sum;
+#X obj 17 140 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 465 288 \$1 5;
+#X obj 227 185 del 5;
+#X obj 465 207 * 0.1;
+#X obj 17 279 + \$4;
+#X text 550 178 get amplitude from argument 1;
+#X text 524 206 normalize to 0.1;
+#X text 516 233 take fourth root (square root twice);
+#X text 544 250 because we'll raise line~ output to;
+#X text 543 267 fourth power;
+#X text 515 292 attack time 5 msec;
+#X text 280 184 decay after 5 msec;
+#X text 469 157 attack;
+#X obj 226 211 float \$2;
+#X obj 227 258 *;
+#X text 264 258 actual duration;
+#X obj 17 200 float \$3;
+#X obj 17 252 *;
+#X obj 17 314 osc~;
+#X text 49 252 times global freq.;
+#X text 60 279 plus detune;
+#X text 271 285 decay msg to line~;
+#X text 266 350 raise to fourth power for;
+#X text 267 368 natural-sounding decay shape;
+#X text 20 396 add to global;
+#X text 19 415 summing bus;
+#X text 21 45 This patch is used as an abstraction in the additive
+synthesis example \, D06.additive.pd;
+#X text 25 4 partial -- sinusoidal partial for additive synthesis;
+#X text 631 12 arguments:;
+#X text 605 37 1 amplitude \; 2 relative duration \; 3 relative frequency
+\; 4 detune;
+#X connect 0 0 8 0;
+#X connect 3 0 15 0;
+#X connect 4 0 5 0;
+#X connect 4 0 5 1;
+#X connect 5 0 6 0;
+#X connect 5 0 6 1;
+#X connect 6 0 3 1;
+#X connect 7 0 4 0;
+#X connect 8 0 17 0;
+#X connect 9 0 16 0;
+#X connect 10 0 19 0;
+#X connect 11 0 30 1;
+#X connect 12 0 33 1;
+#X connect 13 0 18 0;
+#X connect 13 1 10 0;
+#X connect 16 0 13 0;
+#X connect 16 0 32 0;
+#X connect 17 0 4 0;
+#X connect 18 0 29 0;
+#X connect 19 0 0 0;
+#X connect 20 0 34 0;
+#X connect 29 0 30 0;
+#X connect 30 0 7 0;
+#X connect 32 0 33 0;
+#X connect 33 0 20 0;
+#X connect 34 0 3 0;
diff --git a/desiredata/doc/3.audio.examples/qlist-sampler.txt b/desiredata/doc/3.audio.examples/qlist-sampler.txt
new file mode 100644
index 00000000..0c412767
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/qlist-sampler.txt
@@ -0,0 +1,147 @@
+note 60 90 50 2 50 30 30;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+15 note 60;
+100 note 59 90 100;
+comment measure 1;
+100 note 60 90 150 2 0;
+ note 36 90 200 2 50;
+200 note 48 90 250 2 0;
+ note 40 90 200 2 50;
+ note 43 90 200 2 50;
+200 note 48 90 250 2 0;
+ note 31 90 200 2 50;
+200 note 55 90 100;
+ note 41 90 200;
+ note 43 90 200;
+100 note 53 90 100;
+100 note 52 90 100;
+ note 36 90 200;
+100 note 55 90 100;
+100 note 60 90 100;
+ note 40 90 200;
+ note 43 90 200;
+100 note 59 90 100;
+100 note 60 90 100;
+ note 25 90 200;
+100 note 64 90 100;
+100 note 62 90 100;
+ note 39 90 200;
+ note 43 90 200;
+100 note 61 90 100;
+
+comment measure 2;
+100 note 62 90 150 2 0;
+ note 26 90 200;
+200 note 50 90 250 2 50;
+ note 41 90 200;
+ note 42 90 200;
+200 note 50 90 250;
+ note 29 90 200;
+200 note 50 90 100;
+ note 30 90 200;
+ note 44 90 200;
+ note 48 90 200;
+100 note 48 90 100;
+100 note 47 90 100;
+ note 31 90 200;
+ note 43 90 200;
+ note 47 90 200;
+100 note 50 90 100;
+100 note 55 90 100;
+ note 34 90 200;
+ note 42 90 200;
+ note 46 90 200;
+100 note 54 90 100;
+100 note 55 90 200;
+ note 35 90 200;
+ note 42 90 200;
+ note 45 90 200;
+200 note 57 90 100;
+ note 41 90 200;
+ note 47 90 200;
+100 note 59 90 100;
+comment measure 3;
+100 note 60 90 100;
+ note 24 90 200;
+ note 40 90 200;
+ note 48 90 200 2 0;
+
+100 note 59 90 100 2 50;
+100 note 57 90 100;
+100 note 55 90 100;
+
+100 note 57 90 100;
+ note 28 90 200;
+ note 38 90 200;
+ note 46 90 200;
+100 note 55 90 100;
+100 note 53 90 100;
+100 note 52 90 100;
+
+100 note 53 90 100;
+ note 29 90 100;
+ note 36 90 100;
+ note 45 90 100;
+100 note 52 90 100;
+100 note 50 90 100;
+ note 29 90 300;
+ note 36 90 300;
+ note 45 90 300;
+100 note 48 90 100;
+
+100 note 50 90 100;
+100 note 48 90 100;
+100 note 47 90 100;
+ note 29 90 300;
+ note 38 90 300;
+ note 44 90 300 2 0;
+100 note 45 90 100 2 50;
+
+comment measure 4;
+100 note 43 90 100;
+ note 31 90 200;
+ note 38 90 200;
+100 note 48 90 100;
+100 note 47 90 100;
+ note 31 90 300;
+ note 40 90 300;
+ note 43 90 300 2 0;
+100 note 50 90 100 2 50;
+
+100 note 48 90 100;
+100 note 52 90 100;
+100 note 50 90 100;
+ note 31 90 300 2 0;
+ note 41 90 300;
+ note 43 90 300;
+100 note 53 90 100 2 50;
+
+100 note 52 90 200;
+ note 31 90 300 2 50;
+200 note 48 90 200;
+ note 19 90 200 2 50;
+ note 29 90 200 2 50;
+ note 36 90 200 2 50;
+
+200 note 48 90 100 2 50 0 4000;
+ note 12 90 300;
+ note 28 90 300;
+ note 36 90 300;
+
+
+
diff --git a/desiredata/doc/3.audio.examples/qlist.txt b/desiredata/doc/3.audio.examples/qlist.txt
new file mode 100644
index 00000000..719dc89b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/qlist.txt
@@ -0,0 +1,56 @@
+# This is a qlist for patch number 68, which demonstrates an oscillator
+bank.
+;
+# comments start with a "#" which must be followed by a space. The comment
+is terminated by a semicolon like this: ;
+
+# first an arpeggio. You can group them in lines as you please. The 100s at
+the beginnings of lines are delay times. ;
+
+pit1 89; amp1 80;
+100 pit2 72; amp2 80;
+100 pit3 57; amp3 90;
+100 pit4 84; amp4 78;
+100 pit5 74; amp5 74;
+100 pit6 73; amp6 74;
+100 pit7 100; amp7 78;
+100 pit8 37; amp8 95;
+
+# after a 600-msec rest, gliss four of the oscillators to new frequencies. ;
+600 pit1 70 1000;
+300 pit8 40 1000;
+300 pit4 89 1000;
+300 pit7 95 1000;
+
+# a second later, turn them off with decay time 1500 ;
+1000
+amp1 0 1500;
+amp2 0 1500;
+amp3 0 1500;
+amp4 0 1500;
+amp5 0 1500;
+amp6 0 1500;
+amp7 0 1500;
+amp8 0 1500;
+
+# and re-attack them.. ;
+1000
+amp1 85 5;
+amp2 85 5;
+amp3 85 5;
+amp4 90 5;
+amp5 85 5;
+amp6 85 5;
+amp7 90 5;
+amp8 85 5;
+
+# this time, try varying decay times. ;
+10
+amp1 0 2000;
+amp2 0 2000;
+amp3 0 2000;
+amp4 0 500;
+amp5 0 1000;
+amp6 0 1000;
+amp7 0 500;
+amp8 0 4000;
diff --git a/desiredata/doc/3.audio.examples/qlist2.txt b/desiredata/doc/3.audio.examples/qlist2.txt
new file mode 100644
index 00000000..5c272646
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/qlist2.txt
@@ -0,0 +1,5 @@
+note 36;
+1000 note 34;
+1000 note 33;
+1000 note 31;
+1000 qlist bang;
diff --git a/desiredata/doc/3.audio.examples/reverb-echo.pd b/desiredata/doc/3.audio.examples/reverb-echo.pd
new file mode 100644
index 00000000..81c96131
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/reverb-echo.pd
@@ -0,0 +1,24 @@
+#N canvas 118 224 600 492 12;
+#X obj 66 95 inlet~;
+#X obj 130 96 inlet~;
+#X obj 68 216 outlet~;
+#X obj 141 215 outlet~;
+#X obj 67 143 +~;
+#X obj 140 141 -~;
+#X obj 141 165 delwrite~ \$1 \$2;
+#X obj 140 191 delread~ \$1 \$2;
+#X text 48 14 This appears as an abstraction in patch G08.reverb.pd
+;
+#X text 27 267 This network makes two copies of the (stereo) input
+\, one in phase \, the other out of phase and delayed. The total frequency
+response is flat. The total signal power out is exactly twice that
+of the input \, no matter what freqiencies the input contains. This
+is used to increase echo density \, by stacking several of these units
+with different delay times. Each stage doubles the echo density.;
+#X connect 0 0 4 0;
+#X connect 0 0 5 0;
+#X connect 1 0 4 1;
+#X connect 1 0 5 1;
+#X connect 4 0 2 0;
+#X connect 5 0 6 0;
+#X connect 7 0 3 0;
diff --git a/desiredata/doc/3.audio.examples/sampvoice.pd b/desiredata/doc/3.audio.examples/sampvoice.pd
new file mode 100644
index 00000000..b277d345
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/sampvoice.pd
@@ -0,0 +1,114 @@
+#N canvas 231 67 705 628 12;
+#X obj 278 476 *~;
+#X obj 177 604 outlet~;
+#X obj 104 396 makefilename sample%d;
+#X msg 104 419 set \$1;
+#X obj 104 442 tabread4~ sample1;
+#X obj 360 419 dbtorms;
+#X obj 381 395 unpack;
+#X obj 360 442 sqrt;
+#X obj 360 465 sqrt;
+#X obj 338 559 *~;
+#X obj 406 513 *~;
+#X obj 406 536 *~;
+#X msg 201 42 bang;
+#X obj 201 72 delay 5;
+#X obj 289 95 unpack 0 0 0 0 0 0 0;
+#X obj 426 184 f;
+#X obj 367 161 f;
+#X obj 309 161 f;
+#X obj 278 161 f;
+#X obj 247 161 f;
+#X obj 156 159 f;
+#X obj 156 182 mtof;
+#X obj 156 205 / 261.62;
+#X obj 156 228 * 4.41e+08;
+#X obj 156 251 +;
+#X obj 399 161 delay;
+#X obj 247 303 pack 0 0 0 0 0;
+#X obj 201 95 t b b b;
+#X obj 309 207 + 1;
+#X obj 309 184 * 44.1;
+#X msg 55 338 0 5;
+#X msg 289 337 1 5;
+#X msg 325 337 0 \, \$1 \$2;
+#X msg 128 338 \$3 \, \$4 1e+07;
+#X msg 253 337 \$5;
+#X msg 405 337 0 \$1;
+#X obj 289 72 inlet;
+#X obj 177 553 inlet~;
+#X obj 177 579 +~;
+#X text 44 15 This is an abstraction used by the polyphonic sampler.
+;
+#X text 505 67 ARGUMENTS FOR NOTES:;
+#X text 505 89 pitch in halftones;
+#X text 505 113 amplitude (dB);
+#X text 505 161 sample number;
+#X text 505 137 duration (msec);
+#X text 505 185 start location (msec);
+#X text 505 209 rise time (msec);
+#X text 505 233 decay time (msec);
+#X obj 45 396 vline~;
+#X obj 301 396 vline~;
+#X obj 406 490 vline~;
+#X connect 0 0 9 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 6 1 50 1;
+#X connect 7 0 8 0;
+#X connect 8 0 50 0;
+#X connect 9 0 38 1;
+#X connect 10 0 11 0;
+#X connect 10 0 11 1;
+#X connect 11 0 9 1;
+#X connect 12 0 13 0;
+#X connect 12 0 30 0;
+#X connect 13 0 27 0;
+#X connect 14 0 20 1;
+#X connect 14 0 12 0;
+#X connect 14 1 19 1;
+#X connect 14 2 25 1;
+#X connect 14 3 18 1;
+#X connect 14 4 17 1;
+#X connect 14 5 16 1;
+#X connect 14 6 15 1;
+#X connect 15 0 35 0;
+#X connect 16 0 26 1;
+#X connect 17 0 29 0;
+#X connect 18 0 26 4;
+#X connect 19 0 26 0;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 24 0 26 3;
+#X connect 25 0 15 0;
+#X connect 26 0 31 0;
+#X connect 26 0 32 0;
+#X connect 26 0 33 0;
+#X connect 26 0 34 0;
+#X connect 27 0 19 0;
+#X connect 27 1 20 0;
+#X connect 27 2 16 0;
+#X connect 27 2 17 0;
+#X connect 27 2 18 0;
+#X connect 27 2 25 0;
+#X connect 28 0 26 2;
+#X connect 28 0 24 1;
+#X connect 29 0 28 0;
+#X connect 30 0 49 0;
+#X connect 31 0 49 0;
+#X connect 32 0 6 0;
+#X connect 33 0 48 0;
+#X connect 34 0 2 0;
+#X connect 35 0 6 0;
+#X connect 36 0 14 0;
+#X connect 37 0 38 0;
+#X connect 38 0 1 0;
+#X connect 48 0 4 0;
+#X connect 49 0 0 1;
+#X connect 50 0 10 0;
+#X connect 50 0 10 1;
diff --git a/desiredata/doc/3.audio.examples/sampvoice2.pd b/desiredata/doc/3.audio.examples/sampvoice2.pd
new file mode 100644
index 00000000..4350ea48
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/sampvoice2.pd
@@ -0,0 +1,122 @@
+#N canvas 231 67 770 791 12;
+#X obj 284 616 *~;
+#X obj 183 744 outlet~;
+#X obj 110 536 makefilename sample%d;
+#X msg 110 559 set \$1;
+#X obj 110 582 tabread4~ sample1;
+#X obj 367 559 dbtorms;
+#X obj 367 536 unpack;
+#X obj 367 582 sqrt;
+#X obj 367 605 sqrt;
+#X obj 367 628 line~;
+#X obj 344 699 *~;
+#X obj 367 651 *~;
+#X obj 367 674 *~;
+#X msg 122 184 bang;
+#X obj 130 207 delay 5;
+#X obj 437 275 f;
+#X obj 399 276 f;
+#X obj 322 276 f;
+#X obj 283 276 f;
+#X obj 252 276 f;
+#X obj 159 263 f;
+#X obj 159 286 mtof;
+#X obj 159 309 / 261.62;
+#X obj 159 332 * 4.41e+08;
+#X obj 159 363 +;
+#X obj 253 443 pack 0 0 0 0 0;
+#X obj 130 230 t b b b;
+#X obj 322 322 + 1;
+#X obj 322 299 * 44.1;
+#X msg 85 478 0 5;
+#X msg 295 477 1 5;
+#X msg 331 477 0 \, \$1 \$2;
+#X msg 134 478 \$3 \, \$4 1e+07;
+#X msg 259 477 \$5;
+#X msg 411 477 0 \$1;
+#X obj 230 119 inlet;
+#X obj 183 693 inlet~;
+#X obj 183 719 +~;
+#X text 498 181 pitch in halftones;
+#X text 499 158 amplitude (dB);
+#X text 499 206 sample number;
+#X text 499 230 start location (msec);
+#X text 499 254 rise time (msec);
+#X text 499 278 decay time (msec);
+#X text 498 133 ARGUMENTS FOR NOTE ON:;
+#X text 460 317 (Zero amplitude means note off \;;
+#X text 481 338 other parameters are ignored.);
+#X obj 230 144 route 0;
+#X obj 288 175 unpack 0 0 0 0 0 0;
+#X text 35 5 This is an abstraction used by the polyphonic sampler
+\, version 2 \, which takes separate note-on and note-off messages.
+Unlike "sampvoice" (the first version) \, there is no "duration" field
+\, and the amplitude and pitch fields are reversed to make it easy
+to separate note-on from note-off messages (which have amplitude zero.)
+;
+#X text 299 153 note-on;
+#X text 155 153 note-off;
+#X obj 50 536 vline~;
+#X obj 307 536 vline~;
+#X msg 230 166 bang;
+#X connect 0 0 10 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 6 1 9 1;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 9 0 11 1;
+#X connect 10 0 37 1;
+#X connect 11 0 12 0;
+#X connect 11 0 12 1;
+#X connect 12 0 10 1;
+#X connect 13 0 14 0;
+#X connect 13 0 29 0;
+#X connect 14 0 26 0;
+#X connect 15 0 34 0;
+#X connect 16 0 25 1;
+#X connect 17 0 28 0;
+#X connect 18 0 25 4;
+#X connect 19 0 25 0;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 3;
+#X connect 25 0 30 0;
+#X connect 25 0 31 0;
+#X connect 25 0 32 0;
+#X connect 25 0 33 0;
+#X connect 26 0 19 0;
+#X connect 26 1 20 0;
+#X connect 26 2 16 0;
+#X connect 26 2 17 0;
+#X connect 26 2 18 0;
+#X connect 27 0 25 2;
+#X connect 27 0 24 1;
+#X connect 28 0 27 0;
+#X connect 29 0 53 0;
+#X connect 30 0 53 0;
+#X connect 31 0 6 0;
+#X connect 32 0 52 0;
+#X connect 33 0 2 0;
+#X connect 34 0 6 0;
+#X connect 35 0 47 0;
+#X connect 36 0 37 0;
+#X connect 37 0 1 0;
+#X connect 47 0 54 0;
+#X connect 47 1 48 0;
+#X connect 48 0 13 0;
+#X connect 48 0 19 1;
+#X connect 48 1 20 1;
+#X connect 48 2 18 1;
+#X connect 48 3 17 1;
+#X connect 48 4 16 1;
+#X connect 48 5 15 1;
+#X connect 52 0 4 0;
+#X connect 53 0 0 1;
+#X connect 54 0 15 0;
diff --git a/desiredata/doc/3.audio.examples/shepvoice.pd b/desiredata/doc/3.audio.examples/shepvoice.pd
new file mode 100644
index 00000000..9e05c48b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/shepvoice.pd
@@ -0,0 +1,47 @@
+#N canvas 471 146 638 403 12;
+#X obj 156 262 pack 0 50;
+#X obj 98 216 pack 0 50;
+#X obj 29 298 inlet~;
+#X obj 98 242 line~;
+#X obj 156 288 line~;
+#X obj 99 306 *~;
+#X obj 29 324 +~;
+#X obj 29 350 outlet~;
+#X obj 285 165 r pitch+;
+#X obj 185 139 r interval+;
+#X obj 98 164 expr $f1 * $f2 + $f3;
+#X obj 481 137 r dropoff+;
+#X obj 297 63 expr ($i1% 10000) * 0.0002 - 1;
+#X obj 297 11 r phase;
+#X obj 297 37 + \$1;
+#X obj 376 165 expr exp(-$f1*$f1*$f2);
+#X obj 98 190 mtof;
+#X obj 98 268 osc~;
+#X text 64 8 our local phase =;
+#X text 61 26 overall phase + our;
+#X text 60 45 relative phase;
+#X text 57 64 (modulo 10000);
+#X text 59 81 normalized from -1 to 1;
+#X text 349 36 \$1: relative phase;
+#X text 9 110 pitch is center pitch;
+#X text 16 125 + interval*phase;
+#X text 373 194 amplitude is Gaussian \, with;
+#X text 321 215 peak width controlled by "dropoff";
+#X connect 0 0 4 0;
+#X connect 1 0 3 0;
+#X connect 2 0 6 0;
+#X connect 3 0 17 0;
+#X connect 4 0 5 1;
+#X connect 5 0 6 1;
+#X connect 6 0 7 0;
+#X connect 8 0 10 2;
+#X connect 9 0 10 1;
+#X connect 10 0 16 0;
+#X connect 11 0 15 1;
+#X connect 12 0 10 0;
+#X connect 12 0 15 0;
+#X connect 13 0 14 0;
+#X connect 14 0 12 0;
+#X connect 15 0 0 0;
+#X connect 16 0 1 0;
+#X connect 17 0 5 0;
diff --git a/desiredata/doc/3.audio.examples/sinevoice.pd b/desiredata/doc/3.audio.examples/sinevoice.pd
new file mode 100644
index 00000000..d8d1848b
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/sinevoice.pd
@@ -0,0 +1,67 @@
+#N canvas 621 65 547 441 12;
+#X obj 120 299 line~;
+#X obj 120 323 *~;
+#X obj 120 346 *~;
+#X obj 125 232 sqrt;
+#X obj 96 39 inlet;
+#X obj 125 253 sqrt;
+#X obj 51 360 inlet~;
+#X obj 51 413 outlet~;
+#X obj 120 370 *~;
+#X obj 206 351 osc~;
+#X obj 51 388 +~;
+#X obj 261 210 pack;
+#X text 142 40 inlet: volume \, pitch \, duration;
+#X obj 96 88 unpack 0 0 0;
+#X text 12 2 arguments: \$1 = relative amplitude \, \$2 = pitch multiplier
+\, \$3 = detune \, \$4 = time multiplier;
+#X obj 157 117 dbtorms;
+#X obj 157 139 * \$1;
+#X obj 125 211 f;
+#X obj 206 216 f;
+#X obj 228 117 mtof;
+#X obj 228 142 * \$2;
+#X obj 228 164 + \$3;
+#X obj 273 118 * \$4;
+#X msg 8 148 0 5;
+#X msg 99 118 bang;
+#X obj 42 148 del 5;
+#X obj 106 65 outlet;
+#X msg 99 161 0;
+#X obj 125 272 pack 0 5;
+#X obj 99 139 del 10;
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 2 0 8 0;
+#X connect 3 0 5 0;
+#X connect 4 0 13 0;
+#X connect 4 0 26 0;
+#X connect 5 0 28 0;
+#X connect 6 0 10 0;
+#X connect 8 0 10 1;
+#X connect 9 0 8 1;
+#X connect 10 0 7 0;
+#X connect 11 0 0 0;
+#X connect 13 0 15 0;
+#X connect 13 0 23 0;
+#X connect 13 0 24 0;
+#X connect 13 1 19 0;
+#X connect 13 2 22 0;
+#X connect 15 0 16 0;
+#X connect 16 0 17 1;
+#X connect 17 0 3 0;
+#X connect 18 0 9 0;
+#X connect 19 0 20 0;
+#X connect 20 0 21 0;
+#X connect 21 0 18 1;
+#X connect 22 0 11 1;
+#X connect 23 0 0 0;
+#X connect 24 0 25 0;
+#X connect 24 0 29 0;
+#X connect 25 0 17 0;
+#X connect 25 0 18 0;
+#X connect 27 0 11 0;
+#X connect 28 0 0 0;
+#X connect 29 0 27 0;
diff --git a/desiredata/doc/3.audio.examples/spectrum-partial.pd b/desiredata/doc/3.audio.examples/spectrum-partial.pd
new file mode 100644
index 00000000..3c242504
--- /dev/null
+++ b/desiredata/doc/3.audio.examples/spectrum-partial.pd
@@ -0,0 +1,57 @@
+#N canvas 211 116 826 530 12;
+#X obj 28 412 osc~;
+#X obj 94 197 r poll-table;
+#X obj 129 337 + 50;
+#X obj 129 363 dbtorms;
+#X msg 78 339 0;
+#X obj 78 392 pack 0 30;
+#X obj 78 422 line~;
+#X obj 28 471 throw~ sum-bus;
+#X obj 28 442 *~;
+#X obj 28 87 r pitch;
+#X obj 28 114 mtof;
+#X obj 78 230 f;
+#X obj 28 142 * \$1;
+#X obj 37 168 ftom;
+#X obj 79 256 -;
+#X obj 121 255 r whammybar;
+#X text 28 9 This abstraction is used by the spectrum drawing example
+\, number 16...;
+#X text 61 46 \$1 is the partial number.;
+#X text 79 114 pitch to frequency;
+#X text 78 141 then get the frequency of this specific partial;
+#X text 81 167 ... and then convert back to pitch.;
+#X text 115 230 ... at which time we get the pitch back...;
+#X text 233 249 ... and transpose \, effectively shifting the spectral
+envelope left and right.;
+#X text 203 341 The vertical scale is dB from 1 to 50 \, but we want
+true zero when the table value is 0 or less.;
+#X text 172 398 Amplitude control via pack \, line~ \, and *~.;
+#X text 171 444 Finally \, add to a summing bus via throw~. All the
+throw~s in the instantiations of this abstraction will add into the
+one "catch~ sum-bus" at the output.;
+#X text 216 195 the calling patch bangs "poll-table" every 30 msec.
+;
+#X obj 78 284 tabread4 spectrum-tab;
+#X text 285 288 Finally get the strength from the table. Note that
+we use the control object \, tabread4 \, not tabread4~.;
+#X obj 78 311 moses 1;
+#X connect 0 0 8 0;
+#X connect 1 0 11 0;
+#X connect 2 0 3 0;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 8 1;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 10 0 12 0;
+#X connect 11 0 14 0;
+#X connect 12 0 13 0;
+#X connect 12 0 0 0;
+#X connect 13 0 11 1;
+#X connect 14 0 27 0;
+#X connect 15 0 14 1;
+#X connect 27 0 29 0;
+#X connect 29 0 4 0;
+#X connect 29 1 2 0;