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 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) / SizeOf(gb.Short)) 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) / SizeOf(gb.Short)) 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 + 44 singoli byte del blocco d'intestazione del nuovo file wav: ss3 = New Short[ss1.Count + 44] ' Passa "per Indirizzo" alla funzione il 3° vettore, al fine di creare il blocco di intestazione del futuro file wav: CreaBloccoIntestazione(ss3) For i = 0 To (ss3.Max - 44) / SizeOf(gb.Short)) ' Somma le due onde e carica ciascun dato nel 3° vettore creato al byte d'indice 44, individuandolo tenuto conto della risoluzione a 16-bit del file wav: ss3[i + (44 / SizeOf(gb.Short)] = CShort((CInt(ss1[i]) + CInt(ss2[i])) / SizeOf(gb.Short)) Next fl = Open "/tmp/nuovo.wav" For Create ' Crea il nuovo file wav: ss3.Write(fl, 0, ss3.Count / SizeOf(gb.Short)) fl.Close End Private Function CreaBloccoIntestazione(vettore As Short[]) Dim st As Stream ' Per scrivere i dati del blocco d'intestazione del nuovo file wav, usa la risorsa "Memory Stream" operando nella'area di memoria restituita dalla proprietà ".Data" del 3° vettore: st = Memory vettore.Data For Write Write #st, "RIFF" ' Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file: Write #st, vettore.Count - 8 As Integer Write #st, "WAVEfmt " Write #st, 16 As Integer Write #st, 1 As Short Write #st, 2 As Short Write #st, 44100 As Integer Write #st, 176400 As Integer Write #st, 4 As Short Write #st, 16 As Short Write #st, "data" ' Imposta il valore dimensionale di 4 byte a partire dal 41° byte del futuro file e relativo alla dimensione dei dati audio grezzi: Write #st, vettore.Count - 44 As Integer st.Close End