diff --git a/doc/pddp/output~-help.pd b/doc/pddp/output~-help.pd
index c16b3f0403bcaa3541d7ed1a7af9a7bae4bac992..975e493b9614a37ea9ca264d5b7f79322099ccbc 100644
--- a/doc/pddp/output~-help.pd
+++ b/doc/pddp/output~-help.pd
@@ -1,88 +1,352 @@
-#N canvas 429 35 555 619 10;
-#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+#N canvas 239 54 554 574 10;
+#X obj 1 171 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
 14 -228856 -66577 0;
-#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header output~ 3 12 0 18
--204280 -1 0;
-#X obj 0 307 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
--228856 -1 0;
-#N canvas 483 261 494 368 META 0;
+#X obj 1 -398 cnv 15 552 40 empty \$0-pddp.cnv.header output~ 3 12
+0 18 -204280 -1 0;
+#N canvas 483 261 380 289 META 0;
 #X text 12 225 WEBSITE http://crca.ucsd.edu/~msp/;
-#X text 12 265 HELP_PATCH_AUTHORS Jonathan Wilkes;
-#X text 12 205 AUTHOR Hans Christoph Steiner;
 #X text 12 5 KEYWORDS signal abstraction;
 #X text 12 25 LICENSE GPL;
-#X text 12 45 DESCRIPTION gui volume and DSP control;
 #X text 12 65 INLET_0 signal;
 #X text 12 85 INLET_1 signal;
 #X text 12 105 INLET_2 float;
 #X text 12 125 OUTLET_0 signal;
 #X text 12 145 OUTLET_1 signal;
 #X text 12 165 OUTLET_2 float;
-#X text 12 245 RELEASE_DATE 2009;
-#X text 12 185 LIBRARY PDDP;
-#X restore 500 597 pd META;
-#X obj 0 401 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
-13 -228856 -1 0;
-#X obj 0 498 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
-0 13 -228856 -1 0;
-#X obj 0 526 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+#X text 12 205 AUTHOR Alexandre Torres Porres;
+#X text 12 265 HELP_PATCH_AUTHOR Alexandre Torres Porres;
+#X text 12 45 DESCRIPTION gui / stereo out / gain / DSP control;
+#X text 12 245 RELEASE_DATE 2016;
+#X text 11 185 LIBRARY none;
+#X restore 501 173 pd META;
+#X obj 1 101 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
 0 13 -228856 -1 0;
-#X text 98 502 (none);
-#N canvas 216 518 428 109 Related_objects 0;
+#N canvas 667 486 418 179 Related_objects 0;
+#X obj 86 100 pddp/pddplink ../3.audio.examples/A05.output.subpatch.pd
+-text doc/3.audio.examples/A05.output.subpatch.pd;
 #X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
 14 -204280 -1 0;
-#X obj 29 38 dac~;
+#X obj 43 39 dac~;
 #X text 8 2 [output~] Related Objects;
-#X obj 26 61 pddp/helplink pddp/dsp;
-#X restore 102 597 pd Related_objects;
-#X obj 78 316 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+#X text 25 73 A related abstraction is found in the audio tutorials:
+;
+#X text 26 131 Similar work made in pddp and Pd-Extended was based
+on this abstraction model \, resulting now in Pd-l2ork's version of
+[output~];
+#X restore 103 174 pd Related_objects;
+#X text 309 -232 <= mute button;
+#X text 124 -246 click & drag slider ======>, f 14;
+#X obj 1 -199 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 1 -27 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 1 46 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 80 -189 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 6 0 16 -228856
 -162280 0;
-#X obj 78 410 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856
+#X obj 80 -19 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 6 0 16 -228856
 -162280 0;
-#X obj 78 342 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+#X obj 80 -167 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 6 0 16 -228856
 -162280 0;
-#X obj 107 167 osc~ 200;
-#X obj 377 170 noise~;
-#X obj 106 205 output~;
-#X obj 376 205 output~;
-#X text 174 227 <- mute;
-#X text 176 208 <- dsp toggle (green = on );
-#X text 98 315 signal;
-#X text 98 341 signal;
-#X obj 78 367 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+#X text 128 -189 signal;
+#X text 128 -167 signal;
+#X obj 80 -144 cnv 17 3 110 empty \$0-pddp.cnv.let.2 2 5 6 0 16 -228856
 -162280 0;
-#X text 98 366 float;
-#X text 167 366 - the right inlet can be used to set the volume (range
-is 0-1).;
-#X text 98 409 signal;
-#X obj 78 440 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 9 0 16 -228856
+#X text 134 -144 float;
+#X text 127 -19 signal;
+#X obj 80 3 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 6 0 16 -228856
 -162280 0;
-#X text 98 439 signal;
-#X obj 78 470 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 9 0 16 -228856
+#X text 127 4 signal;
+#X obj 80 24 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 6 0 16 -228856
 -162280 0;
-#X text 98 469 float;
-#X text 90 101 The [output~] abstraction is a user-friendly GUI substitute
-for [dac~] \, with controls for "compute audio" \, volume \, and a
-mute button.;
-#X text 99 530 This object is used in the audio tutorials \, and can
-be used in any patch to quickly hear and control the level of an audio
-signal.;
-#X text 11 23 GUI- volume and DSP control;
-#X text 168 315 - incoming signal which will be routed to the left
-channel.;
-#X text 167 341 - incoming signal which will be routed to the right
-channel.;
-#X text 168 469 - current volume level (range is from 0-1).;
-#X text 168 439 - the incoming signal from the middle inlet filtered
-and passed unchanged to this outlet.;
-#X text 168 409 - the incoming signal from the leftmost inlet is filtered
-and passed to this outlet.;
-#X obj 4 597 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+#X text 133 25 float;
+#X text 178 -189 - incoming signal routed to left channel output,
+f 60;
+#X text 178 -167 - incoming signal routed to right channel output,
+f 60;
+#X text 177 -19 - gain scaled output of left inlet, f 60;
+#X text 177 4 - gain scaled output of right inlet, f 60;
+#X text 177 25 - slider value (0-1), f 60;
+#X text 177 74 - scaling mode: 0 (quartic \, default) \, 1 (dB) or
+2 (linear), f 60;
+#X text 116 -65 <on/off>;
+#X text 98 -128 dac <float>;
+#X text 178 -128 - turns dac~ on <1> or off <0> (outlets not affected)
+, f 60;
+#X text 92 -114 gain <float>;
+#X text 178 -114 - sets linear gain multiplier (values <= 0 are ignored)
+, f 60;
+#X text 92 -49 ramp <float>;
+#X text 92 -98 mode <float>;
+#X text 178 -98 - scaling mode: 0 (quartic \, default) \, 1 (dB) or
+2 (linear), f 60;
+#X text 12 -375 GUI- stereo output \, gain adjuster & DSP control;
+#X obj 7 173 pddp/pddplink all_about_help_patches.pd -text Usage Guide
 ;
