Convertire un file soundfont bank sf2 in un file WAV con le sole risorse di Gambas

Da Gambas-it.org - Wikipedia.
Versione del 23 mag 2015 alle 20:30 di Vuott (Discussione | contributi) (Creata pagina con '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''). ...')

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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
   
  Write #wav, "RIFF"
 
  With bb = New Byte[1000]
    .Read(fl, 0, bb.Count)
    sh = InStr(.ToString(0, 1000), "sdtasmpl")
    .Clear
  End With

  Seek #fl, sh + 7
  i = Read #fl As Integer
  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

  With bb = New Byte[i]
    .Read(fl, 0, .Count)
    .Write(wav, 0, .Count)
  End With
   
  wav.Close
  fl.Close
  
  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