#N canvas 332 64 714 539 12;
#X obj 60 421 osc~;
#X obj 110 203 r poll-table;
#X obj 156 346 + 50;
#X obj 156 372 dbtorms;
#X msg 110 348 0;
#X obj 110 431 line~;
#X obj 60 461 *~;
#X obj 60 96 r pitch;
#X obj 60 123 mtof;
#X obj 110 239 f;
#X obj 60 151 * \$1;
#X obj 69 181 ftom;
#X obj 111 265 -;
#X obj 153 264 r whammybar;
#X text 195 71 \$1 is the partial number.;
#X text 111 123 pitch to frequency;
#X text 110 150 then get the frequency of this specific partial;
#X text 113 176 ... and then convert back to pitch.;
#X text 147 239 ... at which time we get the pitch back...;
#X text 256 258 ... and transpose \, effectively shifting the spectral envelope left and right.;
#X text 235 350 The vertical scale is dB from 1 to 50 \, but we want true zero when the table value is 0 or less.;
#X text 203 203 the calling patch bangs "poll-table" every 30 msec.;
#X obj 110 293 tabread4 spectrum-tab;
#X obj 110 320 moses 1;
#X text 162 34 This abstraction is used by the spectrum drawing example D08.table.spectrum.pd, f 40;
#X obj 60 490 outlet~;
#X obj 110 401 pack f 30;
#X text 203 442 Finally \, add to a summing bus via [throw~]. All the [throw~] objects in the instantiations of this abstraction will add into the one [catch~ sum-bus] at the output.;
#X text 204 407 Amplitude control via [pack] \, [line~] \, and [*~].;
#X text 278 301 Finally get the strength from the table. Note that we use the control object \, [tabread4] \, not [tabread4~].;
#X connect 0 0 6 0;
#X connect 1 0 9 0;
#X connect 2 0 3 0;
#X connect 3 0 26 0;
#X connect 4 0 26 0;
#X connect 5 0 6 1;
#X connect 6 0 25 0;
#X connect 7 0 8 0;
#X connect 8 0 10 0;
#X connect 9 0 12 0;
#X connect 10 0 11 0;
#X connect 10 0 0 0;
#X connect 11 0 9 1;
#X connect 12 0 22 0;
#X connect 13 0 12 1;
#X connect 22 0 23 0;
#X connect 23 0 4 0;
#X connect 23 1 2 0;
#X connect 26 0 5 0;
