Semplice applicativo per la riproduzione dei file Midi con le funzioni esterne di FluidSynth
Da Gambas-it.org - Wikipedia.
Versione del 27 giu 2013 alle 18:07 di Vuott (Discussione | contributi) (Creata pagina con 'Mostriamo di seguito il codice per di un semplice applicativo per la riproduzione di file Midi. Bisogna avere installato ''Jackd''. Una volta lanciato l'applicativo, aprire '...')
Mostriamo di seguito il codice per di un semplice applicativo per la riproduzione di file Midi.
Bisogna avere installato Jackd. Una volta lanciato l'applicativo, aprire Jackd e nella scheda "Audio" connettere il dispositivo "Fluidsynth", presente nella colonna "Clients leggibili/Porte d'uscita", al dispositivo "system" presente nella colonna "Clients scrivibili/Porte d'entrata".
Si dovrà, inoltre, individuare un file soundfont bank con estensione .sf2, da far caricare successivamente dalla funzione esterna "fluid_synth_sfload" per poter ottenere i suoni.
Private settings As Pointer Private synth As Pointer Private adriver As Pointer Private player As Pointer Library "libfluidsynth:1.5.2" ' fluid_settings_t* new_fluid_settings(void) ---> Crea un nuovo oggetto Settings. Private Extern new_fluid_settings() As Pointer ' fluid_synth_t * new_fluid_synth (fluid_settings_t *settings) ---> Crea una nuova istanza FluidSynth. Private Extern new_fluid_synth(settings As Pointer) As Pointer ' fluid_player_t* new_fluid_player(fluid_synth_t * synth) ---> Crea un nuovo lettore MIDI. Private Extern new_fluid_player(synth As Pointer) As Pointer ' fluid_audio_driver_t* new_fluid_audio_driver(fluid_settings_t * settings, fluid_synth_t * synth) ---> Crea un nuovo driver audio. Private Extern new_fluid_audio_driver(settings As Pointer, synth As Pointer) As Pointer ' int fluid_is_soundfont(const char * filename) ---> Controlla se il file caricato è effettivamente un file SoundFont. Private Extern fluid_is_soundfont($filename As String) As Integer ' int fluid_synth_sfload(fluid_synth_t * synth, const char * filename, nt reset_presets) ---> Carica file SoundFont. Private Extern fluid_synth_sfload(synth As Pointer, $filename As String, reset_presets As Integer) As Integer ' int fluid_is_midifile(const char * filename) ---> Controlla se il file caricato è un file MIDI. Private Extern fluid_is_midifile($fileMidi As String) As Integer ' int fluid_player_add(fluid_player_t * player, Const char * midifile) ---> Aggiunge un file MIDI alla coda del lettore. Private Extern fluid_player_add(player As Pointer, $fileMidi As String) As Integer ' int fluid_player_play(fluid_player_t * player) ---> Attiva la modalità esegui (play) al lettore MIDI, se non sta già eseguendo un Midi. Private Extern fluid_player_play(player As Pointer) As Integer ' int fluid_player_join(fluid_player_t * player) ---> Attende che un lettore MIDI termini la sua esecuzione di un file Midi. Private Extern fluid_player_join(player As Pointer) As Integer ' void delete_fluid_audio_driver(fluid_audio_driver_t * driver) ---> Elimina un'istanza di driver audio. Private Extern delete_fluid_audio_driver(dricer As Pointer) ' int delete_fluid_player(fluid_player_t * player) ---> Elimna un'istanza di lettore MIDI. Private Extern delete_fluid_player(player As Pointer) As Integer ' int delete_fluid_synth(fluid_synth_t * synth) ---> Elimna un'istanza FluidSynth. Private Extern delete_fluid_synth(synth As Pointer) As Integer ' void delete_fluid_settings(fluid_settings_t * settings) ---> Elimina l'oggetto Settings. Private Extern delete_fluid_settings(settings As Pointer) Public Sub Form_Open() Dim i As Integer Dim filesbk As String = "percorso_file_soundfont.sf2" settings = new_fluid_settings() synth = new_fluid_synth(settings) player = new_fluid_player(synth) adriver = new_fluid_audio_driver(settings, synth) i = fluid_is_soundfont(filesbk) Print "E' un soundfont bank ? "; CBool(i), "Se il risultato è 'True', allora il file è un SoundFont; se è 'False', allora non lo è." i = fluid_synth_sfload(synth, filesbk, 1) Print i; " --> Se il valore è uguale a 1, la funzione 'fluid_synth_sfload' ha avuto successo. Se è uguale a -1 ha fallito." End Public Sub Button1_Click() Dim i As Integer i = fluid_player_play(player) Print i; " --> Se il valore è uguale a zero, la funzione 'fluid_player_play' ha avuto successo. Se è uguale a -1 ha fallito." i = fluid_player_join(player) Print i; " --> Se il valore è uguale a zero, la funzione 'fluid_player_join' ha avuto successo. Se è uguale a -1 ha fallito." i = delete_fluid_player(player) Print i; " --> Se il valore è uguale a zero, la funzione 'delete_fluid_player' ha avuto successo. Se è uguale a -1 ha fallito." player = new_fluid_player(synth) End Public Sub Form_Close() delete_fluid_audio_driver(adriver) delete_fluid_player(player) delete_fluid_synth(synth) delete_fluid_settings(settings) End Public Sub MenuApri_Click() Dim i As Integer Dim fileMidi As String With Dialog .Title = "Apri file Midi..." .Filter = ["*.mid", "File Midi"] If .OpenFile() Then Return fileMidi = .Path End With i = fluid_is_midifile(fileMidi) Print "E' un file Midi ? "; CBool(i), "Se il risultato è 'True', allora il file è un File Midi; se è 'False', allora non lo è." i = fluid_player_add(player, fileMidi) Print i; " --> Se il valore è uguale a zero, la funzione 'fluid_player_add' ha avuto successo. Se è uguale a -1 ha fallito." End