Processing 3 Sound Library FFT

Processing Sound FFT Class

https://processing.org/reference/libraries/sound/FFT.html

import processing.sound.*;

FFT fft;
AudioIn in;
int bands = 512;
float[] spectrum = new float[bands];

void setup() {
  size(512, 360);
  background(255);
    
  // Create an Input stream which is routed into the Amplitude analyzer
  fft = new FFT(this, bands);
  in = new AudioIn(this, 0);
  
  // start the Audio Input
  in.start();
  
  // patch the AudioIn
  fft.input(in);
}      

void draw() { 
  background(255);
  fft.analyze(spectrum);

  for(int i = 0; i < bands; i++){
  // The result of the FFT is normalized
  // draw the line for frequency band i scaling it up by 5 to get more amplitude.
  line( i, height, i, height - spectrum[i]*height*5 );
  } 
}

DescriptionThis is a Fast Fourier Transform (FFT) analyzer. It calculates the normalized power spectrum of an audio stream the moment it is queried with the analyze() method.

Methods

input()Define the audio input for the analyzer.

analyze()Queries a value from the analyzer and returns a vector the size of the pre-defined number of bands.

Constructor

FFT(theParent, fftSize)

Here the variable bands controls the FFTsize which based on on the brief explanation found at spectraplus.com can be used to calculate the resolution. Reducing the number of bands reduces the distance between frequencies that are tracked by the program. 

The result of this example can be seen below. The manner that it represents the sound being processed through the computer's selected input is relatively straightforward but not particularly elegant.

Screen Shot 2018-05-01 at 13.40.43.png

From here, the numbers that generate each line's height could could be pulled into other rendering methods. 

Take Away

While this example was beneficial as a way of breaking down FFT, it lacks a way for me to target specific ranges. Modifying the code shows me how I can create a spectrum of color that changes with each band, so I am inclined to believe that incorporating while loops to specify specific bands, I can generate a distinct value of any range.