Estrarre informazioni generali dai tag di un file soundfont bank sf2 con le sole funzioni di Gambas
Da Gambas-it.org - Wikipedia.
Versione del 4 ott 2022 alle 06:33 di Vuott (Discussione | contributi)
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