<div dir="ltr">I have a feeling that the phase information may be important to keep around.<div><br></div><div>I added a moving average filter into your code, and then added that average into the accumulation spectrum. I&#39;m also including the phase information, and while it all sounds more &quot;smeary&quot;, it is also introducing windowing artifacts (I think that&#39;s what those are). </div><div><br></div><div>I would be interested in a way to clean those up.<br><div><br></div><div>







<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s1">SinOsc</span><span class="gmail-s2"> </span>synth<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s1">FFT</span><span class="gmail-s2"> </span>fft<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">blackhole</span>;</font></p>
<p class="gmail-p2"><font face="monospace, monospace">UAnaBlob<span class="gmail-s2"> blob;</span></font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s1">IFFT</span><span class="gmail-s2"> </span>ifft<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">dac</span>;</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p1"><font face="monospace, monospace">synth.freq(<span class="gmail-s4">440</span>);</font></p>
<p class="gmail-p1"><font face="monospace, monospace">synth.gain(<span class="gmail-s4">0</span>.<span class="gmail-s4">1</span>);</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p4"><font face="monospace, monospace">// set parameters</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s4">1024</span><span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span>fft.size;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s5">Windowing</span>.hamming(fft.size() / <span class="gmail-s4">2</span>) =&gt; fft.window;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s5">Windowing</span>.hamming(fft.size() / <span class="gmail-s4">2</span>) =&gt; ifft.window;</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p4"><font face="monospace, monospace">// place to hold the FFT data as it comes in</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s3">complex</span><span class="gmail-s2"> </span>spec[fft.size()/<span class="gmail-s4">2</span>];</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p4"><font face="monospace, monospace">// place to store the accumulated FFT data, preload with zeroes</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s3">complex</span><span class="gmail-s2"> </span>acc[fft.size()/<span class="gmail-s4">2</span>];</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s3">for</span>(<span class="gmail-s4">0</span><span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">int</span><span class="gmail-s2"> </span>i;<span class="gmail-s2"> </span>i<span class="gmail-s2"> </span>&lt;<span class="gmail-s2"> </span>acc.cap();<span class="gmail-s2"> </span>i++)<span class="gmail-s2"> </span>{</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">    </span>#(<span class="gmail-s4">0</span>,<span class="gmail-s2"> </span><span class="gmail-s4">0</span>)<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span>acc[i];</font></p>
<p class="gmail-p1"><font face="monospace, monospace">}</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p4"><font face="monospace, monospace">// do it!</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s3">spork</span><span class="gmail-s2"> </span>~<span class="gmail-s2"> </span>sawTune();</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s3">spork</span><span class="gmail-s2"> </span>~<span class="gmail-s2"> </span>accumulateFrequenciesViaFFT(fft.size()/<span class="gmail-s4">2</span>);</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p5"><font face="monospace, monospace">while<span class="gmail-s2"> (</span>true<span class="gmail-s2">) {</span></font></p>
<p class="gmail-p5"><font face="monospace, monospace"><span class="gmail-s2">    </span><span class="gmail-s4">1</span><span class="gmail-s2">::</span>second<span class="gmail-s2"> =&gt; </span>now<span class="gmail-s2">;</span></font></p>
<p class="gmail-p1"><font face="monospace, monospace">}</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s3">fun</span><span class="gmail-s2"> </span><span class="gmail-s3">void</span><span class="gmail-s2"> </span>accumulateFrequenciesViaFFT(<span class="gmail-s3">int</span><span class="gmail-s2"> </span>HALF_FFT_SIZE)<span class="gmail-s2"> </span>{</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">    </span><span class="gmail-s4">4</span><span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">int</span><span class="gmail-s2"> </span>FILTER_SIZE;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">    </span><span class="gmail-s3">float</span><span class="gmail-s2"> </span>movingAverageMag[FILTER_SIZE][HALF_FFT_SIZE];</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">    </span><span class="gmail-s3">float</span><span class="gmail-s2"> </span>movingAveragePhase[FILTER_SIZE][HALF_FFT_SIZE];</font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">    </font></span></p>
<p class="gmail-p5"><font face="monospace, monospace"><span class="gmail-s2">    </span>while<span class="gmail-s2">( </span>true<span class="gmail-s2"> )</span></font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">    </span><span class="gmail-s2">{</span></font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">        </span>fft.upchuck()<span class="gmail-s2"> </span>@=&gt;<span class="gmail-s2"> </span>blob;</font></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">        </span>// get the data</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">        </span>blob.cvals()<span class="gmail-s2"> </span>@=&gt;<span class="gmail-s2"> </span>spec;</font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">        </font></span></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">        </span>// for every bin...</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">        </span><span class="gmail-s3">for</span>(<span class="gmail-s4">0</span><span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">int</span><span class="gmail-s2"> </span>i;<span class="gmail-s2"> </span>i<span class="gmail-s2"> </span>&lt;<span class="gmail-s2"> </span>spec.cap();<span class="gmail-s2"> </span>i++)<span class="gmail-s2"> </span>{</font></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>// get the mag/phase for each bin by converting to polar</font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">            </span><span class="gmail-s2">spec[i]</span> <span class="gmail-s2">$</span> <span class="gmail-s3">polar</span> <span class="gmail-s2">=&gt;</span> <span class="gmail-s3">polar</span> <span class="gmail-s2">newBin;</span></font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">            </font></span></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>// and get our running totals from acc</font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">            </span><span class="gmail-s2">acc[i]</span> <span class="gmail-s2">$</span> <span class="gmail-s3">polar</span> <span class="gmail-s2">=&gt;</span> <span class="gmail-s3">polar</span> <span class="gmail-s2">accBin;</span></font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">            </font></span></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>// move old values down the line</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span><span class="gmail-s3">for</span><span class="gmail-s2"> </span>(FILTER_SIZE<span class="gmail-s2"> </span>-<span class="gmail-s2"> </span><span class="gmail-s4">1</span><span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">int</span><span class="gmail-s2"> </span>j;<span class="gmail-s2"> </span>j<span class="gmail-s2"> </span>&gt;<span class="gmail-s2"> </span><span class="gmail-s4">0</span>;<span class="gmail-s2"> </span>j--)<span class="gmail-s2"> </span>{</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">                </span>movingAverageMag[j<span class="gmail-s2"> </span>-<span class="gmail-s2"> </span><span class="gmail-s4">1</span>][i]<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span>movingAverageMag[j][i];</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">                </span>movingAveragePhase[j<span class="gmail-s2"> </span>-<span class="gmail-s2"> </span><span class="gmail-s4">1</span>][i]<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span>movingAveragePhase[j][i];</font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">            </span><span class="gmail-s2">}</span> <span class="gmail-Apple-converted-space">         </span></font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">              </font></span></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>// add in new value</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span>newBin.mag<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span>movingAverageMag[<span class="gmail-s4">0</span>][i];</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span>newBin.phase<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span>movingAveragePhase[<span class="gmail-s4">0</span>][i];</font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">            </font></span></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>// get sums for averaging</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span><span class="gmail-s3">float</span><span class="gmail-s2"> </span>magSum,<span class="gmail-s2"> </span>phaseSum;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span><span class="gmail-s3">for</span><span class="gmail-s2"> </span>(<span class="gmail-s4">0</span><span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">int</span><span class="gmail-s2"> </span>j;<span class="gmail-s2"> </span>j<span class="gmail-s2"> </span>&lt;<span class="gmail-s2"> </span>FILTER_SIZE;<span class="gmail-s2"> </span>j++)<span class="gmail-s2"> </span>{</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">                </span>movingAverageMag[j][i]<span class="gmail-s2"> </span>+=&gt;<span class="gmail-s2"> </span>magSum;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">                </span>movingAveragePhase[j][i]<span class="gmail-s2"> </span>+=&gt;<span class="gmail-s2"> </span>phaseSum;</font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">            </span><span class="gmail-s2">}</span></font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">            </font></span></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">            </span><span class="gmail-s6">// average</span></font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span>magSum/FILTER_SIZE<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">float</span><span class="gmail-s2"> </span>magAvg;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span>phaseSum/FILTER_SIZE<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">float</span><span class="gmail-s2"> </span>phaseAvg;</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span>magAvg<span class="gmail-s2"> </span>*<span class="gmail-s2"> </span><span class="gmail-s4">0</span>.<span class="gmail-s4">005</span><span class="gmail-s2"> </span>+=&gt;<span class="gmail-s2"> </span>accBin.mag;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">            </span>phaseAvg<span class="gmail-s2"> </span>*<span class="gmail-s2"> </span><span class="gmail-s4">0</span>.<span class="gmail-s4">005</span><span class="gmail-s2"> </span>+=&gt;<span class="gmail-s2"> </span>accBin.phase;</font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">            </font></span></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>// let phase pass through</font></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>//newBin.phase =&gt; accBin.phase;</font></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>/*Math.random2f(0, 2*pi) =&gt; accBin.phase;*/</font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">            </font></span></p>
<p class="gmail-p4"><font face="monospace, monospace"><span class="gmail-s2">            </span>// convert back to complex and put back in the acc array</font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">            </span><span class="gmail-s2">accBin</span> <span class="gmail-s2">$</span> <span class="gmail-s3">complex</span> <span class="gmail-s2">=&gt;</span> <span class="gmail-s2">acc[i];</span></font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">        </span><span class="gmail-s2">}</span></font></p>
<p class="gmail-p3"><span class="gmail-Apple-converted-space"><font face="monospace, monospace">        </font></span></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">        </span>ifft.transform(acc);</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">        </span>(fft.size() / <span class="gmail-s4">4</span>)::<span class="gmail-s3">samp</span><span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">now</span>;</font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">    </span><span class="gmail-s2">}</span></font></p>
<p class="gmail-p1"><font face="monospace, monospace">}</font></p>
<p class="gmail-p3"><font face="monospace, monospace"><br></font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s3">fun</span><span class="gmail-s2"> </span><span class="gmail-s3">void</span><span class="gmail-s2"> </span>sawTune()<span class="gmail-s2"> </span>{</font></p>
<p class="gmail-p5"><font face="monospace, monospace"><span class="gmail-s2">    </span>while<span class="gmail-s2"> (</span>true<span class="gmail-s2">) {</span></font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">        </span><span class="gmail-s5">Math</span>.random2(<span class="gmail-s4">48</span>,<span class="gmail-s2"> </span><span class="gmail-s4">92</span>)<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span><span class="gmail-s3">int</span><span class="gmail-s2"> </span>midinote;</font></p>
<p class="gmail-p1"><font face="monospace, monospace"><span class="gmail-s2">        </span><span class="gmail-s5">Math</span>.mtof(midinote)<span class="gmail-s2"> </span>=&gt;<span class="gmail-s2"> </span>synth.freq;</font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">        </span><span class="gmail-s4">333</span><span class="gmail-s2">::</span><span class="gmail-s3">ms</span> <span class="gmail-s2">=&gt;</span> <span class="gmail-s3">now</span><span class="gmail-s2">;</span></font></p>
<p class="gmail-p6"><font face="monospace, monospace"><span class="gmail-Apple-converted-space">    </span><span class="gmail-s2">}</span></font></p>
<p class="gmail-p1"><font face="monospace, monospace">}</font></p></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Oct 14, 2017 at 10:31 AM, Jascha Narveson <span dir="ltr">&lt;<a href="mailto:jnarveson@wesleyan.edu" target="_blank">jnarveson@wesleyan.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Here’s the same thing as my original questions, but with some polite windowing - same problems persist: I’m hearing attacks (why?) and it’s pretty noisy - I guess because letting magnitudes creep up across the spectrum I’m just ultimately aiming for a big loud saw wave.<br>
<br>
So I guess I’m looking to do two things:<br>
<br>
- avoid hearing attacks in the resynthesized sound from my “accumulated magnitudes” spectrum<br>
<br>
- artfully avoid the inevitable sawtooth sound by changing my approach to something the follows the spirit of the original idea and not the actual idea.<br>
<br>
Thoughts?<br>
<br>
cheers,<br>
<br>
- jascha<br>
<br>
<br>
<br>
- - - - same thing, a bit better maybe - - - -<br>
<span class=""><br>
SinOsc synth =&gt; FFT fft =&gt; blackhole;<br>
UAnaBlob blob;<br>
IFFT ifft =&gt; dac;<br>
<br>
synth.freq(440);<br>
</span>synth.gain(0.5);<br>
<br>
<br>
second / samp =&gt; float srate;<br>
<br>
// set parameters<br>
1024 =&gt; fft.size;<br>
Windowing.hamming(fft.size() / 2) =&gt; fft.window;<br>
Windowing.hamming(fft.size() / 2) =&gt; ifft.window;<br>
<br>
// hold the FFT data as it comes in<br>
complex spec[fft.size()/2];<br>
<br>
// store the accumulated FFT data<br>
complex acc[fft.size()/2];<br>
<br>
// fill the accumulated complex spectral array with zeroes<br>
<span class="">for(0 =&gt; int i; i &lt; acc.cap(); i++) {<br>
  #(0, 0) =&gt; acc[i];<br>
}<br>
<br>
</span>// spork shreds<br>
spork ~ synthTune();<br>
spork ~ accumulateMagnitudesViaFFT();<br>
<span class=""><br>
while (true) {<br>
  1::second =&gt; now;<br>
}<br>
<br>
</span>fun void accumulateMagnitudesViaFFT() {<br>
<span class="">  while( true )<br>
  {<br>
      fft.upchuck() @=&gt; blob;<br>
      // get the data<br>
      blob.cvals() @=&gt; spec;<br>
<br>
      // for every bin...<br>
      for(0 =&gt; int i; i &lt; spec.cap(); i++) {<br>
        // get the mag/phase for each bin by converting to polar<br>
        spec[i] $ polar =&gt; polar newBin;<br>
<br>
        // and get our running totals from acc<br>
        acc[i] $ polar =&gt; polar accBin;<br>
<br>
        // scale the inocming mag and add it to acc<br>
        newBin.mag * 0.001 +=&gt; accBin.mag;<br>
<br>
        // let phase pass through<br>
        newBin.phase =&gt; accBin.phase;<br>
<br>
</span>        // conver back to complex and put back in the acc array<br>
<span class="">        accBin $ complex =&gt; acc[i];<br>
      }<br>
<br>
      ifft.transform(acc);<br>
</span>      (fft.size() / 4)::samp =&gt; now;<br>
  }<br>
}<br>
<br>
fun void synthTune() {<br>
<span class="">  while (true) {<br>
    Math.random2(48, 72) =&gt; int midinote;<br>
    Math.mtof(midinote) =&gt; synth.freq;<br>
    333::ms =&gt; now;<br>
</span>    &lt;&lt;&lt;acc[6] $ polar &gt;&gt;&gt;; // just to check - yep: they&#39;re getting bigger...<br>
<div class="HOEnZb"><div class="h5">  }<br>
}<br>
<br>
<br>
<br>
&gt; On Oct 14, 2017, at 12:26 PM, Jascha Narveson &lt;<a href="mailto:jnarveson@wesleyan.edu">jnarveson@wesleyan.edu</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; Chuck list! Help!<br>
&gt;<br>
&gt; I have the following idea and I’d like to hear what it sounds like:<br>
&gt;<br>
&gt; - play a sound into an FFT<br>
&gt; - as the FFT runs, for each bin:<br>
&gt; - - look at the magnitude info<br>
&gt; - - take a small fraction of this info and store it in a running total<br>
&gt; - - let the phase pass through unchanged<br>
&gt; - use the spectral data in the running total for the IFFT<br>
&gt;<br>
&gt; What I was hoping for was a slow emerging smear of all the frequencies from the input sound, kind of like a weird version of some kind of “infinite sustain” reverb.<br>
&gt;<br>
&gt; What I’m getting is the attacks of the original sound coming through, although fading in, and covered with noise.<br>
&gt;<br>
&gt; I think I’m doing something wrong by not doing something with the phase, but I’m not sure what.<br>
&gt;<br>
&gt; I’d love some advice…<br>
&gt;<br>
&gt; cheers,<br>
&gt;<br>
&gt; j<br>
&gt;<br>
&gt;<br>
&gt; - - - - c o d e  e x a m p l e - - - -<br>
&gt;<br>
&gt; SinOsc synth =&gt; FFT fft =&gt; blackhole;<br>
&gt; UAnaBlob blob;<br>
&gt; IFFT ifft =&gt; dac;<br>
&gt;<br>
&gt; synth.freq(440);<br>
&gt; synth.gain(0.1);<br>
&gt;<br>
&gt; // set parameters<br>
&gt; 2048 =&gt; fft.size;<br>
&gt;<br>
&gt; // place to hold the FFT data as it comes in<br>
&gt; complex spec[fft.size()/2];<br>
&gt;<br>
&gt; // place to store the accumulated FFT data, preload with zeroes<br>
&gt; complex acc[fft.size()/2];<br>
&gt; for(0 =&gt; int i; i &lt; acc.cap(); i++) {<br>
&gt;  #(0, 0) =&gt; acc[i];<br>
&gt; }<br>
&gt;<br>
&gt; // do it!<br>
&gt; spork ~ sawTune();<br>
&gt; spork ~ accumulateFrequenciesViaFFT();<br>
&gt;<br>
&gt; while (true) {<br>
&gt;  1::second =&gt; now;<br>
&gt; }<br>
&gt;<br>
&gt; fun void accumulateFrequenciesViaFFT() {<br>
&gt;  while( true )<br>
&gt;  {<br>
&gt;      fft.upchuck() @=&gt; blob;<br>
&gt;      // get the data<br>
&gt;      blob.cvals() @=&gt; spec;<br>
&gt;<br>
&gt;      // for every bin...<br>
&gt;      for(0 =&gt; int i; i &lt; spec.cap(); i++) {<br>
&gt;        // get the mag/phase for each bin by converting to polar<br>
&gt;        spec[i] $ polar =&gt; polar newBin;<br>
&gt;<br>
&gt;        // and get our running totals from acc<br>
&gt;        acc[i] $ polar =&gt; polar accBin;<br>
&gt;<br>
&gt;        // scale the inocming mag and add it to acc<br>
&gt;        newBin.mag * 0.001 +=&gt; accBin.mag;<br>
&gt;<br>
&gt;        // let phase pass through<br>
&gt;        newBin.phase =&gt; accBin.phase;<br>
&gt;                               /*Math.random2f(0, TWO_PI) =&gt; accBin.phase;*/<br>
&gt;<br>
&gt;        // convert back to complex and put back in the acc array<br>
&gt;        accBin $ complex =&gt; acc[i];<br>
&gt;      }<br>
&gt;<br>
&gt;      ifft.transform(acc);<br>
&gt;      fft.size()::samp =&gt; now;<br>
&gt;  }<br>
&gt; }<br>
&gt;<br>
&gt; fun void sawTune() {<br>
&gt;  while (true) {<br>
&gt;    Math.random2(48, 72) =&gt; int midinote;<br>
&gt;    Math.mtof(midinote) =&gt; synth.freq;<br>
&gt;    333::ms =&gt; now;<br>
&gt;  }<br>
&gt; }<br>
&gt;<br>
&gt; ______________________________<wbr>_________________<br>
&gt; chuck-users mailing list<br>
&gt; <a href="mailto:chuck-users@lists.cs.princeton.edu">chuck-users@lists.cs.<wbr>princeton.edu</a><br>
&gt; <a href="https://lists.cs.princeton.edu/mailman/listinfo/chuck-users" rel="noreferrer" target="_blank">https://lists.cs.princeton.<wbr>edu/mailman/listinfo/chuck-<wbr>users</a><br>
<br>
______________________________<wbr>_________________<br>
chuck-users mailing list<br>
<a href="mailto:chuck-users@lists.cs.princeton.edu">chuck-users@lists.cs.<wbr>princeton.edu</a><br>
<a href="https://lists.cs.princeton.edu/mailman/listinfo/chuck-users" rel="noreferrer" target="_blank">https://lists.cs.princeton.<wbr>edu/mailman/listinfo/chuck-<wbr>users</a><br>
</div></div></blockquote></div><br></div>