Differenze tra le versioni di "Ottenere un file audio da un file MIDI mediante il Componente gb.media"
Da Gambas-it.org - Wikipedia.
Riga 47: | Riga 47: | ||
pl.Play() | pl.Play() | ||
− | Print "Durata del file Midi: "; | + | Print "Durata del file Midi: "; Time(0, 0, 0, pl.Duration * 1000) |
Repeat | Repeat | ||
− | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & | + | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Time(0, 0, 0, pl.Position * 1000) |
Flush #File.Out | Flush #File.Out | ||
Wait 0.01 | Wait 0.01 | ||
Riga 111: | Riga 111: | ||
pl.Play() | pl.Play() | ||
− | Print "Durata del file Midi: "; | + | Print "Durata del file Midi: "; Time(0, 0, 0, 0, 0, 0, pl.Duration * 1000) |
Repeat | Repeat | ||
− | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & | + | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Time(0, 0, 0, pl.Position * 1000) |
Flush #File.Out | Flush #File.Out | ||
Wait 0.01 | Wait 0.01 | ||
Riga 173: | Riga 173: | ||
pl.Play() | pl.Play() | ||
− | Print "Durata del file Midi: "; | + | Print "Durata del file Midi: "; Time(0, 0, 0, pl.Duration * 1000) |
Repeat | Repeat | ||
− | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & | + | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Time(0, 0, 0, pl.Position * 1000) |
Flush #File.Out | Flush #File.Out | ||
Wait 0.01 | Wait 0.01 | ||
Riga 196: | Riga 196: | ||
'''End''' | '''End''' | ||
− | |||
Versione delle 17:15, 11 giu 2021
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 "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") 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 PL_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