2017-12-04 1 views
3

Ich benutze AudiKit's AKSamplerMetronome um Metronom-Sounds zu erzeugen und zu spielen, jetzt muss ich einen Callback implementieren, um den aktuellen Beat anzunehmen Wenn ich 5 Beats habe, muss ich den aktuellen Beat bekommen, der gespielt wird Ich kann einige weitere Funktionen basierend auf der Beat-Anzahl hinzufügen, gibt es einen Callback zur Verfügung, um es zu erreichen?AudioKit ios AKSamplerMetronome

Das ist meine aktuellen Code ist

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

Antwort

3

du mit AKSequencer leicht genug tun konnte (ich habe etwas ähnliches). Ich habe einen Track des Sequenzers einem AKMIDISampler zugewiesen, der den Metronom-Sound erzeugte, und einen zweiten Track, der an ein AKCallbackInstrument ging.
In dem Track, der an das AKCallbackInstrument gesendet wird, habe ich die Beat - Informationen beliebig in den MIDI - Daten codiert, so dass zum Beispiel die MIDI - Daten für den ersten Beat eine MIDINote von 1, die zweite von MIDINote 2 haben die Geschwindigkeit). Dann könnte die Callback-Funktion nur alle noteOn-Nachrichten betrachten und den aktuellen Beat von der MIDI-Note-Nummer abrufen und entsprechend reagieren. Es ist ein bisschen indirekt, aber es funktioniert.

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

Hallo, Vielen Dank, aber ich bin sehr neu zu schnell und iOS-Entwicklung gibt es Beispielcode, der mir helfen kann, dies zu überwinden? – RAM

+0

Hallo, ich habe meinen aktuellen Code hinzugefügt, können Sie mich bitte wissen, wo ich mich geirrt habe – RAM

+0

Ich schlage vor, dass Sie nicht AKSamplerMetronome verwenden (die keine offensichtliche Möglichkeit bietet, Callbacks bereitzustellen). Verwenden Sie stattdessen einen AKSequencer mit AKMIDISampler für den Sound und AKCallbackInstrument für den Callback. Der Code, den ich zur Verfügung gestellt habe, zeigt genau, wie das geht. Was genau willst du machen? –