PDA

Ver la versión completa : Duda dudosa: juegos de musiquillas



^MiSaTo^
28/11/2007, 01:23
Bueno siempre he tenido ganas de hacer un amplitude o algo similar pero entre que no tengo ni tiempo ni conocimientos nunca me he puesto con ello.
Aun así de vez en cuando me da la cosilla de pensar cómo lo haría.
Como aquí algunos habeis hecho juegos que sincronizan música con interaccion con la consola (el DDR de miq, los ouendan de fenix...) quería saber cómo se haria algo así, vaya cómo lo habeis hecho o cómo lo haríais vosotros. Aunque sólo sea por curiosidad para no estar con el run run XD

JoJo_ReloadeD
28/11/2007, 01:39
Yo personalmente nunca me he metido en ningun proyecto asi, pero te puedo comentar como me imagino que van.

Cuando reproduces a pelo un fichero de voz, tienes que ir pasando a tu dac las muestras una a una, a su tiempo adecuado (dado por la frecuencia) y en el formato que sea 8 o 16 bits (cada muestra 1 o 2 bytes), stereo (2 dacs) o mono (1 dac).

Imagino que haciendo una media aritmetica de las muestras en un cuanto de tiempo (pongamos medio segundo), tienes un valor.

Segun ese valor haces que tu programa haga una cosa o otra. Asi se puede hacer que el programa actue al son de la musica :)

DMusta1ne
28/11/2007, 02:35
Mi humilde opinion (no soy muy ducho programando y no he programado nada por el estilo) es que los juegos tipo ddr la sincronía con la música viene de sincronizar la música con un fichero de datos que pueda interpretar el juego, de manera que al mismo tiempo que suena la música este fichero muestra unos valores característicos que el programa interpreta como un exito si se pulsa a la vez una tecla determinada. El Frets on Fire y su modo de edición de canciones da a entender un sistema así. Tan solo tendrías que echar un par de cuentas y estudiar un poco de solfeo ^^, algo así como crear un algoritmo que te permita trabajar con diferentes bmp, la unidad mínima de tiempo que vas a utilizar (ya sabes, una negra son dos corcheas, una corchea son dos semicorcheas, etc.. hasta que tu veas conveniente, creo que con dividir hasta 1/32 parte de negra es suficiente). Y crear un esquema de lectura secuencial de fichero en el que puedas controlar la velocidad de lectura en función de los bmp's a los que vaya la canción.

Lo que Jojo dice supongo que es mas para hacer algo tipo visualización del winamp, o un programa que responda a comandos de voz, un programa de edición de audio o algo así. Haría falta un algoritmo mas complejo para detectar por ejemplo los bombos de una canción, que es lo que serviría para hacer un tipo ddr, algo así como detectar una secuencia determinada en una frecuencia determinada (buscar similitudes con un sample).

Espero haber ayudado y que se me haya entendido ^^

Theck
28/11/2007, 11:23
El stepmanía es tal como lo ha comentado el compañero DMusta1ne, hay un archivo DWI que contiene los pasos y se ajusta a ojímetro ;)

Luego lo que haces es comparar la pulsación con el tiempo al que debería haberse pulsado y dependiendo del desfase se compara con unas ventanas, con más alejado, peor nota. En el DDR hay:
- Boo: No le has dado a nada
- Miss: Le has dado a la que no toca
- Almost: Le has dado, pero de refilón.
- Good: Le has dado, ya dentro, pero no demasiado bien.
- Great: Muy bien, bastante acompasado.
- Perfect: En el tiempo, como debe ser.
- Marvelous (solo en algunas): Le has dado exactamente en el tiempo justo.

De esta forma la dificultad se puede medir en lo exigente que es ese timing a la hora de puntuar tu reacción. Cuando haces que un perfect no sea tan exigente, el juego será más fácil ya que la barra de vida sube o baja en función de que nota te da para cada pulsación, siendo good la que ni quita ni da vida.

Jurk
28/11/2007, 11:32
En el clon para pc de singstar tambien ocurre algo parecido...

Hay que crear un archivo con las notas que hay que cantar en un momento dado. Entonces el juego solo se preocupa de poner la cancion y comparar lo que has cantado con lo que el archivo le dice en cada momento. En el stepmania, pasa lo mismo, tal y como ha comentado Theck... pero con pulsaciones (y con menos carga de proceso para la maquina)

chipan
28/11/2007, 12:08
Yo hago la sincronización por milisegundos; una vez calculas los milisegundos que dura un compas colocar las notas en su sitio es bastante facil.

Propeller
28/11/2007, 12:23
Yo estoy sincronizando por tiempo de compás y ticks (milisegundos) de SDL.

Propeller

^MiSaTo^
28/11/2007, 12:26
Osea en el fondo es comparar el tiempo en el que quieres que ocurra algo, así a groso modo no?
Esque eso es lo que se me ocurría a mi, pero pense que a lo mejor había otra forma más "compleja" de hacerlo.
Gracias a todos, lo mismo me aventuro a hacer el amplitude alguna vez ^^

