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;
- 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:
Public Sub Main()
Dim bb, bb1, bb2 As Byte[]
Dim dati_finali As New Byte[]
Dim i, k As Integer
Dim caput, file_grande, file_piccolo As String
file_grande = "/percorso/del/file.wav/più/grande/fra/i/due"
file_piccolo = "/percorso/del/file.wav/più/piccolo/fra/i/due"
bb = Byte[].FromString(File.Load(file_grande))
For i = 4 To 7
bb[i] = 0
Next
For i = 40 To 43
bb[i] = 0
Next
bb.Extract(44, bb.Count - 44)
' Creiamo il blocco di intestazione del futuro file wav:
caput = bb.ToString(0, bb.Count)
' Prendiamo i soli dati audio grezzi del file wav di dimensione più grande fra i due:
bb1 = Byte[].FromString(Right(File.Load(file_grande), Len(File.Load(file_grande)) - 44))
' Prendiamo i soli dati audio grezzi del file wav di dimensione inferiore fra i due:
bb2 = Byte[].FromString(Right(File.Load(file_piccolo), Len(File.Load(file_piccolo)) - 44))
For i = 0 To bb1.Max Step 8 ' se si pone 4, si dividono stereofonicamente i due audio
If i < bb1.Max - 4 Then ' se si pone 2, si dividono stereofonicamente i due audio
For k = 0 To 3
dati_finali.Add(bb1[i + k])
Next
Endif
If i < bb2.Max - 4 Then ' se si pone 2, si dividono stereofonicamente i due audio
For k = 0 To 3
dati_finali.Add(bb2[i + k])
Next
Else
For k = 0 To 3
dati_finali.Add(0)
Next
Endif
Next
' Crea il nuovo file wav con i due file originari fusi insieme:
File.Save("/tmp/nuovo.wav", caput & dati_finali.ToString(0, dati_finali.Count))
' Va in chiusura:
bb.Clear
bb1.Clear
bb2.Clear
dati_finali.Clear
End