1

私は一般的なJavaプログラミングとDSPプログラミングの初心者ですが、.wavファイルに残響を適用しようとしています。私が使用しているコードの一部は次のものからのものです。Reverb Algorithmですが、完全には理解していないようです。コードを実行すると、時間の経過とともにノイズが発生し、最終的には「クリッピング」も発生します。バッファサイズ、または「クリップ」を使用して反響したオーディオストリームを再生しているという事実に関係があると思いますが、よくわかりません。誰かがそれを見て、私のコードを改善するためのアイデアを提供してくれたら、とても感謝しています。

私はこのコードを使用します:

public void Reverbstart() throws InterruptedException, UnsupportedAudioFileException, IOException, LineUnavailableException {

    int bufferLength = 4000_000;
    Clip clip;
    Line line;
    Line.Info linfo = new Line.Info(Clip.class);
    line = AudioSystem.getLine(linfo);
    clip = (Clip) line;

    File sourceFile = new File("some audiofile");

    AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(sourceFile);

    AudioFormat audioFormat = fileFormat.getFormat();

    System.out.println(audioFormat);

    AudioInputStream ais = AudioSystem.getAudioInputStream(sourceFile);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    int nBufferSize = bufferLength * audioFormat.getFrameSize();
    byte[]  byteBuffer = new byte[nBufferSize];

    int nBytesRead = ais.read(byteBuffer);
    baos.write(byteBuffer, 0, nBytesRead);

    byte[] AudioData = baos.toByteArray();

    int delayMilliseconds = 3000; 
    int delaySamples = (int)((float)delayMilliseconds * 44.1f); //44100 Hz sample rate
    float decay = 0.5f;

    for (int i = 0; i < AudioData.length - delaySamples; i++){

        AudioData[i] += (short)((float)AudioData[i]);
        AudioData[i + delaySamples] += (short)((float)AudioData[i] * decay);
    }

    ByteArrayInputStream bais = new ByteArrayInputStream(AudioData);
    AudioInputStream outputAis = new AudioInputStream(bais, audioFormat,AudioData.length/ audioFormat.getFrameSize());


    clip.open(outputAis);

    clip.start();
    Thread.sleep(10000);
    System.out.println(clip.getFramePosition());


}
4

0 に答える 0