Differenze tra le versioni di "Ottenere un file Midi da un file XMI o MUS mediante mediante le funzioni esterne del API di WildMidi"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "La libreria ''WildMidi'' consente attraverso l'uso della sua funzione "''WildMidi_ConvertToMidi( )''" di convertire un file XMI nei dati di un file MIDI. <BR>In particolare de...")
 
 
(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
 

Versione attuale delle 18:02, 19 ago 2020