Differenze tra le versioni di "Eseguire un file Midi mediante le funzioni esterne del API di VLC"

Da Gambas-it.org - Wikipedia.
 
(27 versioni intermedie di uno stesso utente non sono mostrate)
Riga 6: Riga 6:
 
E' possibile eseguire dati Midi anche direttamente da internet.
 
E' possibile eseguire dati Midi anche direttamente da internet.
  
Per creare in Gambas un'applicazione con la presente risorsa, si dovrà installare e richiamare la libreria dinamica e condivisa "''libvlc.so.5.6.0''".
+
Per creare in Gambas un'applicazione con la presente risorsa, si dovrà installare e richiamare la libreria condivisa "''libvlc.so.5.6.1'' ".
 
 
 
 
 
===Esempio con applicazione grafica===
 
===Esempio con applicazione grafica===
 
Mostriamo di seguito un semplice esempio, nel quale si potrà avviare, arrestare, porre in pausa e riprendere l'esecuzione del file Midi:
 
Mostriamo di seguito un semplice esempio, nel quale si potrà avviare, arrestare, porre in pausa e riprendere l'esecuzione del file Midi:
Riga 16: Riga 14:
 
   
 
   
 
   
 
   
  Library "libvlc:5.6.0"
+
  Library "<FONT Color=blue>libvlc:5.6.1</font>"
 
   
 
   
 
  Private Enum libvlc_NothingSpecial = 0,
 
  Private Enum libvlc_NothingSpecial = 0,
Riga 62: Riga 60:
 
  ' ''Toggle pause.''</font>
 
  ' ''Toggle pause.''</font>
 
  Private Extern libvlc_media_player_pause(p_mi As Pointer)
 
  Private Extern libvlc_media_player_pause(p_mi As Pointer)
 +
 +
<FONT color=gray>' ''int libvlc_audio_set_volume(libvlc_media_player_t *p_mi, int i_volume)''
 +
' ''Set current software audio volume.''</font>
 +
