Как вызвать события или обратный вызов в указанной c точке на аудиодорожке? - PullRequest
1 голос
/ 28 января 2020

Я хочу воспроизвести аудиофайл (например, WAV-файл), и в указанных c местах дорожки я хочу запускать события или триггеры, которые будут управлять внешним устройством.

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

В данный момент я застрял в том, как воспроизвести файл .mid и генерировать события при воспроизведении миди-нот. Я также хочу воспроизвести файл wav и mid в формате syn c, но это не то, что я сейчас решаю.

Я посмотрел на AudioKit, но примеры кажутся устаревшими и документация не очень помогает.

Является ли MIDI правильным подходом для этого? Есть ли более простой способ в iOS, где мне не нужно использовать AudioKit и просто использовать что-то из AVFoundation.

Я хочу понять, какой инструмент лучше всего обнаружить при воспроизведении ноты midi из файла .mid, и обработать событие.

Мои исследования показали, что я должен использовать AKAppleSequencer. Что может помочь, так это простой пример, который загружает миди-файл, а затем в основном печатает что-то, когда воспроизводится нота.

Я сталкивался с этими сообщениями,

Как подключить AKSequencer к AKCallbackInstrument?

Воспроизвести MIDI-файл вместе с wav AudioKit

, но AKSequencer теперь заменен AKAppleSequencer.

1 Ответ

1 голос
/ 30 января 2020

Так что я понял это. Ответ был в основном в постах выше только что обновил код, поэтому он использует AKAppleSequencer.

let sequencer = AKAppleSequencer(filename: "SaReGaMa") // the .mid file
let callbackInstr = AKMIDICallbackInstrument()
var player: AKPlayer!

func initializeSession() {
        callbackInstr.callback = myCallBack
        sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)
        if let audioFile = try? AKAudioFile(readFileName: "SaReGaMa.wav") {
            player = AKPlayer(audioFile: audioFile)
            player.completionHandler = { print("Finished playing file")}
            player.buffering = .always

            AudioKit.output = player
            do {
                try AudioKit.start()

            } catch {
                print("Error starting audiokit, \(error)")
            }
        }
}

// The callback gets triggered when each midi note is played by the sequencer.
func myCallBack(a: UInt8, b:MIDINoteNumber, c:MIDIVelocity) -> () {
        print(a,b,c);
}
// These functions let you control the playback. 
func play() {
        player.play()
        sequencer.play()
}

func pause() {
        sequencer.stop()
        player.pause()
}
...