aboutsummaryrefslogtreecommitdiff
path: root/pd/doc/3.audio.examples/F12.paf.pd
blob: f220bd45d1e719dfb12c53638b88f86c6a433de6 (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
#N canvas 262 0 692 819 12;
#X obj 38 593 cos~;
#X obj 38 570 *~;
#X obj 81 593 cos~;
#X obj 137 527 wrap~;
#X obj 101 527 -~;
#X obj 81 570 +~;
#X obj 74 623 -~;
#X obj 94 655 *~;
#X obj 56 655 +~;
#X obj 100 500 samphold~;
#X floatatom 159 378 4 0 500 0 - - -;
#X obj 159 401 / 10;
#X text 157 311 center;
#X obj 159 449 line~;
#X text 157 359 fundamental);
#X obj 159 426 pack 0 50;
#X obj 39 446 phasor~;
#X floatatom 39 425 4 0 0 0 - - -;
#X text 19 398 fundamental;
#X text 303 460 index;
#X text 303 477 (percent);
#X floatatom 303 498 4 0 500 0 - - -;
#X obj 303 544 line~;
#X obj 224 564 *~;
#X obj 303 521 pack 0 50;
#N canvas 0 0 450 300 graph4 0;
#X array bell-curve 200 float 1;
#A 0 1.12535e-07 1.54727e-07 2.12059e-07 2.89706e-07 3.94519e-07 5.35535e-07
7.24633e-07 9.77371e-07 1.31404e-06 1.76105e-06 2.35258e-06 3.13275e-06
4.15832e-06 5.50199e-06 7.25659e-06 9.54016e-06 1.25023e-05 1.63317e-05
2.1266e-05 2.76026e-05 3.57128e-05 4.60584e-05 5.92113e-05 7.58768e-05
9.69224e-05 0.00012341 0.000156634 0.000198167 0.000249912 0.000314163
0.000393669 0.000491721 0.000612231 0.000759842 0.000940028 0.00115923
0.00142498 0.00174605 0.00213263 0.00259648 0.00315111 0.00381201 0.00459678
0.0055254 0.0066204 0.00790705 0.0094136 0.0111714 0.013215 0.0155826
0.0183156 0.0214592 0.0250621 0.0291763 0.0338573 0.0391639 0.0451575
0.0519019 0.0594631 0.0679081 0.0773047 0.0877205 0.0992216 0.111872
0.125732 0.140858 0.1573 0.1751 0.194291 0.214896 0.236928 0.260383
0.285247 0.311486 0.339053 0.367879 0.397882 0.428956 0.46098 0.493812
0.527292 0.561244 0.595473 0.62977 0.663916 0.697676 0.730811 0.763074
0.794216 0.823987 0.852144 0.878447 0.902668 0.924595 0.944027 0.960789
0.974725 0.985703 0.99362 0.998401 1 0.998401 0.99362 0.985703 0.974725
0.960789 0.944027 0.924595 0.902668 0.878447 0.852144 0.823987 0.794216
0.763074 0.730811 0.697676 0.663916 0.62977 0.595473 0.561244 0.527292
0.493812 0.46098 0.428956 0.397882 0.367879 0.339053 0.311486 0.285247
0.260383 0.236928 0.214896 0.194291 0.1751 0.1573 0.140858 0.125732
0.111872 0.0992216 0.0877205 0.0773047 0.0679081 0.0594631 0.0519019
0.0451575 0.0391639 0.0338573 0.0291763 0.0250621 0.0214592 0.0183156
0.0155826 0.013215 0.0111714 0.0094136 0.00790705 0.0066204 0.0055254
0.00459678 0.00381201 0.00315111 0.00259648 0.00213263 0.00174605 0.00142498
0.00115923 0.000940028 0.000759842 0.000612231 0.000491721 0.000393669
0.000314163 0.000249912 0.000198167 0.000156634 0.00012341 9.69224e-05
7.58768e-05 5.92113e-05 4.60584e-05 3.57128e-05 2.76026e-05 2.1266e-05
1.63317e-05 1.25023e-05 9.54016e-06 7.25659e-06 5.50199e-06 4.15832e-06
3.13275e-06 2.35258e-06 1.76105e-06 1.31404e-06 9.77371e-07 7.24633e-07
5.35535e-07 3.94519e-07 2.89706e-07 2.12059e-07 1.54727e-07;
#X coords 0 1 199 0 200 140 1;
#X restore 443 555 graph;
#N canvas 94 264 600 388 make-table 0;
#X msg 81 44 bang;
#X obj 81 73 t b b;
#X obj 159 142 f;
#X obj 197 142 + 1;
#X msg 175 112 0;
#X obj 81 102 until;
#X obj 161 177 t f f;
#X obj 76 306 tabwrite bell-curve;
#X obj 52 270 expr exp(-$f1*$f1);
#X obj 63 168 sel 199;
#X obj 51 241 expr ($f1-100)/25;
#X connect 0 0 1 0;
#X connect 1 0 5 0;
#X connect 1 1 4 0;
#X connect 2 0 3 0;
#X connect 2 0 6 0;
#X connect 2 0 9 0;
#X connect 3 0 2 1;
#X connect 4 0 2 1;
#X connect 5 0 2 0;
#X connect 6 0 10 0;
#X connect 6 1 7 1;
#X connect 8 0 7 0;
#X connect 9 0 5 1;
#X connect 10 0 8 0;
#X restore 507 515 pd make-table;
#X obj 224 541 cos~;
#X obj 224 518 -~ 0.25;
#X obj 224 587 +~ 100;
#X obj 224 610 tabread4~ bell-curve;
#X obj 95 684 *~;
#X text 131 682 <--ring mod step;
#X text 256 635 waveshaper;
#X text 425 791 updated for Pd version 0.37;
#X text 157 326 frequency;
#X text 157 342 (tenths of;
#X text 441 698 0;
#X text 632 697 200;
#N canvas 0 0 450 300 graph1 0;
#X array F12-spectrum 259 float 0;
#X coords 0 0.51 258 -0.008 256 130 1;
#X restore 421 308 graph;
#X text 418 440 0;
#X text 475 444 -- frequency --;
#X text 644 441 2700;
#X obj 95 756 output~;
#X obj 94 725 hip~;
#N canvas 122 211 558 609 fft 0;
#X obj 23 55 inlet~;
#X obj 210 303 inlet;
#X obj 27 215 rfft~;
#X obj 27 248 *~;
#X obj 58 248 *~;
#X obj 27 278 sqrt~;
#X obj 334 200 block~ 4096 1;
#X obj 27 304 biquad~ 0 0 0 0 1;
#X text 91 216 Fourier series;
#X text 96 269 magnitude;
#X text 94 254 calculate;
#X text 21 3 This subpatch computes the spectrum of the incoming signal
with a (rectangular windowed) FFT. FFTs aren't properly introduced
until much later.;
#X text 83 61 signal to analyze;
#X text 195 255 delay two samples;
#X text 193 273 for better graphing;
#X obj 292 79 samplerate~;
#X obj 240 352 metro 500;
#X obj 240 329 inlet;
#X text 293 327 toggle to graph repeatedly;
#X text 264 303 bang to graph once;
#X obj 27 328 /~ 4096;
#X obj 292 54 bang~;
#X msg 211 413 \; pd dsp 1;
#X obj 292 102 / 4096;
#X obj 58 135 osc~;
#X obj 58 163 +~ 1;
#X obj 28 188 *~;
#X text 113 138 hanning window;
#X obj 254 79 0.5;
#X obj 240 390 tabwrite~ F12-spectrum;
#X connect 0 0 26 0;
#X connect 1 0 22 0;
#X connect 1 0 29 0;
#X connect 2 0 3 0;
#X connect 2 0 3 1;
#X connect 2 1 4 0;
#X connect 2 1 4 1;
#X connect 3 0 5 0;
#X connect 4 0 5 0;
#X connect 5 0 7 0;
#X connect 7 0 20 0;
#X connect 15 0 23 0;
#X connect 16 0 29 0;
#X connect 17 0 16 0;
#X connect 17 0 22 0;
#X connect 20 0 29 0;
#X connect 21 0 15 0;
#X connect 21 0 28 0;
#X connect 23 0 24 0;
#X connect 24 0 25 0;
#X connect 25 0 26 1;
#X connect 26 0 2 0;
#X connect 28 0 24 1;
#X restore 148 725 pd fft;
#X obj 208 704 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X obj 208 725 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
1;
#X text 229 724 <-- repeatedly;
#X text 230 704 <-- graph once;
#X text 17 21 Instead of using the two cosines as FM carrier oscillators
\, we can use them as ring modulators for a natural or synthetic tone.
Here we use waveshaping - to wit \, a sinusoid looking up a Gaussian
bell curve. This has the nice properties that the partials are always
positive cosines in phase \, and the spectrum spreads out smoothly
as the index changes.;
#X text 98 1 PAF: TWO-COSINE RING MODULATOR FOR WAVESHAPER;
#X text 17 253 Then with ~* we do the ring modulation and we're done.
This is the PAF (phase-aligned formant) synthesis algorithm (patented
1993 by IRCAM).;
#X obj 224 492 *~ 0.5;
#X text 17 129 For phase coherency \, the waveshaper and the cosine
pair are driven from the same phasor~ object. Since the waveshaping
is done using a symmetric curve \, its output is at double the frequency
of the input. So for each cycle of the phasor we compute a half-cycle
of the sine function (by multiplying by 0.5 and subtracting 0.25 before
the cosine lookup). We center the cosine output for lookup in a 200-point
table containing a bell curve.;
#X connect 0 0 6 1;
#X connect 0 0 8 0;
#X connect 1 0 5 0;
#X connect 1 0 0 0;
#X connect 2 0 6 0;
#X connect 3 0 4 1;
#X connect 3 0 7 1;
#X connect 4 0 1 1;
#X connect 5 0 2 0;
#X connect 6 0 7 0;
#X connect 7 0 8 1;
#X connect 8 0 31 0;
#X connect 9 0 4 0;
#X connect 9 0 3 0;
#X connect 10 0 11 0;
#X connect 11 0 15 0;
#X connect 13 0 9 0;
#X connect 15 0 13 0;
#X connect 16 0 9 1;
#X connect 16 0 5 1;
#X connect 16 0 1 0;
#X connect 16 0 53 0;
#X connect 17 0 16 0;
#X connect 21 0 24 0;
#X connect 22 0 23 1;
#X connect 23 0 29 0;
#X connect 24 0 22 0;
#X connect 27 0 23 0;
#X connect 28 0 27 0;
#X connect 29 0 30 0;
#X connect 30 0 31 1;
#X connect 31 0 44 0;
#X connect 31 0 45 0;
#X connect 44 0 43 0;
#X connect 44 0 43 1;
#X connect 46 0 45 1;
#X connect 47 0 45 2;
#X connect 53 0 28 0;