Android - Mischen mehrerer statischer Wellenformen in einem einzigen AudioTrack

Ich mache eine Klasse, die eine Reihe von Frequenzwerten (d. H. 440 Hz, 880 Hz, 1760 Hz) verwendet und so wiedergibt, wie sie in einem einzelnen AudioTrack kombiniert klingen würden. Ich bin kein Soundprogrammierer, daher fällt es mir schwer, selbst zu schreiben, wo ich glaube, dass es für einen erfahrenen Soundprogrammierer ein relativ einfaches Problem ist. Hier ist ein Teil des folgenden Codes für die Wiedergabemethode:

public void play() {
    // Get array of frequencies with their relative strengths
    double[][] soundData = getData();

    // TODO
    // Perform a calculation to fill an array with the mixed sound - then play it in an infinite loop
    // Need an AudioTrack that will play calculated loop
    // Track sample info
    int numOfSamples = DURATION * SAMPLE_RATE;
    double sample[] = new double[numOfSamples];
    byte sound[] = new byte[2 * numOfSamples];

    // fill out the array
    for (int i = 0; i < numOfSamples; ++i) {
            sample[i] = Math.sin(2 * Math.PI * i / (SAMPLE_RATE / 440));
    }

    int i = 0;
    for (double dVal : sample) {
        // scale to maximum amplitude
        final short val = (short) ((dVal * 32767));
        // in 16 bit wav PCM, first byte is the low order byte
        sound[i++] = (byte) (val & 0x00ff);
        sound[i++] = (byte) ((val & 0xff00) >>> 8);
    }

    // Obtain a minimum buffer size
    int minBuffer = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

    if (minBuffer > 0) {
        // Create an AudioTrack
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                AudioFormat.ENCODING_PCM_16BIT, numOfSamples, AudioTrack.MODE_STATIC);

        // Write audio data to track
        track.write(sound, 0, sound.length);

        // Begin playing track
        track.play();
    }

    // Once everything has successfully begun, indicate such.
    isPlaying = true;
}

Im Moment spielt dieser Code einfach ein Konzert A (440Hz). Es sollte getestet werden, ob dieser Code funktioniert. Jetzt muss ich ein paar Frequenzen nehmen, eine Art Berechnung durchführen und die Beispieldaten schreiben.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage