Differenze tra le versioni di "Ottenere un file audio da un file MIDI mediante il Componente gb.media"
Da Gambas-it.org - Wikipedia.
Riga 53: | Riga 53: | ||
Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" | Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" | ||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | In quest'altro esempio si otterrà un file OGG-Vorbis da un file MIDI: | ||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim pl As MediaPipeline | ||
+ | Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl | ||
+ | Dim filemidi, primofile As String | ||
+ | Dim i As Integer | ||
+ | |||
+ | filemidi = "<FONT color=gray>''/percorso/del/file.mid''</font>" | ||
+ | primofile = "/tmp/primofile" | ||
+ | |||
+ | pl = New MediaPipeline | ||
+ | |||
+ | src = New MediaControl(pl, "<FONT color=#B22222>filesrc</font>") | ||
+ | src["location"] = filemidi <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>") | ||
+ | res = New MediaControl(pl, "<FONT color=#B22222>audioresample</font>") | ||
+ | cnv = New MediaControl(pl, "<FONT color=#B22222>audioconvert</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> | ||
+ | vor = New MediaControl(pl, "<FONT color=#B22222>vorbisenc</font>") | ||
+ | mux = New MediaControl(pl, "<FONT color=#B22222>oggmux</font>") | ||
+ | snk = New MediaControl(pl, "<FONT color=#B22222>filesink</font>") | ||
+ | snk["location"] = primofile <FONT color=gray>' ''"location" è una proprietà del plugin "filesink"''</font> | ||
+ | |||
+ | src.LinkTo(par) | ||
+ | par.LinkTo(fdc) | ||
+ | fdc.LinkTo(res) | ||
+ | res.LinkTo(cnv) | ||
+ | cnv.LinkTo(vor) | ||
+ | vor.LinkTo(mux) | ||
+ | mux.LinkTo(snk) | ||
+ | |||
+ | pl.Play() | ||
+ | |||
+ | Print "\nDurata del file Midi: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) | ||
+ | Repeat | ||
+ | i = Stat(primofile).Size | ||
+ | Wait 0.3 | ||
+ | Write #File.Out, "\r\e[0mDati convertiti: \e[31m" & Stat(primofile).Size & " byte" | ||
+ | Flush #File.Out | ||
+ | Until i = Stat(primofile).Size | ||
+ | |||
+ | Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg" | ||
pl.Stop | pl.Stop | ||
pl.Close | pl.Close |
Versione delle 19:08, 10 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:
Public Sub Main() Dim pl As MediaPipeline Dim src, par, fdc, res, cnv, vol, enc, snk As MediaControl Dim flt As MediaFilter Dim filemidi, primofile As String Dim s As Single filemidi = "/percorso/del/file.mid" primofile = "/tmp/primofile" pl = New MediaPipeline 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 "\nDurata del file Midi: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Repeat s = ((Stat(primofile).Size / 8) / 44100) Write "\r\e[0mTempo convertito: \e[31m" & Date(0, 0, 0, 0, 0, 0, s * 1000) Sleep 0.01 Until Fix(s) >= Fix(pl.Duration) Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".wav" pl.Stop pl.Close End
In quest'altro esempio si otterrà un file OGG-Vorbis da un file MIDI:
Public Sub Main() Dim pl As MediaPipeline Dim src, par, fdc, res, cnv, vol, vor, mux, snk As MediaControl Dim filemidi, primofile As String Dim i As Integer filemidi = "/percorso/del/file.mid" primofile = "/tmp/primofile" pl = New MediaPipeline 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 "\nDurata del file Midi: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000) Repeat i = Stat(primofile).Size Wait 0.3 Write #File.Out, "\r\e[0mDati convertiti: \e[31m" & Stat(primofile).Size & " byte" Flush #File.Out Until i = Stat(primofile).Size Copy primofile To "/tmp" &/ File.BaseName(filemidi) & ".ogg" pl.Stop pl.Close End