Differenze tra le versioni di "La gestione dei file MIDI mediante le funzioni esterne del API di Fluidsynth"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
Mostriamo di seguito il codice per di un semplice applicativo per la riproduzione di file Midi.
+
Mostriamo di seguito il codice per di un semplice applicativo ''a riga di comando'' 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''".
 
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 <FONT color=#B22222>.sf2</font>, da far caricare successivamente dalla funzione esterna "''fluid_synth_sfload''" per poter ottenere i suoni.
 
Si dovrà, inoltre, individuare un file ''soundfont bank'' con estensione <FONT color=#B22222>.sf2</font>, da far caricare successivamente dalla funzione esterna "''fluid_synth_sfload''" per poter ottenere i suoni.
 
+
  Library "libfluidsynth:2.3.1"
 
 
Private settings As Pointer
 
Private synth As Pointer
 
Private adriver As Pointer
 
Private player As Pointer
 
Private fileMidi As String
 
Private Const ALL_SOUND_OFF As Integer = 120
 
Private Const ALL_NOTES_OFF As Integer = 123
 
 
 
  Library "libfluidsynth:1.7.0"
 
 
   
 
   
 
  <FONT color=gray>' ''fluid_settings_t* new_fluid_settings(void)''
 
  <FONT color=gray>' ''fluid_settings_t* new_fluid_settings(void)''
Riga 28: Riga 17:
 
  ' ''Create a new MIDI player.''</font>
 
  ' ''Create a new MIDI player.''</font>
 
  Private Extern new_fluid_player(synth As Pointer) As Pointer
 
  Private Extern new_fluid_player(synth As Pointer) As Pointer
+
 
<FONT color=gray>' ''int fluid_settings_setint(fluid_settings_t *settings, const char *name, int val)''
 
' ''Set an integer value for a setting.''</font>
 
Private Extern fluid_settings_setint(settP As Pointer, name As String, valI As Integer) As Integer
 
 
 
  <FONT color=gray>' ''fluid_audio_driver_t* new_fluid_audio_driver(fluid_settings_t * settings, fluid_synth_t * synth)''
 
  <FONT color=gray>' ''fluid_audio_driver_t* new_fluid_audio_driver(fluid_settings_t * settings, fluid_synth_t * synth)''
 
  ' ''Create a new audio driver.''</font>
 
  ' ''Create a new audio driver.''</font>
Riga 51: Riga 36:
 
  <FONT color=gray>' ''int fluid_player_add(fluid_player_t * player, Const char * midifile)
 
  <FONT color=gray>' ''int fluid_player_add(fluid_player_t * player, Const char * midifile)
 
  ' ''Add a MIDI file to a player queue.''</font>
 
  ' ''Add a MIDI file to a player queue.''</font>
  Private Extern fluid_player_add(player As Pointer, $fileMidi As String) As Integer
+
  Private Extern fluid_player_add(player As Pointer, midifile As String) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int fluid_player_play(fluid_player_t * player)''
 
  <FONT color=gray>' ''int fluid_player_play(fluid_player_t * player)''
 
  ' ''Activates play mode for a MIDI player if not already playing.''</font>
 
  ' ''Activates play mode for a MIDI player if not already playing.''</font>
 
  Private Extern fluid_player_play(player As Pointer) As Integer
 
  Private Extern fluid_player_play(player As Pointer) As Integer
+
 
<FONT color=gray>' ''int fluid_player_stop(fluid_player_t * player)''
 
' ''Stops a MIDI player.''</font>
 
Private Extern fluid_player_stop(player As Pointer) As Integer
 
 
 
  <FONT color=gray>' ''int fluid_player_get_status(fluid_player_t * player)''
 
  <FONT color=gray>' ''int fluid_player_get_status(fluid_player_t * player)''
 
  ' ''Get MIDI player status.''</font>
 
  ' ''Get MIDI player status.''</font>
 
  Private Extern fluid_player_get_status(player As Pointer) As Integer
 
  Private Extern fluid_player_get_status(player As Pointer) As Integer
+
 
<FONT color=gray>' ''int fluid_synth_cc (fluid_synth_t *synth, int chan, int ctrl, int val)''
 
' ''Send a MIDI controller event on a MIDI channel.''</font>
 
Private Extern fluid_synth_cc(synth As Pointer, chan As Integer, ctrl As integer, ival As Integer) As Integer
 
 
 
 
  <FONT color=gray>' ''void delete_fluid_audio_driver(fluid_audio_driver_t * driver)''
 
  <FONT color=gray>' ''void delete_fluid_audio_driver(fluid_audio_driver_t * driver)''
 
  ' ''Deletes an audio driver instance.''</font>
 
  ' ''Deletes an audio driver instance.''</font>
