Differenze tra le versioni di "Convertire un file soundfont bank sf2 in un file WAV con le sole risorse di Gambas"

Da Gambas-it.org - Wikipedia.
Riga 3: Riga 3:
 
Il file contiene, dunque, dati audio di suoni campionati non compressi di formato PCM che possono essere successivamente manipolati dal calcolatore per generare le restanti frequenze sonore appartenenti a quel timbro originario.
 
Il file contiene, dunque, dati audio di suoni campionati non compressi di formato PCM che possono essere successivamente manipolati dal calcolatore per generare le restanti frequenze sonore appartenenti a quel timbro originario.
  
Il file .sf2 è costituito, oltre che dai blocchi contenenti specifiche informazioni di carattere generale sul file stesso, anche dal blocco denominato "''sdtasmpl''" contenente in sequenza i dati audio grezzi dei suoni campionati. Dopo l'identificativo "''sdtasmpl''" di tale blocco di dati vi sono quattro byte che in ordine ''Little-Endian'' specificano la dimensione in byte del blocco medesimo.
+
Il file .sf2 è costituito, oltre che dai blocchi contenenti specifiche informazioni di carattere generale sul file stesso, anche dal blocco denominato "''sdtasmpl'' " contenente in sequenza i dati audio grezzi dei suoni campionati. Dopo l'identificativo "''sdtasmpl''" di tale blocco di dati vi sono quattro byte che in ordine ''Little-Endian'' specificano la dimensione in byte del blocco medesimo.
 
 
  
 
Mostriamo un semplice codice per estrapolare i dati audio grezzi dei suoni campionati, contenuti dal predetto blocco "''sdtasmpl''", con i quali sarà creato un file WAV, eseguendo il quale, consentirà di udire uno dopo l'altro tutti i suoni campionati presenti nell'originario file sf2.
 
Mostriamo un semplice codice per estrapolare i dati audio grezzi dei suoni campionati, contenuti dal predetto blocco "''sdtasmpl''", con i quali sarà creato un file WAV, eseguendo il quale, consentirà di udire uno dopo l'altro tutti i suoni campionati presenti nell'originario file sf2.
Riga 15: Riga 14:
 
   Dim i, durata As Integer
 
   Dim i, durata As Integer
 
    
 
    
  sf2 = "''/percorso/del/file.sf2''"
+
  sf2 = "<FONT Color=gray>''/percorso/del/file.sf2''</font>"
 
    
 
    
  fl = Open sf2 For Read
+
  fl = Open sf2 For Read
 
      
 
      
  wav = Open "/tmp/test.wav" For Create
+
  wav = Open "/tmp/test.wav" For Create
 
      
 
      
 
  <FONT Color=gray>' ''Comincia a scrivere il blocco d'intestazione del futuro file wav:''</font>
 
  <FONT Color=gray>' ''Comincia a scrivere il blocco d'intestazione del futuro file wav:''</font>
  Write #wav, "RIFF"
+
  Write #wav, "RIFF"
 
    
 
    
 
  <FONT Color=gray>' ''Individua la posizione del file .sf2 dell'identificativo "sdtasmpl" dell'omonimo blocco:''</font>
 
  <FONT Color=gray>' ''Individua la posizione del file .sf2 dell'identificativo "sdtasmpl" dell'omonimo blocco:''</font>
  With bb = New Byte[1000]
+
  With bb = New Byte[1000]
    .Read(fl, 0, bb.Count)
+
    .Read(fl, 0, bb.Count)
    sh = InStr(.ToString(0, 1000), "sdtasmpl")
+
    sh = InStr(.ToString(0, 1000), "sdtasmpl")
    .Clear
+
    .Clear
  End With
+
  End With
 
   
 
   
 
  <FONT Color=gray>' ''Legge la dimensione in byte del blocco "sdtasmpl", ossia la quantità di dati audio grezzi dei suoni campionati di cui il blocco è costituito:''</font>
 
  <FONT Color=gray>' ''Legge la dimensione in byte del blocco "sdtasmpl", ossia la quantità di dati audio grezzi dei suoni campionati di cui il blocco è costituito:''</font>
  Seek #fl, sh + 7
+
  Seek #fl, sh + 7
  i = Read #fl As Integer
+
  i = Read #fl As Integer
 
   
 
   
 
  <FONT Color=gray>' ''Continua ad aggiungere altri elementi costituenti il blocco d'intestazione del futuro file wav:''</font>
 
  <FONT Color=gray>' ''Continua ad aggiungere altri elementi costituenti il blocco d'intestazione del futuro file wav:''</font>
  Write #wav, i + 36 As Integer
+
  Write #wav, i + 36 As Integer
  bb = New Byte[]
+
  bb = New Byte[]
  bb = [&57, &41, &56, &45, &66, &6D, &74, &20, 16, 0, 0, 0, 1, 0, 1, 0, &44, &AC, 0, 0, &88, &58, 1, 0, 2, 0, 16, 0, &64, &61, &74, &61]
+
  bb = [&57, &41, &56, &45, &66, &6D, &74, &20, 16, 0, 0, 0, 1, 0, 1, 0, &44, &AC, 0, 0, &88, &58, 1, 0, 2, 0, 16, 0, &64, &61, &74, &61]
  bb.Write(wav, 0, bb.Count)
