2017-12-21 7 views
-2

私は、プレーヤーの加速/減速時に上下するエンジンノイズを使って単純なゲームを作ろうとしています。Javaサウンド - 音の高さを動的に調整する方法

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を作成することができましたが、これは滑らかな移行をもたらさないでしょう。

ヘルプ/リンクをいただければ幸いです。

EDIT

質問は、特にエンジン音を立てについて、makeEngineNote()方法は、私のニーズには十分ではありません。問題は、毎回wavを生成せずにピッチを調整することです。

+0

「エンジン音」は、変調された正弦波以外にも非常に複雑です。あなたは、サウンドサンプルを見つけたり、自分のサウンドサンプルをキャプチャする方が良いでしょう。あなたがそれを生成しなければならない場合は、あなたの前に実験と調整の長い道のりがあります。 –

+0

あなたは鋸波でSF音のエンジン音を出すことができますが、これは単一のStackOverflow答えを書く方法を合理的に説明できるものだとは思いません。 – Radiodef

+0

@ジムガリソン編集をご覧ください。さらに混乱を避けるためにタイトルを変更しました。 – TedTrippin

答えて

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); 
    } 

キャッシングを使用するかどうかを確認するだけです。

関連する問題