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.
Riga 156: Riga 156:
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
   Dim src1, flu1, con1, snk1 As MediaControl  
+
   Dim src, tee, que, flu, con1, snk1 As MediaControl  
   Dim src2, flu2, res2, con2, enc2, snk2 As MediaControl  
+
   Dim con2, enc2, snk2 As MediaControl
 
   Dim flt2 As MediaFilter
 
   Dim flt2 As MediaFilter
 
   Dim porta, primofile, s As String
 
   Dim porta, primofile, s As String
Riga 168: Riga 168:
 
   pl = New MediaPipeline
 
   pl = New MediaPipeline
 
    
 
    
   src1 = New MediaControl(pl, "alsamidisrc")
+
<FONT Color=gray>' ''Parte comune:''</font>
   src1["ports"] = porta  
+
   src = New MediaControl(pl, "alsamidisrc")
   flu1 = New MediaControl(pl, "fluiddec")
+
   src["ports"] = porta  
   flu1["synth-gain"] = 0.5
+
 
 +
  tee = New MediaControl(pl, "tee")
 +
  que = New MediaControl(pl, "queue")
 +
   
 +
<FONT Color=gray>' ''Parte ascolto in tempo reale dell'esecuzione Midi:''</font>
 +
   flu = New MediaControl(pl, "fluiddec")
 +
   flu["synth-gain"] = 0.5
 
   con1 = New MediaControl(pl, "audioconvert")
 
   con1 = New MediaControl(pl, "audioconvert")
 
   snk1 = New MediaControl(pl, "autoaudiosink")
 
   snk1 = New MediaControl(pl, "autoaudiosink")
   src1.LinkTo(flu1)
+
   src.LinkTo(flu)
   flu1.LinkTo(con1)
+
   flu.LinkTo(tee)
 +
  tee.LinkTo(que)
 +
  que.LinkTo(con1)
 
   con1.LinkTo(snk1)
 
   con1.LinkTo(snk1)
 
    
 
    
  src2 = New MediaControl(pl, "alsamidisrc")
+
<FONT Color=gray>' ''Parte memorizzazione dei dati su file audio wav:''</font>
  src2["ports"] = porta
 
  flu2 = New MediaControl(pl, "fluiddec")
 
  flu2["synth-gain"] = 0.5
 
  res2 = New MediaControl(pl, "audioresample")
 
 
   con2 = New MediaControl(pl, "audioconvert")
 
   con2 = New MediaControl(pl, "audioconvert")
 
   flt2 = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
 
   flt2 = New MediaFilter(pl, "audio/x-raw,channels=2,format=S16LE")
Riga 189: Riga 193:
 
   snk2["location"] = primofile
 
   snk2["location"] = primofile
 
   <FONT Color=#B22222>snk2["sync"] = True</font>
 
   <FONT Color=#B22222>snk2["sync"] = True</font>
   src2.LinkTo(flu2)
+
   tee.LinkTo(con2)
  flu2.LinkTo(res2)
 
  res2.LinkTo(con2)
 
 
   con2.LinkTo(flt2)
 
   con2.LinkTo(flt2)
 
   flt2.LinkTo(enc2)
 
   flt2.LinkTo(enc2)

Versione delle 17:41, 12 set 2017

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, primofile, s As String
 
  primofile = "/tmp/primofile"
  
' 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"] = primofile
  snk["sync"] = True
  
  src.LinkTo(flu)
  flu.LinkTo(con)
  con.LinkTo(flt)
  flt.LinkTo(enc)
  enc.LinkTo(snk)
  
  pl.play()
  
' Consente di tenere funzionante il programma. Basterà premere "Invio" per terminare.
  Input s
  
  Copy primofile To "/tmp/audio.wav"
  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, primofile, s As String
 
  primofile = "/tmp/primofile"
  
' 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"] = primofile
  snk["sync"] = True
  
  src.LinkTo(flu)
  flu.LinkTo(con)
  con.LinkTo(flt)
  flt.LinkTo(enc)
  enc.LinkTo(snk)
  
  pl.play()
  
' Consente di tenere funzionante il programma. Basterà premere "Invio" per terminare.
  Input s
  
  Copy primofile To "/tmp/audio.mp3"
  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, primofile, s As String
 
  primofile = "/tmp/primofile"
  
' 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"] = primofile
  snk["sync"] = True
  
  src.LinkTo(flu)
  flu.LinkTo(con)
  con.LinkTo(flt)
  flt.LinkTo(enc)
  enc.LinkTo(mux)
  mux.LinkTo(snk)
  
  pl.play()
  
' Consente di tenere funzionante il programma. Basterà premere "Invio" per terminare.
  Input s
  
  Copy primofile To "/tmp/audio.ogg"
  pl.Stop
  pl.Close
  Print "Termine programma !"
  
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, primofile, s As String
  
  primofile = "/tmp/primofile"
   
' 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 
 
  tee = New MediaControl(pl, "tee")
  que = New MediaControl(pl, "queue")
   
' Parte ascolto in tempo reale dell'esecuzione Midi:
  flu = New MediaControl(pl, "fluiddec")
  flu["synth-gain"] = 0.5
  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"] = primofile
  snk2["sync"] = True
  tee.LinkTo(con2)
  con2.LinkTo(flt2)
  flt2.LinkTo(enc2)
  enc2.LinkTo(snk2)
  
  pl.play()
  
' Consente di tenere funzionante il programma. Basterà premere "Invio" per terminare.
  Input s
  
  Copy primofile To "/tmp/audio.wav"
  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