4

我正在尝试对具有机械节拍器精度的鼓机进行编程。理想情况下,它将能够以任何合理的速度(低于 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()
    }
}
4

0 回答 0