Eseguire un file MIDI mediante il componente gb.media

Da Gambas-it.org - Wikipedia.
Versione del 25 gen 2013 alle 16:24 di Vuott (Discussione | contributi) (Nuova pagina: Per eseguire ed ascoltare un file Midi, utilizzando un breve codice, è possibile adoperare le funzionalità della multipiattaforma ''gstreamer'', attivando il componente ''gb.media''....)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Per eseguire ed ascoltare un file Midi, utilizzando un breve codice, è possibile adoperare le funzionalità della multipiattaforma gstreamer, attivando il componente gb.media.

E' necessario aver installato nel proprio sistema anche il banco di suoni Freepats |1|, necessario per l'ascolto dei file Midi con gb.media.


La classe MediaPlayer

Come per l'ascolto dei file audio, si utilizzeranno i metodi specifici della Classe MediaPlayer del componente gb.media.


Ecco di seguito un semplicissimo codice per lanciare ed ascoltare uno standard file Midi (.mid). Porremo sul Form del progetto:

  • tre Button per avviare, mettere in pausa ed arrestare l'esecuzione del file Midi;
  • un Timer che ci consentirà di calcolare il tempo trascorso;
  • un RadioButton per far ripetere a volontà il medesimo file Midi:
Private mp As New MediaPlayer


Public Sub Form_Open()

' Carica il file Midi .mid:
   mp.URL = Media.URL("mio_file_Midi.mid")

' Facciamo in modo che il "Timer", alla sua prima attivazione,
' parta senza alcun ritardo:
   Timer1.Delay = 1

End
 

Public Sub Button1_Click()

   suona()

End

Public Sub suona()
 
' Avvia l'ascolto del file Midi:
   mp.Play

   With Timer1
     .Start
' Il "Timer" si attiva ogni mezzo secondo:
     .Delay = 500
   End With

End

Public Sub Button2_Click()

' Mette in "pausa" l'ascolto del file Midi.
' (Per continuare l'ascolto del file, si dovrà nuovamente attivare la proprietà ".Play"):
   mp.Pause

End

Public Sub Button3_Click()

   RadioButton1.Value = False

' Chiama la funzione per arrestare l'esecuzione del file Midi:
   arresta()

End


Public Sub arresta()

' Arresta l'ascolto del file Midi:
   mp.Stop   

' Se è stato cliccato sul "RadioButton",
' verrà ripetuta l'esecuzione del file Midi:
   If RadioButton1.Value = True Then suona()

End


Public Sub Timer1_Timer()

' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:
   Print mp.Position

' Se la posizione corrente è uguale o maggiore della durata complessiva del brano Midi,
' allora arresta l'esecuzione del file Midi (altrimenti non sarà possibile riavviarlo semplicemente ri-clkiccando sul "Button1"):
   If mp.Position < mp.Duration Then
     Return
   Else
     arresta()
   Endif

End


La proprietà .Duration

La proprietà .Duration restituisce un valore di tipo Float che rappresenta la durata del brano musicale espresso in secondi.
Poiché detta proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile solo successivamente all'attivazione della funzione .Play. Per essere funzionante in modo automatico, potrà essere posta all'interno di una routine di attivazione di un Timer (vedi esempio precedente).


La proprietà .Position

La proprietà .Position restituisce un valore di tipo Float che rappresenta la posizione, espressa in secondi all'interno dei dati processati.
Imposta, altresì, la posizione di esecuzione del brano. Pertanto, essa consente di spostare il processo dei dati, e dunque l'esecuzione del brano, ad un particolare punto temporale.


Modificare il Volume

Per modificare il volume dell'ascolto si dovrà utilizzare la proprietà ".Volume" della proprietà .Audio della Classe MediaPlayer.

Più in particolare la proprietà ".Volume" ritorna od imposta il volume del corrente flusso audio. Nel primo caso restituisce un valore di tipo Float che rappresenta il volume corrente:

valore_di_tipo_Float = mp.Audio.Volume

nel secondo caso il volume è impostato mediante un valore di tipo Float:

mp.Audio.Volume = valore_di_tipo_Float


Annullare l'audio immediatamente

