Differenze tra le versioni di "Analizzare il valore RMS, il picco e il decay dei dati audio mediante gb.media"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
Mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media e usando il plug-ig "''Level''" di GStreamer è possibile analizzare il valore RMS, il picco e il decay dei dati audio di un file audio, mentre esso viene eseguito.
 
Mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media e usando il plug-ig "''Level''" di GStreamer è possibile analizzare il valore RMS, il picco e il decay dei dati audio di un file audio, mentre esso viene eseguito.
  
Mostriamo un semplice codice in ambiente grafico eseguendo rispettivamente un file WAV, un file Mp3 e un file OGG.
+
 
 +
==Catturando i dati audio digitali provenienti dalla scheda audio==
 +
Mostriamo un codice in ambiente grafico catturando i dati audio provenienti da una sorgente esterna:
 +
Private pl As MediaPipeline
 +
Private tb As ToggleButton
 +
Private gv As GridView
 +
 +
 +
'''Public''' Sub _new()
 +
 
 +
  With Me
 +
    .W = 600
 +
    .H = 300
 +
  End With
 +
  With gv = New GridView(Me)
 +
    .X = 10
 +
    .Y = 10
 +
    .W = Me.W - 20
 +
    .H = Me.H * 0.6
 +
    .Columns.Count = 2
 +
    .Columns.Width = gv.w / 2
 +
    .Rows.Count = 6
 +
  End With
 +
  With tb = New ToggleButton(Me) As "Tasto"
 +
    .Y = Me.H * 0.7
 +
    .W = 80
 +
    .H = 40
 +
    .X = (Me.W / 2) - (.W / 2)
 +
    .Text = "Start"
 +
  End With
 +
 
 +
'''End'''
 +
 
 +
'''Public''' Sub Form_Open()
 +
 
 +
  Dim src, con, lev, snk As MediaControl
 +
 
 +
  pl = New MediaPipeline As "Pipeline"
 +
 
 +
  src = New MediaControl(pl, "alsasrc")
 +
  con = New MediaControl(pl, "audioconvert")
 +
  lev = New MediaControl(pl, "level")
 +
  snk = New MediaControl(pl, "alsasink")
 +
  src.LinkTo(con)
 +
  con.LinkTo(lev)
 +
  lev.LinkTo(snk)
 +
 
 +
'''End'''
 +
 +
'''Public''' Sub Tasto_Click()
 +
 
 +
  If tb.Value Then
 +
    pl.Play()
 +
    tb.Text = "Stop"
 +
  Else
 +
    pl.Stop()
 +
    pl.Close()
 +
    Me.Close
 +
  Endif
 +
 
 +
'''End'''
 +
 +
'''Public''' Sub Pipeline_Event(Message As MediaMessage)
 +
 
 +
  Dim can, b As Byte
 +
  Dim rms As Float
 +
 
 +
  If Message.Name = "level" Then
 +
    For can = 0 To Message[Message.Keys[5]].count - 1  ' Numero canali
 +
      gv[0, can].RichText = "<B>Canale " & CStr(can + 1)
 +
      gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
 +
      For b = 5 To Message.count - 1
 +
        With Message
 +
          gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
 +
        End With
 +
        If b = 5 Then
 +
          rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
 +
          gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
 +
        Endif
 +
      Next
 +
    Next
 +
  Endif
 +
     
 +
'''End'''
 +
 
 +
 
 +
==Eseguendo file audio==
 +
Mostriamo dei codici in ambiente grafico eseguendo rispettivamente un file WAV, un file Mp3 e un file OGG.
 +
 
 
===Eseguendo un file audio WAV===
 
===Eseguendo un file audio WAV===
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
Riga 32: Riga 120:
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
Riga 51: Riga 138:
 
   lev.LinkTo(snk)
 
   lev.LinkTo(snk)
 
    
 
    
  '''End'''
+
  '''End'''  
 
 
   
 
   
 
  '''Public''' Sub Tasto_Click()
 
  '''Public''' Sub Tasto_Click()
Riga 65: Riga 151:
 
   Endif
 
   Endif
 
    
 
    
  '''End'''
