Differenze tra le versioni di "Ottenere la forma d'onda del risultato audio di un file MIDI mediante il Componente gb.media"

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 9: Riga 9:
  
 
Mostriamo di seguito un esempio pratico:
 
Mostriamo di seguito un esempio pratico:
  Library "libc:6"
+
  Public Sub Main()
 
   
 
   
  <FONT color=gray>' ''void exit (int __status)''
+
  Dim pl As MediaPipeline
  ' ''Terminate program execution with STATUS.''</font>
+
  Dim src, mprs, fdc, cnv, scp, jpg, snk As MediaControl
  Private Extern exit_C(__status As Integer) As Integer Exec "exit"
+
  Dim flt As MediaFilter
 +
  Dim secondi As String
 +
   
 +
<FONT Color=gray>' ''Imposta la lunghezza in secondi dell'onda audio da ricavare del file Midi:''</font>
 +
  secondi = "<FONT color=#B22222><B>5</b></font>"
 +
 +
  pl = New MediaPipeline
 +
 +
  src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
 +
  src["location"] = "<FONT color=darkgreen>''/percorso/del/file.mid''</font>"
 +
  mprs = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>")
 +
  fdc = New MediaControl(pl, "<FONT color=#B22222>fluiddec</font>")
 +
  cnv = New MediaControl(pl, "<FONT color=#B22222>audioconvert</font>")
 +
  scp = New MediaControl(pl, "<FONT Color=#B22222>wavescope</font>")
 +
  scp["<FONT Color=#B22222>style</font>"] = 1        <FONT Color=gray>' ''"style" è la proprietà del plugin "wavescope", che qui impostiamo a 1''</font>
 +
  flt = New MediaFilter(pl, "<FONT Color=#B22222>video/x-raw</font>,<FONT Color=#B22222>width=2000</font>,<FONT Color=#B22222>heigth=600</font>,<FONT Color=#B22222>framerate='''1" &/ secondi'''</font>)
 +
  jpg = New MediaControl(pl, "<FONT Color=#B22222>jpegenc</font>")
 +
  jpg["<FONT Color=#B22222>quality</font>"] = 50      <FONT Color=gray>' ''"quality" è la proprietà del plugin "jpegenc", che qui impostiamo a 50''</font>
 +
  snk = New MediaControl(pl, "<FONT Color=#B22222>filesink</font>")
 +
  snk["<FONT Color=#B22222>location</font>"] = "/tmp/forma_onda.jpg"
 +
   
 +
<FONT Color=gray>' ''Collega fra loro all'interno della pipeline gli Oggetti ''MediaControl'' impostati:''</font>    
 +
  src.LinkTo(mprs)
 +
  mprs.LinkTo(fdc)
 +
  fdc.LinkTo(cnv)
 +
  cnv.LinkTo(scp)
 +
  scp.LinkTo(flt)
 +
  flt.LinkTo(jpg)
 +
  jpg.LinkTo(snk)
 +
   
 +
  pl.Play()
 +
 +
  Wait Val(secondi)
 
   
 
   
 +
  pl.Stop()
 +
  pl.Close()
 
   
 
   
  '''Public''' Sub Main()
+
  End
 
 
  Dim pl As MediaPipeline
 
  Dim src, mprs, fdc, cnv, scp, vid, jpg, snk As MediaControl
 
 
 
    pl = New MediaPipeline
 
   
 
    src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
 
    src["location"] = "<FONT color=gray>''/percorso/del/file.mid''</font>"  <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</font>
 
   
 
    mprs = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>")
 
    fdc = New MediaControl(pl, "<FONT color=#B22222>fluiddec</font>")
 
    cnv = New MediaControl(pl, "<FONT color=#B22222>audioconvert</font>")
 
    scp = New MediaControl(pl, "<FONT Color=#B22222>wavescope</font>")
 
    scp["<FONT Color=#B22222>style</font>"] = 1        <FONT Color=gray>' ''"style" è la proprietà del plugin "wavescope", che qui impostiamo a 1''</font>
 
    vid = New MediaControl(pl, "<FONT Color=#B22222>video/x-raw</font>,<FONT Color=#B22222>width=2000</font>,<FONT Color=#B22222>heigth=600</font>,<FONT Color=#B22222>framerate='''1'''/</font><FONT Color=darkgreen>'''''durata_del_file_Midi_in_secondi'''''</font>")
 
    jpg = New MediaFilter(pl, "<FONT Color=#B22222>jpegenc</font>")
 
    jpg["<FONT Color=#B22222>quality</font>"] = 50      <FONT Color=gray>' ''"quality" è la proprietà del plugin "jpegenc", che qui impostiamo a 50''</font>
 
    snk = New MediaControl(pl, "<FONT Color=#B22222>filesink</font>")
 
    snk["<FONT Color=#B22222>location</font>"] = "/tmp/forma_onda.jpg"
 
 
 
<FONT Color=gray>' ''Colleghiamo fra loro all'interno della pipeline gli oggetti ''MediaControl'' impostati:''</font>
 
       
 
    src.LinkTo(mprs)
 
    mprs.LinkTo(fdc)
 
    fdc.LinkTo(cnv)
 
    cnv.LinkTo(scp)
 
    scp.LinkTo(vid)
 
    vid.LinkTo(jpg)
 
    jpg.LinkTo(snk)
 
   
 
    pl.State = Media.Playing
 
    pl.Play()
 
   
 
    Sleep 5
 
   
 
    exit_C(0)
 
   
 
'''End'''
 

Versione attuale delle 18:53, 17 gen 2024

Utilizzando i plugin di GStreamer con le Classi MediaControl e MediaPipeline del Componente gb.media, è possibile ottenere la forma d'onda del risultato audio di un file MIDI.

I plugin specifici da utilizzare 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.

In sostanza, dopo aver ottenuto i campioni audio dalla conversione di un file MIDI, si potrà salvare in un file immagine di tipo JPEG la forma d'onda di tali campioni audio.


Mostriamo di seguito un esempio pratico:

Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, mprs, fdc, cnv, scp, jpg, snk As MediaControl
 Dim flt As MediaFilter
 Dim secondi As String

' Imposta la lunghezza in secondi dell'onda audio da ricavare del file Midi:
 secondi = "5"

 pl = New MediaPipeline 

 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.mid"
 mprs = New MediaControl(pl, "midiparse")
 fdc = New MediaControl(pl, "fluiddec")
 cnv = New MediaControl(pl, "audioconvert")
 scp = New MediaControl(pl, "wavescope")
 scp["style"] = 1         ' "style" è la proprietà del plugin "wavescope", che qui impostiamo a 1
 flt = New MediaFilter(pl, "video/x-raw,width=2000,heigth=600,framerate=1" &/ secondi)
 jpg = New MediaControl(pl, "jpegenc")
 jpg["quality"] = 50      ' "quality" è la proprietà del plugin "jpegenc", che qui impostiamo a 50
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/forma_onda.jpg"

' Collega fra loro all'interno della pipeline gli Oggetti MediaControl impostati:     
 src.LinkTo(mprs)
 mprs.LinkTo(fdc)
 fdc.LinkTo(cnv)
 cnv.LinkTo(scp)
 scp.LinkTo(flt)
 flt.LinkTo(jpg)
 jpg.LinkTo(snk)

 pl.Play()

 Wait Val(secondi)

 pl.Stop()
 pl.Close()

End