2017-12-27 1 views
8

Ich versuche, einen Sequenzer zu bauen, der die Note von MIDI-Datei rendern.Note von MIDI-Datei mit AudioKit lesen

Derzeit verwende ich AudioKit für die Musikdatenverarbeitung. Möchte wissen, wie ich die Notendaten/Event aus der MIDI-Datei mit AudioKit bekommen kann.

Ich habe versucht, AKSequencer zu verwenden und zu AKMIDINode ausgeben, um das MIDI-Ereignis zu hören, aber scheint nichts davon zu bekommen.

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() 

Antwort

3

Haben Sie sich die Audio Kit-Projekte, die zum Download zur Verfügung stehen, angesehen? Sie sind sehr nützlich für die Fehlerbehebung bei AK. Ich finde die Beispiele tatsächlich besser als die Dokumentation (da die Implementierung nicht sehr gut erklärt wird).

Wie für Ihre Frage können Sie einen Midi-Listener zu einem Ereignis hinzufügen, gibt es ein Beispiel für diesen Code in Analog Synth X Projekt available here.

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

Für eine gearbeitet Stück Code Sie können refer to this obwohl der Code ist in Teilen veraltet wahrscheinlich.

1

Tony, erhalten Sie keine MIDI-Events oder nur die Print-Anweisungen?

Ich stimme Axemastas Antwort über das Hinzufügen AKMidiListener zu der Klasse, zusammen mit dem Auschecken der MIDI-Code Beispiele, die mit AudioKit kommen. Dieser ROM-Player Beispiel zeigt, wie mit dem AKMidiSsmpler Knoten externen MIDI-Dateien abspielen:

https://github.com/AudioKit/ROMPlayer

Damit der Druck, angezeigt werden versuchen, es in einem DispatchQueue.main.async Verpackung, so dass es auf dem Haupt-Thread ist. Hier ist ein Audiokit MIDI-Implementation Frage mit einem Codebeispiel, das ich hier gepostet:

AudioKit iOS - receivedMIDINoteOn function

Ich hoffe, das hilft.