Как заставить AKSequencer автоматически останавливаться, если он достиг конца последовательности? - PullRequest
1 голос
/ 10 марта 2019

Я заметил, что AKSequencer продолжает играть (AKSequencer.isPlaying имеет значение true), даже если в последовательности больше нет нот для воспроизведения. Можно ли сделать так, чтобы он автоматически останавливался в конце последовательности?

1 Ответ

2 голосов
/ 11 марта 2019

Вы можете использовать AKMIDICallbackInstrument для запуска кода на основе содержимого, которое воспроизводит ваш секвенсор.В этом случае добавьте дополнительную дорожку и установите для нее значение AKMIDICalllbackInstrument.Добавьте событие к этой дорожке в той позиции, в которой вы хотите, чтобы ваш секвенсор остановился (вы можете использовать sequencer.length, если вы еще не знаете, как долго это будет продолжаться).Затем настройте функцию обратного вызова прибора обратного вызова, чтобы остановить секвенсор при получении события.

var seq = AKSequencer()
var callbackInst: AKMIDICallbackInstrument!
var controlTrack: AKMusicTrack!

func setUpCallback() {
    // set up a control track
    controlTrack = seq.newTrack()

    // add an event at the end
    // we don't care about anything here other than the position
    controlTrack.add(noteNumber: 60,
                     velocity: 60,
                     position: seq.length,
                     duration: AKDuration(beats: 1))

    // set up the MIDI callback instrument
    callbackInst = AKMIDICallbackInstrument()
    controlTrack?.setMIDIOutput(callbackInst.midiIn)

    // stop the sequencer when the control track's event's noteOn is recieved
    callbackInst.callback = { statusByte, _, _ in
        guard let status  = AKMIDIStatus(statusByte: statusByte) else { return }
        if status == .noteOn {
            self.seq.stop()
        }
    }
}
...