AKSequencer + AKMIDICallbackInstrument является неточным и иногда пропускает заметки - PullRequest
0 голосов
/ 26 марта 2020

Мне удалось подключить AKSequencer к AKMIDICallbackInstrument (мне это нужно, потому что мне нужно подключить его к монофоническим c узлам позже), но я слышу много неточностей при воспроизведении тех же 16 нот в oop , Я создал новый тест-проект только с одним AKOscillator и AKAmplitudeEnvelope. до этого я пробовал использовать более разные генераторы звука (fmOs c и Wavetable), filters et c, и не каждая нота была проиграна. функция обратного вызова вызывается все время, но иногда нет звука (каждые 10 секунд c или около того) ... мне нужно настроить некоторые значения в AKSettings? или что еще я могу сделать?

вот мой код:

import UIKit
import AudioKit
import AudioKitUI

class ViewController: UIViewController {

    var adsr = AKAmplitudeEnvelope()

    var sequencer = AKSequencer()
    var midi = AKMIDI()
    var sequenceLength = AKDuration(beats:  16.0)

    override func viewDidLoad() {
        var myCallBack = AKMIDICallbackInstrument {  status, note, velocity in
            print(status)
            if(status == 144)
            {
                self.start()
            }
            if(status == 128)
            {
                self.stop()
            }
        }

        _ = sequencer.newTrack()
        sequencer.setLength(sequenceLength)

        generateSequence()

        sequencer.setGlobalMIDIOutput(myCallBack.midiIn)



        var osc = AKOscillator()

        osc.frequency = Double(500)

        adsr = AKAmplitudeEnvelope(osc)
        adsr.attackDuration = 0.1
        adsr.decayDuration = 0.3
        adsr.sustainLevel = 0.5
        adsr.releaseDuration = 0.7

        AudioKit.output = adsr
        try! AudioKit.start()
        osc.start()

        sequencer.setTempo(90.0)
        sequencer.enableLooping()
        sequencer.play()
    }
    func start()
    {
        adsr.start()
    }
    func stop()
    {
        adsr.stop()
    }
    func generateSequence()
    {

        sequencer.tracks[0].clear()
        let numberOfSteps = Int(Float(sequenceLength.beats))


        for i in 0 ..< numberOfSteps
        {
            sequencer.tracks[0].add(noteNumber: 57, velocity: 127, position: AKDuration(beats: Double(i)), duration: AKDuration(beats: 0.1))
        }
    }
}
...