如何在音轨中的特定点触发事件或回调?

How to trigger events or callback at a specific point in an Audio Track?

我想播放一个音频文件(例如一个 wav 文件),并且我想在轨道的特定位置触发事件或触发器来控制外部设备。

我现在的想法是生成一个与音轨同步播放的 MIDI 轨道,当播放 MIDI 轨道音符时,会生成一些触发事件,我们可以处理这些事件来做任何我们想做的事情。

我现在卡住的地方是如何播放.mid 文件并在播放midi 音符时生成事件。我也想同步播放wav和mid文件,但这不是我现在要解决的问题

我查看了 AudioKit,但示例似乎已过时,文档也没有太大帮助。

MIDI 是执行此操作的正确方法吗?在 iOS 中有没有更简单的方法,我不必使用 AudioKit 而只使用 AVFoundation 中的东西。

我想了解什么工具最适合检测 .mid 文件中的 MIDI 音符何时播放并处理事件。

我的研究表明我可以使用 AKAppleSequencer。有什么帮助是一个简单的例子,它加载一个 midi 文件,然后在播放音符时基本上打印一些东西。

我看到了这些帖子,

但是 AKSequencer 现在被 AKAppleSequencer 取代了。

所以我想通了。答案基本上在上面的帖子中,只是更新了代码,因此它使用了 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()
}