#N canvas 211 116 733 546 12;
#X obj 75 424 osc~;
#X obj 125 206 r poll-table;
#X obj 176 349 + 50;
#X obj 176 375 dbtorms;
#X msg 125 351 0;
#X obj 125 404 pack 0 30;
#X obj 125 434 line~;
#X obj 75 483 throw~ sum-bus;
#X obj 75 454 *~;
#X obj 75 99 r pitch;
#X obj 75 126 mtof;
#X obj 125 242 f;
#X obj 75 154 * \$1;
#X obj 84 184 ftom;
#X obj 126 268 -;
#X obj 168 267 r whammybar;
#X text 108 58 \$1 is the partial number.;
#X text 126 126 pitch to frequency;
#X text 125 153 then get the frequency of this specific partial;
#X text 128 179 ... and then convert back to pitch.;
#X text 162 242 ... at which time we get the pitch back...;
#X text 271 261 ... and transpose \, effectively shifting the spectral
envelope left and right.;
#X text 250 353 The vertical scale is dB from 1 to 50 \, but we want
true zero when the table value is 0 or less.;
#X text 219 410 Amplitude control via pack \, line~ \, and *~.;
#X text 218 456 Finally \, add to a summing bus via throw~. All the
throw~s in the instantiations of this abstraction will add into the
one "catch~ sum-bus" at the output.;
#X text 218 206 the calling patch bangs "poll-table" every 30 msec.
;
#X obj 125 296 tabread4 spectrum-tab;
#X text 293 304 Finally get the strength from the table. Note that
we use the control object \, tabread4 \, not tabread4~.;
#X obj 125 323 moses 1;
#X text 75 21 This abstraction is used by the spectrum drawing example
D08.table.spectrum.pd, f 40;
#X connect 0 0 8 0;
#X connect 1 0 11 0;
#X connect 2 0 3 0;
#X connect 3 0 5 0;
#X connect 4 0 5 0;
#X connect 5 0 6 0;
#X connect 6 0 8 1;
#X connect 8 0 7 0;
#X connect 9 0 10 0;
#X connect 10 0 12 0;
#X connect 11 0 14 0;
#X connect 12 0 13 0;
#X connect 12 0 0 0;
#X connect 13 0 11 1;
#X connect 14 0 26 0;
#X connect 15 0 14 1;
#X connect 26 0 28 0;
#X connect 28 0 4 0;
#X connect 28 1 2 0;
