Visualizzare la forma d'onda di un file WAV

Da Gambas-it.org - Wikipedia.

E' possibile visualizzare, seppur in modo approssimativo, con le sole funzioni di Gambas la forma d'onda di un file audio WAV.


Nell'esempio che segue si supporrà che il file sia a due canali e a 16bit, ma sarà mostrata l'onda di un solo canale.
Porremo inoltre sul Form una DrawingArea:

Private Const ZOOM As Short = 256  ' Imposta lo zoom visivo dell'onda disegnata
Private fl As File
Private fileWAV As String
Private ini As Integer


Public Sub Form_Open()

 With Me
   .W = Desktop.W
   .H = Desktop.H
 End With
 
 With DrawingArea1
   .W = Desktop.W
   .H = Desktop.H
 End With
 
 fileWAV = "/percorso/del/file.wav"
 If InStr(fileWAV, "RIFF") == 0 Then
   Message.Error("Il file caricato non è un file 'WAV' o è inesistente !")
 Endif   
 
 fl = Open fileWAV For Read
   
 ini = Val(InputBox("Inserire il byte iniziale:"))
 
End


Public Sub DrawingArea1_Draw()

 Dim d, sh As Short
 Dim i, ii, r, v As Integer

 d = InStr(File.Load(fileWAV), "data")
 
 If ini And 1 Then ini += 1
 
' Ci si sposta al byte impostato dei dati audio grezzi:
 Seek #fl, ini + (d + 7)
  
 For i = 0 To 99999
   Seek #fl, Seek(fl) + SizeOf(gb.Short)
   Read #fl, sh
   
   If sh = 0 Then ii = 1
   If sh < 0 Then ii = sh / 10
   If sh > 0 Then ii = sh / 10
  
   If sh > 0 Then
     v = ii
     r = 1
   Else
     v = 1
     r = ii
   Endif
   
   With Paint
     .Begin(DrawingArea1)
     .Brush = Paint.Color(Color.RGB(r, v, 0))
     .MoveTo(i / ZOOM, DrawingArea1.H / 2)
     .RelLineTo(0, ii * 0.3)
     .Stroke
     .End
   End With
   
 Next
    
 Print "\nLetti in totale "; Seek(fl); " byte"
 
End



Invece, per ottenere un risultato più preciso e soddisfcente, gli iscritti al forum www.gambas-it.org possono scaricare in questa discussione il sorgente di un programma molto più complesso che fa uso delle risorse esterne della libreria di sndfile e di Cairo.