#N canvas 684 407 470 320 10; #X obj 25 189 dac~; #N canvas 0 22 470 320 rich-harmonic-source 0; #X obj 127 232 outlet~; #X obj 127 125 phasor~ 100; #X obj 212 126 phasor~ 125; #X obj 296 125 phasor~ 150; #X obj 127 183 *~ 0.3; #X floatatom 127 67 5 0 0 0 - - -; #X obj 212 99 * 1.25; #X obj 296 100 * 1.5; #X obj 130 34 hsl 128 15 60 600 0 0 empty empty empty -2 -6 0 8 -154413 -1 -1 8900 1; #X connect 1 0 4 0; #X connect 2 0 4 0; #X connect 3 0 4 0; #X connect 4 0 0 0; #X connect 5 0 6 0; #X connect 5 0 1 0; #X connect 5 0 7 0; #X connect 6 0 2 0; #X connect 7 0 3 0; #X connect 8 0 5 0; #X restore 25 23 pd rich-harmonic-source; #X floatatom 91 66 5 0 0 0 - - -; #N canvas 179 221 657 470 vocal-source 0; #X text 13 300 try a vocal sound or other sound with strong formant structure; #X obj 31 194 soundfiler; #X obj 31 160 openpanel; #N canvas 0 22 450 300 graph1 0; #X array crossx-sound1 4e+06 float 2; #X coords 0 1 4e+06 -1 200 140 1; #X restore 237 13 graph; #X msg 31 131 bang; #X obj 227 284 outlet~; #X msg 227 244 bang; #X obj 348 228 spigot; #X obj 385 205 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X text 63 132 open the sound; #X text 133 244 then play it; #X text 304 190 loop if you like; #X msg 31 177 read -resize \$1 crossx-sound1; #X obj 227 268 tabplay~ crossx-sound1; #X connect 2 0 12 0; #X connect 4 0 2 0; #X connect 6 0 13 0; #X connect 7 0 6 0; #X connect 8 0 7 1; #X connect 12 0 1 0; #X connect 13 0 5 0; #X connect 13 1 7 0; #X restore 58 45 pd vocal-source; #X msg 186 229 \; pd dsp \$1; #X obj 186 208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 25 160 *~ 1; #X floatatom 48 141 5 0 0 0 - - -; #X text 90 143 <- might need large amplitude; #X text 96 155 but watch for sudden spikes!; #X text 133 70 <- synthesis advancement threshold; #N canvas 172 351 466 316 crossx-block 0; #X obj 161 178 outlet~; #X obj 161 49 inlet~; #X obj 219 100 inlet; #X obj 283 102 inlet; #X obj 161 213 block~ 256; #X obj 190 80 inlet~; #X obj 161 132 crossx~ 4; #X connect 1 0 6 0; #X connect 2 0 6 2; #X connect 3 0 6 0; #X connect 5 0 6 1; #X connect 6 0 0 0; #X restore 25 88 pd crossx-block; #N canvas 0 22 458 308 messages 0; #X obj 56 233 outlet; #X msg 56 175 autonorm \$1; #X text 56 66 frame normalization to tame amplitude spikes; #X obj 209 217 fftease-system; #N canvas 0 22 458 308 rescale-autonorm 0; #X obj 93 30 inlet; #X obj 61 92 t b b; #X msg 61 115 1; #X msg 108 118 0.05; #X obj 108 144 s output-gain; #X obj 96 221 outlet; #X obj 197 49 inlet; #X obj 226 102 t b b; #X obj 243 237 s output-gain; #X msg 313 130 0; #X msg 243 211 5; #X obj 261 174 pipe 100; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 5 0; #X connect 3 0 4 0; #X connect 6 0 7 0; #X connect 7 0 11 0; #X connect 7 1 9 0; #X connect 9 0 5 0; #X connect 10 0 8 0; #X connect 11 0 10 0; #X restore 56 122 pd rescale-autonorm; #X obj 56 93 bng 15 250 50 0 empty empty on 0 -6 0 8 -262144 -1 -1 ; #X obj 184 94 bng 15 250 50 0 empty empty off 0 -6 0 8 -262144 -1 -1 ; #X connect 1 0 0 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 4 0; #X connect 6 0 4 1; #X restore 143 88 pd messages; #X obj 48 118 r output-gain; #X text 96 170 a compressor could be useful here; #X obj 215 51 hsl 128 15 0 0.05 0 0 empty empty empty -2 -6 0 8 -191432 -1 -1 700 1; #X text 26 262 crossx~ is related to xsyn~ but uses a threshold to determine whether to perform spectral multiplication or maintain the last calculated amplitude/phase pair. crossx~ is also somewhat less CPU intensive.; #X connect 1 0 11 0; #X connect 2 0 11 2; #X connect 3 0 11 1; #X connect 5 0 4 0; #X connect 6 0 0 0; #X connect 6 0 0 1; #X connect 7 0 6 1; #X connect 11 0 6 0; #X connect 12 0 11 3; #X connect 13 0 7 0; #X connect 15 0 2 0;