Per annullare l'audio immediatamente, senza modificare i valori del volume, si ha a disposizione la proprietà ".Mute" della proprietà .Audio della Classe MediaPlayer. Alla proprietà .Mute dovrà essere assegnato il valore booleano True.

mp.Audio.Mute = True


L'evento _AboutToFinish

L'evento _AboutToFinish si scatena circa un secondo prima della fine della durata del file che si sta eseguendo.


L'evento _End

L'evento _End si scatena quando la durata del file è terminata.


Gli effetti video con i plug-in

E' possibile ottenere simpatici effetti video utilizzando i plug-in resi disposibili da GStreamer.

In tal caso si farà uso anche della Classe MediaControl che è serve per gestire appositamente i plug-in di GStreamer.


Mostreremo di seguito il codice esenziale per l'utilizzo degli effeti video con i plug-In (si inserirà anche una DrawingArea, che chiameremo drVid, sul Form):

Private mp As New MediaPlayer As "mp"
Private uscitaVideo As MediaControl
Private arrVis As MediaControl[]   ' Un array di variabili di tipo "MediaControl", ossia di vari PlugIn disponibili
Private iVis As Integer   ' Modificando il valore della seguente variabile integer si modifica anche il tipo di visualizzazione


Public Sub Form_Open()

   avviaPlugin()

' Questa ripetizione ci evita di dover "incrementare" automativamente il valore della variabile "iVis":
   iVis = 2
   aggioVis()


' Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea:
   uscitaVideo.SetWindow(drVid)

   With mp
     .URL = Media.URL("percorso_di_un_file_midi")
     .Play
   End With

   iVis = 1

' Va ad aggiornare la visualizzazione dell'effetto con un plug-in:
   aggioVis()

End


Public Sub avviaPlugin()

' Istanzia il controllo di uscita video da usare. In questo caso sarà "ximagesink",
' un "videosink" basato sullo standard X, e che è esso stesso un plug-in:
   uscitaVideo = New MediaControl(mp, "ximagesink")
 
' Imposta il controllo di uscita video da usare:
   mp.Video.Output = uscitaVideo
 

   arrVis = New MediaControl[]

' Nella variabile array di tipo "MediaControl" vengono aggiunti i diversi PlugIn disponibili.
' Il primo elemento dell'array deve essere sostanzialmente vuoto. Se si sceglie questa opzione, non sarà visualizzato alcun motivo:
   aggiunVis("", "")

' Ecco alcuni disponibili:
   aggiunVis("goom", "Goom")
   aggiunVis("libvisual_bumpscope", "Bump")
   aggiunVis("libvisual_corona", "Corona")
   aggiunVis("libvisual_infinite", "Infinite")
   aggiunVis("libvisual_jakdaw", "Jakdaw")
   aggiunVis("libvisual_jess", "Jess")
' Monoscopio è un plugin che consente di visualizzare una forma d'onda altamente stabilizzata di ingresso audio
   aggiunVis("monoscope", "Mono")
   aggiunVis("libvisual_oinksie", "Oinksie")
   aggiunVis("libvisual_lv_scope", "Scope")
   aggiunVis("spacescope", "Space")
   aggiunVis("spectrascope", "Spectra")
   aggiunVis("synaescope", "Synae")
' Oscilloscopio a forma d'onda semplice:
   aggiunVis("wavescope", "Wave")

   iVis = 1

   aggioVis()

End


Public Sub aggiunVis(tipoPlug As String, titolo As String)
 
 Dim hVis As MediaControl

' La variabile "tipoPlug" contiene il tipo di plug'in...
   If tipoPlug Then hVis = New MediaControl(mp, tipoPlug)
 
' ...che viene aggiunta agli elementi della omogenea variabile array:
   arrVis.Add(hVis)

   Catch
     Error tipoPlug; ": "; Error.Text
 
End


Public Sub aggioVis()

 Dim hVis As MediaControl = arrVis[iVis]

' Imposta il plug-in da utilizzare:
   mp.Video.Visualisation = hVis

' Anche qui viene impostata la "DrawingArea", ove mostrare gli effetti video:
   uscitaVideo.SetWindow(drVid)
 
End




Note

[1] Per maggiori informazioni sul banco di suoni Freepats: