2017-12-04 1 views
3

현재 AudioKit의 AKSamplerMetronome을 사용하여 메트로놈 사운드를 생성하고 재생하고 있습니다. 현재 콜백을 구현하여 현재의 비트를 얻는 것이 필요합니다. 5 비트가 있으면 현재 재생중인 비트를 가져와야합니다. 비트 수에 따라 더 많은 함수를 추가 할 수 있습니다. 구현할 수있는 콜백이 있습니까?AudioKit ios AKSamplerMetronome

이 내 현재 코드

당신은 AKSequencer 쉽게 충분이 할 수
// 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() 

답변

3

이다 (I 비슷한 일을했다). 시퀀서의 한 트랙을 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() 
+0

안녕하세요, 감사합니다. 신속하게 처리 할 수있는 새로운 기능과 iOS 개발 기능이있어이를 극복하는 데 도움이되는 샘플 코드가 있습니까? – RAM

+0

안녕하세요, 현재 코드를 추가했습니다. 내가 잘못 생각한 부분을 알려주십시오. – RAM

+0

콜백을 제공 할 분명한 방법이없는 AKSamplerMetronome을 사용하지 말 것을 제안합니다. 대신 사운드에는 AKMIDISampler가있는 AKSequencer를 사용하고 콜백에는 AKCallbackInstrument를 사용하십시오. 필자가 제공 한 코드는이를 수행하는 방법을 정확하게 보여줍니다. 당신이하고 싶은 것이 정확히 무엇입니까? –

관련 문제