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

Java声音-如何动态调整音高,java,audio,Java,Audio,我试着做一个简单的游戏,当玩家加速/减速时,引擎噪音会上下波动 从帖子开始,我有一个小例子 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 l

我试着做一个简单的游戏,当玩家加速/减速时,引擎噪音会上下波动

从帖子开始,我有一个小例子

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,删除每个
n
th字节。这会产生螺距增加的效果<代码>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);
    }
只需要看看缓存是否有用

//change the frequency of Audio format from 44100 Hz to 72000 Hz.
private AudioFormat getOutFormat(AudioFormat inFormat) {
    int ch = inFormat.getChannels();
    float rate = inFormat.getSampleRate();  
    return new AudioFormat(PCM_SIGNED, 72000, 16, ch, ch * 2, rate,
            inFormat.isBigEndian());
}



//source file
final File file1 = new File(“Sample.mp3”);
//destination file
final File file2 = new File(“Sample_cat.wav”);
//audio stream of file1
final AudioInputStream in1 = getAudioInputStream(file1);
//get audio format for targetted sound
final AudioFormat inFormat = getOutFormat(in1.getFormat());
//get the target file audio stream using file format
final AudioInputStream in2 = getAudioInputStream(inFormat, in1);
//write the audio file in targeted pitch file
AudioSystem.write(in2, AudioFileFormat.Type.WAVE, file2);

可以看出,“发动机声音”极其复杂,远不止调制的正弦波。你最好能找到一个声音样本或捕捉自己的声音样本。如果你必须生成它,你将面临一条漫长的实验和调整之路。你可以用一个锯齿波使科幻引擎发出声音,但我认为这不是我们可以合理解释如何在单个堆栈溢出答案中写入的事情。@JimGarrison请参阅编辑。我还更改了标题以避免进一步混淆。@Radiodef也请查看