[DEMO] Mi primera demo para DS

Buenas!

Me presento a esta comunidad de la NDS con mi primera demo para esta consola :)

Hace 3 días, decidí echarle un vistazo a las herramientas de programación disponibles para esta pequeña maravilla de máquina, para ver en que estado estaban las librerias y herramientas necesarias para trabajar. Mi grata sorpresa es que he encontrado material suficientemente abundante, aunque no suficientemente desarrollado.

El caso es que no os voy a engañar: hace 3 dias no sabía nada sobre programación de DS y poco conozco esta scene a la que soy un recien llegado (tengo la DS Lite desde hace muy poco y tambien hace muy poco que tengo el Passme+ M3 SD). Pero bueno, todo es solucionable y no es la primera vez que trabajo en la scene de otras consolas...

LA DEMO

Bueno, despues de este preambulo, pasemos a explicar la demo.

A mi de la DS me atrae tanto la pantalla sensitiva como la posibilidad de usar un microfono y esa era una de las cosas en las que queria centrar esta demo. Tambien me gusta controlar la generación de sonido y dar un repaso a la parte grafica, para ir cogiendo el tranquillo a la maquina.

Así pues, esta demo, utiliza la pantalla superior para mostrar un cubo 3D, que puede ser girado usando el PAD o de una forma mas curiosa aun: SOPLANDO por el microfono :)

En la pantalla inferior, se muestra un teclado de organo y esta es la segunda parte de la demo: combinacion de la pantalla sensitiva con un manejo del audio avanzado.

Pulsando las diferentes 'teclas' podemos oir el sonido de las diferentes notas. Para darle cierto timbre a la voz, utilizo dos voces, una de ellas una octava por debajo y lo destacable es que utilizo un sistema de loop continuo de la onda que cesa al dejar de pulsar la nota o al cambiarla, teniendo control de esto desde el arm9

La parte superior de esta pantalla, muestra la onda capturada por el microfono, que por cierto, me dió algun problema implementar esto porque la libreria del microfono, tiene un error en la forma de leer los samples y fue una de las cosas que me volvió loco.

Así pues, la demo consiste en un organo en el que podemos actuar sobre las teclas y un cubo 3D que podemos girar soplando al microfono. Espero que os guste ;)


LA ODISEA DE HACERLA

Cuando uno empieza a programar para una maquina nueva, uno no conoce nada y practicamente, se tiene que buscar uno la vida en todo o casi todo y a veces, problemas que otras personas se han encontrado y solucionado mil y una vez, se repiten otras tantas veces por cada persona nueva que empieza en esto.

En mi caso, yo tenia muy claro mis prioridades: la pantalla tactil y un manejo controlado del sonido, tanto en la captura como en la emision, son mis prioridades.

El primer ejemplo de sonido que compilé usando LIBNDS, tenía un problema que me estuvo volviendo loco un buen numero de horas. Por alguna extraña razón, el sonido insistia en oirse solo por el canal izquierdo, pese a que estaba todo ajustado para que se oyese en ambos canales.

El problema venia de que en un ejecutable de NDS hay dos secciones de codigo: una para arm9 (que es la que yo compilo) y otra para arm7.

Al montar el ejecutable con la NDSTOOL (cosa que hace el compilador automaticamente), no le especifica ningun binario de codigo arm7, asi que es de suponer que mete un codigo por defecto.

Dicho codigo por defecto, debe ser muy antiguo y con alguna incompatibilidad con LIBNDS o algun error y esa es la razon de que el audio solo saliese por un canal.

Revisando algunos de los ejemplos bajados, veo que hay uno que es el ejemplo base del codigo usado por la LIBNDS en el arm7. Lo compilo y enlazo ese binario con la NDSTOOL y EUREKA! ahora si funciona correctamente el audio :)


Sin embargo, veo que el audio se trabaja desde la interrupcion de retrazado vertical y no utilizando ningun medio de sincronizacion de ambos procesadores. Por eso decido investigar esta linea ya que revisando la libreria, veo que hay algunos problemas.

La NDS tiene 16 canales de audio que en la lib se usan en PCM de la siguiente forma: aunque hay 16 structuras para programar el audio, en LIBNDS se utiliza solo la primera para transmitir el audio. Eso hace que si se intentan programar varios sonidos a la vez antes de que se produzca un VBLANK, los datos se machaquen sin que el arm7 se haya dado cuenta del cambio.

El codigo original para arm7, no liga estas estructuras directamente con los canales de audio, si no que va mirando si hay algun canal libre de audio y de ser así, introduce los datos desde la estructura.

