Differenze tra le versioni di "Ottenere un file audio da un file MIDI mediante il Componente gb.media"
Da Gambas-it.org - Wikipedia.
Riga 8: | Riga 8: | ||
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 bo As Boolean | ||
− | |||
Riga 14: | Riga 13: | ||
Dim fileaudio, datigrezzi As String | Dim fileaudio, datigrezzi As String | ||
+ | Dim pl As MediaPipeline | ||
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 | ||
Riga 64: | Riga 64: | ||
'''End''' | '''End''' | ||
− | '''Public''' Sub PLine_'''End'''() | + | '''Public''' Sub PLine_'''End'''() <FONT Color=gray>' ''Questo Evento viene sollevato, quando la conversione è terminata''</font> |
bo = True | bo = True | ||
Riga 73: | Riga 73: | ||
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 bo As Boolean | ||
− | |||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | + | ||
+ | Dim fileaudio, datigrezzi As String | ||
+ | Dim pl As MediaPipeline | ||
Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl | Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl | ||
− | + | ||
− | |||
filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | ||
− | + | ||
− | + | datigrezzi = Temp | |
− | 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>") | ||
− | src["location"] = filemidi | + | src["location"] = filemidi |
− | + | ||
par = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>") | par = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>") | ||
fdc = New MediaControl(pl, "<FONT color=#B22222>fluiddec</font>") | fdc = New MediaControl(pl, "<FONT color=#B22222>fluiddec</font>") | ||
Riga 98: | Riga 99: | ||
mux = New MediaControl(pl, "<FONT color=#B22222>oggmux</font>") | mux = New MediaControl(pl, "<FONT color=#B22222>oggmux</font>") | ||
snk = New MediaControl(pl, "<FONT color=#B22222>filesink</font>") | snk = New MediaControl(pl, "<FONT color=#B22222>filesink</font>") | ||
− | snk["location"] = | + | snk["location"] = datigrezzi |
− | + | ||
src.LinkTo(par) | src.LinkTo(par) | ||
par.LinkTo(fdc) | par.LinkTo(fdc) | ||
Riga 107: | Riga 108: | ||
vor.LinkTo(mux) | vor.LinkTo(mux) | ||
mux.LinkTo(snk) | mux.LinkTo(snk) | ||
− | + | ||
pl.Play() | pl.Play() | ||
− | + | ||
Print "Durata del file Midi: "; Time(0, 0, 0, 0, 0, 0, pl.Duration * 1000) | Print "Durata del file Midi: "; Time(0, 0, 0, 0, 0, 0, pl.Duration * 1000) | ||
Repeat | Repeat | ||
Riga 121: | Riga 122: | ||
pl.Close | pl.Close | ||
− | + | Print "\n\e[0mConversione terminata !" | |
− | |||
Quit | Quit | ||
Riga 128: | Riga 128: | ||
− | '''Public''' Sub | + | '''Public''' Sub PLine_End() |
bo = True | bo = True | ||
Riga 137: | Riga 137: | ||
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 bo As Boolean | ||
− | |||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | + | ||
+ | Dim fileaudio, datigrezzi As String | ||
+ | Dim pl As MediaPipeline | ||
Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl | Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl | ||
− | + | ||
− | |||
filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | ||
− | + | ||
+ | datigrezzi = Temp | ||
− | |||
− | |||
src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | ||
− | src["location"] = filemidi | + | src["location"] = filemidi |
par = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>") | par = New MediaControl(pl, "<FONT color=#B22222>midiparse</font>") | ||
Riga 161: | Riga 160: | ||
lam = New MediaControl(pl, "<FONT color=#B22222>lamemp3enc</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"] = | + | snk["location"] = datigrezzi |
− | + | ||
src.LinkTo(par) | src.LinkTo(par) | ||
par.LinkTo(fdc) | par.LinkTo(fdc) | ||
Riga 169: | Riga 168: | ||
cnv.LinkTo(lam) | cnv.LinkTo(lam) | ||
lam.LinkTo(snk) | lam.LinkTo(snk) | ||
− | + | ||
pl.Play() | pl.Play() | ||
Riga 183: | Riga 182: | ||
pl.Close | pl.Close | ||
− | + | Print "\n\e[0mConversione terminata !" | |
− | |||
Quit | Quit | ||
'''End''' | '''End''' | ||
− | + | '''Public''' Sub PLine_End() | |
− | '''Public''' Sub | ||
bo = True | bo = True | ||
Riga 199: | Riga 196: | ||
=Riferimenti= | =Riferimenti= | ||
− | * https:// | + | * https://github.com/Xilinx/gstreamer/blob/master/docs/random/uraeus/gstreamer_and_midi.txt |
Versione delle 16:29, 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 Public Sub Main() Dim fileaudio, datigrezzi As String Dim pl As MediaPipeline Dim src, par, fdc, res, cnv, vol, enc, snk As MediaControl Dim flt As MediaFilter filemidi = "/percorso/del/file.mid" datigrezzi = Temp pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = filemidi 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,format=S16LE,rate=44100,channels=2,depth=16") 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"] = datigrezzi 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 Print "\n\e[0mConversione terminata !" Quit End Public Sub PLine_End() ' Questo Evento viene sollevato, quando la conversione è terminata bo = True End
In quest'altro esempio si otterrà un file OGG-Vorbis da un file MIDI:
Private bo As Boolean Public Sub Main() Dim fileaudio, datigrezzi As String Dim pl As MediaPipeline Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl filemidi = "/percorso/del/file.mid" datigrezzi = Temp pl = New MediaPipeline As "PLine" src = New MediaControl(pl, "filesrc") src["location"] = filemidi 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"] = datigrezzi 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 Print "\n\e[0mConversione terminata !" Quit End Public Sub PLine_End() bo = True End
In questo terzo esempio si otterrà un file MP3 da un file MIDI:
Private bo As Boolean Public Sub Main() Dim fileaudio, datigrezzi As String Dim pl As MediaPipeline Dim src, par, fdc, res, cnv, vol, lam, snk As MediaControl filemidi = "/percorso/del/file.mid" datigrezzi = Temp src = New MediaControl(pl, "filesrc") src["location"] = filemidi 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"] = datigrezzi 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 Print "\n\e[0mConversione terminata !" Quit End Public Sub PLine_End() bo = True End