メトロノームを構築するために、Swift でプログラムで AVAudioPCMBuffer を埋めようとしています。これは私が構築しようとしている最初の実際のアプリであり、最初のオーディオ アプリでもあります。現在、メトロノームを正確にループさせるためのさまざまなフレームワークと方法を試しています。
AVAudioPlayerNode の scheduleBuffer メソッドの .Loops オプションを使用できるように、メジャー/バーの長さで AVAudioPCMBuffer を構築しようとしています。まず、ファイル (2 ch、44100 Hz、Float32、非インター、*.wav と *.m4a の両方に同じ問題があります) をバッファーにロードし、そのバッファー フレームを空のフレームで区切られたフレームごとに barBuffer にコピーします。以下のループは、私がこれを達成する方法です。
元のバッファを再生するようにスケジュールするとステレオで再生されますが、barBuffer をスケジュールすると左チャンネルしか取得できません。私がプログラミングの初心者であり、オーディオ プログラミングの経験がないと言ったように、これは 32 ビット フロート チャネルまたはこのデータ型に関する知識が不足している可能性がありますUnsafePointer<UnsafeMutablePointer<float>>
。floatChannelData プロパティを迅速に見ると、この説明では、2 つのチャネルをコピーする必要があるように聞こえます。
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 が再生されると、右のチャネルはまだ失われています。