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

Da Gambas-it.org - Wikipedia.
Riga 7: Riga 7:
  
 
Mostriamo di seguito un esempio pratico, nel quale si otterrà un file WAV da un file MIDI:
 
Mostriamo di seguito un esempio pratico, nel quale si otterrà un file WAV da un file MIDI:
Library "libc:6"
 
 
<FONT color=gray>' ''void exit (int __status)''
 
' ''Terminate program execution with STATUS.''</font>
 
Private Extern exit_C(i As Integer) As Integer Exec "exit"
 
 
 
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim src, mprs, fdc, cnv, wenc, snk As MediaControl
+
   Dim src, par, fdc, cnv, enc, snk As MediaControl
 
+
 
    pl = New MediaPipeline  
+
  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>")
 
    wenc = New MediaControl(pl, "<FONT color=#B22222>wavenc</font>")
 
    alsa = New MediaControl(pl, "<FONT color=#B22222>alsasink</font>")
 
   
 
    src.LinkTo(mprs)
 
    mprs.LinkTo(fcd)
 
    fcd.LinkTo(cnv)
 
    cnv.LinkTo(wenc)
 
    wenc.LinkTo(snk)
 
   
 
    pl.Play()
 
   
 
    Sleep 1
 
   
 
    While pl.Duration > pl.Position
 
      Write #File.Out, "\rDurata: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) &
 
                      "    Tempo trascorso: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
 
    Wend
 
   
 
    exit_C(0)
 
 
      
 
      
 +
  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>
 +
 
 +
  par = 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>")
 +
  enc = New MediaControl(pl, "<FONT color=#B22222>wavenc</font>")
 +
  snk = New MediaControl(pl, "<FONT color=#B22222>filesink</font>")
 +
  snk["location"] = "/tmp/midi.mid"            <FONT color=gray>' ''"location" è una proprietà del plugin "filesink"''</font>
 +
 
 +
  src.LinkTo(par)
 +
  par.LinkTo(fdc)
 +
  fdc.LinkTo(cnv)
 +
  cnv.LinkTo(enc)
 +
  enc.LinkTo(snk)
 +
 
 +
  pl.Play()
 +
 
 +
  While pl.Duration > pl.Position
 +
    Write "\rDurata: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) &
 +
          "    Tempo trascorso: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
 +
  Wend
 +
 
 +
  pl.Stop()
 +
  pl.Close()   
 +
 
  '''End'''
 
  '''End'''
 +
 +
 +
 +
 +
=Riferimenti=
 +
* https://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/random/uraeus/gstreamer_and_midi.txt

Versione delle 07:41, 1 lug 2017

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, cnv, enc, snk As MediaControl
  
  pl = New MediaPipeline 
   
  src = New MediaControl(pl, "filesrc")
  src["location"] = "/percorso/del/file.mid"   ' "location" è una proprietà del plugin "filesrc"
  
  par = New MediaControl(pl, "midiparse")
  fdc = New MediaControl(pl, "fluiddec")
  cnv = New MediaControl(pl, "audioconvert")
  enc = New MediaControl(pl, "wavenc")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = "/tmp/midi.mid"            ' "location" è una proprietà del plugin "filesink"
  
  src.LinkTo(par)
  par.LinkTo(fdc)
  fdc.LinkTo(cnv)
  cnv.LinkTo(enc)
  enc.LinkTo(snk)
  
  pl.Play()
  
  While pl.Duration > pl.Position
    Write "\rDurata: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) &
          "    Tempo trascorso: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
  Wend
  
  pl.Stop()
  pl.Close()    

End



Riferimenti