+
  '''End'''  
 
 
   
 
   
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
Riga 74: Riga 159:
 
    
 
    
 
   If Message.Name = "level" Then
 
   If Message.Name = "level" Then
     For can = 0 To Message[Message.Keys[5]].count - 1  ' Numero canali
+
     For can = 0 To Message[Message.Keys[5]].count - 1  <FONT Color=gray>' ''Numero canali''</font>"
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Date(0, 0, 0, 0, 0, 0, Message[Message.Keys[can]] / 1000000))
+
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
 
       For b = 5 To Message.count - 1
 
       For b = 5 To Message.count - 1
 
         With Message
 
         With Message
Riga 118: Riga 203:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  '''End'''  
 
 
   
 
   
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
Riga 146: Riga 230:
 
   pl.Close
 
   pl.Close
 
    
 
    
  '''End'''
+
  '''End'''
 
 
 
   
 
   
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
 
  '''Public''' Sub Pipeline_Event(Message As MediaMessage)
Riga 155: Riga 238:
 
    
 
    
 
   If Message.Name = "level" Then
 
   If Message.Name = "level" Then
     For can = 0 To Message[Message.Keys[5]].count - 1  ' Numero canali
+
     For can = 0 To Message[Message.Keys[5]].count - 1  <FONT Color=gray>' ''Numero canali''</font>"
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
 
       gv[0, can].RichText = "&#060;B>Canale " & CStr(can + 1)
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Date(0, 0, 0, 0, 0, 0, Message[Message.Keys[can]] / 1000000))
+
       gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
 
       For b = 5 To Message.count - 1
 
       For b = 5 To Message.count - 1
 
         With Message
 
         With Message

Versione delle 09:49, 24 mag 2023

Mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media e usando il plug-ig "Level" di GStreamer è possibile analizzare il valore RMS, il picco e il decay dei dati audio di un file audio, mentre esso viene eseguito.


Catturando i dati audio digitali provenienti dalla scheda audio

Mostriamo un codice in ambiente grafico catturando i dati audio provenienti da una sorgente esterna:

Private pl As MediaPipeline
Private tb As ToggleButton
Private gv As GridView


Public Sub _new()
 
 With Me
   .W = 600
   .H = 300
 End With
 With gv = New GridView(Me)
   .X = 10
   .Y = 10
   .W = Me.W - 20
   .H = Me.H * 0.6
   .Columns.Count = 2
   .Columns.Width = gv.w / 2
   .Rows.Count = 6
 End With
 With tb = New ToggleButton(Me) As "Tasto"
   .Y = Me.H * 0.7
   .W = 80
   .H = 40
   .X = (Me.W / 2) - (.W / 2)
   .Text = "Start"
 End With
 
End
 
Public Sub Form_Open()
 
 Dim src, con, lev, snk As MediaControl
 
 pl = New MediaPipeline As "Pipeline"
  
 src = New MediaControl(pl, "alsasrc")
 con = New MediaControl(pl, "audioconvert")
 lev = New MediaControl(pl, "level")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(con)
 con.LinkTo(lev)
 lev.LinkTo(snk)
 
End 

Public Sub Tasto_Click()
 
 If tb.Value Then
   pl.Play()
   tb.Text = "Stop"
 Else
   pl.Stop()
   pl.Close()
   Me.Close
 Endif
 
End 

Public Sub Pipeline_Event(Message As MediaMessage)
 
 Dim can, b As Byte
 Dim rms As Float
 
 If Message.Name = "level" Then
   For can = 0 To Message[Message.Keys[5]].count - 1   ' Numero canali
     gv[0, can].RichText = "<B>Canale " & CStr(can + 1)
     gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
     For b = 5 To Message.count - 1
       With Message
         gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
       End With
       If b = 5 Then
         rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
         gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
       Endif
     Next
   Next
 Endif
     
End


Eseguendo file audio

Mostriamo dei codici in ambiente grafico eseguendo rispettivamente un file WAV, un file Mp3 e un file OGG.

Eseguendo un file audio WAV

Private pl As MediaPipeline
Private tb As ToggleButton
Private gv As GridView


