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

Da Gambas-it.org - Wikipedia.
Riga 13: Riga 13:
  
 
Mostriamo di seguito un semplice codice per eseguire un file Midi:
 
Mostriamo di seguito un semplice codice per eseguire un file Midi:
'''Private''' Const SDL_INIT_AUDIO As Integer = 16
 
 
  '''Private''' Const AUDIO_S16SYS As Integer = 32784
 
  '''Private''' Const AUDIO_S16SYS As Integer = 32784
 
  '''Private''' Const STEREO As Integer = 2
 
  '''Private''' Const STEREO As Integer = 2
 
 
Library "libSDL-1.2:0.11.4"
 
 
<FONT color=gray>' ''int SDL_Init(Uint32 flags)''</font>
 
'''Private''' Extern SDL_Init(flags As Integer) As Integer
 
 
<FONT color=gray>' ''char * SDL_GetError(void)''</font>
 
'''Private''' Extern SDL_GetError() As String
 
 
<FONT color=gray>' ''void SDL_Quit(void)''</font>
 
'''Private''' Extern SDL_Quit()
 
 
   
 
   
 
   
 
   
Riga 61: Riga 48:
 
   Dim music As Pointer
 
   Dim music As Pointer
 
   
 
   
 
<FONT color=gray>' ''Inizializza il dispositivo SDL audio:''</font>
 
    err = SDL_Init(SDL_INIT_AUDIO)
 
    If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL: " & SDL_GetError())
 
 
   
 
   
 
  <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''")
Riga 95: Riga 77:
 
     Mix_CloseAudio()
 
     Mix_CloseAudio()
 
    
 
    
    SDL_Quit()
 
 
 
  '''End'''
 
  '''End'''
  

Versione delle 18:20, 28 feb 2014

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 utilizzare in Gambas le risorse delle librerie libSDL e libSDL_mixer, bisognerà richiamare le librerie (con l'attuale versione):

libSDL-1.2.so.0.11.4
libSDL_mixer-1.2.so.0.12.0

E' inoltre necessario aver installato il file banco di suoni di default di Timidity: "/usr/share/sounds/sf2/TimGM6mb.sf2", oppure quello di Fluidsynth: "/usr/share/sounds/sf2/FluidR3_GM.sf2"


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"

' 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

' Mix_Music *Mix_LoadMUS(const char *file)
Private Extern Mix_LoadMUS(file As String) As Pointer

' int Mix_PlayMusic(Mix_Music *music, int loops)
Private Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer

' Int Mix_PlayingMusic()
Private Extern Mix_PlayingMusic() As Integer

' void Mix_FreeChunk(Mix_Chunk *chunk)
Private Extern Mix_FreeChunk(chunk As Pointer)

' char * Mix_GetError()
Private Extern Mix_GetError() As String

' void Mix_CloseAudio(void)
Private Extern Mix_CloseAudio()


Public Sub Button1_Click()

 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


' 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 IsNull(music) 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à esguito all'infinito:
   err = Mix_PlayMusic(music, 0)
   If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & Mix_GetError())


' Attende che sia terminato il file Midi:
   While Mix_PlayingMusic() <> 0
     Wait 0.01
   Wend


' Va in chiusura

' Libera la memoria precedentemente allocata per l'esecuzione sonora:
   Mix_FreeChunk(music)
 
' Chiude l'interfaccia audio SDL e SDL_mixer:
   Mix_CloseAudio()
 
End


Riferimenti