-#X obj 99 572 pddp/pddplink ../3.audio.examples/A05.output.subpatch.pd
--text doc/3.audio.examples/A05.output.subpatch.pd;
-#X obj 479 0 output~;
-#X connect 12 0 14 0;
-#X connect 12 0 14 1;
-#X connect 13 0 15 1;
-#X connect 13 0 15 0;
+#X text 491 -384 [output~];
+#N canvas 437 158 795 396 examples 0;
+#X obj 199 182 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -228856
+-1 -1 0 1;
+#X floatatom 199 202 5 0 0 0 - - -, f 5;
+#X floatatom 199 353 5 0 0 0 - - -, f 5;
+#X obj 116 354 env~;
+#X obj 157 353 env~;
+#X floatatom 157 378 4 0 0 0 - - -, f 4;
+#X floatatom 116 378 4 0 0 0 - - -, f 4;
+#X text 214 181 set slider (0-1);
+#X msg 260 256 on;
+#X msg 260 278 off;
+#X obj 250 210 tgl 15 0 empty empty empty 17 7 0 10 -228856 -1 -1 0
+1;
+#X msg 250 231 dac \$1;
+#X text 287 256 DSP on;
+#X text 286 279 DSP off;
+#X obj 116 228 osc~ 440;
+#X text 269 210 dac~ on/off;
+#X msg 535 218 mode \$1;
+#X obj 535 141 vradio 15 0 0 3 \$0-dummy \$0-dummy-set empty 0 -8 0
+10 -228856 -1 -1 0;
+#X text 519 156 dB;
+#X text 495 170 linear;
+#X floatatom 535 194 5 0 0 0 - - -, f 5;
+#X text 58 331 scaled => stereo output, f 9;
+#X text 204 330 <= slider value;
+#X obj 452 249 osc~ 440;
+#X msg 602 224 gain \$1;
+#X obj 602 198 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X obj 602 175 hsl 128 15 0.1 2 0 0 empty empty empty -2 -8 0 10 -228856
+-1 -1 0 1;
+#X floatatom 535 354 0 0 0 0 - - -;
+#X obj 452 355 env~;
+#X obj 493 354 env~;
+#X floatatom 493 379 4 0 0 0 - - -, f 4;
+#X floatatom 452 379 4 0 0 0 - - -, f 4;
+#X text 489 140 quartic;
+#X msg 639 312 ramp \$1;
+#X obj 639 286 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X text 406 72 You can also set a ramp time for the slider value \,
+the default is 20 ms and the minimum is 5 ms. This also affects the
+slider value input in the right outlet.;
+#X obj 614 255 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -228856
+-1 -1 0 1;
+#X text 631 254 set slider (0-1);
+#X text 406 11 [output~] has 3 scaling modes for its slider (the default
+is "quartic"). You can set a linear gain multiplier \, which needs
+to be greater than zero and also represents the maximum linear gain
+achieved.;
+#X msg 168 150 mute;
+#X text 202 151 mute button;
+#X obj 452 292 output~;
+#X obj 116 282 output~ 0;
+#X text 14 55 If you mute the abstraction \, it also affects the outlets
+and it sends no signal. So \, if you don't want to listen but need
+the signal through the outlets \, use the 1st argument or the "dac
+0" message into the right outlet - as it doesn't affect the outlets.
+Using [output~] without the dac~ is useful for gain adjustments only.
+;
+#X text 620 174 maximum gain;
+#X text 15 12 [output~] allows you to switch the DSP engine on or off
+\, dac~ output on or off and mute/unmute without any clicks!;
+#X text 561 139 <= slider scaling;
+#X connect 0 0 1 0;
+#X connect 1 0 42 2;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 8 0 42 2;
+#X connect 9 0 42 2;
+#X connect 10 0 11 0;
+#X connect 11 0 42 2;
+#X connect 14 0 42 0;
+#X connect 14 0 42 1;
+#X connect 16 0 41 2;
+#X connect 17 0 20 0;
+#X connect 20 0 16 0;
+#X connect 23 0 41 0;
+#X connect 23 0 41 1;
+#X connect 24 0 41 2;
+#X connect 25 0 24 0;
+#X connect 26 0 25 0;
+#X connect 28 0 31 0;
+#X connect 29 0 30 0;
+#X connect 33 0 41 2;
+#X connect 34 0 33 0;
+#X connect 36 0 41 2;
+#X connect 39 0 42 2;
+#X connect 41 0 28 0;
+#X connect 41 1 29 0;
+#X connect 41 2 27 0;
+#X connect 42 0 3 0;
+#X connect 42 1 4 0;
+#X connect 42 2 2 0;
+#X restore 468 -287 pd examples;
+#X obj 237 -289 osc~ 440;
+#X text 115 52 1) float;
+#X text 89 -346 The [output~] abstraction is a user-friendly gain adjuster
+and stereo output \, with controls for "compute audio" (DSP) \, volume
+\, gain multiplier \, mute \, dac~ and ramp time.;
+#X text 178 -144 - sets slider (range is clipped to 0-1), f 60;
+#X text 178 -49 - sets ramp time in ms for slider values (default 20)
+, f 60;
+#X obj 216 -252 output~;
+#X text 131 107 [output~] was originally in Pd Extended's extra folder
+as a variant of [ezoutput~] from PDDP. This is an improved \, redesigned
+and backwards compatible version for Pd-l2ork made by Alexandre Porres
+with extra features.;
+#X text 177 52 - [dac~]: <0>: no dac~ output \, <1>: dac~ output (default)
+, f 60;
+#X text 178 -65 - turns DSP Engine (Compute Audio) "On" or "Off",
+f 60;
+#X text 115 74 2) float, f 9;
+#X text 139 -82 mute;
+#X text 178 -82 - mute/unmute button, f 60;
+#N canvas 227 48 672 395 scaling 0;
+#X obj 29 54 cnv 15 198 198 empty empty empty 20 12 0 14 -253888 -66577
+0;
+#N canvas 0 22 452 302 (subpatch) 0;
+#X array \$0-dB 441 float 0 black black;
+#X array \$0-quartic 441 float 0 black black;
+#X array \$0-linear 441 float 0 black black;
+#X coords 0 1.01 440 0 200 200 1;
+#X restore 29 53 graph;
+#X text 96 130 linear;
+#X text 23 257 0;
+#X text 217 255 1;
+#X text 234 78 o;
+#X text 234 90 u;
+#X text 234 102 t;
+#X text 234 127 u;
+#X text 234 139 t;
+#X text 234 115 p;
+#X text 234 160 v;
+#X text 234 172 a;
+#X text 234 184 l;
+#X text 234 196 u;
+#X text 234 208 e;
+#X text 230 241 0;
+#X text 230 51 1;
+#X text 270 20 The graph to the left shows us how the scaling modes
+work. A linear scaling doesn't really do anything \, the input is the
+same as the output. We have then two non linear modes:;
+#X text 278 118 -;
+#X text 278 74 -;
+#X text 128 182 quartic;
+#X text 171 220 dB;
+#X obj 438 299 osc~ 440;
+#X msg 521 312 gain \$1;
+#X obj 386 207 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X obj 521 289 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X obj 438 342 output~;
+#X obj 521 175 vsl 15 80 0 2 0 0 empty empty empty 0 -9 0 10 -233017
+-1 -1 0 1;
+#X text 527 270 max gain;
+#X text 362 204 dB;
+#N canvas 264 70 391 161 db-to-linear 0;
+#X obj 52 69 expr pow(10 \, $f1 / 20);
+#X obj 52 30 inlet;
+#X obj 52 102 outlet;
+#X text 201 69 dBFS to linear amplitude;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X restore 386 233 pd db-to-linear;
+#X text 67 262 entry (slider) value;
+#X text 287 118 dB: This mode adopts a decibel scale with a range of
+100 dB (using the [dbtorms~] object).;
+#X text 22 303 The gain value is a simple multiplier to the output
+value of the slider and determines the maximum linear gain output regardless
+of the scaling mode. For example \, "2" will output the double of the
+input amplitude \, and "0.5" half of it. This is useful if your input
+isn't loud enough \, if it is too high or even if you're using multiple
+[output~] objects as they all add to the same output.;
+#X text 287 74 Quartic (default): This mode just gets the slider values
+to the power of 4 (so \, for instance \, an input slider value of 0.5
+becomes 0.125)., f 57;
+#N canvas 0 0 450 300 init-array 0;
+#X msg 71 41 441;
+#X obj 71 63 t a b;
+#X msg 112 85 0, f 4;
+#X obj 71 85 until;
+#X obj 71 117 f;
+#X obj 109 117 + 1;
+#X obj 71 232 / 441;
+#X obj 71 198 t a a;
+#X obj 330 164 t a a;
+#X obj 330 232 dbtorms;
+#X obj 198 212 / 441;
+#X obj 198 180 t a a;
+#X obj 198 234 pow 4;
+#X obj 330 208 / 4.41;
+#X obj 71 256 tabwrite \$0-linear;
+#X obj 198 256 tabwrite \$0-quartic;
+#X obj 71 18 loadbang;
+#X obj 330 256 tabwrite \$0-dB;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 1 1 2 0;
+#X connect 2 0 4 1;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 4 0 7 0;
+#X connect 4 0 8 0;
+#X connect 4 0 11 0;
+#X connect 5 0 4 1;
+#X connect 6 0 14 0;
+#X connect 7 0 6 0;
+#X connect 7 1 14 1;
+#X connect 8 0 13 0;
+#X connect 8 1 17 1;
+#X connect 9 0 17 0;
+#X connect 10 0 12 0;
+#X connect 11 0 10 0;
+#X connect 11 1 15 1;
+#X connect 12 0 15 0;
+#X connect 13 0 9 0;
+#X connect 16 0 0 0;
+#X restore 146 22 pd init-array;
+#X connect 23 0 27 0;
+#X connect 23 0 27 1;
+#X connect 24 0 27 2;
+#X connect 25 0 31 0;
+#X connect 26 0 24 0;
+#X connect 28 0 26 0;
+#X connect 31 0 26 0;
+#X restore 463 -241 pd scaling \; modes & gain;
+#X text 309 -249 <= dsp status/toggle;
+#N canvas 876 153 420 512 DSP 0;
+#X obj 120 295 osc~ 440;
+#X obj 120 341 output~;
+#X msg 203 285 on;
+#X msg 219 311 off;
+#X msg 168 96 \; pd dsp \$1;
+#X obj 168 68 tgl 20 0 empty empty empty 17 7 0 10 -216373 -1 -1 0
+1;
+#X text 212 344 <= click on the DSP status;
+#X text 24 142 These are the usual ways of doing this \, but the [output~]
+abstraction offers yet other options.;
+#X text 23 18 The DSP engine can be turned on and off in the main Pd
+window \, in the "Media" menu or inside a patch with this message to
+Pd:;
+#X text 23 191 First \, if the DSP is on when you load [output~] \,
+it checks the DSP state and loads the GUI accordingly \, where the
+top right corner shows the status as either "on" or "off". But this
+interface also acts as a toggle so you can click on it and change the
+status. Another way of doing that in the patch is with the "on" and
+"off" messages to the right inlet.;
+#X text 227 358 (it behaves as a toggle);
+#X text 31 411 Try the above [output~] abstraction as the only object
+sending signals to pd's output \, now change the DSP status with the
+volume up in one of the usual ways and with the interface provided
+by [output~] (via toggle or messages). You'll notice how changing the
+DSP status with [output~] does not 'click'! This is because it automatically
+fades in and out when turning it on and off!;
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
+#X connect 2 0 1 2;
+#X connect 3 0 1 2;
+#X connect 5 0 4 0;
+#X restore 456 -264 pd DSP status;
+#X connect 40 0 45 0;
+#X connect 40 0 45 1;
diff --git a/pd/extra/output~-help.pd b/pd/extra/output~-help.pd
index cd488364677980f21afba75f23b7c77e414975cc..975e493b9614a37ea9ca264d5b7f79322099ccbc 100644
--- a/pd/extra/output~-help.pd
+++ b/pd/extra/output~-help.pd
@@ -1,11 +1,352 @@
-#N canvas 103 48 450 300 10;
-#X obj 104 118 osc~ 200;
-#X obj 241 122 noise~;
-#X text 38 28 a GUI replacement for [dac~] with controls for "compute
-audio" \, volume \, and a mute button.;
-#X obj 91 166 output~;
-#X obj 220 165 output~;
-#X connect 0 0 3 0;
-#X connect 0 0 3 1;
-#X connect 1 0 4 1;
-#X connect 1 0 4 0;
+#N canvas 239 54 554 574 10;
+#X obj 1 171 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0
+14 -228856 -66577 0;
+#X obj 1 -398 cnv 15 552 40 empty \$0-pddp.cnv.header output~ 3 12
+0 18 -204280 -1 0;
+#N canvas 483 261 380 289 META 0;
+#X text 12 225 WEBSITE http://crca.ucsd.edu/~msp/;
+#X text 12 5 KEYWORDS signal abstraction;
+#X text 12 25 LICENSE GPL;
+#X text 12 65 INLET_0 signal;
+#X text 12 85 INLET_1 signal;
+#X text 12 105 INLET_2 float;
+#X text 12 125 OUTLET_0 signal;
+#X text 12 145 OUTLET_1 signal;
+#X text 12 165 OUTLET_2 float;
+#X text 12 205 AUTHOR Alexandre Torres Porres;
+#X text 12 265 HELP_PATCH_AUTHOR Alexandre Torres Porres;
+#X text 12 45 DESCRIPTION gui / stereo out / gain / DSP control;
+#X text 12 245 RELEASE_DATE 2016;
+#X text 11 185 LIBRARY none;
+#X restore 501 173 pd META;
+#X obj 1 101 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12
+0 13 -228856 -1 0;
+#N canvas 667 486 418 179 Related_objects 0;
+#X obj 86 100 pddp/pddplink ../3.audio.examples/A05.output.subpatch.pd
+-text doc/3.audio.examples/A05.output.subpatch.pd;
+#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
+14 -204280 -1 0;
+#X obj 43 39 dac~;
+#X text 8 2 [output~] Related Objects;
+#X text 25 73 A related abstraction is found in the audio tutorials:
+;
+#X text 26 131 Similar work made in pddp and Pd-Extended was based
+on this abstraction model \, resulting now in Pd-l2ork's version of
+[output~];
+#X restore 103 174 pd Related_objects;
+#X text 309 -232 <= mute button;
+#X text 124 -246 click & drag slider ======>, f 14;
+#X obj 1 -199 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13
+-228856 -1 0;
+#X obj 1 -27 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0
+13 -228856 -1 0;
+#X obj 1 46 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12
+0 13 -228856 -1 0;
+#X obj 80 -189 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 6 0 16 -228856
+-162280 0;
+#X obj 80 -19 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 6 0 16 -228856
+-162280 0;
+#X obj 80 -167 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 6 0 16 -228856
+-162280 0;
+#X text 128 -189 signal;
+#X text 128 -167 signal;
+#X obj 80 -144 cnv 17 3 110 empty \$0-pddp.cnv.let.2 2 5 6 0 16 -228856
+-162280 0;
+#X text 134 -144 float;
+#X text 127 -19 signal;
+#X obj 80 3 cnv 17 3 17 empty \$0-pddp.cnv.let.1 1 5 6 0 16 -228856
+-162280 0;
+#X text 127 4 signal;
+#X obj 80 24 cnv 17 3 17 empty \$0-pddp.cnv.let.2 2 5 6 0 16 -228856
+-162280 0;
+#X text 133 25 float;
+#X text 178 -189 - incoming signal routed to left channel output,
+f 60;
+#X text 178 -167 - incoming signal routed to right channel output,
+f 60;
+#X text 177 -19 - gain scaled output of left inlet, f 60;
+#X text 177 4 - gain scaled output of right inlet, f 60;
+#X text 177 25 - slider value (0-1), f 60;
+#X text 177 74 - scaling mode: 0 (quartic \, default) \, 1 (dB) or
+2 (linear), f 60;
+#X text 116 -65 <on/off>;
+#X text 98 -128 dac <float>;
+#X text 178 -128 - turns dac~ on <1> or off <0> (outlets not affected)
+, f 60;
+#X text 92 -114 gain <float>;
+#X text 178 -114 - sets linear gain multiplier (values <= 0 are ignored)
+, f 60;
+#X text 92 -49 ramp <float>;
+#X text 92 -98 mode <float>;
+#X text 178 -98 - scaling mode: 0 (quartic \, default) \, 1 (dB) or
+2 (linear), f 60;
+#X text 12 -375 GUI- stereo output \, gain adjuster & DSP control;
+#X obj 7 173 pddp/pddplink all_about_help_patches.pd -text Usage Guide
+;
+#X text 491 -384 [output~];
+#N canvas 437 158 795 396 examples 0;
+#X obj 199 182 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -228856
+-1 -1 0 1;
+#X floatatom 199 202 5 0 0 0 - - -, f 5;
+#X floatatom 199 353 5 0 0 0 - - -, f 5;
+#X obj 116 354 env~;
+#X obj 157 353 env~;
+#X floatatom 157 378 4 0 0 0 - - -, f 4;
+#X floatatom 116 378 4 0 0 0 - - -, f 4;
+#X text 214 181 set slider (0-1);
+#X msg 260 256 on;
+#X msg 260 278 off;
+#X obj 250 210 tgl 15 0 empty empty empty 17 7 0 10 -228856 -1 -1 0
+1;
+#X msg 250 231 dac \$1;
+#X text 287 256 DSP on;
+#X text 286 279 DSP off;
+#X obj 116 228 osc~ 440;
+#X text 269 210 dac~ on/off;
+#X msg 535 218 mode \$1;
+#X obj 535 141 vradio 15 0 0 3 \$0-dummy \$0-dummy-set empty 0 -8 0
+10 -228856 -1 -1 0;
+#X text 519 156 dB;
+#X text 495 170 linear;
+#X floatatom 535 194 5 0 0 0 - - -, f 5;
+#X text 58 331 scaled => stereo output, f 9;
+#X text 204 330 <= slider value;
+#X obj 452 249 osc~ 440;
+#X msg 602 224 gain \$1;
+#X obj 602 198 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X obj 602 175 hsl 128 15 0.1 2 0 0 empty empty empty -2 -8 0 10 -228856
+-1 -1 0 1;
+#X floatatom 535 354 0 0 0 0 - - -;
+#X obj 452 355 env~;
+#X obj 493 354 env~;
+#X floatatom 493 379 4 0 0 0 - - -, f 4;
+#X floatatom 452 379 4 0 0 0 - - -, f 4;
+#X text 489 140 quartic;
+#X msg 639 312 ramp \$1;
+#X obj 639 286 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X text 406 72 You can also set a ramp time for the slider value \,
+the default is 20 ms and the minimum is 5 ms. This also affects the
+slider value input in the right outlet.;
+#X obj 614 255 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -228856
+-1 -1 0 1;
+#X text 631 254 set slider (0-1);
+#X text 406 11 [output~] has 3 scaling modes for its slider (the default
+is "quartic"). You can set a linear gain multiplier \, which needs
+to be greater than zero and also represents the maximum linear gain
+achieved.;
+#X msg 168 150 mute;
+#X text 202 151 mute button;
+#X obj 452 292 output~;
+#X obj 116 282 output~ 0;
+#X text 14 55 If you mute the abstraction \, it also affects the outlets
+and it sends no signal. So \, if you don't want to listen but need
+the signal through the outlets \, use the 1st argument or the "dac
+0" message into the right outlet - as it doesn't affect the outlets.
+Using [output~] without the dac~ is useful for gain adjustments only.
+;
+#X text 620 174 maximum gain;
+#X text 15 12 [output~] allows you to switch the DSP engine on or off
+\, dac~ output on or off and mute/unmute without any clicks!;
+#X text 561 139 <= slider scaling;
+#X connect 0 0 1 0;
+#X connect 1 0 42 2;
+#X connect 3 0 6 0;
+#X connect 4 0 5 0;
+#X connect 8 0 42 2;
+#X connect 9 0 42 2;
+#X connect 10 0 11 0;
+#X connect 11 0 42 2;
+#X connect 14 0 42 0;
+#X connect 14 0 42 1;
+#X connect 16 0 41 2;
+#X connect 17 0 20 0;
+#X connect 20 0 16 0;
+#X connect 23 0 41 0;
+#X connect 23 0 41 1;
+#X connect 24 0 41 2;
+#X connect 25 0 24 0;
+#X connect 26 0 25 0;
+#X connect 28 0 31 0;
+#X connect 29 0 30 0;
+#X connect 33 0 41 2;
+#X connect 34 0 33 0;
+#X connect 36 0 41 2;
+#X connect 39 0 42 2;
+#X connect 41 0 28 0;
+#X connect 41 1 29 0;
+#X connect 41 2 27 0;
+#X connect 42 0 3 0;
+#X connect 42 1 4 0;
+#X connect 42 2 2 0;
+#X restore 468 -287 pd examples;
+#X obj 237 -289 osc~ 440;
+#X text 115 52 1) float;
+#X text 89 -346 The [output~] abstraction is a user-friendly gain adjuster
+and stereo output \, with controls for "compute audio" (DSP) \, volume
+\, gain multiplier \, mute \, dac~ and ramp time.;
+#X text 178 -144 - sets slider (range is clipped to 0-1), f 60;
+#X text 178 -49 - sets ramp time in ms for slider values (default 20)
+, f 60;
+#X obj 216 -252 output~;
+#X text 131 107 [output~] was originally in Pd Extended's extra folder
+as a variant of [ezoutput~] from PDDP. This is an improved \, redesigned
+and backwards compatible version for Pd-l2ork made by Alexandre Porres
+with extra features.;
+#X text 177 52 - [dac~]: <0>: no dac~ output \, <1>: dac~ output (default)
+, f 60;
+#X text 178 -65 - turns DSP Engine (Compute Audio) "On" or "Off",
+f 60;
+#X text 115 74 2) float, f 9;
+#X text 139 -82 mute;
+#X text 178 -82 - mute/unmute button, f 60;
+#N canvas 227 48 672 395 scaling 0;
+#X obj 29 54 cnv 15 198 198 empty empty empty 20 12 0 14 -253888 -66577
+0;
+#N canvas 0 22 452 302 (subpatch) 0;
+#X array \$0-dB 441 float 0 black black;
+#X array \$0-quartic 441 float 0 black black;
+#X array \$0-linear 441 float 0 black black;
+#X coords 0 1.01 440 0 200 200 1;
+#X restore 29 53 graph;
+#X text 96 130 linear;
+#X text 23 257 0;
+#X text 217 255 1;
+#X text 234 78 o;
+#X text 234 90 u;
+#X text 234 102 t;
+#X text 234 127 u;
+#X text 234 139 t;
+#X text 234 115 p;
+#X text 234 160 v;
+#X text 234 172 a;
+#X text 234 184 l;
+#X text 234 196 u;
+#X text 234 208 e;
+#X text 230 241 0;
+#X text 230 51 1;
+#X text 270 20 The graph to the left shows us how the scaling modes
+work. A linear scaling doesn't really do anything \, the input is the
+same as the output. We have then two non linear modes:;
+#X text 278 118 -;
+#X text 278 74 -;
+#X text 128 182 quartic;
+#X text 171 220 dB;
+#X obj 438 299 osc~ 440;
+#X msg 521 312 gain \$1;
+#X obj 386 207 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X obj 521 289 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
+-228856 -1 -1 0 256 0;
+#X obj 438 342 output~;
+#X obj 521 175 vsl 15 80 0 2 0 0 empty empty empty 0 -9 0 10 -233017
+-1 -1 0 1;
+#X text 527 270 max gain;
+#X text 362 204 dB;
+#N canvas 264 70 391 161 db-to-linear 0;
+#X obj 52 69 expr pow(10 \, $f1 / 20);
+#X obj 52 30 inlet;
+#X obj 52 102 outlet;
+#X text 201 69 dBFS to linear amplitude;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X restore 386 233 pd db-to-linear;
+#X text 67 262 entry (slider) value;
+#X text 287 118 dB: This mode adopts a decibel scale with a range of
+100 dB (using the [dbtorms~] object).;
+#X text 22 303 The gain value is a simple multiplier to the output
+value of the slider and determines the maximum linear gain output regardless
+of the scaling mode. For example \, "2" will output the double of the
+input amplitude \, and "0.5" half of it. This is useful if your input
+isn't loud enough \, if it is too high or even if you're using multiple
+[output~] objects as they all add to the same output.;
+#X text 287 74 Quartic (default): This mode just gets the slider values
+to the power of 4 (so \, for instance \, an input slider value of 0.5
+becomes 0.125)., f 57;
+#N canvas 0 0 450 300 init-array 0;
+#X msg 71 41 441;
+#X obj 71 63 t a b;
+#X msg 112 85 0, f 4;
+#X obj 71 85 until;
+#X obj 71 117 f;
+#X obj 109 117 + 1;
+#X obj 71 232 / 441;
+#X obj 71 198 t a a;
+#X obj 330 164 t a a;
+#X obj 330 232 dbtorms;
+#X obj 198 212 / 441;
+#X obj 198 180 t a a;
+#X obj 198 234 pow 4;
+#X obj 330 208 / 4.41;
+#X obj 71 256 tabwrite \$0-linear;
+#X obj 198 256 tabwrite \$0-quartic;
+#X obj 71 18 loadbang;
+#X obj 330 256 tabwrite \$0-dB;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 1 1 2 0;
+#X connect 2 0 4 1;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 4 0 7 0;
+#X connect 4 0 8 0;
+#X connect 4 0 11 0;
+#X connect 5 0 4 1;
+#X connect 6 0 14 0;
+#X connect 7 0 6 0;
+#X connect 7 1 14 1;
+#X connect 8 0 13 0;
+#X connect 8 1 17 1;
+#X connect 9 0 17 0;
+#X connect 10 0 12 0;
+#X connect 11 0 10 0;
+#X connect 11 1 15 1;
+#X connect 12 0 15 0;
+#X connect 13 0 9 0;
+#X connect 16 0 0 0;
+#X restore 146 22 pd init-array;
+#X connect 23 0 27 0;
+#X connect 23 0 27 1;
+#X connect 24 0 27 2;
+#X connect 25 0 31 0;
+#X connect 26 0 24 0;
+#X connect 28 0 26 0;
+#X connect 31 0 26 0;
+#X restore 463 -241 pd scaling \; modes & gain;
+#X text 309 -249 <= dsp status/toggle;
+#N canvas 876 153 420 512 DSP 0;
+#X obj 120 295 osc~ 440;
+#X obj 120 341 output~;
+#X msg 203 285 on;
+#X msg 219 311 off;
+#X msg 168 96 \; pd dsp \$1;
+#X obj 168 68 tgl 20 0 empty empty empty 17 7 0 10 -216373 -1 -1 0
+1;
+#X text 212 344 <= click on the DSP status;
+#X text 24 142 These are the usual ways of doing this \, but the [output~]
+abstraction offers yet other options.;
+#X text 23 18 The DSP engine can be turned on and off in the main Pd
+window \, in the "Media" menu or inside a patch with this message to
+Pd:;
+#X text 23 191 First \, if the DSP is on when you load [output~] \,
+it checks the DSP state and loads the GUI accordingly \, where the
+top right corner shows the status as either "on" or "off". But this
+interface also acts as a toggle so you can click on it and change the
+status. Another way of doing that in the patch is with the "on" and
+"off" messages to the right inlet.;
+#X text 227 358 (it behaves as a toggle);
+#X text 31 411 Try the above [output~] abstraction as the only object
+sending signals to pd's output \, now change the DSP status with the
+volume up in one of the usual ways and with the interface provided
+by [output~] (via toggle or messages). You'll notice how changing the
+DSP status with [output~] does not 'click'! This is because it automatically
+fades in and out when turning it on and off!;
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
+#X connect 2 0 1 2;
+#X connect 3 0 1 2;
+#X connect 5 0 4 0;
+#X restore 456 -264 pd DSP status;
+#X connect 40 0 45 0;
+#X connect 40 0 45 1;
diff --git a/pd/extra/output~.pd b/pd/extra/output~.pd
index af13b0712cd959de96b8a16bc5791b175bec5062..4cd900fb902b117e18a2d0394e575965611ea052 100644
--- a/pd/extra/output~.pd
+++ b/pd/extra/output~.pd
@@ -1,130 +1,482 @@
-#N canvas 96 14 463 390 10;
-#X obj 12 110 hsl 63 18 0.01 1 1 0 \$0-v \$0-v volume 20 10 1 9 -245500
--13381 -1 150 0;
-#X obj 80 92 tgl 18 0 THIS_IS_HERE_TO_GET_RID_OF_THE_OUTLET \$0-dsp-toggle
-dsp 2 9 1 9 -225271 -195568 -33289 1 1;
-#N canvas 366 412 482 356 dsp 0;
-#X obj 11 7 inlet;
-#X obj 92 226 select 0 1;
-#X msg 125 248 6;
-#X obj 92 57 route dsp;
-#X obj 92 36 receive pd;
-#X obj 206 138 loadbang;
-#X msg 11 220 dsp \$1;
-#X obj 11 245 send pd;
-#X msg 206 278 set \$1;
-#X obj 206 174 value GLOBAL_PDDP_DSP;
-#X msg 109 278 color \$1 20 12;
-#X obj 180 309 send \$0-dsp-toggle;
-#X obj 92 115 change;
-#X msg 92 247 0;
-#X connect 0 0 6 0;
-#X connect 0 0 12 0;
-#X connect 1 0 13 0;
-#X connect 1 1 2 0;
-#X connect 2 0 10 0;
-#X connect 3 0 12 0;
+#N canvas 819 201 421 336 10;
+#X obj 142 29 inlet~;
+#X obj 162 186 *~;
+#X obj 194 29 inlet~;
+#X obj 214 185 *~;
+#X obj 142 71 hip~ 3;
+#X obj 194 70 hip~ 3;
+#X obj 31 194 block~ 64;
+#X obj 248 27 inlet;
+#X obj 287 261 outlet;
+#X obj 214 262 outlet~;
+#X obj 162 261 outlet~;
+#X obj 287 229 r \$0-slider;
+#N canvas 627 117 614 293 set_GUI 0;
+#X obj 66 243 s \$0-set-slider;
+#X obj 98 18 inlet;
+#X obj 66 209 clip 0 1;
+#X obj 129 209 s \$0-dsp-toggle-set;
+#X msg 160 182 0;
+#X msg 129 179 1;
+#X obj 223 159 s \$0-dac;
+#X obj 254 137 s \$0-mode;
+#X obj 318 165 s \$0-max_gain;
+#X obj 318 119 moses 0;
+#X obj 318 97 * -1;
+#X obj 318 141 * -1;
+#X obj 98 52 route float on off mute dac mode gain ramp;
+#X obj 376 105 s \$0-ramp;
+#X obj 376 84 max 5;
+#X obj 191 182 s \$0-mute;
+#X connect 1 0 12 0;
+#X connect 2 0 0 0;
 #X connect 4 0 3 0;
