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

Ton*_*ung 8 ios swift audiokit

我正在尝试构建一个从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()
Run Code Online (Sandbox Code Playgroud)

Axe*_*sta 3

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

至于您的问题,您可以向事件添加 MIDI 侦听器,此处的Analog Synth X项目中有此代码的示例。

let midi = AKMIDI()
        midi.createVirtualPorts()
        midi.openInput("Session 1")
        midi.addListener(self)
Run Code Online (Sandbox Code Playgroud)

对于更有效的代码,您可以参考此代码,尽管该代码的某些部分可能已经过时。