FFT Randomizer is a JSFX script that does spectral randomization smoothly, both magnitude and phase, to shape audio randomly. It comes with similar settings as "cloud fractal noise" algorithms in imaging software (such as the layered cloud generation) but instead of generating images, you sculpt up the spectrum's both magnitude and phase with it. In effect, it's inspired by the Diamond-square algorithm, but it is not exactly the same, as it also allows you total control over each of the layers and obviously deals with sound, not images.
Be warned, this is a geeky and experimental effect, you will probably not understand it right away or find instant uses for it in your music. It's intended to design sounds or instruments and add some life to the basic noise types we're all used to, and shape up any sound you can think of randomly to make it more interesting. It's also an effect for perfectionists who like to fiddle around with sound in more bizarre ways.
This is not your conventional FFT randomizer/processor. Most of those FFT-based tools deal with FFT bins directly, for example by randomizing them all on each window, which doesn't have many uses in my opinion, because it's dependent on the window size for the underlying effects and limited to that "geometry". It uses mathematical models that are completely independent of the bins. The only time it affects the bins is at the end of the processing chain, when they are simply interpolated and smoothed based on the model calculated prior. Think of it as having a mathematical model that gets applied to pixels on an image with values between pixels interpolated — instead of randomizing each pixel itself, which is what standard and simple FFT tools would do. The latter is obviously worse, because its effect depends on the resolution of the image itself and is very limited in effect (it only makes high frequency noise!). As a result, the output on the sonogram can look like "clouds" if used on white noise input, but it works on any signal to shape it.
I strongly recommend that you use a Spectrogram/Sonogram to visualize what this effect does, best to start with white noise as input or while setting it up, and then replace it with the actual signal you wish to process. (for example I personally use Sonogram SG-1, an excellent and free Sonogram)
- Filter any input sound randomly and dynamically by changing its magnitudes and phases, independently.
- Layer-based random shape algorithm that changes with time, so you can have smooth shapes, or more noisy shapes, and have them slow or fast independently.
- Exact and independent control over each layer, even including a spectral graph to change the layer's effect on the output, depending on frequency.
- Special "Additive Mode" on phase amounts to have all the phases changed relative to a new "center", so the entire phase spectrum will shift, but randomly.
- Ability to use special MIDI Program Change events as triggers to "reset" the shape and get a new one, within a time specified.
Since you're probably still confused about it and without having a video, follow the below two examples to get an idea of what it can do and start playing around with it.
- Use a Spectrogram/Sonogram that allows you to visualize easily in realtime (the one I use: Sonogram SG-1), insert it after this script, and keep it open (to look at it).
- Send white noise to the input of this script, it should show up as white noise on the Sonogram for now.
- Reduce the Gain so it won't blow your speakers, say set it to -20dB.
- You should have Layer 1 selected in the drop-down by default. Then adjust the Magnitude Range (dB) to an amount that is less than the Gain, say to 16dB.
- Increase the Magnitude Speed (Hz) so the changes start to happen faster, make it about 1 Hz or so to be smooth, since we're on Layer 1.
- You should see patterns in the sonogram on the noise! Your white noise is no longer boring and static, and it varies over time: its magnitude over different frequencies is being changed. Try play with Magnitude Contrast and see what you get! What is the difference? Increasing the contrast clearly makes the variations more sharp, right? What about decreasing it?
And remember this is just one layer, try changing the layer from the drop-down menu and see the difference it makes (don't forget to also set that new layer's respective parameters, as all of the above are specific to each layer, except for Gain). Also remember that, while white noise is a good way to see and learn how this works, and even during designing the parameters and setting it up, the script can actually be used on any input! Please don't forget to turn Gain lower if you add multiple layers with more dB range, though.
Simple Example Showcase
Here's a very simplistic example of a nice evolving sound you can generate with it by just adjusting a few parameters:
- Send white noise to this effect.
- We want to change Layer 5, so click on Edit Layer dropdown list, and select Layer 5.
- Set the Gain (dB) to -27.
- Set the Magnitude Range (dB) to 42.
- Set the Magnitude Contrast to 15 (max).
- Set the Magnitude Speed (Hz) to 0.5.
- Set the Magnitude Speed Modulation Rate (%) to 120.
Behold a nice atmospheric and evolving breathy texture! And so far we've only been demonstrating white noise as input, when in fact it can be used on any input. You can hear this example in the audio player. The same settings, but applied to an Octaved Supersaw can be heard in the second audio example.
There are way more things and parameters which won't be explained in this introduction. For more information, visit its dedicated page here. You can look at the comments below for a lengthy explanation if you are confused of its purpose, or read that "essay" on its page at the Closing Words & Another Example section. :)
Remember that you will need a JSFX processor that loads JSFX scripts to load it. ReaJS from ReaPlugs is free in VST format, while REAPER can also load JSFX natively. (technically I believe Cockos open-sourced the interpreter, so there could be more)
Please note that the mono mode does not work yet in ReaJS as of this time, until Cockos updates it to add fft_real, it will only work in REAPER. The stereo one works fine though so you can use it in any DAW with ReaJS, but will use more CPU, otherwise it is identical.
Lastly, because it is a fully open script with no obfuscation, feel free to take a look at it or even edit it, I tried to comment where I found necessary. Be WARNED, though, that I optimized the audio processing part for speed. If you find it unreadable in certain parts, it is not on purpose! Just a side-effect of the optimizations... Most of the math is, however, not commented, since it would take too long to explain and I'm not good at explaining math (I used Computer Algebra Software to devise it from ideas anyway).