Fondere insieme due file WAV
Vai alla navigazione
Vai alla ricerca
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;
- 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