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

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 +
<FONT Color=red Size=4><B>Va precisato che ormai la Libreria SDL è obsoleta: al suo posto va utilizzata la Libreria [[La_gestione_dei_file_MIDI_mediante_le_funzioni_esterne_del_API_di_SDL_2|SDL2]].</b></font>
 +
 +
 
La libreria '''''SDL''''' è un [http://it.wikipedia.org/wiki/Application_programming_interface API] multi-piattaforma contenente funzioni per la gestione multimediale dell'audio e del video.
 
La libreria '''''SDL''''' è un [http://it.wikipedia.org/wiki/Application_programming_interface API] multi-piattaforma contenente funzioni per la gestione multimediale dell'audio e del video.
 
  
 
Per poter eseguire file Midi, è necessario utilizzare la libreria ''SDL_mixer'' che viene utilizzata con la libreria ''SDL''. Essa, più in generale, permette ai programmatori di usare più campioni con la musica, e di semplificare la gestione del caricamento, della riproduzione di campioni e della musica da diversi tipi di formati di file.
 
Per poter eseguire file Midi, è necessario utilizzare la libreria ''SDL_mixer'' che viene utilizzata con la libreria ''SDL''. Essa, più in generale, permette ai programmatori di usare più campioni con la musica, e di semplificare la gestione del caricamento, della riproduzione di campioni e della musica da diversi tipi di formati di file.
 +
<BR>Per l'ascolto dei file Midi, si potrà anche impostare il file banco di suoni .sf2 nell'apposita funzione ''Mix_SetSoundFonts()''.
  
 +
Per utilizzare in Gambas le risorse della libreria ''libSDL_mixer'', bisognerà richiamare la libreria: libSDL_mixer-1.2.so.0.12.0
  
Per utilizzare in Gambas le risorse della libreria ''libSDL_mixer'', bisognerà richiamare la libreria (con l'attuale versione):
+
Mostriamo di seguito un semplice codice per eseguire un file Midi in un'applicazione ''a riga di comando'':
libSDL_mixer-1.2.so.0.12.0
+
Private Const AUDIO_S16SYS As Integer = 32784
E' inoltre necessario aver installato il file banco di suoni di default di Timidity: "''/usr/share/sounds/sf2/<FONT color=#B22222>TimGM6mb.sf2</font>''", oppure quello di Fluidsynth: "''/usr/share/sounds/sf2/<FONT color=#B22222>FluidR3_GM.sf2</font>''"
+
  Private Const STEREO As Integer = 2
 
 
 
 
 
 
Mostriamo di seguito un semplice codice per eseguire un file Midi:
 
'''Private''' Const AUDIO_S16SYS As Integer = 32784
 
  '''Private''' Const STEREO As Integer = 2
 
 
   
 
   
 
   
 
   
 
  Library "libSDL_mixer-1.2:0.12.0"
 
  Library "libSDL_mixer-1.2:0.12.0"
 
   
 
   
  <FONT color=gray>' ''const char* Mix_GetSoundFonts(void)''</font>
+
  <FONT color=gray>' ''int Mix_SetSoundFonts(const char *paths)''
  '''Private''' Extern Mix_GetSoundFonts() As String
+
' ''Set SoundFonts paths to use by supported MIDI backends.''</font>
 +
  Private Extern Mix_SetSoundFonts(paths As String) As Integer
 
   
 
   
  <FONT color=gray>' ''int Mix_OpenAudio(Int frequency, Uint16 Format, Int channels, Int chunksize)''</font>
+
  <FONT color=gray>' ''int Mix_OpenAudio(Int frequency, Uint16 Format, Int channels, Int chunksize)''
  '''Private''' Extern Mix_OpenAudio(frequency As Integer, formatSh As Short, channels As Byte, chunksize As Integer) As Integer
+
' ''Open the mixer with a certain audio format.''</font>
 +
  Private Extern Mix_OpenAudio(frequency As Integer, formatSh As Short, channels As Byte, chunksize As Integer) As Integer
 
   
 
   
  <FONT color=gray>' ''Mix_Music *Mix_LoadMUS(const char *file)''</font>
+
  <FONT color=gray>' ''Mix_Music *Mix_LoadMUS(const char *file)''
  '''Private''' Extern Mix_LoadMUS(file As String) As Pointer
+
' ''Load a wave file or a music.''</font>
 +
  Private Extern Mix_LoadMUS(file As String) As Pointer
 
   
 
   
  <FONT color=gray>' ''int Mix_PlayMusic(Mix_Music *music, int loops)''</font>
+
  <FONT color=gray>' ''int Mix_PlayMusic(Mix_Music *music, int loops)''
  '''Private''' Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer
+
' ''Play an audio chunk on a specific channel.''</font>
 +
  Private Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer
 
   
 
   
  <FONT color=gray>' ''Int Mix_PlayingMusic()''</font>
+
  <FONT color=gray>' ''Int Mix_PlayingMusic()''
  '''Private''' Extern Mix_PlayingMusic() As Integer
+
' ''Check the status of a specific channel.''</font>
 +
  Private Extern Mix_PlayingMusic() As Integer
 
   
 
   
  <FONT color=gray>' ''void Mix_FreeChunk(Mix_Chunk *chunk)''</font>
+
  <FONT color=gray>' ''void Mix_FreeChunk(Mix_Chunk *chunk)''
  '''Private''' Extern Mix_FreeChunk(chunk As Pointer)
+
' ''Free an audio chunk previously loaded.''</font>
 +
  Private Extern Mix_FreeChunk(chunk As Pointer)
 
   
 
   
  <FONT color=gray>' ''char * Mix_GetError()''</font>
+
  <FONT color=gray>' ''char * Mix_GetError()''
  '''Private''' Extern Mix_GetError() As String
+
' ''For reporting errors.''</font>
 +
  Private Extern Mix_GetError() As String
 
   
 
   
  <FONT color=gray>' ''void Mix_CloseAudio(void)''</font>
+
  <FONT color=gray>' ''void Mix_CloseAudio(void)''
  '''Private''' Extern Mix_CloseAudio()
+
' ''Close the mixer, halting all playing audio.''</font>
 +
  Private Extern Mix_CloseAudio()
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  '''Public''' Sub Main()
 
   
 
   
 
   Dim err As Integer
 
   Dim err As Integer
Riga 49: Riga 55:
 
   Dim audio_buffers As Short = 4096  <FONT color=gray>' ''Determina la quantità di blocchi di memoria utilizzati per incamerare ed eseguire l'audio''</font>
 
   Dim audio_buffers As Short = 4096  <FONT color=gray>' ''Determina la quantità di blocchi di memoria utilizzati per incamerare ed eseguire l'audio''</font>
 
   Dim music As Pointer
 
   Dim music As Pointer
 +
  Dim tm As Date
 
   
 
   
+
  <FONT color=gray>' ''Volendo, è possibile anche impostare il banco di suoni per l'esecuzione del Midi:''</font>
  <FONT color=gray>' ''Verifica innanzitutto se è disponibile almeno uno dei due soundfont bank utilizzabili:''</font>
+
  Mix_SetSoundFonts("''/percorso/del/file/soundbank.sf2''")
    If (InStr(Mix_GetSoundFonts(), "TimGM6mb.sf2") = 0) And (InStr(Mix_GetSoundFonts(), "FluidR3_GM.sf2") = 0) Then
 
      Error.Raise("Nessun soundfont: 'TimGM6mb.sf2' o 'FluidR3_GM.sf2' presente nel percorso: '/usr/share/sounds/sf2' !")
 
    Else
 
      Print "Soundfont disponibili:\n"; Mix_GetSoundFonts()
 
    Endif
 
 
    
 
    
 
  <FONT color=gray>' ''Inizializza la libreria "SDL_mixer" con specifiche impoostazioni audio:''</font>
 
  <FONT color=gray>' ''Inizializza la libreria "SDL_mixer" con specifiche impoostazioni audio:''</font>
    err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
+
  err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
    If err <> 0 Then Error.Raise("Impossibile inizializzare l'audio: " & Mix_GetError())
+
  If err <> 0 Then Error.Raise("Impossibile inizializzare l'audio: " & Mix_GetError())
 
    
 
    
 
  <FONT color=gray>' ''Carica il file Midi:''</font>
 
  <FONT color=gray>' ''Carica il file Midi:''</font>
    music = Mix_LoadMUS("''/percorso/del/file.mid''")
+
  music = Mix_LoadMUS("''/percorso/del/file.mid''")
    If IsNull(music) Then Error.Raise("Impossibile caricare il file Midi: " & Mix_GetError())
+
  If music == 0 Then Error.Raise("Impossibile caricare il file Midi: " & Mix_GetError())
 
   
 
   
 
  <FONT color=gray>' ''Esegue il file Midi. Se il secondo argomento è posto a 0 il file sarà eseguito soltanto una volta.''
 
  <FONT color=gray>' ''Esegue il file Midi. Se il secondo argomento è posto a 0 il file sarà eseguito soltanto una volta.''
 
  ' ''Se è posto a -1 il file sarà eseguito all'infinito:''</font>
 
  ' ''Se è posto a -1 il file sarà eseguito all'infinito:''</font>
    err = Mix_PlayMusic(music, 0)
+
  err = Mix_PlayMusic(music, 0)
    If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & Mix_GetError())
+
  If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & Mix_GetError())
 
 
<FONT color=gray>' ''Attende che sia terminato il file Midi:''</font>
 
    While Mix_PlayingMusic() <> 0
 
      Wait 0.01
 
    Wend
 
 
 
<FONT color=gray>' ''Va in chiusura''</font>
 
 
   
 
   
 +
  tm = Now
 +
 
 +
<FONT color=gray>' ''Effettua un ciclo per consentire l'esecuzione del file Midi e ne usce solo al termine dell'esecuzione:''</font>
 +
  Repeat
 +
    Write "\r" & Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
 +
    Wait 0.01
 +
  Until Mix_PlayingMusic() == 0
 +
 
 
  <FONT color=gray>' ''Libera la memoria precedentemente allocata per l'esecuzione sonora:''</font>
 
  <FONT color=gray>' ''Libera la memoria precedentemente allocata per l'esecuzione sonora:''</font>
 
     Mix_FreeChunk(music)
 
     Mix_FreeChunk(music)
 
 
 
  <FONT color=gray>' ''Chiude l'interfaccia audio SDL_mixer:''</font>
 
  <FONT color=gray>' ''Chiude l'interfaccia audio SDL_mixer:''</font>
 
     Mix_CloseAudio()
 
     Mix_CloseAudio()
Riga 92: Riga 92:
 
=Riferimenti=
 
=Riferimenti=
 
* Il sito dell'[http://wiki.libsdl.org/moin.fcg/CategoryAPI API di SDL].
 
* Il sito dell'[http://wiki.libsdl.org/moin.fcg/CategoryAPI API di SDL].
 +
* http://www.libsdl.org/projects/SDL_mixer/
 
* il sito di [http://www.webkinesia.com/games/sdl-sound1.php www.webkinesia.com]
 
* il sito di [http://www.webkinesia.com/games/sdl-sound1.php www.webkinesia.com]

Versione attuale delle 16:28, 4 gen 2022

Va precisato che ormai la Libreria SDL è obsoleta: al suo posto va utilizzata la Libreria SDL2.


La libreria SDL è un API multi-piattaforma contenente funzioni per la gestione multimediale dell'audio e del video.

Per poter eseguire file Midi, è necessario utilizzare la libreria SDL_mixer che viene utilizzata con la libreria SDL. Essa, più in generale, permette ai programmatori di usare più campioni con la musica, e di semplificare la gestione del caricamento, della riproduzione di campioni e della musica da diversi tipi di formati di file.
Per l'ascolto dei file Midi, si potrà anche impostare il file banco di suoni .sf2 nell'apposita funzione Mix_SetSoundFonts().

Per utilizzare in Gambas le risorse della libreria libSDL_mixer, bisognerà richiamare la libreria: libSDL_mixer-1.2.so.0.12.0

Mostriamo di seguito un semplice codice per eseguire un file Midi in un'applicazione a riga di comando:

Private Const AUDIO_S16SYS As Integer = 32784
Private Const STEREO As Integer = 2


Library "libSDL_mixer-1.2:0.12.0"

' int Mix_SetSoundFonts(const char *paths)
' Set SoundFonts paths to use by supported MIDI backends.
Private Extern Mix_SetSoundFonts(paths As String) As Integer

' int Mix_OpenAudio(Int frequency, Uint16 Format, Int channels, Int chunksize)
' Open the mixer with a certain audio format.
Private Extern Mix_OpenAudio(frequency As Integer, formatSh As Short, channels As Byte, chunksize As Integer) As Integer

' Mix_Music *Mix_LoadMUS(const char *file)
' Load a wave file or a music.
Private Extern Mix_LoadMUS(file As String) As Pointer

' int Mix_PlayMusic(Mix_Music *music, int loops)
' Play an audio chunk on a specific channel.
Private Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer

' Int Mix_PlayingMusic()
' Check the status of a specific channel.
Private Extern Mix_PlayingMusic() As Integer

' void Mix_FreeChunk(Mix_Chunk *chunk)
' Free an audio chunk previously loaded.
Private Extern Mix_FreeChunk(chunk As Pointer)

' char * Mix_GetError()
' For reporting errors.
Private Extern Mix_GetError() As String

' void Mix_CloseAudio(void)
' Close the mixer, halting all playing audio.
Private Extern Mix_CloseAudio()


Public Sub Main()

 Dim err As Integer
 Dim audio_rate As Integer = 44100   ' Imposta la frequenza che verrà usata da "SDL_mixer"
 Dim audio_buffers As Short = 4096   ' Determina la quantità di blocchi di memoria utilizzati per incamerare ed eseguire l'audio
 Dim music As Pointer
 Dim tm As Date

' Volendo, è possibile anche impostare il banco di suoni per l'esecuzione del Midi:
 Mix_SetSoundFonts("/percorso/del/file/soundbank.sf2")
  
' Inizializza la libreria "SDL_mixer" con specifiche impoostazioni audio:
 err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
 If err <> 0 Then Error.Raise("Impossibile inizializzare l'audio: " & Mix_GetError())
 
' Carica il file Midi:
 music = Mix_LoadMUS("/percorso/del/file.mid")
 If music == 0 Then Error.Raise("Impossibile caricare il file Midi: " & Mix_GetError())

' Esegue il file Midi. Se il secondo argomento è posto a 0 il file sarà eseguito soltanto una volta.
' Se è posto a -1 il file sarà eseguito all'infinito:
 err = Mix_PlayMusic(music, 0)
 If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & Mix_GetError())

 tm = Now
 
' Effettua un ciclo per consentire l'esecuzione del file Midi e ne usce solo al termine dell'esecuzione:
 Repeat 
   Write "\r" & Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
   Wait 0.01
 Until Mix_PlayingMusic() == 0
 
' Libera la memoria precedentemente allocata per l'esecuzione sonora:
   Mix_FreeChunk(music)
' Chiude l'interfaccia audio SDL_mixer:
   Mix_CloseAudio()
 
End


Riferimenti