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 (via codice Gambas) l'intero primo blocco di intestazione al file avente dimensione inferiore;
- impostare (via codice Gambas) 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 fileWAV_1, fileWAV_2 As String
Dim fl As File
Dim ss1, ss2, ss3 As Short[]
Dim i As Integer
Dim he As Byte[]
fileWav_1 = "/percorso/del/primo/file.wav"
fileWAV_2 = "/percorso/del/secondo/file.wav"
' Individua la dimensione maggiore tra i due file wav:
i = Max(Stat(fileWAV_1).Size, Stat(fileWAV_2).Size)
' Assegna a entrambi i vettori di tipo "Short[]" la medesima dimensione di elementi pari a quella maggiore individuata tra i due file wav:
ss1 = New Short[i - 44]
ss2 = New Short[i - 44]
' Apre il 1° file wav e carica nel 1° vettore i soli dati audio grezzi:
fl = Open fileWAV_1 For Read
Seek #fl, 44
ss1.Read(fl, 0, (Lof(fl) - 44) / 2)
fl.Close
' Apre il 2° file wav e carica nel 2° vettore i soli dati audio grezzi:
fl = Open fileWAV_2 For Read
Seek #fl, 44
ss2.Read(fl, 0, (Lof(fl) - 44) / 2)
fl.Close
' Crea un terzo vettore (destinato a contenere i dati del file wav finale) assegnandogli la medesima dimensione di elementi pari a quella maggiore individuata tra i due file wav:
ss3 = New Short[ss1.Count]
For i = 0 To ss3.Max
' Somma le due onde e carica ciascun dato nel 3° vettore creato:
ss3[i] = CShort((CInt(ss1[i]) + CInt(ss2[i])) / 2)
Next
' Crea il blocco di intestazione del futuro file wav:
he = CreaBloccoIntestazione(ss3.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:
ss3.Write(fl, Stat("/tmp/nuovo.wav").Size, ss3.Count / 2)
' Va in chiusura:
fl.Close
he.Clear
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 As Integer
bb = Byte[].FromString(ini)
i = dati_grezzi + 36
' Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file:
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(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