如何在音轨中的特定点触发事件或回调?
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()
【讨论】:
以上是关于如何在音轨中的特定点触发事件或回调?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理多个音轨中重复的note_on、note_off、节奏变化,以及midi文件中没有program_change的轨道?