2011-03-18 5 views
7

안드로이드에서 Synth 화음을 쉽게 생성하는 방법은 무엇입니까? 8bit를 사용하여 게임 음악을 동적으로 생성하고 싶습니다. AudioTrack으로 시도했지만 아직 좋은 사운드는 얻지 못했습니다.안드로이드에서 Synth 화음을 쉽게 생성하는 방법은 무엇입니까?

예제가 있습니까?

내가 성공하지 않고 다음 코드를 시도 :

public class BitLoose { 
    private final int duration = 1; // seconds 
    private final int sampleRate = 4200; 
    private final int numSamples = duration * sampleRate; 
    private final double sample[] = new double[numSamples]; 

    final AudioTrack audioTrack; 

    public BitLoose() { 
     audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
       sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
       AudioFormat.ENCODING_PCM_8BIT, numSamples, 
       AudioTrack.MODE_STREAM); 
     audioTrack.play(); 
    } 

    public void addTone(final int freqOfTone) { 
     // fill out the array 
     for (int i = 0; i < numSamples; ++i) { 
      sample[i] = Math.sin(2 * Math.PI * i/(sampleRate/freqOfTone)); 
     } 

     // convert to 16 bit pcm sound array 
     // assumes the sample buffer is normalised. 
     final byte generatedSnd[] = new byte[numSamples]; 

     int idx = 0; 
     for (final double dVal : sample) { 
      // scale to maximum amplitude 
      final short val = (short) ((((dVal * 255))) % 255); 
      // in 16 bit wav PCM, first byte is the low order byte 
      generatedSnd[idx++] = (byte) (val); 
     } 
     audioTrack.write(generatedSnd, 0, sampleRate); 
    } 

    public void stop() { 
     audioTrack.stop(); 
    } 

답변

2

내가 나쁜 소리가 오디오 형식 때문이라고 생각 : AudioFormat.ENCODING_PCM_8BIT 서명되지 않은 샘플을 사용, 1, -1을 변환해야합니다 사이 그래서 사인을 255 개 바이트 값이 시도 :

private final int sampleRate = 11025; 
: 4200는 일부 장치에 지원되지 않는 수 있기 때문에 또한

for (final double dVal : sample) { 
    final short val = (short) ((dVal + 1)/2 * 255) ; 
    generatedSnd[idx++] = (byte) val; 
} 

시도는, 11025에 샘플 속도를 변경하려면

0

는 별개로 1 답변하면 사용해야
샘플 [I]으로, Math.sin = (2 * * Math.PI로 I/((더블) sampleRate/freqOfTone));

대신에 sample [i] = Math.sin (2 * Math.PI * i/(sampleRate/freqOfTone));

관련 문제