-#X connect 5 0 9 0;
+#X connect 5 0 3 0;
+#X connect 9 0 11 0;
+#X connect 10 0 9 0;
+#X connect 11 0 8 0;
+#X connect 12 0 2 0;
+#X connect 12 1 5 0;
+#X connect 12 2 4 0;
+#X connect 12 3 15 0;
+#X connect 12 4 6 0;
+#X connect 12 5 7 0;
+#X connect 12 6 10 0;
+#X connect 12 7 14 0;
+#X connect 14 0 13 0;
+#X restore 248 70 pd set_GUI;
+#X obj 194 139 *~;
+#X obj 142 141 *~;
+#N canvas 599 50 439 352 dac 0;
+#X obj 94 320 dac~;
+#X obj 53 22 inlet~;
+#X obj 115 21 inlet~;
+#X obj 153 69 r \$0-dac;
+#X obj 115 275 *~;
+#X obj 54 208 *~;
+#X obj 153 181 line~;
+#X obj 153 211 *~;
+#X obj 153 242 *~;
+#X msg 153 160 \$1 50;
+#X obj 203 120 sel 0 1;
+#X msg 222 143 1;
+#X obj 307 239 switch~;
+#X msg 203 215 0;
+#X obj 203 186 delay 50;
+#X obj 307 209 change;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 3 0 9 0;
+#X connect 3 0 10 0;
+#X connect 4 0 0 1;
+#X connect 5 0 0 0;
 #X connect 6 0 7 0;
