#N canvas 268 200 808 611 12; #X floatatom 381 115 5 0 0 0 - transpo-set -; #N canvas 446 35 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 234 22 1006 704 read-windows 0; #X obj 18 693 *~; #X obj 340 448 r window-size; #X obj 166 303 f; #X obj 102 91 r window-size; #X obj 102 139 /; #X obj 195 695 *~; #X obj 166 252 bang~; #X obj 17 551 line~; #X obj 102 164 * 1000; #X obj 288 222 r speed; #X obj 187 276 r location; #X obj 208 305 +; #X obj 288 275 *; #X obj 188 371 / 1000; #X obj 166 394 *; #X text 198 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 188 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 243 309 s see-loc; #X obj 817 116 r see-loc; #X obj 203 420 / 2; #X obj 166 420 -; #X text 239 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 81 601 "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 obj 845 684 r auto; #X obj 730 685 r no-detune; #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 obj 16 469 f; #X obj 17 496 pack; #X obj 15 440 b; #X msg 17 523 0 \, \$1 \$2; #X msg 730 707 \; transpo 0; #X msg 845 711 \; speed \$1; #X connect 0 0 26 0; #X connect 1 0 19 0; #X connect 2 0 11 0; #X connect 2 0 14 0; #X connect 3 0 55 0; #X connect 4 0 8 0; #X connect 5 0 27 0; #X connect 6 0 2 0; #X connect 7 0 63 0; #X connect 7 0 50 0; #X connect 8 0 54 0; #X connect 8 0 57 0; #X connect 9 0 17 0; #X connect 10 0 2 1; #X connect 11 0 2 1; #X connect 11 0 58 0; #X connect 12 0 11 1; #X connect 13 0 14 1; #X connect 14 0 61 0; #X connect 16 0 63 1; #X connect 17 0 12 0; #X connect 18 0 16 0; #X connect 18 0 60 0; #X connect 18 0 73 1; #X connect 18 0 89 1; #X connect 19 0 18 0; #X connect 20 0 21 0; #X connect 21 0 22 0; #X connect 22 0 23 0; #X connect 23 0 24 0; #X connect 24 0 25 0; #X connect 25 0 19 0; #X connect 25 1 19 1; #X connect 28 0 5 1; #X connect 28 0 0 1; #X connect 29 0 30 0; #X connect 30 0 31 0; #X connect 32 0 33 0; #X connect 33 0 34 0; #X connect 36 0 37 0; #X connect 37 0 38 0; #X connect 39 0 41 0; #X connect 40 0 48 0; #X connect 41 0 43 0; #X connect 41 1 42 1; #X connect 42 0 40 0; #X connect 43 0 44 0; #X connect 44 0 45 0; #X connect 44 0 47 0; #X connect 45 0 43 1; #X connect 46 0 43 1; #X connect 47 0 46 0; #X connect 47 0 42 0; #X connect 49 0 0 0; #X connect 50 0 5 0; #X connect 51 0 13 0; #X connect 52 0 73 0; #X connect 55 0 4 0; #X connect 55 1 56 0; #X connect 56 0 4 1; #X connect 57 0 12 1; #X connect 57 0 90 1; #X connect 59 0 41 0; #X connect 60 0 61 1; #X connect 61 0 91 0; #X connect 61 0 49 1; #X connect 61 0 50 1; #X connect 63 0 49 0; #X connect 65 0 53 0; #X connect 69 0 70 0; #X connect 70 0 65 0; #X connect 71 0 69 0; #X connect 71 1 72 0; #X connect 72 0 69 1; #X connect 73 0 71 0; #X connect 74 0 94 0; #X connect 75 0 93 0; #X connect 89 0 90 0; #X connect 90 0 92 0; #X connect 91 0 89 0; #X connect 92 0 7 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 27 271 pd fft-analysis; #N canvas 260 22 647 704 phase-tables 0; #N canvas 0 22 450 300 (subpatch) 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 22 450 300 (subpatch) 0; #X array prev-real 4096 float 0; #X coords 0 500 4096 -500 400 300 1; #X restore 170 17 graph; #X restore 251 403 pd phase-tables; #X obj 381 138 s transpo; #X text 380 94 in cents; #X text 248 155 normal; #N canvas 0 110 565 454 hann-window 0; #N canvas 0 22 450 300 (subpatch) 0; #X array \$0-hann 8192 float 0; #X coords 0 1 8191 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 251 427 pd hann-window; #X floatatom 457 379 8 0 0 0 - #0-samp-msec -; #X obj 254 302 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 269 315 <- record; #X obj 75 124 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 75 146 s rewind; #X msg 204 132 200; #X msg 204 154 100; #X msg 204 176 20; #X text 245 131 contract; #X text 249 176 expand; #X text 381 77 detune; #X text 420 306 read input sound; #X text 529 376 length \, msec; #X floatatom 608 157 5 0 0 0 - window-size -; #X msg 608 45 512; #X msg 608 67 1024; #X msg 608 89 2048; #X msg 608 111 4096; #X obj 608 133 s window-size; #X text 608 12 window size \,; #X text 608 27 samples; #X text 649 44 <- set; #X text 72 97 ------- location controls -------; #X text 661 157 (check); #X obj 204 203 s auto; #X obj 438 116 bng 15 250 50 0 no-detune empty empty 0 -6 0 8 -262144 -1 -1; #X obj 406 307 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 422 329 file ->; #X text 103 7 PHASE VOCODER FOR TIME STRETCHING AND CONTRACTION; #X obj 65 302 hsl 128 15 0 8 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 12700 1; #X obj 22 336 dac~; #X obj 130 75 hsl 128 15 0 300 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 100 1; #X floatatom 147 132 5 0 0 0 - - -; #X text 355 459 updated for Sound and Music Interaction course; #X text 415 441 Original by Miller Puckette; #X text 330 200 (the interval between two adjacent piano keys) spans 100 cents by definition.; #N canvas 535 437 694 447 read-inpute-sound 1; #N canvas 0 22 450 300 (subpatch) 0; #X array \$0-sample 585784 float 0; #X coords 0 1 585783 -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 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 obj 29 46 adc~ 7; #X msg 143 17 bang; #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 23 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 21 0; #X connect 19 0 20 0; #X connect 19 0 27 0; #X connect 20 0 22 0; #X connect 24 0 25 0; #X connect 25 0 26 0; #X connect 27 0 18 0; #X connect 28 0 21 0; #X restore 252 379 pd read-inpute-sound; #X obj 28 308 *~ 5; #X connect 0 0 3 0; #X connect 1 0 44 0; #X connect 8 0 43 0; #X connect 10 0 11 0; #X connect 12 0 31 0; #X connect 13 0 31 0; #X connect 14 0 31 0; #X connect 21 0 25 0; #X connect 22 0 25 0; #X connect 23 0 25 0; #X connect 24 0 25 0; #X connect 33 0 43 1; #X connect 36 0 44 1; #X connect 38 0 39 0; #X connect 39 0 31 0; #X connect 44 0 37 0; #X connect 44 0 37 1;