Differenze tra le versioni di "Creare il blocco d'intestazione di un file WAV"

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Il blocco di intestazione (''header'') di un file WAV è posto all'inizio del file, solitamente formato da 44 byte, e contiene le informazioni generali sui dati audio e sul file medesimo.
+
#REDIRECT [[Creare il blocco d'intestazione di un file WAV avendo dati audio grezzi]]
 
 
Per poter creare un blocco d'inteztazione di un file ''wav'', è necessario tenere conto dei suoi elementi fondamentali:
 
* quantità dei dati audio grezzi (in byte);
 
* frequenza di campionamento (in hertz);
 
* risoluzione di campionamento (in bit);
 
* numero dei canali di uscita.
 
<BR>Da questi elementi principali è possibile individuare e quindi porre nel blocco di intestazione del file ''wav'' anche gli altri valori che lo compongono.
 
 
 
 
 
Mostriamo due modalità.
 
 
 
===1<SUP>a</sup> modalità===
 
Nell'esempio che segue, supporremo che i dati audio grezzi, passati alla ''Procedura'' mediante una variabile di tipo ''Stringa'' come argomento, siano stati acquisiti in precedenza da un file avente le seguenti caratteristiche: 44100 hertz, 16 bit, 2 canali. Si creerà un completo nuovo file WAV unendo il corretto blocco d'intestazione (''header'') a tali dati grezzi.
 
<BR>Il procedimento del codice mostra l'inserimento passo-passo di ciascun elemento previsto dal blocco header del file wav. Gli elementi non fondamentali verranno per lo più ricavati dai valori degli elementi fondamenti prima sopra elencati.
 
