Java声音 - 如何动态调整声音音高

时间:2017-12-21 23:29:23

标签: java audio

我试图制作一个简单的游戏,当玩家加速/减速时发动机噪音会上下波动。

来自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。

2 个答案:

答案 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/