AudioKit: использование нового AKSequencer с любым набором инструментов обратного вызова - PullRequest
1 голос
/ 29 апреля 2020

Эта топика c была покрыта Многочисленные времена , и я успешно использовал AKMIDICallbackInstrument со старым AKAppleSequencer в моих предыдущих приложениях.

Я начинаю с используйте новый AKSequencer, который является абсолютно феноменальным: элегантный интерфейс и простой в использовании. Тем не менее, я не могу за свою жизнь понять, как обрабатывать события обратного вызова с ним. Мне нужно использовать обратный вызов для запуска GUI событий на основе воспроизведения секвенсора.

Вот мой пример кода:

    private func setMetronome(bpm: BPM, beats:Int)
    {
        sequencer = AKSequencer(targetNode: metronomeSampler)
        sequencer.tempo = bpm
        sequencer.loopEnabled = false
        sequencer.length = Double(beats)

        metroCallback.callback = {status, noteNumber, velocity in
            if let midiStatus = AKMIDIStatus(byte: status), midiStatus.type != .noteOn { return }

            //Do callback stuff here
        }

        let metroCallbackTrack = sequencer.addTrack(for: metroCallback)

        for i in 0..<beats
        {
            if i == 0
            {
                sequencer.add(noteNumber: MIDINoteNumber(67), position: Double(i), duration: 1.0)
                metroCallbackTrack.add(noteNumber: MIDINoteNumber(67), position: Double(i), duration: 1.0)
            }
            else if (i % 4 == 0)
            {
                sequencer.add(noteNumber: MIDINoteNumber(67), position: Double(i), duration: 1.0)
                metroCallbackTrack.add(noteNumber: MIDINoteNumber(60), position: Double(i), duration: 1.0)
            }
            else
            {
                sequencer.add(noteNumber: MIDINoteNumber(60), position: Double(i), duration: 1.0)
                metroCallbackTrack.add(noteNumber: MIDINoteNumber(60), position: Double(i), duration: 1.0)
            }
            print("seq count:\(i)")
        }

        for track in sequencer.tracks
        {
            print("Adding track to mixer:\(track.length)")
            track >>> mixer
        }
    }

Этот код правильно создает последовательность n количество ударов, оно воспроизводится через мои AKSampler все хорошо в мире. За исключением того, что не происходит никаких событий обратного вызова (используя операторы печати для подтверждения)

Процесс мышления

С AKAppleSequencer и AKMIDICallbackInstrument, вы можете установить globalMIDIOutput с AKAppleSequencer с миди-входом AKMIDICallBackInstrument.

Теперь новые AKSequencer и AKCallbackInstrument не имеют этих опций, равно как и новый AKSequencerTrack (старый AKAppleSequencer будет использовать AKMusicTrack объекты, которые могут устанавливать миди-ввод / вывод). Рассматривая реализацию нового AKSequencer, он управляется AKNode объектами, AKCallbackInstrument является a AKNode объектом и должен иметь возможность управляться треком с нужными промежуточными данными. ,

Я добавляю трек в мой секвенсор и с этого трека и необходимые миди-данные, точно дублирующие миди-события, на которые я хочу отозвать, и выполняю мои GUI события. Однако при таком подходе он не вызывает обратный вызов.

Кто-нибудь знает, как использовать эти новые компоненты с обратным вызовом? Я действительно не хочу go возвращаться к AKAppleSequencer, если нет явного способа управлять обратными вызовами с новым AKSequencer.

1 Ответ

0 голосов
/ 01 мая 2020

Чтобы заставить AKCallbackInstrument работать с новым AKSequencer, попробуйте подключить свой инструмент обратного вызова к выходу, например,

metroCallback >>> mixer

Не очевидно, но сработало для меня.

...