Быстрый анализ звука в Processing (библиотека Minim)

Я собираю данные из аудиофайлов на основе анализа звука, усредненного за секунды, и мне интересно, есть ли способ ускорить его, учитывая, что мне не нужно слушать звук во время его анализа. Но я не знаю, может ли цикл draw(), специфичный для Processing, позволить мне это сделать. Кроме того, библиотека Minim, похоже, обрабатывает звук только в режиме реального времени, поэтому я спрашиваю, знает ли кто-нибудь другое.


person LaurentC    schedule 09.12.2011    source источник


Ответы (3)


Вы смотрели библиотеку Ess? Похоже, что метод AudioFile.read() позволит вам получить все образцы сразу. Затем вы можете обрабатывать их фрагментами любого размера.

person AShelly    schedule 09.12.2011

В образце ForwardFFT, который поставляется с Processing, fft.forward() вызывается один раз за кадр, поэтому ничто не мешает вам вызывать функцию fft.forward() несколько раз в настройках для получения данных. Вот что я бы добавил в setup() примера ForwardFFT для получения данных:

void setup()
{
  size(512, 200);
  minim = new Minim(this);

  jingle = minim.loadFile("jingle.mp3", 2048);
  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 512. see the online tutorial for more info.
  fft = new FFT(jingle.bufferSize(), jingle.sampleRate());

  println("fft analysis  start");
  int now = millis();

  int trackLength = jingle.length();//length in millis
  int trackSeconds= (int)trackLength/1000; //length in seconds
  int specSize    = fft.specSize();  //how many fft bands
  float[][] fftData = new float[trackSeconds][specSize];//store fft bands here, for each time step
  for(int t = 0 ; t < trackSeconds; t++){//time step in seconds
    fft.forward(jingle.mix);//analyse fft
    for(int b = 0; b < specSize; b++){//loop through bands
      fftData[t][b] = fft.getBand(b);//store each band
    }
  } 

  println("fft analysis end, took: " + (millis()-now) + " ms");

  textFont(createFont("SanSerif", 12));
  windowName = "None";
}

Не знаете, что вы хотите делать с данными, но уверены ли вы, что выборка БПФ один раз в секунду даст вам достаточно данных?

person George Profenza    schedule 10.12.2011

Используйте ddf.minim.ugens.FilePlayer и используйте patch(), чтобы применить к нему эффекты с другими угенами. В вашем случае вы можете создать ugen, который выполняет БПФ ввода, а затем еще один, который суммирует все входные данные, которые он получает с течением времени, и усредняет их, когда это делается. Они должны расширять класс ddf.minim.UGen.

person aidan-fitz    schedule 22.07.2015