Conoscere la durata di un file Midi mediante il Componente gb.media
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()".
Indice
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)