Differenze tra le versioni di "Ottenere con il Componente gb.media un file audio dai dati Midi grezzi intercettati da un dispositivo Midi esterno"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "E' possibile intercettare i dati Midi grezzi inviati da un dispositivo Midi esterno (ad esempio una tastiera Midi) usando le risorse delle Classi "''MediaPipeline''" e "''Medi...")
 
 
(15 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
E' possibile intercettare i dati Midi grezzi inviati da un dispositivo Midi esterno (ad esempio una tastiera Midi) usando le risorse delle Classi "''MediaPipeline''" e "''MediaControl''" del Componente ''gb.media'', <SUP>&#091;[[Note|Nota 1]]&#091;</sup> e successivamente generare un file audio.
+
E' possibile intercettare i dati Midi grezzi inviati da un dispositivo Midi esterno (ad esempio una tastiera Midi) usando le risorse delle Classi "''MediaPipeline''" e "''MediaControl''" del Componente ''gb.media'', <SUP>&#091;[[#Note|Nota 1]]&#093;</sup> e successivamente generare con essi un file audio.
  
Sarà necessario assegnare alla proprietà "''ports''" dell'elemento "''fluiddec''" il numero identificativo, quale Client ALSA, e il numero della porta del dispotivo Midi esterno che invia i dati Midi grezzi.
+
Va detto preliminarmente che si è riscontrato che il tempo metronomico del brano registrato nel file audio risulta essere - incomprensibilmente - più lento rispetto all'esecuzione originale fatta con il dispositivo Midi esterno.
  
 +
Sarà necessario assegnare alla proprietà "''ports''" dell'elemento "''fluiddec''" il numero identificativo (quale Client di ALSA) e il numero della porta del dispotivo Midi esterno che invia i dati Midi grezzi. Non v'è bisogno ovviamente di effettuare alcuna connessione mediante il comando "''aconnect''" di AlSA fra i Client ALSA interessati.
  
Mostriamo un semplice esempio pratico, nel quale si genererà un file audio WAV:
+
Per garantire la sincronicità fra quanto eseguito e dati salvati, evitando così ogni eventuale ritardo di memorizzazione/riproduzione audio nel file finale, è necessario impostare a "true", cioè al valore intero 1, la proprietà "''sync''" dell'elemento "''filesink''".
  '''Public''' Sub Main()
+
 
 +
 
 +
===Generare un file audio WAV dai dati Midi grezzi registrati===
 +
Mostriamo un semplice esempio pratico, nel quale si genererà un file audio WAV dai dati Midi grezzi intercettati da un dispositivo Midi esterno:
 +
  Public Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim src, flu, res, con, enc, snk As MediaControl  
+
   Dim src, flu, con, enc, snk As MediaControl  
 
   Dim flt As MediaFilter
 
   Dim flt As MediaFilter
   Dim porta, primofile, s As String
+
   Dim porta, s As String
 +
 +
<FONT Color=gray>' ''Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :''</font>
 +
  porta = "24:0"
 +
 
 +
  pl = New MediaPipeline
 
    
 
    
  primofile = "/tmp/primofile"
+
  src = New MediaControl(pl, "alsamidisrc")
 +
  <FONT Color=#B22222>src["ports"]</font> = porta
 +
  flu = New MediaControl(pl, "fluiddec")
 +
  flu["synth-gain"] = 0.5
 +
  con = New MediaControl(pl, "audioconvert")
 +
  flt = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 +
  enc = New MediaControl(pl, "<FONT Color=#B22222>wavenc</font>")
 +
  snk = New MediaControl(pl, "filesink")
 +
  snk["location"] = "/tmp/audio.wav"
 +
  <FONT Color=#B22222>snk["sync"] = True</font>
 
    
 
    
  <FONT Color=gray>' ''Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :''</font>
+
  src.LinkTo(flu)
  porta = "24:0"
+
  flu.LinkTo(con)
 +
  con.LinkTo(flt)
 +
  flt.LinkTo(enc)
 +
  enc.LinkTo(snk)
 +
 
 +
  pl.play()
 +
 
 +
  <FONT color=gray>' ''Utilizziamo la funzione "Input" per consentire il processo di conversione.''
 +
' ''L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."''</font>
 +
  Input s
 
    
 
    
  pl = New MediaPipeline
+
  pl.Stop
 +
  pl.Close
 +
  Print "Termine programma !"
 
    
 
    
  src = New MediaControl(pl, "alsamidisrc")
+
End
  <FONT Color=#B22222>src["ports"]</font> = porta
+
 
  flu = New MediaControl(pl, "fluiddec")
+
 
  flu["synth-gain"] = 0.5
+
===Generare un file audio MP3 dai dati Midi grezzi registrati===
  res = New MediaControl(pl, "audioresample")
+
Mostriamo un semplice esempio pratico, nel quale si genererà un file audio MP3 dai dati Midi grezzi intercettati da un dispositivo Midi esterno:
  con = New MediaControl(pl, "audioconvert")
+
Public Sub Main()
  flt = New MediaFilter(pl, "audio/x-raw,channels=2")
+
 
  enc = New MediaControl(pl, "wavenc")
+
  Dim pl As MediaPipeline
  snk = New MediaControl(pl, "filesink")
+
  Dim src, flu, con, enc, snk As MediaControl  
  snk["location"] = primofile
+
  Dim flt As MediaFilter
 +
  Dim porta, s As String
 
    
 
    
  src.LinkTo(flu)
+
<FONT Color=gray>' ''Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :''</font>
  flu.LinkTo(res)
+
  porta = "24:0"
  res.LinkTo(con)
+
 
  con.LinkTo(flt)
+
  pl = New MediaPipeline
  flt.LinkTo(enc)
+
 
  enc.LinkTo(snk)
+
  src = New MediaControl(pl, "alsamidisrc")
 +
  <FONT Color=#B22222>src["ports"]</font> = porta
 +
  flu = New MediaControl(pl, "fluiddec")
 +
  flu["synth-gain"] = 0.5
 +
  res = New MediaControl(pl, "audioresample")
 +
  con = New MediaControl(pl, "audioconvert")
 +
  flt = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 +
  enc = New MediaControl(pl, "<FONT Color=#B22222>lamemp3enc</font>")
 +
  snk = New MediaControl(pl, "filesink")
 +
  snk["location"] = "/tmp/audio.mp3"
 +
  <FONT Color=#B22222>snk["sync"] = True</font>
 +
 
 +
  src.LinkTo(flu)
 +
  flu.LinkTo(con)
 +
  con.LinkTo(flt)
 +
  flt.LinkTo(enc)
 +
  enc.LinkTo(snk)
 +
 
 +
  pl.play()
 +
 
 +
<FONT color=gray>' ''Utilizziamo la funzione "Input" per consentire il processo di conversione.''
 +
' ''L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."''</font>
 +
  Input s
 +
 +
  pl.Stop
 +
  pl.Close
 +
  Print "Termine programma !"
 +
 +
End
 +
 
 +
 
 +
===Generare un file audio OGG-Vorbis dai dati Midi grezzi registrati===
 +
Mostriamo un semplice esempio pratico, nel quale si genererà un file audio OGG-Vorbis dai dati Midi grezzi intercettati da un dispositivo Midi esterno:
 +
Public Sub Main()
 +
 
 +
  Dim pl As MediaPipeline
 +
  Dim src, flu, con, enc, mux, snk As MediaControl
 +
  Dim flt As MediaFilter
 +
  Dim porta, s As String
 +
 +
<FONT Color=gray>' ''Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :''</font>
 +
  porta = "24:0"
 
    
 
    
  pl.play()
+
  pl = New MediaPipeline
 +
 
 +
  src = New MediaControl(pl, "alsamidisrc")
 +
  <FONT Color=#B22222>src["ports"]</font> = porta
 +
  flu = New MediaControl(pl, "fluiddec")
 +
  flu["synth-gain"] = 0.5
 +
  con = New MediaControl(pl, "audioconvert")
 +
  flt = New MediaFilter(pl, "audio/x-raw,channels=2")
 +
  enc = New MediaControl(pl, "<FONT Color=#B22222>vorbisenc</font>")
 +
  mux = New MediaControl(pl, "<FONT Color=#B22222>oggmux</font>")
 +
  snk = New MediaControl(pl, "filesink")
 +
  snk["location"] = "/tmp/audio.ogg"
 +
  <FONT Color=#B22222>snk["sync"] = True</font>
 +
 +
  src.LinkTo(flu)
 +
  flu.LinkTo(con)
 +
  con.LinkTo(flt)
 +
  flt.LinkTo(enc)
 +
  enc.LinkTo(mux)
 +
  mux.LinkTo(snk)
 +
 +
  pl.play()
 +
 +
<FONT color=gray>' ''Utilizziamo la funzione "Input" per consentire il processo di conversione.''
 +
' ''L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."''</font>
 +
  Input s
 +
 +
  pl.Stop
 +
  pl.Close
 +
  Print "Termine programma !"
 +
 +
End
 +
 
 +
 
 +
===Generare un file audio AAC dai dati Midi grezzi registrati===
 +
Mostriamo un semplice esempio pratico, nel quale si genererà un file audio AAC dai dati Midi grezzi intercettati da un dispositivo Midi esterno:
 +
Private bo As Boolean
 +
 +
 +
Public Sub Main()
 +
 
 +
  Dim pl As MediaPipeline
 +
  Dim src, flu, con, faa, snk As MediaControl
 +
  Dim flt1, flt2 As MediaFilter
 +
  Dim porta, s As String
 +
 +
<FONT Color=gray>' ''Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :''</font>
 +
  porta = "24:0"
 
    
 
    
<FONT Color=gray>' ''Consente di tenere funzionante il programma. Basterà premere "Invio" per terminare.''</font>
+
  pl = New MediaPipeline
  Input s
+
 
 +
  src = New MediaControl(pl, "alsamidisrc")
 +
  <FONT Color=#B22222>src["ports"]</font> = porta
 +
  flu = New MediaControl(pl, "fluiddec")
 +
  flu["synth-gain"] = 0.5
 +
  con = New MediaControl(pl, "audioconvert")
 +
  flt1 = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2,format=S16LE,depth=16")
 +
  faa = New MediaControl(pl, "<FONT Color=#B22222>faac</font>")
 +
  flt2 = New MediaFilter(pl, "audio/mpeg,stream-format=adts,channels=2,rate=44100")
 +
  snk = New MediaControl(pl, "filesink")
 +
  snk["location"] = "/tmp/audio.aac"
 +
  <FONT Color=#B22222>snk["sync"] = True</font>
 
    
 
    
  Copy primofile To "/tmp/audio.wav"
+
  src.LinkTo(flu)
  pl.Stop
+
  flu.LinkTo(con)
  pl.Close
+
  con.LinkTo(flt)
  Print "Termine programma !"
+
  flt1.LinkTo(faa)
 +
  faa.LinkTo(flt2)
 +
  flt2.LinkTo(snk)
 +
 +
  pl.play()
 +
 +
  While Not bo
 +
    Write "\rTempo Trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
 +
    Wait 0.01
 +
  Wend
 +
 +
  pl.Stop
 +
  pl.Close
 +
  Print "Termine programma !"
 +
 +
End
 +
 +
 +
Public Sub Application_Read()  <FONT color=gray>' ''Questo Evento viene sollevato, quando si preme sul tasto "Invio" della tastiera''</font>
 +
 +
  bo = True
 +
 +
End
 +
 
 +
 
 +
===Ascoltare quanto eseguito con il dispositivo Midi esterno e generare in fine un file audio===
 +
Negli esempi visti in precedenza l'invio dei dati Midi attraverso il dispositivo Midi esterno non consente via risorse del Componente ''gb.media'' di ascoltare contestualmente i suoni.
 +
 
 +
Per ottenere questo risultato si potrà adottare un codice come il seguente:
 +
Public Sub Main()
 +
 
 +
  Dim pl As MediaPipeline
 +
  Dim src, tee, que, flu, con1, snk1 As MediaControl
 +
  Dim con2, enc2, snk2 As MediaControl
 +
  Dim flt2 As MediaFilter
 +
  Dim porta, s As String
 +
 +
<FONT Color=gray>' ''Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0):''</font>
 +
  porta = "24:0"
 +
 +
  pl = New MediaPipeline
 +
 
 +
<FONT Color=gray>' ''Parte comune:''</font>
 +
  src = New MediaControl(pl, "alsamidisrc")
 +
  src["ports"] = porta
 +
  flu = New MediaControl(pl, "fluiddec")
 +
  flu["synth-gain"] = 1.0
 +
 +
<FONT Color=gray>' ''Parte relativa alla duplicazione dei dati:''</font>
 +
  tee = New MediaControl(pl, "tee")
 +
  que = New MediaControl(pl, "queue")
 
    
 
    
  '''End'''
+
  <FONT Color=gray>' ''Parte ascolto in tempo reale dell'esecuzione Midi:''</font>
 +
  con1 = New MediaControl(pl, "audioconvert")
 +
  snk1 = New MediaControl(pl, "autoaudiosink")
 +
  src.LinkTo(flu)
 +
  flu.LinkTo(tee)
 +
  tee.LinkTo(que)
 +
  que.LinkTo(con1)
 +
  con1.LinkTo(snk1)
 +
 +
<FONT Color=gray>' ''Parte memorizzazione dei dati su file audio wav:''</font>
 +
  con2 = New MediaControl(pl, "audioconvert")
 +
  flt2 = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 +
  enc2 = New MediaControl(pl, "wavenc")
 +
  snk2 = New MediaControl(pl, "filesink")
 +
  snk2["location"] = "/tmp/audio.wav"
 +
  <FONT Color=#B22222>snk2["sync"] = True</font>
 +
  tee.LinkTo(con2)
 +
  con2.LinkTo(flt2)
 +
  flt2.LinkTo(enc2)
 +
  enc2.LinkTo(snk2)
 +
 +
  pl.play()
 +
 +
<FONT color=gray>' ''Utilizziamo la funzione "Input" per consentire il processo di conversione.''
 +
' ''L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."''</font>
 +
  Input s
 +
 +
  pl.Stop
 +
  pl.Close
 +
  Print "Termine programma !"
 +
 
 +
End
 +
 
  
 +
===Ascoltare quanto eseguito con il dispositivo Midi esterno, mostrare un Monoscopio e generare in fine un file audio===
 +
Riprendendo il precednete codice, vi aggiungeremo l'effetto video del plug-in ''Monoscope'' di Gstreamer, che mostra appunto in una finestra un Monoscopio:
 +
Public Sub Main()
 +
 
 +
  Dim pl As MediaPipeline
 +
  Dim src, tee, que, flu, con1, snk1 As MediaControl
 +
  Dim con2, sco2, vid2, snk2 As MediaControl
 +
  Dim que3, con3, enc3, snk3 As MediaControl
 +
  Dim flt3 As MediaFilter
 +
  Dim porta, s As String
 +
 +
<FONT Color=gray>' ''Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0):''</font>
 +
  porta = "24:0"
 +
 
 +
  pl = New MediaPipeline
 +
 
 +
<FONT Color=gray>' ''Parte comune:''</font>
 +
  src = New MediaControl(pl, "alsamidisrc")
 +
  src["ports"] = porta
 +
  flu = New MediaControl(pl, "fluiddec")
 +
  flu["synth-gain"] = 0.5
 +
 +
<FONT Color=gray>' ''Parte relativa alla duplicazione dei dati:''</font>
 +
  tee = New MediaControl(pl, "tee")
 +
  que = New MediaControl(pl, "queue")
 +
 
 +
<FONT Color=gray>' ''Parte ascolto in tempo reale dell'esecuzione Midi:''</font>
 +
  con1 = New MediaControl(pl, "audioconvert")
 +
  snk1 = New MediaControl(pl, "autoaudiosink")
 +
  src.LinkTo(flu)
 +
  flu.LinkTo(tee)
 +
  tee.LinkTo(que)
 +
  que.LinkTo(con1)
 +
  con1.LinkTo(snk1)
 +
 
 +
<FONT Color=gray>' ''Parte per mostrare il "Monoscopio":''</font>
 +
  con2 = New MediaControl(pl, "audioconvert")
 +
  sco2 = New MediaControl(pl, "<FONT Color=#B22222>monoscope</font>")
 +
  vid2 = New MediaControl(pl, "videoconvert")
 +
  snk2 = New MediaControl(pl, "autovideosink")
 +
  tee.LinkTo(con2)
 +
  con2.LinkTo(sco2)
 +
  sco2.LinkTo(vid2)
 +
  vid2.LinkTo(snk2)
 +
 
 +
<FONT Color=gray>' ''Parte memorizzazione dei dati su file audio wav:''</font>
 +
  que3 = New MediaControl(pl, "queue")
 +
  con3 = New MediaControl(pl, "audioconvert")
 +
  flt3 = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 +
  enc3 = New MediaControl(pl, "wavenc")
 +
  snk3 = New MediaControl(pl, "filesink")
 +
  snk3["location"] = "/tmp/audio.wav"
 +
  <FONT Color=#B22222>snk2["sync"] = True</font>
 +
  tee.LinkTo(que3)
 +
  que3.LinkTo(con3)
 +
  con3.LinkTo(flt3)
 +
  flt3.LinkTo(enc3)
 +
  enc3.LinkTo(snk3)
 +
 
 +
  pl.play()
 +
 +
<FONT color=gray>' ''Utilizziamo la funzione "Input" per consentire il processo di conversione.''
 +
' ''L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."''</font>
 +
  Input s
 +
 +
  pl.Stop
 +
  pl.Close
 +
  Print "Termine programma !"
 +
 +
End
  
  
  
 
=Note=
 
=Note=
[1] Vedi anche la pagina: [[Intercettare_dati_Midi_grezzi_da_un_dispositivo_Midi_esterno_mediante_il_Componente_gb.media|Intercettare dati Midi grezzi da un dispositivo Midi esterno mediante il Componente gb.media]]
+
[1] Vedi anche la pagina: [[Intercettare dati Midi grezzi da un dispositivo Midi esterno mediante il Componente gb.media]]
 
 
  
  

Versione attuale delle 19:53, 17 gen 2024

E' possibile intercettare i dati Midi grezzi inviati da un dispositivo Midi esterno (ad esempio una tastiera Midi) usando le risorse delle Classi "MediaPipeline" e "MediaControl" del Componente gb.media, [Nota 1] e successivamente generare con essi un file audio.

Va detto preliminarmente che si è riscontrato che il tempo metronomico del brano registrato nel file audio risulta essere - incomprensibilmente - più lento rispetto all'esecuzione originale fatta con il dispositivo Midi esterno.

Sarà necessario assegnare alla proprietà "ports" dell'elemento "fluiddec" il numero identificativo (quale Client di ALSA) e il numero della porta del dispotivo Midi esterno che invia i dati Midi grezzi. Non v'è bisogno ovviamente di effettuare alcuna connessione mediante il comando "aconnect" di AlSA fra i Client ALSA interessati.

Per garantire la sincronicità fra quanto eseguito e dati salvati, evitando così ogni eventuale ritardo di memorizzazione/riproduzione audio nel file finale, è necessario impostare a "true", cioè al valore intero 1, la proprietà "sync" dell'elemento "filesink".


Generare un file audio WAV dai dati Midi grezzi registrati

Mostriamo un semplice esempio pratico, nel quale si genererà un file audio WAV dai dati Midi grezzi intercettati da un dispositivo Midi esterno:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, flu, con, enc, snk As MediaControl 
 Dim flt As MediaFilter
 Dim porta, s As String

' Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :
 porta = "24:0"
  
 pl = New MediaPipeline
 
 src = New MediaControl(pl, "alsamidisrc")
 src["ports"] = porta 
 flu = New MediaControl(pl, "fluiddec")
 flu["synth-gain"] = 0.5
 con = New MediaControl(pl, "audioconvert")
 flt = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 enc = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/audio.wav"
 snk["sync"] = True
  
 src.LinkTo(flu)
 flu.LinkTo(con)
 con.LinkTo(flt)
 flt.LinkTo(enc)
 enc.LinkTo(snk)
 
 pl.play()
 
' Utilizziamo la funzione "Input" per consentire il processo di conversione.
' L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."
 Input s
  
 pl.Stop
 pl.Close
 Print "Termine programma !"
  
End


Generare un file audio MP3 dai dati Midi grezzi registrati

Mostriamo un semplice esempio pratico, nel quale si genererà un file audio MP3 dai dati Midi grezzi intercettati da un dispositivo Midi esterno:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, flu, con, enc, snk As MediaControl 
 Dim flt As MediaFilter
 Dim porta, s As String
  
' Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :
 porta = "24:0"
 
 pl = New MediaPipeline
 
 src = New MediaControl(pl, "alsamidisrc")
 src["ports"] = porta 
 flu = New MediaControl(pl, "fluiddec")
 flu["synth-gain"] = 0.5
 res = New MediaControl(pl, "audioresample")
 con = New MediaControl(pl, "audioconvert")
 flt = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 enc = New MediaControl(pl, "lamemp3enc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/audio.mp3"
 snk["sync"] = True
 
 src.LinkTo(flu)
 flu.LinkTo(con)
 con.LinkTo(flt)
 flt.LinkTo(enc)
 enc.LinkTo(snk)
 
 pl.play()
 
' Utilizziamo la funzione "Input" per consentire il processo di conversione.
' L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."
 Input s

 pl.Stop
 pl.Close
 Print "Termine programma !"

End


Generare un file audio OGG-Vorbis dai dati Midi grezzi registrati

Mostriamo un semplice esempio pratico, nel quale si genererà un file audio OGG-Vorbis dai dati Midi grezzi intercettati da un dispositivo Midi esterno:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, flu, con, enc, mux, snk As MediaControl 
 Dim flt As MediaFilter
 Dim porta, s As String

' Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :
 porta = "24:0"
  
 pl = New MediaPipeline
 
 src = New MediaControl(pl, "alsamidisrc")
 src["ports"] = porta 
 flu = New MediaControl(pl, "fluiddec")
 flu["synth-gain"] = 0.5
 con = New MediaControl(pl, "audioconvert")
 flt = New MediaFilter(pl, "audio/x-raw,channels=2")
 enc = New MediaControl(pl, "vorbisenc")
 mux = New MediaControl(pl, "oggmux")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/audio.ogg"
 snk["sync"] = True

 src.LinkTo(flu)
 flu.LinkTo(con)
 con.LinkTo(flt)
 flt.LinkTo(enc)
 enc.LinkTo(mux)
 mux.LinkTo(snk)

 pl.play()

' Utilizziamo la funzione "Input" per consentire il processo di conversione.
' L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."
 Input s

 pl.Stop
 pl.Close
 Print "Termine programma !"

End


Generare un file audio AAC dai dati Midi grezzi registrati

Mostriamo un semplice esempio pratico, nel quale si genererà un file audio AAC dai dati Midi grezzi intercettati da un dispositivo Midi esterno:

Private bo As Boolean


Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, flu, con, faa, snk As MediaControl 
 Dim flt1, flt2 As MediaFilter
 Dim porta, s As String

' Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0) :
 porta = "24:0"
  
 pl = New MediaPipeline
 
 src = New MediaControl(pl, "alsamidisrc")
 src["ports"] = porta 
 flu = New MediaControl(pl, "fluiddec")
 flu["synth-gain"] = 0.5
 con = New MediaControl(pl, "audioconvert")
 flt1 = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2,format=S16LE,depth=16")
 faa = New MediaControl(pl, "faac")
 flt2 = New MediaFilter(pl, "audio/mpeg,stream-format=adts,channels=2,rate=44100")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/audio.aac"
 snk["sync"] = True
  
 src.LinkTo(flu)
 flu.LinkTo(con)
 con.LinkTo(flt)
 flt1.LinkTo(faa)
 faa.LinkTo(flt2)
 flt2.LinkTo(snk)

 pl.play()

 While Not bo
   Write "\rTempo Trascorso: " & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Wend

 pl.Stop
 pl.Close
 Print "Termine programma !"

End


Public Sub Application_Read()  ' Questo Evento viene sollevato, quando si preme sul tasto "Invio" della tastiera

 bo = True

End


Ascoltare quanto eseguito con il dispositivo Midi esterno e generare in fine un file audio

Negli esempi visti in precedenza l'invio dei dati Midi attraverso il dispositivo Midi esterno non consente via risorse del Componente gb.media di ascoltare contestualmente i suoni.

Per ottenere questo risultato si potrà adottare un codice come il seguente:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, tee, que, flu, con1, snk1 As MediaControl 
 Dim con2, enc2, snk2 As MediaControl
 Dim flt2 As MediaFilter
 Dim porta, s As String

' Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0):
 porta = "24:0"

 pl = New MediaPipeline
 
' Parte comune:
 src = New MediaControl(pl, "alsamidisrc")
 src["ports"] = porta
 flu = New MediaControl(pl, "fluiddec")
 flu["synth-gain"] = 1.0

' Parte relativa alla duplicazione dei dati:
 tee = New MediaControl(pl, "tee")
 que = New MediaControl(pl, "queue")
  
' Parte ascolto in tempo reale dell'esecuzione Midi:
 con1 = New MediaControl(pl, "audioconvert")
 snk1 = New MediaControl(pl, "autoaudiosink")
 src.LinkTo(flu)
 flu.LinkTo(tee)
 tee.LinkTo(que)
 que.LinkTo(con1)
 con1.LinkTo(snk1)

' Parte memorizzazione dei dati su file audio wav:
 con2 = New MediaControl(pl, "audioconvert")
 flt2 = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 enc2 = New MediaControl(pl, "wavenc")
 snk2 = New MediaControl(pl, "filesink")
 snk2["location"] = "/tmp/audio.wav"
 snk2["sync"] = True
 tee.LinkTo(con2)
 con2.LinkTo(flt2)
 flt2.LinkTo(enc2)
 enc2.LinkTo(snk2)

 pl.play()

' Utilizziamo la funzione "Input" per consentire il processo di conversione.
' L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."
 Input s

 pl.Stop
 pl.Close
 Print "Termine programma !"
 
End


Ascoltare quanto eseguito con il dispositivo Midi esterno, mostrare un Monoscopio e generare in fine un file audio

Riprendendo il precednete codice, vi aggiungeremo l'effetto video del plug-in Monoscope di Gstreamer, che mostra appunto in una finestra un Monoscopio:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, tee, que, flu, con1, snk1 As MediaControl 
 Dim con2, sco2, vid2, snk2 As MediaControl
 Dim que3, con3, enc3, snk3 As MediaControl
 Dim flt3 As MediaFilter
 Dim porta, s As String

' Imposta il numero identificativo, come Client ALSA, e della porta del dispositivo Midi esterno (ad esempio 24:0):
 porta = "24:0"
 
 pl = New MediaPipeline
  
' Parte comune:
 src = New MediaControl(pl, "alsamidisrc")
 src["ports"] = porta
 flu = New MediaControl(pl, "fluiddec")
 flu["synth-gain"] = 0.5

' Parte relativa alla duplicazione dei dati:
 tee = New MediaControl(pl, "tee")
 que = New MediaControl(pl, "queue")
  
' Parte ascolto in tempo reale dell'esecuzione Midi:
 con1 = New MediaControl(pl, "audioconvert")
 snk1 = New MediaControl(pl, "autoaudiosink")
 src.LinkTo(flu)
 flu.LinkTo(tee)
 tee.LinkTo(que)
 que.LinkTo(con1)
 con1.LinkTo(snk1)
 
' Parte per mostrare il "Monoscopio":
 con2 = New MediaControl(pl, "audioconvert")
 sco2 = New MediaControl(pl, "monoscope")
 vid2 = New MediaControl(pl, "videoconvert")
 snk2 = New MediaControl(pl, "autovideosink")
 tee.LinkTo(con2)
 con2.LinkTo(sco2)
 sco2.LinkTo(vid2)
 vid2.LinkTo(snk2)
 
' Parte memorizzazione dei dati su file audio wav:
 que3 = New MediaControl(pl, "queue")
 con3 = New MediaControl(pl, "audioconvert")
 flt3 = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 enc3 = New MediaControl(pl, "wavenc")
 snk3 = New MediaControl(pl, "filesink")
 snk3["location"] = "/tmp/audio.wav"
 snk2["sync"] = True
 tee.LinkTo(que3)
 que3.LinkTo(con3)
 con3.LinkTo(flt3)
 flt3.LinkTo(enc3)
 enc3.LinkTo(snk3)
 
 pl.play()

' Utilizziamo la funzione "Input" per consentire il processo di conversione.
' L'esecuzione viene interrotta, inserendo nella Console/Terminale un carattere dalla tastiera e premendo il tasto "Invio"."
 Input s

 pl.Stop
 pl.Close
 Print "Termine programma !"

End


Note

[1] Vedi anche la pagina: Intercettare dati Midi grezzi da un dispositivo Midi esterno mediante il Componente gb.media


Riferimenti