Differenze tra le versioni di "Fondere insieme due file WAV"
Da Gambas-it.org - Wikipedia.
Riga 2: | Riga 2: | ||
* 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; | ||
− | * eliminare l'intero primo blocco di intestazione al file avente dimensione inferiore; | + | * eliminare (via codice Gambas) l'intero primo blocco di intestazione al file avente dimensione inferiore; |
− | * 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. | + | * 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: | Di seguito un possibile semplice codice supponendo che i due file wav siano a 2 canali e a 16bit: | ||
Riga 19: | Riga 18: | ||
fileWAV_2 = "<FONT Color=gray>''/percorso/del/secondo/file.wav''</font>" | fileWAV_2 = "<FONT Color=gray>''/percorso/del/secondo/file.wav''</font>" | ||
+ | <FONT color=gray>' ''Individua la dimensione maggiore tra i due file wav:''</font> | ||
+ | i = Max(Stat(fileWAV_1).Size, Stat(fileWAV_2).Size) | ||
+ | |||
+ | <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> | ||
+ | ss1 = New Short[i - 44] | ||
+ | ss2 = New Short[i - 44] | ||
+ | |||
+ | <FONT color=gray>' ''Apre il 1° file wav e carica nel 1° vettore i soli dati audio grezzi:''</font> | ||
fl = Open fileWAV_1 For Read | fl = Open fileWAV_1 For Read | ||
− | |||
Seek #fl, 44 | Seek #fl, 44 | ||
− | ss1.Read(fl, 0, | + | ss1.Read(fl, 0, (Lof(fl) - 44) / 2) |
fl.Close | fl.Close | ||
+ | <FONT color=gray>' ''Apre il 2° file wav e carica nel 2° vettore i soli dati audio grezzi:''</font> | ||
fl = Open fileWAV_2 For Read | fl = Open fileWAV_2 For Read | ||
− | |||
Seek #fl, 44 | Seek #fl, 44 | ||
− | ss2.Read(fl, 0, | + | ss2.Read(fl, 0, (Lof(fl) - 44) / 2) |
fl.Close | fl.Close | ||
− | ss3 = New Short[ | + | <FONT color=gray>' ''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:''</font> |
− | + | ss3 = New Short[ss1.Count] | |
− | For i = 0 To | + | |
− | <FONT color=gray>' ''Somma le due onde:''</font> | + | For i = 0 To ss3.Max |
+ | <FONT color=gray>' ''Somma le due onde e carica ciascun dato nel 3° vettore creato:''</font> | ||
ss3[i] = CShort((CInt(ss1[i]) + CInt(ss2[i])) / 2) | ss3[i] = CShort((CInt(ss1[i]) + CInt(ss2[i])) / 2) | ||
Next | Next |
Versione delle 19:14, 17 set 2022
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 Dim he As Byte[] 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) / 2) 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) / 2) 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: ss3 = New Short[ss1.Count] For i = 0 To ss3.Max ' Somma le due onde e carica ciascun dato nel 3° vettore creato: ss3[i] = CShort((CInt(ss1[i]) + CInt(ss2[i])) / 2) Next ' Crea il blocco di intestazione del futuro file wav: he = CreaBloccoIntestazione(ss3.Count) fl = Open "/tmp/nuovo.wav" For Create ' Crea il nuovo file wav: he.Write(fl, 0, he.Count) fl.Close fl = Open "/tmp/nuovo.wav" For Write Append ' Crea il nuovo file wav: ss3.Write(fl, Stat("/tmp/nuovo.wav").Size, ss3.Count / 2) ' Va in chiusura: fl.Close he.Clear ss1.Clear ss2.Clear End Private Function CreaBloccoIntestazione(dati_grezzi As Integer) as Byte[] Dim ini As String = "RIFF" Dim bh As Byte[] = [&57, &41, &56, &45, &66, &6D, &74, &20, &10, &00, &00, &00, &01, &00, &02, &00, &44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61] Dim bb As New Byte[] Dim i As Integer bb = Byte[].FromString(ini) i = dati_grezzi + 36 ' Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file: bb.Add(i And &FF) bb.Add(Shr(i And &FF00&, 8)) bb.Add(Shr(i And &FF0000&, 16)) bb.Add(Shr(i And &FF000000&, 24)) bb = bb.Insert(bh) ' Imposta il valore dimensionale di 4 byte a partire dal 41° byte del futuro file e relativo alla dimensione dei dati audio grezzi: bb.Add(dati_grezzi And &FF) bb.Add(Shr(dati_grezzi And &FF00&, 8)) bb.Add(Shr(dati_grezzi And &FF0000&, 16)) bb.Add(Shr(dati_grezzi And &FF000000&, 24)) Return bb End