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

Da Gambas-it.org - Wikipedia.
Riga 40: Riga 40:
 
   
 
   
 
   
 
   
   For i = 0 To bb1.Max Step 8  <FONT color=gray>' ''se si pone 4, si dividono stereofonicamente i due audio''</font>
+
   For i = 0 To bb1.Max
 
   
 
   
     If i < bb1.Max - 4 Then     <FONT color=gray>' ''se si pone 2, si dividono stereofonicamente i due audio''</font>
+
     If i < bb1.Max - 4 Then
      For k = 0 To 3
+
     
        dati_finali.Add(bb1[i + k])
+
      If i <= bb2.Max - 4 Then
      Next
+
        dati_finali.Add(bb1[i] + bb2[i])
    Endif
+
      Else
   
+
        dati_finali.Add(bb1[i])
    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])
+
    Endif
      Next
 
    Else
 
      For k = 0 To 3
 
        dati_finali.Add(0)
 
      Next
 
    Endif
 
 
   
 
   
 
   Next
 
   Next

Versione delle 13:58, 22 gen 2014

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 l'intero primo blocco di intestazione al file avente dimensione inferiore;
  • 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 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 bb, bb1, bb2 As Byte[]
 Dim dati_finali As New Byte[]
 Dim k As Byte
 Dim i As Integer
 Dim caput, file_grande, file_piccolo As String


  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)

' Creiamo il blocco di intestazione del futuro file wav:
  caput = bb.ToString(0, bb.Count)


' Prendiamo i soli dati audio grezzi del file wav di dimensione più grande fra i due:
  bb1 = Byte[].FromString(Right(File.Load(file_grande), Len(File.Load(file_grande)) - 44))

' Prendiamo i soli dati audio grezzi del file wav di dimensione inferiore fra i due:
  bb2 = Byte[].FromString(Right(File.Load(file_piccolo), Len(File.Load(file_piccolo)) - 44))


  For i = 0 To bb1.Max

    If i < bb1.Max - 4 Then
     
     If i <= bb2.Max - 4 Then
       dati_finali.Add(bb1[i] + bb2[i])
     Else
       dati_finali.Add(bb1[i])
     Endif
     
   Endif

  Next


' Crea il nuovo file wav con i due file originari fusi insieme:
  File.Save("/tmp/nuovo.wav", caput & dati_finali.ToString(0, dati_finali.Count))


' Va in chiusura:
  bb.Clear
  bb1.Clear
  bb2.Clear
  dati_finali.Clear

End