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;
- il blocco d'intestazione del nuovo file wav ottenuto deve essere corrispondente a quello del file wav avente la maggiore quantità di dati audio fra i due file da fondere.
Di seguito un possibile semplice codice supponendo che i due file wav siano di formato con risoluzione di campionamento a 16bit con segno:
Public Sub Main() Dim fileWAV_1, fileWAV_2, wav1, wav2 As String Dim fl As File Dim ss1, ss2 As Short[] Dim i As Integer fileWav_1 = "/percorso/del/primo/file.wav" fileWAV_2 = "/percorso/del/secondo/file.wav" wav1 = fileWAV_1 wav2 = fileWAV_2 ' Individua la dimensione maggiore tra i due file wav: If Stat(fileWAV_2).Size > Stat(fileWAV_1).Size Then wav1 = fileWAV_2 wav2 = fileWAV_1 Endif ' Assegna a entrambi i vettori di tipo "Short[]" la medesima dimensione di elementi pari a quella maggiore individuata tra i due file wav. ' Apre il 1° file wav e lo carica nel 1° vettore. ' Il vettore "ss1" è sempre quello contenente i dati del file wav di dimensione maggiore fra i due file. fl = Open wav1 For Read ss1 = New Short[Lof(fl) / SizeOf(gb.Short)] ss1.Read(fl, 0, ss1.Count) fl.Close ' Apre il 2° file wav e lo carica nel 2° vettore: fl = Open wav2 For Read ss2 = New Short[ss1.count] ss2.Read(fl, 0, Lof(fl) / SizeOf(gb.Short)) fl.Close For i = 0 To (44 / SizeOf(gb.Short)) To ss1.Max ' Somma le due onde e carica ciascun dato a cominciare dal byte d'indice 44, individuandolo tenuto conto della risoluzione a 16-bit del file wav: ss1[i] = CShort((CInt(ss1[i]) + CInt(ss2[i])) / 2) Next fl = Open "/tmp/nuovo.wav" For Create ' Crea il nuovo file wav: ss1.Write(fl, 0, ss1.Count) fl.Close End