Se necesita tener instalado el archivo soundfont de Timidity: "/usr/share/sounds/sf2/TimGM6mb.sf2", o aquello de Fluidsynth: "/usr/share/sounds/sf2/FluidR3_GM.sf2"
Private Const AUDIO_S16SYS As Integer = 32784
Private Const STEREO As Integer = 2
Library "libSDL_mixer-1.2:0.12.0"
' const char* Mix_GetSoundFonts(void)
Private Extern Mix_GetSoundFonts() As String
' 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 Main()
Dim err As Integer
Dim audio_rate As Integer = 44100 ' Ajusta la frecuencia que será utilizada de "SDL_mixer"
Dim audio_buffers As Short = 4096 ' Determina la cantidad de bloques de memoria que se utilizan para mantener y ejecutar el audio
Dim music As Pointer
' Primero verifica si existe al menos uno de los dos banco SoundFont que se pueden utilizar:
If (InStr(Mix_GetSoundFonts(), "TimGM6mb.sf2") = 0) And (InStr(Mix_GetSoundFonts(), "FluidR3_GM.sf2") = 0) Then
Error.Raise("Ningún soundfont: 'TimGM6mb.sf2' o 'FluidR3_GM.sf2' en la dirección: '/usr/share/sounds/sf2' !")
Else
Print "Soundfont disponibles:\n"; Mix_GetSoundFonts()
Endif
' Inicializa la librería "SDL_mixer" con las configuraciónes especificas del audio:
err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
If err <> 0 Then Error.Raise("Imposible inicializar el audio: " & Mix_GetError())
' Carga el archivo Midi:
music = Mix_LoadMUS("/dirección/del/file.mid")
If IsNull(music) Then Error.Raise("Imposible cargar el file Midi: " & Mix_GetError())
' Ejecuta el archivo Midi. Si el segundo argumento se establece en 0, el archivo se ejecutará sólo una vez.
' Si se establece en -1 el archivo se ejecutará indefinidamente:
err = Mix_PlayMusic(music, 0)
If err < 0 Then Error.Raise("Imposible ejecutar el file Midi: " & Mix_GetError())
' Espere hasta que se termine el archivo Midi:
While Mix_PlayingMusic() <> 0
Wait 0.01
Wend
' Libera la memoria asignada previamente a la ejecución de sonido:
Mix_FreeChunk(music)
' Cierra la interfaz audio SDL_mixer:
Mix_CloseAudio()
End
Private Const STEREO As Integer = 2
Library "libSDL_mixer-1.2:0.12.0"
' const char* Mix_GetSoundFonts(void)
Private Extern Mix_GetSoundFonts() As String
' 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 Main()
Dim err As Integer
Dim audio_rate As Integer = 44100 ' Ajusta la frecuencia que será utilizada de "SDL_mixer"
Dim audio_buffers As Short = 4096 ' Determina la cantidad de bloques de memoria que se utilizan para mantener y ejecutar el audio
Dim music As Pointer
' Primero verifica si existe al menos uno de los dos banco SoundFont que se pueden utilizar:
If (InStr(Mix_GetSoundFonts(), "TimGM6mb.sf2") = 0) And (InStr(Mix_GetSoundFonts(), "FluidR3_GM.sf2") = 0) Then
Error.Raise("Ningún soundfont: 'TimGM6mb.sf2' o 'FluidR3_GM.sf2' en la dirección: '/usr/share/sounds/sf2' !")
Else
Print "Soundfont disponibles:\n"; Mix_GetSoundFonts()
Endif
' Inicializa la librería "SDL_mixer" con las configuraciónes especificas del audio:
err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
If err <> 0 Then Error.Raise("Imposible inicializar el audio: " & Mix_GetError())
' Carga el archivo Midi:
music = Mix_LoadMUS("/dirección/del/file.mid")
If IsNull(music) Then Error.Raise("Imposible cargar el file Midi: " & Mix_GetError())
' Ejecuta el archivo Midi. Si el segundo argumento se establece en 0, el archivo se ejecutará sólo una vez.
' Si se establece en -1 el archivo se ejecutará indefinidamente:
err = Mix_PlayMusic(music, 0)
If err < 0 Then Error.Raise("Imposible ejecutar el file Midi: " & Mix_GetError())
' Espere hasta que se termine el archivo Midi:
While Mix_PlayingMusic() <> 0
Wait 0.01
Wend
' Libera la memoria asignada previamente a la ejecución de sonido:
Mix_FreeChunk(music)
' Cierra la interfaz audio SDL_mixer:
Mix_CloseAudio()
End
Referencias (en italiano):
http://www.gambas-it.org/wiki/index..._del_API_di_SDL