|
|
(Una versione intermedia di uno stesso utente non è mostrata) |
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''"
| |
− | | |
− | | |
− | 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"''''':
| |
− | 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
| |