Eseguire e salvare un'onda sinusoidale mediante il Componente gb.media

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca

Usando le Classi "MediaPipeline" e "MediaControl"

Mostriamo di seguito alcune modalità usando le Classi MediaPipeline e MediaControl del Componente gb.media.

Eseguire un'onda sinusoidale

Per solo eseguire un'onda sinusoidale si potrà adottare il seguente esempio:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, snk As MediaControl
 
 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "audiotestsrc")
 src["volume"] = "0.5"
 src["freq"] = "440"
 src["wave"] = 0     ' Il valore 0 consente che sia riprodotta un'onda di tipo sinusoidale [nota 1]
 snk = New MediaControl(pl, "autoaudiosink")
 
 src.LinkTo(snk)
  
 pl.Play()
 
 Wait 10
  
 pl.Close
 
End


Eseguire un'onda formata da due o più note

Si userà in particolare l'elemento "MediaControl" chiamato "audiomixer" per unire i vari flussi audio generati.

Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, src2, src3, mix, snk As MediaControl

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "audiotestsrc")
 src["volume"] = "0.5"
 src["freq"] = "440"
 src["wave"] = 0     ' Il valore 0 consente che sia riprodotta un'onda di tipo sinusoidale [nota 1]

 src2 = New MediaControl(pl, "audiotestsrc")
 src2["volume"] = "0.5"
 src2["freq"] = "554"
 src2["wave"] = 0     ' Il valore 0 consente che sia riprodotta un'onda di tipo sinusoidale

 src3 = New MediaControl(pl, "audiotestsrc")
 src3["volume"] = "0.5"
 src3["freq"] = "659"
 src3["wave"] = 0     ' Il valore 0 consente che sia riprodotta un'onda di tipo sinusoidale
  
 mix = New MediaControl(pl, "audiomixer")
 snk = New MediaControl(pl, "autoaudiosink")
 
 src.LinkTo(mix)
 src2.LinkTo(mix)
 src3.LinkTo(mix)
 mix.LinkTo(snk)
 
 pl.Play()

 Wait 10
 
 pl.Close

End


Usando la connessione al Server audio "Jack"

In quest'altro esempio, simile al precedente, si farà uso della connessione al Server audio "Jack" (bisogna ricordare che Jack va avviato prima di lanciare il seguente codice gambas).

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, snk As MediaControl
 
 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "audiotestsrc")
 src["volume"] = "0.5"
 src["freq"] = "440"
 src["wave"] = 0     ' Il valore 0 consente che sia riprodotta un'onda di tipo sinusoidale [nota 1]
 snk = New MediaControl(pl, "jackaudiosink")
 
 src.LinkTo(snk)
  
 pl.Play()
 
 Wait 10
 
 pl.Close
  
End


Eseguire e salvare un'onda sinusoidale

Per eseguire e contemporaneamente salvare in un file WAV un'onda sinusoidale, è possibile usare il seguente codice:

Private bo As Boolean


Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, con, tee, que, wav, snk, aas As MediaControl

 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "audiotestsrc")
 src["volume"] = "0.5"
 src["freq"] = "440"
 src["wave"] = 0          ' Il valore 0 consente che sia riprodotta un'onda di tipo sinusoidale [nota 1]
 tee = New MediaControl(pl, "tee")   ' "tee" duplica il flusso di dati audio [nota 2]
 que = New MediaControl(pl, "queue")

 con = New MediaControl(pl, "audioconvert")
 wav = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/onda.wav"
 aas = New MediaControl(pl, "autoaudiosink")

 src.LinkTo(tee)
 tee.LinkTo(que)

 que.LinkTo(con)
 con.LinkTo(wav)
 wav.LinkTo(snk)

 tee.LinkTo(aas)

 pl.Play()

 Repeat
   Write "\r\e[0mTempo trascorso:     \e[31m" & Str(Time(0, 0, 0, pl.Position * 1000))
   Wait 0.01
 Until bo = True

 pl.Stop
 pl.Close

 Print "\n\e[0m Operazione terminata !"
' Usando l'Evento "Application_Read()", è necessario invocare "Quit" per terminare il programma:
 Quit

End


Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si termina il programma:

 bo = True

End


Eseguire e salvare un'onda sinusoidale formata da due o più note

Si userà in particolare l'elemento "MediaControl" chiamato "audiomixer" per unire i vari flussi audio generati e l'elemento "tee" per duplicare il flusso audio miscelato, in modo da inviarne uno al riproduttore audio e l'altro alla risorsa per generare il file WAV finale.

Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, src2, src3, mix, tee, que, con, wav, snk, aas As MediaControl

 pl = New MediaPipeline 

 src = New MediaControl(pl, "audiotestsrc")
 src["volume"] = "0.5"
 src["freq"] = "440"
 src["wave"] = 0          ' Il valore 0 consente che sia riprodotta un'onda di tipo sinusoidale [nota 1]
 src2 = New MediaControl(pl, "audiotestsrc")
 src2["volume"] = "0.5"
 src2["freq"] = "554"
 src2["wave"] = 0
 src3 = New MediaControl(pl, "audiotestsrc")
 src["volume"] = "0.5"
 src["freq"] = "659"
 src["wave"] = 0

 mix = New MediaControl(pl, "audiomixer")
 tee = New MediaControl(pl, "tee")   ' Il plugin "tee" di GStreamer duplica il flusso di dati audio [nota 2]
 que = New MediaControl(pl, "queue")

 con = New MediaControl(pl, "audioconvert")
 wav = New MediaControl(pl, "wavenc")
 snk = New MediaControl(pl, "filesink")
 snk["location"] = "/tmp/onda.wav"
 aas = New MediaControl(pl, "autoaudiosink")

 src.LinkTo(mix)
 src2.LinkTo(mix)
 src3.LinkTo(mix)

 mix.LinkTo(tee)
 tee.LinkTo(que)

 que.LinkTo(con)
 con.LinkTo(wav)
 wav.LinkTo(snk)

 tee.LinkTo(aas)

 pl.Play()

 Wait 10

 pl.Close

 Print "\n\e[0m Operazione terminata !"

End


Note

[1] Al riguardo vedere: https://gstreamer.freedesktop.org/documentation/audiotestsrc/index.html?gi-language=c

[2] Vedere la seguente pagina: Duplicare il flusso dei dati audio di una pipeline della Classe ''MediaPipeline'' del componente gb.media