Java Gervill 软件合成器不工作

Java Gervill Software Synth not working

在 JDK8 中,我似乎无法从 SoftSynthesizer 创建的 AudioInputStream 中获取任何有用的数据。

    AudioSynthesizer s = new SoftSynthesizer();

    AudioFormat format = new AudioFormat(44100, 16, 2, true, false);
    AudioInputStream stream = s.openStream(format, null);

    s.getChannels()[0].noteOn(60, 100);

    while (stream.available() >= 0) {
        byte[] b = new byte[2];
        stream.read(b);
        System.out.println(b[0] << 8 | b[1]);
    }

    s.getChannels()[0].noteOff(60);

但是println()只显示0,AudioInputStream没有音频数据出来。 难道我做错了什么?或者从 JDK 8 开始不推荐使用 Gervill?

看来我找到了答案。您必须从 AudioInputStream 中准确读取整数倍的数据帧,否则它将始终 return 为零。在我的例子中,读取 4 个字节解决了问题,因为 AudioFormat 是 16 位(2 个字节),2 个通道,所以它是 4 bytes/frame。

改变

byte[] b = new byte[2]

byte[] b = new byte[4]

事实上,4 的任何整数倍都可以。 4、8、12、16、20 等