-#X connect 8 0 11 0;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 7 0 8 1;
+#X connect 8 0 4 1;
+#X connect 8 0 5 1;
+#X connect 9 0 6 0;
+#X connect 10 0 14 0;
+#X connect 10 1 11 0;
+#X connect 11 0 15 0;
+#X connect 13 0 15 0;
+#X connect 14 0 13 0;
+#X connect 15 0 12 0;
+#X restore 227 231 pd dac;
+#N canvas 329 100 340 226 gain 0;
+#N canvas 251 205 450 331 quartic 0;
+#X obj 100 126 line~;
+#X obj 100 158 *~;
+#X obj 100 186 *~;
+#X obj 100 92 inlet;
+#X obj 100 252 outlet~;
+#X obj 100 217 *~;
+#X obj 221 54 r \$0-mode;
+#X msg 250 104 0;
+#X obj 269 157 switch~;
+#X msg 221 104 1;
+#X obj 197 179 line~;
+#X msg 197 157 \$1 50;
+#X obj 273 132 pipe 50;
+#X obj 221 79 sel 0;
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
+#X connect 1 0 2 0;
+#X connect 1 0 2 1;
+#X connect 2 0 5 0;
+#X connect 3 0 0 0;
+#X connect 5 0 4 0;
+#X connect 6 0 13 0;
+#X connect 7 0 11 0;
+#X connect 7 0 12 0;
 #X connect 9 0 8 0;
