将AKPlayer与AKSampleMetronome同步

时间:2018-08-13 07:39:55

标签: audiokit

我正在尝试将AKSamplerMetronome用作(多种)多音频文件播放项目中的主时钟。我希望AKPlayers与Metronome的悲观同步开始。将AKPlayer和AKSamplerMetronome混合为AudioKit.output成功,但是,我正在努力将AKPlayer.start与AKSamplerMetronome.beatTime连接(或其他我尚未弄清的东西),因此播放从节拍器的同步降频开始(并重复每次节拍器击倒的时间)。这是我写的:

class ViewController: UIViewController {

let metronome = AKSamplerMetronome()
let player = AKPlayer(audioFile: try! AKAudioFile(readFileName: "loop.wav"))
let mixer = AKMixer()

func startAudioEngine() {
    do {
        try AudioKit.start()
    } catch {
        print(error)
        fatalError()
    }
}

func makeConnections() {
    player >>> mixer
    metronome >>> mixer
    AudioKit.output = mixer
}

func startMetronome() {

    metronome.tempo = 120.0
    metronome.beatVolume = 1.0
    metronome.play()
}

func preparePlayer() {

    player.isLooping = true
    player.buffering = .always
    player.prepare()
// I wanted AKPlayer to be repeated based on Metronome's downbeat.

}

func startPlayer() {

    let startTime = AVAudioTime.now() + 0.25
    player.start(at: startTime)

}

override func viewDidLoad() {
    super.viewDidLoad()

    makeConnections()
    startAudioEngine()
    preparePlayer()
    startPlayer()
    startMetronome()

}

}

我的问题是,AKPlayer的起点(at :)无法识别AKSamplerMetronome的属性,可能是因为它与AVAudioTime不兼容吗?我尝试过类似的事情:

let startTime = metronome.beatTime + 0.25
player.start(at: startTime)

但这似乎不是一个答案(因为“无法将值类型'Double'转换为预期的参数类型'AVAudioTime?')。如果有人可以帮助我探索Swift / AudioKit,这将非常有用。<3

1 个答案:

答案 0 :(得分:4)

您正在使用Double参数调用AVAudioTime播放功能。不对如果要使用秒参数启动AKPlayer,请使用player.play(时间:时间)

通常来说,您很亲密。这是您的操作方式:

tdElement = document.getElementById('something').getElementsByTagName('td')[3];
anchor = tdElement.children[0];
anchor.getAttribute("href");

基本上,您需要为每个单元提供一个公共时钟(mach_absolute_time()),然后使用AVAudioTime在确切的时间启动它们。 Metronome.setBeatTime告诉节拍器在传入的avTime中将其重置为0点。