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 4: Riga 4:
  
 
La parte iniziale del file .sf2 è costituita da dati relativi ad informazioni di carattere generale sul file stesso, distinte da alcuni TAG.
 
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:
 
Mostriamo un esempio per estrarre tali informazioni sulla base dei TAG presenti nel file sf2 preso in oggetto:
Riga 16: Riga 15:
 
    
 
    
 
  <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 = "''/percorso/del/file.sf2''"
+
  filesf2 = "<FONT Color=gray>''/percorso/del/file.sf2''</font>"
  sf2 = File.Load(filesf2)
+
  sf2 = File.Load(filesf2)
  If (Left(sf2, 4) <> "RIFF") And (Mid(sf2, 9, 4) <> "sbk") Then Error.Raise("Il file non è un formato 'sf2' !")
+
  If (Left(sf2, 4) <> "RIFF") And (Mid(sf2, 9, 4) <> "sbk") Then Error.Raise("Il file non è un formato 'sf2' !")
 
   
 
   
 
  <FONT Color=gray>' ''Individua la parte iniziale del file da sottoporre a verifica:''</font>
 
  <FONT Color=gray>' ''Individua la parte iniziale del file da sottoporre a verifica:''</font>
  fine = InStr(sf2, "sdtasmpl")
+
  fine = InStr(sf2, "sdtasmpl")
  bb = Byte[].FromString(Left(sf2, fine))
+
  bb = Byte[].FromString(Left(sf2, fine))
 
   
 
   
 
  <FONT Color=gray>' ''Elimina i caratteri non stampabili:''</font>
 
  <FONT Color=gray>' ''Elimina i caratteri non stampabili:''</font>
    While i < fine  
+
  While i < fine  
      If (bb[i] <> 32) And ((bb[i] < 45) Or (bb[i] > 122)) Then
+
    If (bb[i] <> 32) And ((bb[i] < 45) Or (bb[i] > 122)) Then
        bb[i] = 32
+
      bb[i] = 32
      Endif
+
    Endif
      Inc i
+
    Inc i
    Wend
+
  Wend
 
   
 
   
 
  <FONT Color=gray>' ''Va ad impostare i parametri necessari per la successiva funzione "Scan()":''</font>
 
  <FONT Color=gray>' ''Va ad impostare i parametri necessari per la successiva funzione "Scan()":''</font>
    ParamScan(bb.ToString(0, bb.count), subchunk)
+
  ParamScan(bb.ToString(0, bb.count), subchunk)
 
   
 
   
 
  <FONT Color=gray>' ''Aggiunge il carattere * fra i parametri impostati per la funzione "Scan()":''</font>
 
  <FONT Color=gray>' ''Aggiunge il carattere * fra i parametri impostati per la funzione "Scan()":''</font>
    c = "*" & subchunk[0].Join("*") & "*"
+
  c = "*" & subchunk[0].Join("*") & "*"
 
   
 
   
    With scn = Scan(bb.ToString(0, bb.Count), c)
+
  With scn = Scan(bb.ToString(0, bb.Count), c)
      .Remove(0)
+
    .Remove(0)
      .Remove(scn.Max)
+
    .Remove(scn.Max)
    End With
+
  End With
 
      
 
      
    Print "Percorso del file: ", filesf2
+
  Print "Percorso del file: ", filesf2
    Print "Dimensione: ", Null, Stat(filesf2).Size; " byte\n"
+
  Print "Dimensione: ", Null, Stat(filesf2).Size; " byte\n"
    For i = 0 To scn.Max
+
  For i = 0 To scn.Max
      Print subchunk[1][i], Null, scn[i]
+
    Print subchunk[1][i], Null, scn[i]
    Next
+
  Next
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Private''' Function ParamScan(sbk As String, prm As String[][])
 
  '''Private''' Function ParamScan(sbk As String, prm As String[][])
Riga 59: Riga 57:
 
   Dim b, j As Byte
 
   Dim b, j As Byte
 
   
 
   
  j = prm[0].Max
+
  j = prm[0].Max
 
   
 
   
  While b < j
+
  While b < j
    If InStr(sbk, prm[0][b]) = 0 Then
+
    If InStr(sbk, prm[0][b]) = 0 Then
      prm[0].Remove(b)
+
      prm[0].Remove(b)
      prm[1].Remove(b)
+
      prm[1].Remove(b)
      Dec b
+
      Dec b
      Dec j
+
      Dec j
    Endif
+
    Endif
    Inc b
+
    Inc b
  Wend
+
  Wend
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  

Versione delle 06:33, 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 filesf2, sf2, c As String
 Dim bb As Byte[]
 Dim scn As String[]
 Dim i, fine As Integer
 Dim subchunk As String[][]
 
' 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: "]]
   
 filesf2 = "/percorso/del/file.sf2"
 sf2 = File.Load(filesf2)
 If (Left(sf2, 4) <> "RIFF") And (Mid(sf2, 9, 4) <> "sbk") Then Error.Raise("Il file non è un formato 'sf2' !")

' Individua la parte iniziale del file da sottoporre a verifica:
 fine = InStr(sf2, "sdtasmpl")
 bb = Byte[].FromString(Left(sf2, fine))

' Elimina i caratteri non stampabili:
 While i < fine 
   If (bb[i] <> 32) And ((bb[i] < 45) Or (bb[i] > 122)) Then
     bb[i] = 32
   Endif
   Inc i
 Wend

' Va ad impostare i parametri necessari per la successiva funzione "Scan()":
 ParamScan(bb.ToString(0, bb.count), subchunk)

' Aggiunge il carattere * fra i parametri impostati per la funzione "Scan()":
 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

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


Riferimenti