我正在尝试构建一个从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()
答案 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)
我同意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
我希望这会有所帮助。