+
  bb.Write(wav, 0, bb.Count)
  bb.Clear
+
  bb.Clear
 
      
 
      
  Write #wav, i As Integer
+
  Write #wav, i As Integer
 
   
 
   
 
  <FONT Color=gray>' ''Aggiunge in fine i byte relativi ai dati audio grezzi dei suoni campionati presenti nell'originario file .sf2:''</font>
 
  <FONT Color=gray>' ''Aggiunge in fine i byte relativi ai dati audio grezzi dei suoni campionati presenti nell'originario file .sf2:''</font>
  With bb = New Byte[i]
+
  With bb = New Byte[i]
    .Read(fl, 0, .Count)
+
    .Read(fl, 0, .Count)
    .Write(wav, 0, .Count)
+
    .Write(wav, 0, .Count)
  End With
+
  End With
 
      
 
      
  wav.Close
+
  wav.Close
  fl.Close
+
  fl.Close
 
    
 
    
 
  <FONT Color=gray>' ''Fornisce alcune informazioni generali sul file .sf2:''</font>
 
  <FONT Color=gray>' ''Fornisce alcune informazioni generali sul file .sf2:''</font>
  Print "File soundbank: "; sf2
+
  Print "File soundbank: "; sf2
  Print "Dimensione totale suoni campionati: "; i;; "byte"
+
  Print "Dimensione totale suoni campionati: "; i;; "byte"
  durata = (i * 8) \ 705600
+
  durata = (i * 8) \ 705600
  Print "Durata totale dei suoni campionati: "; Date(0, 0, 0, 0, 0, 0, durata * 1000)
+
  Print "Durata totale dei suoni campionati: "; Date(0, 0, 0, 0, 0, 0, durata * 1000)
 
   
 
   
 
  '''End'''
 
  '''End'''
 
  
  

Versione delle 06:37, 4 ott 2022

Un file banco di suoni di formato sf2 è semplicemente una libreria di suoni per la riproduzione di dati Midi che si basa su tabelle di suoni campionati (wavetable).

Il file contiene, dunque, dati audio di suoni campionati non compressi di formato PCM che possono essere successivamente manipolati dal calcolatore per generare le restanti frequenze sonore appartenenti a quel timbro originario.

Il file .sf2 è costituito, oltre che dai blocchi contenenti specifiche informazioni di carattere generale sul file stesso, anche dal blocco denominato "sdtasmpl " contenente in sequenza i dati audio grezzi dei suoni campionati. Dopo l'identificativo "sdtasmpl" di tale blocco di dati vi sono quattro byte che in ordine Little-Endian specificano la dimensione in byte del blocco medesimo.

Mostriamo un semplice codice per estrapolare i dati audio grezzi dei suoni campionati, contenuti dal predetto blocco "sdtasmpl", con i quali sarà creato un file WAV, eseguendo il quale, consentirà di udire uno dopo l'altro tutti i suoni campionati presenti nell'originario file sf2.

Public Sub Main()

 Dim sf2 As String
 Dim bb As Byte[]
 Dim fl, wav As File
 Dim sh As Short
 Dim i, durata As Integer
  
 sf2 = "/percorso/del/file.sf2"
 
 fl = Open sf2 For Read
   
 wav = Open "/tmp/test.wav" For Create
   
' Comincia a scrivere il blocco d'intestazione del futuro file wav:
 Write #wav, "RIFF"
 
' Individua la posizione del file .sf2 dell'identificativo "sdtasmpl" dell'omonimo blocco:
 With bb = New Byte[1000]
   .Read(fl, 0, bb.Count)
   sh = InStr(.ToString(0, 1000), "sdtasmpl")
   .Clear
 End With

' Legge la dimensione in byte del blocco "sdtasmpl", ossia la quantità di dati audio grezzi dei suoni campionati di cui il blocco è costituito:
 Seek #fl, sh + 7
 i = Read #fl As Integer

' Continua ad aggiungere altri elementi costituenti il blocco d'intestazione del futuro file wav:
 Write #wav, i + 36 As Integer
 bb = New Byte[]
 bb = [&57, &41, &56, &45, &66, &6D, &74, &20, 16, 0, 0, 0, 1, 0, 1, 0, &44, &AC, 0, 0, &88, &58, 1, 0, 2, 0, 16, 0, &64, &61, &74, &61]
 bb.Write(wav, 0, bb.Count)
 bb.Clear
   
 Write #wav, i As Integer

' Aggiunge in fine i byte relativi ai dati audio grezzi dei suoni campionati presenti nell'originario file .sf2:
 With bb = New Byte[i]
   .Read(fl, 0, .Count)
   .Write(wav, 0, .Count)
 End With
   
 wav.Close
 fl.Close
  
' Fornisce alcune informazioni generali sul file .sf2:
 Print "File soundbank: "; sf2
 Print "Dimensione totale suoni campionati: "; i;; "byte"
 durata = (i * 8) \ 705600
 Print "Durata totale dei suoni campionati: "; Date(0, 0, 0, 0, 0, 0, durata * 1000)

End


Riferimenti