Differenze tra le versioni di "Ottenere un file audio da un file MIDI mediante il Componente gb.media"

Da Gambas-it.org - Wikipedia.
Riga 105: Riga 105:
 
    
 
    
 
   Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg"
 
   Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg"
 +
  pl.Stop
 +
  pl.Close
 +
 
 +
'''End'''
 +
 +
 +
In questo terzo esempio si otterrà un file MP3 da un file MIDI:
 +
'''Public''' Sub Main()
 +
 
 +
  Dim pl As MediaPipeline
 +
  Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl
 +
  Dim filemidi, primofile As String
 +
  Dim i As Integer
 +
 
 +
  filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>"
 +
  primofile = "/tmp/primofile"
 +
 
 +
  pl = New MediaPipeline
 +
   
 +
  src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>")
 +
  src["location"] = filemidi  <FONT color=gray>' ''"location" è una proprietà del plugin "filesrc"''</font>
 +
 
 +
  par = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>")
 +
  fdc = New MediaControl(pl, "<FONT color=#B22222>fluiddec</font>")
 +
  res = New MediaControl(pl, "<FONT color=#B22222>audioresample</font>")
 +
  cnv = New MediaControl(pl, "<FONT color=#B22222>audioconvert</font>")
 +
  vol = New MediaControl(pl, "<FONT color=#B22222>volume</font>")
 +
  vol["volume"] = 4.0                          <FONT color=gray>' ''"volume" è una proprietà dell'omonimo plugin "volume"''</font>
 +
  vor = New MediaControl(pl, "<FONT color=#B22222>lamemp3enc</font>")
 +
  snk = New MediaControl(pl, "<FONT color=#B22222>filesink</font>")
 +
  snk["location"] = primofile                  <FONT color=gray>' ''"location" è una proprietà del plugin "filesink"''</font>
 +
 
 +
  src.LinkTo(par)
 +
  par.LinkTo(fdc)
 +
  fdc.LinkTo(res)
 +
  res.LinkTo(cnv)
 +
  cnv.LinkTo(lam)
 +
  lam.LinkTo(snk)
 +
 
 +
  pl.Play()
 +
 
 +
  Print "\nDurata del file Midi: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
 +
  Repeat
 +
    i = Stat(primofile).Size
 +
    Wait 0.3
 +
    Write #File.Out, "\r\e[0mDati convertiti:      \e[31m" & Stat(primofile).Size & " byte"
 +
    Flush #File.Out
 +
  Until i = Stat(primofile).Size
 +
 
 +
  Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".mp3"
 
   pl.Stop
 
   pl.Stop
 
   pl.Close
 
   pl.Close

Versione delle 19:18, 10 ago 2019

Utilizzando i plugin di GStreamer con le Classi MediaControl e MediaPipeline del Componente gb.media, è possibile ottenere un file audio da 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.


Mostriamo di seguito un esempio pratico, nel quale si otterrà un file WAV da un file MIDI:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, par, fdc, res, cnv, vol, enc, snk As MediaControl
 Dim flt As MediaFilter
 Dim filemidi, primofile As String
 Dim s As Single
 
 filemidi = "/percorso/del/file.mid"
 primofile = "/tmp/primofile"
  
 pl = New MediaPipeline 
   
 src = New MediaControl(pl, "filesrc")
 src["location"] = filemidi   ' "location" è una proprietà del plugin "filesrc"
  
 par = New MediaControl(pl, "midiparse")
 fdc = New MediaControl(pl, "fluiddec")
 res = New MediaControl(pl, "audioresample")
 cnv = New MediaControl(pl, "audioconvert")
 flt = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2")
 vol = New MediaControl(pl, "volume")
 vol["volume"] = 4.0                          ' "volume" è una proprietà dell'omonimo plugin "volume"
 enc = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile                  ' "location" è una proprietà del plugin "filesink"
  
 src.LinkTo(par)
 par.LinkTo(fdc)
 fdc.LinkTo(res)
 res.LinkTo(cnv)
 cnv.LinkTo(flt)
 flt.LinkTo(vol)
 vol.LinkTo(enc)
 enc.LinkTo(snk)
  
 pl.Play()
  
 Print "\nDurata del file Midi: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
 Repeat
   s = ((Stat(primofile).Size / 8) / 44100)
   Write "\r\e[0mTempo convertito:     \e[31m" & Date(0, 0, 0, 0, 0, 0, s * 1000)
   Sleep 0.01
 Until Fix(s) >= Fix(pl.Duration)
  
 Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav"
 pl.Stop
 pl.Close
  
