Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

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

Ejecutar Un File Midi Con Las Funciones Externas Del API De SDL
Artículo
Responder citando    Descargar mensaje  
Mensaje 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 
vuott - Ver perfil del usuario Enviar mensaje privado  
vuott [ Domingo, 02 Marzo 2014, 00:02 ]
 


Ejecutar Un File Midi Con Las Funciones Externas Del API De SDL
Comentarios
Responder citando    Descargar mensaje  
Mensaje 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



 
jguardon - Ver perfil del usuario Enviar mensaje privado  
jguardon [ Domingo, 02 Marzo 2014, 01:14 ]
Responder citando    Descargar mensaje  
Mensaje 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.  



 
vuott - Ver perfil del usuario Enviar mensaje privado  
vuott [ Domingo, 02 Marzo 2014, 14:42 ]
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 1
 
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron