Differenze tra le versioni di "Estrarre informazioni generali dai tag di un file soundfont bank sf2 con le sole funzioni di Gambas"

Da Gambas-it.org - Wikipedia.
Riga 8: Riga 8:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim filesf2, sf2, c As String
+
   Dim subchunk As String[][]
 +
  Dim sf2, s As String
 
   Dim bb As Byte[]
 
   Dim bb As Byte[]
   Dim scn As String[]
+
   Dim c, i As Integer
  Dim i, fine As Integer
+
  Dim subchunk As String[][]
 
 
 
 
  <FONT Color=gray>' ''Inseriamo i TAG ed il loro significato nelle dimensioni di una matrice bidimensionale:''</font>
 
  <FONT Color=gray>' ''Inseriamo i TAG ed il loro significato nelle dimensioni di una matrice bidimensionale:''</font>
 
   subchunk = [["INAM", "isng", "irom", "iver", "IPRD", "IENG", "ISFT", "ICRD", "ICMT", "ICOP", "LIST"],
 
   subchunk = [["INAM", "isng", "irom", "iver", "IPRD", "IENG", "ISFT", "ICRD", "ICMT", "ICOP", "LIST"],
 
               ["Nome banco SoundFont: ", "Ottimizzato per: ", "Riferimento dati ROM: ", "Revisione dati ROM: ", "Soundfont destinato a: ", "Autori del SoundFont: ", "Realizzato con: ", "Data di creazione: ", "Commenti: ", "Copyright: "]]
 
               ["Nome banco SoundFont: ", "Ottimizzato per: ", "Riferimento dati ROM: ", "Revisione dati ROM: ", "Soundfont destinato a: ", "Autori del SoundFont: ", "Realizzato con: ", "Data di creazione: ", "Commenti: ", "Copyright: "]]
 
      
 
      
   filesf2 = "<FONT Color=gray>''/percorso/del/file.sf2''</font>"
+
   sf2 = "<FONT Color=gray>''/percorso/del/file.sf2''</font>"
   sf2 = File.Load(filesf2)
+
   s = File.Load(f2)
   If (Left(sf2, 4) <> "RIFF") And (Mid(sf2, 9, 4) <> "sbk") Then Error.Raise("Il file non è un formato 'sf2' !")
+
   If (Left(s, 4) <> "RIFF") And (s[9, 4] <> "sbk") Then Error.Raise("Il file non è un formato 'sf2' !")
 +
  Print "Percorso del file: ", sf2
 +
  Print "Dimensione:        ", s.Len; " byte\n"
 
   
 
   
<FONT Color=gray>' ''Individua la parte iniziale del file da sottoporre a verifica:''</font>
+
   bb = Byte[].FromString(s)
  fine = InStr(sf2, "sdtasmpl")
+
 
   bb = Byte[].FromString(Left(sf2, fine))
+
  For c = 0 To subchunk[0].Max
+
  <FONT Color=gray>' ''Verifica l'eventuale presenza di ciascun TAG:''</font>
  <FONT Color=gray>' ''Elimina i caratteri non stampabili:''</font>
+
    i = InStr(s, subchunk[0][c])
  While i < fine
+
     If i > 0 Then
     If (bb[i] <> 32) And ((bb[i] < 45) Or (bb[i] > 122)) Then
+
      Print subchunk[1][c], bb.ToString(i + 7, bb.Find(0, (i + 7)) - (i + 7))
      bb[i] = 32
 
 
     Endif
 
     Endif
    Inc i
 
  Wend
 
 
<FONT Color=gray>' ''Va ad impostare i parametri necessari per la successiva funzione "Scan()":''</font>
 
  ParamScan(bb.ToString(0, bb.count), subchunk)
 
 
<FONT Color=gray>' ''Aggiunge il carattere * fra i parametri impostati per la funzione "Scan()":''</font>
 
  c = "*" & subchunk[0].Join("*") & "*"
 
 
  With scn = Scan(bb.ToString(0, bb.Count), c)
 
    .Remove(0)
 
    .Remove(scn.Max)
 
  End With
 
   
 
  Print "Percorso del file: ", filesf2
 
  Print "Dimensione: ", Null, Stat(filesf2).Size; " byte\n"
 
  For i = 0 To scn.Max
 
    Print subchunk[1][i], Null, scn[i]
 
 
   Next
 
   Next
 
'''End'''
 
 
'''Private''' Function ParamScan(sbk As String, prm As String[][])
 
 
 
  Dim b, j As Byte
 
 
  j = prm[0].Max
 
 
  While b < j
 
    If InStr(sbk, prm[0][b]) = 0 Then
 
      prm[0].Remove(b)
 
      prm[1].Remove(b)
 
      Dec b
 
      Dec j
 
    Endif
 
    Inc b
 
  Wend
 
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 11:49, 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 che possono essere successivamente manipolati dal calcolatore per generare le restanti frequenze sonore appartenenti a quel timbro originario.

La parte iniziale del file .sf2 è costituita da dati relativi ad informazioni di carattere generale sul file stesso, distinte da alcuni TAG.

Mostriamo un esempio per estrarre tali informazioni sulla base dei TAG presenti nel file sf2 preso in oggetto:

Public Sub Main()

 Dim subchunk As String[][]
 Dim sf2, s As String
 Dim bb As Byte[]
 Dim c, i As Integer

' Inseriamo i TAG ed il loro significato nelle dimensioni di una matrice bidimensionale:
 subchunk = [["INAM", "isng", "irom", "iver", "IPRD", "IENG", "ISFT", "ICRD", "ICMT", "ICOP", "LIST"],
             ["Nome banco SoundFont: ", "Ottimizzato per: ", "Riferimento dati ROM: ", "Revisione dati ROM: ", "Soundfont destinato a: ", "Autori del SoundFont: ", "Realizzato con: ", "Data di creazione: ", "Commenti: ", "Copyright: "]]
   
 sf2 = "/percorso/del/file.sf2"
 s = File.Load(f2)
 If (Left(s, 4) <> "RIFF") And (s[9, 4] <> "sbk") Then Error.Raise("Il file non è un formato 'sf2' !")
 Print "Percorso del file: ", sf2
 Print "Dimensione:        ", s.Len; " byte\n"

 bb = Byte[].FromString(s)
 For c = 0 To subchunk[0].Max
' Verifica l'eventuale presenza di ciascun TAG:
   i = InStr(s, subchunk[0][c])
   If i > 0 Then 
     Print subchunk[1][c], bb.ToString(i + 7, bb.Find(0, (i + 7)) - (i + 7))
   Endif
 Next
 
End


Riferimenti