Conoscere la durata di un file Midi mediante il Componente gb.media

Da Gambas-it.org - Wikipedia.

Per conoscere la durata di un file Midi, il Componente gb.media fornisce la Proprietà ".Duration" della Classe MediaPlayer. In particolare questa Proprietà restituisce un valore di tipo Float che rappresenta la durata del file Midi espresso in secondi.

Poiché tale proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile solo successivamente all'attivazione della funzione ".Play()".

Usando la Classe MediaPlayer

Public Sub Main()

 Dim mp As MediaPlayer

 With mp = New MediaPlayer
   .URL = Media.URL("/percorso/del/file.mid")
   .Audio.Mute = True  ' Questa istruzione non è essenziale ai fini dell'ottenimento della durata
   .Play()
   Print "Durata del file Midi: "; Time(0, 0, 0, .Duration * 1000)
   .Stop()
   .Close()
 End With

End


Usando la Classe MediaPipeline e MediaControl con il plugin "decodebin" di GStreamer

Public Sub Main()

 Dim pl As MediaPipeline
 Dim mid, dcb, fak As MediaControl

 pl = New MediaPipeline
 mid = New MediaControl(pl, "filesrc")
 mid["location"] = "/percorso/del/file.mid"
 dcb = New MediaControl(pl, "decodebin")
 fak = New MediaControl(pl, "fakesink")  "Usa "fakesink" per evitare l'emissione di qualsiasi suono"
 
 mid.LinkTo(dcb)
 dcb.LinkLaterTo(fak)
 
 With pl
   .Play()
 Print "Durata del file Midi: \e[1m"; Time(0, 0, 0, .Duration * 1000)
   .Stop()
   .Close()
 End With

End


Usando i plugin specifici di GStreamer per il Midi

I plugin specifici di GStreamer utilizzabili per il MIDI sono:

  • midiparse: interpreta i file MIDI e li converte in eventi MIDI;
  • fluiddec: effettua il render degli eventi MIDI in campioni audio grezzi.
Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, par, flu, fak As MediaControl
 
 pl = New MediaPipeline As "PLine"
 
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.mid"
 par = New MediaControl(pl, "midiparse")
 flu = New MediaControl(pl, "fluiddec")
 fak = New MediaControl(pl, "fakesink")  "Usa "fakesink" per evitare l'emissione di qualsiasi suono"
 
 src.LinkTo(par)
 par.LinkTo(flu)
 flu.LinkTo(fak)
 
 pl.Play()
 
 Print "Durata del file Midi: "; Str(Time(0, 0, 0, pl.Duration * 1000))
  
 pl.Stop()
 pl.Close()
  
End


Se la Proprietà ".Duration" restituisce un valore = 0

Talvolta può accadere che la Proprietà ".Duration", ritardando la determinazione della durata del file Midi, restituisca un valore = 0.0.
In tal caso è sufficiente far precedere un ciclo, dal quale si uscirà soltanto quando la Proprietà ".Duration" restituirà un valore superiore a 0.0.

Di seguito un esempio essenziale per ottenere con sicurezza il valore della durata di un file Midi dalla Proprietà ".Duration":

 Repeat 
   Wait 0.01
 Until mp.Duration > 0.0

 Print "Durata del file Midi: \e[34m"; Time(0, 0, 0, mp.Duration * 1000)