Я собираю данные из аудиофайлов на основе анализа звука, усредненного за секунды, и мне интересно, есть ли способ ускорить его, учитывая, что мне не нужно слушать звук во время его анализа. Но я не знаю, может ли цикл draw(), специфичный для Processing, позволить мне это сделать. Кроме того, библиотека Minim, похоже, обрабатывает звук только в режиме реального времени, поэтому я спрашиваю, знает ли кто-нибудь другое.
Быстрый анализ звука в Processing (библиотека Minim)
Ответы (3)
Вы смотрели библиотеку Ess? Похоже, что метод AudioFile.read() позволит вам получить все образцы сразу. Затем вы можете обрабатывать их фрагментами любого размера.
В образце 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";
}
Не знаете, что вы хотите делать с данными, но уверены ли вы, что выборка БПФ один раз в секунду даст вам достаточно данных?
Используйте ddf.minim.ugens.FilePlayer
и используйте patch()
, чтобы применить к нему эффекты с другими угенами. В вашем случае вы можете создать ugen, который выполняет БПФ ввода, а затем еще один, который суммирует все входные данные, которые он получает с течением времени, и усредняет их, когда это делается. Они должны расширять класс ddf.minim.UGen
.