2017-12-21 7 views
-2

플레이어가 가속/감속 할 때 위아래로가는 엔진 소음으로 간단한 게임을 만들려고합니다.자바 사운드 - 사운드 피치를 동적으로 조정하는 방법

그래서있어이 작은 예에 게시물에서

...

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를 다시 생성하는 것이 가장 바람직한 방법이라고 상상할 수 없습니다. 파장이 다른 여러 개의 웨이브를 만들 수는 있지만 부드러운 전환을 제공하지는 못합니다.

도움말/링크를 제공해 주시면 감사하겠습니다.

편집

문제는 구체적으로 엔진 소음을 약되지는 makeEngineNote() 방법은 내 요구에 충분하다. 문제는 매번 wav를 생성하지 않고 음조를 조정하는 것입니다.

+0

"엔진 사운드"는 변조 된 사인파보다 훨씬 복잡합니다. 사운드 샘플을 찾거나 자신을 캡처하는 것이 더 낫습니다. 반드시 생성해야한다면, 앞서 긴 실험과 조정을해야합니다. –

+0

당신은 톱 웨이브로 공상 과학 엔진 사운드를 만들 수 있습니다. 그러나 이것이 단일 StackOverflow 응답을 작성하는 방법을 합리적으로 설명 할 수있는 종류라고 생각하지 않습니다. – Radiodef

+0

@ 짐 가르슨 편집을 참조하십시오. 혼란을 피하기 위해 제목을 변경했습니다. – TedTrippin

답변

0

방법을 찾았지만 실제로 얼마나 실용적인지 알지 못했습니다.

모든 n 번째 바이트를 제거하여 원본 wav를 복사 할 수 있습니다. 이것은 피치가 증가하는 효과를줍니다. 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); 
    } 

캐싱을 사용할지 확인해야합니다.