-#X connect 9 0 1 0;
-#X connect 10 0 11 0;
+#X connect 9 0 11 0;
+#X connect 10 0 5 1;
+#X connect 11 0 10 0;
 #X connect 12 0 8 0;
-#X connect 12 0 1 0;
-#X connect 12 0 9 0;
-#X connect 13 0 10 0;
-#X restore 112 118 pd dsp logic;
-#X obj 315 2 inlet;
-#X obj 80 110 bng 18 1000 50 0 THIS_IS_HERE_TO_GET_RID_OF_THE_OUTLET
-\$0-MUTE_TOGGLE empty 0 9 2 8 -262144 -258699 -195568;
-#X obj 191 2 inlet~;
-#X obj 86 273 line~;
-#X obj 186 333 *~;
-#X obj 206 363 dac~;
-#X text 203 22 audio in;
-#X obj 254 2 inlet~;
-#X obj 248 332 *~;
-#X obj 201 73 hip~ 3;
-#X obj 263 73 hip~ 3;
-#X obj 12 288 send pd;
-#X msg 12 267 dsp 1;
-#X obj 248 362 outlet~;
-#X obj 148 362 outlet~;
-#X obj 355 362 outlet;
-#X obj 86 252 pack 0 50;
-#X text 153 251 <-- make a ramp to avoid clicks or zipper noise;
-#X msg 86 217 0;
-#X obj 86 194 moses 0.011;
-#X text 307 74 filter out DC;
-#N canvas 148 311 361 328 mute 0;
-#X obj 23 20 inlet;
-#X obj 173 20 inlet;
-#X obj 222 208 float;
-#X obj 265 121 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 1
-1;
-#X obj 222 162 spigot;
-#X obj 172 41 trigger bang bang;
-#X obj 254 263 outlet;
-#X msg 274 208 0;
-#X obj 274 163 select 0;
-#X obj 127 64 bang;
-#X msg 127 85 set 1;
-#X obj 65 304 send \$0-MUTE_TOGGLE;
-#X msg 65 283 color \$1 13 20;
-#X obj 65 235 bang;
-#X msg 65 255 0;
-#X msg 98 255 3;
-#X connect 0 0 2 1;
-#X connect 0 0 9 0;
-#X connect 1 0 5 0;
-#X connect 2 0 6 0;
-#X connect 2 0 13 0;
-#X connect 3 0 4 1;
-#X connect 3 0 8 0;
-#X connect 4 0 2 0;
-#X connect 5 0 4 0;
-#X connect 5 1 3 0;
-#X connect 7 0 6 0;
+#X connect 13 0 9 0;
+#X connect 13 1 7 0;
+#X restore 37 85 pd quartic;
+#X obj 116 172 outlet~;
+#N canvas 251 205 450 300 dB 0;
+#X obj 69 130 line~;
+#X obj 69 26 inlet;
+#X obj 99 255 outlet~;
+#X obj 69 160 *~ 100;
+#X obj 69 188 dbtorms~;
+#X obj 166 56 r \$0-mode;
+#X msg 193 106 0;
+#X obj 193 175 switch~;
+#X msg 164 106 1;
+#X obj 166 81 sel 1;
+#X obj 137 187 line~;
+#X obj 99 223 *~;
+#X msg 137 165 \$1 50;
+#X obj 193 140 pipe 50;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 3 0 4 0;
+#X connect 4 0 11 0;
+#X connect 5 0 9 0;
+#X connect 6 0 12 0;
+#X connect 6 0 13 0;
 #X connect 8 0 7 0;