Por otro lado... SDL soporta varios canales de audio simultáneos? (nunca toqué SDL_mixer ni nada relacionado con el audio)
Es decir si podría tener 3 sonidos a la vez e ir parando o silenciando unos y otros... Imagino que sí pero sólo es por confirmar.

Propeller
28/11/2007, 12:39
Por otro lado... SDL soporta varios canales de audio simultáneos? (nunca toqué SDL_mixer ni nada relacionado con el audio)
Es decir si podría tener 3 sonidos a la vez e ir parando o silenciando unos y otros... Imagino que sí pero sólo es por confirmar.

Si, SDL_mixer soporta varios canales para efectos de audio (con panning, etc.) más otro estéreo para la música.

Propeller

DMusta1ne
28/11/2007, 12:39
El stepmanía es tal como lo ha comentado el compañero DMusta1ne, hay un archivo DWI que contiene los pasos y se ajusta a ojímetro ;)

Luego lo que haces es comparar la pulsación con el tiempo al que debería haberse pulsado y dependiendo del desfase se compara con unas ventanas, con más alejado, peor nota. En el DDR hay:
- Boo: No le has dado a nada
- Miss: Le has dado a la que no toca
- Almost: Le has dado, pero de refilón.
- Good: Le has dado, ya dentro, pero no demasiado bien.
- Great: Muy bien, bastante acompasado.
- Perfect: En el tiempo, como debe ser.
- Marvelous (solo en algunas): Le has dado exactamente en el tiempo justo.

De esta forma la dificultad se puede medir en lo exigente que es ese timing a la hora de puntuar tu reacción. Cuando haces que un perfect no sea tan exigente, el juego será más fácil ya que la barra de vida sube o baja en función de que nota te da para cada pulsación, siendo good la que ni quita ni da vida.

Exactamente, habría que dar un margen al jugador, es decir, en el fichero de lectura secuencial del que hablabamos, tiene que leerse una especie de "campana de gauss" de valores a evaluar para determinar lo bien que lo ha hecho el jugador, algo como [...]0,0,1,1,1,1,2,2,2,2,3,3,3,4,5,4,3,3,3,0,0,0[...], suponiendo que:

- Miss=0
- Almost=1
- Good=2
- Great=3
- Perfect=4
- Marvelous=5

Tu sabes, el esquema también dependería de la unidad mínima de tiempo que elijas (pienso que con 1/16 d negra o 1/32 tendrías suficiente)

^MiSaTo^
28/11/2007, 12:46
Si, SDL_mixer soporta varios canales para efectos de audio (con panning, etc.) más otro estéreo para la música.

Propeller

Perfecto. A ver si algún día tengo tiempo para dedicarme a mi y me pongo con ello, que más o menos ya he aclarado mis dudas de cómo va.

Gracias a todos!!

DMusta1ne
28/11/2007, 13:04
Yo estoy sincronizando por tiempo de compás y ticks (milisegundos) de SDL.

Propeller

Hay quería yo llegar, ahora un poco de teoría de solfeo (tranquilos solo lo referente al ritmo, es facil de entender :D ):

Imagina que la canción en cuestión va a unos 60bpm (60 golpes por minuto, un golpe por segundo para poner las cosas mas fáciles), y tenemos un compás de cuatro por cuatro, el más comun en la música moderna (4x4: cuatro tiempos, cada tiempo dura una negra). Por poner un ejemplo sencillo, imaginate el tema de White Stripes - Seven Nation Army (el de la promo de cuatro del niño portero acojonado, x si el tema no es bastante conocido xD) Creo que va a unos 110bmp la negra y 4x4 por compás, el bombo cadencioso de la batería son 4 negras dentro de cada compás, pues tendrías que ajustar el golpe exacto (el que haga que el golpe sea Marvelous) a (110/60)*1000=1001'83 milisegundos, unos 1002ms (un milisegundo son 1/1000 segundos no? :P). Pues algo así. Ahora crea un buen editor (ahi esta lo dificil) y un buen esquema de lectura que trabaje con ese editor.

Buena suerte, y espero ser de ayuda Misato :brindis:

^MiSaTo^
28/11/2007, 13:23
Hay quería yo llegar, ahora un poco de teoría de solfeo (tranquilos solo lo referente al ritmo, es facil de entender :D ):

Imagina que la canción en cuestión va a unos 60bpm (60 golpes por minuto, un golpe por segundo para poner las cosas mas fáciles), y tenemos un compás de cuatro por cuatro, el más comun en la música moderna (4x4: cuatro tiempos, cada tiempo dura una negra). Por poner un ejemplo sencillo, imaginate el tema de White Stripes - Seven Nation Army (el de la promo de cuatro del niño portero acojonado, x si el tema no es bastante conocido xD) Creo que va a unos 110bmp la negra y 4x4 por compás, el bombo cadencioso de la batería son 4 negras dentro de cada compás, pues tendrías que ajustar el golpe exacto (el que haga que el golpe sea Marvelous) a (110/60)*1000=1001'83 milisegundos, unos 1002ms (un milisegundo son 1/1000 segundos no? :P). Pues algo así. Ahora crea un buen editor (ahi esta lo dificil) y un buen esquema de lectura que trabaje con ese editor.

