#N canvas 424 19 448 622 10;
#X obj 197 378 loadbang;
#X obj 279 300 adc~ 1;
#X obj 197 422 soundfiler;
#X obj 22 396 output~;
#X obj 280 347 tabwrite~ E03-table;
#X msg 197 400 read ../sound/voice.wav E03-table;
#X obj 49 95 fiddle~ 2048;
#X obj 117 118 unpack;
#X obj 117 142 moses 1;
#X obj 190 120 mtof;
#N canvas 0 0 446 202 (subpatch) 0;
#X obj 261 30 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
;
#X obj 100 20 inlet~;
#X obj 99 87 *~;
#X obj 98 159 outlet~;
#X text 381 181 corner;
#X connect 0 0 2 1;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X coords 0 0 100 100 40 18 1;
#X restore 68 339 pd;
#N canvas 0 0 446 202 (subpatch) 0;
#X obj 261 30 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
;
#X obj 100 20 inlet~;
#X obj 99 87 *~;
#X obj 98 159 outlet~;
#X text 381 181 corner;
#X connect 0 0 2 1;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X coords 0 0 100 100 40 18 1;
#X restore 22 339 pd;
#N canvas 414 195 613 302 looper 0;
#N canvas 0 0 450 300 (subpatch) 0;
#X array E03-table 44103 float 0;
#X coords 0 1.02 44103 -1.02 200 130 1;
#X restore 349 22 graph;
#X text 347 161 ---- 44103 samples ----;
#X obj 35 77 +~ 1;
#X obj 35 25 phasor~ 1;
#X obj 35 50 *~ 44100;
#X obj 35 106 tabread4~ E03-table;
#X obj 35 132 outlet~;
#X text 46 238 one-second sample reader loop. You can replace this
with an adc~ if you want to go live.;
#X connect 2 0 5 0;
#X connect 3 0 4 0;
#X connect 4 0 2 0;
#X connect 5 0 6 0;
#X restore 22 42 pd looper;
#X text 261 379 re-read original sample;
#X obj 291 324 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X text 310 322 <-- record a sample;
#X obj 22 369 +~;
#X obj 243 169 samplerate~;
#X obj 190 168 t f b;
#X obj 50 70 delwrite~ G06-del 100;
#X obj 70 244 delread~ G06-del;
#X obj 92 292 vd~ G06-del;
#X obj 69 316 +~;
#X obj 221 222 +;
#X obj 190 143 expr 500/$f1;
#X obj 221 272 line~;
#X obj 221 249 pack 0 20;
#X text 225 120 fundamental frequency;
#X text 274 143 1/2 period \, in msec;
#X text 257 213 estimate fiddle~ delay;
#X obj 243 195 expr 2048000/$f1;
#X text 259 228 as one window (in msec);
#X obj 1 1 cnv 15 445 20 empty \$0-pddp.cnv.header octave_doubling_via_variable_comb_filter
20 10 1 18 -261139 -33289 0;
#X obj 407 2 pddp/pddplink http://puredata.info/dev/pddp -text pddp
;
#X text 135 325 on/off for;
#X text 135 355 processed sounds;
#X text 111 340 <-- original and;
#X obj 1 600 cnv 15 445 20 empty \$0-pddp.cnv.footer empty 20 12 0
14 -233017 -33289 0;
#N canvas 44 246 494 284 META 0;
#X text 12 125 WEBSITE http://crca.ucsd.edu/~msp/;
#X text 12 105 AUTHOR Miller Puckette;
#X text 12 85 LIBRARY PDDP;
#X text 12 5 GENRE tutorial;
#X text 12 45 LICENSE SIBSD;
#X text 12 145 HELP_PATCH_AUTHORS Updated for release 0.37-1. Jonathan
Wilkes revised the patch to conform to the PDDP template for Pd version
0.42.;
#X text 12 25 KEYWORDS signal;
#X text 12 65 DESCRIPTION octave doubling via variable comb filter
;
#X restore 392 602 pd META;
#N canvas 13 202 428 190 References 0;
#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0
14 -261139 -33289 0;
#X text 7 2 octave doubling- Related Help Documents;
#X text 19 37 links:;
#X restore 103 602 pd References;
#X obj 6 602 pddp/pddplink ../5.reference/pddp/help.pd -text help;
#X text 20 446 We already saw how to use ring modulation to alias a
pitched sound down one octave. Here we do the reverse: filter out all
odd harmonics using a variable-delay comb filter tuned one octave above
the incoming sound. We use two taps into the delay line. The fixed
one (delread~) adjusts for the delayed output of [fiddle~]. The variable
one (vd~) adds to this an additional delay equal to 1/2 the measured
period of the incoming sound. THese two are added. Odd harmonics are
180 degrees out of phase at the two taps and cancel. Even harmonics
get through -- so the sound goes up an octave \, without denaturing
the timbre as a speed-up would.;
#X connect 0 0 5 0;
#X connect 1 0 4 0;
#X connect 5 0 2 0;
#X connect 6 2 7 0;
#X connect 7 0 8 0;
#X connect 8 1 9 0;
#X connect 9 0 24 0;
#X connect 10 0 16 1;
#X connect 11 0 16 0;
#X connect 12 0 6 0;
#X connect 12 0 11 0;
#X connect 12 0 19 0;
#X connect 14 0 4 0;
#X connect 16 0 3 0;
#X connect 16 0 3 1;
#X connect 17 0 30 0;
#X connect 18 0 23 0;
#X connect 18 1 17 0;
#X connect 20 0 22 0;
#X connect 21 0 22 1;
#X connect 22 0 10 0;
#X connect 23 0 26 0;
#X connect 24 0 18 0;
#X connect 25 0 21 0;
#X connect 26 0 25 0;
#X connect 30 0 23 1;
#X connect 30 0 20 0;
