Differenze tra le versioni di "Estrarre da un file WAV i soli dati audio grezzi"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
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.
+
#REDIRECT [[Estrarre_da_un_file_WAV_i_dati_audio_grezzi_mediante_le_sole_risorse_di_Gambas]]
 
 
Ne mostriamo alcuni:
 
'''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")
 
 
 
<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)
 
 
 
  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 fl, ex As File
 
  Dim d As Short
 
  Dim bb As Byte[]
 
 
 
  fileWAV = "''/percorso/del/file.wav''"
 
 
<FONT color=gray>' ''Carica un file audio Wav:''</font>
 
  fl = Open fileWAV For Read
 
 
 
  d = InStr(File.Load(fileWAV), "data")
 
 
 
  bb = New Byte[Stat(fileWAV).Size - (d + 7)]
 
 
<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>
 
  bb.Write(ex)
 
 
 
 
<FONT color=gray>' ''Va in chiusura:''</font>
 
  ex.Close
 
 
 
  fl.Close
 
 
 
'''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      <FONT Color=gray>' ''Percorso del file wav</font>
 
  canali As Short        <FONT Color=gray>' ''Numero dei canali</font>
 
  frequenza As Integer  <FONT Color=gray>' ''Frequenza di campionamento</font>
 
  bit As Short          <FONT Color=gray>' ''Risoluzione di campionamento in bit</font>
 
  block_align As Short  <FONT Color=gray>' ''Block Align</font>
 
  durata As Float        <FONT Color=gray>' ''Durata di esecuzione del file wav</font>
 
  sonora As Byte[]      <FONT Color=gray>' ''Dati grezzi del file wav</font>
 
End Struct
 
 
 
'''Public''' Sub Main()
 
 
  Dim fileWav As String
 
  Dim datiwav As New INFOWAV
 
 
 
  datiwav.fileWav = "''/percorso/del/file.wav''"
 
 
 
  EstraeDatiAudio(datiwav)
 
 
 
<FONT Color=gray>' ''Mostra in console le informazioni ottenute:</font>
 
  With datiwav
 
    Print "File wav caricato:";; .fileWAV
 
    Print "Numero canali:";; .canali
 
    Print "Frequenza di campionamento: hz";; .frequenza
 
    Print "Risoluzione:";; .bit;; "bit"
 
    Print "Durata esecuzione:";; CStr(Date(0, 0, 0, 0, 0, 0, .durata * 1000))
 
  End With
 
 
'''End'''
 
 
 
'''Private''' Function EstraeDatiAudio(iw As INFOWAV)
 
 
  Dim fl As File
 
  Dim d As Short
 
 
 
<FONT Color=gray>' ''Carica il file audio Wav:</font>
 
  fl = Open iw.fileWAV For Read
 
 
<FONT Color=gray>' ''Individua il numero del byte ove è posto il TAG wav "data":''</font>
 
  d = InStr(File.Load(iw.fileWAV), "data")
 
 
  iw.sonora = 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>
 
  Seek #fl, d + 7
 
  iw.sonora.Read(fl, 0, Lof(fl) - (d + 7))
 
 
<FONT Color=gray>' ''Legge il numero dei canali al byte d'indice (offset) 22:''</font>
 
  Seek #fl, 22
 
  iw.canali = Read #fl As Short
 
 
<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
 
 
<FONT Color=gray>' ''Legge il valore del "block align" al byte d'indice (offset) 32:''</font>
 
  Seek #fl, 32
 
  iw.block_align = Read #fl As Short
 
 
<FONT Color=gray>' ''Legge la risoluzione bit del campionamento al byte d'indice (offset) 34:''</font>
 
  Seek #fl, 34
 
  iw.bit = Read #fl As Short
 
 
<FONT Color=gray>' ''Calcola la durata dell'esecuzione del file wav:''</font>
 
  iw.durata = (iw.sonora.Count / iw.block_align) / iw.frequenza
 
 
  fl.Close
 
 
'''End'''
 

Versione attuale delle 19:30, 10 ago 2019