Riga 86: Riga 63:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  '''Public''' Sub Main()
 +
 
 +
  Dim set, syn, pla, drv As Pointer
 +
  Dim filesbk, fileMidi As String
 +
  Dim tempus As Date
 +
 
 +
  set = new_fluid_settings()
 +
  syn = new_fluid_synth(set)
 +
  pla = new_fluid_player(syn)
 
   
 
   
  Dim i As Integer
+
<FONT color=gray>' ''Carica il soundfont bank per i suoni:''</font>
   Dim filesbk As String
+
   filesbk = "<FONT color=gray>''/percorso/del/file/soundfont.sf2''</font>"
+
  If Not fluid_is_soundfont(filesbk) Then Error.Raise("Il file non è un soundfont bank !")
  filesbk = "<FONT color=gray>''/percorso/del/file/soundfont.sf2''</font>"
+
  If fluid_synth_sfload(syn, filesbk, 1) < 0 Then Error.Raise("Errore !")
 
+
 
  settings = new_fluid_settings()
+
  <FONT color=gray>' ''Carica il file Midi prescelto:''</font>
 
+
  fileMidi = "<FONT color=gray>''/percorso/del/file.mid''</font>"
  synth = new_fluid_synth(settings)
+
   If fluid_is_midifile(fileMidi) < 0 Then Error.Raise("Il file non è un file 'Midi' !")
 
+
  If fluid_player_add(pla, fileMidi) < 0 Then Error.Raise("Errore !")
  player = new_fluid_player(synth)
 
 
 
  i = fluid_settings_setint(settings, "audio.jack.autoconnect", 1)
 
  If i = 0 Then Error.Raise("Errore alla funzione 'fluid_settings_setint()' !")
 
 
 
  adriver = new_fluid_audio_driver(settings, synth)
 
  If IsNull(adriver) Then Error.Raise("Impossibile creare un driver audio !")
 
 
 
  i = fluid_is_soundfont(filesbk)
 
  If CBool(i) = False then Error.Raise("Il file non è un soundfont bank !")
 
   
 
  i = fluid_synth_sfload(synth, filesbk, 1)
 
  If i < 0 Then Error.Raise("Errore alla funzione 'fluid_synth_sfload()' !")
 
 
 
  '''End'''
 
 
 
'''Public''' Sub Button1_Click()
 
 
   Dim i As Integer
 
   
 
  i = fluid_player_add(player, fileMidi)
 
  If i < 0 Then Error.Raise("Errore alla funzione 'fluid_player_add()' !")
 
 
 
<FONT color=gray>' ''Avvia l'esecuzione del file Midi:''</font>
 
  i = fluid_player_play(player)
 
  If i < 0 Then Error.Raise("Errore alla funzione 'fluid_player_play()' !")
 
 
    
 
    
  Do
+
  drv = new_fluid_audio_driver(set, syn)
    Wait 0.01
+
  If IsNull(drv) Then Error.Raise("Impossibile creare un driver audio !")
  Loop Until fluid_player_get_status(player) <> 1
 
 
    
 
    
  i = delete_fluid_player(player)
+
  <FONT color=gray>' ''Avvia l'esecuzione del file Midi:''</font>
  If i < 0 Then Error.Raise("Errore alla funzione 'delete_fluid_player()' !")
+
  If fluid_player_play(pla) < 0 Then Error.Raise("Errore !")
+
  Print
  player = new_fluid_player(synth)
+
  tempus = Now
 
 
'''End'''
 
 
 
'''Public''' Sub Button2_Click()
 
 
  Dim i As Integer
 
  Dim b As Byte
 
 
  <FONT color=gray>' ''Arresta l'esecuzione del file Midi:''</font>
 
  i = fluid_player_stop(player)
 
  If i < 0 Then Error.Raise("Errore alla funzione 'fluid_player_stop()' !")
 
 
 
  For b = 0 To 15
 
    i = fluid_synth_cc(synth, b, ALL_NOTES_OFF, 0)
 
    If i < 0 Then Error.Raise("Errore alla funzione 'fluid_synth_cc()' !")
 
    i = fluid_synth_cc(synth, b, ALL_SOUND_OFF, 0)
 
    If i < 0 Then Error.Raise("Errore alla funzione 'fluid_synth_cc()' !")
 
  Next
 
   
 
'''End'''
 
 
 
'''Public''' Sub Form_Close()
 
 
  delete_fluid_audio_driver(adriver)
 
 
  delete_fluid_player(player)
 
 
    
 
    
  delete_fluid_synth(synth)
+
  While fluid_player_get_status(pla) == FLUID_PLAYER_PLAYING
 +
    Write "\r\e[0mFile Midi: " & fileMidi & "  -  \e[31m" & CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(tempus, Now, gb.Millisecond)))
 +
    Wait 0.01
 +
  Wend
 
    
 
    
  delete_fluid_settings(settings)
+
<FONT color=gray>' ''Libera la memoria precedentemente occupata e chiude il programma:''</font>
 +
  delete_fluid_audio_driver(drv)
 +
  delete_fluid_player(pla)
 +
  delete_fluid_synth(syn)
 +
  delete_fluid_settings(set)
 
    
 
    
