es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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():

    print(sequencer.tracks)
    

    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:

    for track in sequencer.tracks {
        for event in track {
            if let midiEvent = event as? MIDIEvent {
                print(midiEvent.data)
            }
        }
    }
    

    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.

Comments are closed.