-#X connect 8 0 15 0;
-#X connect 9 0 10 0;
-#X connect 9 0 13 0;
-#X connect 10 0 3 0;
-#X connect 12 0 11 0;
-#X connect 13 0 14 0;
-#X connect 14 0 12 0;
-#X connect 15 0 12 0;
-#X restore 86 148 pd mute;
-#X obj 315 25 t f f;
-#X connect 0 0 15 0;
-#X connect 0 0 18 0;
-#X connect 0 0 22 0;
-#X connect 0 0 24 0;
+#X connect 8 0 12 0;
+#X connect 9 0 8 0;
+#X connect 9 1 6 0;
+#X connect 10 0 11 1;
+#X connect 11 0 2 0;
+#X connect 12 0 10 0;
+#X connect 13 0 7 0;
+#X restore 116 85 pd dB;
+#N canvas 251 205 450 300 linear 0;
+#X obj 136 65 line~;
+#X obj 136 31 inlet;
+#X obj 139 241 outlet~;
+#X obj 260 54 r \$0-mode;
+#X msg 289 104 0;
+#X obj 308 157 switch~;
+#X msg 260 104 1;
+#X obj 236 179 line~;
+#X msg 236 157 \$1 50;
+#X obj 312 132 pipe 50;
+#X obj 260 79 sel 2;
+#X obj 131 187 *~;
+#X connect 0 0 11 0;
+#X connect 1 0 0 0;
+#X connect 3 0 10 0;
+#X connect 4 0 8 0;
+#X connect 4 0 9 0;
+#X connect 6 0 5 0;
+#X connect 6 0 8 0;
+#X connect 7 0 11 1;
+#X connect 8 0 7 0;
+#X connect 9 0 5 0;
+#X connect 10 0 6 0;
+#X connect 10 1 4 0;
+#X connect 11 0 2 0;
+#X restore 172 85 pd linear;
+#N canvas 661 142 329 221 max_gain 0;
+#X obj 46 35 inlet~;
+#X obj 46 171 outlet~;
+#X obj 46 100 *~;
+#X obj 105 91 expr if($f1 <= 0 \, 1 \, $f1);
+#X obj 105 65 r \$0-max_gain;
+#X obj 105 141 line~;
+#X msg 105 116 \$1 50;
+#X obj 159 118 loadbang;
+#X msg 159 142 1;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 3 0 6 0;
+#X connect 4 0 3 0;
+#X connect 5 0 2 1;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 8 0 5 0;
+#X restore 116 136 pd max_gain;
+#X obj 116 35 inlet;
+#X connect 0 0 4 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 0;
+#X connect 4 0 1 0;
+#X connect 5 0 2 0;
+#X connect 5 0 3 0;
+#X connect 5 0 0 0;
+#X restore 269 136 pd gain;
+#N canvas 495 50 450 300 mute 0;
+#X obj 121 167 line~;
+#X obj 121 196 *~;
+#X obj 121 221 *~;
+#X obj 121 114 expr 1 - $f1;
+#X msg 121 140 \$1 50;
+#X msg 206 140 1;
+#X obj 121 245 outlet~;
+#X obj 284 88 select 0 1;
+#X msg 284 37 0;
+#X obj 205 8 loadbang;
+#N canvas 186 185 358 434 off 0;
+#X obj 154 221 +;
+#X obj 139 246 +;
+#X obj 77 140 * -65536;
+#X obj 154 141 * -256;
+#X obj 220 141 * -1;
+#X obj 139 277 - 1;
+#X obj 120 110 unpack f f f;
+#X obj 120 47 inlet;
+#X obj 139 351 outlet;
+#X msg 120 80 220 220 220;
+#X msg 139 309 label volume \, color \$1 -1 -1;
+#X connect 0 0 1 1;
+#X connect 1 0 5 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 1;
+#X connect 5 0 10 0;
+#X connect 6 0 2 0;
+#X connect 6 1 3 0;
+#X connect 6 2 4 0;
+#X connect 7 0 9 0;
+#X connect 9 0 6 0;
+#X connect 10 0 8 0;
+#X restore 284 127 pd off;
+#N canvas 398 340 311 325 on 0;
+#X obj 112 157 +;
+#X obj 97 182 +;
+#X obj 35 122 * -65536;
+#X obj 112 123 * -256;
+#X obj 178 123 * -1;
+#X obj 97 213 - 1;
+#X obj 78 92 unpack f f f;
+#X obj 78 32 inlet;
+#X obj 97 284 outlet;
+#X msg 78 62 89 96 100;
+#X msg 97 246 label muted \, color \$1 0 0;
+#X connect 0 0 1 1;
+#X connect 1 0 5 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 1;
+#X connect 5 0 10 0;
+#X connect 6 0 2 0;
+#X connect 6 1 3 0;
+#X connect 6 2 4 0;
+#X connect 7 0 9 0;
+#X connect 9 0 6 0;
+#X connect 10 0 8 0;
+#X restore 344 127 pd on;
+#X obj 285 207 s \$0-set-slider;
+#X obj 284 65 tgl 15 0 empty \$0-mute-bng empty 17 7 0 10 -262144 -1
+-1 0 1;
+#X connect 0 0 1 0;
+#X connect 0 0 1 1;
 #X connect 1 0 2 0;
