我试图制作一个简单的游戏,当玩家加速/减速时发动机噪音会上下波动。
来自SO的帖子我得到了这个小例子......
public static final int SAMPLE_RATE = 16 * 1024; // ~16KHz
public void playNoise() throws Exception {
final AudioFormat af = new AudioFormat(Note.SAMPLE_RATE, 8, 1, true, true);
SourceDataLine line = AudioSystem.getSourceDataLine(af);
line.open(af, SAMPLE_RATE);
line.start();
byte[] engineNote = makeEngineNote();
line.write(engineNote, 0, engineNote.length);
line.drain();
line.close();
}
private byte[] makeEngineNote() {
// Create a kind-of-sin-wave-with-interference
byte[] b = new byte[SAMPLE_RATE];
...
}
现在我想让音高波动以模仿加速/减速。我想知道循环上面的代码(write()
),但我不确定如何动态改变波长。我无法想象每次重新生成wav是最理想的方法。我可以用不同的波长创建多个wav,但这不会给出平滑过渡。
任何帮助/链接都将不胜感激。
修改
问题并非专门针对发动机噪音,makeEngineNote()
方法足以满足我的需求。问题是关于调整音高而不是每次都产生wav。
答案 0 :(得分:0)
我找到了一种方法,但不确定它有多实用。
我可以复制原始wav,删除每个n
个字节。这使得音调增加的效果。然后可以从代表引擎节流的某个变量派生n
。
为了减少密集度,我保持wav尽可能小。代码基本上看起来有点像......
int n = ...; // Inverse of throttle; as n gets bigger sound gets lower.
while (running) {
byte[] b = removeEveryNthByte(engineNote, n);
line.write(b, 0, b.length);
}
只需要查看缓存是否有用。
答案 1 :(得分:0)
repositories { maven { url 'https://maven.google.com' } }
来自https://www.technetexperts.com/web/change-the-pitch-of-audio-using-java-sound-api/