Differenze tra le versioni di "Estrarre da un file WAV i dati audio grezzi mediante le sole risorse di Gambas"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Per estrarre da un file WAV i soli dati audio grezzi unicamente mediante le funzioni di Gambas, è possibile utilizzare vari codici. Ne mostriamo alcuni: '''Public''' Sub Ma...")
 
 
(9 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per estrarre da un file WAV i soli dati audio grezzi unicamente mediante le funzioni di Gambas, è possibile utilizzare vari codici.
+
Per estrarre da un file WAV i soli dati audio grezzi unicamente mediante le funzioni di Gambas, è possibile utilizzare varie modalità.
 
+
Ne mostriamo alcune:
Ne mostriamo alcuni:
 
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
 
   Dim percorsoFile, intero_file, dati_grezzi As String
 
   Dim percorsoFile, intero_file, dati_grezzi As String
 
   Dim n As Short
 
   Dim n As Short
 
 
  percorsoFile = "''/percorso/del/file.wav''"
 
 
    
 
    
  intero_file = File.Load(percorsoFile)
+
  percorsoFile = "<FONT Color=gray>''/percorso/del/file.wav''</font>"
 +
 
 +
  intero_file = File.Load(percorsoFile)
 
   
 
   
  n = InStr(intero_file, "data")
+
  n = InStr(intero_file, "data")
 
    
 
    
 
  <FONT color=gray>' ''Prendiamo i soli dati audio grezzi dal file, eliminando quelli che compongono il suo "header":''</font>
 
  <FONT color=gray>' ''Prendiamo i soli dati audio grezzi dal file, eliminando quelli che compongono il suo "header":''</font>
  dati_grezzi = Right(intero_file, Len(intero_file) - n - 7)
+
  dati_grezzi = Right(intero_file, Len(intero_file) - n - 7)
 +
 
 +
<FONT color=gray>' ''...oppure anche così:''
 +
' '''dati_grezzi = intero_file[(n + 7), intero_file.Len - (n + 7)]'''</font>  <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
 
    
 
    
  File.Save("/tmp/grezzi", dati_grezzi)
+
  File.Save("/tmp/grezzi", dati_grezzi)
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 23: Riga 24:
  
  
Esempio in cui si utilizzano le funzioni dei vettori di tipo ''Byte[]'':
+
Esempio in cui si utilizzano le funzioni dei vettori di tipo Byte[ ]:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
 
   Dim fileWAV As String
 
   Dim fileWAV As String
  Dim fl, ex As File
 
 
   Dim d As Short
 
   Dim d As Short
   Dim bb As Byte[]
+
   Dim <FONT Color=#B22222>bb</font> As <FONT Color=#B22222>Byte[]</font>
+
 
+
  fileWAV = "<FONT Color=gray>''/percorso/del/file.wav''</font>"
  fileWAV = "''/percorso/del/file.wav''"
 
 
   
 
   
 
  <FONT color=gray>' ''Carica un file audio Wav:''</font>
 
  <FONT color=gray>' ''Carica un file audio Wav:''</font>
  fl = Open fileWAV For Read
+
  <FONT Color=#B22222>bb</font> = <FONT Color=#B22222>Byte[].FromString</font>(File.Load(fileWAV))
 
 
  d = InStr(File.Load(fileWAV), "data")
 
 
    
 
    
  bb = New Byte[Stat(fileWAV).Size - (d + 7)]
+
  <FONT color=gray>' ''Individua la posizione del primo valore della parola "data" nel file wav:''</font>
+
  d = InStr(File.Load(fileWAV), "data")
  <FONT color=gray>' ''Spostiamo il puntatore all'interno del flusso del file''
 
' ''sul primo byte successivo all'header del file wav:''</font>
 
  Seek #fl, d + 7
 
  bb.Read(fl, 0, Stat(fileWAV).Size - (d + 7))
 
 
 
  ex = Open "/tmp/dati_grezzi" For Create
 
 
    
 
    
 
  <FONT color=gray>' ''Scrive il file contenente i soli dati audio grezzi del file Wav:''</font>
 
  <FONT color=gray>' ''Scrive il file contenente i soli dati audio grezzi del file Wav:''</font>
  bb.Write(ex)
+
  File.Save("/tmp/grezzi", <FONT Color=#B22222>bb.ToString</font>(d + 7, bb.Count))
 
 
 
<FONT color=gray>' ''Va in chiusura:''</font>
 
  ex.Close
 
 
 
  fl.Close
 
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  
 
Esempio in cui vengono caricati in un'apposita ''Struttura'' alcuni dati del file Wav: numero canali, frequenza di campionamento, risoluzione, block align (quest'ultimo sarà utile per ottenere la durata del brano audio). Tali dati verranno poi mostrati in console ed utilizzati alcuni per calcolare la durata di esecuzione del file Wav:
 
Esempio in cui vengono caricati in un'apposita ''Struttura'' alcuni dati del file Wav: numero canali, frequenza di campionamento, risoluzione, block align (quest'ultimo sarà utile per ottenere la durata del brano audio). Tali dati verranno poi mostrati in console ed utilizzati alcuni per calcolare la durata di esecuzione del file Wav:
 
  Public Struct INFOWAV
 
  Public Struct INFOWAV
   fileWAV As String      <FONT Color=gray>' ''Percorso del file wav</font>
+
   fileWAV As String      <FONT Color=gray>' ''Percorso del file wav''</font>
   canali As Short        <FONT Color=gray>' ''Numero dei canali</font>
+
   canali As Short        <FONT Color=gray>' ''Numero dei canali''</font>
   frequenza As Integer  <FONT Color=gray>' ''Frequenza di campionamento</font>
+
   frequenza As Integer  <FONT Color=gray>' ''Frequenza di campionamento''</font>
   bit As Short          <FONT Color=gray>' ''Risoluzione di campionamento in bit</font>
+
   byte_rate As Integer  <FONT Color=gray>' ''Byte Rate per secondo (quantità di byte processati ogni secondo)''</font>
   block_align As Short   <FONT Color=gray>' ''Block Align</font>
+
   bit As Short           <FONT Color=gray>' ''Risoluzione di campionamento in bit''</font>
   durata As Float        <FONT Color=gray>' ''Durata di esecuzione del file wav</font>
+
   dati As Byte[]        <FONT Color=gray>' ''Dati grezzi del file wav''</font>
   sonora As Byte[]      <FONT Color=gray>' ''Dati grezzi del file wav</font>
+
   durata As Float        <FONT Color=gray>' ''Durata di esecuzione del file wav''</font>
 
  End Struct
 
  End Struct
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
+
    
   Dim fileWav As String
 
 
   Dim datiwav As New INFOWAV
 
   Dim datiwav As New INFOWAV
 
    
 
    
  datiwav.fileWav = "''/percorso/del/file.wav''"
+
  datiwav.fileWav = "<FONT Color=gray>''/percorso/del/file.wav''</font>"
 
    
 
    
  EstraeDatiAudio(datiwav)
+
  EstraeDatiAudio(datiwav)
 
    
 
    
 
  <FONT Color=gray>' ''Mostra in console le informazioni ottenute:</font>
 
  <FONT Color=gray>' ''Mostra in console le informazioni ottenute:</font>
  With datiwav
+
  With datiwav
    Print "File wav caricato:";; .fileWAV
+
    Print "File wav caricato:             "; .fileWAV
    Print "Numero canali:";; .canali
+
    Print "Numero dei canali:             "; .canali
    Print "Frequenza di campionamento: hz";; .frequenza
+
    Print "Frequenza di campionamento: hz "; .frequenza
    Print "Risoluzione:";; .bit;; "bit"
+
    Print "Risoluzione:                   "; .bit; " bit"
    Print "Durata esecuzione:";; CStr(Date(0, 0, 0, 0, 0, 0, .durata * 1000))
+
    Print "Durata dell'esecuzione:       "; Str(Time(0, 0, 0, .durata * 1000))
  End With
+
  End With
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Private''' Function EstraeDatiAudio(iw As INFOWAV)
 
  '''Private''' Function EstraeDatiAudio(iw As INFOWAV)
Riga 101: Riga 82:
 
    
 
    
 
  <FONT Color=gray>' ''Carica il file audio Wav:</font>
 
  <FONT Color=gray>' ''Carica il file audio Wav:</font>
  fl = Open iw.fileWAV For Read
+
  fl = Open iw.fileWAV For Read
 
   
 
   
 
  <FONT Color=gray>' ''Individua il numero del byte ove è posto il TAG wav "data":''</font>
 
  <FONT Color=gray>' ''Individua il numero del byte ove è posto il TAG wav "data":''</font>
  d = InStr(File.Load(iw.fileWAV), "data")
+
  d = InStr(File.Load(iw.fileWAV), "data")
 
   
 
   
  iw.sonora = New Byte[Lof(fl) - (d + 7)]
+
  iw.dati = New Byte[Lof(fl) - (d + 7)]
 
    
 
    
 
  <FONT Color=gray>' ''Carica nel vettore di tipo Byte[] i soli dati audio grezzi, posti a cominciare dal 7° byte "offset" dopo il primo byte del TAG wav "data":''</font>
 
  <FONT Color=gray>' ''Carica nel vettore di tipo Byte[] i soli dati audio grezzi, posti a cominciare dal 7° byte "offset" dopo il primo byte del TAG wav "data":''</font>
  Seek #fl, d + 7
+
  Seek #fl, d + 7
  <FONT Color=#B22222>iw.sonora.Read(fl, 0, Lof(fl) - (d + 7))</font>
+
  <FONT Color=#B22222>iw.dati.Read(fl, 0, Lof(fl) - (d + 7))</font>
 
   
 
   
 
  <FONT Color=gray>' ''Legge il numero dei canali al byte d'indice (offset) 22:''</font>
 
  <FONT Color=gray>' ''Legge il numero dei canali al byte d'indice (offset) 22:''</font>
  Seek #fl, 22
+
  Seek #fl, 22
  iw.canali = Read #fl As Short
+
  iw.canali = Read #fl As Short
 
   
 
   
 
  <FONT Color=gray>' ''Legge la frequenza di campionamento dei dati audio al byte d'indice (offset) 24:''</font>
 
  <FONT Color=gray>' ''Legge la frequenza di campionamento dei dati audio al byte d'indice (offset) 24:''</font>
  Seek #fl, 24
+
  iw.frequenza = Read #fl As Integer
  iw.frequenza = Read #fl As Integer
 
 
   
 
   
  <FONT Color=gray>' ''Legge il valore del "block align" al byte d'indice (offset) 32:''</font>
+
  <FONT Color=gray>' ''Legge il valore del "Byte Rate" al byte d'indice (offset) 28:''</font>
  Seek #fl, 32
+
  iw.byte_rate = Read #fl As Integer
  iw.block_align = Read #fl As Short
 
 
   
 
   
 
  <FONT Color=gray>' ''Legge la risoluzione bit del campionamento al byte d'indice (offset) 34:''</font>
 
  <FONT Color=gray>' ''Legge la risoluzione bit del campionamento al byte d'indice (offset) 34:''</font>
  Seek #fl, 34  
+
  Seek #fl, 34  
  iw.bit = Read #fl As Short
+
  iw.bit = Read #fl As Short
 
   
 
   
  <FONT Color=gray>' ''Calcola la durata dell'esecuzione del file wav:''</font>
+
  <FONT Color=gray>' ''Calcola la durata dell'esecuzione del file wav:''</font>  <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
  iw.durata = (iw.sonora.Count / iw.block_align) / iw.frequenza
+
  iw.durata = iw.dati.Count / iw.byte_rate
 
   
 
   
  fl.Close
+
  fl.Close
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
 +
 +
 +
=Note=
 +
[1] Vedi la seguente pagina: [[Accedere ai caratteri contenuti da una variabile di tipo stringa come se questa fosse una vettore]]
 +
 +
[2] Vedi la seguente pagina: [[Calcolare la durata di un file audio WAV]]

Versione attuale delle 16:55, 16 set 2022

Per estrarre da un file WAV i soli dati audio grezzi unicamente mediante le funzioni di Gambas, è possibile utilizzare varie modalità. Ne mostriamo alcune:

Public Sub Main()

 Dim percorsoFile, intero_file, dati_grezzi As String
 Dim n As Short
 
 percorsoFile = "/percorso/del/file.wav"
 
 intero_file = File.Load(percorsoFile)

 n = InStr(intero_file, "data")
  
' Prendiamo i soli dati audio grezzi dal file, eliminando quelli che compongono il suo "header":
 dati_grezzi = Right(intero_file, Len(intero_file) - n - 7)
 
' ...oppure anche così:
' dati_grezzi = intero_file[(n + 7), intero_file.Len - (n + 7)]  [Nota 1]
  
 File.Save("/tmp/grezzi", dati_grezzi)
 
End


Esempio in cui si utilizzano le funzioni dei vettori di tipo Byte[ ]:

Public Sub Main()

 Dim fileWAV As String
 Dim d As Short
 Dim bb As Byte[]
 
 fileWAV = "/percorso/del/file.wav"

' Carica un file audio Wav:
 bb = Byte[].FromString(File.Load(fileWAV))
 
' Individua la posizione del primo valore della parola "data" nel file wav:
 d = InStr(File.Load(fileWAV), "data")
 
' Scrive il file contenente i soli dati audio grezzi del file Wav:
 File.Save("/tmp/grezzi", bb.ToString(d + 7, bb.Count))
 
End


Esempio in cui vengono caricati in un'apposita Struttura alcuni dati del file Wav: numero canali, frequenza di campionamento, risoluzione, block align (quest'ultimo sarà utile per ottenere la durata del brano audio). Tali dati verranno poi mostrati in console ed utilizzati alcuni per calcolare la durata di esecuzione del file Wav:

