[MontelLUG] Processing, mp3, riconoscimento battute (o quello che è)

Samuele samuele.zanin a tiscali.it
Sab 21 Ott 2017 13:40:00 CEST


Il 15/10/2017 15:34, Samuele via montellug ha scritto:
> Continua il mio porconare nel tentare di capire come estrarre da un 
> mp3 i "picchi"/"battute" o quello che sono per sincronizzare delle luci.

https://www.youtube.com/watch?v=UprA9WyXVF0

Qui un video che farebbe forse quello che mi serve. Ma non hanno messo 
il codice.

Ho trovato un altro esempio che allego, pare andare.
Andrà integrato in qualche modo che devo ancora decidere, ma la parte 
oscura è fatta.
-------------- parte successiva --------------
import ddf.minim.*;
import ddf.minim.analysis.*;

Minim minim;
AudioPlayer song;
FFT fft;

int sampleRate = 44100;
int timeSize = 1024;
float Precedente = 0;

void setup() {
  size(500, 500);
  smooth();

  minim = new Minim(this);
  song = minim.loadFile("c:/Shaun The Sheep.mp3", 2048);
  song.loop();
  fft = new FFT( song.bufferSize(), song.sampleRate() ); // make a new fft

  // calculate averages based on a miminum octave width of 11 Hz
  // split each octave into 1 bands - this should result in 12 averages
  fft.logAverages(11, 1); // results in 12 averages, each corresponding to an octave, the first spanning 0 to 11 Hz. 
}

void draw() {
  background(0);
  noStroke();

  fft.forward(song.mix); // perform forward FFT on songs mix buffer

  // float bw = fft.getBandWidth(); // returns the width of each frequency band in the spectrum (in Hz).
  // println(bw); // returns 21.5332031 Hz for spectrum [0] & [512]

  for (int i = 0; i < 12; i++) {  // 12 is the number of bands 
  
    int lowFreq;

    if ( i == 0 ) {
      lowFreq = 0;
    } 
    else {
      lowFreq = (int)((sampleRate/2) / (float)Math.pow(2, 12 - i));
    }

    int hiFreq = (int)((sampleRate/2) / (float)Math.pow(2, 11 - i));

    // we're asking for the index of lowFreq & hiFreq
    int lowBound = fft.freqToIndex(lowFreq); // freqToIndex returns the index of the frequency band that contains the requested frequency
    int hiBound = fft.freqToIndex(hiFreq); 

    //println("range " + i + " = " + "Freq: " + lowFreq + " Hz - " + hiFreq + " Hz " + "indexes: " + lowBound + "-" + hiBound);

    // calculate the average amplitude of the frequency band
    float avg = fft.calcAvg(lowBound, hiBound);
    // println(avg);

    if (abs(avg - Precedente) > 10)
    {
      fill(255);
      ellipseMode(CENTER);
      ellipse(250, 250, 10, 10);
    }
/*    if ((lowBound >= 32) && ( hiBound <= 64)) {
      fill(255);
      ellipseMode(CENTER);
      ellipse(250, 250, avg/1, avg/1);
    }
    
    if ((lowBound >= 256) && ( hiBound <= 512)) {
      noFill();
      stroke(255);
      strokeWeight(2);
      ellipseMode(CENTER);
      ellipse(250, 250, avg*20, avg*20);
    }    
*/    
  }
}

void stop() {  
  song.close(); // always close Minim audio classes when you are finished with them
  minim.stop(); // always stop Minim before exiting
  super.stop(); // this closes the sketch
}


Maggiori informazioni sulla lista montellug