#N canvas 616 48 576 708 12;
#X declare -stdpath ./;
#N canvas 0 0 450 300 (subpatch) 0;
#X array adsr-output 48000 float 0;
#X coords 0 1.02 48000 -0.02 200 130 1 0 0;
#X restore 269 429 graph;
#X text 289 565 ------ 1 second ------;
#X obj 64 199 r trigger;
#X obj 91 334 tabwrite~ adsr-output;
#X obj 97 302 r graphit;
#X msg 314 243 \; pd dsp 1 \; trigger 1 \; graphit bang;
#X msg 314 324 \; pd dsp 1 \; trigger 0 \; graphit bang;
#X msg 328 194 \; trigger 0;
#X text 474 424 1;
#X obj 46 147 osc~ 440;
#X obj 46 393 *~;
#X obj 46 428 output~;
#X obj 46 526 declare -stdpath ./;
#X obj 314 125 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000;
#X text 337 124 <-- attack and delayed release, f 15;
#X text 99 58 This patch introduces a simple [adsr] abstraction we'll use frequently. You can click on the [adsr] object to see what's inside., f 50;
#X text 67 606 The active ingredient of the ADSR envelope generator is a single [line~] which gets passed messages to make the attack and release behavior. You can retrigger the ADSR envelope generator all you wish without having to wait for attacks or releases to finish;
#X text 409 348 <-- release only;
#X text 405 262 <-- attack only;
#X obj 64 228 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X obj 328 169 del 750;
#X obj 64 261 adsr 1 100 200 50 250;
#X text 472 549 0;
#X obj 56 15 cnv 5 5 25 empty empty Envelope\ Generator\ Abstraction 15 13 0 16 #dfdfdf #202020 0;
#X text 219 261 <-- click;
#X connect 2 0 19 0;
#X connect 4 0 3 0;
#X connect 9 0 10 0;
#X connect 10 0 11 0;
#X connect 13 0 5 0;
#X connect 13 0 20 0;
#X connect 19 0 21 0;
#X connect 20 0 7 0;
#X connect 21 0 3 0;
#X connect 21 0 10 1;
