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.