Differenze tra le versioni di "Individuare i nomi e le rispettive posizioni degli strumenti musicali in un file sf2 con le sole risorse di Gambas"
Riga 11: | Riga 11: | ||
* 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 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 mediante apposita ''Struttura'' i valori del blocco ''pdtaphdr'', ed in partciolare: il nome di ciascuno strumento musicale, il Banco dei suoni di appartenenza 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 i predetti elementi da estrarre. | * estrarre mediante apposita ''Struttura'' i valori del blocco ''pdtaphdr'', ed in partciolare: il nome di ciascuno strumento musicale, il Banco dei suoni di appartenenza 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 i predetti elementi da estrarre. | ||
+ | |||
+ | |||
+ | Il seguente codice mostrerà secondo la sequenza degli strumenti musicali all'interno del blocco ''pdtaphdr'' del file sf2: il numero di banco dei suoni, il preset ed il nome di ciascuno strumento. | ||
Public Struct sfPresetHeader | Public Struct sfPresetHeader | ||
achPresetName[20] As Byte | achPresetName[20] As Byte | ||
Riga 27: | Riga 30: | ||
Dim sf2, s As String | Dim sf2, s As String | ||
Dim bb As Byte[] | Dim bb As Byte[] | ||
− | Dim i, j, | + | Dim i, j, durata As Integer |
− | Dim pphh1 | + | Dim pphh1 As SfPresetHeader[] |
Dim sfPH As SfPresetHeader | Dim sfPH As SfPresetHeader | ||
Riga 78: | Riga 81: | ||
pphh1.Remove(pphh1.Max) | pphh1.Remove(pphh1.Max) | ||
− | |||
− | |||
− | |||
− | + | <FONT Color=gray>' ''Vengono scritti in console i suoni degli strumenti musicali, secondo la loro posizione all'interno del blocco 'pdtaphdr','' | |
+ | ' ''ed in particolare: il Banco dei suoni, il preset ed il nome dello strumento musicale:''</font> | ||
+ | Print "Strumenti compresi nel file banco: "; File.Name(sf2) | ||
+ | Print "\nBanco Preset Nome strumento\n" | ||
+ | |||
For j = 0 To pphh1.Max | For j = 0 To pphh1.Max | ||
− | + | With pphh1[j] | |
− | + | Print .wBank; " "; | |
+ | Print .wPreset; " "; | ||
+ | Print .achPresetName.ToString() | ||
+ | End With | ||
Next | Next | ||
− | + | <FONT Color=gray>' ''Fornisce alcune informazioni generali sul blocco 'pdtaphdr' del file .sf2:''</font> | |
− | + | Print "\n\nFile soundbank: "; sf2 | |
− | + | Print "Dimensione totale suoni campionati: "; i;; "byte" | |
− | + | durata = (i * 8) \ 705600 | |
− | + | Print "Durata totale dei suoni campionati: "; Date(0, 0, 0, 0, 0, 0, durata * 1000) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <FONT Color=gray>' '' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''End''' | '''End''' |
Versione delle 18:30, 24 mag 2015
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 è costituito, fra l'altro, da diversi blocchi comprendenti specifiche informazioni di carattere generale sul file stesso. In particolare il blocco 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 mediante apposita Struttura i valori del blocco pdtaphdr, ed in partciolare: il nome di ciascuno strumento musicale, il Banco dei suoni di appartenenza 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 i predetti elementi da estrarre.
Il seguente codice mostrerà secondo la sequenza degli strumenti musicali all'interno del blocco pdtaphdr del file sf2: il numero di banco dei suoni, il preset ed il nome di ciascuno strumento.
Public Struct sfPresetHeader achPresetName[20] As Byte wPreset As Short wBank As Short wPresetBagNdx As Short dwLibrary As Integer dwGenre As Integer dwMorphology As Integer End Struct Public Sub Main() Dim fl As File Dim sf2, s As String Dim bb As Byte[] Dim i, j, durata As Integer Dim pphh1 As SfPresetHeader[] Dim sfPH As SfPresetHeader 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 Blocco '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 'pdtaphdr': Seek #fl, i + 7 j = Read #fl As Integer ' Raccoglie ad ogni ciclo 38 byte contenenti i vari elementi dello strumento musicale rappresentati dai membri della "Struttura". ' In particolare serviranno in seguito i primi tre membri: nome dello strumento musicale, preset (sua posizione all'interno del Banco) e numero del Banco di appartenenza. pphh1 = New SfPresetHeader[] While Seek(fl) < j + i sfPH = New SfPresetHeader With sfPH .achPresetName.Read(fl, 0, 20) .wPreset = Read #fl As Short .wBank = Read #fl As Short .wPresetBagNdx = Read #fl As Short .dwLibrary = Read #fl As Integer .dwGenre = Read #fl As Integer .dwMorphology = Read #fl As Integer End With pphh1.Add(sfph) Wend fl.Close ' Elimina l'ultima variabile di tipo "Struttura", poiché contenente i dati terminale del blocco 'pdtaphdr' che sono non significativi: pphh1.Remove(pphh1.Max) ' Vengono scritti in console i suoni degli strumenti musicali, secondo la loro posizione all'interno del blocco 'pdtaphdr', ' ed in particolare: il Banco dei suoni, il preset ed il nome dello strumento musicale: Print "Strumenti compresi nel file banco: "; File.Name(sf2) Print "\nBanco Preset Nome strumento\n" For j = 0 To pphh1.Max With pphh1[j] Print .wBank; " "; Print .wPreset; " "; Print .achPresetName.ToString() End With Next ' Fornisce alcune informazioni generali sul blocco 'pdtaphdr' del file .sf2: Print "\n\nFile soundbank: "; sf2 Print "Dimensione totale suoni campionati: "; i;; "byte" durata = (i * 8) \ 705600 Print "Durata totale dei suoni campionati: "; Date(0, 0, 0, 0, 0, 0, durata * 1000) End