Differenze tra le versioni di "Visualizzare la forma d'onda di un file WAV"

Da Gambas-it.org - Wikipedia.
Riga 10: Riga 10:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
  With Me
+
  With Me
    .W = Desktop.W
+
    .W = Desktop.W
    .H = Desktop.H
+
    .H = Desktop.H
  End With
+
  End With
+
 
  With DrawingArea1
+
  With DrawingArea1
    .W = Desktop.W
+
    .W = Desktop.W
    .H = Desktop.H
+
    .H = Desktop.H
  End With
+
  End With
+
 
  fileWAV = "''/percorso/del/file.wav''"
+
  fileWAV = "''/percorso/del/file.wav''"
+
  If InStr(fileWAV, "RIFF") == 0 Then
  fl = Open fileWAV For Read
+
    Message.Error("Il file caricato non è un file 'WAV' o è inestinte !")
 +
  Endif 
 +
 
 +
  fl = Open fileWAV For Read
 
      
 
      
  ini = Val(InputBox("Inserire il byte iniziale:"))
+
  ini = Val(InputBox("Inserire il byte iniziale:"))
+
 
 
  '''End'''
 
  '''End'''
 
   
 
   
Riga 34: Riga 37:
 
   Dim i, ii, r, v As Integer
 
   Dim i, ii, r, v As Integer
 
   
 
   
  d = InStr(File.Load(fileWAV), "data")
+
  d = InStr(File.Load(fileWAV), "data")
 
    
 
    
  If ini And 1 Then ini += 1
+
  If ini And 1 Then ini += 1
 
    
 
    
 
  <FONT color=gray>' ''Ci si sposta al byte impostato dei dati audio grezzi:''</font>
 
  <FONT color=gray>' ''Ci si sposta al byte impostato dei dati audio grezzi:''</font>
  Seek #fl, ini + (d + 7)
+
  Seek #fl, ini + (d + 7)
 +
 
 +
  For i = 0 To 9999
 +
   
 +
    Read #fl, sh
 +
   
 +
    If sh = 0 Then ii = 1
 +
    If sh < 0 Then ii = sh / 10
 +
    If sh > 0 Then ii = sh / 10
 
    
 
    
  For i = 0 To 9999
+
    If sh > 0 Then
 +
      v = ii
 +
      r = 1
 +
    Else
 +
      v = 1
 +
      r = ii
 +
    Endif
 
      
 
      
    Read #fl, sh
+
    With Paint
+
      .Begin(DrawingArea1)
      If sh = 0 Then ii = 1
+
      .Brush = Paint.Color(Color.RGB(r, v, 0))
      If sh < 0 Then ii = sh / 10
+
      .MoveTo(i, 400)
      If sh > 0 Then ii = sh / 10
+
      .RelLineTo(0, ii * 0.5)
+
      .Stroke
      If sh > 0 Then
+
      .End
        v = ii
+
    End With
        r = 1
 
      Else
 
        v = 1
 
        r = ii
 
      Endif
 
 
    With Paint
 
      .Begin(DrawingArea1)
 
      .Brush = Paint.Color(Color.RGB(r, v, 0))
 
      .MoveTo(i, 400)
 
      .RelLineTo(0, ii * 0.5)
 
      .Stroke
 
      .End
 
    End With
 
 
      
 
      
  Next
+
  Next
 
      
 
      
  Print "\nLetti in totale "; Seek(fl); " byte"
+
  Print "\nLetti in totale "; Seek(fl); " byte"
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 17:38, 27 ago 2020

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. Porremo inoltre sul Form una DrawingArea:

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 è inestinte !")
 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 9999
   
   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, 400)
     .RelLineTo(0, ii * 0.5)
     .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.