Buena suerte, y espero ser de ayuda Misato :brindis:

Mil gracias por esta explicación porqe yo de música lo justo (si se lo que es una negra y tal pero vaya que de ahí no me sacas)
Si me pongo con ello al final, ya os asaltaré a los músicos xDDD

DMusta1ne
28/11/2007, 14:00
Mil gracias por esta explicación porqe yo de música lo justo (si se lo que es una negra y tal pero vaya que de ahí no me sacas)
Si me pongo con ello al final, ya os asaltaré a los músicos xDDD

Será un honor ayudarte en lo que haga falta (referente a programación, música etc... mal pensaos xD). Buena suerte en el desarrollo de tu ddr!!

^MiSaTo^
28/11/2007, 14:04
Será un honor ayudarte en lo que haga falta (referente a programación, música etc... mal pensaos xD). Buena suerte en el desarrollo de tu ddr!!

No, no será un DDR. Será un amplitude ;)
Que son varias pistas de música por separado y demás.

DMusta1ne
28/11/2007, 14:28
No, no será un DDR. Será un amplitude ;)
Que son varias pistas de música por separado y demás.

Tampoco he comentado que sobre el mundo ddr y estas cosas mi unica experiencia es el Guitar Zero/Frets on Fire, por eso de que soy "mas heavy que satán" (http://www.gp32spain.com/foros/showpost.php?p=637180&postcount=2010) xDDD. No soy fanático ni mucho menos de este mundo, y de ahí mi desconocimiento de lo que es un amplitude. Gracias por la aclaración :)

efegea
28/11/2007, 16:06
No, no será un DDR. Será un amplitude ;)
Que son varias pistas de música por separado y demás.

SDL_mixer, como ha dicho Propeller, no permite más de una canción simultáneamente, es decir que tienes varios canales pero son sólo para efectos de sonido y uno sólo para música

^MiSaTo^
28/11/2007, 16:25
SDL_mixer, como ha dicho Propeller, no permite más de una canción simultáneamente, es decir que tienes varios canales pero son sólo para efectos de sonido y uno sólo para música

ah entendí mal entonces, porque bueno el amplitude es simplemente hacer la cancioncilla por instrumentos.
Es decir tienes una pista para la batería, otra para la guitarra, otra para la voz... y así vas formando la canción al sonar todas a la vez.
Si con SDL no se puede hacer, qué alternativas tendría?
Esque ya os digo que en tema de sonido ni idea.

Theck
28/11/2007, 19:30
Imagino que si que se podría si lo que haces es reproducir sonidos independientes. O sea, si es como el beatmanía, donde cuando le dabas bien a una tecla sonaba un sonido o conjunto de ellos ya preparado para eso (en el BM98 eran wavs) por lo que podrías usar los canales normales ya que no haces loop con estos en un principio, ¿no?

^MiSaTo^
28/11/2007, 19:49
Imagino que si que se podría si lo que haces es reproducir sonidos independientes. O sea, si es como el beatmanía, donde cuando le dabas bien a una tecla sonaba un sonido o conjunto de ellos ya preparado para eso (en el BM98 eran wavs) por lo que podrías usar los canales normales ya que no haces loop con estos en un principio, ¿no?

No son loops. Simplemente son los instrumentos/voces de la cancion por separado que obviamente si reproduces todos a la vez suena la cancion completa ;)

Puck2099
28/11/2007, 22:19
Si con SDL no se puede hacer, qué alternativas tendría?

Escribir directamente en el buffer de sonido de linux (suponiendo que fuera para este SO).

Cada canal es una onda, así que solo tienes que sumarlos todos y comprobar que no se pase del máximo (por ejemplo dividiendo el valor de cada canal por el número de canales) y ya volcar ese resultado al buffer de audio.

Si es para la GP2X con las minilib puedes hacerlo sin demasiadas complicaciones (mírate el código del WS2X para hacerte una idea).

Saludos

^MiSaTo^
28/11/2007, 22:23
Escribir directamente en el buffer de sonido de linux (suponiendo que fuera para este SO).

Cada canal es una onda, así que solo tienes que sumarlos todos y comprobar que no se pase del máximo (por ejemplo dividiendo el valor de cada canal por el número de canales) y ya volcar ese resultado al buffer de audio.

Si es para la GP2X con las minilib puedes hacerlo sin demasiadas complicaciones (mírate el código del WS2X para hacerte una idea).

Saludos
Sería para la GP2X.
Gracias, si algún día tengo tiempo de hacer algo que no sea estudiar o trabajar me pondré con ello y lo miraré.

BuD
29/11/2007, 23:34
No, no será un DDR. Será un amplitude ;)
Que son varias pistas de música por separado y demás.

Lo vas a hacer en C/C++? Tengo algo que te puede resultar interesante.

^MiSaTo^
29/11/2007, 23:41
Lo vas a hacer en C/C++? Tengo algo que te puede resultar interesante.

Si si lo hago seria en C/C++. Pero no se cuándo podría ponerme con ello.