'''Private''' Procedure CreaHeaderWav(<FONT Color=#B22222>dati_grezzi</font> As String)
 
 
  Dim fl As File
 
  Dim ini As String
 
  Dim bh, bb As New Byte[]
 
  Dim canali, risoluzione, blal as Byte
 
  Dim i, i2, frequenza, brps As Integer
 
 
<FONT color=gray>' ''Vengono definiti gli elementi fondamentali del blocco d'intestazione del file wav:''</font>
 
  canali = 2
 
  frequenza = 44100
 
  risoluzione = 16
 
 
  fl = Open "<FONT color=gray>''/percorso/di/destinazione/del/nuovo/file.wav''</font>" For Create
 
 
  ini = "RIFF"
 
 
  bb = Byte[].FromString(ini)
 
 
  i = Len(<FONT Color=#B22222>dati_grezzi</font>)
 
 
  i2 = i + 36
 
 
<FONT color=gray>' ''Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file:'' </font>
 
  bb.Add(i2 And &FF)
 
  bb.Add(Shr(i2 And &FF00&, 8))
 
  bb.Add(Shr(i2 And &FF0000&, 16))
 
  bb.Add(Shr(i2 And &FF000000&, 24))
 
 
<FONT color=gray>' ''Vengono aggiunti: il tipo di formato di file e l'identificativo del formato del blocco dei dati audio:'' </font>
 
  bb.Insert(bh.FromString("WAVEfmt "))
 
 
 
<FONT color=gray>' ''Viene aggiunto il valore della lunghezza dei dati del formato (in questo caso il PCM):'' </font>
 
  bh = [&10, &00, &00, &00]
 
  bb.Insert(bh)
 
 
<FONT color=gray>' ''Viene aggiunto il valore del formato audio (1 = PCM):''</font>
 
  bb.Insert(bh.FromString(Chr(&01) & Chr(&00)))
 
 
<FONT color=gray>' ''Viene aggiunto il numero dei canali di uscita:''</font>
 
  bb.Insert(bh.FromString(Chr(canali) & Chr(&00)))
 
 
<FONT color=gray>' ''Viene aggiunto il valore della frequenza di campionamento:''</font>
 
  bb.Add(frequenza And &FF)
 
  bb.Add(Shr(frequenza And &FF00&, 8))
 
  bb.Add(Shr(frequenza And &FF0000&, 16))
 
  bb.Add(Shr(frequenza And &FF000000&, 24))
 
 
<FONT color=gray>' ''Viene aggiunto il valore del "Byte rate per secondo":''</font>
 
  brps = frequenza * canali * (risoluzione / 8)
 
  bb.Add(brps And &FF)
 
  bb.Add(Shr(brps And &FF00&, 8))
 
  bb.Add(Shr(brps And &FF0000&, 16))
 
  bb.Add(Shr(brps And &FF000000&, 24))
 
 
<FONT color=gray>' ''Viene aggiunto il valore del "Block Align":''</font>
 
  blal = canali * risoluzione / 8
 
  bb.Insert(bh.FromString(Chr(blal) & Chr(&00)))
 
 
<FONT color=gray>' ''Viene aggiunto il valore della risoluzione di campionamento:''</font>
 
  bb.Insert(bh.FromString(Chr(risoluzione) & Chr(&00)))
 
 
<FONT color=gray>' ''Viene aggiunto l'identificativo del Blocco dei dati audio grezzi:''</font>
 
  bb.Insert(bh.FromString("data"))
 
 
<FONT color=gray>' ''Imposta il valore dimensionale di 4 byte a partire dal 41° byte del futuro file''
 
' ''e relativo alla dimensione dei dati audio grezzi:'' </font>
 
  bb.Add(i And &FF)
 
  bb.Add(Shr(i And &FF00&, 8))
 
  bb.Add(Shr(i And &FF0000&, 16))
 
  bb.Add(Shr(i And &FF000000&, 24))
 
   
 
  bb.Insert(Byte[].FromString(dati_grezzi))
 
   
 
<FONT color=gray>' ''Crea il nuovo file wav:'' </font>
 
  bb.Write(fl, 0, bb.Count)
 
 
  fl.Close
 
 
'''End'''
 
 
 
 
 
===2<SUP>a</sup> modalità===
 
'''Private''' Procedure CreaHeaderWav(<FONT Color=#B22222>dati_grezzi</font> As String)
 
 
 
  Dim Ipw, dim_file, m8 As Integer
 
  Dim j As Byte
 
  Dim a As New Byte[]
 
  Dim dati, little_endian, primo_chunk, $prewav As String
 
 
 
  dati = File.Load(dati_grezzi)
 
 
 
<FONT color=gray>' ''Ricaviamo la dimensione del file temporaneo contenente i dati audio grezzi:''</font>
 
  Ipw = Len(dati)
 
 
<FONT color=gray>' ''Ricaviamo la dimensione totale del futuro file. Essa sarà, dunque, data dai byte del primo blocco ("Chunk")''
 
' ''(contenente le informazioni sul file WAV ed i dati che lo distinguono ed identificano) pari a 44 byte più i dati audio grezzi del file temporaneo,''
 
' ''i quali così vengono a formare il secondo blocco di dati del futuro file WAV.''</font>
 
  dim_file = 44 + Ipw
 
 
 
<FONT color=gray>' ''Ricaviamo il formato "little-endian" dellla dimensione del file meno gli otto byte iniziali. Il risultato sarà inserito dal 5° all'8° byte:''</font>
 
  m8 = dim_file - 8
 
   
 
  little_endian = Hex(((m8 \ CInt(2 ^ 24)) And &FF) Or ((m8 * CInt(2 ^ 8)) And &FF0000) Or ((m8 \ CInt(2 ^ 8)) And &FF00&) Or ((m8 * CInt(2 ^ 24)) And &FF000000), 8)
 
   
 
  For j = 0 To 3
 
    a.Add(CByte(Val("&" & Mid(little_endian, (2 * j) + 1, 2))))
 
  Next
 
 
<FONT color=gray>' ''Quindi ricaviamo il formato "little-endian" della dimensione del file temporaneo dei dati audio grezzi.''
 
' ''Il risultato sarà inserito alla fine del primo blocco (chunk):''</font>
 
  little_endian = Hex(((Ipw \ CInt(2 ^ 24)) And &FF) Or ((Ipw * CInt(2 ^ 8)) And &FF0000) Or ((Ipw \ CInt(2 ^ 8)) And &FF00&) Or ((Ipw * CInt(2 ^ 24)) And &FF000000), 8)
 
 
  For j = 0 To 3
 
    a.Add(CByte(Val("&" & Mid(little_endian, (2 * j) + 1, 2))))
 
  Next
 
 
 
<FONT color=gray>' ''Impostiamo i dati appartenenti al primo blocco del futuro file WAV":''</font>
 
  primo_chunk = "RIFF" & Chr(a[0]) & Chr(a[1]) & Chr(a[2]) & Chr(a[3]) & "WAVEfmt" & Chr(&20) & Chr(&10) & Chr(&00) & Chr(&00) & Chr(&00)
 
  primo_chunk &= Chr(&01) & Chr(&00) & Chr(&02) & Chr(&00) & Chr(&44) & Chr(&AC) & Chr(&00) & Chr(&00) & Chr(&10) & Chr(&B1) & Chr(&02)
 
  primo_chunk &= Chr(&00) & Chr(&04) & Chr(&00) & Chr(&10) & Chr(&00) & "data" & Chr(a[4]) & Chr(a[5]) & Chr(a[6]) & Chr(a[7])
 
   
 
<FONT color=gray>' ''Ecco, dunque, creiamo il file WAV finale unendo il primo blocco dei dati informativi''
 
' ''e caratterizzanti il file WAV con i dati audio grezzi del file temporaneo":''</font>
 
  File.Save("<FONT color=gray>''/percorso/del/definitivo/file.wav''</font>", primo_chunk & dati)
 
 
'''End'''
 
 
 
 
 
 
 
 
 
=Riferimenti=
 
* http://www.topherlee.com/software/pcm-tut-wavformat.html
 
* http://unusedino.de/ec64/technical/formats/wav.html
 

Versione attuale delle 16:27, 13 set 2022