-#X connect 3 0 25 0;
-#X connect 4 0 24 1;
-#X connect 5 0 12 0;
+#X connect 1 0 2 1;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 7 0 10 0;
+#X connect 7 1 11 0;
+#X connect 8 0 13 0;
+#X connect 9 0 8 0;
+#X connect 9 0 5 0;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 13 0 7 0;
+#X connect 13 0 3 0;
+#X restore 209 103 pd mute;
+#N canvas 1033 328 407 422 Gui_control 0;
+#X msg 242 154 0;
+#X msg 29 303 \; pd dsp 1;
+#X obj 56 97 value slider_\$0;
+#X obj 57 189 value slider_\$0;
+#X obj 270 220 value slider_\$0;
+#X obj 242 126 select 0 1;
+#N canvas 824 206 392 422 DSP_state 0;
+#X obj 204 156 route dsp;
+#X obj 204 129 receive pd;
+#X obj 184 21 inlet;
+#X obj 118 395 outlet;
+#X obj 184 51 sel 0 1;
+#X msg 203 85 \; pd dsp 1;
+#X msg 185 221 0;
+#X msg 67 179 set 0;
+#X msg 40 214 \; pd dsp 0;
+#X obj 40 153 t b b;
+#X obj 70 395 outlet;
+#X obj 201 296 value dsp_state_\$0;
+#X obj 70 361 b;
+#X msg 118 152 1;
+#X obj 118 221 change -1;
+#X obj 40 128 delay 150;
+#X obj 278 112 loadbang;
+#X obj 278 170 pdinfo;
+#X msg 278 142 dsp-status;
+#X msg 131 330 set \$1;
+#N canvas 555 532 340 222 set_color 0;
+#X obj 47 30 inlet;
+#N canvas 0 50 712 637 off 0;
+#X obj 389 164 * -1;
+#X obj 323 244 +;
+#X obj 308 269 +;
+#X obj 246 163 * -65536;
+#X obj 323 164 * -256;
+#X obj 308 300 - 1;
+#X obj 289 133 unpack f f f;
+#X obj 124 239 +;
+#X obj 109 264 +;
+#X obj 47 158 * -65536;
+#X obj 124 159 * -256;
+#X obj 190 159 * -1;
+#X obj 109 295 - 1;
+#X obj 90 128 unpack f f f;
+#X msg 289 97 124 124 124;
+#X msg 90 98 220 220 220;
+#X obj 90 25 inlet;
+#X obj 287 405 outlet;
+#X obj 287 344 pack;
+#X obj 90 65 trigger bang bang;
+#X msg 287 371 color \$1 \$2 2 \, label off;
+#X connect 0 0 1 1;
+#X connect 1 0 2 1;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 5 0 18 1;
+#X connect 6 0 3 0;
+#X connect 6 1 4 0;
+#X connect 6 2 0 0;
+#X connect 7 0 8 1;
+#X connect 8 0 12 0;
+#X connect 9 0 8 0;
+#X connect 10 0 7 0;
+#X connect 11 0 7 1;
+#X connect 12 0 18 0;
+#X connect 13 0 9 0;
+#X connect 13 1 10 0;
+#X connect 13 2 11 0;
+#X connect 14 0 6 0;
+#X connect 15 0 13 0;
+#X connect 16 0 19 0;
+#X connect 18 0 20 0;
+#X connect 19 0 15 0;
+#X connect 19 1 14 0;
+#X connect 20 0 17 0;
+#X restore 47 113 pd off;
+#X obj 47 83 select 0 1;
+#X obj 96 160 send \$0-dsp-toggle-set;
+#X msg 96 114 color -4.86997e+06 -4.86997e+06 0 \, label on;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 2 1 4 0;
+#X connect 4 0 3 0;
+#X restore 185 330 pd set_color;
+#X obj 131 361 send \$0-dsp-toggle-set;
+#X connect 0 0 14 0;
+#X connect 1 0 0 0;
+#X connect 2 0 4 0;
+#X connect 4 0 6 0;
+#X connect 4 0 15 0;
+#X connect 4 1 5 0;
+#X connect 4 1 13 0;
+#X connect 6 0 19 0;
+#X connect 6 0 20 0;
 #X connect 6 0 11 0;
