Запись и воспроизведение MIDI-треков с использованием AudioKit - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь записать MIDI-треки с одним сэмплером, но в то же время. Для каждой новой записи создается новая дорожка на секвенсоре, инструменте обратного вызова с использованием другого канала.

Когда дорожки не пересекаются, все работает нормально. Но когда я добавляю ноты для новой дорожки, которые пересекаются с уже записанной дорожкой, только что записанная дорожка при воспроизведении не будет вызывать функцию обратного вызова для звука, и это будет стандартный звуковой сигнал.

Вот код настройки трека и функции обратного вызова:

func startRecord() {
        guard let newTrack = sequencer.newTrack() else { return }
        recordingTrack = newTrack
        recordingChannel = MIDIChannel(sequencer.tracks.count)

        let midiInstrument = AKMIDICallbackInstrument()
        let channel = recordingChannel
        let sampler = currentSampler
        midiInstrument.callback = { (status, note, velocity) in
            let status = AKMIDIStatus(byte: status)!.type!
            switch status {
            case .noteOn:
                try! sampler.play(noteNumber: note, velocity: velocity, channel: channel!)
            case .noteOff:
                try! sampler.stop(noteNumber: note, channel: channel!)
            default:
                break
            }
        }
        newTrack.setMIDIOutput(midiInstrument.midiIn)

        sequencer.rewind()
        sequencer.preroll()
        sequencer.play()
    }

1 Ответ

0 голосов
/ 17 апреля 2019

Вы создаете новый экземпляр AKMIDICallbackInstrument каждый раз, когда вызываете эту функцию.Похоже, вы не храните эти ссылки за пределами этого блока кода.Попробуйте сохранить массив уровня класса AKMIDICallbackIntruments, в который вы можете добавить новые экземпляры, которые вы создаете.

...