#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;