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

问题描述 投票:-2回答:1

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

从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。

java audio
1个回答
0
投票

我找到了一种方法,但不确定它有多实用。

我可以复制原始的wav,删除每个nth字节。这使得音调增加的效果。然后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);
    }

只需要看看缓存是否有用。

© www.soinside.com 2019 - 2024. All rights reserved.