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

标签 java audio javafx minim beat-detection

大家好!

我是音频编程的新手,我想构建一个 Java FX 应用程序来与来 self 的麦克风或线路输出的音频进行交互。

我在谷歌上搜索了库,发现 minim 似乎很受欢迎。它是为处理而编写的,但您也可以在 Java 中使用它。问题是我没有找到关于如何执行此操作的好文档。 (我不想使用处理的原因是我想构建一个非常高级的 gui,而且我认为在 JavaFX 中更容易做到)。

作为第一步,我尝试构建一个对歌曲中的每个节拍使用react的库。我的代码如下所示:

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) 循环有关,并且我的声音缓冲区变小了,但我不知道该怎么做。谁能指出我正确的方向?

我也非常感谢有关一般音频可视化编程的良好资源以及有关如何在 java 和 minim 中执行此操作的更具体信息(或有关如何使用其他库执行此操作的提示和示例,如果它们更易于使用的话) ).这对我来说是一个全新的领域,帮我打破它! :)

最佳答案

我找到了一个解决方案。在初始化时为 BeatDetect 提供 timeSize 和 sampleRate 可以达到目的:

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

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

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

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

input > stream > format > sampleRate

关于java - 如何在 Java 应用程序中使用最小库来检测音频源的节拍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32913761/

相关文章:

email - 使用 Google 的 SMTP 服务器发送电子邮件

ubuntu - 在 Ubuntu 服务器上转换音频 (mp3->ogg)

c# - 在matlab中将音频文件转换为字节数组

java.lang.IllegalStateException : Not on FX application thread; currentThread = Thread-4

java - 修复从 Object 到 ComboBox<String> javafx 的未检查强制转换

java - Sonar java.lang.OutOfMemoryError : PermGen space

java - 将 JPanel 添加到另一个具有 TableLayout 的 JPanel

java - 使用 IntelliJ 生成类图

audio - Microsoft WAV从样本中提取频率

java - 删除 TextArea 上的制表并转到下一个字段