Differenze tra le versioni di "Fondere insieme due file WAV"
Da Gambas-it.org - Wikipedia.
(15 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 e risoluzione di campionamento ed uguale numero di canali; | * 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: | |
− | Di seguito un possibile semplice codice supponendo che i due file wav siano | + | Public Sub Main() |
− | |||
− | Dim fileWAV_1, fileWAV_2 As String | + | Dim fileWAV_1, fileWAV_2, wav1, wav2 As String |
Dim fl As File | Dim fl As File | ||
− | Dim ss1, ss2 As Short[] | + | Dim ss1, ss2 As '''Short'''[] |
Dim i As Integer | 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>' '' | + | <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>' ''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> | <FONT color=gray>' ''Crea il nuovo file wav:''</font> | ||
− | + | ss1.Write(fl, 0, ss1.Count) | |
− | + | fl.Close | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | End |
Versione attuale delle 14:53, 18 giu 2024
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