Esta forma de trabajar hace que si tu programas un sonido, esperas al vblank y programas otro sonido, puedas tener polifonía, pero si no has esperado ese vblank, lo normal es que un sonido anule al otro. Tampoco es posible programar la repeticion continua de una onda, pararla, sustituirla por otra o grabar por microfono.

Por tanto, me vi en la reflesion de 'inventar' un sistema que sin dejar de ser compatible con lo antiguo, me permitiese hacer un uso mas avanzado del sonido.


-IPC El IPC es la forma que tenemos de comunicar los dos procesadores, sincronizandolos. Desgraciadamente, en el emulador
'Dualis' no se soporta ese metodo de sincronizacion mediante interrupciones, pero para estas contingencias, empleo un codigo que me permite usar VBLANK de forma alternativa, aunque en la consola esto no es necesario (eso es solo para compatibilizar el codigo)


Mediante IPC se consigue que en el arm9, una vez modificados los datos oportuno, mediante una escritura en un registro, se solicite la interrupcion de tratamiento en el arm7, que en mi caso, hace que se trate el sonido de forma directa, sin tener que esperar a que se produzca una interrupcion VBLANK (59,8 veces por segundo), para ser tratados.

-Microfono Como he mencionado arriba, el mocrofono me dió un problema debido a que los datos no son leidos correctamente en LIBNDS (tendre que ponerme en contacto con la gente que la desarrolla, para comentarselo)

Ademas, el microfono solo se podía usar desde arm7 y había que comunicarlo de alguna forma. Por compatibilidad, la opcion elegida ha sido usar el mismo sistema que para enviar un sample, solo que en vez de especificar en el formato de sonido 1 o 2 (samples de 8-16 bit), en mi caso especifico 16. El audio es leido como samples de 8 bits con signo, que son almacenados un byte despues del comienzo del buffer, ya que el primer byte se utiliza como byte de estado de la lectura del microfono.

-Audio Para el audio yo queria una plena compatibilidad con el viejo codigo de audio empleado hasta ahora (para poder compilar por ejemplo, otros codigos que hagan uso de ese metodo) y al mismo tiempo garantizar plenos poderes sobre el.

Para ello uso un sistema multicanal en el que yo mismo especifico el canal a usar (lo cual me permite reprogramar un canal ya en uso, pero dado que es mejor llevar el control desde el arm9, no hay problema) y en el formato especifico las acciones a emprender de esta forma:

1-> reproduce audio a 8 bit por sample, una vez
2-> reproduce audio a 16 bit por sample, una vez

9-> reproduce audio a 8 bit por sample, en bucle infinito
10-> reproduce audio a 16 bit por sample, en bucle infinito

32-> para el audio

16-> graba audio (8 bits por sample, primer byte estado de grab.)
17-> para (aborta) la grabacion de microfono

Como veis, formas variadas, mientras que antes no era posible salvo las dos primeras

-Reconocimiento del audio : Bueno, la verdad es que uso un metodo 'empirico' para detectar cuando se sopla en el microfono. No es un codigo demasiado complicado :)

La demo hace uso de estas capacidades y solo queda crear una libreria que pueda trabajar paralelamente a la LIBNDS de forma optimizada, documentarla, etc, para que todos podais hacer uso de estas extensiones :)

-Material utilizado

- NDS Lite
- Passme+ M3 SD (con una SD de 512MB)
- LIBNDS
- Codigo de ejemplos para LIBNDS
- devkitARM
Enorabuena por tu primera demo y espero que sigas intentando hacer mas cosillas,si me animo algun dia lo intentare yo mismo

Sigue asi crack
Adjunto la demo aqui que por alguna razon, no subio [agggtt]

Adjuntos

Sin haber visto la demo (sólo por la descripción) me parece COJONUDA!!!!

Más aún cuando sólo llevas 3 días en la scene... Enhorabuena...

A ver si dentro de poco me animo yo también... ;)
Esta bien la idea... para llevar 3 dias te a quedado wapo :p


salu2!
Gracias ;). La verdad es que queda divertido ver la cara que pone la gente cuando soplas a la pantalla y se mueve el cubo XD y mientras... tocalá de nuevo Sam! . Espero que esto se pueda plasmar pronto en una libreria publica con todos los fuentes disponibles y algun que otro juego ;)
hermes eres un crack,enhorawena tio...para llebar tan poco tiempo te lo has currao mucho...enhorawena de nuevo tio :)
solo 3 dias?

pues me quito el sombrero [barret] .

