Fondere insieme due file WAV: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| (28 versioni intermedie di uno stesso utente non sono mostrate) | |||
| Riga 1: | Riga 1: | ||
Per fondere (mischiare) due file audio di formato WAV con le sole funzioni di Gambas, bisognerà prestare cura ad almeno i seguenti aspetti: | 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 | * i due file da fondere devono avere uguale frequenza, uguale 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. | ||
Il risultato finale è una somma campione per campione, con eventuale normalizzazione per evitare ''clipping''. | |||
Di seguito un possibile semplice codice supponendo che i due file wav siano di formato con risoluzione di campionamento a 16bit con segno: | |||
Di seguito un possibile semplice codice | 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 = "<FONT Color=darkgreen>''/percorso/del/'''primo'''/file.wav''</font>" | |||
fileWAV_2 = "<FONT Color=darkgreen>''/percorso/del/'''secondo'''/file.wav''</font>" | |||
wav1 = fileWAV_1 | |||
wav2 = fileWAV_2 | |||
<FONT color=gray>' ''Individua la dimensione maggiore tra i due file wav:''</font> | |||
If Stat(fileWAV_2).Size > Stat(fileWAV_1).Size Then | |||
wav1 = fileWAV_2 | |||
wav2 = fileWAV_1 | |||
Endif | |||
<FONT color=gray>' ''Assegna a entrambi i vettori di tipo "Short[]" la medesima dimensione di elementi pari a quella maggiore individuata tra i due file wav.''</font> | |||
<FONT color=gray>' ''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.''</font> | |||
fl = Open wav1 For Read | |||
ss1 = New Short[Lof(fl) / SizeOf(gb.Short)] | |||
ss1.Read(fl, 0, ss1.Count) | |||
fl.Close | |||
<FONT color=gray>' '' | <FONT color=gray>' ''Apre il 2° file wav e lo carica nel 2° vettore:''</font> | ||
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 | |||
<FONT color=gray>' ''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:''</font> | |||
ss1[i] = CShort((CInt(ss1[i]) + CInt(ss2[i])) / 2) | |||
Next | |||
<FONT color=gray>' '' | fl = Open "/tmp/nuovo.wav" For Create | ||
<FONT color=gray>' ''Crea il nuovo file wav:''</font> | |||
ss1.Write(fl, 0, ss1.Count) | |||
fl.Close | |||
End | |||
Versione attuale delle 06:08, 26 lug 2025
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, uguale 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.
Il risultato finale è una somma campione per campione, con eventuale normalizzazione per evitare clipping.
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