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

Da Gambas-it.org - Wikipedia.

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 s As String
 Dim fl, wav As File
 Dim i As Integer
  
 s = "/percorso/del/file.sf2"
 
 fl = Open s For Read

' Individua la posizione del file .sf2 dell'identificativo "sdtasmpl" dell'omonimo blocco:
 i = InStr(File.Load(s), "sdtasmpl")

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

' Crea il futuro file wav:
 wav = Open "/tmp/test.wav" For Create

' Scrive il blocco d'intestazione del futuro file wav:
 Write #wav, "RIFF"
 Write #wav, i + 36 As Integer
 Write #wav, "WAVEfmt "
 Write #wav, 16 As Integer
 Write #wav, 1 As Short
 Write #wav, 1 As Short
 Write #wav, 44100 As Integer
 Write #wav, 176400 As Integer
 Write #wav, 2 As Short
 Write #wav, 16 As Short
 Write #wav, "data"
 Write #wav, i As Integer

' Legge i dati audio grezzi dei suoni campionati presenti nel file sf2 e li salva nel futuro file wav:
 Read #fl, s, -i
 Write #wav, s
   
 wav.Close
 fl.Close
  
' Fornisce alcune informazioni generali sul file .sf2:
 Print "File soundbank: "; sf2
 Print "Dimensione totale suoni campionati: "; i; " byte"
 Print "Durata totale dei suoni campionati: "; Time(0, 0, 0, (i \ 176400) * 1000)

End


Riferimenti