Differenze tra le versioni di "La gestione dei file MIDI mediante le funzioni esterne del API di SDL"
(18 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 | ||
− | + | 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 | |
− | |||
− | |||
− | |||
− | |||
− | Mostriamo di seguito un semplice codice per eseguire un file Midi | ||
− | |||
− | |||
− | |||
− | Library " | + | Library "libSDL_mixer-1.2:0.12.0" |
− | <FONT color=gray>' ''int | + | <FONT color=gray>' ''int Mix_SetSoundFonts(const char *paths)'' |
− | + | ' ''Set SoundFonts paths to use by supported MIDI backends.''</font> | |
+ | Private Extern Mix_SetSoundFonts(paths As String) As Integer | ||
− | <FONT color=gray>' '' | + | <FONT color=gray>' ''int Mix_OpenAudio(Int frequency, Uint16 Format, Int channels, Int chunksize)'' |
− | + | ' ''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>' '' | + | <FONT color=gray>' ''Mix_Music *Mix_LoadMUS(const char *file)'' |
− | + | ' ''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)'' | ||
+ | ' ''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()'' | |
− | + | ' ''Check the status of a specific channel.''</font> | |
− | <FONT color=gray>' '' | + | Private Extern Mix_PlayingMusic() As Integer |
− | |||
− | |||
− | |||
− | ''' | ||
− | |||
− | |||
− | |||
− | <FONT color=gray>' '' | + | <FONT color=gray>' ''void Mix_FreeChunk(Mix_Chunk *chunk)'' |
− | + | ' ''Free an audio chunk previously loaded.''</font> | |
+ | Private Extern Mix_FreeChunk(chunk As Pointer) | ||
− | <FONT color=gray>' '' | + | <FONT color=gray>' ''char * Mix_GetError()'' |
− | ''' | + | ' ''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)'' |
− | + | ' ''Close the mixer, halting all playing audio.''</font> | |
+ | Private Extern Mix_CloseAudio() | ||
− | '''Public''' Sub | + | '''Public''' Sub Main() |
Dim err As Integer | Dim err As Integer | ||
Riga 60: | 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>' '' | + | Mix_SetSoundFonts("''/percorso/del/file/soundbank.sf2''") |
− | + | ||
− | |||
− | |||
<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) | |
− | + | 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''") | |
− | + | 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à | + | ' ''Se è posto a -1 il file sarà eseguito all'infinito:''</font> |
− | + | err = Mix_PlayMusic(music, 0) | |
− | + | If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & Mix_GetError()) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | 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 | ||
Mix_CloseAudio() | Mix_CloseAudio() | ||
− | |||
− | |||
'''End''' | '''End''' | ||
Riga 103: | 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
- Il sito dell'API di SDL.
- http://www.libsdl.org/projects/SDL_mixer/
- il sito di www.webkinesia.com