aboutsummaryrefslogtreecommitdiff
path: root/s-spooky~.pd
diff options
context:
space:
mode:
Diffstat (limited to 's-spooky~.pd')
-rw-r--r--s-spooky~.pd387
1 files changed, 387 insertions, 0 deletions
diff --git a/s-spooky~.pd b/s-spooky~.pd
new file mode 100644
index 0000000..a9ba844
--- /dev/null
+++ b/s-spooky~.pd
@@ -0,0 +1,387 @@
+#N canvas 277 36 744 599 10;
+#N canvas 84 0 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 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 msg 426 619 set \$1 4;
+#X obj 97 425 q8_rsqrt~;
+#N canvas -22 50 1006 799 read-windows 0;
+#X obj 18 693 *~;
+#X obj 156 300 f;
+#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 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 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 text 411 498 stretched window size (samples);
+#X obj 178 347 r \$0-insamprate;
+#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 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 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 text 326 275 loop to precess the location according;
+#X text 325 291 to the "speed" parameter.;
+#X obj 194 637 tabread4~ \$2;
+#X obj 17 637 tabread4~ \$2;
+#X obj 178 276 r \$0/location;
+#X obj 499 365 r \$0/transpo;
+#X obj 340 448 r \$0/window-size;
+#X obj 102 91 r \$0/window-size;
+#X floatatom 335 352 5 0 0 0 - - -;
+#X floatatom 505 476 5 0 0 0 - - -;
+#X connect 0 0 26 0;
+#X connect 1 0 8 0;
+#X connect 1 0 15 0;
+#X connect 2 0 6 0;
+#X connect 3 0 27 0;
+#X connect 4 0 1 0;
+#X connect 5 0 39 0;
+#X connect 5 0 46 0;
+#X connect 6 0 31 0;
+#X connect 6 0 34 0;
+#X connect 7 0 18 0;
+#X connect 8 0 1 1;
+#X connect 8 0 35 0;
+#X connect 9 0 8 1;
+#X connect 10 0 13 1;
+#X connect 11 0 13 0;
+#X connect 11 1 10 0;
+#X connect 12 0 5 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 1;
+#X connect 14 0 52 0;
+#X connect 15 0 37 0;
+#X connect 17 0 39 1;
+#X connect 18 0 9 0;
+#X connect 19 0 17 0;
+#X connect 19 0 10 1;
+#X connect 19 0 36 0;
+#X connect 20 0 19 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 24 0 53 0;
+#X connect 25 0 20 0;
+#X connect 25 1 20 1;
+#X connect 28 0 3 1;
+#X connect 28 0 0 1;
+#X connect 30 0 14 0;
+#X connect 32 0 2 0;
+#X connect 32 1 33 0;
+#X connect 33 0 2 1;
+#X connect 34 0 13 2;
+#X connect 34 0 9 1;
+#X connect 36 0 37 1;
+#X connect 37 0 11 0;
+#X connect 39 0 47 0;
+#X connect 46 0 3 0;
+#X connect 47 0 0 0;
+#X connect 48 0 1 1;
+#X connect 49 0 21 0;
+#X connect 50 0 20 0;
+#X connect 51 0 32 0;
+#X restore 109 133 pd read-windows;
+#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 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 obj 181 290 r \$0/lock;
+#X obj 127 622 r \$0/window-size;
+#X obj 426 595 r \$0/window-size;
+#X obj 73 29 tabreceive~ \$0-prev-imag;
+#X obj 20 8 tabreceive~ \$0-prev-real;
+#X obj 137 543 tabsend~ \$0-prev-imag;
+#X obj 136 567 tabsend~ \$0-prev-real;
+#X connect 0 0 2 1;
+#X connect 1 0 2 0;
+#X connect 2 0 15 0;
+#X connect 2 0 60 0;
+#X connect 3 0 5 1;
+#X connect 4 0 5 0;
+#X connect 5 0 15 1;
+#X connect 5 0 59 0;
+#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 39 0;
+#X connect 10 0 38 0;
+#X connect 10 0 44 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 24 0;
+#X connect 17 0 18 0;
+#X connect 18 0 28 0;
+#X connect 19 0 40 0;
+#X connect 19 0 41 0;
+#X connect 19 0 45 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 23 0 17 1;
+#X connect 23 0 17 0;
+#X connect 23 0 20 0;
+#X connect 24 0 12 0;
+#X connect 25 0 24 1;
+#X connect 26 0 12 1;
+#X connect 27 0 22 0;
+#X connect 28 0 20 1;
+#X connect 28 0 21 1;
+#X connect 29 0 14 0;
+#X connect 29 1 13 0;
+#X connect 31 0 33 1;
+#X connect 32 0 33 0;
+#X connect 33 0 35 0;
+#X connect 34 0 36 1;
+#X connect 34 0 37 1;
+#X connect 35 0 34 0;
+#X connect 36 0 8 0;
+#X connect 36 0 7 0;
+#X connect 37 0 9 0;
+#X connect 37 0 6 0;
+#X connect 38 0 42 0;
+#X connect 39 0 42 0;
+#X connect 40 0 43 0;
+#X connect 41 0 43 0;
+#X connect 42 0 44 1;
+#X connect 43 0 45 1;
+#X connect 44 0 23 0;
+#X connect 45 0 11 0;
+#X connect 45 0 11 1;
+#X connect 45 0 21 0;
+#X connect 54 0 42 1;
+#X connect 54 0 43 1;
+#X connect 55 0 26 0;
+#X connect 56 0 27 0;
+#X connect 57 0 31 1;
+#X connect 57 0 31 0;
+#X connect 57 0 36 0;
+#X connect 58 0 32 1;
+#X connect 58 0 32 0;
+#X connect 58 0 37 0;
+#X restore 14 527 pd fft-analysis;
+#N canvas 260 0 647 768 phase-tables 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array \$0-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 (subpatch) 0;
+#X array \$0-prev-real 4096 float 0;
+#X coords 0 500 4096 -500 400 300 1;
+#X restore 170 17 graph;
+#X restore 366 527 pd phase-tables;
+#N canvas 0 110 565 454 hann-window 0;
+#N canvas 0 0 450 300 (subpatch) 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 38 173 /;
+#X obj 127 142 samplerate~;
+#X obj 177 204 swap;
+#X obj 177 228 /;
+#X obj 49 201 * 1000;
+#X obj 38 115 t f b f;
+#X msg 173 92 resize \$1;
+#X obj 173 116 s \$0-hann;
+#X msg 382 130 0;
+#X obj 330 131 t f b;
+#X text 15 9 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 obj 38 88 r \$0/window-size;
+#X obj 177 252 s \$0/window-hz;
+#X obj 330 105 r \$0/window-hz;
+#X obj 38 251 s \$0/window-sec;
+#X obj 49 228 s \$0/window-msec;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 0;
+#X connect 5 0 9 0;
+#X connect 5 0 19 0;
+#X connect 6 0 5 1;
+#X connect 6 0 7 1;
+#X connect 7 0 8 0;
+#X connect 7 1 8 1;
+#X connect 8 0 17 0;
+#X connect 9 0 20 0;
+#X connect 10 0 5 0;
+#X connect 10 0 7 0;
+#X connect 10 1 6 0;
+#X connect 10 2 11 0;
+#X connect 11 0 12 0;
+#X connect 13 0 1 1;
+#X connect 14 0 1 0;
+#X connect 14 1 4 0;
+#X connect 14 1 13 0;
+#X connect 16 0 10 0;
+#X connect 18 0 14 0;
+#X restore 366 551 pd hann-window;
+#X obj 5 31 tgl 15 0 \$0/lock \$1/lock lock 18 8 0 8 -260818 -1 -1
+0 1;
+#X floatatom 458 423 5 0 0 0 - window-size -;
+#X msg 460 264 512;
+#X msg 500 264 1024;
+#X msg 549 264 2048;
+#X msg 470 293 4096;
+#X text 456 142 window size \,;
+#X text 456 161 samples;
+#X text 542 295 <- set;
+#X text 511 423 (check);
+#X text 155 5 This is based on the 'phase vocoder' by miller. any mistakes
+are my own.;
+#X msg 534 235 256;
+#X msg 496 235 128;
+#X msg 457 235 64;
+#X obj 14 553 outlet~;
+#X obj 5 62 nbx 1 14 0 6 0 1 \$0/windowsize \$1/windowsize windowsize
+0 -8 0 8 -260818 -1 -1 6 256;
+#X obj 457 182 r \$0/windowsize;
+#X obj 457 207 sel 0 1 2 3 4 5 6;
+#X obj 74 31 nbx 7 14 -1e+37 1e+37 0 0 \$0/location \$1/location location
+0 -8 0 8 -260818 -1 -1 0 256;
+#X obj 74 63 nbx 3 14 -1e+37 1e+37 0 1 \$0/detune \$1/detune detune
+0 -8 0 8 -260818 -1 -1 0 256;
+#X obj 189 527 samplerate~;
+#X obj 189 551 s \$0-insamprate;
+#X obj 189 504 loadbang;
+#X obj 4 103 sssad/auto \$0/lock \$1/lock;
+#X obj 4 123 sssad/auto \$0/windowsize \$1/windowsize;
+#X obj 4 143 sssad/auto \$0/location \$1/location;
+#X obj 4 163 sssad/auto \$0/detune \$1/detune;
+#X obj 458 399 s \$0/window-size;
+#X obj 337 182 r \$0/detune;
+#X obj 337 203 s \$0/transpo;
+#X connect 0 0 17 0;
+#X connect 5 0 30 0;
+#X connect 6 0 30 0;
+#X connect 7 0 30 0;
+#X connect 8 0 30 0;
+#X connect 14 0 30 0;
+#X connect 15 0 30 0;
+#X connect 16 0 30 0;
+#X connect 19 0 20 0;
+#X connect 20 0 16 0;
+#X connect 20 1 15 0;
+#X connect 20 2 14 0;
+#X connect 20 3 5 0;
+#X connect 20 4 6 0;
+#X connect 20 5 7 0;
+#X connect 20 6 8 0;
+#X connect 23 0 24 0;
+#X connect 25 0 23 0;
+#X connect 31 0 32 0;
+#X coords 0 -1 1 1 140 80 1 0 0;