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.
Riga 11: Riga 11:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
  Dim pl As MediaPipeline
+
  Dim pl As MediaPipeline
  Dim src, mprs, fdc, cnv, scp, jpg, snk As MediaControl
+
  Dim src, mprs, fdc, cnv, scp, jpg, snk As MediaControl
  Dim flt As MediaFilter
+
  Dim flt As MediaFilter
  Dim fileimmagine, secondi As String
+
  Dim fileimmagine, secondi As String
 
+
   fileimmagine = "/tmp/primofile.jpg"
+
   fileimmagine = Temp
 +
 
  <FONT Color=gray>' ''Imposta la lunghezza in secondi dell'onda audio da ricavare del file Midi:''</font>
 
  <FONT Color=gray>' ''Imposta la lunghezza in secondi dell'onda audio da ricavare del file Midi:''</font>
   secondi = "5"
+
   secondi = "<B>5</b>"
 
    
 
    
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
 
      
 
      
 
   src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
 
   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>
+
   src["location"] = "<FONT color=gray>''/percorso/del/file.mid''</font>"
 
      
 
      
 
   mprs = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>")
 
   mprs = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>")
Riga 35: Riga 36:
 
   snk = New MediaControl(pl, "<FONT Color=#B22222>filesink</font>")
 
   snk = New MediaControl(pl, "<FONT Color=#B22222>filesink</font>")
 
   snk["<FONT Color=#B22222>location</font>"] = fileimmagine
 
   snk["<FONT Color=#B22222>location</font>"] = fileimmagine
 
+
 
  <FONT Color=gray>' ''Colleghiamo fra loro all'interno della pipeline gli oggetti ''MediaControl'' impostati:''</font>     
 
  <FONT Color=gray>' ''Colleghiamo fra loro all'interno della pipeline gli oggetti ''MediaControl'' impostati:''</font>     
 
   src.LinkTo(mprs)
 
   src.LinkTo(mprs)
Riga 44: Riga 45:
 
   flt.LinkTo(jpg)
 
   flt.LinkTo(jpg)
 
   jpg.LinkTo(snk)
 
   jpg.LinkTo(snk)
   
+
 
   pl.Play()
 
   pl.Play()
   
+
   Sleep Val(secondi)
+
   Wait Val(secondi)
 
+
 
   Copy fileimmagine To "/tmp/forma_onda.jpg"
 
   Copy fileimmagine To "/tmp/forma_onda.jpg"
 
+
 
   pl.Stop()
 
   pl.Stop()
 
   pl.Close()
 
   pl.Close()
   
+
 
  '''End'''
 
  '''End'''

Versione delle 17:37, 17 set 2022

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 fileimmagine, secondi As String

  fileimmagine = Temp

' 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"] = fileimmagine

' Colleghiamo 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)

  Copy fileimmagine To "/tmp/forma_onda.jpg"

  pl.Stop()
  pl.Close()

End