End


In quest'altro esempio si otterrà un file OGG-Vorbis da un file MIDI:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl
 Dim filemidi, primofile As String
 Dim i As Integer
 
 filemidi = "/percorso/del/file.mid"
 primofile = "/tmp/primofile"
  
 pl = New MediaPipeline 
   
 src = New MediaControl(pl, "filesrc")
 src["location"] = filemidi   ' "location" è una proprietà del plugin "filesrc"
  
 par = New MediaControl(pl, "midiparse")
 fdc = New MediaControl(pl, "fluiddec")
 res = New MediaControl(pl, "audioresample")
 cnv = New MediaControl(pl, "audioconvert")
 vol = New MediaControl(pl, "volume")
 vol["volume"] = 4.0                          ' "volume" è una proprietà dell'omonimo plugin "volume"
 vor = New MediaControl(pl, "vorbisenc")
 mux = New MediaControl(pl, "oggmux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile                  ' "location" è una proprietà del plugin "filesink"
  
 src.LinkTo(par)
 par.LinkTo(fdc)
 fdc.LinkTo(res)
 res.LinkTo(cnv)
 cnv.LinkTo(vor)
 vor.LinkTo(mux)
 mux.LinkTo(snk)
  
 pl.Play()
  
 Print "\nDurata del file Midi: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
 Repeat
   i = Stat(primofile).Size
   Wait 0.3
   Write #File.Out, "\r\e[0mDati convertiti:      \e[31m" & Stat(primofile).Size & " byte"
   Flush #File.Out
 Until i = Stat(primofile).Size 
  
 Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg"
 pl.Stop
 pl.Close
  
End


In questo terzo esempio si otterrà un file MP3 da un file MIDI:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl
 Dim filemidi, primofile As String
 Dim i As Integer
 
 filemidi = "/percorso/del/file.mid"
 primofile = "/tmp/primofile"
  
 pl = New MediaPipeline 
   
 src = New MediaControl(pl, "filesrc")
 src["location"] = filemidi   ' "location" è una proprietà del plugin "filesrc"
  
 par = New MediaControl(pl, "midiparse")
 fdc = New MediaControl(pl, "fluiddec")
 res = New MediaControl(pl, "audioresample")
 cnv = New MediaControl(pl, "audioconvert")
 vol = New MediaControl(pl, "volume")
 vol["volume"] = 4.0                          ' "volume" è una proprietà dell'omonimo plugin "volume"
 vor = New MediaControl(pl, "lamemp3enc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = primofile                  ' "location" è una proprietà del plugin "filesink"
  
 src.LinkTo(par)
 par.LinkTo(fdc)
 fdc.LinkTo(res)
 res.LinkTo(cnv)
 cnv.LinkTo(lam)
 lam.LinkTo(snk)
  
 pl.Play()
  
 Print "\nDurata del file Midi: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
 Repeat
   i = Stat(primofile).Size
   Wait 0.3
   Write #File.Out, "\r\e[0mDati convertiti:      \e[31m" & Stat(primofile).Size & " byte"
   Flush #File.Out
 Until i = Stat(primofile).Size 
  
 Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".mp3"
 pl.Stop
 pl.Close
  
End



Riferimenti