ios - AudioKit ios AKSampler节拍器

标签 ios swift audiokit

我目前正在使用 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()

最佳答案

您可以使用 AKSequencer 轻松地做到这一点(我做了类似的事情)。我将音序器的一个音轨分配给 AKMIDISampler,生成节拍器声音,将第二个音轨分配给 AKCallbackInstrument。
在发送到 AKCallbackInstrument 的音轨中,我在 MIDI 数据中任意编码节拍信息,例如,第一个节拍的 MIDI 数据的 MIDINote 为 1,第二个节拍的 MIDINote 为 2(您可以使用速度).然后回调函数可以只查看所有 noteOn 消息并从 MIDI 音符编号获取当前节拍,并相应地做出响应。这有点间接,但很管用。

// 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()

关于ios - AudioKit ios AKSampler节拍器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47629637/

相关文章:

ios - 从堆栈中的第三个 ViewController 调用 navigationController 的 rootViewController 中的方法 - iOS

objective-c - 如何从 NSSet 实例中检索随机对象?

ios - 找不到 Firebase 的 PhoneAuthProvider 类

xcode - 将 Stripe 和 PaymentKit 集成到 Swift 时出现 Apple Mach-O 链接器错误

ruby-on-rails - 向 iOS 应用程序公开 Rails/Device 身份验证

ios - 如何让谷歌在 swift 中放置标记纬度和经度

ios - 如何更改导航项的字体?

ios - 使用适用于 iOS < 11 的 AudioKit 进行离线音频渲染

audiokit - 如何通过 AudioKit 中的音符门同步 OSC 和滤波器包络

ios - 播放音乐时录制语音 - 过滤扬声器输入 (iOS)