|
|
Riga 1: |
Riga 1: |
− | La libreria ''WildMidi'' consente attraverso l'uso della sua funzione "''WildMidi_ConvertToMidi( )''" di convertire un file XMI nei dati di un file MIDI.
| + | #REDIRECT [[Ottenere_un_file_Midi_da_un_file_XMI_con_le_funzioni_esterne_del_API_di_WildMidi]] |
− | <BR>In particolare detta funzione esterna elabora un file simil-MIDI (XMI) e cerca di rilevare, convertire e scrivere i dati in un buffer di memoria in formato MIDI.
| |
− | | |
− | Per poter fruire della risorsa ''WildMidi'', è necessario avere installata nel sistema e richiamare in Gambas la libreria dinamica condivisa: "''libWildMidi.so.2.0.1''"
| |
− | | |
− | Poiché per inizializzare l'interfaccia di ''WildMidi'' è necessario richiamare un file (''freepats.cfg'' oppure ''wildmidi.cfg'') di configurazione dei campioni audio degli strumenti musicali, qualora non sia presente alcuno dei due file ''patch'' nel nostro sistema, ne verrà creato uno fittizio, primo di dati al suo interno. Sarà ugualmente accettato dalla funzione esterna ''WildMidi_Init()'', alla quale dovrà essere passato nel suo secondo argomento.
| |
− | | |
− | Mostriamo un semplice esempio:
| |
− | Library "libWildMidi:2.1.0"
| |
− |
| |
− | Public Struct _WM_Info
| |
− | copyright As Pointer
| |
− | current_sample As Integer
| |
− | approx_total_samples As Integer
| |
− | mixer_options As Short
| |
− | total_midi_time As Integer
| |
− | End Struct
| |
− |
| |
− | <FONT Color=gray>' ''WildMidi_Init (const char *config_file, unsigned short int rate, unsigned short int options)''
| |
− | ' ''Intializes "libWildMidi" in preparation for playback.''</font>
| |
− | Private Extern WildMidi_Init(config_file As String, rate As Short, options As Short) As Integer
| |
− |
| |
− | <FONT Color=gray>' ''int WildMidi_ConvertToMidi(const char * file, uint8_t * * out, uint32_t * size)''
| |
− | ' ''Convert a MIDI-like file into a new MIDI file.''</font>
| |
− | Private Extern WildMidi_ConvertToMidi(__file As String, out As Pointer, size As Pointer) As Integer
| |
− |
| |
− | <FONT Color=gray>' ''midi *WildMidi_Open (const char *midifile)''
| |
− | ' ''Open a MIDI file pointed to by midifile for processing.''</font>
| |
− | Private Extern WildMidi_Open(midifile As String) As Pointer
| |
− |
| |
− | <FONT Color=gray>' ''struct _WM_Info * WildMidi_GetInfo (midi *handle)''
| |
− | ' ''Get information on a midi.''</font>
| |
− | Private Extern WildMidi_GetInfo(handle As Pointer) As _WM_Info
| |
− |
| |
− | <FONT Color=gray>' ''int WildMidi_Close (midi *handle)''
| |
− | ' ''Finish processing MIDI data or file.''</font>
| |
− | Private Extern WildMidi_Close(handle As Pointer) As Integer
| |
− |
| |
− | <FONT Color=gray>' ''void WildMidi_Shutdown(void)''
| |
− | ' ''Shuts down the wildmidi library, resetting data and freeing up memory used by the library.''</font>
| |
− | Private Extern WildMidi_Shutdown()
| |
− |
| |
− |
| |
− | '''Public''' Sub Main()
| |
− |
| |
− | Dim i, sz As Integer
| |
− | Dim midi As Pointer
| |
− | Dim xmi As String
| |
− | Dim fl As File
| |
− | Dim info As _WM_Info
| |
− |
| |
− | <FONT Color=gray>' '''''Crea un file fittizio di impostazione di campioni audio degli strumenti musicali, per poter inizializzare comunque la libreria "libWildMidi"''':''</font>
| |
− | File.Save("/tmp/freepats.cfg", Null)
| |
− |
| |
− | <FONT Color=gray>' ''Inizializza la libreria 'libWildMidi':''</font>
| |
− | i = WildMidi_Init("/tmp/freepats.cfg", 44100, 0)
| |
− | If i < 0 Then Error.Raise("Errore nell'inizializzazione dell'interfaccia 'libWildMidi' !")
| |
− |
| |
− | <FONT Color=gray>' ''Alloca una porzione di memoria adeguata per contenere un file Midi:''</font>
| |
− | midi = Alloc(SizeOf(gb.Byte), 500000)
| |
− |
| |
− | <FONT Color=gray>' ''Carica un file XMI in memoria:''</font>
| |
− | xmi = "<FONT Color=gray>''/percorso/del/file.xmi''</font>"
| |
− |
| |
− | <FONT Color=gray>' ''Convertire i dati del file XMI nei dati di un file Midi:''</font>
| |
− | i = WildMidi_ConvertToMidi(xmi, midi, VarPtr(sz))
| |
− | If i < 0 Then Error.Raise("Errore")
| |
− |
| |
− | <FONT Color=gray>' ''Mostra in console tutti i dati midi ricostruiti:''</font>
| |
− | For i = 0 To sz - 1
| |
− | Print i, Hex(Byte@(Pointer@(midi) + i), 2)
| |
− | Next
| |
− | Print
| |
− |
| |
− | <FONT Color=gray>' ''Salva il file midi dai dati ottenuti:''</font>
| |
− | fl = Open File.Dir(xmi) &/ File.BaseName(xmi) & ".mid" For Create
| |
− | Write #fl, Pointer@(midi), sz
| |
− |
| |
− | Free(midi)
| |
− |
| |
− | <FONT Color=gray>' ''Apre il file Midi appena creato:''</font>
| |
− | midi = WildMidi_Open(fl.Dir(xmi) &/ fl.Name(xmi))
| |
− | If midi == 0 Then Error.Raise("Impossibile aprire il file Midi !")
| |
− |
| |
− | <FONT Color=gray>' ''Ottiene alcune informazioni sul file Midi caricato:''</font>
| |
− | info = WildMidi_GetInfo(midi)
| |
− |
| |
− | Print "File Midi: "; fl.Dir(xmi) &/ fl.Name(xmi)
| |
− | Print "Durata: "; "\e[31m"; Date(0, 0, 0, 0, 0, 0, info.total_midi_time)
| |
− |
| |
− | <FONT Color=gray>' ''Infine libera la memoria precedentemente occupata:''</font>
| |
− | fl.Close
| |
− | WildMidi_Close(midi)
| |
− | WildMidi_Shutdown()
| |
− |
| |
− | '''End'''
| |
− | | |
− | | |
− | | |
− | =Riferimenti=
| |
− | * http://manpages.ubuntu.com/manpages/cosmic/man3/WildMidi_ConvertToMidi.3.html
| |
− | * http://fileformats.archiveteam.org/wiki/XMI_(Extended_MIDI)
| |
− | * http://www.shikadi.net/moddingwiki/XMI_Format
| |
− | * http://www.vgmpf.com/Wiki/index.php?title=XMI
| |