aboutsummaryrefslogtreecommitdiff
path: root/pd
diff options
context:
space:
mode:
authorMiller Puckette <millerpuckette@users.sourceforge.net>2005-12-31 00:59:49 +0000
committerMiller Puckette <millerpuckette@users.sourceforge.net>2005-12-31 00:59:49 +0000
commit65a1b98552d7c6a93aedfb7c9b5d83f9038227cb (patch)
tree07c884364ea5ba2955497dc88bc68cc283bdfb44 /pd
parent2fb9e2d8c8dbea29f27c3d47c3d65d18bc54765c (diff)
Added about 64 files that I hadn't realized weren't in the CVS
repository. Threw in pd/portaudio/pa_win_wdmks for good measure, although I haven't tried compiling that in yet (no windoze machine handy today). svn path=/trunk/; revision=4316
Diffstat (limited to 'pd')
-rw-r--r--pd/doc/1.manual/fig11.3.pngbin0 -> 5014 bytes
-rw-r--r--pd/doc/1.manual/fig11.4.pngbin0 -> 4573 bytes
-rw-r--r--pd/doc/3.audio.examples/D13.additive.qlist.pd47
-rw-r--r--pd/doc/3.audio.examples/D14.vibrato.pd104
-rw-r--r--pd/doc/3.audio.examples/H01.low-pass.pd185
-rw-r--r--pd/doc/3.audio.examples/H02.high-pass.pd173
-rw-r--r--pd/doc/3.audio.examples/H03.band-pass.pd57
-rw-r--r--pd/doc/3.audio.examples/H04.filter.sweep.pd58
-rw-r--r--pd/doc/3.audio.examples/H05.filter.floyd.pd132
-rw-r--r--pd/doc/3.audio.examples/H06.envelope.follower.pd86
-rw-r--r--pd/doc/3.audio.examples/H07.measure.spectrum.pd88
-rw-r--r--pd/doc/3.audio.examples/H08.heterodyning.pd85
-rw-r--r--pd/doc/3.audio.examples/H09.ssb.modulation.pd103
-rw-r--r--pd/doc/3.audio.examples/H10.measurement.pd90
-rw-r--r--pd/doc/3.audio.examples/H11.shelving.pd74
-rw-r--r--pd/doc/3.audio.examples/H12.peaking.pd112
-rw-r--r--pd/doc/3.audio.examples/H13.butterworth.pd74
-rw-r--r--pd/doc/3.audio.examples/H14.all.pass.pd85
-rw-r--r--pd/doc/3.audio.examples/H15.phaser.pd109
-rw-r--r--pd/doc/3.audio.examples/H16.adsr.filter.qlist.pd167
-rw-r--r--pd/doc/3.audio.examples/I01.Fourier.analysis.pd90
-rw-r--r--pd/doc/3.audio.examples/I02.Hann.window.pd181
-rw-r--r--pd/doc/3.audio.examples/I03.resynthesis.pd132
-rw-r--r--pd/doc/3.audio.examples/I04.noisegate.pd330
-rw-r--r--pd/doc/3.audio.examples/I05.compressor.pd237
-rw-r--r--pd/doc/3.audio.examples/I06.timbre.stamp.pd370
-rw-r--r--pd/doc/3.audio.examples/I07.phase.vocoder.pd548
-rw-r--r--pd/doc/3.audio.examples/I08.pvoc.reverb.pd421
-rw-r--r--pd/doc/3.audio.examples/I09.sheep.from.goats.pd411
-rw-r--r--pd/doc/3.audio.examples/I10.phase.bash.pd569
-rw-r--r--pd/doc/3.audio.examples/J01.even.odd.pd66
-rw-r--r--pd/doc/3.audio.examples/J02.trapezoids.pd84
-rw-r--r--pd/doc/3.audio.examples/J03.pulse.width.mod.pd48
-rw-r--r--pd/doc/3.audio.examples/J04.corners.pd112
-rw-r--r--pd/doc/3.audio.examples/J05.triangle.pd56
-rw-r--r--pd/doc/3.audio.examples/J06.enveloping.pd97
-rw-r--r--pd/doc/3.audio.examples/J07.oversampling.pd61
-rw-r--r--pd/doc/3.audio.examples/J08.classicsynth.pd135
-rw-r--r--pd/doc/3.audio.examples/J09.bandlimited.pd216
-rw-r--r--pd/doc/3.audio.examples/buttercoef3.pd80
-rw-r--r--pd/doc/3.audio.examples/butterworth3~.pd104
-rw-r--r--pd/doc/3.audio.examples/filter-graph1.pd84
-rw-r--r--pd/doc/3.audio.examples/filter-graph2.pd121
-rw-r--r--pd/extra/bonk~/bonk~-help.pd172
-rw-r--r--pd/extra/choice/choice-help.pd58
-rw-r--r--pd/extra/complex-mod~-help.pd26
-rw-r--r--pd/extra/expr-help.pd497
-rw-r--r--pd/extra/fiddle~/fiddle~-help.pd142
-rw-r--r--pd/extra/hilbert~-help.pd18
-rw-r--r--pd/extra/loop~/loop~-help.pd74
-rw-r--r--pd/extra/lrshift~/rlshift~-help.pd29
-rw-r--r--pd/extra/pique/pique-help.pd33
-rw-r--r--pd/extra/rev1~-help.pd119
-rw-r--r--pd/extra/rev2~-help.pd134
-rw-r--r--pd/extra/rev3~-help.pd136
-rw-r--r--pd/portaudio/pa_common/pa_types.h65
-rw-r--r--pd/portaudio/pa_dll_switch/PaDllEntry.h184
-rw-r--r--pd/portaudio/pa_dll_switch/letter_from_tim_010817.txtbin0 -> 1176 bytes
-rw-r--r--pd/portaudio/pa_dll_switch/loadPA_DLL.cpp203
-rw-r--r--pd/portaudio/pa_dll_switch/pa_lib.c827
-rw-r--r--pd/portaudio/pa_dll_switch/portaudio.h439
-rw-r--r--pd/src/config.h.in5
62 files changed, 9543 insertions, 0 deletions
diff --git a/pd/doc/1.manual/fig11.3.png b/pd/doc/1.manual/fig11.3.png
new file mode 100644
index 00000000..daf6e7b0
--- /dev/null
+++ b/pd/doc/1.manual/fig11.3.png
Binary files differ
diff --git a/pd/doc/1.manual/fig11.4.png b/pd/doc/1.manual/fig11.4.png
new file mode 100644
index 00000000..d8d99682
--- /dev/null
+++ b/pd/doc/1.manual/fig11.4.png
Binary files differ
diff --git a/pd/doc/3.audio.examples/D13.additive.qlist.pd b/pd/doc/3.audio.examples/D13.additive.qlist.pd
new file mode 100644
index 00000000..2c9b3cb7
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/D14.vibrato.pd b/pd/doc/3.audio.examples/D14.vibrato.pd
new file mode 100644
index 00000000..3f4d6ea2
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H01.low-pass.pd b/pd/doc/3.audio.examples/H01.low-pass.pd
new file mode 100644
index 00000000..81a713b8
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H02.high-pass.pd b/pd/doc/3.audio.examples/H02.high-pass.pd
new file mode 100644
index 00000000..3342c64e
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H03.band-pass.pd b/pd/doc/3.audio.examples/H03.band-pass.pd
new file mode 100644
index 00000000..976fee54
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H04.filter.sweep.pd b/pd/doc/3.audio.examples/H04.filter.sweep.pd
new file mode 100644
index 00000000..e4f3cf09
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H05.filter.floyd.pd b/pd/doc/3.audio.examples/H05.filter.floyd.pd
new file mode 100644
index 00000000..2187f05d
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H06.envelope.follower.pd b/pd/doc/3.audio.examples/H06.envelope.follower.pd
new file mode 100644
index 00000000..8f536fba
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H07.measure.spectrum.pd b/pd/doc/3.audio.examples/H07.measure.spectrum.pd
new file mode 100644
index 00000000..f290ca4a
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H08.heterodyning.pd b/pd/doc/3.audio.examples/H08.heterodyning.pd
new file mode 100644
index 00000000..5bdf28e3
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H09.ssb.modulation.pd b/pd/doc/3.audio.examples/H09.ssb.modulation.pd
new file mode 100644
index 00000000..c0fbf2df
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H10.measurement.pd b/pd/doc/3.audio.examples/H10.measurement.pd
new file mode 100644
index 00000000..d0a04774
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H11.shelving.pd b/pd/doc/3.audio.examples/H11.shelving.pd
new file mode 100644
index 00000000..8eee1178
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H12.peaking.pd b/pd/doc/3.audio.examples/H12.peaking.pd
new file mode 100644
index 00000000..e005e01a
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H13.butterworth.pd b/pd/doc/3.audio.examples/H13.butterworth.pd
new file mode 100644
index 00000000..4cdcb628
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H14.all.pass.pd b/pd/doc/3.audio.examples/H14.all.pass.pd
new file mode 100644
index 00000000..d493df7b
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H15.phaser.pd b/pd/doc/3.audio.examples/H15.phaser.pd
new file mode 100644
index 00000000..4de372c1
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/H16.adsr.filter.qlist.pd b/pd/doc/3.audio.examples/H16.adsr.filter.qlist.pd
new file mode 100644
index 00000000..f112d2b6
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I01.Fourier.analysis.pd b/pd/doc/3.audio.examples/I01.Fourier.analysis.pd
new file mode 100644
index 00000000..31bcce63
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I02.Hann.window.pd b/pd/doc/3.audio.examples/I02.Hann.window.pd
new file mode 100644
index 00000000..1cf8b46a
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I03.resynthesis.pd b/pd/doc/3.audio.examples/I03.resynthesis.pd
new file mode 100644
index 00000000..f709d29f
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I04.noisegate.pd b/pd/doc/3.audio.examples/I04.noisegate.pd
new file mode 100644
index 00000000..0a8bd12a
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I05.compressor.pd b/pd/doc/3.audio.examples/I05.compressor.pd
new file mode 100644
index 00000000..10fe3375
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I06.timbre.stamp.pd b/pd/doc/3.audio.examples/I06.timbre.stamp.pd
new file mode 100644
index 00000000..0fd540cd
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I07.phase.vocoder.pd b/pd/doc/3.audio.examples/I07.phase.vocoder.pd
new file mode 100644
index 00000000..735b8cd2
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I08.pvoc.reverb.pd b/pd/doc/3.audio.examples/I08.pvoc.reverb.pd
new file mode 100644
index 00000000..6898c216
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I09.sheep.from.goats.pd b/pd/doc/3.audio.examples/I09.sheep.from.goats.pd
new file mode 100644
index 00000000..87a779ed
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/I10.phase.bash.pd b/pd/doc/3.audio.examples/I10.phase.bash.pd
new file mode 100644
index 00000000..4c66f9b7
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J01.even.odd.pd b/pd/doc/3.audio.examples/J01.even.odd.pd
new file mode 100644
index 00000000..71c9fdf5
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J02.trapezoids.pd b/pd/doc/3.audio.examples/J02.trapezoids.pd
new file mode 100644
index 00000000..1e7e5d27
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J03.pulse.width.mod.pd b/pd/doc/3.audio.examples/J03.pulse.width.mod.pd
new file mode 100644
index 00000000..06301686
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J04.corners.pd b/pd/doc/3.audio.examples/J04.corners.pd
new file mode 100644
index 00000000..72671d3d
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J05.triangle.pd b/pd/doc/3.audio.examples/J05.triangle.pd
new file mode 100644
index 00000000..fda0ef05
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J06.enveloping.pd b/pd/doc/3.audio.examples/J06.enveloping.pd
new file mode 100644
index 00000000..52bae857
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J07.oversampling.pd b/pd/doc/3.audio.examples/J07.oversampling.pd
new file mode 100644
index 00000000..0b124c03
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J08.classicsynth.pd b/pd/doc/3.audio.examples/J08.classicsynth.pd
new file mode 100644
index 00000000..ae9ce754
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/J09.bandlimited.pd b/pd/doc/3.audio.examples/J09.bandlimited.pd
new file mode 100644
index 00000000..38247473
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/buttercoef3.pd b/pd/doc/3.audio.examples/buttercoef3.pd
new file mode 100644
index 00000000..6d15d6af
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/butterworth3~.pd b/pd/doc/3.audio.examples/butterworth3~.pd
new file mode 100644
index 00000000..9b6511c6
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/filter-graph1.pd b/pd/doc/3.audio.examples/filter-graph1.pd
new file mode 100644
index 00000000..747c283e
--- /dev/null
+++ b/pd/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/pd/doc/3.audio.examples/filter-graph2.pd b/pd/doc/3.audio.examples/filter-graph2.pd
new file mode 100644
index 00000000..a800957d
--- /dev/null
+++ b/pd/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/pd/extra/bonk~/bonk~-help.pd b/pd/extra/bonk~/bonk~-help.pd
new file mode 100644
index 00000000..45b4e403
--- /dev/null
+++ b/pd/extra/bonk~/bonk~-help.pd
@@ -0,0 +1,172 @@
+#N canvas 133 65 958 626 10;
+#X obj 320 579 print;
+#X floatatom 314 501 0 0 0 0 - - -;
+#X obj 320 549 spigot;
+#X msg 314 471 0;
+#X msg 351 471 1;
+#X msg 442 427 bang;
+#X obj 429 518 bonk~;
+#X msg 442 244 learn 1;
+#X msg 442 304 learn 0;
+#X msg 437 486 print;
+#X obj 390 467 adc~;
+#X text 320 597 cooked;
+#X msg 565 76 \; pd dsp 1;
+#X obj 257 579 print;
+#X floatatom 251 501 0 0 0 0 - - -;
+#X obj 257 549 spigot;
+#X msg 251 471 0;
+#X msg 282 471 1;
+#X text 257 597 raw;
+#N canvas 366 126 600 400 synth 0;
+#X obj 112 24 r bonk-cooked;
+#X obj 112 49 unpack;
+#X obj 112 99 * 12;
+#X obj 112 124 div 7;
+#X obj 112 74 + 1;
+#X obj 112 174 mtof;
+#X obj 112 224 osc~;
+#X obj 112 249 cos~;
+#X obj 112 149 + 47;
+#X obj 209 247 line~;
+#X obj 209 272 *~;
+#X obj 209 297 lop~ 500;
+#X obj 112 274 *~;
+#X obj 103 361 dac~;
+#X obj 253 165 dbtorms;
+#X obj 253 115 * 0.5;
+#X obj 253 140 + 50;
+#X obj 211 189 f;
+#X msg 173 159 bang;
+#X obj 258 83 inlet;
+#X obj 111 307 hip~ 5;
+#X msg 34 24 0 60;
+#X obj 112 199 sig~;
+#X msg 209 222 \$1 \, 0 200;
+#X connect 0 0 1 0;
+#X connect 1 0 4 0;
+#X connect 2 0 3 0;
+#X connect 3 0 8 0;
+#X connect 4 0 2 0;
+#X connect 5 0 18 0;
+#X connect 5 0 22 0;
+#X connect 6 0 7 0;
+#X connect 7 0 12 0;
+#X connect 8 0 5 0;
+#X connect 9 0 10 0;
+#X connect 9 0 10 1;
+#X connect 10 0 11 0;
+#X connect 11 0 12 1;
+#X connect 12 0 20 0;
+#X connect 14 0 17 1;
+#X connect 15 0 16 0;
+#X connect 16 0 14 0;
+#X connect 17 0 23 0;
+#X connect 18 0 17 0;
+#X connect 19 0 15 0;
+#X connect 20 0 13 1;
+#X connect 20 0 13 0;
+#X connect 21 0 1 0;
+#X connect 22 0 6 0;
+#X connect 23 0 9 0;
+#X restore 804 86 pd synth;
+#X obj 454 549 s bonk-cooked;
+#X floatatom 804 63 0 0 0 0 - - -;
+#X msg 804 33 0;
+#X msg 442 274 learn 10;
+#X msg 442 334 forget;
+#X msg 442 364 write templates.txt;
+#X msg 442 394 read templates.txt;
+#X msg 835 33 90;
+#X msg 442 120 thresh 6 50;
+#X text 8 70 The Bonk object takes an audio signal input and looks
+for "attacks" defined as sharp changes in the spectral envelope of
+the incoming sound. Optionally \, and less reliably \, you can have
+Bonk check the attack against a collection of stored templates to try
+to guess which of two or more instruments was hit. Bonk is described
+theoretically in the 1998 ICMC proceedings \, reprinted on http://man104nfs.ucsd.edu/~mpuckett.
+;
+#X text 470 70 click here;
+#X text 471 83 to start DSP;
+#X text 8 191 Bonk's two outputs are the raw spectrum of the attack
+(provided as a list of 11 numbers giving the signal "loudness" in the
+11 frequency bands used) \, and the "cooked" output which gives only
+an instrument number (counting up from zero) and a "velocity". The
+instrumnent number is significant only if Bonk has a "template set"
+in memory.;
+#X text 8 368 In this patch \, after starting DSP \, you can print
+out the raw or cooked output using the two "spigots" or listen to a
+synthesizer output by raising its volume.;
+#X text 259 448 enable printout;
+#X text 705 32 output volume;
+#X text 719 50 (0-100);
+#X text 533 118 Set low and high thresholds. Signal growth must exceed
+the high one and then fall to the low one to make an attack.;
+#X text 533 151 Minimum velocity to output (quieter notes are ignored.)
+;
+#X msg 442 180 mask 4 0.7;
+#X msg 442 214 debounce 0;
+#X text 8 299 Bonk's analysis is carried out on a 256-point window
+(6 msec at 44.1 kHz) and by default the analysis period is 128 samples.
+The analysis period can be specified as Bonk's creation argument but
+must be a multiple of 64;
+#X text 532 219 Minimum time (msec) between attacks;
+#X text 532 170 Describes how energy in each frequency band masks later
+energy in the band. Here the masking is total for 4 analysis periods
+and then drops by 0.7 each period.;
+#X text 530 244 Forget all templates and start learning new ones. The
+argument gives the number of times you will hit each instrument (10
+recommended.) Turn on the output volume above for audible feedback
+as you train Bonk. "Learn 0" exits learn mode.;
+#X text 530 328 Forget the last template. In Learn mode \, use "forget"
+to erase and record over a template.;
+#X text 595 368 Write templates to a file in text-editable format.
+;
+#X text 596 398 Read templates from a file.;
+#X text 538 493 Print out all settings and templates.;
+#X msg 442 150 minvel 10;
+#X text 538 426 Poll the current spectrum via "raw" outlet \, You can
+set a very high threshold if you don't want attacks mixed in.;
+#X text 218 12 BONK - an attack detector for small percussion instruments
+;
+#X msg 634 517 print;
+#X msg 437 456 debug 0;
+#X text 538 466 turn debugging on or off.;
+#X obj 118 422 phasor~ 110;
+#X obj 106 510 dac~;
+#X obj 105 483 *~;
+#X floatatom 160 466 5 0 0 0 - - -;
+#X obj 157 488 dbtorms;
+#X connect 1 0 2 1;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 15 0;
+#X connect 6 1 2 0;
+#X connect 6 1 20 0;
+#X connect 7 0 6 0;
+#X connect 8 0 6 0;
+#X connect 9 0 6 0;
+#X connect 10 0 6 0;
+#X connect 14 0 15 1;
+#X connect 15 0 13 0;
+#X connect 16 0 14 0;
+#X connect 17 0 14 0;
+#X connect 21 0 19 0;
+#X connect 22 0 21 0;
+#X connect 23 0 6 0;
+#X connect 24 0 6 0;
+#X connect 25 0 6 0;
+#X connect 26 0 6 0;
+#X connect 27 0 21 0;
+#X connect 28 0 6 0;
+#X connect 39 0 6 0;
+#X connect 40 0 6 0;
+#X connect 49 0 6 0;
+#X connect 53 0 6 0;
+#X connect 55 0 57 0;
+#X connect 57 0 56 0;
+#X connect 57 0 56 1;
+#X connect 58 0 59 0;
+#X connect 59 0 57 1;
diff --git a/pd/extra/choice/choice-help.pd b/pd/extra/choice/choice-help.pd
new file mode 100644
index 00000000..0677db87
--- /dev/null
+++ b/pd/extra/choice/choice-help.pd
@@ -0,0 +1,58 @@
+#N canvas 16 5 609 600 12;
+#X obj 8 195 choice;
+#X msg 41 86 print;
+#X msg 29 63 clear;
+#X msg 8 34 add 1 0 0 \, add 0 1 0 \, add 0 0 1 \, add 1 1 1 \, add
+1 1 0;
+#X obj 77 171 pack 0 0 0;
+#X floatatom 182 125 0 0 0 0 - - -;
+#X floatatom 148 125 0 0 0 0 - - -;
+#X floatatom 115 125 0 0 0 0 - - -;
+#X obj 77 147 f;
+#X msg 77 125 bang;
+#X floatatom 8 216 0 0 0 0 - - -;
+#X obj 71 196 choice 1;
+#X floatatom 71 217 0 0 0 0 - - -;
+#X obj 76 4 choice;
+#X text 135 3 - search for a best match to an incoming list;
+#X text 19 243 The choice object holds a list of vectors \, each having
+up to ten elements. When sent a list of numbers \, it outputs the index
+of the known vector that matches most closely. The quality of the match
+is the dot product of the two vectors after normalizing them \, i.e.
+\, the vector whose direction is closest to that of the input wins.
+;
+#X text 19 340 If given a nonzero creation argument \, choice tries
+to avoid repetitious outputs by weighting less recently output vectors
+preferentially.;
+#X text 20 389 You can use this to choose interactively between a number
+of behaviors depending on their attributes. For example \, you might
+have stored a number of melodies \, of which some are syncopated \,
+some chromatic \, some are more than 100 years old \, some are bugle
+calls \, and some are Christmas carols. You could then ask to find
+a syncopated bugle call (1 \, 0 \, 0 \, 1 \, 0) and you'll get the
+thing most closely matching the request.;
+#X text 19 514 You can use numbers other than 0 and 1 to indicate relative
+strengths of the attributes \, or even use negative numbers to indicate
+opposites \, either in the incoming lists or in the stored ones.;
+#X text 320 572 updated for Pd version-0.30;
+#X text 79 62 delete all stored vectors;
+#X text 498 34 add vectors;
+#X text 94 84 debugging printout;
+#X text 69 104 tweak the numbers and hit "bang" to input a list;
+#X text 151 197 creation argument to avoid repeated outout;
+#X text 108 219 output is the index of best match \, counting from
+zero;
+#X connect 0 0 10 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 2 0 11 0;
+#X connect 3 0 0 0;
+#X connect 3 0 11 0;
+#X connect 4 0 0 0;
+#X connect 4 0 11 0;
+#X connect 5 0 4 2;
+#X connect 6 0 4 1;
+#X connect 7 0 8 1;
+#X connect 8 0 4 0;
+#X connect 9 0 8 0;
+#X connect 11 0 12 0;
diff --git a/pd/extra/complex-mod~-help.pd b/pd/extra/complex-mod~-help.pd
new file mode 100644
index 00000000..9e14904d
--- /dev/null
+++ b/pd/extra/complex-mod~-help.pd
@@ -0,0 +1,26 @@
+#N canvas 136 85 600 480 12;
+#X graph graph1 0 -1 882 1 279 209 579 39;
+#X array mod-output 882 float;
+#X pop;
+#X msg 84 256 bang \; pd dsp 1;
+#X floatatom 67 56;
+#X obj 67 186 complex-mod~;
+#X obj 67 84 phasor~ 440;
+#X obj 67 115 cos~;
+#X obj 106 138 cos~;
+#X obj 106 114 -~ 0.25;
+#X floatatom 145 152;
+#X text 93 351 The complex modulator takes two signals in which it considers to be the real and imaginary part of a complex-valued signal. It then does a complex multiplication by a sinusoud to shift all frequencies up or down by any frequency shift in Hz. See also hilbert~.;
+#X obj 69 298 tabwrite~ mod-output;
+#X text 149 204 right outlet;
+#X text 151 220 gives the other;
+#X text 149 236 sideband;
+#X connect 1 0 10 0;
+#X connect 2 0 4 0;
+#X connect 3 0 10 0;
+#X connect 4 0 5 0;
+#X connect 4 0 7 0;
+#X connect 5 0 3 0;
+#X connect 6 0 3 1;
+#X connect 7 0 6 0;
+#X connect 8 0 3 2;
diff --git a/pd/extra/expr-help.pd b/pd/extra/expr-help.pd
new file mode 100644
index 00000000..adc575fb
--- /dev/null
+++ b/pd/extra/expr-help.pd
@@ -0,0 +1,497 @@
+#N canvas 70 36 1012 579 10;
+#X text 66 10 expression evaluation family - expr \, expr~ \, fexpr~
+;
+#X text 63 239 Syntyax:;
+#X text 64 311 $f#: float input variable;
+#X text 65 326 $s#: symbol input variable;
+#X text 553 90 Used for expr~ only:;
+#X text 553 105 $v#: signal (vector) input (vector by vector evaluation)
+;
+#X text 550 164 Used for fexpr~ only:;
+#X text 550 220 $y[n]: the output value indexed by n where n has to
+satisfy 0 > n >= -vector size.;
+#X text 550 248 (the vector size can be changed by the "block~" object.)
+;
+#X text 550 179 $x#[n]: the sample from inlet # indexed by n where
+n has to satisfy 0 => n >= -vector size \, ($x# is a shorthand for
+$x#[0] \, specifying the current sample);
+#X text 63 151 expr~ is used for expression evaluaion of signal data
+on the vector by vector basis;
+#X text 63 136 expr is used for expression evaluaion of control data
+;
+#X text 67 39 For a more detailed documentaion refer to http://www.crca.ucsd.edu/~yadegari/expr.html
+;
+#X text 64 254 The syntax is very close to how expressions are written
+in C. Variables are specified as follows where the '#' stands for the
+inlet number:;
+#X text 65 297 $i#: integer input variable;
+#X text 63 179 fexpr~ is used for expression evaluaion on sample level
+data \; i.e. \, filter design. Warning: fexpr~ is very cpu intensive.
+;
+#X text 633 12 updated for Pd 0.35 test 26 and expr* 0.4;
+#X text 67 85 you can define multiple expressoins in the same object.
+semicolon is used to separates the expressions.;
+#X text 635 294 $y -> $y1[-1];
+#X text 550 263 Shorthands: $x -> $x1[0];
+#X text 635 279 $x1 -> $x1[0] $x2 -> $x2[0] .....;
+#X text 635 309 $y1 -> $y1[-1] $y2 -> $y2[-1] .....;
+#N canvas 0 0 828 385 Examples 0;
+#X obj 33 151 expr 1;
+#X floatatom 197 119 0 0 0;
+#X floatatom 33 181 0 0 0;
+#X msg 33 123 bang;
+#X obj 101 149 expr 2 + 3;
+#X msg 101 122 bang;
+#X floatatom 101 177 0 0 0;
+#X floatatom 196 177 0 0 0;
+#X obj 196 149 expr 2+$f1;
+#X floatatom 34 220 0 0 0;
+#X floatatom 34 277 0 0 0;
+#X obj 34 249 expr $f1 * $f2;
+#X floatatom 113 220 0 0 0;
+#N canvas 0 0 450 300 graph1 0;
+#X array array1 10 float 0;
+#X coords 0 10 10 0 200 150 1;
+#X restore 584 180 graph;
+#X floatatom 35 315 0 0 0;
+#X floatatom 35 371 0 0 0;
+#X floatatom 194 219 0 0 0;
+#X floatatom 194 276 0 0 0;
+#X obj 194 248 expr $s2[$f1];
+#X msg 267 220 symbol array1;
+#X obj 35 343 expr sin(2 * 3.14159 * $f1 / 360);
+#X msg 330 281 \; array1 1 4 2 8 5 6 1 4 2 8 5 6;
+#X floatatom 310 184 5 0 0;
+#X floatatom 395 186 5 0 0;
+#X floatatom 480 184 5 0 0;
+#X floatatom 310 105 5 0 0;
+#X obj 310 132 expr $f1 \; if ($f1 > 0 \, $f1 * 2 \, 0) \; if ($f1
+<= 0 \, $f1 / 2 \, 0);
+#X text 34 56 Examples of expr object;
+#X text 304 88 an example of multiple expressions and the use of 'if'
+;
+#X connect 0 0 2 0;
+#X connect 1 0 8 0;
+#X connect 3 0 0 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 8 0 7 0;
+#X connect 9 0 11 0;
+#X connect 11 0 10 0;
+#X connect 12 0 11 1;
+#X connect 14 0 20 0;
+#X connect 16 0 18 0;
+#X connect 18 0 17 0;
+#X connect 19 0 18 1;
+#X connect 20 0 15 0;
+#X connect 25 0 26 0;
+#X connect 26 0 22 0;
+#X connect 26 1 23 0;
+#X connect 26 2 24 0;
+#X restore 307 398 pd Examples of expr;
+#N canvas 23 24 882 676 Examples 0;
+#X text -88 101 expr~ examples:;
+#X obj -24 355 print~;
+#X msg 13 334 bang;
+#X obj -24 276 sig~ 440;
+#X floatatom 49 293 0 0 0;
+#X floatatom -24 253 0 0 0;
+#X obj -24 316 expr~ $v1*$f2;
+#X obj 85 356 print~;
+#X msg 101 335 bang;
+#X floatatom 85 268 0 0 0;
+#X floatatom 158 270 0 0 0;
+#X floatatom 357 291 0 0 0;
+#X floatatom 244 267 0 0 0;
+#X obj 244 294 osc~;
+#X msg 369 47 \; pd dsp 0;
+#X msg 291 49 \; pd dsp 1;
+#X text 294 26 audio on;
+#X text 377 25 audio off;
+#X text -45 236 vector times scalar;
+#X text 87 236 vector;
+#X obj 243 354 dac~;
+#X text 241 245 frequency;
+#X text 373 273 amplitude;
+#X obj 85 315 expr~ $v1*$v2;
+#X floatatom 207 471 5 0 0;
+#X obj -40 520 tabsend~ a1;
+#N canvas 0 0 450 300 graph4 0;
+#X array a1 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore -39 542 graph;
+#X obj -40 497 expr~ max(min($v1 \, $f2/10) \, -$f2/10);
+#X text -38 123 NOTES: the first inlet of expr~ cannot be a $f1 or
+$i1 \, this may change in later releases;
+#X text -87 420 A simple limiter example;
+#X obj 356 158 vsl 15 128 0 127 0 0 empty empty empty 20 8 0 8 -262144
+-1 -1 0 1;
+#X obj 243 315 expr~ $v1*$f2/128;
+#X text -82 28 make sure you turn on audio for the expr~ examples;
+#X obj -40 473 osc~ 2756.25;
+#X text 122 436 Move the value below between 0 and 10;
+#X text 126 451 to change the limiter threshold;
+#X obj 417 522 tabsend~ a2;
+#X obj 580 518 tabsend~ a3;
+#X obj 417 439 osc~ 2756.25;
+#N canvas 0 0 450 300 graph1 0;
+#X array a2 64 float 1;
+#A 0 -0.419198 -0.487122 -0.481805 -0.400382 -0.252053 -0.0571681 0.155563
+0.353314 0.504227 0.582557 0.573016 0.473664 0.296682 0.0669659 -0.18137
+-0.410083 -0.582709 -0.670415 -0.656787 -0.540803 -0.337462 -0.0758923
+0.204826 0.461522 0.653623 0.74958 0.732042 0.600932 0.373867 0.0838359
+-0.225617 -0.506972 -0.716061 -0.819026 -0.797803 -0.653251 -0.405409
+-0.0906877 0.243486 0.545852 0.769218 0.877835 0.853191 0.697093 0.431698
+0.096368 -0.258195 -0.577642 -0.812367 -0.925245 -0.897515 -0.731894
+-0.452386 -0.100793 0.269551 0.601932 0.844984 0.960659 0.930205 0.757204
+0.467199 0.103913 -0.277405 -0.618414;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 347 554 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array a3 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 569 554 graph;
+#X obj 417 473 expr~ $v1 *$v2 \; if ($v2 > 0 \, 0 \, $v1*$v2);
+#X obj 580 439 osc~ 100;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 4 0 6 1;
+#X connect 5 0 3 0;
+#X connect 6 0 1 0;
+#X connect 8 0 7 0;
+#X connect 9 0 23 0;
+#X connect 10 0 23 1;
+#X connect 11 0 31 1;
+#X connect 12 0 13 0;
+#X connect 13 0 31 0;
+#X connect 23 0 7 0;
+#X connect 24 0 27 1;
+#X connect 27 0 25 0;
+#X connect 30 0 11 0;
+#X connect 31 0 20 0;
+#X connect 31 0 20 1;
+#X connect 33 0 27 0;
+#X connect 38 0 41 0;
+#X connect 41 0 36 0;
+#X connect 41 1 37 0;
+#X connect 42 0 41 1;
+#X restore 307 433 pd Examples of expr~;
+#X text 40 399 For expr examples click here ->;
+#X text 41 433 For expr~ examples click here ->;
+#X text 40 471 For fexpr~ examples click here ->;
+#N canvas 0 0 1059 688 examples 0;
+#X msg 519 84 \; pd dsp 0;
+#X msg 428 84 \; pd dsp 1;
+#X text 426 64 audio on;
+#X text 518 65 audio off;
+#X floatatom 126 304 0 0 0;
+#X floatatom 259 323 0 0 0;
+#X msg 226 283 -10;
+#X text 53 103 fexpr~ examples:;
+#X obj 125 571 print~;
+#X msg 247 552 bang;
+#X floatatom 125 475 0 0 0;
+#X obj 126 347 fexpr~ ($x1[$f2]+$x1)/2;
+#X obj 125 532 fexpr~ $x1+$y[-1];
+#X floatatom 635 366 0 0 0;
+#X floatatom 795 387 0 0 0;
+#X obj 630 456 dac~;
+#X obj 632 407 fexpr~ ($x1[$f2/1000]+$x1)/2;
+#X msg 864 317 0 10000;
+#X obj 795 368 line 0;
+#X msg 798 318 -10000;
+#X obj 120 389 dac~;
+#X text 96 227 Simple FIR filter;
+#X text 557 134 Simple FIR filter using fractional offset;
+#X msg 704 318 -10000 10000;
+#X obj 635 387 osc~ 2205;
+#X msg 644 343 1102.5;
+#X msg 862 342 0 10000;
+#X msg 796 343 -20000;
+#X msg 702 343 -20000 10000;
+#X msg 635 318 2205;
+#X msg 548 312 start;
+#X msg 550 334 stop;
+#X msg 57 284 start;
+#X msg 56 309 stop;
+#X msg 75 469 start;
+#X msg 74 494 stop;
+#X obj 491 335 loadbang;
+#X obj 18 495 loadbang;
+#X obj 1 309 loadbang;
+#X text 617 291 frequency;
+#X text 707 300 of the simple filter;
+#X msg 293 282 -20;
+#X obj 126 325 osc~ 2205;
+#X msg 156 281 1102.5;
+#X msg 110 281 2205;
+#X msg 260 282 0;
+#X text 123 445 simple accumulator defined as and an IIR filter;
+#X text 52 148 NOTE: fexpr~ could use lots of CPU power \, by default
+fexpr~ is on when it is loaded. In this page we are turning them off
+with loadbang \, so to hear them you have to turn them on explicitly.
+You can use the "start" and "stop" messages to start and stop fexpr~
+and expr~;
+#X text 706 288 index defining the frequency;
+#X text 95 240 -10 offset will fully filter audio frequency of 2205
+\, and -20 offset will filter audio at frequency of 1102.5;
+#X text 559 215 Thus \, the offset -10000 will filter audio at frequency
+of 2205 and the offset value -20000 will filter the audio at frequency
+of 1102.5.;
+#X text 558 161 When fractional offset is used \, fexpr~ determines
+indexed by linear interpolation. In the following example the offset
+value is divided by 1000 \, thus we can continuously change the offset
+without an audible click in the output.;
+#X text 288 318 If you change this value you;
+#X text 290 330 hear a click;
+#X text 51 87 make sure you turn on audio for the fexpr~ examples;
+#X text 55 -323 Used for fexpr~ only:;
+#X text 55 -267 $y[n]: the output value indexed by n where n has to
+satisfy 0 > n >= -vector size.;
+#X text 55 -239 (the vector size can be changed by the "block~" object.)
+;
+#X text 55 -308 $x#[n]: the sample from inlet # indexed by n where
+n has to satisfy 0 => n >= -vector size \, ($x# is a shorthand for
+$x#[0] \, specifying the current sample);
+#X text 140 -193 $y -> $y1[-1];
+#X text 55 -224 Shorthands: $x -> $x1[0];
+#X text 140 -208 $x1 -> $x1[0] $x2 -> $x2[0] .....;
+#X text 140 -178 $y1 -> $y1[-1] $y2 -> $y2[-1] .....;
+#X text 64 -125 fexpr~ responds to the following methods;
+#X text 66 -106 clear - clears all the previous input and output buffers
+;
+#X text 65 -92 clear x# - clears the previous values of the #th input
+;
+#X text 66 -79 clear y# - clears the previous values of the #th output
+;
+#X text 66 -33 set x# val-1 val-2 ... - sets the as many supplied values
+of the #th input;
+#X text 513 -22 e.g. \, set x2 3.4 0.4 sets x2[-1]=3.4 and x2[-2]=0.4
+;
+#X text 66 -2 set y# val-1 val-2 ... - sets the as many supplied values
+of the #th input;
+#X text 514 4 e.g. \, set y3 1.1 3.3 4.5 sets y3[-1]=1.1 y3[-2]=3.3
+and y3[-3]=4.5;
+#X text 64 -54 set val val ... - sets the first past values of each
+output;
+#X text 513 -59 e.g. \, set 0.1 2.2 0.4 sets y1[-1]=0.1 y2[-1]=2.2
+\, and y3[-1]=0.4;
+#X msg 244 475 set 4000;
+#X obj 125 504 sig~ 0.001;
+#X msg 245 498 clear;
+#X text 22 442 comment;
+#X text 14 431 1 first click the start button;
+#X text 307 494 2 click the set or the clear button;
+#X text 304 547 3 then click bang to see how set and clear work;
+#X connect 4 0 42 0;
+#X connect 5 0 11 1;
+#X connect 6 0 5 0;
+#X connect 9 0 8 0;
+#X connect 10 0 74 0;
+#X connect 11 0 20 0;
+#X connect 11 0 20 1;
+#X connect 12 0 8 0;
+#X connect 13 0 24 0;
+#X connect 14 0 16 1;
+#X connect 16 0 15 0;
+#X connect 16 0 15 1;
+#X connect 17 0 18 0;
+#X connect 18 0 14 0;
+#X connect 19 0 18 0;
+#X connect 23 0 18 0;
+#X connect 24 0 16 0;
+#X connect 25 0 13 0;
+#X connect 26 0 18 0;
+#X connect 27 0 18 0;
+#X connect 28 0 18 0;
+#X connect 29 0 13 0;
+#X connect 30 0 16 0;
+#X connect 31 0 16 0;
+#X connect 32 0 11 0;
+#X connect 33 0 11 0;
+#X connect 34 0 12 0;
+#X connect 35 0 12 0;
+#X connect 36 0 31 0;
+#X connect 37 0 35 0;
+#X connect 38 0 33 0;
+#X connect 41 0 5 0;
+#X connect 42 0 11 0;
+#X connect 43 0 4 0;
+#X connect 44 0 4 0;
+#X connect 45 0 5 0;
+#X connect 73 0 12 0;
+#X connect 74 0 12 0;
+#X connect 75 0 12 0;
+#X restore 306 472 pd examples of fexpr~;
+#X text 42 504 For using fexpr~ for solving;
+#X text 43 520 differential equations click here ->;
+#N canvas 112 22 944 449 lorenz 0;
+#X obj 176 67 v pr;
+#X obj 307 68 v r;
+#X obj 233 69 v b;
+#X floatatom 176 38 5 0 0;
+#X floatatom 307 40 5 0 0;
+#X msg 177 13 10;
+#X obj 231 10 expr 8./3;
+#X msg 128 136 set 1.2 2.3 4.4;
+#X floatatom 233 39 7 0 0;
+#X msg 75 46 stop;
+#X msg 75 67 start;
+#X floatatom 399 40 5 0 0;
+#X obj 399 69 v dt;
+#X msg 310 12 18;
+#X msg 395 13 0.01;
+#X obj 68 296 dac~;
+#X obj 128 -41 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X text 201 -41 <- turn audio on and bang here;
+#X text 463 42 <- experiment with these numbers;
+#X text 472 72 if you hear a buzz \, you have probably gone unstable
+bang on the top again;
+#X obj 489 15 line;
+#X obj 128 241 /~ 20;
+#X obj 234 238 /~ 20;
+#X obj 340 237 /~ 20;
+#X msg 484 -11 0.01 \, 0.04 5000;
+#X obj 128 185 fexpr~ $y1+(pr*$y2-pr*$y1)*dt \; $y2 +(-$y1*$y3 + r*$y1-$y2)*dt
+\; $y3+($y1*$y2 - b*$y3)*dt;
+#X obj 14 65 loadbang;
+#X text 113 -100 This is an example of how fexpr~ could be used for
+solving differential equations \, in this case the lorenz equations
+which generate chotic signals;
+#X text 361 182 Note the following shorthands:;
+#X text 360 198 $y1 -> $y1[-1] \, $y2 -> $y2[-1] \, .....;
+#X text 248 136 the 'set' commands sets the initial previous values
+;
+#X obj 128 298 tabsend~ lorenz1a;
+#X obj 234 278 tabsend~ lorenz2a;
+#X obj 339 259 tabsend~ lorenz3a;
+#N canvas 0 0 450 300 graph1 0;
+#X array lorenz1a 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 73 437 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array lorenz2a 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 331 435 graph;
+#N canvas 0 0 450 300 graph3 0;
+#X array lorenz3a 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 592 436 graph;
+#X text 301 315 You can see the graphs if you scroll down;
+#X text 301 328 but the redrawings may cause clicks in the audio;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 8 0;
+#X connect 7 0 25 0;
+#X connect 8 0 2 0;
+#X connect 9 0 25 0;
+#X connect 10 0 25 0;
+#X connect 11 0 12 0;
+#X connect 13 0 4 0;
+#X connect 14 0 11 0;
+#X connect 16 0 5 0;
+#X connect 16 0 6 0;
+#X connect 16 0 13 0;
+#X connect 16 0 14 0;
+#X connect 16 0 7 0;
+#X connect 16 0 10 0;
+#X connect 20 0 11 0;
+#X connect 21 0 31 0;
+#X connect 21 0 15 0;
+#X connect 21 0 15 1;
+#X connect 22 0 32 0;
+#X connect 23 0 33 0;
+#X connect 24 0 20 0;
+#X connect 25 0 21 0;
+#X connect 25 1 22 0;
+#X connect 25 2 23 0;
+#X connect 26 0 9 0;
+#X restore 308 518 pd lorenz equations for audition;
+#N canvas 97 36 978 656 lorenz 0;
+#X obj 176 67 v pr;
+#X obj 307 68 v r;
+#X obj 233 69 v b;
+#X floatatom 176 38 5 0 0;
+#X floatatom 307 40 5 0 0;
+#X msg 177 13 10;
+#X obj 231 10 expr 8./3;
+#N canvas 0 0 450 300 graph1 0;
+#X array lorenz1 2048 float 0;
+#X coords 0 -1 2047 1 200 140 1;
+#X restore 82 357 graph;
+#N canvas 0 0 450 300 graph2 0;
+#X array lorenz2 2048 float 0;
+#X coords 0 -1 2047 1 200 140 1;
+#X restore 327 353 graph;
+#N canvas 0 0 450 300 graph3 0;
+#X array lorenz3 2048 float 0;
+#X coords 0 -1 2047 1 200 140 1;
+#X restore 570 347 graph;
+#X msg 128 136 set 1.2 2.3 4.4;
+#X floatatom 233 39 7 0 0;
+#X msg 75 46 stop;
+#X msg 75 67 start;
+#X floatatom 399 40 5 0 0;
+#X obj 399 69 v dt;
+#X msg 310 12 18;
+#X msg 395 13 0.01;
+#X obj 128 -41 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X text 201 -41 <- turn audio on and bang here;
+#X text 463 42 <- experiment with these numbers;
+#X text 472 72 if you hear a buzz \, you have probably gone unstable
+bang on the top again;
+#X obj 489 15 line;
+#X obj 128 241 /~ 20;
+#X obj 234 238 /~ 20;
+#X obj 340 237 /~ 20;
+#X msg 484 -11 0.01 \, 0.04 5000;
+#X obj 14 65 loadbang;
+#X text 113 -100 This is an example of how fexpr~ could be used for
+solving differential equations \, in this case the lorenz equations
+which generate chotic signals;
+#X text 361 182 Note the following shorthands:;
+#X text 360 198 $y1 -> $y1[-1] \, $y2 -> $y2[-1] \, .....;
+#X text 248 136 the 'set' commands sets the initial previous values
+;
+#X obj 128 298 tabsend~ lorenz1;
+#X obj 234 278 tabsend~ lorenz2;
+#X obj 339 259 tabsend~ lorenz3;
+#X obj 627 280 block~ 2048;
+#X text 669 133 Lorenz Equations;
+#X obj 128 185 fexpr~ $y1+pr * ($y2-$y1)*dt \; $y2 +(-$y1*$y3 + r*$y1-$y2)*dt
+\; $y3+($y1*$y2 - b*$y3)*dt;
+#X text 672 197 dZ/dt = -bZ;
+#X text 669 167 dX/dt = pr * (X - Y);
+#X text 668 147 written with 3 state variable X \, Y \, and Z;
+#X text 670 182 dY/dt = -XZ + rX - y;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 11 0;
+#X connect 10 0 37 0;
+#X connect 11 0 2 0;
+#X connect 12 0 37 0;
+#X connect 13 0 37 0;
+#X connect 14 0 15 0;
+#X connect 16 0 4 0;
+#X connect 17 0 14 0;
+#X connect 18 0 5 0;
+#X connect 18 0 6 0;
+#X connect 18 0 16 0;
+#X connect 18 0 17 0;
+#X connect 18 0 10 0;
+#X connect 18 0 13 0;
+#X connect 22 0 14 0;
+#X connect 23 0 32 0;
+#X connect 24 0 33 0;
+#X connect 25 0 34 0;
+#X connect 26 0 22 0;
+#X connect 27 0 12 0;
+#X connect 37 0 23 0;
+#X connect 37 1 24 0;
+#X connect 37 2 25 0;
+#X restore 308 541 pd lorenz equations for visualization;
+#X text 68 24 by Shahrokh Yadegari;
diff --git a/pd/extra/fiddle~/fiddle~-help.pd b/pd/extra/fiddle~/fiddle~-help.pd
new file mode 100644
index 00000000..f396725a
--- /dev/null
+++ b/pd/extra/fiddle~/fiddle~-help.pd
@@ -0,0 +1,142 @@
+#N canvas 93 26 980 745 10;
+#X obj 262 522 phasor~;
+#X obj 531 616 unpack;
+#X floatatom 531 666 0 0 0 0 - - -;
+#X msg 437 449 print;
+#X obj 262 500 sig~;
+#X floatatom 262 478 0 0 0 0 - - -;
+#X obj 262 456 mtof;
+#X floatatom 262 434 0 0 0 0 - - -;
+#X floatatom 545 643 0 0 0 0 - - -;
+#X obj 531 576 route 1 2 3 4;
+#X obj 614 616 unpack;
+#X floatatom 614 666 0 0 0 0 - - -;
+#X floatatom 628 643 0 0 0 0 - - -;
+#X obj 698 616 unpack;
+#X floatatom 698 666 0 0 0 0 - - -;
+#X floatatom 712 643 0 0 0 0 - - -;
+#X obj 389 616 unpack;
+#X floatatom 389 666 0 0 0 0 - - -;
+#X floatatom 403 643 0 0 0 0 - - -;
+#X obj 334 545 *~;
+#X obj 322 394 loadbang;
+#X obj 353 522 sig~;
+#X floatatom 353 500 0 0 0 0 - - -;
+#X msg 322 478 1;
+#X msg 353 478 0;
+#X floatatom 466 666 0 0 0 0 - - -;
+#X obj 281 666 print attack;
+#X obj 190 666 print pitch;
+#X msg 555 45 \; pd dsp 1;
+#X text 460 39 click here;
+#X text 460 61 to start DSP;
+#X text 226 4 FIDDLE - pitch estimator and sinusoidal peak finder;
+#X text 8 70 The Fiddle object estimates the pitch and amplitude of
+an incoming sound \, both continuously and as a stream of discrete
+"note" events. Fiddle optionally outputs a list of detected sinusoidal
+peaks used to make the pitch determination. Fiddle is described theoretically
+in the 1998 ICMC proceedings \, reprinted on http://man104nfs.ucsd.edu/~mpuckett.
+;
+#X text 8 170 Fiddle's creation arguments specify an analysis window
+size \, the maximum polyphony (i.e. \, the number of simultaneous "pitches"
+to try to find) \, the number of peaks in the spectrum to consider
+\, and the number of peaks \, if any \, to output "raw." The outlets
+give discrete pitch (a number) \, detected attacks in the amplitude
+envelope (a bang) \, one or more voices of continuous pitch and amplitude
+\, overall amplitude \, and optionally a sequence of messages with
+the peaks.;
+#X text 8 296 The analysis hop size is half the window size so in the
+example shown here \, one analysis is done every 512 samples (11.6
+msec at 44K1) \, and the analysis uses the most recent 1024 samples
+(23.2 msec at 44K1). The minimum frequency that Fiddle will report
+is 2-1/2 cycles per analysis windows \, or about 108 Hz. (just below
+MIDI 45.);
+#X text 669 535 number of pitch outlets (1-3 \, default 1);
+#X text 669 557 number of peaks to find (1-100 \, default 20);
+#X text 669 579 number of peaks to output (default 0.);
+#X msg 441 107 amp-range 40 50;
+#X msg 439 227 reattack 100 10;
+#X msg 438 282 npartial 7;
+#X msg 438 170 vibrato 50 0.5;
+#X text 560 91 a low and high amplitude threshold: if signal amplitude
+is below the low threshold \, no pitches or peaks are output. The high
+threshold is a minimum at which "cooked" outputs may appear.;
+#X text 560 152 A period in milliseconds (50) over which the raw pitch
+may not deviate more than an interval in half-tones (0.5) from the
+average pitch to report it as a note to the "cooked" pitch outlet.
+;
+#X text 560 213 A period in milliseconds (100) over which a re-attack
+is reported if the amplitude rises more than (1) dB. The re-attack
+will result in a "bang" in the attack outlet and may give rise to repeated
+notes in the cooked pitch output.;
+#X text 142 432 test input pitch;
+#X text 330 444 test input;
+#X text 330 457 amplitude;
+#X obj 410 545 fiddle~ 1024 1 20 3;
+#X text 538 690 individual sinusoidal components;
+#X text 466 688 amplitude;
+#X text 476 703 (dB);
+#X text 389 688 raw pitch;
+#X text 376 712 and amplitude;
+#X text 364 729 (up to 3 outputs);
+#X text 287 686 bang on;
+#X text 287 708 attack;
+#X text 185 686 cooked pitch;
+#X text 202 703 output;
+#X text 545 545 ------ arguments:;
+#X msg 262 412 57;
+#X msg 440 331 auto 1;
+#X msg 440 353 auto 0;
+#X msg 439 418 bang;
+#X text 561 416 poll current values --- useful if not in auto mode
+\,;
+#X text 560 274 Higher partials are weighed less strongly than lower
+ones in determining the pitch. This specifies the number of the partial
+(7) which will be weighted half as strongly as the fundamental.;
+#X text 560 335 start and stop "auto" mode (on by default.) If off
+\, output only appears on "bang" (poll mode).;
+#X text 561 448 print out all settings;
+#X text 669 513 window size (128-2048 \, default 1024);
+#X msg 440 375 npoints 2048;
+#X text 562 384 number of points in analysis window (power of 2 \,
+128-2048);
+#X msg 439 396 npoints 1024;
+#X connect 0 0 19 0;
+#X connect 1 0 2 0;
+#X connect 1 1 8 0;
+#X connect 3 0 48 0;
+#X connect 4 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 6 0;
+#X connect 9 0 1 0;
+#X connect 9 1 10 0;
+#X connect 9 2 13 0;
+#X connect 10 0 11 0;
+#X connect 10 1 12 0;
+#X connect 13 0 14 0;
+#X connect 13 1 15 0;
+#X connect 16 0 17 0;
+#X connect 16 1 18 0;
+#X connect 19 0 48 0;
+#X connect 20 0 60 0;
+#X connect 20 0 23 0;
+#X connect 21 0 19 1;
+#X connect 22 0 21 0;
+#X connect 23 0 22 0;
+#X connect 24 0 22 0;
+#X connect 38 0 48 0;
+#X connect 39 0 48 0;
+#X connect 40 0 48 0;
+#X connect 41 0 48 0;
+#X connect 48 0 27 0;
+#X connect 48 1 26 0;
+#X connect 48 2 16 0;
+#X connect 48 3 25 0;
+#X connect 48 4 9 0;
+#X connect 60 0 7 0;
+#X connect 61 0 48 0;
+#X connect 62 0 48 0;
+#X connect 63 0 48 0;
+#X connect 69 0 48 0;
+#X connect 71 0 48 0;
diff --git a/pd/extra/hilbert~-help.pd b/pd/extra/hilbert~-help.pd
new file mode 100644
index 00000000..130ec750
--- /dev/null
+++ b/pd/extra/hilbert~-help.pd
@@ -0,0 +1,18 @@
+#N canvas 156 234 600 488 12;
+#X obj 67 124 hilbert~;
+#X obj 66 85 osc~ 440;
+#X graph graph1 0 -1 882 1 279 209 579 39;
+#X array out-left 882 float;
+#X array out-right 882 float;
+#X pop;
+#X obj 67 274 tabwrite~ out-left;
+#X obj 118 248 tabwrite~ out-right;
+#X msg 137 188 bang \; pd dsp 1;
+#X floatatom 66 57;
+#X text 71 319 The Hilbert transform (the name is abused here according to computer music tradition) puts out a phase quadrature version of the input signal suitable for signal sideband modulation via complex-mod~.;
+#X connect 0 0 3 0;
+#X connect 0 1 4 0;
+#X connect 1 0 0 0;
+#X connect 5 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 1 0;
diff --git a/pd/extra/loop~/loop~-help.pd b/pd/extra/loop~/loop~-help.pd
new file mode 100644
index 00000000..a445b805
--- /dev/null
+++ b/pd/extra/loop~/loop~-help.pd
@@ -0,0 +1,74 @@
+#N canvas 33 0 647 662 12;
+#X floatatom 41 204 0 0 0 0 - - -;
+#X obj 254 382 print~;
+#X msg 254 347 bang;
+#X obj 41 338 loop~;
+#X floatatom 66 279 0 0 0 0 - - -;
+#X msg 55 252 bang;
+#X obj 183 382 print~;
+#X msg 183 347 bang;
+#N canvas 0 0 450 300 graph1 0;
+#X array array2 150000 float 0;
+#X coords 0 1 150000 -1 200 150 1;
+#X restore 393 464 graph;
+#X msg 393 622 \; array2 resize 150000;
+#X obj 25 613 soundfiler;
+#X obj 16 453 tabread4~ array2;
+#X obj 16 407 *~;
+#X obj 16 522 dac~;
+#X obj 16 499 hip~ 5;
+#X obj 62 411 samphold~;
+#X obj 16 430 +~;
+#X floatatom 96 303 0 0 0 0 - - -;
+#X obj 96 326 *~ 1000;
+#X msg 43 568 read ../doc/sound/bell.aiff array2;
+#X msg 43 591 read ../doc/sound/vocal.aiff array2;
+#X msg 47 229 set 0.5;
+#X text 95 196 left signal input is transposition (1 is normal \, 2
+is up an octave \, etc);
+#X text 82 4 loop~ - phase generator for looping samplers;
+#X text 116 228 set phase (0 to 1);
+#X text 104 253 reset phase to 0;
+#X text 104 278 right signal input is window size in samples;
+#X text 134 302 here's how to handle onsets;
+#X obj 16 476 *~;
+#X floatatom 167 432 0 0 0 0 - - -;
+#X obj 167 501 line~;
+#X obj 167 455 dbtorms;
+#X obj 167 478 pack 0 50;
+#X text 201 431 output level 0-100;
+#X text 187 326 print outputs;
+#X text 33 32 loop~ takes input signals to set a window size and transposition
+\, and outputs a phase and a sampled window size. The window size only
+changes at phase zero crossings and the phase output is adjusted so
+that changing window size doesn't change the transposition.;
+#X text 33 112 You can send "bang" or "set" message to force the phase
+to zero--you should mute the output before doing so. This may be desirable
+if you've set a large window size but then want to decrease it without
+waiting for the next phase crossing.;
+#X connect 0 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 3 0 12 0;
+#X connect 3 0 15 1;
+#X connect 3 1 1 0;
+#X connect 3 1 12 1;
+#X connect 4 0 3 1;
+#X connect 5 0 3 0;
+#X connect 7 0 6 0;
+#X connect 11 0 28 0;
+#X connect 12 0 16 0;
+#X connect 14 0 13 0;
+#X connect 14 0 13 1;
+#X connect 15 0 16 1;
+#X connect 16 0 11 0;
+#X connect 17 0 18 0;
+#X connect 18 0 15 0;
+#X connect 19 0 10 0;
+#X connect 20 0 10 0;
+#X connect 21 0 3 0;
+#X connect 28 0 14 0;
+#X connect 29 0 31 0;
+#X connect 30 0 28 1;
+#X connect 31 0 32 0;
+#X connect 32 0 30 0;
diff --git a/pd/extra/lrshift~/rlshift~-help.pd b/pd/extra/lrshift~/rlshift~-help.pd
new file mode 100644
index 00000000..cdfd8830
--- /dev/null
+++ b/pd/extra/lrshift~/rlshift~-help.pd
@@ -0,0 +1,29 @@
+#N canvas 143 0 673 325 12;
+#X msg 268 277 bang;
+#X obj 244 303 print~;
+#X msg 185 278 bang;
+#X obj 161 304 print~;
+#X text 53 117 click here first;
+#X msg 72 270 bang;
+#X obj 48 296 print~;
+#X text 162 222 shift left;
+#X text 243 224 shift right;
+#X obj 161 252 lrshift~ 1;
+#X obj 244 251 lrshift~ -1;
+#X text 39 37 Acting at whatever vector size the window is running at \, lrshift~ shifts samples to the left (toward the beginning sample) or to the right. The argument gives the direction and the amount of the shift. The rightmost (or leftmost) samples are set to zero.;
+#X graph graph2 0 0 63 1 448 258 648 118;
+#X array shiftin 64 float;
+#X pop;
+#X obj 47 11 rlshift~;
+#X text 115 11 -- shift signal vector elements left or right;
+#X msg 54 138 \; pd dsp 1 \; shiftin 1 1;
+#X obj 48 204 tabreceive~ shiftin;
+#X text 525 308 Updated for Pd 0.31.;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X connect 5 0 6 0;
+#X connect 9 0 3 0;
+#X connect 10 0 1 0;
+#X connect 16 0 6 0;
+#X connect 16 0 9 0;
+#X connect 16 0 10 0;
diff --git a/pd/extra/pique/pique-help.pd b/pd/extra/pique/pique-help.pd
new file mode 100644
index 00000000..1689c95b
--- /dev/null
+++ b/pd/extra/pique/pique-help.pd
@@ -0,0 +1,33 @@
+#N canvas 143 0 729 407 12;
+#X obj 47 11 pique;
+#X text 105 12 -- find peaks in an FFT spectrum;
+#X obj 214 174 rfft~;
+#X obj 131 129 osc~ 2000;
+#X graph graph2 0 -64 63 64 519 179 719 39;
+#X array fft-real 64 float;
+#X pop;
+#X graph graph3 0 -64 63 64 519 327 719 187;
+#X array fft-imag 64 float;
+#X pop;
+#X obj 214 215 tabwrite~ fft-real;
+#X obj 245 240 tabwrite~ fft-imag;
+#X obj 315 158 metro 1000;
+#X obj 315 116 loadbang;
+#X msg 315 138 1;
+#X obj 91 349 pique;
+#X msg 91 322 64 fft-real fft-imag 10;
+#X obj 91 376 print;
+#X obj 205 132 osc~ 5000;
+#X text 25 37 pique takes unwindowed FFT analyses as input (they should be stored in arrays) and outputs a list of peaks \, giving their peak number \, frequency \, amplitude \, and phase (as a cosine/sine pair.);
+#X text 13 289 message argumnets: number of FFT points \, fft real part \, fft imaginary part \, maximum number of peaks to report.;
+#X text 578 387 updated for Pd 0.31.;
+#X connect 2 0 6 0;
+#X connect 2 1 7 0;
+#X connect 3 0 2 0;
+#X connect 8 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 14 0 2 0;
diff --git a/pd/extra/rev1~-help.pd b/pd/extra/rev1~-help.pd
new file mode 100644
index 00000000..55580bd5
--- /dev/null
+++ b/pd/extra/rev1~-help.pd
@@ -0,0 +1,119 @@
+#N canvas 55 21 1008 526 12;
+#X obj 148 439 dac~;
+#X obj 58 72 line~;
+#X msg 58 49 0 \, 10000 5;
+#X obj 58 118 cos~;
+#X msg 146 70 1;
+#X obj 146 47 loadbang;
+#X obj 58 95 clip~ 0 0.25;
+#X floatatom 173 264 0 0 0;
+#X obj 251 134 line~;
+#X obj 251 157 cos~;
+#X msg 324 54 -0.25 \, 0.25 100;
+#X obj 251 8 loadbang;
+#X msg 251 31 -0.25;
+#X obj 251 203 *~;
+#X obj 58 140 hip~ 5;
+#X floatatom 162 328 0 0 0;
+#X obj 162 373 pack 0 100;
+#X obj 162 396 line~;
+#X obj 148 416 *~;
+#X obj 162 350 dbtorms;
+#X msg 324 77 -0.25 \, 0.25 400;
+#X floatatom 324 145 0 0 0;
+#X obj 324 191 osc~ 440;
+#X obj 324 168 mtof;
+#X msg 324 31 -0.25 \, 0.25 20;
+#X obj 251 180 *~ 0.1;
+#X msg 324 100 -0.25 \, 0.25 1000;
+#X msg 324 122 -0.25 \, 0.25 2000;
+#X obj 324 226 *~;
+#X obj 342 252 *~;
+#X obj 58 439 dac~;
+#X floatatom 68 323 0 0 0;
+#X obj 68 368 pack 0 100;
+#X obj 68 391 line~;
+#X obj 58 416 *~;
+#X obj 68 346 dbtorms;
+#X msg 324 8 0;
+#X obj 308 257 *~;
+#X obj 58 26 metro 2000;
+#X floatatom 58 4 0 0 0;
+#X msg 220 265 bang;
+#X obj 284 322 env~ 32768;
+#X floatatom 284 344 0 0 0;
+#X text 166 244 1 sec;
+#X text 143 226 dB after;
+#X text 220 245 clear;
+#X text 1 51 impulse;
+#X text 362 7 tone;
+#X text 484 31 beeps;
+#X text 428 167 This is an experimental reverberator design composed
+of a series of allpass filters with exponentially growing delay times.
+Each allpass filter has a gain of 0.7. The reverb time is adjusted
+by adjusting the input gains of the allpass filters. The last unit
+is modified so that its first two "echos" mimic those of an allpass
+but its loop gain depends on reverb time.;
+#X text 430 299 Reverb time is controlled by specifying the dB gain
+(100 normal) after one second \, so that 100 corresponds to infinite
+reverb time \, 70 to two seconds \, 40 to one second \, and 0 to 0
+;
+#X text 671 499 modified for Pd version 0.30.;
+#X msg 560 34 \; pd dsp 1;
+#X text 427 475 The rev1~ module eats about 18% of my 300mHz P2 machine.
+;
+#X obj 148 289 rev1~;
+#X text 428 381 The "clear" button impolitely clears out all the delay
+lines \, You may immediately resume pumping the reverberator \, but
+the input signal should be cleanly enveloped. The output \, too \,
+must be enveloped and may not be opened until 5 msec after the "clear"
+message is sent.;
+#X connect 1 0 6 0;
+#X connect 2 0 1 0;
+#X connect 3 0 14 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
+#X connect 7 0 54 1;
+#X connect 8 0 9 0;
+#X connect 9 0 25 0;
+#X connect 10 0 8 0;
+#X connect 11 0 12 0;
+#X connect 12 0 8 0;
+#X connect 13 0 14 0;
+#X connect 14 0 34 0;
+#X connect 14 0 54 0;
+#X connect 15 0 19 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 1;
+#X connect 18 0 0 0;
+#X connect 19 0 16 0;
+#X connect 20 0 8 0;
+#X connect 21 0 23 0;
+#X connect 22 0 13 1;
+#X connect 22 0 28 0;
+#X connect 22 0 28 1;
+#X connect 22 0 29 0;
+#X connect 23 0 22 0;
+#X connect 24 0 8 0;
+#X connect 25 0 13 0;
+#X connect 26 0 8 0;
+#X connect 27 0 8 0;
+#X connect 28 0 29 1;
+#X connect 28 0 13 1;
+#X connect 28 0 37 0;
+#X connect 28 0 37 1;
+#X connect 29 0 13 1;
+#X connect 31 0 35 0;
+#X connect 32 0 33 0;
+#X connect 33 0 34 1;
+#X connect 34 0 30 0;
+#X connect 35 0 32 0;
+#X connect 36 0 8 0;
+#X connect 37 0 13 1;
+#X connect 38 0 2 0;
+#X connect 39 0 38 0;
+#X connect 40 0 54 2;
+#X connect 41 0 42 0;
+#X connect 54 0 18 0;
+#X connect 54 0 41 0;
diff --git a/pd/extra/rev2~-help.pd b/pd/extra/rev2~-help.pd
new file mode 100644
index 00000000..8f9fbaaf
--- /dev/null
+++ b/pd/extra/rev2~-help.pd
@@ -0,0 +1,134 @@
+#N canvas 167 160 766 354 12;
+#X floatatom 73 185 0 0 120 0 - - -;
+#X floatatom 106 323 0 0 120 0 - - -;
+#N canvas 0 0 539 448 tests 0;
+#X obj 67 33 inlet;
+#X obj 309 189 inlet;
+#X obj 235 207 line~;
+#X obj 235 230 cos~;
+#X obj 235 68 loadbang;
+#X msg 235 91 -0.25;
+#X obj 235 276 *~;
+#X obj 186 309 hip~ 5;
+#X floatatom 308 218 0 0 0 0 - - -;
+#X obj 308 264 osc~ 440;
+#X obj 308 241 mtof;
+#X obj 235 253 *~ 0.1;
+#X obj 308 299 *~;
+#X obj 326 325 *~;
+#X obj 292 330 *~;
+#X msg 279 150 -0.25 \, 0.25 \$1;
+#X obj 41 148 biquad~ 0 0 1 -1 0;
+#X obj 63 70 t b;
+#X obj 104 72 del 3;
+#X obj 57 101 1;
+#X obj 96 101 0;
+#X obj 41 355 outlet~;
+#X obj 279 126 inlet;
+#X obj 40 175 *~;
+#X connect 0 0 17 0;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 3 0 11 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 21 0;
+#X connect 8 0 10 0;
+#X connect 9 0 6 1;
+#X connect 9 0 12 0;
+#X connect 9 0 12 1;
+#X connect 9 0 13 0;
+#X connect 10 0 9 0;
+#X connect 11 0 6 0;
+#X connect 12 0 13 1;
+#X connect 12 0 6 1;
+#X connect 12 0 14 0;
+#X connect 12 0 14 1;
+#X connect 13 0 6 1;
+#X connect 14 0 6 1;
+#X connect 15 0 2 0;
+#X connect 16 0 23 0;
+#X connect 17 0 18 0;
+#X connect 17 0 19 0;
+#X connect 18 0 20 0;
+#X connect 19 0 16 0;
+#X connect 19 0 23 1;
+#X connect 20 0 16 0;
+#X connect 20 0 23 1;
+#X connect 22 0 15 0;
+#X connect 23 0 21 0;
+#X restore 17 154 pd tests;
+#X msg 56 35 10;
+#X msg 54 62 20;
+#X msg 53 90 100;
+#X msg 52 115 500;
+#X obj 17 15 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 37 9 impulse;
+#N canvas 0 0 450 300 output 0;
+#X obj 54 202 dac~;
+#X obj 132 119 pack 0 100;
+#X obj 132 142 line~;
+#X obj 54 165 *~;
+#X obj 132 97 dbtorms;
+#X obj 33 42 inlet~;
+#X obj 177 42 inlet;
+#X obj 177 74 clip 0 120;
+#X msg 257 133 \; pd dsp 1;
+#X obj 98 42 inlet~;
+#X obj 94 168 *~;
+#X connect 1 0 2 0;
+#X connect 2 0 3 1;
+#X connect 2 0 10 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 4 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 1;
+#X restore 18 324 pd output;
+#X floatatom 97 127 0 0 0 0 - - -;
+#X text 136 96 tone;
+#X text 135 112 pitch;
+#X text 114 185 level \, dB;
+#X floatatom 117 209 0 0 100 0 - - -;
+#X text 158 209 liveness \, 0-100;
+#X text 505 330 modified for Pd version 0.37;
+#X floatatom 161 235 0 0 120 0 - - -;
+#X floatatom 205 259 0 0 120 0 - - -;
+#X text 192 235 crossover frequency \, Hz.;
+#X text 238 260 HF damping \, percent;
+#X obj 30 290 rev2~ 100 90 3000 20;
+#X text 141 324 output level \, dB;
+#X text 281 8 REV2~ - a simple 1-in \, 4-out reverberator;
+#X text 95 35 tone;
+#X text 96 52 bursts;
+#X text 231 37 The creation arguments (level \, liveness \, crossover
+frequency \, HF damping) may also be supplied in four inlets as shown.
+The "liveness" (actually the internal feedback percentage) should be
+100 for infinite reverb \, 90 for longish \, and 80 for short. The
+crossover frequency and HF damping work together: at frequencies above
+crossover \, the feedback is diminished by the "damping" as a percentage.
+So zero HF damping means equal reverb time at all frequencies \, and
+100% damping means almost nothing above the crossover frequency gets
+through.;
+#X text 132 130 (60 for;
+#X text 115 150 middle C);
+#X connect 0 0 21 1;
+#X connect 1 0 9 2;
+#X connect 2 0 9 0;
+#X connect 2 0 21 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 1;
+#X connect 6 0 2 1;
+#X connect 7 0 2 0;
+#X connect 10 0 2 2;
+#X connect 14 0 21 2;
+#X connect 17 0 21 3;
+#X connect 18 0 21 4;
+#X connect 21 0 9 0;
+#X connect 21 1 9 1;
diff --git a/pd/extra/rev3~-help.pd b/pd/extra/rev3~-help.pd
new file mode 100644
index 00000000..78ef15f5
--- /dev/null
+++ b/pd/extra/rev3~-help.pd
@@ -0,0 +1,136 @@
+#N canvas 70 263 765 380 12;
+#X floatatom 99 212 0 0 120 0 - - -;
+#X floatatom 105 340 0 0 120 0 - - -;
+#N canvas 0 0 539 448 tests 0;
+#X obj 67 33 inlet;
+#X obj 309 189 inlet;
+#X obj 235 207 line~;
+#X obj 235 230 cos~;
+#X obj 235 68 loadbang;
+#X msg 235 91 -0.25;
+#X obj 235 276 *~;
+#X obj 186 309 hip~ 5;
+#X floatatom 308 218 0 0 0 0 - - -;
+#X obj 308 264 osc~ 440;
+#X obj 308 241 mtof;
+#X obj 235 253 *~ 0.1;
+#X obj 308 299 *~;
+#X obj 326 325 *~;
+#X obj 292 330 *~;
+#X msg 279 150 -0.25 \, 0.25 \$1;
+#X obj 41 148 biquad~ 0 0 1 -1 0;
+#X obj 63 70 t b;
+#X obj 104 72 del 3;
+#X obj 57 101 1;
+#X obj 96 101 0;
+#X obj 41 355 outlet~;
+#X obj 279 126 inlet;
+#X obj 51 192 *~;
+#X connect 0 0 17 0;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 3 0 11 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 21 0;
+#X connect 8 0 10 0;
+#X connect 9 0 6 1;
+#X connect 9 0 12 0;
+#X connect 9 0 12 1;
+#X connect 9 0 13 0;
+#X connect 10 0 9 0;
+#X connect 11 0 6 0;
+#X connect 12 0 13 1;
+#X connect 12 0 6 1;
+#X connect 12 0 14 0;
+#X connect 12 0 14 1;
+#X connect 13 0 6 1;
+#X connect 14 0 6 1;
+#X connect 15 0 2 0;
+#X connect 16 0 23 0;
+#X connect 17 0 18 0;
+#X connect 17 0 19 0;
+#X connect 18 0 20 0;
+#X connect 19 0 16 0;
+#X connect 19 0 23 1;
+#X connect 20 0 16 0;
+#X connect 20 0 23 1;
+#X connect 22 0 15 0;
+#X connect 23 0 21 0;
+#X restore 16 171 pd tests;
+#X msg 55 52 10;
+#X msg 53 79 20;
+#X msg 52 107 100;
+#X msg 51 132 500;
+#X obj 16 32 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 36 26 impulse;
+#N canvas 0 0 450 300 output 0;
+#X obj 54 202 dac~;
+#X obj 132 119 pack 0 100;
+#X obj 132 142 line~;
+#X obj 54 165 *~;
+#X obj 132 97 dbtorms;
+#X obj 33 42 inlet~;
+#X obj 177 42 inlet;
+#X obj 177 74 clip 0 120;
+#X msg 257 133 \; pd dsp 1;
+#X obj 98 42 inlet~;
+#X obj 94 168 *~;
+#X connect 1 0 2 0;
+#X connect 2 0 3 1;
+#X connect 2 0 10 1;
+#X connect 3 0 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 4 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 1;
+#X restore 17 340 pd output;
+#X floatatom 96 144 0 0 0 0 - - -;
+#X text 135 113 tone;
+#X text 134 129 pitch;
+#X text 140 212 level \, dB;
+#X floatatom 134 234 0 0 100 0 - - -;
+#X text 175 234 liveness \, 0-100;
+#X floatatom 169 258 4 0 5000 0 - - -;
+#X floatatom 204 281 0 0 100 0 - - -;
+#X text 217 256 crossover frequency \, Hz.;
+#X text 240 283 HF damping \, percent;
+#X text 140 341 output level \, dB;
+#X text 94 52 tone;
+#X text 95 69 bursts;
+#X text 131 147 (60 for;
+#X text 114 167 middle C);
+#X obj 29 307 rev3~ 100 90 3000 20;
+#X text 263 4 REV3~ - hard-core \, 2-in \, 4-out reverberator;
+#X text 236 56 The creation arguments (level \, liveness \, crossover
+frequency \, HF damping) may also be supplied in four inlets as shown.
+The "liveness" (actually the internal feedback percentage) should be
+100 for infinite reverb \, 90 for longish \, and 80 for short. The
+crossover frequency and HF damping work together: at frequencies above
+crossover \, the feedback is diminished by the "damping" as a percentage.
+So zero HF damping means equal reverb time at all frequencies \, and
+100% damping means almost nothing above the crossover frequency gets
+through.;
+#X text 236 29 (A more expensive \, presumably better \, one than rev2~.)
+;
+#X text 470 352 modified for Pd version 0.37-1;
+#X connect 0 0 25 2;
+#X connect 1 0 9 2;
+#X connect 2 0 9 0;
+#X connect 2 0 25 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 2 1;
+#X connect 6 0 2 1;
+#X connect 7 0 2 0;
+#X connect 10 0 2 2;
+#X connect 14 0 25 3;
+#X connect 16 0 25 4;
+#X connect 17 0 25 5;
+#X connect 25 0 9 0;
+#X connect 25 1 9 1;
diff --git a/pd/portaudio/pa_common/pa_types.h b/pd/portaudio/pa_common/pa_types.h
new file mode 100644
index 00000000..343dc8cf
--- /dev/null
+++ b/pd/portaudio/pa_common/pa_types.h
@@ -0,0 +1,65 @@
+#ifndef PA_TYPES_H
+#define PA_TYPES_H
+
+/*
+ SIZEOF_SHORT, SIZEOF_INT and SIZEOF_LONG are set by the configure script
+ when it is used. Otherwise we default to the common 32 bit values, if your
+ platform doesn't use configure, and doesn't use the default values below
+ you will need to explicitly define these symbols in your make file.
+
+ A PA_VALIDATE_SIZES macro is provided to assert that the values set in this
+ file are correct.
+*/
+
+#ifndef SIZEOF_SHORT
+#define SIZEOF_SHORT 2
+#endif
+
+#ifndef SIZEOF_INT
+#define SIZEOF_INT 4
+#endif
+
+#ifndef SIZEOF_LONG
+#define SIZEOF_LONG 4
+#endif
+
+
+#if SIZEOF_SHORT == 2
+typedef signed short PaInt16;
+typedef unsigned short PaUint16;
+#elif SIZEOF_INT == 2
+typedef signed int PaInt16;
+typedef unsigned int PaUint16;
+#else
+#error pa_types.h was unable to determine which type to use for 16bit integers on the target platform
+#endif
+
+#if SIZEOF_SHORT == 4
+typedef signed short PaInt32;
+typedef unsigned short PaUint32;
+#elif SIZEOF_INT == 4
+typedef signed int PaInt32;
+typedef unsigned int PaUint32;
+#elif SIZEOF_LONG == 4
+typedef signed long PaInt32;
+typedef unsigned long PaUint32;
+#else
+#error pa_types.h was unable to determine which type to use for 32bit integers on the target platform
+#endif
+
+
+/* PA_VALIDATE_TYPE_SIZES compares the size of the integer types at runtime to
+ ensure that PortAudio was configured correctly, and raises an assertion if
+ they don't match the expected values. <assert.h> must be included in the
+ context in which this macro is used.
+*/
+#define PA_VALIDATE_TYPE_SIZES \
+ { \
+ assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaUint16 ) == 2 ); \
+ assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaInt16 ) == 2 ); \
+ assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaUint32 ) == 4 ); \
+ assert( "PortAudio: type sizes are not correct in pa_types.h" && sizeof( PaInt32 ) == 4 ); \
+ }
+
+
+#endif /* PA_TYPES_H */
diff --git a/pd/portaudio/pa_dll_switch/PaDllEntry.h b/pd/portaudio/pa_dll_switch/PaDllEntry.h
new file mode 100644
index 00000000..e070054b
--- /dev/null
+++ b/pd/portaudio/pa_dll_switch/PaDllEntry.h
@@ -0,0 +1,184 @@
+
+/*
+ * PortAudio Portable Real-Time Audio Library
+ * PortAudio DLL Header File
+ * Latest version available at: http://www.audiomulch.com/portaudio/
+ *
+ * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * Any person wishing to distribute modifications to the Software is
+ * requested to send the modifications to the original developer so that
+ * they can be incorporated into the canonical version.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+// changed by zplane.developement in order to generate a DLL
+
+#ifndef __PADLLENTRY_HEADER_INCLUDED__
+
+#define __PADLLENTRY_HEADER_INCLUDED__
+
+typedef int PaError;
+typedef enum {
+ paNoError = 0,
+
+ paHostError = -10000,
+ paInvalidChannelCount,
+ paInvalidSampleRate,
+ paInvalidDeviceId,
+ paInvalidFlag,
+ paSampleFormatNotSupported,
+ paBadIODeviceCombination,
+ paInsufficientMemory,
+ paBufferTooBig,
+ paBufferTooSmall,
+ paNullCallback,
+ paBadStreamPtr,
+ paTimedOut,
+ paInternalError
+} PaErrorNum;
+
+typedef unsigned long PaSampleFormat;
+#define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/
+#define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/
+#define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/
+#define paInt24 ((PaSampleFormat) (1<<3))
+#define paPackedInt24 ((PaSampleFormat) (1<<4))
+#define paInt8 ((PaSampleFormat) (1<<5))
+#define paUInt8 ((PaSampleFormat) (1<<6)) /* unsigned 8 bit, 128 is "ground" */
+#define paCustomFormat ((PaSampleFormat) (1<<16))
+
+
+typedef int PaDeviceID;
+#define paNoDevice -1
+
+typedef struct
+{
+ int structVersion;
+ const char *name;
+ int maxInputChannels;
+ int maxOutputChannels;
+ /* Number of discrete rates, or -1 if range supported. */
+ int numSampleRates;
+ /* Array of supported sample rates, or {min,max} if range supported. */
+ const double *sampleRates;
+ PaSampleFormat nativeSampleFormats;
+}
+PaDeviceInfo;
+
+
+typedef double PaTimestamp;
+
+
+typedef int (PortAudioCallback)(
+ void *inputBuffer, void *outputBuffer,
+ unsigned long framesPerBuffer,
+ PaTimestamp outTime, void *userData );
+
+
+#define paNoFlag (0)
+#define paClipOff (1<<0) /* disable default clipping of out of range samples */
+#define paDitherOff (1<<1) /* disable default dithering */
+#define paPlatformSpecificFlags (0x00010000)
+typedef unsigned long PaStreamFlags;
+
+typedef void PortAudioStream;
+#define PaStream PortAudioStream
+
+extern PaError (__cdecl* Pa_Initialize)( void );
+
+
+
+extern PaError (__cdecl* Pa_Terminate)( void );
+
+
+extern long (__cdecl* Pa_GetHostError)( void );
+
+
+extern const char* (__cdecl* Pa_GetErrorText)( PaError );
+
+
+
+extern int (__cdecl* Pa_CountDevices)(void);
+
+extern PaDeviceID (__cdecl* Pa_GetDefaultInputDeviceID)( void );
+
+extern PaDeviceID (__cdecl* Pa_GetDefaultOutputDeviceID)( void );
+
+
+extern const PaDeviceInfo* (__cdecl* Pa_GetDeviceInfo)( PaDeviceID);
+
+
+
+extern PaError (__cdecl* Pa_OpenStream)(
+ PortAudioStream ** ,
+ PaDeviceID ,
+ int ,
+ PaSampleFormat ,
+ void *,
+ PaDeviceID ,
+ int ,
+ PaSampleFormat ,
+ void *,
+ double ,
+ unsigned long ,
+ unsigned long ,
+ unsigned long ,
+ PortAudioCallback *,
+ void * );
+
+
+
+extern PaError (__cdecl* Pa_OpenDefaultStream)( PortAudioStream** stream,
+ int numInputChannels,
+ int numOutputChannels,
+ PaSampleFormat sampleFormat,
+ double sampleRate,
+ unsigned long framesPerBuffer,
+ unsigned long numberOfBuffers,
+ PortAudioCallback *callback,
+ void *userData );
+
+
+extern PaError (__cdecl* Pa_CloseStream)( PortAudioStream* );
+
+
+extern PaError (__cdecl* Pa_StartStream)( PortAudioStream *stream );
+
+extern PaError (__cdecl* Pa_StopStream)( PortAudioStream *stream );
+
+extern PaError (__cdecl* Pa_AbortStream)( PortAudioStream *stream );
+
+extern PaError (__cdecl* Pa_StreamActive)( PortAudioStream *stream );
+
+extern PaTimestamp (__cdecl* Pa_StreamTime)( PortAudioStream *stream );
+
+extern double (__cdecl* Pa_GetCPULoad)( PortAudioStream* stream );
+
+extern int (__cdecl* Pa_GetMinNumBuffers)( int framesPerBuffer, double sampleRate );
+
+extern void (__cdecl* Pa_Sleep)( long msec );
+
+extern PaError (__cdecl* Pa_GetSampleSize)( PaSampleFormat format );
+
+#endif // __PADLLENTRY_HEADER_INCLUDED__
+
diff --git a/pd/portaudio/pa_dll_switch/letter_from_tim_010817.txt b/pd/portaudio/pa_dll_switch/letter_from_tim_010817.txt
new file mode 100644
index 00000000..a535cd1d
--- /dev/null
+++ b/pd/portaudio/pa_dll_switch/letter_from_tim_010817.txt
Binary files differ
diff --git a/pd/portaudio/pa_dll_switch/loadPA_DLL.cpp b/pd/portaudio/pa_dll_switch/loadPA_DLL.cpp
new file mode 100644
index 00000000..043eda87
--- /dev/null
+++ b/pd/portaudio/pa_dll_switch/loadPA_DLL.cpp
@@ -0,0 +1,203 @@
+//////////////////////////////////////////////////////////////////////////
+
+
+HINSTANCE pPaDll;
+
+/*
+ the function pointers to the PortAudio DLLs
+*/
+
+PaError (__cdecl* Pa_Initialize)( void );
+
+
+
+PaError (__cdecl* Pa_Terminate)( void );
+
+
+long (__cdecl* Pa_GetHostError)( void );
+
+
+const char* (__cdecl* Pa_GetErrorText)( PaError );
+
+
+int (__cdecl* Pa_CountDevices)(void);
+
+PaDeviceID (__cdecl* Pa_GetDefaultInputDeviceID)( void );
+
+PaDeviceID (__cdecl* Pa_GetDefaultOutputDeviceID)( void );
+
+
+const PaDeviceInfo* (__cdecl* Pa_GetDeviceInfo)( PaDeviceID);
+
+
+
+PaError (__cdecl* Pa_OpenStream)(
+ PortAudioStream ** ,
+ PaDeviceID ,
+ int ,
+ PaSampleFormat ,
+ void *,
+ PaDeviceID ,
+ int ,
+ PaSampleFormat ,
+ void *,
+ double ,
+ unsigned long ,
+ unsigned long ,
+ unsigned long ,
+ PortAudioCallback *,
+ void * );
+
+
+
+PaError (__cdecl* Pa_OpenDefaultStream)( PortAudioStream** stream,
+ int numInputChannels,
+ int numOutputChannels,
+ PaSampleFormat sampleFormat,
+ double sampleRate,
+ unsigned long framesPerBuffer,
+ unsigned long numberOfBuffers,
+ PortAudioCallback *callback,
+ void *userData );
+
+
+PaError (__cdecl* Pa_CloseStream)( PortAudioStream* );
+
+
+PaError (__cdecl* Pa_StartStream)( PortAudioStream *stream );
+
+PaError (__cdecl* Pa_StopStream)( PortAudioStream *stream );
+
+PaError (__cdecl* Pa_AbortStream)( PortAudioStream *stream );
+
+PaError (__cdecl* Pa_StreamActive)( PortAudioStream *stream );
+
+PaTimestamp (__cdecl* Pa_StreamTime)( PortAudioStream *stream );
+
+double (__cdecl* Pa_GetCPULoad)( PortAudioStream* stream );
+
+int (__cdecl* Pa_GetMinNumBuffers)( int framesPerBuffer, double sampleRate );
+
+void (__cdecl* Pa_Sleep)( long msec );
+
+PaError (__cdecl* Pa_GetSampleSize)( PaSampleFormat format );
+
+
+//////////////////////////////////////////////////////////////////////////
+
+...
+
+ZERROR AudioEngine::DirectXSupport(ZBOOL bSupDX)
+{
+ if (bSupDX)
+ if (CheckForDirectXSupport())
+ bSupportDirectX = _TRUE;
+ else
+ return _NO_SOUND;
+ else
+ bSupportDirectX = _FALSE;
+ return _NO_ERROR;
+}
+
+
+
+ZBOOL AudioEngine::CheckForDirectXSupport()
+{
+ HMODULE pTestDXLib;
+ FARPROC pFunctionality;
+
+ pTestDXLib=LoadLibrary("DSOUND");
+ if (pTestDXLib!=NULL) // check if there is a DirectSound
+ {
+ pFunctionality = GetProcAddress(pTestDXLib, (char*) 7);
+ if (pFunctionality!=NULL)
+ {
+ FreeLibrary(pTestDXLib);
+ return _TRUE;
+ }
+ else
+ {
+ FreeLibrary(pTestDXLib);
+ return _FALSE;
+ }
+ }
+ else
+ return _FALSE;
+}
+
+
+ZERROR AudioEngine::LoadPALib()
+{
+#ifdef _DEBUG
+ if (bSupportDirectX)
+ pPaDll = LoadLibrary("PA_DXD");
+ else
+ pPaDll = LoadLibrary("PA_MMED");
+#else
+ if (bSupportDirectX)
+ pPaDll = LoadLibrary("PA_DX");
+ else
+ pPaDll = LoadLibrary("PA_MME");
+#endif
+ if (pPaDll!=NULL)
+ {
+
+ Pa_Initialize = (int (__cdecl*)(void))GetProcAddress(pPaDll,"Pa_Initialize");
+ Pa_Terminate = (int (__cdecl*)(void))GetProcAddress(pPaDll,"Pa_Terminate");
+ Pa_GetHostError = (long (__cdecl* )( void )) GetProcAddress(pPaDll,"Pa_GetHostError");
+ Pa_GetErrorText = (const char* (__cdecl* )( PaError )) GetProcAddress(pPaDll,"Pa_GetErrorText");
+ Pa_CountDevices = (int (__cdecl*)(void))GetProcAddress(pPaDll,"Pa_CountDevices");
+ Pa_GetDefaultInputDeviceID = (int (__cdecl*)(void))GetProcAddress(pPaDll,"Pa_GetDefaultInputDeviceID");
+ Pa_GetDefaultOutputDeviceID = (int (__cdecl*)(void))GetProcAddress(pPaDll,"Pa_GetDefaultOutputDeviceID");
+ Pa_GetDeviceInfo = (const PaDeviceInfo* (__cdecl* )( PaDeviceID)) GetProcAddress(pPaDll,"Pa_GetDeviceInfo");
+ Pa_OpenStream = ( PaError (__cdecl* )(
+ PortAudioStream ** ,
+ PaDeviceID ,
+ int ,
+ PaSampleFormat ,
+ void *,
+ PaDeviceID ,
+ int ,
+ PaSampleFormat ,
+ void *,
+ double ,
+ unsigned long ,
+ unsigned long ,
+ unsigned long ,
+ PortAudioCallback *,
+ void * )) GetProcAddress(pPaDll,"Pa_OpenStream");
+
+ Pa_OpenDefaultStream = (PaError (__cdecl* )( PortAudioStream** ,
+ int ,
+ int ,
+ PaSampleFormat ,
+ double ,
+ unsigned long ,
+ unsigned long ,
+ PortAudioCallback *,
+ void * )) GetProcAddress(pPaDll,"Pa_OpenDefaultStream");
+ Pa_CloseStream = (PaError (__cdecl* )( PortAudioStream* )) GetProcAddress(pPaDll,"Pa_CloseStream");
+ Pa_StartStream = (PaError (__cdecl* )( PortAudioStream* )) GetProcAddress(pPaDll,"Pa_StartStream");
+ Pa_StopStream = (PaError (__cdecl* )( PortAudioStream* ))GetProcAddress(pPaDll,"Pa_StopStream");
+ Pa_AbortStream = (PaError (__cdecl* )( PortAudioStream* )) GetProcAddress(pPaDll,"Pa_AbortStream");
+ Pa_StreamActive = (PaError (__cdecl* )( PortAudioStream* )) GetProcAddress(pPaDll,"Pa_StreamActive");
+ Pa_StreamTime = (PaTimestamp (__cdecl* )( PortAudioStream *))GetProcAddress(pPaDll,"Pa_StreamTime");
+ Pa_GetCPULoad = (double (__cdecl* )( PortAudioStream* ))GetProcAddress(pPaDll,"Pa_GetCPULoad");
+ Pa_GetMinNumBuffers = (int (__cdecl* )( int , double )) GetProcAddress(pPaDll,"Pa_GetMinNumBuffers");
+ Pa_Sleep = (void (__cdecl* )( long )) GetProcAddress(pPaDll,"Pa_Sleep");
+ Pa_GetSampleSize = (PaError (__cdecl* )( PaSampleFormat )) GetProcAddress(pPaDll,"Pa_GetSampleSize");
+
+ return _NO_ERROR;
+ }
+ else
+ return _DLL_NOT_FOUND;
+}
+
+ZERROR AudioEngine::UnLoadPALib()
+{
+ if (pPaDll!=NULL)
+ FreeLibrary(pPaDll);
+ return _NO_ERROR;
+}
+
+...
diff --git a/pd/portaudio/pa_dll_switch/pa_lib.c b/pd/portaudio/pa_dll_switch/pa_lib.c
new file mode 100644
index 00000000..86601592
--- /dev/null
+++ b/pd/portaudio/pa_dll_switch/pa_lib.c
@@ -0,0 +1,827 @@
+/*
+ * Portable Audio I/O Library
+ * Host Independant Layer
+ *
+ * Based on the Open Source API proposed by Ross Bencina
+ * Copyright (c) 1999-2000 Phil Burk
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * Any person wishing to distribute modifications to the Software is
+ * requested to send the modifications to the original developer so that
+ * they can be incorporated into the canonical version.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/* Modification History:
+ PLB20010422 - apply Mike Berry's changes for CodeWarrior on PC
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+/* PLB20010422 - "memory.h" doesn't work on CodeWarrior for PC. Thanks Mike Berry for the mod. */
+#ifdef _WIN32
+#ifndef __MWERKS__
+#include <memory.h>
+#endif /* __MWERKS__ */
+#else /* !_WIN32 */
+#include <memory.h>
+#endif /* _WIN32 */
+
+#include "portaudio.h"
+#include "pa_host.h"
+#include "pa_trace.h"
+
+/* The reason we might NOT want to validate the rate before opening the stream
+ * is because many DirectSound drivers lie about the rates they actually support.
+ */
+#define PA_VALIDATE_RATE (0) /* If true validate sample rate against driver info. */
+
+/*
+O- maybe not allocate past_InputBuffer and past_OutputBuffer if not needed for conversion
+*/
+
+#ifndef FALSE
+ #define FALSE (0)
+ #define TRUE (!FALSE)
+#endif
+
+#define PRINT(x) { printf x; fflush(stdout); }
+#define ERR_RPT(x) PRINT(x)
+#define DBUG(x) /* PRINT(x) */
+#define DBUGX(x) /* PRINT(x) */
+
+static int gInitCount = 0; /* Count number of times Pa_Initialize() called to allow nesting and overlapping. */
+
+static PaError Pa_KillStream( PortAudioStream *stream, int abort );
+
+/***********************************************************************/
+int PaHost_FindClosestTableEntry( double allowableError, const double *rateTable, int numRates, double frameRate )
+{
+ double err, minErr = allowableError;
+ int i, bestFit = -1;
+
+ for( i=0; i<numRates; i++ )
+ {
+ err = fabs( frameRate - rateTable[i] );
+ if( err < minErr )
+ {
+ minErr = err;
+ bestFit = i;
+ }
+ }
+ return bestFit;
+}
+
+/**************************************************************************
+** Make sure sample rate is legal and also convert to enumeration for driver.
+*/
+PaError PaHost_ValidateSampleRate( PaDeviceID id, double requestedFrameRate,
+ double *closestFrameRatePtr )
+{
+ long bestRateIndex;
+ const PaDeviceInfo *pdi;
+ pdi = Pa_GetDeviceInfo( id );
+ if( pdi == NULL ) return paInvalidDeviceId;
+
+ if( pdi->numSampleRates == -1 )
+ {
+ /* Is it out of range? */
+ if( (requestedFrameRate < pdi->sampleRates[0]) ||
+ (requestedFrameRate > pdi->sampleRates[1]) )
+ {
+ return paInvalidSampleRate;
+ }
+
+ *closestFrameRatePtr = requestedFrameRate;
+ }
+ else
+ {
+ bestRateIndex = PaHost_FindClosestTableEntry( 1.0, pdi->sampleRates, pdi->numSampleRates, requestedFrameRate );
+ if( bestRateIndex < 0 ) return paInvalidSampleRate;
+ *closestFrameRatePtr = pdi->sampleRates[bestRateIndex];
+ }
+ return paNoError;
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_OpenStream(
+ PortAudioStream** streamPtrPtr,
+ PaDeviceID inputDeviceID,
+ int numInputChannels,
+ PaSampleFormat inputSampleFormat,
+ void *inputDriverInfo,
+ PaDeviceID outputDeviceID,
+ int numOutputChannels,
+ PaSampleFormat outputSampleFormat,
+ void *outputDriverInfo,
+ double sampleRate,
+ unsigned long framesPerBuffer,
+ unsigned long numberOfBuffers,
+ unsigned long streamFlags,
+ PortAudioCallback *callback,
+ void *userData )
+{
+ internalPortAudioStream *past = NULL;
+ PaError result = paNoError;
+ int bitsPerInputSample;
+ int bitsPerOutputSample;
+ /* Print passed parameters. */
+ DBUG(("Pa_OpenStream( %p, %d, %d, %d, %p, /* input */ \n",
+ streamPtrPtr, inputDeviceID, numInputChannels,
+ inputSampleFormat, inputDriverInfo ));
+ DBUG((" %d, %d, %d, %p, /* output */\n",
+ outputDeviceID, numOutputChannels,
+ outputSampleFormat, outputDriverInfo ));
+ DBUG((" %g, %d, %d, 0x%x, , %p )\n",
+ sampleRate, framesPerBuffer, numberOfBuffers,
+ streamFlags, userData ));
+
+ /* Check for parameter errors. */
+ if( (streamFlags & ~(paClipOff | paDitherOff)) != 0 ) return paInvalidFlag;
+ if( streamPtrPtr == NULL ) return paBadStreamPtr;
+ if( inputDriverInfo != NULL ) return paHostError; /* REVIEW */
+ if( outputDriverInfo != NULL ) return paHostError; /* REVIEW */
+ if( (inputDeviceID < 0) && ( outputDeviceID < 0) ) return paInvalidDeviceId;
+ if( (outputDeviceID >= Pa_CountDevices()) || (inputDeviceID >= Pa_CountDevices()) ) return paInvalidDeviceId;
+ if( (numInputChannels <= 0) && ( numOutputChannels <= 0) ) return paInvalidChannelCount;
+
+#if SUPPORT_AUDIO_CAPTURE
+ if( inputDeviceID >= 0 )
+ {
+ PaError size = Pa_GetSampleSize( inputSampleFormat );
+ if( size < 0 ) return size;
+ bitsPerInputSample = 8 * size;
+ if( (numInputChannels <= 0) ) return paInvalidChannelCount;
+ }
+#else
+ if( inputDeviceID >= 0 )
+ {
+ return paInvalidChannelCount;
+ }
+#endif /* SUPPORT_AUDIO_CAPTURE */
+ else
+ {
+ if( numInputChannels > 0 ) return paInvalidChannelCount;
+ bitsPerInputSample = 0;
+ }
+
+ if( outputDeviceID >= 0 )
+ {
+ PaError size = Pa_GetSampleSize( outputSampleFormat );
+ if( size < 0 ) return size;
+ bitsPerOutputSample = 8 * size;
+ if( (numOutputChannels <= 0) ) return paInvalidChannelCount;
+ }
+ else
+ {
+ if( numOutputChannels > 0 ) return paInvalidChannelCount;
+ bitsPerOutputSample = 0;
+ }
+
+ if( callback == NULL ) return paNullCallback;
+
+ /* Allocate and clear stream structure. */
+ past = (internalPortAudioStream *) PaHost_AllocateFastMemory( sizeof(internalPortAudioStream) );
+ if( past == NULL ) return paInsufficientMemory;
+ memset( past, 0, sizeof(internalPortAudioStream) );
+ AddTraceMessage("Pa_OpenStream: past", (long) past );
+
+ past->past_Magic = PA_MAGIC; /* Set ID to catch bugs. */
+ past->past_FramesPerUserBuffer = framesPerBuffer;
+ past->past_NumUserBuffers = numberOfBuffers; /* NOTE - PaHost_OpenStream() NMUST CHECK FOR ZERO! */
+ past->past_Callback = callback;
+ past->past_UserData = userData;
+ past->past_OutputSampleFormat = outputSampleFormat;
+ past->past_InputSampleFormat = inputSampleFormat;
+ past->past_OutputDeviceID = outputDeviceID;
+ past->past_InputDeviceID = inputDeviceID;
+ past->past_NumInputChannels = numInputChannels;
+ past->past_NumOutputChannels = numOutputChannels;
+ past->past_Flags = streamFlags;
+
+ /* Check for absurd sample rates. */
+ if( (sampleRate < 1000.0) || (sampleRate > 200000.0) )
+ {
+ result = paInvalidSampleRate;
+ goto cleanup;
+ }
+
+ /* Allocate buffers that may be used for format conversion from user to native buffers. */
+ if( numInputChannels > 0 )
+ {
+
+#if PA_VALIDATE_RATE
+ result = PaHost_ValidateSampleRate( inputDeviceID, sampleRate, &past->past_SampleRate );
+ if( result < 0 )
+ {
+ goto cleanup;
+ }
+#else
+ past->past_SampleRate = sampleRate;
+#endif
+ /* Allocate single Input buffer. */
+ past->past_InputBufferSize = framesPerBuffer * numInputChannels * ((bitsPerInputSample+7) / 8);
+ past->past_InputBuffer = PaHost_AllocateFastMemory(past->past_InputBufferSize);
+ if( past->past_InputBuffer == NULL )
+ {
+ result = paInsufficientMemory;
+ goto cleanup;
+ }
+ }
+ else
+ {
+ past->past_InputBuffer = NULL;
+ }
+
+ /* Allocate single Output buffer. */
+ if( numOutputChannels > 0 )
+ {
+#if PA_VALIDATE_RATE
+ result = PaHost_ValidateSampleRate( outputDeviceID, sampleRate, &past->past_SampleRate );
+ if( result < 0 )
+ {
+ goto cleanup;
+ }
+#else
+ past->past_SampleRate = sampleRate;
+#endif
+ past->past_OutputBufferSize = framesPerBuffer * numOutputChannels * ((bitsPerOutputSample+7) / 8);
+ past->past_OutputBuffer = PaHost_AllocateFastMemory(past->past_OutputBufferSize);
+ if( past->past_OutputBuffer == NULL )
+ {
+ result = paInsufficientMemory;
+ goto cleanup;
+ }
+ }
+ else
+ {
+ past->past_OutputBuffer = NULL;
+ }
+
+ result = PaHost_OpenStream( past );
+ if( result < 0 ) goto cleanup;
+
+ *streamPtrPtr = (void *) past;
+
+ return result;
+
+cleanup:
+ if( past != NULL ) Pa_CloseStream( past );
+ *streamPtrPtr = NULL;
+ return result;
+}
+
+
+/*************************************************************************/
+DLL_API PaError Pa_OpenDefaultStream( PortAudioStream** stream,
+ int numInputChannels,
+ int numOutputChannels,
+ PaSampleFormat sampleFormat,
+ double sampleRate,
+ unsigned long framesPerBuffer,
+ unsigned long numberOfBuffers,
+ PortAudioCallback *callback,
+ void *userData )
+{
+ return Pa_OpenStream(
+ stream,
+ ((numInputChannels > 0) ? Pa_GetDefaultInputDeviceID() : paNoDevice),
+ numInputChannels, sampleFormat, NULL,
+ ((numOutputChannels > 0) ? Pa_GetDefaultOutputDeviceID() : paNoDevice),
+ numOutputChannels, sampleFormat, NULL,
+ sampleRate, framesPerBuffer, numberOfBuffers, paNoFlag, callback, userData );
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_CloseStream( PortAudioStream* stream)
+{
+ PaError result;
+ internalPortAudioStream *past;
+
+ DBUG(("Pa_CloseStream()\n"));
+ if( stream == NULL ) return paBadStreamPtr;
+ past = (internalPortAudioStream *) stream;
+
+ Pa_AbortStream( past );
+ result = PaHost_CloseStream( past );
+
+ if( past->past_InputBuffer ) PaHost_FreeFastMemory( past->past_InputBuffer, past->past_InputBufferSize );
+ if( past->past_OutputBuffer ) PaHost_FreeFastMemory( past->past_OutputBuffer, past->past_OutputBufferSize );
+ PaHost_FreeFastMemory( past, sizeof(internalPortAudioStream) );
+
+ return result;
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_StartStream( PortAudioStream *stream )
+{
+ PaError result = paHostError;
+ internalPortAudioStream *past;
+
+ if( stream == NULL ) return paBadStreamPtr;
+ past = (internalPortAudioStream *) stream;
+
+ past->past_FrameCount = 0.0;
+
+ if( past->past_NumInputChannels > 0 )
+ {
+ result = PaHost_StartInput( past );
+ DBUG(("Pa_StartStream: PaHost_StartInput returned = 0x%X.\n", result));
+ if( result < 0 ) goto error;
+ }
+
+ if( past->past_NumOutputChannels > 0 )
+ {
+ result = PaHost_StartOutput( past );
+ DBUG(("Pa_StartStream: PaHost_StartOutput returned = 0x%X.\n", result));
+ if( result < 0 ) goto error;
+ }
+
+ result = PaHost_StartEngine( past );
+ DBUG(("Pa_StartStream: PaHost_StartEngine returned = 0x%X.\n", result));
+ if( result < 0 ) goto error;
+
+ return paNoError;
+
+error:
+ return result;
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_StopStream( PortAudioStream *stream )
+{
+ return Pa_KillStream( stream, 0 );
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_AbortStream( PortAudioStream *stream )
+{
+ return Pa_KillStream( stream, 1 );
+}
+
+/*************************************************************************/
+static PaError Pa_KillStream( PortAudioStream *stream, int abort )
+{
+ PaError result = paNoError;
+ internalPortAudioStream *past;
+
+ DBUG(("Pa_StopStream().\n"));
+ if( stream == NULL ) return paBadStreamPtr;
+ past = (internalPortAudioStream *) stream;
+
+ if( (past->past_NumInputChannels > 0) || (past->past_NumOutputChannels > 0) )
+ {
+ result = PaHost_StopEngine( past, abort );
+ DBUG(("Pa_StopStream: PaHost_StopEngine returned = 0x%X.\n", result));
+ if( result < 0 ) goto error;
+ }
+
+ if( past->past_NumInputChannels > 0 )
+ {
+ result = PaHost_StopInput( past, abort );
+ DBUG(("Pa_StopStream: PaHost_StopInput returned = 0x%X.\n", result));
+ if( result != paNoError ) goto error;
+ }
+
+ if( past->past_NumOutputChannels > 0 )
+ {
+ result = PaHost_StopOutput( past, abort );
+ DBUG(("Pa_StopStream: PaHost_StopOutput returned = 0x%X.\n", result));
+ if( result != paNoError ) goto error;
+ }
+
+error:
+ past->past_Usage = 0;
+ past->past_IfLastExitValid = 0;
+
+ return result;
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_StreamActive( PortAudioStream *stream )
+{
+ internalPortAudioStream *past;
+ if( stream == NULL ) return paBadStreamPtr;
+ past = (internalPortAudioStream *) stream;
+ return PaHost_StreamActive( past );
+}
+
+/*************************************************************************/
+DLL_API const char *Pa_GetErrorText( PaError errnum )
+{
+ const char *msg;
+
+ switch(errnum)
+ {
+ case paNoError: msg = "Success"; break;
+ case paHostError: msg = "Host error."; break;
+ case paInvalidChannelCount: msg = "Invalid number of channels."; break;
+ case paInvalidSampleRate: msg = "Invalid sample rate."; break;
+ case paInvalidDeviceId: msg = "Invalid device ID."; break;
+ case paInvalidFlag: msg = "Invalid flag."; break;
+ case paSampleFormatNotSupported: msg = "Sample format not supported"; break;
+ case paBadIODeviceCombination: msg = "Illegal combination of I/O devices."; break;
+ case paInsufficientMemory: msg = "Insufficient memory."; break;
+ case paBufferTooBig: msg = "Buffer too big."; break;
+ case paBufferTooSmall: msg = "Buffer too small."; break;
+ case paNullCallback: msg = "No callback routine specified."; break;
+ case paBadStreamPtr: msg = "Invalid stream pointer."; break;
+ case paTimedOut : msg = "Wait Timed Out."; break;
+ case paInternalError: msg = "Internal PortAudio Error."; break;
+ default: msg = "Illegal error number."; break;
+ }
+ return msg;
+}
+
+/*
+ Get CPU Load as a fraction of total CPU time.
+ A value of 0.5 would imply that PortAudio and the sound generating
+ callback was consuming roughly 50% of the available CPU time.
+ The amount may vary depending on CPU load.
+ This function may be called from the callback function.
+*/
+DLL_API double Pa_GetCPULoad( PortAudioStream* stream)
+{
+ internalPortAudioStream *past;
+ if( stream == NULL ) return (double) paBadStreamPtr;
+ past = (internalPortAudioStream *) stream;
+ return past->past_Usage;
+}
+
+/*************************************************************
+** Calculate 2 LSB dither signal with a triangular distribution.
+** Ranged properly for adding to a 32 bit integer prior to >>15.
+*/
+#define DITHER_BITS (15)
+#define DITHER_SCALE (1.0f / ((1<<DITHER_BITS)-1))
+static long Pa_TriangularDither( void )
+{
+ static unsigned long previous = 0;
+ static unsigned long randSeed1 = 22222;
+ static unsigned long randSeed2 = 5555555;
+ long current, highPass;
+ /* Generate two random numbers. */
+ randSeed1 = (randSeed1 * 196314165) + 907633515;
+ randSeed2 = (randSeed2 * 196314165) + 907633515;
+ /* Generate triangular distribution about 0. */
+ current = (((long)randSeed1)>>(32-DITHER_BITS)) + (((long)randSeed2)>>(32-DITHER_BITS));
+ /* High pass filter to reduce audibility. */
+ highPass = current - previous;
+ previous = current;
+ return highPass;
+}
+
+/*************************************************************************
+** Called by host code.
+** Convert input from Int16, call user code, then convert output
+** to Int16 format for native use.
+** Assumes host native format is paInt16.
+** Returns result from user callback.
+*/
+long Pa_CallConvertInt16( internalPortAudioStream *past,
+ short *nativeInputBuffer,
+ short *nativeOutputBuffer )
+{
+ long temp;
+ long bytesEmpty = 0;
+ long bytesFilled = 0;
+ int userResult;
+ unsigned int i;
+ void *inputBuffer = NULL;
+ void *outputBuffer = NULL;
+
+#if SUPPORT_AUDIO_CAPTURE
+ /* Get native data from DirectSound. */
+ if( (past->past_NumInputChannels > 0) && (nativeInputBuffer != NULL) )
+ {
+ /* Convert from native format to PA format. */
+ unsigned int samplesPerBuffer = past->past_FramesPerUserBuffer * past->past_NumInputChannels;
+ switch(past->past_InputSampleFormat)
+ {
+
+ case paFloat32:
+ {
+ float *inBufPtr = (float *) past->past_InputBuffer;
+ inputBuffer = past->past_InputBuffer;
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ inBufPtr[i] = nativeInputBuffer[i] * (1.0f / 32767.0f);
+ }
+ break;
+ }
+
+ case paInt32:
+ {
+ /* Convert 16 bit data to 32 bit integers */
+ int *inBufPtr = (int *) past->past_InputBuffer;
+ inputBuffer = past->past_InputBuffer;
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ inBufPtr[i] = nativeInputBuffer[i] << 16;
+ }
+ break;
+ }
+
+ case paInt16:
+ {
+ /* Already in correct format so don't copy. */
+ inputBuffer = nativeInputBuffer;
+ break;
+ }
+
+ case paInt8:
+ {
+ /* Convert 16 bit data to 8 bit chars */
+ char *inBufPtr = (char *) past->past_InputBuffer;
+ inputBuffer = past->past_InputBuffer;
+ if( past->past_Flags & paDitherOff )
+ {
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ inBufPtr[i] = (char)(nativeInputBuffer[i] >> 8);
+ }
+ }
+ else
+ {
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ temp = nativeInputBuffer[i];
+ temp += Pa_TriangularDither() >> 7;
+ temp = ((temp < -0x8000) ? -0x8000 : ((temp > 0x7FFF) ? 0x7FFF : temp));
+ inBufPtr[i] = (char)(temp >> 8);
+ }
+ }
+ break;
+ }
+
+ case paUInt8:
+ {
+ /* Convert 16 bit data to 8 bit unsigned chars */
+ unsigned char *inBufPtr = (unsigned char *) past->past_InputBuffer;
+ inputBuffer = past->past_InputBuffer;
+ if( past->past_Flags & paDitherOff )
+ {
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ inBufPtr[i] = ((unsigned char)(nativeInputBuffer[i] >> 8)) + 0x80;
+ }
+ }
+ else
+ {
+ /* If you dither then you have to clip because dithering could push the signal out of range! */
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ temp = nativeInputBuffer[i];
+ temp += Pa_TriangularDither() >> 7;
+ temp = ((temp < -0x8000) ? -0x8000 : ((temp > 0x7FFF) ? 0x7FFF : temp));
+ inBufPtr[i] = (unsigned char)(temp + 0x80);
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+#endif /* SUPPORT_AUDIO_CAPTURE */
+
+ /* Are we doing output time? */
+ if( (past->past_NumOutputChannels > 0) && (nativeOutputBuffer != NULL) )
+ {
+ /* May already be in native format so just write directly to native buffer. */
+ outputBuffer = (past->past_OutputSampleFormat == paInt16) ?
+ nativeOutputBuffer : past->past_OutputBuffer;
+ }
+ /*
+ AddTraceMessage("Pa_CallConvertInt16: inputBuffer = ", (int) inputBuffer );
+ AddTraceMessage("Pa_CallConvertInt16: outputBuffer = ", (int) outputBuffer );
+ */
+ /* Call user callback routine. */
+ userResult = past->past_Callback(
+ inputBuffer,
+ outputBuffer,
+ past->past_FramesPerUserBuffer,
+ past->past_FrameCount,
+ past->past_UserData );
+
+ past->past_FrameCount += (PaTimestamp) past->past_FramesPerUserBuffer;
+
+ /* Convert to native format if necessary. */
+ if( outputBuffer != NULL )
+ {
+ unsigned int samplesPerBuffer = past->past_FramesPerUserBuffer * past->past_NumOutputChannels;
+ switch(past->past_OutputSampleFormat)
+ {
+ case paFloat32:
+ {
+ float *outBufPtr = (float *) past->past_OutputBuffer;
+ if( past->past_Flags & paDitherOff )
+ {
+ if( past->past_Flags & paClipOff ) /* NOTHING */
+ {
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ *nativeOutputBuffer++ = (short) (outBufPtr[i] * (32767.0f));
+ }
+ }
+ else /* CLIP */
+ {
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ temp = (long)(outBufPtr[i] * 32767.0f);
+ *nativeOutputBuffer++ = (short)((temp < -0x8000) ? -0x8000 : ((temp > 0x7FFF) ? 0x7FFF : temp));
+ }
+ }
+ }
+ else
+ {
+ /* If you dither then you have to clip because dithering could push the signal out of range! */
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ float dither = Pa_TriangularDither()*DITHER_SCALE;
+ float dithered = (outBufPtr[i] * (32767.0f)) + dither;
+ temp = (long) (dithered);
+ *nativeOutputBuffer++ = (short)((temp < -0x8000) ? -0x8000 : ((temp > 0x7FFF) ? 0x7FFF : temp));
+ }
+ }
+ break;
+ }
+
+ case paInt32:
+ {
+ int *outBufPtr = (int *) past->past_OutputBuffer;
+ if( past->past_Flags & paDitherOff )
+ {
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ *nativeOutputBuffer++ = (short) (outBufPtr[i] >> 16 );
+ }
+ }
+ else
+ {
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ /* Shift one bit down before dithering so that we have room for overflow from add. */
+ temp = (outBufPtr[i] >> 1) + Pa_TriangularDither();
+ temp = temp >> 15;
+ *nativeOutputBuffer++ = (short)((temp < -0x8000) ? -0x8000 : ((temp > 0x7FFF) ? 0x7FFF : temp));
+ }
+ }
+ break;
+ }
+
+ case paInt8:
+ {
+ char *outBufPtr = (char *) past->past_OutputBuffer;
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ *nativeOutputBuffer++ = ((short)outBufPtr[i]) << 8;
+ }
+ break;
+ }
+
+ case paUInt8:
+ {
+ unsigned char *outBufPtr = (unsigned char *) past->past_OutputBuffer;
+ for( i=0; i<samplesPerBuffer; i++ )
+ {
+ *nativeOutputBuffer++ = ((short)(outBufPtr[i] - 0x80)) << 8;
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ }
+
+ return userResult;
+}
+
+/*************************************************************************
+** Called by host code.
+** Convert input from Float32, call user code, then convert output
+** to Float32 format for native use.
+** Assumes host native format is Float32.
+** Returns result from user callback.
+** FIXME - Unimplemented for formats other than paFloat32!!!!
+*/
+long Pa_CallConvertFloat32( internalPortAudioStream *past,
+ float *nativeInputBuffer,
+ float *nativeOutputBuffer )
+{
+ long bytesEmpty = 0;
+ long bytesFilled = 0;
+ int userResult;
+ void *inputBuffer = NULL;
+ void *outputBuffer = NULL;
+
+ /* Get native data from DirectSound. */
+ if( (past->past_NumInputChannels > 0) && (nativeInputBuffer != NULL) )
+ {
+ inputBuffer = nativeInputBuffer; // FIXME
+ }
+
+ /* Are we doing output time? */
+ if( (past->past_NumOutputChannels > 0) && (nativeOutputBuffer != NULL) )
+ {
+ /* May already be in native format so just write directly to native buffer. */
+ outputBuffer = (past->past_OutputSampleFormat == paFloat32) ?
+ nativeOutputBuffer : past->past_OutputBuffer;
+ }
+ /*
+ AddTraceMessage("Pa_CallConvertInt16: inputBuffer = ", (int) inputBuffer );
+ AddTraceMessage("Pa_CallConvertInt16: outputBuffer = ", (int) outputBuffer );
+ */
+ /* Call user callback routine. */
+ userResult = past->past_Callback(
+ inputBuffer,
+ outputBuffer,
+ past->past_FramesPerUserBuffer,
+ past->past_FrameCount,
+ past->past_UserData );
+
+ past->past_FrameCount += (PaTimestamp) past->past_FramesPerUserBuffer;
+
+ /* Convert to native format if necessary. */ // FIXME
+ return userResult;
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_Initialize( void )
+{
+ if( gInitCount++ > 0 ) return paNoError;
+ ResetTraceMessages();
+ return PaHost_Init();
+}
+
+DLL_API PaError Pa_Terminate( void )
+{
+ PaError result = paNoError;
+
+ if( gInitCount == 0 ) return paNoError;
+ else if( --gInitCount == 0 )
+ {
+ result = PaHost_Term();
+ DumpTraceMessages();
+ }
+ return result;
+}
+
+/*************************************************************************/
+DLL_API PaError Pa_GetSampleSize( PaSampleFormat format )
+{
+ int size;
+ switch(format )
+ {
+
+ case paUInt8:
+ case paInt8:
+ size = 1;
+ break;
+
+ case paInt16:
+ size = 2;
+ break;
+
+ case paPackedInt24:
+ size = 3;
+ break;
+
+ case paFloat32:
+ case paInt32:
+ case paInt24:
+ size = 4;
+ break;
+
+ default:
+ size = paSampleFormatNotSupported;
+ break;
+ }
+ return (PaError) size;
+}
+
+
diff --git a/pd/portaudio/pa_dll_switch/portaudio.h b/pd/portaudio/pa_dll_switch/portaudio.h
new file mode 100644
index 00000000..9632521e
--- /dev/null
+++ b/pd/portaudio/pa_dll_switch/portaudio.h
@@ -0,0 +1,439 @@
+#ifndef PORT_AUDIO_H
+#define PORT_AUDIO_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/*
+ * PortAudio Portable Real-Time Audio Library
+ * PortAudio API Header File
+ * Latest version available at: http://www.audiomulch.com/portaudio/
+ *
+ * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * Any person wishing to distribute modifications to the Software is
+ * requested to send the modifications to the original developer so that
+ * they can be incorporated into the canonical version.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+// added by zplane.developement in order to generate a DLL
+
+#if defined(PA_MME_EXPORTS) || defined(PA_DX_EXPORTS)
+#define DLL_API __declspec( dllexport )
+#elif defined(_LIB) || defined(_STATIC_LINK) || defined(_STATIC_APP)
+#define DLL_API
+#else
+#define DLL_API __declspec(dllexport)
+#endif
+
+
+typedef int PaError;
+typedef enum {
+ paNoError = 0,
+
+ paHostError = -10000,
+ paInvalidChannelCount,
+ paInvalidSampleRate,
+ paInvalidDeviceId,
+ paInvalidFlag,
+ paSampleFormatNotSupported,
+ paBadIODeviceCombination,
+ paInsufficientMemory,
+ paBufferTooBig,
+ paBufferTooSmall,
+ paNullCallback,
+ paBadStreamPtr,
+ paTimedOut,
+ paInternalError
+} PaErrorNum;
+
+/*
+ Pa_Initialize() is the library initialisation function - call this before
+ using the library.
+*/
+
+DLL_API PaError Pa_Initialize( void );
+
+/*
+ Pa_Terminate() is the library termination function - call this after
+ using the library.
+*/
+
+DLL_API PaError Pa_Terminate( void );
+
+/*
+ Return host specific error.
+ This can be called after receiving a paHostError.
+*/
+DLL_API long Pa_GetHostError( void );
+
+/*
+ Translate the error number into a human readable message.
+*/
+DLL_API const char *Pa_GetErrorText( PaError errnum );
+
+/*
+ Sample formats
+
+ These are formats used to pass sound data between the callback and the
+ stream. Each device has a "native" format which may be used when optimum
+ efficiency or control over conversion is required.
+
+ Formats marked "always available" are supported (emulated) by all devices.
+
+ The floating point representation uses +1.0 and -1.0 as the respective
+ maximum and minimum.
+
+*/
+
+typedef unsigned long PaSampleFormat;
+#define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/
+#define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/
+#define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/
+#define paInt24 ((PaSampleFormat) (1<<3))
+#define paPackedInt24 ((PaSampleFormat) (1<<4))
+#define paInt8 ((PaSampleFormat) (1<<5))
+#define paUInt8 ((PaSampleFormat) (1<<6)) /* unsigned 8 bit, 128 is "ground" */
+#define paCustomFormat ((PaSampleFormat) (1<<16))
+
+/*
+ Device enumeration mechanism.
+
+ Device ids range from 0 to Pa_CountDevices()-1.
+
+ Devices may support input, output or both. Device 0 is always the "default"
+ device and should support at least stereo in and out if that is available
+ on the taget platform _even_ if this involves kludging an input/output
+ device on platforms that usually separate input from output. Other platform
+ specific devices are specified by positive device ids.
+*/
+
+typedef int PaDeviceID;
+#define paNoDevice -1
+
+typedef struct
+{
+ int structVersion;
+ const char *name;
+ int maxInputChannels;
+ int maxOutputChannels;
+ /* Number of discrete rates, or -1 if range supported. */
+ int numSampleRates;
+ /* Array of supported sample rates, or {min,max} if range supported. */
+ const double *sampleRates;
+ PaSampleFormat nativeSampleFormats;
+}
+PaDeviceInfo;
+
+
+DLL_API int Pa_CountDevices();
+/*
+ Pa_GetDefaultInputDeviceID(), Pa_GetDefaultOutputDeviceID()
+
+ Return the default device ID or paNoDevice if there is no devices.
+ The result can be passed to Pa_OpenStream().
+
+ On the PC, the user can specify a default device by
+ setting an environment variable. For example, to use device #1.
+
+ set PA_RECOMMENDED_OUTPUT_DEVICE=1
+
+ The user should first determine the available device ID by using
+ the supplied application "pa_devs".
+*/
+DLL_API PaDeviceID Pa_GetDefaultInputDeviceID( void );
+DLL_API PaDeviceID Pa_GetDefaultOutputDeviceID( void );
+
+/*
+ PaTimestamp is used to represent a continuous sample clock with arbitrary
+ start time useful for syncronisation. The type is used in the outTime
+ argument to the callback function and the result of Pa_StreamTime()
+*/
+
+typedef double PaTimestamp;
+
+/*
+ Pa_GetDeviceInfo() returns a pointer to an immutable PaDeviceInfo structure
+ referring to the device specified by id.
+ If id is out of range the function returns NULL.
+
+ The returned structure is owned by the PortAudio implementation and must
+ not be manipulated or freed. The pointer is guaranteed to be valid until
+ between calls to Pa_Initialize() and Pa_Terminate().
+*/
+
+DLL_API const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID id );
+
+/*
+ PortAudioCallback is implemented by clients of the portable audio api.
+
+ inputBuffer and outputBuffer are arrays of interleaved samples,
+ the format, packing and number of channels used by the buffers are
+ determined by parameters to Pa_OpenStream() (see below).
+
+ framesPerBuffer is the number of sample frames to be processed by the callback.
+
+ outTime is the time in samples when the buffer(s) processed by
+ this callback will begin being played at the audio output.
+ See also Pa_StreamTime()
+
+ userData is the value of a user supplied pointer passed to Pa_OpenStream()
+ intended for storing synthesis data etc.
+
+ return value:
+ The callback can return a nonzero value to stop the stream. This may be
+ useful in applications such as soundfile players where a specific duration
+ of output is required. However, it is not necessary to utilise this mechanism
+ as StopStream() will also terminate the stream. A callback returning a
+ nonzero value must fill the entire outputBuffer.
+
+ NOTE: None of the other stream functions may be called from within the
+ callback function except for Pa_GetCPULoad().
+
+*/
+
+typedef int (PortAudioCallback)(
+ void *inputBuffer, void *outputBuffer,
+ unsigned long framesPerBuffer,
+ PaTimestamp outTime, void *userData );
+
+
+/*
+ Stream flags
+
+ These flags may be supplied (ored together) in the streamFlags argument to
+ the Pa_OpenStream() function.
+
+ [ suggestions? ]
+*/
+
+#define paNoFlag (0)
+#define paClipOff (1<<0) /* disable defult clipping of out of range samples */
+#define paDitherOff (1<<1) /* disable default dithering */
+#define paPlatformSpecificFlags (0x00010000)
+typedef unsigned long PaStreamFlags;
+
+/*
+ A single PortAudioStream provides multiple channels of real-time
+ input and output audio streaming to a client application.
+ Pointers to PortAudioStream objects are passed between PortAudio functions.
+*/
+
+typedef void PortAudioStream;
+#define PaStream PortAudioStream
+
+/*
+ Pa_OpenStream() opens a stream for either input, output or both.
+
+ stream is the address of a PortAudioStream pointer which will receive
+ a pointer to the newly opened stream.
+
+ inputDevice is the id of the device used for input (see PaDeviceID above.)
+ inputDevice may be paNoDevice to indicate that an input device is not required.
+
+ numInputChannels is the number of channels of sound to be delivered to the
+ callback. It can range from 1 to the value of maxInputChannels in the
+ device input record for the device specified in the inputDevice parameter.
+ If inputDevice is paNoDevice numInputChannels is ignored.
+
+ inputSampleFormat is the format of inputBuffer provided to the callback
+ function. inputSampleFormat may be any of the formats described by the
+ PaSampleFormat enumeration (see above). PortAudio guarantees support for
+ the sound devices native formats (nativeSampleFormats in the device info
+ record) and additionally 16 and 32 bit integer and 32 bit floating point
+ formats. Support for other formats is implementation defined.
+
+ inputDriverInfo is a pointer to an optional driver specific data structure
+ containing additional information for device setup or stream processing.
+ inputDriverInfo is never required for correct operation. If not used
+ inputDriverInfo should be NULL.
+
+ outputDevice is the id of the device used for output (see PaDeviceID above.)
+ outputDevice may be paNoDevice to indicate that an output device is not required.
+
+ numOutputChannels is the number of channels of sound to be supplied by the
+ callback. See the definition of numInputChannels above for more details.
+
+ outputSampleFormat is the sample format of the outputBuffer filled by the
+ callback function. See the definition of inputSampleFormat above for more
+ details.
+
+ outputDriverInfo is a pointer to an optional driver specific data structure
+ containing additional information for device setup or stream processing.
+ outputDriverInfo is never required for correct operation. If not used
+ outputDriverInfo should be NULL.
+
+ sampleRate is the desired sampleRate for input and output
+
+ framesPerBuffer is the length in sample frames of all internal sample buffers
+ used for communication with platform specific audio routines. Wherever
+ possible this corresponds to the framesPerBuffer parameter passed to the
+ callback function.
+
+ numberOfBuffers is the number of buffers used for multibuffered
+ communication with the platform specific audio routines. This parameter is
+ provided only as a guide - and does not imply that an implementation must
+ use multibuffered i/o when reliable double buffering is available (such as
+ SndPlayDoubleBuffer() on the Macintosh.)
+
+ streamFlags may contain a combination of flags ORed together.
+ These flags modify the behavior of the
+ streaming process. Some flags may only be relevant to certain buffer formats.
+
+ callback is a pointer to a client supplied function that is responsible
+ for processing and filling input and output buffers (see above for details.)
+
+ userData is a client supplied pointer which is passed to the callback
+ function. It could for example, contain a pointer to instance data necessary
+ for processing the audio buffers.
+
+ return value:
+ Apon success Pa_OpenStream() returns PaNoError and places a pointer to a
+ valid PortAudioStream in the stream argument. The stream is inactive (stopped).
+ If a call to Pa_OpenStream() fails a nonzero error code is returned (see
+ PAError above) and the value of stream is invalid.
+
+*/
+
+DLL_API PaError Pa_OpenStream( PortAudioStream** stream,
+ PaDeviceID inputDevice,
+ int numInputChannels,
+ PaSampleFormat inputSampleFormat,
+ void *inputDriverInfo,
+ PaDeviceID outputDevice,
+ int numOutputChannels,
+ PaSampleFormat outputSampleFormat,
+ void *outputDriverInfo,
+ double sampleRate,
+ unsigned long framesPerBuffer,
+ unsigned long numberOfBuffers,
+ PaStreamFlags streamFlags,
+ PortAudioCallback *callback,
+ void *userData );
+
+
+/*
+ Pa_OpenDefaultStream() is a simplified version of Pa_OpenStream() that
+ opens the default input and/or ouput devices. Most parameters have
+ identical meaning to their Pa_OpenStream() counterparts, with the following
+ exceptions:
+
+ If either numInputChannels or numOutputChannels is 0 the respective device
+ is not opened (same as passing paNoDevice in the device arguments to Pa_OpenStream() )
+
+ sampleFormat applies to both the input and output buffers.
+*/
+
+DLL_API PaError Pa_OpenDefaultStream( PortAudioStream** stream,
+ int numInputChannels,
+ int numOutputChannels,
+ PaSampleFormat sampleFormat,
+ double sampleRate,
+ unsigned long framesPerBuffer,
+ unsigned long numberOfBuffers,
+ PortAudioCallback *callback,
+ void *userData );
+
+/*
+ Pa_CloseStream() closes an audio stream, flushing any pending buffers.
+*/
+
+DLL_API PaError Pa_CloseStream( PortAudioStream* );
+
+/*
+ Pa_StartStream() and Pa_StopStream() begin and terminate audio processing.
+ When Pa_StopStream() returns, all pending audio buffers have been played.
+ Pa_AbortStream() stops playing immediately without waiting for pending
+ buffers to complete.
+*/
+
+DLL_API PaError Pa_StartStream( PortAudioStream *stream );
+
+DLL_API PaError Pa_StopStream( PortAudioStream *stream );
+
+DLL_API PaError Pa_AbortStream( PortAudioStream *stream );
+
+/*
+ Pa_StreamActive() returns one when the stream is playing audio,
+ zero when not playing, or a negative error number if the
+ stream is invalid.
+ The stream is active between calls to Pa_StartStream() and Pa_StopStream(),
+ but may also become inactive if the callback returns a non-zero value.
+ In the latter case, the stream is considered inactive after the last
+ buffer has finished playing.
+*/
+
+DLL_API PaError Pa_StreamActive( PortAudioStream *stream );
+
+/*
+ Pa_StreamTime() returns the current output time for the stream in samples.
+ This time may be used as a time reference (for example syncronising audio to
+ MIDI).
+*/
+
+DLL_API PaTimestamp Pa_StreamTime( PortAudioStream *stream );
+
+/*
+ The "CPU Load" is a fraction of total CPU time consumed by the
+ stream's audio processing.
+ A value of 0.5 would imply that PortAudio and the sound generating
+ callback was consuming roughly 50% of the available CPU time.
+ This function may be called from the callback function or the application.
+*/
+DLL_API double Pa_GetCPULoad( PortAudioStream* stream );
+
+/*
+ Use Pa_GetMinNumBuffers() to determine minimum number of buffers required for
+ the current host based on minimum latency.
+ On the PC, for the DirectSound implementation, latency can be optionally set
+ by user by setting an environment variable.
+ For example, to set latency to 200 msec, put:
+
+ set PA_MIN_LATENCY_MSEC=200
+
+ in the AUTOEXEC.BAT file and reboot.
+ If the environment variable is not set, then the latency will be determined
+ based on the OS. Windows NT has higher latency than Win95.
+*/
+
+DLL_API int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate );
+
+/*
+ Sleep for at least 'msec' milliseconds.
+ You may sleep longer than the requested time so don't rely
+ on this for accurate musical timing.
+*/
+DLL_API void Pa_Sleep( long msec );
+
+/*
+ Return size in bytes of a single sample in a given PaSampleFormat
+ or paSampleFormatNotSupported.
+*/
+DLL_API PaError Pa_GetSampleSize( PaSampleFormat format );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* PORT_AUDIO_H */
diff --git a/pd/src/config.h.in b/pd/src/config.h.in
new file mode 100644
index 00000000..cf88ef4a
--- /dev/null
+++ b/pd/src/config.h.in
@@ -0,0 +1,5 @@
+
+#undef HAVE_ALLOCA
+
+#undef HAVE_ALLOCA_H
+