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

Da Gambas-it.org - Wikipedia.
Riga 10: Riga 10:
  
 
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.
 
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)
 
  '''Private''' Procedure CreaHeaderWav(<FONT Color=#B22222>dati_grezzi</font> As String)
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
   Dim ini As String
 
   Dim ini As String
   Dim bh As Byte[] = [&57, &41, &56, &45, &66, &6D, &74, &20, &10, &00, &00, &00, &01, &00, &02, &00,
+
   Dim bh As Byte[] = [&44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61]
                      &44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61]
 
 
   Dim bb As New Byte[]
 
   Dim bb As New Byte[]
   Dim i, i2 As Integer
+
  Dim canali, bit, blal as Byte
 +
   Dim i, i2, freq, brps As Integer
 
   
 
   
 +
  canali = 2
 +
  freq = 44100
 +
  bit = 16
 
   
 
   
 
   fl = Open "''/percorso/di/destinazione/del/nuovo/file.wav''" For Create
 
   fl = Open "''/percorso/di/destinazione/del/nuovo/file.wav''" For Create
Riga 36: Riga 40:
 
   bb.Add(Shr(i2 And &FF000000&, 24))
 
   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 = bb.Insert(bh.FromString("WAVEfmt "))
 +
  bh.Clear
 
   
 
   
 +
<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 = bb.Insert(bh)
 
   bb = bb.Insert(bh)
 +
 +
<FONT color=gray>' ''Viene aggiunto il valore del formato audio (1 = PCM):''</font>
 +
  bb = bb.Insert(bh.FromString(Chr(&01) & Chr(&00)))
 +
 +
<FONT color=gray>' ''Viene aggiunto il numero dei canali di uscita:''</font>
 +
  bb = bb.Insert(bh.FromString(Chr(canali) & Chr(&00)))
 +
 +
<FONT color=gray>' ''Viene aggiunto il valore della frequenza di campionamento:''</font>
 +
  bb.Add(freq And &FF)
 +
  bb.Add(Shr(freq And &FF00&, 8))
 +
  bb.Add(Shr(freq And &FF0000&, 16))
 +
  bb.Add(Shr(freq And &FF000000&, 24))
 +
 +
<FONT color=gray>' ''Viene aggiunto il valore del "Byte rate per secondo":''</font>
 +
  brps = freq * canali * (bit / 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 * bit / 8
 +
  bb = bb.Insert(bh.FromString(Chr(blal) & Chr(&00)))
 +
 +
<FONT color=gray>' ''Viene aggiunto il valore della risoluzione di campionamento:''</font>
 +
  bb = bb.Insert(bh.FromString(Chr(bit) & Chr(&00)))
 +
 +
<FONT color=gray>' ''Viene aggiunto l'identificativo del Blocco dei dati audio grezzi:''</font>
 +
  bb = bb.Insert(bh.FromString("data"))
 
   
 
   
 
  <FONT color=gray>' ''Imposta il valore dimensionale di 4 byte a partire dal 41° byte del futuro file''
 
  <FONT color=gray>' ''Imposta il valore dimensionale di 4 byte a partire dal 41° byte del futuro file''

Versione delle 16:59, 19 mag 2015

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.

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.


Da questi elementi principali è possibile individuare e quindi porre nel blocco di intestazione del file wav anche gli altri valori che lo compongono.


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.
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(dati_grezzi As String)

 Dim fl As File
 Dim ini As String
 Dim bh As Byte[] = [&44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61]
 Dim bb As New Byte[]
 Dim canali, bit, blal as Byte
 Dim i, i2, freq, brps As Integer

  canali = 2
  freq = 44100
  bit = 16 

  fl = Open "/percorso/di/destinazione/del/nuovo/file.wav" For Create

  ini = "RIFF"

  bb = Byte[].FromString(ini)

  i = Len(dati_grezzi)

  i2 = i + 36

' Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file: 
  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))

' Vengono aggiunti: il tipo di formato di file e l'identificativo del formato del blocco dei dati audio: 
  bb = bb.Insert(bh.FromString("WAVEfmt "))
  bh.Clear

' Viene aggiunto il valore della lunghezza dei dati del formato (in questo caso il PCM): 
  bh = [&10, &00, &00, &00]
  bb = bb.Insert(bh)

' Viene aggiunto il valore del formato audio (1 = PCM):
  bb = bb.Insert(bh.FromString(Chr(&01) & Chr(&00)))

' Viene aggiunto il numero dei canali di uscita:
  bb = bb.Insert(bh.FromString(Chr(canali) & Chr(&00)))

' Viene aggiunto il valore della frequenza di campionamento:
  bb.Add(freq And &FF)
  bb.Add(Shr(freq And &FF00&, 8))
  bb.Add(Shr(freq And &FF0000&, 16))
  bb.Add(Shr(freq And &FF000000&, 24))

' Viene aggiunto il valore del "Byte rate per secondo":
  brps = freq * canali * (bit / 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))

' Viene aggiunto il valore del "Block Align":
  blal = canali * bit / 8
  bb = bb.Insert(bh.FromString(Chr(blal) & Chr(&00)))

' Viene aggiunto il valore della risoluzione di campionamento:
  bb = bb.Insert(bh.FromString(Chr(bit) & Chr(&00)))

' Viene aggiunto l'identificativo del Blocco dei dati audio grezzi:
  bb = bb.Insert(bh.FromString("data"))

' Imposta il valore dimensionale di 4 byte a partire dal 41° byte del futuro file
' e relativo alla dimensione dei dati audio grezzi: 
  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 = bb.Insert(Byte[].FromString(dati_grezzi))
   
' Crea il nuovo file wav: 
  bb.Write(fl, 0, bb.Count)

  fl.Close

End



Riferimenti