Trabajar con canciones

Started by Yawin, September 12, 2012, 01:53:03 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Yawin

¡Hola a todos! No sabía como titular este problemilla que tengo. Os explico:


Estoy haciendo un juego estilo arcanoid que tiene dos modos: el "Standard" y el "Cafeína". En el modo cafeína tengo como música de fondo una "trance chunta-chunta a tope de power" en bucle y quiero hacer que cuando entre en el trance empiecen a aparecer colorines y que la pantalla tiemble y cosas así. ¿Cómo podría detectar cuando la canción entra en trance? Y si fuera posible ¿podría detectar cuando suena el bombo?


Esto último, se que hay gente que en C lo programa detectando cuando suenan unos rangos determinados de algo (se nota que no se mucho de sonido xDD) pero no se si en Bennu es posible hacerlo.
Gracias a todos por vuestra ayuda.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

KeoH

Josebita creo q estaba probando hace tiempo otras librerias de sonido para poder toquetear estas cosas ... creo q actualmente no podemos .. a no ser que te las arregles con el tiempo de reproduccion de la cancion o algo asi ..

Yawin

Había pensado lo del tiempo de la reproducción, pero con eso, tendría que comerme mucho el tarro para sincronizarme con cada vez que el bombo hace bum.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Erkosone

Hola, tienes un modo sencillo de hacerlo, prepara 2 samples en formato .ogg o wav, uno será el que suena a velocidad normal, el otro grabado acelerado, así puedes montar tu propio mini motor para ensamblar la canción mediante varios "patern" o samples, imagina cortar una canción en 5 trozos, entonces pones un pequeño código que detecte cuando termina de sonar el 1 y pones en play en 2.. así todo el rato.. es sencillo, para saber cuando suena el bombo.. pues necesitas saber el tiempo entre bombo y bombo, con un timer puedes 'a ojo' hacer que quede bien, y cuando quieras que se acelere la canción pues cambias al segundo pack de samples.


Esto sería infinitamente mas sencillo de hacer con una librería como la Fmod por que puedes cargar un archivo en formato .mod .xm o similar y la propia librería tiene funciones que te devuelven la posición en la que se encuentra el cursor interno del reproductor en la partitura, pero claro.. la fmod es de pago..


Creo que puedes apañarlo con lo que te comento, no será perfecto pero puede dar el pego perfectamente ;)

gecko

si, con timers seria lo mas sencillo.
Y para los golpes no bastaria saber los BPM de la cancion y en base a eso hacer los calculos?

Si estás con ganas podes programarte una pequeña aplicacion que vaya guardando el tiempo en que pulsas determinada tecla, y manualmente ir marcando los bombos que dices :)
Torres Baldi Studio
http://torresbaldi.com

l1nk3rn3l

LA SDL MIXER DEBE DECIR la posicion de donde va la cancion creoo..

sino revisare las funciones y la incluiremos

Rein (K´)ah Al-Ghul

obtienes el tiempo de la maquina, y comienzas a reproducir la cancion
luego vuelves a pedir el tiempo de la maquina,
si lo restas tienes el tiempo que va de una cancion...

ahora si paras la cancion o algo, deberiaas ajustar el las formulas

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

gecko

bennu tiene timers (en centesimos de segundo! creo), no hace falta usar la hora del sistema.
Con iniciarlo junto a la cancion deberia ser suficiente.
Torres Baldi Studio
http://torresbaldi.com

Yawin

¿En serio no creéis que es mejor tener una función que te diga si está sonando una frecuencia X?


Así, nunca tendría que contar los bombos de una canción, se programa una vez esa función y sirve para cualquier canción. Imaginad que a mitad del desarrollo quiero cambiar la canción porque he encontrado/hecho una mejor, vaya putada, ¿no?


Eso sin contar con que se desincronice el proceso de la canción con el resto del programa (sabéis que puede pasar).


Nah, si aprendo cómo hacer dll para Bennu, intentaré aprender cómo se hace en C e intentar hacerlo. Si no, aunque sea, postearé cómo se hace en C para ver si algún alma caritativa me lo hace xDD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

l1nk3rn3l

#9
http://www.gamedev.net/topic/478353-sdl_mixer-how-to-get-music-position/


http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_65.html



como estamos ocupados aqui la solucion haber si alguien la incluye en la distro oficial
que falta hace saber la posicion de la cancion..



USANDO la funcion register effect

o obteniendo el tiempo en milisegundos
sdl_get_ticks como proponen en la pagina anterior ..

cualquiera sirve..
.

Yawin

Quote from: l1nk3rn3l on September 17, 2012, 02:39:10 PM
http://www.gamedev.net/topic/478353-sdl_mixer-how-to-get-music-position/


http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_65.html



como estamos ocupados aqui la solucion haber si alguien la incluye en la distro oficial
que falta hace saber la posicion de la cancion..



USANDO la funcion register effect

o obteniendo el tiempo en milisegundos
sdl_get_ticks como proponen en la pagina anterior ..

cualquiera sirve..
.


Gracias por los links, los miraré. Pero sigo pensando que me voy a hacer esa dll que digo. A corto plazo parece una estupidez, pero a largo plazo, creo que ganaré en funcionalidades y tiempo.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Erkosone

Lo mejor que puedes hacer es coger una lib que ya tenga esto hecho y la portes a bennu, calcular la frecuencia del sonido no es complicado pero requiere un conocimiento extremo del formato de audio con el que trabajes, y para cada formato cambia el sistema de interpretación, si quieres probarlo a hacer tu mismo te recomiendo que sea en formato wav que es muy muy sencillo abrir un archivo en este formato y analizarlo, y "supongo" y digo supongo por que no tengo ni idea de si es así o no.. pero supongo que leer el stream por donde viajan los byte´s del archivo o buffer hacia la targeta de sonido debe ser sencillo de hacer, solo sería capturar un paquete de samples de 'n' byte´s y mirar las veces que la información de cada pack hace el cambio de valor positivo a valor negativo durante un tiempo y ale.. ya tienes la frecuencia que está sonando..


Pero una cosa es decirlo y otra es hacerlo,  mucha suerte y animo con ello!

Erkosone

Aunque ahora que hago memoria.. oye preguntale a Josebita, recuerdo haber visto un programa suyo en BennuGD que hacia esto ya.. estoy casi seguro que era suyo, era un vídeo o algo así de lo que estaba haciendo con la Fmod.

Yawin

Quote from: Erkosone on September 17, 2012, 04:22:33 PMpero supongo que leer el stream por donde viajan los byte´s del archivo o buffer hacia la targeta de sonido debe ser sencillo de hacer, solo sería capturar un paquete de samples de 'n' byte´s y mirar las veces que la información de cada pack hace el cambio de valor positivo a valor negativo durante un tiempo y ale.. ya tienes la frecuencia que está sonando...
Precisamente eso era lo que había pensado. Capturar lo que que está pasando por la tarjeta de sonido (o por el buffer de salida de audio) y mirar qué pasa. Y sí, ya se que es más complicado hacerlo que decirlo xDD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end