AudioKit ios AKSamplerMetronome

4
我目前正在使用AudioKit的AKSamplerMetronome来生成和播放节拍器声音,现在我需要实现一个回调函数来获取当前节拍,假设我有5个节拍,我需要获取当前正在播放的节拍,以便我可以根据节拍计数添加一些更多的功能。是否有可用的回调函数来实现它??
这是我的当前代码:
 // using AKSamplerMetronome
var metronome1 = AKSamplerMetronome()
var mixer = AKMixer()
// first sound called
let beatstart = Bundle.main.url(forResource: "mybeat", withExtension: "wav")
 // other sounds based on beat count
let beaten = Bundle.main.url(forResource: "others", withExtension: "wav")
// setting first sound and other beat sounds
metronome1.sound = McountSoundUrl
metronome1.downBeatSound = MoneSoundUrl
metronome1 >>> mixer
AudioKit.output = mixer
AudioKit.start()
1个回答

4
您可以使用AKSequencer轻松完成此操作(我曾经做过类似的事情)。我将序列器的一个轨道分配给了AKMIDISampler,用于生成节拍声音,并将第二个轨道发送到AKCallbackInstrument中。
在发送到AKCallbackInstrument的轨道中,我随意编码了MIDI数据中的节拍信息,例如,第一拍的MIDI数据具有MIDINote 1,第二拍具有MIDINote 2(您可以使用velocity完成此操作)。然后,回调函数将只查看所有noteOn消息,并从MIDI Note编号获取当前拍子,并相应地进行响应。这有点间接,但它有效。
// create the sequencer before hand (e.g., at init); calling play() immediately after creating it causes some odd behaviour
    let sequencer = AKSequencer()

    // set up the sampler and callbackInst
    let sampler = AKSynthSnare()
    // or for your own sample:
    // let sampler = AKMIDISampler()
    // sampler.loadWav("myMetronomeSound)
    let callbackInst = AKCallbackInstrument()
    AudioKit.output = sampler
    AudioKit.start()

    // create two tracks for the sequencer
    let metronomeTrack = sequencer.newTrack()
    metronomeTrack?.setMIDIOutput(sampler.midiIn)
    let callbackTrack = sequencer.newTrack()
    callbackTrack?.setMIDIOutput(callbackInst.midiIn)

    // create the MIDI data
    for i in 0 ..< 4 {
        // this will trigger the sampler on the four down beats
        metronomeTrack?.add(noteNumber: 60, velocity: 100, position: AKDuration(beats: Double(i)), duration: AKDuration(beats: 0.5))

        // set the midiNote number to the current beat number
        callbackTrack?.add(noteNumber: MIDINoteNumber(i), velocity: 100, position: AKDuration(beats: Double(i)), duration: AKDuration(beats: 0.5))
    }

    // set the callback
    callbackInst.callback = {status, noteNumber, velocity in
        guard status == .noteOn else { return }
        print("beat number: \(noteNumber + 1)")
        // e.g., resondToBeat(beatNum: noteNumber)
    }

    // get the sequencer ready
    sequencer.enableLooping(AKDuration(beats: 4))
    sequencer.setTempo(60)
    sequencer.play()

嗨,谢谢你,但我对Swift和iOS开发非常陌生,有没有一些示例代码可以帮助我克服这个问题? - RAM
嗨,我已经添加了我的当前代码,请问您能告诉我哪里出错了吗? - RAM
1
我建议您不要使用AKSamplerMetronome(它没有明显的提供回调的方式)。相反,使用带有AKMIDISampler的AKSequencer进行声音处理,并使用AKCallbackInstrument进行回调。我提供的代码正好展示了如何实现这一点。您到底想做什么? - c_booth
嗨,我怎样才能使用这个播放两个声音文件呢?例如,我想在第一个声音中播放一个快节奏的文件,而在另一个节拍声音中播放一个慢节奏的文件,这样可以吗? - RAM
1
错误:无效的节拍范围或曲目为空。 - HTron
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接