我有一些iOS Swift代码(使用AudioKit 4.5.3),该代码是使用AKSequencer馈送AKCallbackInstrument来播放八拍鼓循环的。
我也在量化一些用户输入,因此我从AKSequencer访问.currentRelativePosition和.nearestQuantizedPosition。
我看到一些奇怪的量化结果,所以每当AKCallbackInstrument从AKSequencer接收到.noteOn事件时,我都会检查.currentRelativePosition和.nearestQuantizedPosition:
case .noteOn:
self.currentBeat = self.drummer.nearestQuantizedPosition(quantizationInBeats: 1.0).beats
self.noteOnTimeStamp = self.drummer.currentRelativePosition.beats
print(String(format: "Current beat : %.1f\n-- MIDI noteOn at : %.4f \n", self.currentBeat, self.noteOnTimeStamp ))
输出使我感到惊讶……一切正常,除了击败了7个。即使.currentRelativePosition始终正确返回节拍7,.nearestQuantizedPosition始终返回零作为节拍7的最近节拍。拍子为零,两个例程均正确显示所有其他拍子。任何想法将不胜感激!
当前节拍:0.0 -MIDI noteOn设置为:0.0002
当前节拍:1.0 -MIDI noteOn位于:1.0002
当前节拍:2.0 -MIDI noteOn位于:2.0002
当前节拍:3.0 -MIDI noteOn位于:3.0001
当前节拍:4.0 -MIDI noteOn位于:4.0002
当前节拍:5.0 -MIDI noteOn位于:5.0003
当前节拍:6.0 -MIDI noteOn位于:6.0005
当前节拍:0.0 -MIDI noteOn位于:7.0003
当前节拍:0.0 -MIDI noteOn设置为:0.0005
当前节拍:1.0 -MIDI noteOn位于:1.0003
编辑:我只是尝试了不同的顺序,但结果相同。我的序列现在是12个拍子,.nearestQuantizedPosition对于11个拍子返回零。
我的测试序列只是一个拍子音符串,它是用以下方式创建的:
for beatPosition in 0 ... 11 {
drummer.tracks[0].add(
noteNumber: 27,
velocity: 100,
position: AKDuration(beats: Double(beatPosition)),
duration: AKDuration(beats: 1))
}
序列的长度似乎是准确的。打印drummer.length返回:
264600个样本在44100.0 = 12.0节拍下以120.0 BPM = 6.0s
12个节拍循环的输出:
当前节拍:9.0 -MIDI noteOn位于:9.0005
当前节拍:10.0 -MIDI noteOn位于:10.0003
当前节拍:0.0 -MIDI noteOn位于:11.0005
当前节拍:0.0 -MIDI noteOn设置为:0.0002
当前节拍:1.0 -MIDI noteOn位于:1.0005