Как использовать библиотеку minim в java-приложении для определения ритма аудиоисточника?
Всем привет!
Я абсолютно новичок в звуковом программировании и хотел бы создать приложение Java FX, которое взаимодействует со звуком с моего микрофона или линейного выхода.
Я искал в Google библиотеки и нашел миним, который кажется довольно популярным. Он написан для обработки, но вы можете использовать его и в Java. Проблема в том, что я не нашел хорошую документацию о том, как это сделать. (Причина, по которой я не хочу использовать обработку, заключается в том, что я хочу создать довольно продвинутый графический интерфейс, и я думаю, что это проще сделать в JavaFX).
В качестве первого шага я пытаюсь создать библиотеку, которая реагирует на каждый удар в песне. Мой код выглядит так:
public class Main extends Application {
/* Used to trick minim constructor (needs an object with those methods) */
class MinimInput {
String sketchPath( String fileName ) {
return "";
}
InputStream createInput(String fileName) {
return new InputStream() {
@Override
public int read() throws IOException {
return 0;
}
};
};
}
@Override
public void start(Stage stage) throws Exception {
...
//Some gui logic here!
...
stage.setScene(scene);
stage.show();
/* Beat detect thread */
Thread th = new Thread(new Runnable() {
@Override
public void run() {
Minim minim = new Minim(new MinimInput());
AudioInput input = minim.getLineIn(Minim.STEREO, 1024); //Tried differen values here
BeatDetect beatDetect = new BeatDetect();
beatDetect.setSensitivity(1000); //Tried different values here
int i=0;
while (true) {
beatDetect.detect(input.mix);
if(beatDetect.isHat()) {
System.out.print("HAT");
}
if(beatDetect.isSnare()) {
System.out.print("SNARE");
}
if (beatDetect.isKick()) {
System.out.print("KICK");
}
}
}
});
th.start();
}
}
Я подозреваю, что это может быть что-то с while(true)-loop, и что мой звуковой буфер становится маленьким, но я понятия не имею, как мне это сделать. Может кто-то указать мне верное направление?
Я также был бы очень благодарен за хорошие ресурсы о программировании аудио-визуализации в целом и более конкретную информацию о том, как сделать это в java и minim (или советы и примеры, как сделать это с другими библиотеками, если их проще использовать). Это совершенно новая для меня основа, помоги мне ее сломать!:)
1 ответ
Я нашел решение. Предоставление BeatDetect с timeSize и sampleRate для init сделало свое дело:
- timeSize: размер буфера
- sampleRate: частота выборки образцов в буфере
Итак... вот что я получил:
BeatDetect beatDetect = new BeatDetect(1024, 44100.0f);
1024 - это то же самое, что вы указали при получении AudioInput из MIME. Частота дискретизации может быть найдена с помощью отладки и посмотрите на входное значение в:
вход> поток> формат> sampleRate