Public Sub _new()
 
 With Me
   .W = 600
   .H = 300
 End With
 With gv = New GridView(Me)
   .X = 10
   .Y = 10
   .W = Me.W - 20
   .H = Me.H * 0.6
   .Columns.Count = 2
   .Columns.Width = gv.w / 2
   .Rows.Count = 6
 End With
 With tb = New ToggleButton(Me) As "Tasto"
   .Y = Me.H * 0.7
   .W = 80
   .H = 40
   .X = (Me.W / 2) - (.W / 2)
   .Text = "Start"
 End With
 
End

Public Sub Form_Open()
 
 Dim src, par, con, lev, snk As MediaControl
 
 pl = New MediaPipeline As "Pipeline"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.wav"
 par = New MediaControl(pl, "wavparse")
 con = New MediaControl(pl, "audioconvert")
 lev = New MediaControl(pl, "level")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(par)
 par.LinkTo(con)
 con.LinkTo(lev)
 lev.LinkTo(snk)
 
End 

Public Sub Tasto_Click()
 
 If tb.Value Then
   pl.Play()
   tb.Text = "Stop"
 Else
   pl.Stop()
   pl.Close()
   Me.Close
 Endif
 
End 

Public Sub Pipeline_Event(Message As MediaMessage)
 
 Dim can, b As Byte
 Dim rms As Float
 
 If Message.Name = "level" Then
   For can = 0 To Message[Message.Keys[5]].count - 1   ' Numero canali"
     gv[0, can].RichText = "<B>Canale " & CStr(can + 1)
     gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
     For b = 5 To Message.count - 1
       With Message
         gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
       End With
       If b = 5 Then
         rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
         gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
       Endif
     Next
   Next
 Endif
     
End

Eseguendo un file audio MP3

Per utilizzare il precedente codice con un file audio di formato MP3, è sufficiente sostituire un paio di elementi MediaControl come segue:

par = New MediaControl(pl, "mpegaudioparse")
con = New MediaControl(pl, "mpg123audiodec")

Eseguendo un file audio OGG

Per utilizzare il precedente codice con un file audio di formato OGG, si utilizzerà un codice simile al precedente con qualche variazione:

Private pl As MediaPipeline
Private gv As GridView


Public Sub _new()
 
 With Me
   .W = 600
   .H = 200
 End With
 With gv = New GridView(Me)
   .X = 10
   .Y = 10
   .W = Me.W - 20
   .H = Me.H * 0.8
   .Columns.Count = 2
   .Columns.Width = gv.w / 2
   .Rows.Count = 6
 End With
 
End 

Public Sub Form_Open()
 
 Dim src, par, con, lev, snk As MediaControl
 
 Me.Show
 
 pl = New MediaPipeline As "Pipeline"
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file.ogg"
 par = New MediaControl(pl, "oggdemux")
 con = New MediaControl(pl, "vorbisdec")
 lev = New MediaControl(pl, "level")
 snk = New MediaControl(pl, "alsasink")
 src.LinkTo(par)
 par.LinkLaterTo(con)
 con.LinkTo(lev)
 lev.LinkTo(snk)
  
 pl.Play()
 
 Wait pl.Duration
 
 pl.Close
 
End  

Public Sub Pipeline_Event(Message As MediaMessage)
 
 Dim can, b As Byte
 Dim rms As Float
 
 If Message.Name = "level" Then
   For can = 0 To Message[Message.Keys[5]].count - 1   ' Numero canali"
     gv[0, can].RichText = "<B>Canale " & CStr(can + 1)
     gv[1, can].Text = Message.Keys[0] & "  " & CStr(Time(0, 0, 0, Message[Message.Keys[can]] / 1000000))
     For b = 5 To Message.count - 1
       With Message
         gv[b - 3, can].Text = CStr(.Keys[b]) & ":  " & CStr(Message[.Keys[b]][can])
       End With
       If b = 5 Then
         rms = (10 ^ (Message[Message.Keys[b]][can] / 20))
         gv[5, can].Text = "Valore rms normalizzato: " & CStr(rms)
       Endif
     Next
   Next
 Endif
     
End