2017-12-27 148 views
8

Próbuję utworzyć sekwencer, który renderuje notatkę z pliku midi.Przeczytaj notatkę z pliku MIDI za pomocą AudioKit

Obecnie używam AudioKit do przetwarzania danych muzycznych. Chciałbym wiedzieć, w jaki sposób mogę uzyskać dane/zdarzenie nutowe z pliku MIDI z AudioKit.

Próbowałem użyć AKSequencer i wyjść do AKMIDINode, aby odsłuchać wydarzenie MIDI, ale wydaje się, że nic z tego nie można uzyskać.

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

Odpowiedz

3

Czy obejrzałeś któryś z przykładowych projektów Audio Kit dostępnych do pobrania? są bardzo przydatne w rozwiązywaniu problemów z AK. Właściwie znajduję przykłady lepsze niż dokumentacja (ponieważ implementacja nie jest dobrze wyjaśniona).

Jeśli chodzi o twoje pytanie, możesz dodać detektor MIDI do zdarzenia, istnieje przykład tego kodu w Analog Synth X Projekcie available here.

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

Dla bardziej pracował kawałka kodu można refer to this chociaż kod jest prawdopodobnie nieaktualne w części.

1

Tony, czy nie otrzymujesz żadnych zdarzeń MIDI, czy tylko instrukcji drukowania?

Zgadzam się z odpowiedzią Axemasty na dodanie do klasy AKMidiListener wraz z sprawdzeniem przykładów kodu MIDI, które pochodzą z AudioKit. Ten ROM przykład odtwarzacz pokazuje jak grać zewnętrznych plików MIDI z węzłem AKMidiSsmpler:

https://github.com/AudioKit/ROMPlayer

Aby wydruk do wyświetlania, spróbuj owinięcie go w DispatchQueue.main.async tak, to na głównym wątku. Oto pytanie AudioKit implementacja MIDI z przykładu kodu, który napisałem tutaj:

AudioKit iOS - receivedMIDINoteOn function

Mam nadzieję, że to pomaga.