|
|
(5 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.Push(i2 And &FF)
| |
− | bb.Push(Shr(i2 And &FF00&, 8))
| |
− | bb.Push(Shr(i2 And &FF0000&, 16))
| |
− | bb.Push(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.Push(frequenza And &FF)
| |
− | bb.Push(Shr(frequenza And &FF00&, 8))
| |
− | bb.Push(Shr(frequenza And &FF0000&, 16))
| |
− | bb.Push(Shr(frequenza And &FF000000&, 24))
| |
− |
| |
− | <FONT color=gray>' ''Viene aggiunto il valore del "Byte rate per secondo":''</font>
| |
− | brps = frequenza * canali * (risoluzione / 8)
| |
− | bb.Push(brps And &FF)
| |
− | bb.Push(Shr(brps And &FF00&, 8))
| |
− | bb.Push(Shr(brps And &FF0000&, 16))
| |
− | bb.Push(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.Push(i And &FF)
| |
− | bb.Push(Shr(i And &FF00&, 8))
| |
− | bb.Push(Shr(i And &FF0000&, 16))
| |
− | bb.Push(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.Push(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.Push(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
| |
− | * http://www.gambas-it.org/wiki/index.php?title=Estrarre_informazioni_da_un_file_.wav
| |