Anyone have any experience with Minim and Processing 2.x?

Anyone have any experience with Minim and Processing 2.x?

I’m trying to light up certain colors of lights with certain frequencies (bass white, mids green, treble blue) by passing values to the arduino to actually do these things. I have succesfully passed values to the arduino (G for green and B for blue) and that works fine, I’m just trying to find out how to tie this into Minim frequency ranges.

Any help would be appreciated, I can post code too if that’d help.

Don’t have experience with it (just fiddled on time with it), but did you found this documentation: http://code.compartmental.net/minim/javadoc/ddf/minim/analysis/FFT.html

Mimim is pretty well documented. You could also check out the new sound library in Processing 3.0. Thats now in alpha. Couldn’t find much documentation on it, but you can always download 3.0 to check it out. There is some analyzing stuff included (probably a bit simpler to use that Mimim, but also more limited).

I have checked out the documentation, it just doesn’t make sense to me I guess. This (working) code for example:

/* * This sketch illustrates the difference between viewing the full spectrum,

  • linearly spaced averaged bands, and logarithmically spaced averaged bands.
  • From top to bottom:
  • The full spectrum.
  • The spectrum grouped into 30 linearly spaced averages.
  • The spectrum grouped logarithmically into 10 octaves, each split into 3 bands.
  • Moving the mouse across the sketch will highlight a band in each spectrum and display what the center
  • frequency of that band is. The averaged bands are drawn so that they line up with full spectrum bands they
  • are averages of. In this way, you can clearly see how logarithmic averages differ from linear averages.
  • For more information about Minim and additional features, visit http://code.compartmental.net/minim/
    */
  • import ddf.minim.analysis.;
    import ddf.minim.
    ;

    Minim minim;
    AudioPlayer jingle;
    FFT fftLin;
    FFT fftLog;

    float height3;
    float height23;
    float spectrumScale = 4;

    PFont font;

    void setup()
    {
    size(512, 480);
    height3 = height/3;
    height23 = 2*height/3;

    minim = new Minim(this);
    jingle = minim.loadFile(“jingle.mp3”, 1024);

    // loop the file
    jingle.loop();

    // create an FFT object that has a time-domain buffer the same size as jingle’s sample buffer
    // note that this needs to be a power of two
    // and that it means the size of the spectrum will be 1024.
    // see the online tutorial for more info.
    fftLin = new FFT( jingle.bufferSize(), jingle.sampleRate() );

    // calculate the averages by grouping frequency bands linearly. use 30 averages.
    fftLin.linAverages( 30 );

    // create an FFT object for calculating logarithmically spaced averages
    fftLog = new FFT( jingle.bufferSize(), jingle.sampleRate() );

    // calculate averages based on a miminum octave width of 22 Hz
    // split each octave into three bands
    // this should result in 30 averages
    fftLog.logAverages( 22, 3 );

    rectMode(CORNERS);

    }

    void draw()
    {
    background(0);

    textSize( 18 );

    float centerFrequency = 0;

    // perform a forward FFT on the samples in jingle’s mix buffer
    // note that if jingle were a MONO file, this would be the same as using jingle.left or jingle.right
    fftLin.forward( jingle.mix );
    fftLog.forward( jingle.mix );

    // draw the full spectrum
    {
    noFill();
    for(int i = 0; i < fftLin.specSize(); i++)
    {
    // if the mouse is over the spectrum value we’re about to draw
    // set the stroke color to red
    if ( i == mouseX )
    {
    centerFrequency = fftLin.indexToFreq(i);
    stroke(255, 0, 0);
    }
    else
    {
    stroke(255);
    }
    line(i, height3, i, height3 - fftLin.getBand(i)*spectrumScale);
    }

    fill(255, 128);
    text("Spectrum Center Frequency: " + centerFrequency, 5, height3 - 25);
    

    }

    // no more outline, we’ll be doing filled rectangles from now
    noStroke();

    // draw the linear averages
    {
    // since linear averages group equal numbers of adjacent frequency bands
    // we can simply precalculate how many pixel wide each average’s
    // rectangle should be.
    int w = int( width/fftLin.avgSize() );
    for(int i = 0; i < fftLin.avgSize(); i++)
    {
    // if the mouse is inside the bounds of this average,
    // print the center frequency and fill in the rectangle with red
    if ( mouseX >= iw && mouseX < iw + w )
    {
    centerFrequency = fftLin.getAverageCenterFrequency(i);

        fill(255, 128);
        text("Linear Average Center Frequency: " + centerFrequency, 5, height23 - 25);
        
        fill(255, 0, 0);
      }
      else
      {
          fill(255);
      }
      // draw a rectangle for each average, multiply the value by spectrumScale so we can see it better
      rect(i*w, height23, i*w + w, height23 - fftLin.getAvg(i)*spectrumScale);
    }
    

    }

    // draw the logarithmic averages
    {
    // since logarithmically spaced averages are not equally spaced
    // we can’t precompute the width for all averages
    for(int i = 0; i < fftLog.avgSize(); i++)
    {
    centerFrequency = fftLog.getAverageCenterFrequency(i);
    // how wide is this average in Hz?
    float averageWidth = fftLog.getAverageBandWidth(i);

      // we calculate the lowest and highest frequencies
      // contained in this average using the center frequency
      // and bandwidth of this average.
      float lowFreq  = centerFrequency - averageWidth/2;
      float highFreq = centerFrequency + averageWidth/2;
      
      // freqToIndex converts a frequency in Hz to a spectrum band index
      // that can be passed to getBand. in this case, we simply use the 
      // index as coordinates for the rectangle we draw to represent
      // the average.
      int xl = (int)fftLog.freqToIndex(lowFreq);
      int xr = (int)fftLog.freqToIndex(highFreq);
      
      // if the mouse is inside of this average's rectangle
      // print the center frequency and set the fill color to red
      if ( mouseX >= xl && mouseX < xr )
      {
        fill(255, 128);
        text("Logarithmic Average Center Frequency: " + centerFrequency, 5, height - 25);
        fill(255, 0, 0);
      }
      else
      {
          fill(255);
      }
      // draw a rectangle for each average, multiply the value by spectrumScale so we can see it better
      rect( xl, height, xr, height - fftLog.getAvg(i)*spectrumScale );
    }
    

    }
    }

    Works beautifully in drawing the spectrum and frequency values. Now where can I tie in to the individual bands? I know how to send values to the arduino to get the arduino to light up certain colors… that part works just fine too. It’s just there are no values like

    b=bass
    m=mids
    h=highs

    that I can use to pass over.

    Hope that makes sense, it’s getting pretty late.

    Oh and I will check out Processing 3.0, thanks :smiley:

    It’s better to post code on pastbin of gist (Google+ is not really code friendly). You should work with getBand:
    http://code.compartmental.net/minim/javadoc/ddf/minim/analysis/FourierTransform.html#getBand(int)

    It depends the FFT settings (read about how FFT works). The amount of frequencies/bands depend on the FFT settings.

    If I don’t understand code, I start undressing it. Removing things, changing parameters to see what happens. Instead of all the lines (in the for-loop) try to draw one line. It helps me also sometimes to print the whole code on paper to get a better overview of the whole script.