gpt4 book ai didi

Android - 将多个静态波形混合到一个 AudioTrack 中

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:48:32 24 4
gpt4 key购买 nike

我正在创建一个类,该类采用一组频率值(即 440Hz、880Hz、1760Hz)并播放它们将如何组合到单个 AudioTrack 中。我不是一个声音程序员,所以这对我自己来说很难写,我相信这对一个有经验的声音程序员来说是一个相对容易的问题。以下是 play 方法中的一些代码:

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)。这是为了测试这段代码是否有效。现在,我需要获取一组频率,执行某种计算,并编写示例数据。

最佳答案

好的,答案确实是一个简单的求和循环。就是这样,只需将这个 for 循环替换为原来的循环即可:

    // fill out the array
for (int i = 0; i < numOfSamples; ++i) {
double valueSum = 0;

for (int j = 0; j < soundData.length; j++) {
valueSum += Math.sin(2 * Math.PI * i / (SAMPLE_RATE / soundData[j][0]));
}

sample[i] = valueSum / soundData.length;
}

现在,它所做的只是获取所有可能的频率,将它们加到变量 valueSum 中,然后除以频率数组的长度 soundData >,这是一个简单的平均值。这会产生任意长频率阵列的良好正弦波混合。

我没有测试过性能,但我确实在线程中运行了它,否则它可能会导致 UI 崩溃。所以,希望这会有所帮助 - 我将其标记为答案。

关于Android - 将多个静态波形混合到一个 AudioTrack 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11820802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com