Длинные ноты после остановки AKSequencer - PullRequest
0 голосов
/ 04 июня 2018

Иногда мне нужно несколько длинных нот, чтобы продолжить воспроизведение после остановки секвенсора.

akSequencer.stop() // Need to put some code to ask the question

Есть ли способ сохранить звук длинной ноты, когда AKSequencer останавливается?

1 Ответ

0 голосов
/ 05 июня 2018

Вместо того, чтобы подключать MIDI-выход вашего AKMusicTrack непосредственно к вашему сэмплеру (или к генератору, или какому-либо другому), отправьте его на AKCallbackInstrument.В функции обратного вызова вы можете проверить состояние MIDI-сообщений секвенсора и отправить оттуда ваши сообщения noteOn и noteOff на ваш сэмплер.В обратный вызов вы можете добавить условную логику, например, вы можете использовать некоторый флаг, чтобы игнорировать сообщения noteOff при определенных условиях.

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

var seq = AKSequencer()
var sampler = AKAppleSampler()
var callbackInst: AKCallbackInstrument!
var track: AKMusicTrack!
var allowNoteOff: Bool = true

func setupSequencerCallback() {
    track = seq.newTrack()
    callbackInst = AKCallbackInstrument()
    track.setMIDIOutput(callbackInst.midiIn)
    callbackInst.callback = { status, note, vel in
        switch status {
        case .noteOn:
            try? self.sampler.play(noteNumber: note, velocity: vel, channel: 0)
        case .noteOff:
            if self.allowNoteOff {
                try? self.sampler.stop(noteNumber: note, channel: 0)
            }
        default:
            return
        }
    }
}
...