使用 AudioKit 从 MIDI 文件中读取音符

Posted

技术标签:

【中文标题】使用 AudioKit 从 MIDI 文件中读取音符【英文标题】:Read note from MIDI file using AudioKit 【发布时间】:2017-12-27 07:41:33 【问题描述】:

我正在尝试构建一个从 midi 文件呈现音符的音序器。

目前我正在使用 AudioKit 进行音乐数据处理。想知道如何使用 AudioKit 从 MIDI 文件中获取音符数据/事件。

我尝试使用 AKSequencer 并输出到 AKMIDINode 来监听 MIDI 事件,但似乎无法从中得到任何东西。

class CustomMIDINode: AKMIDINode 

    override init(node: AKPolyphonicNode) 
        print("Node create") // OK
        super.init(node: node)
    

    func receivedMIDINoteOff(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) 
        print("midi note off") // Not printed
    

    func receivedMIDISetupChange() 
        print("midi setup changed") // Not printed
    

    override func receivedMIDINoteOn(_ noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) 
        print("receivedMIDINoteOn") // Not printed
    


func setupSynth() 
    oscBank.attackDuration = 0.05
    oscBank.decayDuration = 0.1
    oscBank.sustainLevel = 0.1
    oscBank.releaseDuration = 0.1



let seq = AKSequencer(filename: "music")
let oscBank = AKOscillatorBank()
var midi = AKMIDI()
let midiNode = CustomMIDINode(node: oscBank)

setupSynth()

midi.openInput()
midi.addListener(midiNode)
seq.tracks.forEach  (track) in
    track.setMIDIOutput(midiNode.midiIn)

AudioKit.output = midiNode
AudioKit.start()
seq.play()

【问题讨论】:

【参考方案1】:

您是否查看过任何可供下载的示例音频工具包项目?它们对于 AK 故障排除非常有用。实际上,我发现示例比文档更好(因为没有很好地解释实现)。

至于您的问题,您可以在事件中添加一个 midi 侦听器,Analog Synth X 项目available here 中有此代码的示例。

let midi = AKMIDI()
        midi.createVirtualPorts()
        midi.openInput("Session 1")
        midi.addListener(self)

要获得更有效的代码,您可以refer to this,尽管部分代码可能已过时。

【讨论】:

【参考方案2】:

Tony,您是没有收到任何 MIDI 事件,还是只收到了打印语句?

我同意 Axemasta 关于将 AKMidiListener 添加到课程中的回应,以及查看 AudioKit 附带的 MIDI 代码示例。这个 ROM Player 示例展示了如何使用 AKMidiSsmpler 节点播放外部 MIDI 文件:

https://github.com/AudioKit/ROMPlayer

为了显示打印,请尝试将其包装在 DispatchQueue.main.async 中,以便它位于主线程上。这是我在此处发布的带有代码示例的 AudioKit MIDI 实现问题:

AudioKit ios - receivedMIDINoteOn function

我希望这会有所帮助。

【讨论】:

以上是关于使用 AudioKit 从 MIDI 文件中读取音符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AudioKit 的新 AKSequencer 播放 MIDI

Audiokit 似乎只接收前三个 sysex MIDI 消息

使用 audiokit 在 AKsequencer 中创建额外 MIDI 轨道的问题

如何使用 Audiokit 对原始值而不是 MIDI 音符进行排序

在 AudioKit 中“重新触发”Midi 音符

AudioKit - 我怎样才能让 MIDI 输入工作?