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: | ||
+ | Private bo As Boolean | ||
+ | Private pl As MediaPipeline | ||
+ | |||
+ | |||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | |||
Dim src, par, fdc, res, cnv, vol, enc, snk As MediaControl | Dim src, par, fdc, res, cnv, vol, enc, snk As MediaControl | ||
Dim flt As MediaFilter | Dim flt As MediaFilter | ||
Dim filemidi, primofile As String | Dim filemidi, primofile As String | ||
− | |||
filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | ||
primofile = "/tmp/primofile" | primofile = "/tmp/primofile" | ||
− | pl = New MediaPipeline | + | pl = New MediaPipeline As "PL" |
src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | ||
Riga 45: | Riga 47: | ||
pl.Play() | pl.Play() | ||
− | Print " | + | Print "Durata del file Midi: "; Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) |
Repeat | Repeat | ||
− | + | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) | |
− | + | Flush #File.Out | |
− | + | Wait 0.01 | |
− | Until | + | Until bo = True |
− | + | ||
Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" | Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
+ | Write #File.Out, "\n\e[0mEsecuzione terminata !" | ||
+ | Flush #File.Out | ||
+ | Quit | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Public''' Sub PL_End() | ||
+ | |||
+ | bo = True | ||
+ | |||
'''End''' | '''End''' | ||
In quest'altro esempio si otterrà un file OGG-Vorbis da un file MIDI: | 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() | '''Public''' Sub Main() | ||
− | |||
Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl | Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl | ||
Dim filemidi, primofile As String | Dim filemidi, primofile As String | ||
− | |||
filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | ||
primofile = "/tmp/primofile" | primofile = "/tmp/primofile" | ||
− | pl = New MediaPipeline | + | pl = New MediaPipeline As "PL" |
src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | ||
Riga 96: | Riga 111: | ||
pl.Play() | pl.Play() | ||
− | Print " | + | Print "Durata del file Midi: "; Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) |
Repeat | Repeat | ||
− | + | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) | |
− | |||
− | Write #File.Out, "\r\e[ | ||
Flush #File.Out | Flush #File.Out | ||
− | Until | + | Wait 0.01 |
− | + | Until bo = True | |
+ | |||
Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg" | Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg" | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
+ | Write #File.Out, "\n\e[0mEsecuzione terminata !" | ||
+ | Flush #File.Out | ||
+ | Quit | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Public''' Sub PL_End() | ||
+ | |||
+ | bo = True | ||
+ | |||
'''End''' | '''End''' | ||
In questo terzo esempio si otterrà un file MP3 da un file MIDI: | In questo terzo esempio si otterrà un file MP3 da un file MIDI: | ||
+ | Private bo As Boolean | ||
+ | Private pl As MediaPipeline | ||
+ | |||
+ | |||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | |||
Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl | Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl | ||
Dim filemidi, primofile As String | Dim filemidi, primofile As String | ||
− | |||
filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | ||
primofile = "/tmp/primofile" | primofile = "/tmp/primofile" | ||
− | pl = New MediaPipeline | + | pl = New MediaPipeline As "PL" |
src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | ||
Riga 133: | Riga 160: | ||
vol = New MediaControl(pl, "<FONT color=#B22222>volume</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> | vol["volume"] = 4.0 <FONT color=gray>' ''"volume" è una proprietà dell'omonimo plugin "volume"''</font> | ||
− | + | lam = New MediaControl(pl, "<FONT color=#B22222>lamemp3enc</font>") | |
snk = New MediaControl(pl, "<FONT color=#B22222>filesink</font>") | snk = New MediaControl(pl, "<FONT color=#B22222>filesink</font>") | ||
snk["location"] = primofile <FONT color=gray>' ''"location" è una proprietà del plugin "filesink"''</font> | snk["location"] = primofile <FONT color=gray>' ''"location" è una proprietà del plugin "filesink"''</font> | ||
Riga 145: | Riga 172: | ||
pl.Play() | pl.Play() | ||
− | + | ||
− | Print " | + | Print "Durata del file Midi: "; Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) |
Repeat | Repeat | ||
− | + | Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000) | |
− | |||
− | Write #File.Out, "\r\e[ | ||
Flush #File.Out | Flush #File.Out | ||
− | Until | + | Wait 0.01 |
+ | Until bo = True | ||
Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".mp3" | Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".mp3" | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close | ||
+ | |||
+ | Write #File.Out, "\n\e[0mEsecuzione terminata !" | ||
+ | Flush #File.Out | ||
+ | Quit | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Public''' Sub PL_End() | ||
+ | |||
+ | bo = True | ||
'''End''' | '''End''' |
Versione delle 03:37, 12 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:
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: "; Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Repeat Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Date(0, 0, 0, 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: "; Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Repeat Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Date(0, 0, 0, 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: "; Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Repeat Write #File.Out, "\r\e[0mTempo convertito: \e[31m" & Date(0, 0, 0, 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