aboutsummaryrefslogtreecommitdiff
path: root/s-spooky~.pd
blob: 483a5eba70760b318c1b48eea41184ea139520be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
#N canvas 277 36 744 599 10;
#N canvas 84 0 821 675 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 0 0 1001 679 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 675 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 text 155 41 args: name tablename;
#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;