Я пытаюсь программно заполнить AVAudioPCMBuffer в Swift, чтобы построить метроном. Это первое настоящее приложение, которое я пытаюсь создать, так что это также мое первое звуковое приложение. Прямо сейчас я экспериментирую с разными фреймворками и методами точного зацикливания метронома.
Я пытаюсь создать AVAudioPCMBuffer с длиной меры / полосы, чтобы я мог использовать параметр .Loops метода scheduleBuffer AVAudioPlayerNode. Я начинаю с загрузки своего файла (2 канала, 44100 Гц, 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.
edit: Я удалил вопиющую ошибку i += 1
, спасибо hotpaw2. Правый канал все еще отсутствует при воспроизведении barBuffer.