Ejecutar Un File Midi Con Las Funciones Externas Del API De SDL


Objetivo: Ejecutar Un File Midi Con Las Funciones Externas Del API De SDL
Aquí está el código para ejecutar un archivo Midi con funciones externas del API de SDL.

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




Referencias (en italiano):
http://www.gambas-it.org/wiki/index..._del_API_di_SDL

última edición por vuott el Domingo, 02 Marzo 2014, 00:02; editado 1 vez
Perfil MP  
Objetivo: Re: Ejecutar Un File Midi Con Las Funciones Externas Del API De SDL
Gracias por el aporte, vuott.

¿Has pensado en juntar todo lo relativo a a SDL y Alsa y crear una aplicación grande, por ejemplo un secuenciador Midi o un editor tipo DAW (Como Sonar, Cubase, etc)?

Saludos

Perfil MP  
Objetivo: Re: Ejecutar Un File Midi Con Las Funciones Externas Del API De SDL
jguardon escribió: [Ver mensaje]

¿Has pensado en juntar todo....

Hola jguardon,
yo estoy más interesado en el Midi que en el audio. Mi largo estudio de las funciones de Alsa para gestionar el Midi, me ha llevado a realizar el secuenciador Midi, que he adjuntado aquí:
http://foro.gambas-es.org/viewtopic.php?f=5&t=3586

Pero, de verdad, el mi objectivo final es construir una aplicacion de escritura musical para hacer las partituras. ...estoy en el medio del obra.

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1335s (PHP: -3% SQL: 103%)
Consultas SQL: 24 - Debug off - GZIP Activado