'''End'''
+
   Print "Esecuzione terminata !"
 
 
'''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)
 
  If CBool(i) = False Then Error.Raise("Il file caricato non è un file Midi standard !")
 
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 190: Riga 111:
 
=Riferimenti=
 
=Riferimenti=
 
* http://www.fluidsynth.org/
 
* http://www.fluidsynth.org/
* http://fluidsynth.sourceforge.net/api/
+
* http://www.fluidsynth.org/api/index.html

Versione delle 16:18, 12 lug 2020

Mostriamo di seguito il codice per di un semplice applicativo a riga di comando 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.

Library "libfluidsynth:2.3.1"

' fluid_settings_t* new_fluid_settings(void)
' Create a new settings object. 
Private Extern new_fluid_settings() As Pointer

' fluid_synth_t * new_fluid_synth (fluid_settings_t *settings)
' Create new FluidSynth instance.
Private Extern new_fluid_synth(settP As Pointer) As Pointer

' fluid_player_t* new_fluid_player(fluid_synth_t * synth)
' Create a new MIDI player.
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)
' Create a new audio driver.
Private Extern new_fluid_audio_driver(settings As Pointer, synth As Pointer) As Pointer 

' int fluid_is_soundfont(const char * filename)
' Check if a file is a SoundFont file.
Private Extern fluid_is_soundfont(filename As String) As Integer

' int fluid_synth_sfload(fluid_synth_t * synth, const char * filename, nt reset_presets)
' Load a SoundFont file (filename is interpreted by SoundFont loaders).
Private Extern fluid_synth_sfload(synth As Pointer, filename As String, reset_presets As Integer) As Integer

' int fluid_is_midifile(const char * filename)
' Check if a file is a MIDI file.
Private Extern fluid_is_midifile(filename As String) As Integer

' int fluid_player_add(fluid_player_t * player, Const char * midifile)
' Add a MIDI file to a player queue.
Private Extern fluid_player_add(player As Pointer, midifile As String) As Integer

' int fluid_player_play(fluid_player_t * player)
' Activates play mode for a MIDI player if not already playing.
Private Extern fluid_player_play(player As Pointer) As Integer
 
' int fluid_player_get_status(fluid_player_t * player)
' Get MIDI player status.
Private Extern fluid_player_get_status(player As Pointer) As Integer
  
' void delete_fluid_audio_driver(fluid_audio_driver_t * driver)
' Deletes an audio driver instance.
Private Extern delete_fluid_audio_driver(driver As Pointer)

' int delete_fluid_player(fluid_player_t * player)
' Delete a MIDI player instance.
Private Extern delete_fluid_player(player As Pointer) As Integer

' int delete_fluid_synth(fluid_synth_t * synth)
' Delete a FluidSynth instance.
Private Extern delete_fluid_synth(synth As Pointer) As Integer

' void delete_fluid_settings(fluid_settings_t * settings)
' Delete the provided settings object.
Private Extern delete_fluid_settings(settings As Pointer)


Public Sub Main()
 
 Dim set, syn, pla, drv As Pointer
 Dim filesbk, fileMidi As String
 Dim tempus As Date
 
 set = new_fluid_settings()
 syn = new_fluid_synth(set)
 pla = new_fluid_player(syn)

' Carica il soundfont bank per i suoni:
 filesbk = "/percorso/del/file/soundfont.sf2"
 If Not fluid_is_soundfont(filesbk) Then Error.Raise("Il file non è un soundfont bank !")
 If fluid_synth_sfload(syn, filesbk, 1) < 0 Then Error.Raise("Errore !")
 
' Carica il file Midi prescelto:
 fileMidi = "/percorso/del/file.mid"
 If fluid_is_midifile(fileMidi) < 0 Then Error.Raise("Il file non è un file 'Midi' !")
 If fluid_player_add(pla, fileMidi) < 0 Then Error.Raise("Errore !")
 
 drv = new_fluid_audio_driver(set, syn)
 If IsNull(drv) Then Error.Raise("Impossibile creare un driver audio !")
 
' Avvia l'esecuzione del file Midi:
 If fluid_player_play(pla) < 0 Then Error.Raise("Errore !")
 Print
 tempus = Now
 
 While fluid_player_get_status(pla) == FLUID_PLAYER_PLAYING
   Write "\r\e[0mFile Midi: " & fileMidi & "  -  \e[31m" & CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(tempus, Now, gb.Millisecond)))
   Wait 0.01
 Wend
 
' Libera la memoria precedentemente occupata e chiude il programma:
 delete_fluid_audio_driver(drv)
 delete_fluid_player(pla)
 delete_fluid_synth(syn)
 delete_fluid_settings(set)
 
 Print "Esecuzione terminata !"
 
End



Riferimenti