WHISPER Whisper takes a sound source input (from the ADC stream), converts the signal to the frequency domain, converts it back to time domain and dumps the signal into the DAC stream. The fun part is fiddling with the frequency data before it's converted back to the time domain. The conversion is done through a double-buffered overlap FFT: When an ADC buffer (N) arrives, the last half of the N-1 buffer is concatenated with the first half of N and the concatenated buffer is sent to the FFT convertor. N itself is then converted. The buffers are queued up in an internal (circular) FFT buffer array. On the DAC side, FFT buffers are plucked (in order) from the array, un-transformed, windowed (using half a cosine wave, shifted to positive as the scaler), and dumped into the DAC stream. Each DAC buffer is the sum of the last half of N-1, all of N, and the first half of N+1 offset to frame_count/2. To install your own FFT fiddler, go into fft_ears.cpp and rewrite one of the five fiddle functions: Shift(), Whisper(), Flipper(), Convolve(), or Splatter() These correspond to the five radio button settings in the app's Fiddle panel. (Or you can add new buttons; look in fft_win.cpp.) The value from the main window's slider are in the range (0, 1000). When the slider is moved, the new value shows up in one of the fiddle_val setting function (ShiftFiddleVal(), FlipperFiddleVal(), etc) that correspond to the five fiddle functions. If you want to transform the (0, 1000) range into something else, this is your chance. For example, Splatter wants the value converted to within (0, 1.0); so the SplatterFiddleValue() function goes something like this: void fft_ears::SplatterFiddleValue(float val) { /* SCROLL_RANGE is defined in fft_defs.h */ fiddle_val = (val/SCROLL_RANGE); } The fiddle_val value can be applied to whatever you want.