Differenze tra le versioni di "Ottenere un file audio da un file MIDI mediante il Componente gb.media"
Da Gambas-it.org - Wikipedia.
Riga 20: | Riga 20: | ||
primofile = "/tmp/primofile" | primofile = "/tmp/primofile" | ||
− | pl = New MediaPipeline As " | + | pl = New MediaPipeline As "PLine" |
src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | ||
Riga 52: | Riga 52: | ||
Flush #File.Out | Flush #File.Out | ||
Wait 0.01 | Wait 0.01 | ||
− | Until bo = True | + | Until bo == True |
Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" | Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" | ||
Riga 64: | Riga 64: | ||
'''End''' | '''End''' | ||
− | + | '''Public''' Sub PLine_'''End'''() | |
− | '''Public''' Sub | ||
bo = True | bo = True |
Versione delle 15:05, 15 set 2022
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:
Private bo As Boolean Private pl As MediaPipeline Public Sub Main() Dim src, par, fdc, res, cnv, vol, enc, snk As MediaControl Dim flt As MediaFilter Dim filemidi, primofile As String filemidi = "/percorso/del/file.mid" primofile = "/tmp/primofile" pl = New MediaPipeline As "PLine" 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 "Durata del file Midi: "; Time(0, 0, 0, pl.Duration * 1000) Repeat Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Time(0, 0, 0, pl.Position * 1000) Flush #File.Out Wait 0.01 Until bo == True Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" pl.Stop pl.Close Write #File.Out, "\n\e[0mEsecuzione terminata !" Flush #File.Out Quit End Public Sub PLine_End() bo = True End
In quest'altro esempio si otterrà un file OGG-Vorbis da un file MIDI:
Private bo As Boolean Private pl As MediaPipeline Public Sub Main() Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl Dim filemidi, primofile As String filemidi = "/percorso/del/file.mid" primofile = "/tmp/primofile" pl = New MediaPipeline As "PL" 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 "Durata del file Midi: "; Time(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Repeat Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Time(0, 0, 0, pl.Position * 1000) Flush #File.Out Wait 0.01 Until bo = True Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg" pl.Stop pl.Close Write #File.Out, "\n\e[0mEsecuzione terminata !" Flush #File.Out Quit End Public Sub PL_End() bo = True End
In questo terzo esempio si otterrà un file MP3 da un file MIDI:
Private bo As Boolean Private pl As MediaPipeline Public Sub Main() Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl Dim filemidi, primofile As String filemidi = "/percorso/del/file.mid" primofile = "/tmp/primofile" pl = New MediaPipeline As "PL" 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" lam = 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 "Durata del file Midi: "; Time(0, 0, 0, pl.Duration * 1000) Repeat Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Time(0, 0, 0, pl.Position * 1000) Flush #File.Out Wait 0.01 Until bo = True Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".mp3" pl.Stop pl.Close Write #File.Out, "\n\e[0mEsecuzione terminata !" Flush #File.Out Quit End Public Sub PL_End() bo = True End