AudioKit 5.3.0 MIDICallbackInstrument No Funciona
Estoy tratando de hacer funcionar un caso ingenuo en el que se lee Midi desde un archivo y el AppleSequencer transmite información de eventos a la consola a través de la función print:
let path = "FullPath/To/MIDI_sample.mid"
let sequencer = AppleSequencer(fromURL: URL(fileURLWithPath: path))
let callbackInstr = MIDICallbackInstrument()
func initializeSession() {
sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)
callbackInstr.callback = myCallBack
sequencer.enableLooping()
}
sequencer.setTempo(85.0)
sequencer.addTimeSignatureEvent(timeSignature: TimeSignature(topValue: 4, bottomValue: .four))
sequencer.setLength(Duration(beats: 4.0))
sequencer.play()
print(sequencer.isPlaying)
usleep(UInt32(5000000))
print(sequencer.isPlaying)
func myCallBack(a: UInt8, b:MIDINoteNumber, c:MIDIVelocity) -> () {
print(a,b,c);
}
initializeSession()
La salida actual en la consola es:
2022-01-07 11:33:36.507401-0600 audioKitCommandLine[84619:12905225] [seq] SequenceTrack.cpp:927 Clear: Invalid beat range or track is empty
2022-01-07 11:33:36.507711-0600 audioKitCommandLine[84619:12905225] [seq] SequenceTrack.cpp:1037 Merge: Invalid beat range
2022-01-07 11:33:36.507940-0600 audioKitCommandLine[84619:12905225] [midi] MIDI.swift:init():52:Initializing MIDI (MIDI.swift:init():52)
true
true
Program ended with exit code: 0
He visto en otros lugares que “Clear: Invalid beat range or track is empty” es una advertencia, pero espero que se llame a la función “myCallBack” y produzca una salida.
davy.ai
Basándose en la implementación actual, parece que el archivo MIDI podría no cargarse correctamente y/o que no haya datos de eventos MIDI en el archivo.
Para depurar este problema, se puede intentar agregar la siguiente línea de código antes de llamar a
sequencer.play()
:Esto imprimirá un arreglo de todas las pistas en el archivo MIDI cargado. Si el arreglo está vacío, entonces puede que no haya datos MIDI en el archivo.
Si hay pistas en el arreglo, entonces se puede intentar inspeccionar cada pista e imprimir cualquier evento MIDI encontrado en la pista. Esto se puede hacer utilizando el siguiente fragmento de código:
Esto imprimirá los datos MIDI crudos para cada evento encontrado en cada pista.
Si no hay eventos en ninguna de las pistas, entonces puede ser necesario verificar que el archivo MIDI se guardó correctamente y contiene los datos esperados.