Individuare i nomi e le rispettive posizioni degli strumenti musicali in un file sf2 con le sole risorse di Gambas

Da Gambas-it.org - Wikipedia.
Versione del 21 mag 2015 alle 18:56 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 che possono essere successivamente manipolati dal calcolatore per generare le restanti frequenze sonore appartenenti a quel timbro originario.

Il file .sf2 è costituita, fra l'altro, da diversi blocchi comprendenti specifiche informazioni di carattere generale sul file stesso. In particolare il TAG denominato pdtaphdr contiene i nomi degli strumenti musicali e le rispettive posizioni all'interno del banco di suoni come vengono visualizzati dagli appositi programmi di gestione del file soundfont .sf2 .

L'esempio seguente mostra un possibile codice, con il quale estrarre dal blocco del blocco pdtaphdr i nomi e le rispettive posizioni degli strumenti musicali presenti nel file sf2.

Per ottenere questo risultato, bisognerà;

  • individuare il blocco pdtaphdr;
  • estrarre la dimensione del blocco pdtaphdr, che è rappresentata in Little-Endian dai 4 byte immediatamente successivi all'identificativo pdtaphdr (la dimensione è la quantità di byte dal primo byte successivo ai predetti 4 byte della dimensione del blocco fino all'identificativo del blocco pdag);
  • estrarre il nome di ciascuno strumento musicale e la rispettiva posizione all'interno del banco di suoni del file sf2, tenendo presente che immediatamente dopo i 4 byte della dimensione del blocco pdtaphdr, vi sono uno o più gruppi di 38 byte, contenenti all'inizio di ciascun gruppo il nome dello strumento musicale, nonché al 21° byte del gruppo la posizione dello strumento nel banco del file.


Public Sub Main()
    
 Dim fl As File
 Dim sf2, s As String
 Dim bb As Byte[]
 Dim i, j As Integer
 Dim ss, ss2 As New String[]
 Dim p As Pointer
      
  sf2 = "/percorso/del/file.sf2"
   
  fl = Open sf2 For Read
  If IsNull(fl) Then Error.Raise("Impossibile caricare il file '" & sf2 & " ' !")
   
  With bb = New Byte[Lof(fl)]
    .Read(fl, 0, Lof(fl))
    s = .ToString(0, bb.Count)
    If IsNull(s) then Error.Raise("Il file caricato non contiene dati !")
  End With
  bb.Clear
     
' Individua la posizione del TAG 'pdtaphdr':
  i = InStr(s, "pdtaphdr")
  If i = 0 Then Error.Raise("Impossibile trovare il TAG 'pdtaphdr' !")
   
' Individua la quantità di byte che compongono l'intero blocco del TAG 'pdtaphdr':
  Seek #fl, i + 7
  j = Read #fl As Integer

  j += i

' Raccoglie ad ogni ciclo 38 byte contenenti il nome dello strumento musicale (a cominciare dal primo di quei 38 byte),
' nonché la sua reale posizione nel banco degli strumenti (il numero della posizione è rintracciabile al 21° byte):
  While i < j
    With bb = New Byte[38]
      .Read(fl, 0, bb.Count)
      ss.Add(.ToString(0, bb.Count))
    End With 
    i += 38
  Wend

  fl.Close
   
  ss.Remove(ss.Max)

' Si procede a ordinare i nomi degli strumenti tenendo conto del valore rappresentato dal 21° byte del gruppo dei 38:
  ss2 = New String[ss.Count]
  For j = 0 To ss2.Max
     ss2[Asc(ss[j], 21)] = ss[j]
  Next

  Print "Strumenti compresi nel file banco: "; File.Name(sf2)
  Print  
   
' Vengono scritti in console i nomi degli strumenti e la loro posizione, utilizzando il Puntatore ai dati del vettore di tipo Stringa[].
' Si usa questa modalità per eliminare i dati non stampabili posti dopo il nome di ciascuno strumento.
  p = ss2.Data
       
  For j = 0 To ss2.Max
    s = String@(Pointer@(p))
    If IsNull(s) = False Then Print j;; s
    p = p + 8
  Next
   
End



Riferimenti