Differenze tra le versioni di "Semplice applicativo per la riproduzione dei file Midi con le funzioni esterne di FluidSynth"

Da Gambas-it.org - Wikipedia.
(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 '...')
 
Riga 10: Riga 10:
 
  '''Private''' adriver As Pointer
 
  '''Private''' adriver As Pointer
 
  '''Private''' player As Pointer
 
  '''Private''' player As Pointer
 +
'''Private''' fileMidi As String
 
   
 
   
 
  Library "libfluidsynth:1.5.2"
 
  Library "libfluidsynth:1.5.2"
Riga 40: Riga 41:
 
  '''Private''' Extern fluid_player_play(player As Pointer) As Integer
 
  '''Private''' Extern fluid_player_play(player As Pointer) As Integer
 
   
 
   
  <FONT color=#006400>' ''int fluid_player_join(fluid_player_t * player)    ---> Attende che un lettore MIDI termini la sua esecuzione di un file Midi.''</font>
+
  <FONT color=#006400>' ''int fluid_player_get_status(fluid_player_t * player)    ---> Ottiene lo status del lettore MIDI.''</font>
  '''Private''' Extern fluid_player_join(player As Pointer) As Integer
+
  '''Private''' Extern fluid_player_get_satus(player As Pointer) As Integer
 
   
 
   
 
  <FONT color=#006400>' ''void delete_fluid_audio_driver(fluid_audio_driver_t * driver)  ---> Elimina un'istanza di driver audio.''</font>
 
  <FONT color=#006400>' ''void delete_fluid_audio_driver(fluid_audio_driver_t * driver)  ---> Elimina un'istanza di driver audio.''</font>
Riga 83: Riga 84:
 
   Dim i As Integer
 
   Dim i As Integer
 
   
 
   
    
+
 
 +
  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."
 +
 
 
   i = fluid_player_play(player)
 
   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."
 
   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)
+
   Do
  Print i; "  --> Se il valore è uguale a zero, la funzione 'fluid_player_join' ha avuto successo. Se è uguale a -1 ha fallito."
+
    Wait 0.01
+
  Loop Until fluid_player_get_status(player) <> 1
 +
 
 
   i = delete_fluid_player(player)
 
   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."
 
   Print i; "  --> Se il valore è uguale a zero, la funzione 'delete_fluid_player' ha avuto successo. Se è uguale a -1 ha fallito."
Riga 114: Riga 119:
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
  Dim  fileMidi As String
 
 
   
 
   
 
   With Dialog
 
   With Dialog
Riga 126: Riga 130:
 
   Print "E' un file Midi ? "; CBool(i), "Se il risultato è 'True', allora il file è un File Midi; se è 'False', allora non lo è."
 
   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'''
 
  '''End'''

Versione delle 02:49, 28 giu 2013

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
Private fileMidi As String

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_get_status(fluid_player_t * player)    ---> Ottiene lo status del lettore MIDI.
Private Extern fluid_player_get_satus(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_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."
  
  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."
 
  Do
    Wait 0.01
  Loop Until fluid_player_get_status(player) <> 1
 
  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

  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 è."
 
End