我正在尝试在 Swift 中以编程方式填充 AVAudioPCMBuffer 以构建节拍器。这是我正在尝试构建的第一个真正的应用程序,所以它也是我的第一个音频应用程序。现在我正在尝试不同的框架和方法来准确地循环节拍器。
我正在尝试构建一个具有度量/条长度的 AVAudioPCMBuffer,以便我可以使用 AVAudioPlayerNode 的 scheduleBuffer 方法的 .Loops 选项。我首先将我的文件(2 ch,44100 Hz,Float32,non-inter,*.wav 和 *.m4a 都有相同的问题)加载到缓冲区中,然后将该缓冲区逐帧复制到 barBuffer 中,并用空帧分隔。下面的循环是我完成此任务的方式。
如果我安排播放原始缓冲区,它将以立体声播放,但是当我安排 barBuffer 时,我只得到左声道。正如我所说,我是编程初学者,没有音频编程经验,所以这可能是我对 32 位浮点通道或这种数据类型缺乏了解UnsafePointer<UnsafeMutablePointer<float>>
。当我快速查看 floatChannelData 属性时,描述听起来好像应该是复制两个通道。
var j = 0
for i in 0..<Int(capacity) {
barBuffer.floatChannelData.memory[j] = buffer.floatChannelData.memory[i]
j += 1
}
j += Int(silenceLengthInSamples)
// loop runs 4 times for 4 beats per bar.
编辑:i += 1
感谢hotpaw2,我删除了明显的错误。播放 barBuffer 时,仍然缺少正确的通道。