Public Struct INFOWAV
  fileWAV As String      ' Percorso del file wav
  canali As Short        ' Numero dei canali
  frequenza As Integer   ' Frequenza di campionamento
  byte_rate As Integer   ' Byte Rate per secondo (quantità di byte processati ogni secondo)
  bit As Short           ' Risoluzione di campionamento in bit
  dati As Byte[]         ' Dati grezzi del file wav
  durata As Float        ' Durata di esecuzione del file wav
End Struct


Public Sub Main()
 
 Dim datiwav As New INFOWAV
  
 datiwav.fileWav = "/percorso/del/file.wav"
  
 EstraeDatiAudio(datiwav)
  
' Mostra in console le informazioni ottenute:
 With datiwav
   Print "File wav caricato:             "; .fileWAV
   Print "Numero dei canali:             "; .canali
   Print "Frequenza di campionamento: hz "; .frequenza
   Print "Risoluzione:                   "; .bit; " bit"
   Print "Durata dell'esecuzione:        "; Str(Time(0, 0, 0, .durata * 1000))
 End With

End

Private Function EstraeDatiAudio(iw As INFOWAV)

 Dim fl As File
 Dim d As Short
 
' Carica il file audio Wav:
 fl = Open iw.fileWAV For Read

' Individua il numero del byte ove è posto il TAG wav "data":
 d = InStr(File.Load(iw.fileWAV), "data")

 iw.dati = New Byte[Lof(fl) - (d + 7)]
  
' Carica nel vettore di tipo Byte[] i soli dati audio grezzi, posti a cominciare dal 7° byte "offset" dopo il primo byte del TAG wav "data":
 Seek #fl, d + 7
 iw.dati.Read(fl, 0, Lof(fl) - (d + 7))

' Legge il numero dei canali al byte d'indice (offset) 22:
 Seek #fl, 22
 iw.canali = Read #fl As Short

' Legge la frequenza di campionamento dei dati audio al byte d'indice (offset) 24:
 iw.frequenza = Read #fl As Integer

' Legge il valore del "Byte Rate" al byte d'indice (offset) 28:
 iw.byte_rate = Read #fl As Integer

' Legge la risoluzione bit del campionamento al byte d'indice (offset) 34:
 Seek #fl, 34 
 iw.bit = Read #fl As Short

' Calcola la durata dell'esecuzione del file wav:  [Nota 2]
 iw.durata = iw.dati.Count / iw.byte_rate

 fl.Close

End


Note

[1] Vedi la seguente pagina: Accedere ai caratteri contenuti da una variabile di tipo stringa come se questa fosse una vettore

[2] Vedi la seguente pagina: Calcolare la durata di un file audio WAV