2011-03-18 13 views
7

Android में Synth Chords ध्वनि आसानी से कैसे उत्पन्न करें? मैं 8 बिट का उपयोग कर गेम संगीत में गतिशील रूप से उत्पन्न करने में सक्षम होना चाहता हूं। ऑडियोट्रैक के साथ प्रयास किया, लेकिन अभी तक अच्छी आवाज़ के अच्छे नतीजे नहीं मिले।Android में Synth Chords ध्वनि आसानी से कैसे उत्पन्न करें?

वहां कोई भी उदाहरण है?

मैं सफलता के बिना निम्नलिखित कोड की कोशिश की है:

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 परिवर्तित किया जाना चाहिए के बीच तो एक साइन 0-255 बाइट मूल्यों, इस प्रयास करें:

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

कोशिश भी 11025 के लिए नमूना दर बदलने के लिए है, क्योंकि 4200 कुछ उपकरणों पर असमर्थित हो सकता है:

private final int sampleRate = 11025; 
0

अलावा जवाब 1 से आप का उपयोग करना चाहिए:
नमूना [i] = गणित.पाप (2 * Math.PI * मैं/((डबल) sampleRate/freqOfTone));

नमूना [i] = Math.sin (2 * Math.PI * i/(sampleRate/freqOfTone) के बजाय;

संबंधित मुद्दे