Differenze tra le versioni di "Fondere insieme due file WAV"

Da Gambas-it.org - Wikipedia.
 
(27 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 unire 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;
+
* 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.
* azzerare oppure 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 primo file.
 
  
 
+
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()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim bb, bb1, bb2 As Byte[]
+
   Dim fileWAV_1, fileWAV_2, wav1, wav2 As String
   Dim dati_finali As New Byte[]
+
   Dim fl As File
  Dim i, k As Integer
+
   Dim ss1, ss2 As '''Short'''[]
   Dim caput, file_grande, file_piccolo As String
+
  Dim i As Integer
 
 
  file_grande = "''/percorso/del/file.wav/più/grande/fra/i/due''"
 
 
  file_piccolo = "''/percorso/del/file.wav/più/piccolo/fra/i/due''"
 
 
 
  bb = Byte[].FromString(File.Load(file_grande))
 
  For i = 4 To 7
 
    bb[i] = 0
 
  Next
 
  For i = 40 To 43
 
    bb[i] = 0
 
  Next
 
  bb.Extract(44, bb.Count - 44)
 
 
<FONT color=gray>' ''Creiamo il blocco di intestazione del futuro file wav:''</font>
 
  caput = bb.ToString(0, bb.Count)
 
 
 
<FONT color=gray>' ''Prendiamo i soli dati audio grezzi del file wav di dimensione più grande fra i due:''</font>
 
  bb1 = Byte[].FromString(Right(File.Load(file_grande), Len(File.Load(file_grande)) - 44))
 
 
<FONT color=gray>' ''Prendiamo i soli dati audio grezzi del file wav di dimensione inferiore fra i due:''</font>
 
  bb2 = Byte[].FromString(Right(File.Load(file_piccolo), Len(File.Load(file_piccolo)) - 44))
 
 
   
 
   
 +
  fileWav_1 = "<FONT Color=gray>''/percorso/del/'''primo'''/file.wav''</font>"
 
   
 
   
  For i = 0 To bb1.Max Step 8  <FONT color=gray>' ''se si pone 4, si dividono stereofonicamente i due audio''</font>
+
  fileWAV_2 = "<FONT Color=gray>''/percorso/del/'''secondo'''/file.wav''</font>"
 
   
 
   
    If i < bb1.Max - 4 Then    <FONT color=gray>' ''se si pone 2, si dividono stereofonicamente i due audio''</font>
+
  wav1 = fileWAV_1
      For k = 0 To 3
+
  wav2 = fileWAV_2
        dati_finali.Add(bb1[i + k])
+
<FONT color=gray>' ''Individua la dimensione maggiore tra i due file wav:''</font>
      Next
+
  If Stat(fileWAV_2).Size > Stat(fileWAV_1).Size Then
    Endif
+
    wav1 = fileWAV_2
   
+
    wav2 = fileWAV_1
    If i < bb2.Max - 4 Then    <FONT color=gray>' ''se si pone 2, si dividono stereofonicamente i due audio''</font>
+
  Endif
      For k = 0 To 3
 
        dati_finali.Add(bb2[i + k])
 
      Next
 
    Else
 
      For k = 0 To 3
 
        dati_finali.Add(0)
 
      Next
 
    Endif
 
 
   
 
   
  Next
+
<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>' ''Crea il nuovo file wav con i due file originari fusi insieme:''</font>
+
  <FONT color=gray>' ''Apre il file wav e lo carica nel 2° vettore:''</font>
  File.Save("/tmp/nuovo.wav", caput & dati_finali.ToString(0, dati_finali.Count))
+
  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>' ''Va in chiusura:''</font>
+
  fl = Open "/tmp/nuovo.wav" For Create
  bb.Clear
+
  <FONT color=gray>' ''Crea il nuovo file wav:''</font>
  bb1.Clear
+
  ss1.Write(fl, 0, ss1.Count)
  bb2.Clear
+
  fl.Close
  dati_finali.Clear
 
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione attuale delle 19:05, 18 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;
  • 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