aboutsummaryrefslogtreecommitdiff
path: root/examples/puredata/xtract/f0.pd
blob: 6ea07141c8088bf7e2357250f42e6fa1a914eb03 (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
#N canvas 730 93 584 590 10;
#N canvas 162 173 901 522 guts 0;
#X obj 205 48 osc~;
#X obj 338 70 a_spigot~;
#X obj 205 70 a_spigot~;
#X obj 331 -26 line;
#X msg 331 -50 \$1 50;
#X obj 357 282 ftom;
#X obj 3 48 ftom;
#N canvas 0 0 450 300 fm 0;
#X obj 181 114 osc~;
#X obj 138 175 osc~;
#X obj 137 154 +~;
#X obj 144 209 outlet~;
#X obj 182 82 *;
#X obj 137 26 inlet;
#X obj 204 6 inlet;
#X obj 179 54 f;
#X obj 204 30 t b f;
#X obj 182 143 *~;
#X obj 238 81 - 2;
#X obj 225 113 * 100000;
#X connect 0 0 9 0;
#X connect 1 0 3 0;
#X connect 2 0 1 0;
#X connect 4 0 0 0;
#X connect 5 0 2 0;
#X connect 5 0 4 0;
#X connect 5 0 7 1;
#X connect 6 0 8 0;
#X connect 7 0 4 0;
#X connect 7 0 2 0;
#X connect 8 0 7 0;
#X connect 8 1 4 1;
#X connect 8 1 10 0;
#X connect 9 0 2 1;
#X connect 10 0 11 0;
#X connect 11 0 9 1;
#X restore 339 47 pd fm;
#X obj 459 69 a_spigot~;
#X obj 253 168 +~;
#N canvas 0 0 450 300 noise 0;
#X obj 260 126 noise~;
#X obj 269 161 *~;
#X obj 270 194 lop~;
#X obj 305 161 * 10000;
#X obj 320 124 inlet;
#X obj 268 236 outlet~;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 2 0 5 0;
#X connect 3 0 2 1;
#X connect 4 0 3 0;
#X connect 4 0 1 1;
#X restore 587 66 pd noise;
#N canvas 554 114 496 580 pda 0;
#X obj 99 100 xtract~ f0;
#X obj 197 6 inlet~;
#X msg 361 203 list \$1;
#X obj 244 115 *~;
#X obj 59 25 r sr;
#X obj 149 267 tabsend~ freqs;
#X obj 401 30 table freqs;
#X obj 148 292 tabreceive~ freqs;
#X obj 6 220 != 0;
#X obj 4 331 spigot;
#X obj 57 331 spigot;
#X obj 67 217 == 0;
#X obj 27 369 f;
#X obj 28 415 lop~ 20;
#X obj 27 393 sig~;
#X obj 29 469 snapshot~;
#X obj 95 434 bang~;
#X obj 26 529 outlet;
#X obj 29 499 a_bavg 4;
#X obj 197 29 lop~ 5000;
#X obj 402 8 block~ 2048;
#X obj 200 51 hip~ 20;
#X msg 60 48 list \$1;
#X obj 274 59 r \$0-window-gen;
#X obj 274 80 a_hann 2048;
#X obj 148 222 xtract~ peak_spectrum;
#X obj 149 315 xtract~ lowest_value;
#X obj 150 243 a_blockswap~ 2048;
#X obj 359 127 samplerate~;
#X obj 358 150 / 2048;
#X msg 358 171 \$1 10;
#X obj 356 105 r \$0-peak-args;
#X obj 147 195 xtract~ spectrum 2048;
#X connect 0 0 2 0;
#X connect 0 0 8 0;
#X connect 0 0 9 0;
#X connect 0 0 11 0;
#X connect 1 0 19 0;
#X connect 2 0 26 1;
#X connect 3 0 32 0;
#X connect 4 0 22 0;
#X connect 7 0 26 0;
#X connect 8 0 9 1;
#X connect 9 0 12 0;
#X connect 10 0 12 0;
#X connect 11 0 10 1;
#X connect 12 0 14 0;
#X connect 13 0 15 0;
#X connect 14 0 13 0;
#X connect 15 0 18 0;
#X connect 16 0 15 0;
#X connect 18 0 17 0;
#X connect 19 0 21 0;
#X connect 21 0 0 0;
#X connect 21 0 3 0;
#X connect 22 0 0 1;
#X connect 23 0 24 0;
#X connect 24 0 3 1;
#X connect 25 0 27 0;
#X connect 26 0 10 0;
#X connect 27 0 5 0;
#X connect 28 0 29 0;
#X connect 29 0 30 0;
#X connect 30 0 25 1;
#X connect 31 0 28 0;
#X connect 32 0 25 0;
#X restore 357 262 pd pda;
#N canvas 0 0 596 417 d_saw 0;
#X obj 382 176 phasor~;
#X obj 397 96 noise~;
#X obj 346 116 sig~;
#X obj 381 149 +~;
#X obj 397 117 *~;
#X obj 242 198 phasor~;
#X obj 319 283 outlet~;
#X obj 385 215 *~ 0.5;
#X obj 240 227 *~ 0.3;
#X obj 270 173 * 0.01;
#X obj 241 174 +;
#X obj 460 97 * 0.1;
#X obj 312 249 lop~ 10000;
#X obj 369 51 inlet;
#X obj 261 55 inlet fund;
#X obj 258 138 f;
#X obj 286 105 t b f;
#X connect 0 0 7 0;
#X connect 1 0 4 0;
#X connect 2 0 3 0;
#X connect 3 0 0 0;
#X connect 4 0 3 1;
#X connect 5 0 8 0;
#X connect 7 0 12 0;
#X connect 8 0 12 0;
#X connect 9 0 10 1;
#X connect 10 0 5 0;
#X connect 11 0 4 1;
#X connect 12 0 6 0;
#X connect 13 0 16 0;
#X connect 14 0 2 0;
#X connect 14 0 11 0;
#X connect 14 0 15 1;
#X connect 14 0 10 0;
#X connect 15 0 10 0;
#X connect 15 0 9 0;
#X connect 16 0 15 0;
#X connect 16 1 9 1;
#X restore 457 45 pd d_saw;
#X obj 160 262 fiddle~ 2048;
#X obj 75 47 adc~;
#X obj 76 71 a_spigot~;
#X obj 2 69 a_mton;
#X obj 160 283 a_mton;
#X obj 357 301 a_mton;
#X obj 733 -70 loadbang;
#X obj 68 241 loadbang;
#X msg 67 263 symbol;
#X text 411 263 <-The magic happens in here;
#X obj 660 323 a_output~;
#X msg 747 271 0;
#X obj 263 46 r \$0-sine;
#X obj 134 48 r \$0-adc;
#X obj 396 48 r \$0-fm;
#X obj 521 43 r \$0-saw;
#X obj 586 41 r \$0-noisiness;
#X obj 473 -1 r \$0-inharmonicity;
#X obj 161 409 s \$0-fidd_f0_note;
#X obj 178 386 s \$0-fidd_f0_8ve;
#X obj 197 361 s \$0-fidd_f0_cent;
#X obj 356 367 s \$0-pda_f0_note;
#X obj 333 -73 r \$0-fund;
#X obj 375 345 s \$0-pda_f0_8ve;
#X obj 395 326 s \$0-pda_f0_cent;
#X obj 745 230 r \$0-master-lvl-stereo;
#X obj 747 252 r \$0-master-lvl-mute;
#X obj 747 291 s \$0-master-lvl-stereo;
#X obj 733 -45 f \$0;
#X obj 38 357 s \$0-f0_cent;
#X obj 19 378 s \$0-f0_8ve;
#X obj 0 406 s \$0-f0_note;
#X obj 254 261 s~ \$0-dacs;
#X obj 670 281 r~ \$0-dacs;
#X msg 732 -19 \; pd dsp 1 \; \; \$1-window-gen bang \; sr 44100 \;
\; \$1-master-lvl-stereo 50 \; \$1-peak-args bang;
#X connect 0 0 2 0;
#X connect 1 0 9 0;
#X connect 2 0 9 0;
#X connect 3 0 0 0;
#X connect 3 0 12 0;
#X connect 3 0 7 0;
#X connect 3 0 6 0;
#X connect 4 0 3 0;
#X connect 5 0 18 0;
#X connect 6 0 16 0;
#X connect 7 0 1 0;
#X connect 8 0 9 0;
#X connect 9 0 11 0;
#X connect 9 0 13 0;
#X connect 9 0 45 0;
#X connect 10 0 9 1;
#X connect 11 0 5 0;
#X connect 12 0 8 0;
#X connect 13 0 17 0;
#X connect 14 0 15 0;
#X connect 15 0 9 0;
#X connect 16 0 44 0;
#X connect 16 1 43 0;
#X connect 16 2 42 0;
#X connect 17 0 31 0;
#X connect 17 1 32 0;
#X connect 17 2 33 0;
#X connect 18 0 34 0;
#X connect 18 1 36 0;
#X connect 18 2 37 0;
#X connect 19 0 41 0;
#X connect 20 0 21 0;
#X connect 21 0 31 0;
#X connect 21 0 34 0;
#X connect 21 0 44 0;
#X connect 24 0 23 2;
#X connect 24 0 40 0;
#X connect 25 0 2 1;
#X connect 26 0 15 1;
#X connect 27 0 1 1;
#X connect 28 0 8 1;
#X connect 29 0 10 0;
#X connect 30 0 7 1;
#X connect 35 0 4 0;
#X connect 38 0 23 2;
#X connect 39 0 24 0;
#X connect 41 0 47 0;
#X connect 46 0 23 0;
#X connect 46 0 23 1;
#X restore 519 -226 pd guts;
#X obj 11 -226 cnv 15 500 200 empty empty PDA_comparison 20 12 0 14
-261681 -66577 0;
#X obj 34 -94 hsl 128 15 2 2.05 0 0 \$0-inharmonicity empty fm-inharmonicity
-2 -6 0 8 -225271 -1 -1 0 1;
#X obj 34 -50 hsl 128 15 0 0.5 0 0 \$0-noisiness empty noisiness -2
-6 0 8 -225271 -1 -1 0 1;
#X obj 33 -135 hsl 128 15 30 3000 0 0 \$0-fund empty f0 -2 -6 0 8 -225271
-1 -1 0 1;
#X obj 32 -172 tgl 15 0 \$0-sine empty sine 0 -6 0 8 -225280 -1 -1
0 1;
#X obj 73 -172 tgl 15 0 \$0-fm empty fm 0 -6 0 8 -225280 -1 -1 0 1
;
#X obj 110 -172 tgl 15 0 \$0-saw empty saw 0 -6 0 8 -225280 -1 -1 0
1;
#X obj 227 -133 cnv 15 200 100 empty empty empty 20 12 0 14 -262131
-66577 0;
#X obj 226 -199 cnv 15 200 60 empty empty empty 20 12 0 14 -225280
-66577 0;
#X symbolatom 242 -170 5 0 0 0 f0 #0-f0_note -;
#X floatatom 312 -170 5 0 0 0 8ve #0-f0_8ve -;
#X symbolatom 245 -112 5 0 0 0 f0 #0-fidd_f0_note -;
#X floatatom 313 -112 5 0 0 0 8ve #0-fidd_f0_8ve -;
#X text 304 -200 Input;
#X text 308 -84 xtract~;
#X text 305 -134 fiddle~;
#X floatatom 315 -62 5 0 0 0 8ve #0-pda_f0_8ve -;
#X symbolatom 247 -62 5 0 0 0 f0 #0-pda_f0_note -;
#X text 20 8 Notes:;
#X text 20 36 In this patch xtract~ is used to provide a combination
of time domain and frequency domain fundamental frequency estimation.
;
#X text 27 233 A block size of 2048 has been used in this example.
Which allows for a theoretical limit of 21Hz. In reality xtract~ can
be used to detect frequencies down to 30Hz with this block size \,
but with a larger block size it could go lower!;
#X text 23 88 [xtract~ f0] uses a method based on the AMDF function
\, with centre and peak clipping used to provide noise robustness.
This could be further improved \, as could the efficiency of the algorithm.
;
#X obj 147 -172 tgl 15 0 \$0-adc empty adc~ 0 -6 0 8 -257472 -1 -1
0 1;
#X floatatom 386 -171 5 0 0 0 cent #0-f0_cent -;
#X floatatom 386 -63 5 0 0 0 cent #0-pda_f0_cent -;
#X floatatom 386 -113 5 0 0 0 cent #0-fidd_f0_cent -;
#X obj 465 -187 vsl 10 100 0 127 0 0 \$0-master-lvl-stereo \$0-master-lvl-stereo
out -4 -8 0 8 -262131 -1 -1 3898 1;
#X obj 465 -77 bng 10 250 50 0 \$0-master-lvl-mute empty mute -6 16
0 8 -262131 -1 -1;
#X text 26 154 If [xtract~ f0] is unable to find a fundamental (i.e.
its output is 0 \, the lowest frequency in the peak spectrum is used.
In general this happens for very low frequencies. [xtract~ spectrum]
\, [xtract~ peak_spectrum] \, and [xtract~ lowest_value] are used to
achieve this.;