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

Posted

技术标签:

【中文标题】如何在音轨中的特定点触发事件或回调?【英文标题】:How to trigger events or callback at a specific point in an Audio Track? 【发布时间】:2020-01-28 19:58:16 【问题描述】:

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

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

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

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

MIDI 是正确的方法吗?在 ios 中是否有一种更简单的方法,我不必使用 AudioKit,只需使用 AVFoundation 中的东西。

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

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

我看到了这些帖子,

How to connect AKSequencer to a AKCallbackInstrument?

Play MIDI file together with wav AudioKit

但 AKSequencer 现在已被 AKAppleSequencer 取代。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于如何在音轨中的特定点触发事件或回调?的主要内容,如果未能解决你的问题,请参考以下文章

在音轨播放期间更改乐器 - MIDI/Java

在android中播放音轨中的音频

Kdenlive 不会在音轨上显示红色的音频录制按钮

如何让 Timer 在特定时间点触发?

Javascript 从音轨中选择片段

如何处理多个音轨中重复的note_on、note_off、节奏变化,以及midi文件中没有program_change的轨道?