#N canvas 255 105 459 100 10; #X obj 5 41 nbx 5 14 0 127 0 1 \$0/squelch \$1/squelch squelch 0 -8 0 8 -260818 -1 -1 1 256; #N canvas 177 92 646 523 fft-analysis 0; #X obj 115 409 *~; #X obj 75 409 *~; #X obj 76 114 *~; #X obj 77 88 inlet~; #X obj 76 137 rfft~; #X obj 75 466 *~; #X obj 171 177 *~; #X obj 75 432 rifft~; #X obj 75 504 outlet~; #X obj 137 177 *~; #X obj 137 200 +~; #X obj 461 85 block~ 1024 4; #X obj 137 351 clip~; #X obj 110 114 tabreceive~ \$0-hann; #X obj 177 329 expr 0.01*$f1*$f1; #X obj 137 381 *~ 0.00065; #X obj 137 225 +~ 1e-20; #X obj 136 262 q8_rsqrt~; #X obj 109 466 tabreceive~ \$0-hann; #X text 211 174 squared magnitude; #X text 219 225 protect against divide-by-zero; #X text 223 261 quick 8-bit-accurate reciprocal square root; #X text 222 277 (done by table lookup - about 0.25% accurate); #X text 193 351 limit the gain to squelch*squelch/100; #X text 238 381 normalize for 1024-point \, overlap-4 Hann; #X text 151 409 multiply gain by real and complex part; #X text 152 429 of the amplitude; #X text 130 137 outputs complex amplitudes; #X text 31 5 This is Miller's compressor. Any mistakes are my own. ; #X obj 177 306 r \$0/squelch; #X msg 461 129 \; window-size 1024 \;; #X obj 461 107 loadbang; #X obj 75 485 *~ 32; #X connect 0 0 7 1; #X connect 1 0 7 0; #X connect 2 0 4 0; #X connect 3 0 2 0; #X connect 4 0 9 0; #X connect 4 0 9 1; #X connect 4 0 1 0; #X connect 4 1 6 0; #X connect 4 1 6 1; #X connect 4 1 0 0; #X connect 5 0 32 0; #X connect 6 0 10 1; #X connect 7 0 5 0; #X connect 9 0 10 0; #X connect 10 0 16 0; #X connect 12 0 15 0; #X connect 13 0 2 1; #X connect 14 0 12 2; #X connect 15 0 0 1; #X connect 15 0 1 1; #X connect 16 0 17 0; #X connect 17 0 12 0; #X connect 18 0 5 1; #X connect 29 0 14 0; #X connect 31 0 30 0; #X connect 32 0 8 0; #X restore 92 22 pd fft-analysis; #N canvas 0 110 565 454 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; #X coords 0 1 1023 0 300 100 1; #X restore 82 311 graph; #X obj 378 165 osc~; #X obj 378 190 *~ -0.5; #X obj 378 214 +~ 0.5; #X obj 331 247 tabwrite~ \$0-hann; #X obj 37 88 r window-size; #X obj 38 173 /; #X obj 127 142 samplerate~; #X obj 38 251 s window-sec; #X obj 177 204 swap; #X obj 177 228 /; #X obj 177 252 s window-hz; #X obj 49 201 * 1000; #X obj 49 228 s window-msec; #X obj 38 115 t f b f; #X msg 173 92 resize \$1; #X obj 173 116 s \$0-hann; #X obj 330 105 r window-hz; #X msg 382 130 0; #X obj 330 131 t f b; #X text 15 8 calculate Hann window table (variable window size) and constants window-hz (fundamental frequency of analysis) \, window-sec and window-msec (analysis window size in seconds and msec).; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 5 0 14 0; #X connect 6 0 8 0; #X connect 6 0 12 0; #X connect 7 0 6 1; #X connect 7 0 9 1; #X connect 9 0 10 0; #X connect 9 1 10 1; #X connect 10 0 11 0; #X connect 12 0 13 0; #X connect 14 0 6 0; #X connect 14 0 9 0; #X connect 14 1 7 0; #X connect 14 2 15 0; #X connect 15 0 16 0; #X connect 17 0 19 0; #X connect 18 0 1 1; #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; #X restore 335 44 pd hann-window; #X obj 92 1 inlet~; #X obj 92 43 outlet~; #X obj 209 22 sssad/auto \$0/squelch \$1/squelch; #X connect 1 0 4 0; #X connect 3 0 1 0; #X coords 0 -1 1 1 85 60 1 0 0;