Bennu Game Development

Foros en Español => Extensiones => Mensaje iniciado por: warrior_rockk en Septiembre 09, 2015, 01:13:29 pm

Título: mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 09, 2015, 01:13:29 pm
Estos días he estado trasteando, por curiosidad , como hacer módulos en Bennu y, aprovechando que encontré en internet una librería en C de emulación de sintetizadores de consolas, me he animado con este módulo que reproduce formatos de música de diversas consolas. En concreto:



AY        ZX Spectrum/Amstrad CPC
GBS       Nintendo Game Boy
GYM       Sega Genesis/Mega Drive
HES       NEC TurboGrafx-16/PC Engine
KSS       MSX Home Computer/other Z80 systems (doesn't support FM sound)
NSF/NSFE  Nintendo NES/Famicom (with VRC 6, Namco 106, and FME-7 sound)
SAP       Atari systems using POKEY sound chip
SPC       Super Nintendo/Super Famicom
VGM/VGZ   Sega Master System/Mark III, Sega Genesis/Mega Drive,BBC Micro


Su uso es muy simple, con load_song(string filename), cargamos en memoria la canción que queramos (autodetecta el tipo de sistema) y con play_song() lo reproducimos.
Existen diversas funciones para cambiar el tempo, silenciar canales independientes, obtener información de la canción, hacer fade, etc...
Esta es la lista de funciones hasta ahora:


Código: [Seleccionar]
//cargar un archivo de musica

int gme_load_song(string filename)


//reproducir musica cargada
int gme_play_song()


//detener musica
int gme_stop_song()


//pausar musica
int gme_pause_song()


//reanudar musica
int gme_resume_song()


//obtener numero de voces / canales
int gme_voice_count()


//mutear voz / canal
int gme_mute_voice(int voice)


//desmutear voz / canal
int gme_unmute_voice(int voice)


//setear tempo (1.0 = tiempo normal)
int gme_set_tempo(float tempo)


//devuelve true si la canción ha terminado
int gme_song_ended()


//devuelve información de la pista. Existen varias constantes tales como GME_GAME_INFO o GME_SONG_INFO.. en el ejemplo están todos)
string gme_get_song_info(int info_type)


//devuelve (en milisegundos) la duración de la canción
double gme_get_song_length()


//devuelve (en milisegundos) la duración del intro de la canción (-1 si no tuviera)
double gme_get_intro_length()


//devuelve (en milisegundos) la duración del loop de la canción (-1 si no tuviera)
double gme_get_loop_length()


//devuelve los milisegundos de reproducción actual
double gme_get_song_pos()


//hace un fade off de la musica a la duracion de milisegundos que se le pase)
int gme_fade_off(double duration_ms)


//devuelve true si está haciendo fade off
int gme_is_fading()



Adjunto la extensión y ejemplo de uso donde se puede ver fácilmente las diversas opciones que tiene.




Cosas pendientes por hacer:
===================
-descomprimir automáticamente archivos vgm comprimidos
-función para cambiar el volumen de la canción
-integrarlo en SDL_mixer para mejor convivencia con Bennu
-documentar todas funciones
-...


Saludos!



Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: JaViS en Septiembre 09, 2015, 02:12:51 pm
Muy bueno! muchas gracias!!

Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: FreeYourMind en Septiembre 09, 2015, 02:27:56 pm
excelente aporte. cual es el nombre de la libreria original ?
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 09, 2015, 03:31:34 pm
excelente aporte. cual es el nombre de la libreria original ?


GME (game music emulator http://www.slack.net/~ant/nes-emu/ (http://www.slack.net/~ant/nes-emu/)) De ahí el nombre del módulo
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: La momia que fuma en Septiembre 13, 2015, 01:49:56 pm
Uoooooo!! Esto lo propuse yo hace tiempo (Concretamente, soporte spc solamente) con nulo éxito.


Me quito el sombrero, acabas de desbloquear una libreria de música GIGANTESCA para nuestros proyectos :D  (Siempre que no sean comerciales, obviamente ;D )


Y aún encima tirando de archivos de música ridículamente pequeños...(Alguna vez tuve que pasar a ogg alguna musiquilla de 16 bits y algo se me moría en el alma al comparar tamaño con el formato original xD)


Bravo!!
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 13, 2015, 03:47:52 pm
A mi me pasaba lo mismo. Para mis proyectos retro utilizo música chiptune y me daba mucha rabia tener que pasarlo a formatos "superiores" con el consiguiente aumento de tamaño. Pero sobretodo me daba rabia no poder utilizar las posibilidades de tener control sobre la música, por ejemplo, poder acelerar el tempo cuando se te va a acabar el tiempo de juego, mutear el canal de percusión para dar ambiente a que te metes en una cueva, poder reproducir intro al comenzar el nivel y luego hacer loop sin repetir el intro... se me abre un mundo de posibilidades!
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: La momia que fuma en Septiembre 13, 2015, 05:08:04 pm
Lo de ajustar el tempo va un poco loco todavía, no? O solo me pasa a mí?


A poco que toco en el programa de ejemplo para aumentar tempo...solo tiene dos velocidades, normal o a toda leche xD


O sea, le doy a subir tempo y se pone a toda leche. Le doy a bajar para dejarlo como estaba, y no me hace caso, tampoco puedo hacerlo más rápido aún si sigo dandole a subir, se queda atascado en esa velocidad hasta que cargo otra (o la misma) canción. Como mucho reacciona quedandose pillado en un mismo punto si hago al tempo bajar de 0...


(Incluso si partiendo de la musica en estado normal, le doy a bajar tempo, se pone a toda leche igual xD)
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 13, 2015, 06:01:41 pm
Acabo de probar lo del tempo y me sucede exactamente lo mismo. Tengo algún fallo con esa función. Voy a revisarlo y lo corrijo.
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 13, 2015, 06:33:03 pm
Vale ya está. Un pequeño error tratando los float. No había probado esta función porque la hice en el curro y no puedo poner sonido allí jeje. Aquí está el módulo corregido. Tener en cuenta que en el código de ejemplo no se comprueba si se hace KEY_DOWN o KEY_UP con lo que hay rebote en las acciones.
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: La momia que fuma en Septiembre 13, 2015, 07:09:22 pm
Tener en cuenta que en el código de ejemplo no se comprueba si se hace KEY_DOWN o KEY_UP con lo que hay rebote en las acciones.


Jeje, me había dado cuenta y se lo puse yo  :P  (Además de mostrar el valor de tempo)


Se me olvidó decírtelo antes, la musica de msx (al menos el archivo incluído en el ejemplo) no va...


Imagino que soporta (o soportará), ya que se visualiza en el programa ejemplo, loops de los que no saltan al principio de todo, no? (Lo malo es que ninguna de las canciones ejemplo parecen estar preparadas para ello, y a bote pronto no se me ocurre ninguna de ese tipo para hacer la prueba yo xD)


Ahora el tempo funciona de lujo, mola un puñao  ;D
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 15, 2015, 07:10:44 am
Miraré el ejemplo de MSX a ver si es problema del ejemplo que he buscado. A ver si muestro también algún ejemplo del tema de los loops con alguna muestra que tenga intro y loop.
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: Yawin en Septiembre 15, 2015, 02:31:20 pm
Sé que en sí este tema no va sobre esto. Pero ya que estáis posteando algunos que sabéis: ¿sería posible un tutorial sencillito de cómo hacer nuestras propias librerías?
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 15, 2015, 03:45:12 pm
Yo utilicé como información el ejemplo de sumarLib de los ejemplos DLL del BennuPack y la información sobre DLLs de la wiki (aunque aun se refiera a Fenix) y en el mismo día ya estaba desarrollando mi librería.
Lo mejor es que le eches un vistazo y hagas pruebas y postees dudas concretas que podamos ayudar. Aunque no estaría mal un tutorial con todo explicado y resumido. A ver se saca tiempo y se puede escribir....
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: FreeYourMind en Septiembre 15, 2015, 05:14:05 pm
pero si tutoriales ya se han hecho hace tiempo, prg hizo alguno sino recuerdo mal, fué de donde miré como hacer modulos
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 16, 2015, 09:12:08 am
Nunca había revisado el completísimo manual de Bennu de Osk, pero hay un capítulo referente a desarrollo de módulos que es bastante detallado
http://www.bennugd.org/downloads/ManualBennuGD_Osk.pdf (http://www.bennugd.org/downloads/ManualBennuGD_Osk.pdf)
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Septiembre 26, 2015, 06:33:05 pm
Actualizado el módulo.


Añadida función para obtener y setear la posición de reproducción:
dword gme_get_song_position();
gme_set_song_position(dword miliseconds)


Añadido parámetro a play_song para reproducir una vez o en modo loop repitiendo el intro (si lo tuviera). Existen para ello las constantes GME_PLAY_ONCE y GME_PLAY_LOOP


Debido a que hay formatos de consolas que contienen multipistas, se añade función para reproducir una pista concreta del archivo, así como una función para saber el número de pistas existentes:


int gme_track_count();
int gme_play_track(int trackNum, [PLAYMODE]);


En el ejemplo se hace uso de las multipistas. También se ha cambiado el archivo de ejemplo de MSX que no funcionaba.


Saludos!



Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: Drumpi en Diciembre 24, 2015, 07:19:08 pm
Oye, genial, tengo ganas de probarla.
Especialmente porque comentas lo de silenciar canales, alterar la velocidad... es algo que aun tiene pendiente los módulos que reproducen otros formatos tracker (mod, s3m, xm, it...).

Lo que aun no sé es cómo extraer las melodías de juegos de SNES, siempre me ha intrigado, porque la única opción que conozco sólo permite guardar como si lo estuvieras grabando. Más por escucharlas que por usarlas (hace poco encontré librerías para el OpenMPT con bancos de sonidos de MD, SNES, NES y similares, y aun tengo que probarlas).
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Diciembre 25, 2015, 11:06:06 am
Desde esta página http://snesmusic.org/v2/ (http://snesmusic.org/v2/) puedes descargarte bandas sonoras de super nintendo. Luego para escucharlas, o bien puedes usar este modulo y hacerte un sencillo reproductor en Bennnu  ;D ;D  , o existen plugins para muchísimos reproductores. Yo desde hace 15 años sigo usando el mismo reproductor, Winamp v2.8 con plugins de reproducción chiptune  ;)
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: Drumpi en Diciembre 27, 2015, 04:26:11 pm
Muchas gracias, Warrior. Hace tiempo descargué un reproductor SPC, pero las músicas que encontraba sufrían todas del mismo problema: al estar extraidas con ZSNES, se comían el primer segundo, no hacían loops y duraban un tiempo predeterminado.
Siempre he querido tener un reproductor de estos formatos para poder oir las músicas de Ristar, Sonic o Tortugas Ninja 4 sin tener que poner el emulador de la Wiz (en el de SNES tendría que overclockear la consola, con el aumento de consumo de batería, y no podría bloqear los controles). Soy un fan de los sound test y me cabreo cuando un juego con buena música no lo trae (Blast Corps, Castlevania, Sonic Advance 2... sí, lo trae, pero para desbloquearlo tienes que ser un maestro del juego :S ).
Título: Re:mod_gme: Modulo para reproducir archivos de música de consola
Publicado por: warrior_rockk en Febrero 16, 2016, 08:28:51 am
Se me olvidó adjuntar las fuentes del módulo. Mas vale tarde...