[download source]
FreqTweak is a tool for FFT-based realtime audio spectral manipulation and display. It provides several algorithms for processing audio data in the frequency domain and a highly interactive GUI to manipulate the associated filters for each. It also provides high-resolution spectral displays in the form of scrolling-raster spectrograms and energy vs frequency plots displaying both pre- and post-processed spectra.

It is an extremely addictive audio toy, but I hope it has value for serious audio work too (sound design, etc). The spectrum analysis is pretty useful in its own right.

Moved repository to github -- 4 Aug 2019 -- should build now without patches on recent systems

Get the source code and build it yourself from github:

FreqTweak supports manipulating the spectral filters at several frequency resolutions (64,128,256,512,1024,2048, or 4096 bands) depending on your needs/resources. Overlap and windowing are also selectable.

The GUI filter graph manipulators (and analysis plots) have selectable frequency scale types: 1x and 2x linear, and two log scales to help with modulating the musical frequencies. Filters can be linked across multiple channels. The plots are resizable and zoomable (y-axis) to allow precise editing of filter values.

The current processing filters are described below in the order audio is processed in the chain. Any or all of the filters can be bypassed. The state of all filters can be stored or loaded as presets.

  • Spectral Analysis -- Multicolor scrolling-raster spectrogram, or energy vs. freq line or bar plots... one shows pre-processed, another shows post-processed.
  • EQ Cut/Boost -- Your basic multi-band frequency attenuation. But you get an unhealthy number of bands... Note that this EQ is not intended for mastering purposes, it allows for (and doesn't protect against) highly irregular filtering. Two versions, one does only frequency gain cut, the other boost.
  • Pitch Scaling -- This is an interesting application of Sprengler's pitch scaling algorithm (used in Steve Harris' LADSPA plugin). If you keep all the bins at the same scale, it is equivalent to Steve's plugin, but when you start applying different scales per frequency bin, things quickly get weird. For highest quality results (at the expense of transients) use larger FFT (>= 1024 bins).
  • Gate -- This is a double filter where a given frequency band is allowed to pass through (unaltered) if the power on that band is between two dB thresholds... otherwise its gain is clamped to 0.
  • Delay -- This lets you delay the audio on a per frequency-bin basis yielding some pretty wild effects (or subtle, if you are careful). A feedback filter controls the feedback of the delay per bin (be careful with this one).
  • Limit -- This is very harsh brick wall limiter on a per-bin basis. It is not very pleasant, but can be interesting.
  • Compressor -- This is a massively multiband compressor. It will not behave quite like a normal time-domain compressor because of the inherent block processing of the FFT. Each frequency bin has its own compressor complete with Threshold, Ratio, Attack/Release time, and makeup gain. This is *not* suitable for mastering applications!
  • Warp -- This one is a little different, both axes represent frequency, and the identity matrix is unaltered audio. Changing the value (height) of a bin, reallocates the energy at that frequency to the new frequency bin represented by the height of the bar. For instance, if all bins are the same height, all the frequency energy is added to a single bin. This is a sensitive filter, the Log frequency scale is helpful here (it affects both axes).

Modulators to an filter can be attached from the Modulations Window (Control->Modulators... Ctrl-M). Add a modulator by clicking on the Add Modulator... button and select from the choices. To attach a modulator to a filter, click on the Attach... button on the modulator panel and pick a filter. You can modulate many filters simultaneously. The text entry fields can be used to exactly set the slider values, by pressing enter/return after entering the number.

The following modulators are currently implemented, with more to come soon.

  • Rotate -- This will continually shift a filter horizontally at a constant definable Rate, wrapping when it reaches the edge. The edges are definable with the Min and Max Freq controls.
  • Rotate LFO -- The same as the above, except the shifting rate oscillates via LFO with its own Rate and Depth controls. Currently there are sine, triangle, and square waveform shapes. The frequency range that the modulator affects is definable with the Min and Max Freq controls.
  • Value LFO -- Shifts the values up and down with an LFO. The depth control here is percentage of total value range. The frequency range that the modulator affects is definable with the Min and Max Freq controls.
  • Randomize -- Randomizes the bin values between the given value bounds (as percentages of total range). Again, the frequency range that the modulator affects is definable with the Min and Max Freq controls.

  • JACK -- providing realtime low-latency audio interconnection and delivery.
  • FFTW -- for speedy FFT processing (compiled as single-precision). v2 and v3 supported.
  • wxWidgets -- the GUI toolkit I've chosen to use. It should work with versions at or above 2.6.x.
  • libsigc++ 2.0 -- this library is usually already on recent systems, but if not get it and install it.

Mouse Control
  • Left button click/drag to draw filters. If Control is down, the y-axis is fixed at the last cursor location (to draw nice horizontal lines). If Control and Alt are down you can draw nice arbitrary straight lines.
  • Right button drag to move filters around in space. The filters wrap around the left/right edges unless you hold down Control. Dragging with both left and right buttons down moves both primary and alternate together (on Gate).
  • Holding Shift modifies the alternate filter (on double filter graphs like Gate) for the previous operations.
  • Middle-button pops up frequency axis menu.
  • Ctrl-Alt right-click resets a filter to default values.
  • Shift-Ctrl-Alt Left-Drag zooms in on the y axis. Look at the status bar to see the values for the cursor itself and the values of the filter at the cursor's frequency. Shift-Ctrl-Alt Right click-release resets the Y-zoom to full.
  • The B and BA buttons mean Bypass and Bypass All respectively.
  • The L and LA buttons mean Link and Link All respectively.
  • The G and GS buttons mean Toggle Grid and Toggle Grid Snap respectively. The right button can be used on the Grid buttons to choose the grid resolution.

  • MIDI/OSC control of filter and modulators
  • non-GUI version

Please address questions, bugfixes, etc to the mailing list at freqtweak-user@lists.sourceforge.net
Created by Jesse Chappell <jesse at essej dot net>

Last modified: Mon Aug 5 12:19:46 EDT 2019