Differenze tra le versioni di "Visualizzare la forma d'onda di un file WAV"
Da Gambas-it.org - Wikipedia.
Riga 1: | Riga 1: | ||
E' possibile visualizzare, seppur in modo <SPAN style="text-decoration:underline">approssimativo</span>, con le sole funzioni di Gambas la forma d'onda di un file audio WAV. | E' possibile visualizzare, seppur in modo <SPAN style="text-decoration:underline">approssimativo</span>, 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. | 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. |
Versione delle 01:28, 28 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, 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.