주파수 값 배열 (예 : 440Hz, 880Hz, 1760Hz)을 사용하여 단일 AudioTrack에 결합 된 사운드를 재생하는 클래스를 만들고 있습니다. 나는 건전한 프로그래머가 아니므로, 경험있는 건전한 프로그래머에게는 상대적으로 쉬운 문제라고 생각하는 자신을 쓰는 것이 어렵습니다. 다음은 재생 메소드의 일부 코드입니다.Android - 여러 개의 정적 파형을 하나의 AudioTrack으로 믹싱
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;
}
지금이 코드는 단순히 콘서트 A (440Hz)를 재생합니다. 이 코드가 작동하는지 테스트하는 것이 었습니다. 이제 주파수를 가져 와서 일종의 계산을 수행하고 샘플 데이터를 작성해야합니다.
안녕하세요 코드 주셔서 감사하지만 내가 알고 싶은 그 getdata 기능은 뭐하는거야 – Nitin