AudioKit ios AKSamplerMetronome

我目前正在使用AudioKit的AKSamplerMetronome来生成和播放Metronome声音,现在我需要实现一个回调以获得当前节拍假设如果我有5个节拍我需要获得正在播放的当前节拍以便我可以添加更多function根据节拍计数,是否有任何回调可用于实现它?

这是我目前的代码

// 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 Note编号中获取当前的节拍,并做出相应的响应。 它有点间接,但它有效。

 // create the sequencer before hand (eg, 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)") // eg, resondToBeat(beatNum: noteNumber) } // get the sequencer ready sequencer.enableLooping(AKDuration(beats: 4)) sequencer.setTempo(60) sequencer.play() 
Interesting Posts