2014-07-23 4 views
1

자바로 오디오를 가지고 놀고 있습니다. 나는 일반적으로 사용 된 AudioFormat이 2 바이트를 사용한다는 것을 발견했다. 그러나 바이트를 단일 int로 묶는 방법을 알아낼 수 없습니다. 그래서 역으로 그 일을 시도 :어떻게 바이트를 오디오로 분할/결합 할 수 있습니까?

public class SineWave { 

    public static void main(String[] args) throws LineUnavailableException { 
     int hz = 440; 
     int samplerate = 16384; 
     int amplitude = 127; 

     AudioFormat format = new AudioFormat((float) samplerate, 16, 1, true, true); 
     SourceDataLine sdl = AudioSystem.getSourceDataLine(format); 

     sdl.open(format, samplerate * 2); 
     sdl.start(); 

     while (true) { 
      byte[] toWrite = new byte[samplerate * 2]; 
      for (int x = 0; x < samplerate; x++) { 
       int y = (int) Math.round(amplitude * Math.sin(2 * Math.PI * x * hz/samplerate)); 
       byte b1 = (byte) (y & 0xFF); 
       byte b2 = (byte) ((y >> 8) & 0xFF); 
       toWrite[2 * x] = b1; 
       toWrite[2 * x + 1] = b2; 
//    System.out.printf("%d %d%n", b1, b2); 
      } 
      sdl.write(toWrite, 0, toWrite.length); 
     } 
    } 
} 

그러나 이것은 단지 127의 진폭까지 작동합니다. System.out.printf의 주석 처리가 해제되면이 진폭이 1 바이트 만 사용된다는 것이 분명합니다. 내가 128까지 갈 때, 나는 얻을이 같은 출력 (추한 소리) :

0 0 
21 0 
42 0 
62 0 
80 0 
96 0 
109 0 
118 0 
125 0 
-128 0 
127 0 
123 0 
115 0 
104 0 
90 0 
73 0 
55 0 
35 0 
13 0 

음수 값은 기호의 변화없이, 유사하고, 두 번째 바이트는 항상 -1

이것이 부호있는 바이트 및 2의 보수 때문인 것으로 추측했지만이 문제를 해결하기 위해 무엇을 할 수 있는지 아직 알 수 없습니다.

Java는 어떻게 오디오를 구성합니까?

답변

1

바이트를 역순으로 정렬 할 수 있지만 올바른 트랙에 있습니다 (toWrite 지정에서 b1과 b2를 바꿔서 소리가 잘 들리는 지 확인하십시오). 그것은 사물이 왜 나쁜지를 설명 할 수 있습니다. 또한 진폭 127은 매우 작으므로 최대 값 (32767)까지 증가시켜야합니다.

바이트를 인쇄하는 방법이 혼동을 줄 수도 있습니다. 부호있는 16 비트 숫자를 2 개의 부호있는 8 비트 숫자로 나누는 것은 실제로 의미가 없습니다. 16 비트 숫자가 -1 (0xffff) 인 경우 부호있는 바이트 두 개를 인쇄하면 -1 (0xff) 및 -1 (0xff)이됩니다. 16 진수 값으로 바이트를 출력하고 머리에 사인을 다루는 것이 좋습니다.

+0

컴퓨터에서 부호있는 숫자가 작동하는 방식을 알고 있습니다. 나에게 중요하지 않기 때문에 나는 16 진수에 대해 걱정하지 않았다. 하지만 당신이 옳다고 생각합니다. 다른 방법은 침묵 이었기 때문에 바이트를 잘못된 순서로 넣었습니다. 이것은 내 문제였다. – Justin

+0

내가 가진 큰 문제는 127이 매우 작은 진폭이라는 것입니다. 나는 그것을 깨닫지 못 했으므로 바이트를 바꿀 때 소리가 조용해 졌기 때문에 잘못되었다고 생각했습니다. – Justin

관련 문제