[英]AudioKit ios AKSamplerMetronome
我目前正在使用AudioKit的AKSamplerMetronome來生成和播放Metronome聲音,現在我需要實現一個回調以獲得當前節拍假設如果我有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 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.