Как использовать библиотеку 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

Другие вопросы по тегам