#N canvas 240 229 900 586 12; #X obj 220 171 line~; #X obj 220 147 pack 0 50; #X floatatom 220 46 0 0 0 0 - - -; #X obj 70 108 *~; #X obj 220 72 / 10; #X obj 220 96 moses 0; #X msg 220 120 0; #X text 215 28 bandwidth; #X obj 78 141 *~; #X obj 18 141 sig~ 1; #X obj 39 194 /~; #X obj 54 168 +~; #X text 111 141 X^2; #X text 84 171 1+X^2; #X text 71 196 1/(1+X^2); #X text 28 4 ANOTHER PULSE WIDTH MOD ALGORITHM; #N canvas 0 0 450 300 graph1 0; #X array F04-signal 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; #X restore 646 328 graph; #N canvas 0 0 450 300 graph1 0; #X array F04-spectrum 259 float 0; #X coords 0 1.01 258 -0.008 256 200 1; #X restore 587 38 graph; #X text 646 461 ---- 0.02 seconds ----; #X text 614 237 2; #X text 645 237 4; #X text 584 237 0; #X text 622 252 -- partial number --; #X text 677 237 6; #X text 710 237 8; #X text 738 237 10; #X text 770 237 12; #X text 802 237 14; #X obj 40 277 output~; #X obj 39 246 hip~; #N canvas 122 211 558 609 fft 0; #X obj 19 61 inlet~; #X obj 224 210 inlet; #X obj 29 92 rfft~; #X obj 29 125 *~; #X obj 60 125 *~; #X obj 29 155 sqrt~; #X obj 332 109 block~ 4096 1; #X obj 29 181 biquad~ 0 0 0 0 1; #X text 93 93 Fourier series; #X text 98 146 magnitude; #X text 96 131 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 193 164 delay two samples; #X text 191 182 for better graphing; #X obj 264 434 samplerate~; #X obj 251 255 metro 500; #X obj 251 232 inlet; #X text 301 232 toggle to graph repeatedly; #X text 278 210 bang to graph once; #X obj 29 205 /~ 4096; #X obj 264 409 bang~; #X obj 264 457 / 512; #X obj 19 295 tabwrite~ F04-signal; #X obj 250 291 tabwrite~ F04-spectrum; #X obj 264 483 s freq/2; #X msg 224 321 \; pd dsp 1; #X connect 0 0 2 0; #X connect 0 0 23 0; #X connect 1 0 23 0; #X connect 1 0 24 0; #X connect 1 0 26 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 22 0; #X connect 16 0 23 0; #X connect 16 0 24 0; #X connect 17 0 16 0; #X connect 17 0 26 0; #X connect 20 0 24 0; #X connect 21 0 15 0; #X connect 22 0 25 0; #X restore 93 248 pd fft; #X obj 153 227 bng 18 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 153 248 tgl 18 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X text 174 247 <-- repeatedly; #X text 175 227 <-- graph once; #X obj 69 81 osc~; #X text 632 540 updated for Pd version 0.37; #X text 23 515 NOTE: The PAF algorithm is protected by patents belonging to IRCAM. Noncommercial use seems to be fine with them but contact them first if you want to sell something using this.; #X text 24 473 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm.; #X text 23 342 Here we use waveshaping to make another form of pulse train. This one has a neat spectrum: the partials drop off exponentially (with the "bandwidth" controlling the rate of dropoff.) In later patches we'll use a wavetable to do the waveshaping but for simplicity \, it's done algebraically here. The oscillator runs at half the fundamental frequency. The symmetry of the waveshaping doubles the frequency of the output.; #X text 849 222 0; #X text 846 35 1; #X obj 69 56 r freq/2; #X connect 0 0 3 1; #X connect 1 0 0 0; #X connect 2 0 4 0; #X connect 3 0 8 0; #X connect 3 0 8 1; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 5 1 1 0; #X connect 6 0 1 0; #X connect 8 0 11 1; #X connect 9 0 10 0; #X connect 9 0 11 0; #X connect 10 0 29 0; #X connect 10 0 30 0; #X connect 11 0 10 1; #X connect 29 0 28 0; #X connect 29 0 28 1; #X connect 31 0 30 1; #X connect 32 0 30 2; #X connect 35 0 3 0; #X connect 42 0 35 0;