Private Extern libvlc_audio_set_volume(p_mi As Pointer, i_volume As Integer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''void libvlc_media_player_release (libvlc_media_player_t * p_mi)''
 
  <FONT color=gray>' ''void libvlc_media_player_release (libvlc_media_player_t * p_mi)''
Riga 76: Riga 78:
 
   
 
   
 
   
 
   
  Library "libSDL2-2.0:0.10.0"
+
  Library "<FONT Color=red>libSDL2-2.0:0.3000.6</font>"
 
   
 
   
 
  Private Const SDL_INIT_AUDIO As Integer = 16
 
  Private Const SDL_INIT_AUDIO As Integer = 16
Riga 89: Riga 91:
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Form_Open()
 +
 +
  With Slider1
 +
    .MaxValue = 100
 +
    .MinValue = 0
 +
    .Value = 50
 +
  End With
 +
 +
End
 +
 +
 +
Public Sub Button1_Click()
 
    
 
    
 
   SDL_Init(SDL_INIT_AUDIO)
 
   SDL_Init(SDL_INIT_AUDIO)
Riga 97: Riga 110:
 
      
 
      
 
  <FONT color=gray>' ''Crea un nuovo oggetto multimedia:''</font>
 
  <FONT color=gray>' ''Crea un nuovo oggetto multimedia:''</font>
   m = libvlc_media_new_path(inst, "<FONT color=gray>''/percorso/del/file.mid''</font>")
+
   m = libvlc_media_new_path(inst, "<FONT color=darkgreen>''/percorso/del/file.mid''</font>")
 
      
 
      
  <FONT color=gray>' ''Crea un media player:''</font>
+
  <FONT color=gray>' ''Crea un media play30er:''</font>
 
   mp = libvlc_media_player_new_from_media(m)
 
   mp = libvlc_media_player_new_from_media(m)
   
+
   <FONT color=gray>' ''Avvia l'esecuzione del file Midi da parte del media player:''</font>
+
<FONT color=gray>' ''Imposta il valore iniziale del volume dell'audio in base al valore iniziale dello "Slider":''</font>
 +
   libvlc_audio_set_volume(mp, Slider1.Value)
 +
 +
<FONT color=gray>' ''Avvia l'esecuzione del file Midi da parte del media player:''</font>
 
   libvlc_media_player_play(mp)
 
   libvlc_media_player_play(mp)
 +
 +
  Repeat
 +
    Wait 0.01
 +
  Until libvlc_media_player_get_length(mp, 0) > 0.0
 
   
 
   
 
   Repeat
 
   Repeat
    TextLabel1.Text = "Durata: " & Str(Date(0, 0, 0, 0, 0, 0, libvlc_media_player_get_length(mp, 0)))
+
    TextLabel1.Text = "Durata: " & Str(Time(0, 0, 0, libvlc_media_player_get_length(mp, 0)))
    TextLabel2.Text = "&lt;FONT Color=red>" & Str(Date(0, 0, 0, 0, 0, 0, libvlc_media_player_get_time(mp)))
+
    TextLabel2.Text = "&lt;FONT Color=red>" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
    Wait 0.01
+
    ProgressBar1.Value = libvlc_media_player_get_time(mp) / libvlc_media_player_get_length(mp, 0)
 +
    Wait 0.01
 
   Until libvlc_media_player_get_state(mp) > libvlc_Paused
 
   Until libvlc_media_player_get_state(mp) > libvlc_Paused
 
   
 
   
 
   Chiude()
 
   Chiude()
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button2_Click()
+
  Public Sub Button2_Click()
 
   
 
   
 
  <FONT color=gray>' ''Arresta l'esecuzione del file Midi:''</font>
 
  <FONT color=gray>' ''Arresta l'esecuzione del file Midi:''</font>
 
   libvlc_media_player_stop(mp)
 
   libvlc_media_player_stop(mp)
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure Chiude()
+
  Private Procedure Chiude()
 
   
 
   
 
  <FONT color=gray>' ''Chiude le librerie VLC e SDL:''</font>
 
  <FONT color=gray>' ''Chiude le librerie VLC e SDL:''</font>
Riga 132: Riga 153:
 
   SDL_Quit()
 
   SDL_Quit()
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub ToggleButton1_Click()
+
  Public Sub ToggleButton1_Click()
 
   
 
   
 
  <FONT color=gray>' ''Pone in pausa o riprende (se già in pausa) l'esecuzione del file Midi:''</font>
 
  <FONT color=gray>' ''Pone in pausa o riprende (se già in pausa) l'esecuzione del file Midi:''</font>
 
   libvlc_media_player_pause(mp)
 
   libvlc_media_player_pause(mp)
 
   
 
   
  '''End'''
+
  End
 +
 +
 +
Public Sub Slider1_Change()
 +
 +
<FONT color=gray>' ''Modifica il volume audio:''</font>
 +
  If mp > 0 Then libvlc_audio_set_volume(mp, Slider1.Value)
 +
 +
End
  
 +
===Spostare l'esecuzione del file Midi nell'ambito della sua durata===
 +
Si può avanzare o retrocedere all'interno dell'esecuzione di un <U>file</u> Midi mediante la funzione esterna "libvlc_media_player_set_time()".
 +
 +
Innanzitutto si dichiarerà formalmente la funzione esterna "libvlc_media_player_set_time()" di libvlc:
 +
<FONT color=gray>' ''void libvlc_media_player_set_time (libvlc_media_player_t *p_mi, libvlc_time_t i_time)''
 +
' ''Set the movie time (in ms).''</font>
 +
Private Extern libvlc_media_player_set_time(player As Pointer, i_time As Long)
 +
 +
Volendo usare uno ''Slider'', imposteremo i valori iniziali dello ''Slider'', dedicato allo spostamento dell'esecuzione del file Midi, nella routine:
 +
Public Sub Form_Open()
 +
 +
  ......
 +
 +
  With Slider2
 +
    .MaxValue = 1000
 +
    .MinValue = 0
 +
    .Value = 0
 +
  End With
 +
 +
End
 +
Inoltre imposteremo una specifica routine per lo ''Slider'' dedicato allo spostamento dell'esecuzione del file Midi:
 +
Public Sub Slider2_Change()
 +
 +
<FONT color=gray>' ''Sposta l'esecuzione del file Midi nell'ambito della sua durata:''</font>
 +
  libvlc_media_player_set_time(mp, (Slider2.Value * libvlc_media_player_get_length(mp, 0)) / 1000)
 +
 +
End
 +
 +
===Far variare la posizione del cursore dello ''Slider'' in base all'esecuzione===
 +
Se si preferisce far variare la posizione del cursore dello ''Slider'' in base al punto, all'evolversi dell'esecuzione del file Midi, e poter arbitrariamente far avanzare e retrocedere il punto dell'esecuzione muovendo il cursore dello ''Slider'', allora potrà adottarsi un codice come il seguente:
 +
Private inst As Pointer
 +
Private mp As Pointer
 +
Private m As Pointer
 +
Private bo As Boolean
 +
 +
 +
Library "libvlc:5.6.1"
 +
 +
Private Enum libvlc_NothingSpecial = 0, libvlc_Opening, libvlc_Buffering, libvlc_Playing,
 +
              libvlc_Paused, libvlc_Stopped, libvlc_Ended, libvlc_Error
 +
 +
<Font Color=gray>' ''libvlc_instance_t * libvlc_new (int argc, const char *const *argv)''
 +
' ''Create And initialize a libvlc instance.''</font>
 +
Private Extern libvlc_new(argc As Integer, argv As String[]) As Pointer
 +
 +
<Font Color=gray>' ''libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path)''
 +
' ''Create a media for a certain file path.''</font>
 +
Private Extern libvlc_media_new_path(p_instance As Pointer, path As String) As Pointer
 +
 +
<Font Color=gray>' ''libvlc_media_player_t * libvlc_media_player_new_from_media (libvlc_media_t *p_md)''
 +
' ''Create a Media Player object from a Media.''</font>
 +
Private Extern libvlc_media_player_new_from_media(p_md As Pointer) As Pointer
 +
 +
<Font Color=gray>' ''int libvlc_media_player_play (libvlc_media_player_t * p_mi)''
 +
' ''Play the video file.''</font>
 +
Private Extern libvlc_media_player_play(p_mi As Pointer) As Integer
 +
 +
<Font Color=gray>' ''void libvlc_media_player_stop (libvlc_media_player_t * p_mi)''
 +
' ''Stop the video file.''</font>
 +
Private Extern libvlc_media_player_stop(p_mi As Pointer)
 +
 +
<Font Color=gray>' ''libvlc_time_t libvlc_media_player_get_length(libvlc_media_player_t *, libvlc_exception_t *)''
 +
' ''Get the current movie length (in ms).''</font>
 +
Private Extern libvlc_media_player_get_length(p_mi As Pointer, l_ex As Pointer) As Integer
 +
 +
<Font Color=gray>' ''libvlc_time_t libvlc_media_player_get_time(libvlc_media_player_t * p_mi)''
 +
' ''Get the current movie time (in ms).''</font>
 +
Private Extern libvlc_media_player_get_time(p_mi As Pointer) As Integer
 +
 +
<Font Color=gray>' ''libvlc_state_t libvlc_media_player_get_state(libvlc_media_player_t *p_mi)''
 +
' ''Get current movie state.''</font>
 +
Private Extern libvlc_media_player_get_state(p_mi As Pointer) As Integer
 +
 +
<Font Color=gray>' ''void libvlc_media_player_pause (libvlc_media_player_t *p_mi)''
 +
' ''Toggle pause.''</font>
 +
Private Extern libvlc_media_player_pause(p_mi As Pointer)
 +
 +
<Font Color=gray>' ''void libvlc_media_player_set_time (libvlc_media_player_t *p_mi, libvlc_time_t i_time)''
 +
' ''Set the movie time (in ms).''</font>
 +
Private Extern libvlc_media_player_set_time(player As Pointer, i_time As Long)
 +
 +
<Font Color=gray>' ''void libvlc_media_player_release (libvlc_media_player_t * p_mi)''
 +
' ''Release a media_player after use Decrement the reference count of a media player object.''</font>
 +
Private Extern libvlc_media_player_release(p_mi As Pointer)
 +
 +
<Font Color=gray>' ''void libvlc_media_release (libvlc_media_t *p_md)''
 +
' ''Decrement the reference count of a media descriptor object.''</font>
 +
Private Extern libvlc_media_release(p_md As Pointer)
 +
 +
<Font Color=gray>' ''void libvlc_release (libvlc_instance_t * p_instance)''
 +
' ''Decrement the reference count of a libvlc instance, and destroy it if it reaches zero.''</font>
 +
Private Extern libvlc_release(p_instance As Pointer)
 +
 +
 +
Public Sub Form_Open()
 +
 +
  With Slider1
 +
    .MaxValue = 100
 +
    .MinValue = 0
 +
    .Value = 0
 +
  End With
 +
 +
End
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  Slider1.Value = 0
 +
 +
  inst = libvlc_new(0, Null)
 +
 +
  m = libvlc_media_new_path(inst, "<FONT color=darkgreen>''/percorso/del/file.mid''</font>")
 +
 +
  mp = libvlc_media_player_new_from_media(m)
 +
 +
  libvlc_media_player_play(mp)
 +
 +
  Repeat
 +
    Wait 0.01
 +
  Until libvlc_media_player_get_length(mp, 0) > 0.0
 +
 +
  Repeat
 +
    Me.Title = "Durata: " & Str(Time(0, 0, 0, libvlc_media_player_get_length(mp, 0))) &
 +
              " - " & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
 +
    ProgressBar1.Value = libvlc_media_player_get_time(mp) / libvlc_media_player_get_length(mp, 0)
 +
    If Not bo Then Slider1.Value = ProgressBar1.Value * 100
 +
    Wait 0.01
 +
  Until libvlc_media_player_get_state(mp) > libvlc_Paused
 +
 +
  Chiude()
 +
 +
End
 +
 +
 +
Public Sub Button2_Click()
 +
 +
  libvlc_media_player_stop(mp)
 +
 +
  DrawingArea1.Clear
 +
 +
End
 +
 +
 +
Private Procedure Chiude()
 +
 +
  libvlc_media_player_release(mp)
 +
  libvlc_media_release(m)
 +
  libvlc_release(inst)
 +
 +
End
 +
 +
 +
Public Sub ToggleButton1_Click()
 +
 +
  libvlc_media_player_pause(mp)
 +
 +
End
 +
 +
 +
Public Sub Slider1_MouseDown()
 +
 +
  bo = True
 +
 +
End
 +
 +
 +
Public Sub Slider1_MouseUp()
 +
 +
  bo = False
 +
 +
  libvlc_media_player_set_time(mp, (Slider1.Value * libvlc_media_player_get_length(mp, 0)) / 100)
 +
 +
End
  
 +
===Esempio con effetto video===
 
In quest'altro esempio mostreremo un effetto video (''Spectrum analyzer'') di VLC, che rappresenta un "Analizzatore di spettro", all'interno di una ''DrawingArea''
 
In quest'altro esempio mostreremo un effetto video (''Spectrum analyzer'') di VLC, che rappresenta un "Analizzatore di spettro", all'interno di una ''DrawingArea''
 
  Private inst As Pointer
 
  Private inst As Pointer
Riga 148: Riga 351:
 
    
 
    
 
   
 
   
  Library "libvlc:5.6.0"
+
  Library "<FONT color=blue>libvlc:5.6.1</font>"
 
   
 
   
 
  Private Enum libvlc_NothingSpecial = 0,
 
  Private Enum libvlc_NothingSpecial = 0,
Riga 216: Riga 419:
 
   
 
   
 
   
 
   
  Library "libSDL2-2.0:0.10.0"
+
  Library "<FONT color=red>libSDL2-2.0:0.3000.6</font>"
 
   
 
   
 
  Private Const SDL_INIT_AUDIO As Integer = 16
 
  Private Const SDL_INIT_AUDIO As Integer = 16
Riga 229: Riga 432:
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim ss As String[]
 
   Dim ss As String[]
Riga 243: Riga 446:
 
      
 
      
 
  <FONT color=gray>' ''Crea un nuovo oggetto multimedia:''</font>
 
  <FONT color=gray>' ''Crea un nuovo oggetto multimedia:''</font>
   m = libvlc_media_new_path(inst, "<FONT color=gray>''/percorso/del/file.mid''</font>")
+
   m = libvlc_media_new_path(inst, "<FONT color=darkgreen>''/percorso/del/file.mid''</font>")
 
      
 
      
 
  <FONT color=gray>' ''Crea un media player:''</font>
 
  <FONT color=gray>' ''Crea un media player:''</font>
Riga 258: Riga 461:
 
    
 
    
 
   Repeat
 
   Repeat
     TextLabel1.Text = "Durata: " & Str(Date(0, 0, 0, 0, 0, 0, libvlc_media_player_get_length(mp, 0)))
+
     TextLabel1.Text = "Durata: " & Str(Time(0, 0, 0, libvlc_media_player_get_length(mp, 0)))
     TextLabel2.Text = "&lt;FONT Color=red>" & Str(Date(0, 0, 0, 0, 0, 0, libvlc_media_player_get_time(mp)))
+
     TextLabel2.Text = "&lt;FONT Color=red>" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
 
     Wait 0.01
 
     Wait 0.01
 
   Until libvlc_media_player_get_state(mp) > libvlc_Paused
 
   Until libvlc_media_player_get_state(mp) > libvlc_Paused
Riga 265: Riga 468:
 
   Chiude()
 
   Chiude()
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button2_Click()
+
  Public Sub Button2_Click()
 
   
 
   
 
  <FONT color=gray>' ''Arresta l'esecuzione del file Midi:''</font>
 
  <FONT color=gray>' ''Arresta l'esecuzione del file Midi:''</font>
 
   libvlc_media_player_stop(mp)
 
   libvlc_media_player_stop(mp)
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure Chiude()
+
  Private Procedure Chiude()
 
      
 
      
 
  <FONT color=gray>' ''Chiude le librerie VLC e SDL:''</font>
 
  <FONT color=gray>' ''Chiude le librerie VLC e SDL:''</font>
Riga 284: Riga 487:
 
   SDL_Quit()
 
   SDL_Quit()
 
      
 
      
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub ToggleButton1_Click()
+
  Public Sub ToggleButton1_Click()
 
   
 
   
 
  <FONT color=gray>' ''Pone in pausa o riprende (se già in pausa) l'esecuzione del file Midi:''</font>
 
  <FONT color=gray>' ''Pone in pausa o riprende (se già in pausa) l'esecuzione del file Midi:''</font>
 
   libvlc_media_player_pause(mp)
 
   libvlc_media_player_pause(mp)
 
   
 
   
  '''End'''
+
  End
 
 
  
  
 
===Esempio con applicazione ''a riga di comando''===
 
===Esempio con applicazione ''a riga di comando''===
  Library "libvlc:5.6.0"
+
  Library "<FONT color=blue>libvlc:5.6.1</font>"
 
   
 
   
 
  Enum libvlc_NothingSpecial = 0,
 
  Enum libvlc_NothingSpecial = 0,
Riga 310: Riga 512:
 
  <FONT color=gray>' ''libvlc_instance_t * libvlc_new (int argc, const char *const *argv)''
 
  <FONT color=gray>' ''libvlc_instance_t * libvlc_new (int argc, const char *const *argv)''
 
  ' ''Create And initialize a libvlc instance.''</font>
 
  ' ''Create And initialize a libvlc instance.''</font>
  Private Extern libvlc_new(argc As Integer, argv As String) As Pointer
+
  Private Extern libvlc_new(argc As Integer, argv As String[]) As Pointer
 
   
 
   
 
  <FONT color=gray>' ''libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path)''
 
  <FONT color=gray>' ''libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path)''
Riga 323: Riga 525:
 
  ' ''Play the Midi file.''</font>
 
  ' ''Play the Midi file.''</font>
 
  Private Extern libvlc_media_player_play(p_mi As Pointer) As Integer
 
  Private Extern libvlc_media_player_play(p_mi As Pointer) As Integer
 +
 +
<FONT color=gray>' ''libvlc_time_t libvlc_media_get_duration(libvlc_media_t *p_md)''
 +
' ''Get duration (in ms) of media descriptor object item.''</font>
 +
Private Extern libvlc_media_get_duration(p_md As Pointer) As Long
 
   
 
   
 
  <FONT color=gray>' ''libvlc_time_t libvlc_media_player_get_time(libvlc_media_player_t * p_mi)''
 
  <FONT color=gray>' ''libvlc_time_t libvlc_media_player_get_time(libvlc_media_player_t * p_mi)''
Riga 345: Riga 551:
 
   
 
   
 
   
 
   
  Library "libSDL2-2.0:0.10.0"
+
  Library "<FONT color=red>libSDL2-2.0:0.3000.6</font>"
 
   
 
   
 
  Private Const SDL_INIT_AUDIO As Integer = 16
 
  Private Const SDL_INIT_AUDIO As Integer = 16
Riga 358: Riga 564:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim m, inst, mp As Pointer
 
   Dim m, inst, mp As Pointer
 +
  Dim l As Long
 
    
 
    
 
   SDL_Init(SDL_INIT_AUDIO)
 
   SDL_Init(SDL_INIT_AUDIO)
Riga 368: Riga 575:
 
      
 
      
 
  <FONT color=gray>' ''Crea un nuovo oggetto multimedia:''</font>
 
  <FONT color=gray>' ''Crea un nuovo oggetto multimedia:''</font>
   m = libvlc_media_new_path(inst, "<FONT color=gray>''/percorso/del/file.mid''</font>")
+
   m = libvlc_media_new_path(inst, "<FONT color=darkgreen>''/percorso/del/file.mid''</font>")
 
      
 
      
 
  <FONT color=gray>' ''Crea un media player:''</font>
 
  <FONT color=gray>' ''Crea un media player:''</font>
Riga 375: Riga 582:
 
   <FONT color=gray>' ''Avvia l'esecuzione del file Midi da parte del media player:''</font>
 
   <FONT color=gray>' ''Avvia l'esecuzione del file Midi da parte del media player:''</font>
 
   libvlc_media_player_play(mp)
 
   libvlc_media_player_play(mp)
 
+
 
   While libvlc_media_player_get_state(mp) < libvlc_Stopped
+
  Repeat
     Write "\r\e[31m" & Str(Date(0, 0, 0, 0, 0, 0, libvlc_media_player_get_time(mp)))
+
    l = libvlc_media_get_duration(m)
 +
  Until l > 0
 +
  Print "Durata: "; Time(0, 0, 0, l)
 +
 
 +
   While libvlc_media_player_get_state(mp) <> libvlc_Ended
 +
     Write "\r   \e[31m" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
 +
    Wait 0.01
 
   Wend
 
   Wend
 
    
 
    
  <FONT color=gray>' ''Chiude la libreria VLC:''</font>
+
  <FONT color=gray>' ''Chiude la libreria VLC e il programma:''</font>
 
   libvlc_media_player_release(mp)
 
   libvlc_media_player_release(mp)
 
   libvlc_media_release(m)
 
   libvlc_media_release(m)
Riga 386: Riga 599:
 
   SDL_Quit()
 
   SDL_Quit()
 
    
 
    
  '''End'''
+
  End
 +
Se si vuole consentire l'arresto arbitrario dell'esecuzione del file Midi, allora si dovrà rendere "Globale" la variabile ''Puntatore'', chiamata "mp", e la parte finale del codice dovrà essere così modificata e integrata:
 +
  ......
 +
 +
  While (libvlc_media_player_get_state(mp) <> libvlc_Stopped) And (libvlc_media_player_get_state(mp) <> libvlc_Ended)
 +
    Write "\r  \e[31m" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
 +
    Wait 0.01
 +
  Wend
 +
 +
<FONT color=gray>' ''Chiude il media player, la libreria VLC e il programma:''</font>
 +
  libvlc_media_player_release(mp)
 +
  libvlc_release(inst)
 +
  SDL_Quit()
 +
<FONT color=gray>' ''Avendo usato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per chiudere il programma:''</font>
 +
  Quit
 +
 +
End
 +
 
 +
 
 +
Public Sub Application_Read()
 +
 +
<FONT color=gray>' ''Arresta l'esecuzione del file Midi:''</font>
 +
  libvlc_media_player_stop(mp)
 +
 +
End
  
  
Riga 395: Riga 632:
  
 
Esempio:
 
Esempio:
  media = libvlc_media_new_location(instance, "<FONT color=gray>''http&#058;//www.indirizzo/web/del/file.mid''</font>")
+
  media = libvlc_media_new_location(instance, "<FONT color=darkgreen>''http&#058;//www.indirizzo/web/del/file.mid''</font>")
  
  

Versione attuale delle 20:34, 15 ago 2024

La libreria LibVLC consente di eseguire anche file MIDI, purché si abbiano installati nel sistema anche:

  • vlc-plugin-fluidsynth - le risorse dei plugin di FluidSynth per VLC;
  • fluid-soundfont-gm - Fluid (R3) General MIDI SoundFont (GM);
  • ovviamente lo stesso FluidSynth.

E' possibile eseguire dati Midi anche direttamente da internet.

Per creare in Gambas un'applicazione con la presente risorsa, si dovrà installare e richiamare la libreria condivisa "libvlc.so.5.6.1 ".

Esempio con applicazione grafica

Mostriamo di seguito un semplice esempio, nel quale si potrà avviare, arrestare, porre in pausa e riprendere l'esecuzione del file Midi:

Private inst As Pointer
Private mp As Pointer
Private m As Pointer


Library "libvlc:5.6.1"

Private Enum libvlc_NothingSpecial = 0,
        libvlc_Opening,
        libvlc_Buffering,
        libvlc_Playing,
        libvlc_Paused,
        libvlc_Stopped,
        libvlc_Ended,
        libvlc_Error

' libvlc_instance_t * libvlc_new (int argc, const char *const *argv)
' Create And initialize a libvlc instance.
Private Extern libvlc_new(argc As Integer, argv As String[]) As Pointer

' libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path)
' Create a media for a certain file path.
Private Extern libvlc_media_new_path(p_instance As Pointer, path As String) As Pointer

' libvlc_media_player_t * libvlc_media_player_new_from_media (libvlc_media_t *p_md)
' Create a Media Player object from a Media.
Private Extern libvlc_media_player_new_from_media(p_md As Pointer) As Pointer

' int libvlc_media_player_play (libvlc_media_player_t * p_mi)
' Play the audio file.
Private Extern libvlc_media_player_play(p_mi As Pointer) As Integer

' void libvlc_media_player_stop (libvlc_media_player_t * p_mi)
' Stop the audio file.
Private Extern libvlc_media_player_stop(p_mi As Pointer)

' libvlc_time_t libvlc_media_player_get_length(libvlc_media_player_t *, libvlc_exception_t *)
' Get the current movie length (in ms).
Private Extern libvlc_media_player_get_length(p_mi As Pointer, l_ex As Pointer) As Integer

' libvlc_time_t libvlc_media_player_get_time(libvlc_media_player_t * p_mi)
' Get the current movie time (in ms).
Private Extern libvlc_media_player_get_time(p_mi As Pointer) As Integer

' libvlc_state_t libvlc_media_player_get_state(libvlc_media_player_t *p_mi)
' Get current movie state.
Private Extern libvlc_media_player_get_state(p_mi As Pointer) As Integer

' void   libvlc_media_player_pause (libvlc_media_player_t *p_mi)
' Toggle pause.
Private Extern libvlc_media_player_pause(p_mi As Pointer)

' int libvlc_audio_set_volume(libvlc_media_player_t *p_mi, int i_volume)
' Set current software audio volume.
Private Extern libvlc_audio_set_volume(p_mi As Pointer, i_volume As Integer) As Integer

' void libvlc_media_player_release (libvlc_media_player_t * p_mi)
' Release a media_player after use Decrement the reference count of a media player object.
Private Extern libvlc_media_player_release(p_mi As Pointer)

' void libvlc_media_release (libvlc_media_t *p_md)
' Decrement the reference count of a media descriptor object.
Private Extern libvlc_media_release(p_md As Pointer)

' libvlc_release (libvlc_instance_t * p_instance)
' Decrement the reference count of a libvlc instance, and destroy it if it reaches zero.
Private Extern libvlc_release(p_instance As Pointer)


Library "libSDL2-2.0:0.3000.6"

Private Const SDL_INIT_AUDIO As Integer = 16

' int SDL_Init(Uint32 flags)
' Initialize the SDL library.
Private Extern SDL_Init(flags As Integer) As Integer

' void SDL_Quit(void)
' Clean up all initialized subsystems.
Private Extern SDL_Quit()


Public Sub Form_Open()

 With Slider1
   .MaxValue = 100
   .MinValue = 0
   .Value = 50
 End With

End


Public Sub Button1_Click()
 
 SDL_Init(SDL_INIT_AUDIO)
   
' Inizializza la libreria VLC:
 inst = libvlc_new(0, Null)
   
' Crea un nuovo oggetto multimedia:
 m = libvlc_media_new_path(inst, "/percorso/del/file.mid")
   
' Crea un media play30er:
 mp = libvlc_media_player_new_from_media(m)

' Imposta il valore iniziale del volume dell'audio in base al valore iniziale dello "Slider":
 libvlc_audio_set_volume(mp, Slider1.Value)

' Avvia l'esecuzione del file Midi da parte del media player:
 libvlc_media_player_play(mp)

 Repeat 
   Wait 0.01
 Until libvlc_media_player_get_length(mp, 0) > 0.0

 Repeat
   TextLabel1.Text = "Durata: " & Str(Time(0, 0, 0, libvlc_media_player_get_length(mp, 0)))
   TextLabel2.Text = "<FONT Color=red>" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
   ProgressBar1.Value = libvlc_media_player_get_time(mp) / libvlc_media_player_get_length(mp, 0)
   Wait 0.01
 Until libvlc_media_player_get_state(mp) > libvlc_Paused

 Chiude()

End


Public Sub Button2_Click()

' Arresta l'esecuzione del file Midi:
 libvlc_media_player_stop(mp)

End


Private Procedure Chiude()

' Chiude le librerie VLC e SDL:
 libvlc_media_player_release(mp)
 libvlc_media_release(m)
 libvlc_release(inst)
 SDL_Quit()
 
End


Public Sub ToggleButton1_Click()

' Pone in pausa o riprende (se già in pausa) l'esecuzione del file Midi:
 libvlc_media_player_pause(mp)

End


Public Sub Slider1_Change()

' Modifica il volume audio:
 If mp > 0 Then libvlc_audio_set_volume(mp, Slider1.Value)

End

Spostare l'esecuzione del file Midi nell'ambito della sua durata

Si può avanzare o retrocedere all'interno dell'esecuzione di un file Midi mediante la funzione esterna "libvlc_media_player_set_time()".

Innanzitutto si dichiarerà formalmente la funzione esterna "libvlc_media_player_set_time()" di libvlc:

' void libvlc_media_player_set_time (libvlc_media_player_t *p_mi, libvlc_time_t i_time)
' Set the movie time (in ms).
Private Extern libvlc_media_player_set_time(player As Pointer, i_time As Long)

Volendo usare uno Slider, imposteremo i valori iniziali dello Slider, dedicato allo spostamento dell'esecuzione del file Midi, nella routine:

Public Sub Form_Open()

 ......

 With Slider2
   .MaxValue = 1000
   .MinValue = 0
   .Value = 0
 End With

End

Inoltre imposteremo una specifica routine per lo Slider dedicato allo spostamento dell'esecuzione del file Midi:

Public Sub Slider2_Change()

' Sposta l'esecuzione del file Midi nell'ambito della sua durata:
 libvlc_media_player_set_time(mp, (Slider2.Value * libvlc_media_player_get_length(mp, 0)) / 1000)

End

Far variare la posizione del cursore dello Slider in base all'esecuzione

Se si preferisce far variare la posizione del cursore dello Slider in base al punto, all'evolversi dell'esecuzione del file Midi, e poter arbitrariamente far avanzare e retrocedere il punto dell'esecuzione muovendo il cursore dello Slider, allora potrà adottarsi un codice come il seguente:

Private inst As Pointer
Private mp As Pointer
Private m As Pointer
Private bo As Boolean


Library "libvlc:5.6.1"

Private Enum libvlc_NothingSpecial = 0, libvlc_Opening, libvlc_Buffering, libvlc_Playing,
             libvlc_Paused, libvlc_Stopped, libvlc_Ended, libvlc_Error

' libvlc_instance_t * libvlc_new (int argc, const char *const *argv)
' Create And initialize a libvlc instance.
Private Extern libvlc_new(argc As Integer, argv As String[]) As Pointer

' libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path)
' Create a media for a certain file path.
Private Extern libvlc_media_new_path(p_instance As Pointer, path As String) As Pointer

' libvlc_media_player_t * libvlc_media_player_new_from_media (libvlc_media_t *p_md)
' Create a Media Player object from a Media.
Private Extern libvlc_media_player_new_from_media(p_md As Pointer) As Pointer

' int libvlc_media_player_play (libvlc_media_player_t * p_mi)
' Play the video file.
Private Extern libvlc_media_player_play(p_mi As Pointer) As Integer

' void libvlc_media_player_stop (libvlc_media_player_t * p_mi)
' Stop the video file.
Private Extern libvlc_media_player_stop(p_mi As Pointer)

' libvlc_time_t libvlc_media_player_get_length(libvlc_media_player_t *, libvlc_exception_t *)
' Get the current movie length (in ms).
Private Extern libvlc_media_player_get_length(p_mi As Pointer, l_ex As Pointer) As Integer

' libvlc_time_t libvlc_media_player_get_time(libvlc_media_player_t * p_mi)
' Get the current movie time (in ms).
Private Extern libvlc_media_player_get_time(p_mi As Pointer) As Integer

' libvlc_state_t libvlc_media_player_get_state(libvlc_media_player_t *p_mi)
' Get current movie state.
Private Extern libvlc_media_player_get_state(p_mi As Pointer) As Integer

' void libvlc_media_player_pause (libvlc_media_player_t *p_mi)
' Toggle pause.
Private Extern libvlc_media_player_pause(p_mi As Pointer)

' void libvlc_media_player_set_time (libvlc_media_player_t *p_mi, libvlc_time_t i_time)
' Set the movie time (in ms).
Private Extern libvlc_media_player_set_time(player As Pointer, i_time As Long)

' void libvlc_media_player_release (libvlc_media_player_t * p_mi)
' Release a media_player after use Decrement the reference count of a media player object.
Private Extern libvlc_media_player_release(p_mi As Pointer)

' void libvlc_media_release (libvlc_media_t *p_md)
' Decrement the reference count of a media descriptor object.
Private Extern libvlc_media_release(p_md As Pointer)

' void libvlc_release (libvlc_instance_t * p_instance)
' Decrement the reference count of a libvlc instance, and destroy it if it reaches zero.
Private Extern libvlc_release(p_instance As Pointer)


Public Sub Form_Open()

 With Slider1
   .MaxValue = 100
   .MinValue = 0
   .Value = 0
 End With

End


Public Sub Button1_Click()

 Slider1.Value = 0

 inst = libvlc_new(0, Null)

 m = libvlc_media_new_path(inst, "/percorso/del/file.mid")

 mp = libvlc_media_player_new_from_media(m)

 libvlc_media_player_play(mp)

 Repeat
   Wait 0.01
 Until libvlc_media_player_get_length(mp, 0) > 0.0

 Repeat
   Me.Title = "Durata: " & Str(Time(0, 0, 0, libvlc_media_player_get_length(mp, 0))) &
              " - " & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
   ProgressBar1.Value = libvlc_media_player_get_time(mp) / libvlc_media_player_get_length(mp, 0)
   If Not bo Then Slider1.Value = ProgressBar1.Value * 100
   Wait 0.01
 Until libvlc_media_player_get_state(mp) > libvlc_Paused

 Chiude()

End


Public Sub Button2_Click()

 libvlc_media_player_stop(mp)

 DrawingArea1.Clear

End


Private Procedure Chiude()

 libvlc_media_player_release(mp)
 libvlc_media_release(m)
 libvlc_release(inst)

End


Public Sub ToggleButton1_Click()

 libvlc_media_player_pause(mp)

End


Public Sub Slider1_MouseDown()

 bo = True

End


Public Sub Slider1_MouseUp()

 bo = False

 libvlc_media_player_set_time(mp, (Slider1.Value * libvlc_media_player_get_length(mp, 0)) / 100)

End

Esempio con effetto video

In quest'altro esempio mostreremo un effetto video (Spectrum analyzer) di VLC, che rappresenta un "Analizzatore di spettro", all'interno di una DrawingArea

Private inst As Pointer
Private mp As Pointer
 

Library "libvlc:5.6.1"

Private Enum libvlc_NothingSpecial = 0,
        libvlc_Opening,
        libvlc_Buffering,
        libvlc_Playing,
        libvlc_Paused,
        libvlc_Stopped,
        libvlc_Ended,
        libvlc_Error

' libvlc_instance_t * libvlc_new (int argc, const char *const *argv)
' Create And initialize a libvlc instance.
Private Extern libvlc_new(argc As Integer, argv As String[]) As Pointer

' libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path)
' Create a media for a certain file path.
Private Extern libvlc_media_new_path(p_instance As Pointer, path As String) As Pointer

' libvlc_media_player_t * libvlc_media_player_new_from_media (libvlc_media_t *p_md)
' Create a Media Player object from a Media.
Private Extern libvlc_media_player_new_from_media(p_md As Pointer) As Pointer

' void libvlc_media_player_set_xwindow (libvlc_media_player_t *p_mi, uint32_t drawable)
' Set an X Window System drawable where the media player should render its video output.
Private Extern libvlc_media_player_set_xwindow(p_mi As Pointer, drawable As Integer)

' int libvlc_media_player_play (libvlc_media_player_t * p_mi)
' Play the audio file.
Private Extern libvlc_media_player_play(p_mi As Pointer) As Integer

' void libvlc_media_player_stop (libvlc_media_player_t * p_mi)
' Stop the audio file.
Private Extern libvlc_media_player_stop(p_mi As Pointer)

' libvlc_time_t libvlc_media_player_get_length(libvlc_media_player_t *, libvlc_exception_t *)
' Get the current movie length (in ms).
Private Extern libvlc_media_player_get_length(p_mi As Pointer, l_ex As Pointer) As Integer

' libvlc_time_t libvlc_media_player_get_time(libvlc_media_player_t * p_mi)
' Get the current movie time (in ms).
Private Extern libvlc_media_player_get_time(p_mi As Pointer) As Integer

' libvlc_state_t libvlc_media_player_get_state(libvlc_media_player_t *p_mi)
' Get current movie state.
Private Extern libvlc_media_player_get_state(p_mi As Pointer) As Integer

' void   libvlc_media_player_pause (libvlc_media_player_t *p_mi)
' Toggle pause.
Private Extern libvlc_media_player_pause(p_mi As Pointer)

' void libvlc_media_player_release (libvlc_media_player_t * p_mi)
' Release a media_player after use Decrement the reference count of a media player object.
Private Extern libvlc_media_player_release(p_mi As Pointer)

' void libvlc_media_player_release (libvlc_media_player_t * p_mi)
' Release a media_player after use Decrement the reference count of a media player object.
Private Extern libvlc_media_player_release(p_mi As Pointer)

' void libvlc_media_release (libvlc_media_t *p_md)
' Decrement the reference count of a media descriptor object.
Private Extern libvlc_media_release(p_md As Pointer)

' libvlc_release (libvlc_instance_t * p_instance)
' Decrement the reference count of a libvlc instance, and destroy it if it reaches zero.
Private Extern libvlc_release(p_instance As Pointer)


Library "libSDL2-2.0:0.3000.6"

Private Const SDL_INIT_AUDIO As Integer = 16

' int SDL_Init(Uint32 flags)
' Initialize the SDL library.
Private Extern SDL_Init(flags As Integer) As Integer

' void SDL_Quit(void)
' Clean up all initialized subsystems.
Private Extern SDL_Quit()


Public Sub Button1_Click()

 Dim ss As String[]
 Dim m As Pointer
 Dim id As Integer
 
 SDL_Init(SDL_INIT_AUDIO)
  
 ss = ["--audio-visual=visual", "--effect-list=spectrum"]
  
' Inizializza la libreria VLC:
 inst = libvlc_new(ss.Count, ss)
   
' Crea un nuovo oggetto multimedia:
 m = libvlc_media_new_path(inst, "/percorso/del/file.mid")
   
' Crea un media player:
 mp = libvlc_media_player_new_from_media(m)
  
' Per far mostrare l'effetto video "Analizzatore di spettro" nella "DrawingArea", ricaviamo il suo identificativo:
 id = DrawingArea1.Id
  
' Passiamo l'identificativo della finestra, nella quale dovrà essere mostrato l'effetto "Spectrum analyzer":
 libvlc_media_player_set_xwindow(mp, id)
   
 ' Avvia l'esecuzione del file Midi da parte del media player:
 libvlc_media_player_play(mp)
 
 Repeat
   TextLabel1.Text = "Durata: " & Str(Time(0, 0, 0, libvlc_media_player_get_length(mp, 0)))
   TextLabel2.Text = "<FONT Color=red>" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
   Wait 0.01
 Until libvlc_media_player_get_state(mp) > libvlc_Paused
 
 Chiude()

End


Public Sub Button2_Click()

' Arresta l'esecuzione del file Midi:
 libvlc_media_player_stop(mp)

End


Private Procedure Chiude()
   
' Chiude le librerie VLC e SDL:
 libvlc_media_player_release(mp)
 libvlc_media_release(m)
 libvlc_release(inst)
 SDL_Quit()
   
End


Public Sub ToggleButton1_Click()

' Pone in pausa o riprende (se già in pausa) l'esecuzione del file Midi:
 libvlc_media_player_pause(mp)

End


Esempio con applicazione a riga di comando

Library "libvlc:5.6.1"

Enum libvlc_NothingSpecial = 0,
     libvlc_Opening,
     libvlc_Buffering,
     libvlc_Playing,
     libvlc_Paused,
     libvlc_Stopped,
     libvlc_Ended,
     libvlc_Error

' libvlc_instance_t * libvlc_new (int argc, const char *const *argv)
' Create And initialize a libvlc instance.
Private Extern libvlc_new(argc As Integer, argv As String[]) As Pointer

' libvlc_media_t * libvlc_media_new_path (libvlc_instance_t *p_instance, const char *path)
' Create a media for a certain Midi file path.
Private Extern libvlc_media_new_path(p_instance As Pointer, path As String) As Pointer

' libvlc_media_player_t * libvlc_media_player_new_from_media (libvlc_media_t *p_md)
' Create a Media Player object from a Media.
Private Extern libvlc_media_player_new_from_media(p_md As Pointer) As Pointer

' int libvlc_media_player_play (libvlc_media_player_t * p_mi)
' Play the Midi file.
Private Extern libvlc_media_player_play(p_mi As Pointer) As Integer

' libvlc_time_t libvlc_media_get_duration(libvlc_media_t *p_md)
' Get duration (in ms) of media descriptor object item.
Private Extern libvlc_media_get_duration(p_md As Pointer) As Long

' libvlc_time_t libvlc_media_player_get_time(libvlc_media_player_t * p_mi)
' Get the current movie time (in ms).
Private Extern libvlc_media_player_get_time(p_mi As Pointer) As Integer

' libvlc_state_t libvlc_media_player_get_state(libvlc_media_player_t *p_mi)
' Get current movie state.
Private Extern libvlc_media_player_get_state(p_mi As Pointer) As Integer
 
' void libvlc_media_player_release (libvlc_media_player_t * p_mi)
' Release a media_player after use Decrement the reference count of a media player object.
Private Extern libvlc_media_player_release(p_mi As Pointer)

' void libvlc_media_release (libvlc_media_t *p_md)
' Decrement the reference count of a media descriptor object.
Private Extern libvlc_media_release(p_md As Pointer)

' libvlc_release (libvlc_instance_t * p_instance)
' Decrement the reference count of a libvlc instance, and destroy it if it reaches zero.
Private Extern libvlc_release(p_instance As Pointer)


Library "libSDL2-2.0:0.3000.6"

Private Const SDL_INIT_AUDIO As Integer = 16

' int SDL_Init(Uint32 flags)
' Initialize the SDL library.
Private Extern SDL_Init(flags As Integer) As Integer

' void SDL_Quit(void)
' Clean up all initialized subsystems.
Private Extern SDL_Quit()


Public Sub Main()

 Dim m, inst, mp As Pointer
 Dim l As Long
 
 SDL_Init(SDL_INIT_AUDIO)
      
' Inizializza la libreria VLC:
 inst = libvlc_new(0, Null)
   
' Crea un nuovo oggetto multimedia:
 m = libvlc_media_new_path(inst, "/percorso/del/file.mid")
   
' Crea un media player:
 mp = libvlc_media_player_new_from_media(m)
   
 ' Avvia l'esecuzione del file Midi da parte del media player:
 libvlc_media_player_play(mp)
 
 Repeat 
   l = libvlc_media_get_duration(m)
 Until l > 0
 Print "Durata: "; Time(0, 0, 0, l)
 
 While libvlc_media_player_get_state(mp) <> libvlc_Ended
   Write "\r   \e[31m" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
   Wait 0.01
 Wend
  
' Chiude la libreria VLC e il programma:
 libvlc_media_player_release(mp)
 libvlc_media_release(m)
 libvlc_release(inst)
 SDL_Quit()
  
End

Se si vuole consentire l'arresto arbitrario dell'esecuzione del file Midi, allora si dovrà rendere "Globale" la variabile Puntatore, chiamata "mp", e la parte finale del codice dovrà essere così modificata e integrata:

 ......

 While (libvlc_media_player_get_state(mp) <> libvlc_Stopped) And (libvlc_media_player_get_state(mp) <> libvlc_Ended)
   Write "\r   \e[31m" & Str(Time(0, 0, 0, libvlc_media_player_get_time(mp)))
   Wait 0.01
 Wend

' Chiude il media player, la libreria VLC e il programma:
 libvlc_media_player_release(mp)
 libvlc_release(inst)
 SDL_Quit()
' Avendo usato l'Evento "Application_Read()", è necessario usare l'istruzione "Quit" per chiudere il programma:
 Quit 

End


Public Sub Application_Read()

' Arresta l'esecuzione del file Midi:
 libvlc_media_player_stop(mp)

End


Esecuzione on-line di un file Midi da una pagina web

Per eseguire on-line un file Midi dal collegamento presente in una pagina web, bisognerà:
1) assicurarsi che l'indirizzo web, ove è ospitato il file Midi da eseguire, inizi con l'acronimo del protocollo "http" e non con "https";
2) utilizzare la funzione "libvlc_media_new_location( )" al posto della funzione "libvlc_media_new_path( )".

Esempio:

media = libvlc_media_new_location(instance, "http://www.indirizzo/web/del/file.mid")


Riferimenti