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 等
在 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 等