Porque yo que he programado bastante para la DS no me he aclarado todavia con el sonido.
Yo como programador de palib durante bastante tiempo y novatillo en LibNDS, tambien me quito el sombrero y lo que haga falta... eres un genio. Bueno, esperemos que te escuchen los de libNDS e implementen tus MEJORAS en sus librerias o que saques esa libreria extendida que nos comentas con un poquito de documentacion.

Gracias por mapliar la Scene
[flipa] [flipa] [flipa] [flipa] [flipa] [flipa] [flipa] [flipa]


Hermes en la Scene de DS!!!!!!!!!!!!!!!!!!!!!!!!!!!
Bienvenido seas. No te faltará nuestro apoyo. Eres el más grande.
Joer, que contento me voy a dormir.
:D está muy bien, hay alguna nueva versión ? ^^
Viva Hermessssssssssss!!
Enhorabuena hermes, veo que ya es decidido dejar la PS2 y venirte a NDS por fin XDDDD

De verdad, el programa es la caña, enhorabuena. A ver con que nos sorprendes la proxima :)
Bienvenido tio!!

Y para haber hexo esto en solo 3 dias hay q decirlo...Eres un makina!!

Ta muy guapa la demo!!

Sigue sorprendiendonos,q se agradece;)

Un saludo tio!!
Despues del mediaplayer ya no em sorprendo de nada que hagas XD

Nahh en serio,te a quedado cojonudo ;)
La primera demo que voy a probar en cuanto salga el M3 lite

Tienes toda mi admiración y que sigas así [oki]
Hermes , en que andas metido ahora? si se puede saber, que si en 3 dias creaste aquello, ahora que han pasado unos cuantos mas... me da miedo pensar que eres capaz de sacar ;) animo
Buenas.

Siento la tardanza en responder, pero es que ya sabeis: el curro me roba todo el tiempo del mundo (que duro es empezar a currar despues de las vacas! XD).

Bueno, de momento he empezado a trabajar hoy en la transformacion del codigo hacia una lib en condiciones :). Me falta documentar el tema y hacer algunos ejemplos demostrativos que me sirvan tambien para probarlo todo.

La libreria de sonido ha mejorado con la inclusion de un reproductor de musica MOD, con lo cual tendremos la posibilidad de reproducir dicho formato desde el ARM7 y usar los canales sobrantes para efectos de sonido y cosas asi.

El nombre de la libreria es eSound (de enhanced Sound :P) e incluye soporte para microfono, reproduccion de ondas en formato PCM (8/16 bits) y MODPlayer todo ello de forma integrada y sin interferencias (por ejemplo, el microfono y el modplayer de forma original (que no es de creacion mia) , usaban el mismo timer). Todo ello integrado en un fichero .cpp y otro .h con las definiciones

En fin, ando con ello, pero voy a necesitar tiempo, porque quiero preparar las cosas bien, para que luego resulte facil de manejar para vosotros.

Ademas, todo el codigo fuente estará disponible para que podais añadir o quitar lo que os de la gana ;)


El objetivo ya lo sabeis: crear una libreria completa y autosuficiente para manejar el sonido en nuestros juegos homebrew.


PD: Por cierto, que la PS2 la 'abandone' hace mucho y me puse a trabajar primero para GP32 y luego para GP2X ;)
Me quito el sombrero!, en tampoco tiempo, gracias a desarrolladores como tú me dan unas ganas enormes de estudiar programación en serio, ya que sólo he llevado unas pocas materias en la preparatoria y lo que aprendo yo solo aqui en casa. Deseo por fin en 1 añito poder estudiar la carrera y crear cosas maravillosas como los haces.

Salu2
Madre mia, no solo la demo que te has currao, sino como la explicas, esto ayudara a muchisimos, entre los que me incluyo :P.

Genial trabajo [beer]
Bueno, pues posteo hoy para decir que tengo bastante avanzado el 'ejemplo' principal sobre el que estoy trabajando y puliendo la libreria de sonido.

Lo malo... es que voy a necesitar mas tiempo del que pensé para hacer ambas cosas y luego tratar de documentar lo mejor posible el uso de todo.

El ejemplo en el que estoy trabajando es un juego. Cuando hice la demo que colgué en este hilo, la hice partiendo de un ejemplo de LIBNDS al que añadí el teclado en la pantalla inferior, usando un background que basicamente, es un bitmap de 16 bits, en el que escribía directamente.

Por lo tanto para hacer un juego, era necesario que me empapara mas con la parte grafica, y mas el tipo d ejuego que queria hacer.

