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

时间:2017-12-27 07:41:34

标签: 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()

2 个答案:

答案 0 :(得分:3)

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

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

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

对于更加有效的代码,您可以refer to this尽管代码可能已经过时了。

答案 1 :(得分:1)

托尼,是不是你没有收到任何MIDI事件,或只是打印声明?

我同意Axemasta关于在课堂上添加 <?php if(empty(str_replace(" ","",$_GET["q"]))){ echo '<h1>SPACE Not Allowed Please Try Again</h1>'; } else { echo "a"; } ?> 的回应,以及检查AudioKit附带的MIDI代码示例。此ROM播放器示例显示如何使用AKMidiListener节点播放外部MIDI文件:

https://github.com/AudioKit/ROMPlayer

为了显示打印件,请尝试将其包装在AKMidiSsmpler中,以便它位于主线程上。这是一个AudioKit MIDI实现问题,我在这里发布了一个代码示例:

AudioKit iOS - receivedMIDINoteOn function

我希望这会有所帮助。