我正在尝试对具有机械节拍器精度的鼓机进行编程。理想情况下,它将能够以任何合理的速度(低于 180 BPM)演奏 16 分(或更好的 32 分)音符。
AudioKit 对于这样的东西来说似乎是一个非常好的库,但是我无法让它以任何适当的时间播放 wav 样本。下面的代码经常播放稍晚一点的节拍,给踩镲样本带来不必要的摇摆感觉,有时会出现断断续续或跳跃。鼓机必须具有坚如磐石的音乐节奏。
我在两部独立的 iPhone(iPhone 5 和 iPhone 6)、iPad 2 以及任何模拟器设备上都得到了相同的行为。
难道我做错了什么?或者有没有办法提高AKSequencer计时的准确性?
import AudioKit
class DrumMachine {
var sequencer = AKSequencer()
let sequenceLength = AKDuration(beats: 8.0)
let midi = AKMIDI()
let drums = AKMIDISampler()
init() {
do {
let hiHatFile = try AKAudioFile(readFileName: "Hat_F#1.wav", baseDir: .resources)
try drums.loadAudioFiles([hiHatFile])
} catch {
AKLog("Files or Player Didn't Load")
}
drums.enableMIDI(midi.client, name: "MIDI Sampler")
sequencer.setLength(AKDuration(beats: 8))
_ = sequencer.newTrack()
sequencer.tracks[0].setMIDIOutput(drums.midiIn)
let stepSize = Float(0.25) // 16th notes
let numberOfSteps = Int(Float(sequenceLength.beats) / stepSize)
let duration = Double(stepSize)
for i in 0 ..< numberOfSteps {
let step = Double(i) * stepSize
sequencer.tracks[0].add(
noteNumber: 42 - 12,
velocity: 100,
position: AKDuration(beats: step),
duration: AKDuration(beats: duration)
)
}
AudioKit.output = drums
AudioKit.start()
sequencer.enableLooping()
sequencer.setTempo(100) // 100 BPM
sequencer.play()
}
}