El juego, es un juego que utiliza las dos pantallas y donde controlamos una nave que va cruzando un campo de asteroides, controlandola con el 'lapiz' y el objetivo, es aparte de sobrevivir lo mas posible, recoger un objeto que aparece de vez en cuando, con ayuda de un campo de energia que se genera cada vez que soplamos al microfono.

El juego así explicado es bastante simple, pero su realizacion es algo mas compleja de lo que parece.

En este juego, en 2D, se hace uso de sprites en las dos pantallas.: está el sprite del objeto, de 16x16 pixeles, dos de la nave, de 32x32 (para hacer animacion) y otros dos sprites de 32x32 para crear asteroides de dos tipos.

Los sprites de los asteroides, utilizan una funcion del hardware para rotar hacia uno u otro sentido. Tambien por ejemplo, se utiliza la capacidad de escalar sprites para dibujar una miniatura de la nave, que representa las vidas que tenemos.


Tambien se usan las prioridades para que los diferentes objetos que aparecen en pantallas, sean dibujados correctamente.

En ambas pantallas , se usa el background 3 para representar el fondo del espacio estrellado, utilizando ademas, doble buffer para evitar parpadeos, mediante un bitmap de 256x256 (8 bits) para cada una.

En la pantalla superior, activo ademas, el background 2, para superponer, por ejemplo, la puntuacion (tambien con un bitmap de 8 bits)

Durante el juego se hace captura del microfono y (toca hacer pulmones XD) se reproducen efectos como la explosion de la nave, la captura de un objeto (o cuando escapa, que nos resta puntos) o el ruido de los motores de la nave (que es una onda en loop), aparte de la musica en formato MOD que escuchamos, asi que como veis, es un ejemplo muy complelto y suficientemente complejo para poder probar la libreria.

Lo unico, es que habra que esperar mas tiempo de lo previsto hasta que todo sea publico, pero lo bueno es que esta consolita esta consiguiendo engancharme mucho, pues a diferencia de otras, aquí se pueden hacer juegos en 2D apoyandose en otros elementos y que no requieran mucho tiempo de desarrollo y sin embargo, con una buena cuota de diversion.

PD: Lo mas dificil de todo, es no contar con nada de documentación y tener que buscar entre las librerias cualquier minimo detalle y encontrar soluciones mediante la prueba y el error, como me ha pasado por ejemplo, con el tema de los sprites, pero bueno, eso tiene como compensacion que aprendes a dominar mejor las cosas, ya que ganas experiencia directa.

Saludos.
[tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo]
Yo quiero probar ese juego!!!
Creo que hasta ahora no habia visto homebrews que hiciesen uso del microfono y tu le estas dando uso, sigue asi crack!!
yo quiero provar una libreria que integre sonido "de verdad" XD ... ^^
gracias
Hermes


Tienes prácticamente toda la información que necesites de sprites y fondos tanto en drunkencoders (light) como en Tonc (mucho más detellado).

Sobre los fondos, si no quieres comerte el coco e ir a lo fácil e ineficiente, usa extended backgrounds. Si no text backgrounds
webez


Cual es esa página de "Tonc"??
lo he probado y genial! [beer] PLAS PLAS PLAS PLAS

ere un makina!

5 estrellas!!


Gracias por el link.

Bueno, el juego lo tengo bastante avanzado, y ya solo falta meterle pequeños detalles.

Hoy le he metido la animacion de la explosion de la nave y he cambiado la jugabilidad haciendo que tengas que recoger una gema de un determinado color, que se te indica en la parte superior de la pantalla.

-Si coges la gema correcta, sumas 50 puntos
-Si coges una gema incorrecta, resta 50 puntos
-y si la gema buena desaparece por el fondo de la pantalla, te resta 25 puntos del ala.

El truquillo del juego está en saber cuando debemos asomar el bigote, en busca del objeto preciado y cuando nos comeremos un asteroide (o nos comerá el, según se mire). Quiza perder 25 puntos no sea tan malo, despues de todo XD

El juego es simple, los graficos, nada del otro mundo, pero... os veo viciandoos yendo a por la preciada gema mientra esquivais asteroides a diferente velocidad y empezais a desplegar el campo de energia de recogida, mediante la fuerza de vuestros soplidos al tiempo que os asegurais por el rabillo del ojo, que vais en busca de la gema correcta [qmparto]

A ver como lo dejo de fino en este fin de semana ;)
que crack, me gusta lo del piano, gracias :)

que raro que el moonshell no sea tuyo xD
30 respuestas