-#X connect 6 0 7 0;
-#X connect 7 0 8 0;
-#X connect 7 0 17 0;
-#X connect 10 0 13 0;
-#X connect 11 0 8 1;
-#X connect 11 0 16 0;
-#X connect 12 0 7 1;
-#X connect 13 0 11 1;
-#X connect 15 0 14 0;
-#X connect 19 0 6 0;
-#X connect 21 0 19 0;
-#X connect 22 0 21 0;
-#X connect 22 1 19 0;
-#X connect 24 0 22 0;
-#X connect 24 0 0 0;
-#X connect 25 0 24 0;
-#X connect 25 0 18 0;
-#X connect 25 0 22 0;
-#X connect 25 0 15 0;
-#X connect 25 1 0 0;
+#X connect 6 0 12 0;
+#X connect 7 0 14 0;
+#X connect 9 0 8 0;
+#X connect 9 1 7 0;
+#X connect 12 0 10 0;
+#X connect 13 0 14 0;
+#X connect 14 0 3 0;
+#X connect 14 0 11 0;
+#X connect 14 0 19 0;
+#X connect 14 0 20 0;
+#X connect 15 0 9 0;
+#X connect 16 0 18 0;
+#X connect 17 0 14 0;
+#X connect 18 0 17 0;
+#X connect 19 0 21 0;
+#X restore 173 63 pd DSP_state;
+#X obj 29 133 value dsp_state_\$0;
+#X obj 29 72 t b f;
+#X obj 29 162 select 0 1;
+#X obj 29 38 receive \$0-slider;
+#X obj 173 36 receive \$0-dsp-toggle;
+#X msg 270 245 0 \, \$1 100;
+#X obj 173 372 outlet;
+#X msg 173 119 0 150;
+#X obj 57 238 pack f 20;
+#X obj 108 214 r \$0-ramp;
+#X connect 0 0 13 0;
+#X connect 3 0 15 0;
+#X connect 4 0 12 0;
+#X connect 5 0 0 0;
+#X connect 5 1 4 0;
+#X connect 6 0 14 0;
+#X connect 6 1 5 0;
+#X connect 7 0 9 0;
+#X connect 8 0 7 0;
+#X connect 8 1 2 0;
+#X connect 9 0 1 0;
+#X connect 9 1 3 0;
+#X connect 10 0 8 0;
+#X connect 11 0 6 0;
+#X connect 12 0 13 0;
+#X connect 14 0 13 0;
+#X connect 15 0 13 0;
+#X connect 16 0 15 1;
+#X restore 269 103 pd Gui_control;
+#X obj 12 106 hsl 66 20 0 1 0 0 \$0-slider \$0-set-slider volume 19
+7 1 13 -228856 -1 -1 0 1;
+#X obj 81 94 tgl 16 0 \$0-dsp-toggle \$0-dsp-toggle-set off 3 6 1 9
+-228856 -128992 -66577 0 1;
+#X obj 81 110 bng 16 500 50 0 \$0-mute-bng \$0-mute empty 0 9 2 8 -228856
+-91674 -195568;
+#N canvas 1045 306 347 352 load_args 0;
+#X obj 75 88 list length;
+#X obj 147 174 \$1;
+#X obj 120 252 s \$0-mode;
+#X obj 147 218 s \$0-dac;
+#X obj 75 120 select 0;
+#X obj 75 31 loadbang;
+#X obj 75 61 list append \$@;
+#X obj 120 174 \$2;
+#X obj 120 144 t b b;
+#X msg 75 174 1;
+#X msg 42 175 0;
+#X connect 0 0 4 0;
+#X connect 1 0 3 0;
+#X connect 4 0 9 0;
+#X connect 4 0 10 0;
+#X connect 4 1 8 0;
+#X connect 5 0 6 0;
+#X connect 6 0 0 0;
+#X connect 7 0 2 0;
+#X connect 8 0 7 0;
+#X connect 8 1 1 0;
+#X connect 9 0 3 0;
+#X connect 10 0 2 0;
+#X restore 283 183 pd load_args;
+#X text 162 304 Alexandre Torres Porres (2016), f 51;
+#X connect 0 0 4 0;
+#X connect 1 0 10 0;
+#X connect 1 0 15 0;
+#X connect 2 0 5 0;
+#X connect 3 0 9 0;
+#X connect 3 0 15 1;
+#X connect 4 0 14 0;
+#X connect 5 0 13 0;
+#X connect 7 0 12 0;
+#X connect 11 0 8 0;
+#X connect 13 0 3 0;
+#X connect 14 0 1 0;
+#X connect 16 0 3 1;
+#X connect 16 0 1 1;
+#X connect 17 0 13 1;
+#X connect 17 0 14 1;
+#X connect 18 0 16 0;
 #X coords 0 0 1 1 90 40 1 10 90;