如何在java应用程序中使用minim库来检测音频源的节拍?

时间:2015-10-02 18:41:13

标签: java audio javafx minim beat-detection

大家好!

我对音频编程完全不熟悉,并希望构建一个Java FX应用程序,该应用程序可与麦克风中的音频进行交互或线路输出。

我搜索谷歌搜索图书馆,发现微米,这似乎很受欢迎。它是为处理而编写的,但您也可以在Java中使用它。问题是我没有找到关于如何做到这一点的好文档。 (我不想使用处理的原因是我想构建一个非常先进的gui,我认为在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 个答案:

答案 0 :(得分:2)

我找到了解决方案。在init上为BeatDetect提供timeSize和sampleRate可以解决问题:

  • timeSize:缓冲区的大小
  • sampleRate:缓冲区中样本的采样率

所以...这就是我得到的:

BeatDetect beatDetect = new BeatDetect(1024, 44100.0f);

1024与您从mime获取AudioInput时指定的相同。可以使用debug找到采样率,并查看下面的输入值:

  

输入>流>格式>采样率