Fondere insieme due file WAV: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 9: | Riga 9: | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Dim | Dim file_grande, file_piccolo As String | ||
Dim | Dim fl As File | ||
Dim | Dim ss1, ss2 As Short[] | ||
Dim i As Integer | Dim i As Integer | ||
Dim | Dim sh As Short | ||
Dim he As Byte[] | |||
| Riga 20: | Riga 21: | ||
file_piccolo = "''/percorso/del/file.wav/più/piccolo/fra/i/due''" | file_piccolo = "''/percorso/del/file.wav/più/piccolo/fra/i/due''" | ||
For i = | fl = Open file_grande For Read | ||
ss1 = New Short[(Stat(file_grande).Size - 44)] | |||
Seek #fl, 44 | |||
ss1.Read(fl, 0, ss1.Count / 2) | |||
fl.Close | |||
fl = Open file_piccolo For Read | |||
ss2 = New Short[(Stat(file_piccolo).Size - 44)] | |||
Seek #fl, 44 | |||
ss2.Read(fl, 0, ss2.Count / 2) | |||
fl.Close | |||
For i = 0 To ss1.Count / 2 | |||
<FONT color=gray>' ''Somma le due onde:''</font> | |||
ss1[i] = CShort((CInt(ss1[i] + ss2[i])) / 2) | |||
Next | Next | ||
<FONT color=gray>' ''Creiamo il blocco di intestazione del futuro file wav:''</font> | <FONT color=gray>' ''Creiamo il blocco di intestazione del futuro file wav:''</font> | ||
he = CreaBloccoIntestazione(ss1.Count) | |||
fl = Open "/tmp/nuovo.wav" For Create | |||
<FONT color=gray>' '' | <FONT color=gray>' ''Crea il nuovo file wav:''</font> | ||
he.Write(fl, 0, he.Count) | |||
fl.Close | |||
fl = Open "/tmp/nuovo.wav" For Write Append | |||
<FONT color=gray>' ''Crea il nuovo file wav:''</font> | |||
ss1.Write(fl, Stat("/tmp/nuovo.wav").Size, ss1.Count / 2) | |||
<FONT color=gray>' ''Va in chiusura:''</font> | |||
fl.Close | |||
ss1.Clear | |||
ss2.Clear | |||
'''End''' | |||
'''Private''' Function CreaBloccoIntestazione(dati_grezzi As Integer) as Byte[] | |||
Dim ini As String = "RIFF" | |||
Dim bh As Byte[] = [&57, &41, &56, &45, &66, &6D, &74, &20, &10, &00, &00, &00, &01, &00, &02, &00, | |||
&44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61] | |||
Dim bb As New Byte[] | |||
Dim i, i2 As Integer | |||
bb = Byte[].FromString(ini) | |||
i2 = dati_grezzi + 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)) | |||
bb = bb.Insert(bh) | |||
<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(dati_grezzi And &FF) | |||
bb.Add(Shr(dati_grezzi And &FF00&, 8)) | |||
bb.Add(Shr(dati_grezzi And &FF0000&, 16)) | |||
bb.Add(Shr(dati_grezzi And &FF000000&, 24)) | |||
Return bb | |||
'''End''' | '''End''' | ||
Versione delle 17:01, 29 gen 2014
Per fondere (mischiare) due file audio di formato WAV con le sole funzioni di Gambas, bisognerà prestare cura ad almeno i seguenti aspetti:
- i due file da fondere devono avere uguale frequenza e risoluzione di campionamento ed uguale numero di canali;
- eliminare l'intero primo blocco di intestazione al file avente dimensione inferiore;
- azzerare oppure impostare i nuovi corretti valori che indicano le dimensioni del file wav, presenti nei byte n. 4, 5, 6, 7 e nei byte n. 40, 41, 42, 43 dell'header del file wav finale.
Di seguito un possibile semplice codice supponendo che i due file wav siano a 2 canali e a 16bit:
Public Sub Main()
Dim file_grande, file_piccolo As String
Dim fl As File
Dim ss1, ss2 As Short[]
Dim i As Integer
Dim sh As Short
Dim he As Byte[]
file_grande = "/percorso/del/file.wav/più/grande/fra/i/due"
file_piccolo = "/percorso/del/file.wav/più/piccolo/fra/i/due"
fl = Open file_grande For Read
ss1 = New Short[(Stat(file_grande).Size - 44)]
Seek #fl, 44
ss1.Read(fl, 0, ss1.Count / 2)
fl.Close
fl = Open file_piccolo For Read
ss2 = New Short[(Stat(file_piccolo).Size - 44)]
Seek #fl, 44
ss2.Read(fl, 0, ss2.Count / 2)
fl.Close
For i = 0 To ss1.Count / 2
' Somma le due onde:
ss1[i] = CShort((CInt(ss1[i] + ss2[i])) / 2)
Next
' Creiamo il blocco di intestazione del futuro file wav:
he = CreaBloccoIntestazione(ss1.Count)
fl = Open "/tmp/nuovo.wav" For Create
' Crea il nuovo file wav:
he.Write(fl, 0, he.Count)
fl.Close
fl = Open "/tmp/nuovo.wav" For Write Append
' Crea il nuovo file wav:
ss1.Write(fl, Stat("/tmp/nuovo.wav").Size, ss1.Count / 2)
' Va in chiusura:
fl.Close
ss1.Clear
ss2.Clear
End
Private Function CreaBloccoIntestazione(dati_grezzi As Integer) as Byte[]
Dim ini As String = "RIFF"
Dim bh As Byte[] = [&57, &41, &56, &45, &66, &6D, &74, &20, &10, &00, &00, &00, &01, &00, &02, &00,
&44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61]
Dim bb As New Byte[]
Dim i, i2 As Integer
bb = Byte[].FromString(ini)
i2 = dati_grezzi + 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))
bb = bb.Insert(bh)
' 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(dati_grezzi And &FF)
bb.Add(Shr(dati_grezzi And &FF00&, 8))
bb.Add(Shr(dati_grezzi And &FF0000&, 16))
bb.Add(Shr(dati_grezzi And &FF000000&, 24))
Return bb
End