// really really bad cross synthesizer... // source one (mic) adc => FFT X => blackhole; // source two (to be connected below) FFT Y => blackhole; // synthesis IFFT ifft => dac; // what to cross BlitSquare blt[6]; [ 40, 46, 52, 60, 64, 87] @=> int pitches[]; for( int i; i < blt.size(); i++ ) { blt[i] => Y; 20 => blt[i].harmonics; pitches[i] => Std.mtof => blt[i].freq; } // set FFT size 1024 => X.size => Y.size => int FFT_SIZE; // desired hop size FFT_SIZE / 4 => int HOP_SIZE; // set window and window size Windowing.hann(512) => X.window; Windowing.hann(512) => Y.window; Windowing.hann(512) => ifft.window; // use this to hold contents complex Z[FFT_SIZE/2]; // control loop while( true ) { // take ffts X.upchuck(); Y.upchuck(); // multiply in frequency domain for( int i; i < X.size()/2; i++ ) Math.sqrt((Y.cval(i)$polar).mag) * X.cval(i) => Z[i]; // 2 * Y.cval(i) * X.cval(i) => Z[i]; // take ifft ifft.transform( Z ); // advance time HOP_SIZE::samp => now; }