Bennu Game Development

Foros en Español => Extensiones => Topic started by: DCelso on February 23, 2010, 04:13:05 PM

Title: mod_notes
Post by: DCelso on February 23, 2010, 04:13:05 PM
Hola a todos, ayer me entró nostalgia al escuchar mi propia canción en la mod_beep, me dió nosequé que no sea portable, así que buscando info por aquí y por allí, he visto como controlar la sdl_audio para producir sonido y aquí os traigo el primer resultado.
A ver si os va a todos.
Por ahora solo dejo el binario (es que las malas cosas se pegan :D, eh free :D)

Como en otras ocasiones, adjunto viene un txt de cómo usarlo y un prg de ejemplo.
Title: Re: mod_notes
Post by: Drumpi on February 23, 2010, 05:25:03 PM
Genial, a ver si saco un ratillo, que últimamente ando demasiado obsesionado XD

Pues este módulo y el del espeak son los que más me interesarán en un futuro, así que no me los perdais, pliiis :D
Title: Re: mod_notes
Post by: FreeYourMind on February 23, 2010, 05:32:22 PM
Hohhohohoh, la envidia sana ha echo sus frutos!!!!
Pon el código hombre, que hoy limpio mi super detalla mod_beep (repleta de millones de lineas de codigo) y subo el código  ;D
Title: Re: mod_notes
Post by: SplinterGU on February 23, 2010, 06:20:25 PM
sin codigos no sirven los modulos... va para ambos...
Title: Re: mod_notes
Post by: FreeYourMind on February 23, 2010, 06:45:56 PM
De mi parte dejadme respirar unos minutos que ya lo saco.
Title: Re: mod_notes
Post by: DCelso on February 23, 2010, 07:01:01 PM
pero si no me has ayudado mucho con mis problemas ¿ como voy a dejar el código fuente? ¿lleno de bugs y código muerto?
Title: Re: mod_notes
Post by: FreeYourMind on February 23, 2010, 07:04:39 PM
DCelso, te tengo como un tesoro del foro, por favor no te intentes asemejar a la mayoria de los humanos, los cuales sólo tenemos odio, envidia, etc. Sigue con la buena imagen que he tenido siempre de ti porfa ;)
Title: Re: mod_notes
Post by: DCelso on February 23, 2010, 07:05:07 PM
a ver si lo arrego y lo comparto.

EDIT: Killo, que rápido eres no me has dado tiempo a explicarme :D, era una respuesta irónica.
Title: Re: mod_notes
Post by: FreeYourMind on February 23, 2010, 07:51:01 PM
Así esta mejor, por cierto el mio ya ruta solito y limpio como un bebe, ahora voy intentar completarlo con mas funciones y ver el tema de ponerlo a ejecutarse en background sin esperar el frame; como dice Splinter.
Title: Re: mod_notes
Post by: DCelso on February 23, 2010, 11:27:59 PM
Nada, no consigo solucionar el problema.
El tema es que tengo definidas las funciones
void  __bgdexport( mod_notes, module_initialize )()
y
void  __bgdexport( mod_notes, module_finalize )()

pero al crear el prg e insertar el import "mod_notes" no se ejecuta la función de inicialización.

Tampoco consigo entender lo de las constantes floats.

En otros módulos, cuando he necesitado una constante, la he creado así

DLCONSTANT  __bgdexport( mod_notes, constants_def )[] =
{
   {"MAX_LEN", (BASETYPE)TYPE_INT, 100    },
   { NULL          , (BASETYPE)0       , 0  }
};

y luego para usarla desde un prg hacía if (i<MAX_LEN) ...., pero me da que me ha ido de casualidad. porque yo creía que MAX_LEN vaía 100 y por lo que dices en el post de mesa de ayuda relaccionado es el índice dentro de un array de constantes.
Por lo que ahora me surje la duda de cómo establecer el valor de una constante, ya sea entera o float :(. (no sé tanto como creía)

Dejo aquí el código que llevo a ver si SplinterGU le puedes dar un repasito, y sin tocar nada, decirme qué debo de cambiar :D y te lo agradeceré eternamente.




Title: Re: mod_notes
Post by: DCelso on February 23, 2010, 11:28:43 PM
hay que compilarla contra libSDL y libbgdrtm nada más.
Title: Re: mod_notes
Post by: SplinterGU on February 24, 2010, 06:21:15 PM
DCelso

cuidado con el ; en "#define DEF_WHOLE_NOTE_TIME 200;"

por que usas cpp? por lo que veo el codigo esta bien, yo te diria que no uses cpp, que uses .c o que declares las estructuras y funciones que estas exportando como "C"... pero me parece que lo mejor es que no uses C++.
Title: Re: mod_notes
Post by: DCelso on February 24, 2010, 08:53:13 PM
es para usar las std templates, uff, no hay ganas de hacer colas dinámicas en c, soy vaguete.

std::queue<BeepObject> beeps;

Y yeah, lo del punto y coma se me escapó, no es a posta, sino un error :D.
Title: Re: mod_notes
Post by: SplinterGU on February 24, 2010, 09:04:48 PM
puede que el problema sea por usar C++... en principio deberia inicializar y todo... el codigo a simple vista lo veo bien...
Title: Re: mod_notes
Post by: DCelso on February 24, 2010, 09:09:16 PM
entonces con un extern "C" en esas funciones valdría?
No me digas que me va a tocar implementar un tda de colas en C.
Title: Re: mod_notes
Post by: SplinterGU on February 24, 2010, 09:39:31 PM
hace unas colas en C, es lo mas estupido que hay... vamos... lo unico que tenes que hacer es un FIFO...

sos vago... :D
Title: Re: mod_notes
Post by: Windgate on February 24, 2010, 11:37:21 PM
Yo también soy vago, llevo tiempo con la idea de hacer un TAD de lista genérica en Bennu, tengo hasta una hoja por ahí con el código escrito A MANO!!! Y todavía no me he puesto :S

Son cosas que después de haberlas sufrido estudiando dan verdadero asco de programar...
Title: Re: mod_notes
Post by: Drumpi on February 25, 2010, 01:41:29 AM
Decidmelo a mi, que estoy de listas enlazadas...
Lo gracioso es que las estoy usando EN BENNU :S

Pero vamos, que no es complicado, sólo es hartarse a escribir código y muy puñetero de probar, pero a la tercera que haces es como saltar a la pata coja.
Title: Re: mod_notes
Post by: DCelso on February 25, 2010, 10:59:30 AM
Tenías razón, splinterGU, es culpa de c++.

he pasado el código a C, por lo que he tenido que implementar las dichosas colas, (sin querer he implementado de rebote las pilas, yo ahí diciendo que mierda falla porqué veo al revés los datos y me doy cuenta de que el error estaba en la inserción que insertaba al principio en vez de al final, juas juas que ennortao estoy) y ahora va bien la función de inicialización.

Lo que me conlleva a preguntar entonces los módulos programados en c++ no van a soportar las funciones de inicialización y finalización de forma automática? Habría que solventar este problemilla o averiguar qué hacer en el código C++ para que valla.
Title: Re: mod_notes
Post by: FreeYourMind on February 25, 2010, 11:24:03 AM
Pues valla, yo estoy utilizando extensión c++, ya se que para lo que tengo con c serviria (para el modulo Open3D no), como no inicializo/finalizo nada pues no me habia enterao.
Title: Re: mod_notes
Post by: osk on February 25, 2010, 12:46:55 PM
Y ahora que estamos con tanto módulo...¿no se podría hacer uno que sirviera precisamente para dotar a Bennu de una api sencilla para crear y administrar colas,pilas,listas simple/doble enlazadas y circulares, por ejemplo? Del tipo cole_nueva(), cola_añadir(), cola_quitar(), etc...
Y no quiero hablar de grafs ni de árboles porque entonces alguien me mata.
Title: Re: mod_notes
Post by: DCelso on February 25, 2010, 01:12:08 PM
ya hay ¿No? alguien creo que portó algo al respecto, habría que buscar, pero yo recuerdo que sí que las hay, que cuando la ví dije, espero no tener que usarla :D.
Title: Re: mod_notes
Post by: osk on February 25, 2010, 01:29:24 PM
Ah...pues no tengo noticia.
Title: Re: mod_notes
Post by: FreeYourMind on February 25, 2010, 02:06:31 PM
Os voy a poner mi siguiente idea, antes de sacarla, para que despues no saqueis vuestro modulo con mi idea  ;D

No existian modulos de efectos gráficos para Fenix ? Como el tipico fire.dll, water.dll, etc.
No lo he visto para Bennu, mi idea seria hacer uno tipo 'mod_freeeffects' (para no machacarse con un supuesto mod_effects') donde ir poniendo todo tipo de efectos gráficos y tambien efectos de transiciones entre pantallas.

Sobre las transiciones de pantallas, como en los arcades de los 80, donde se pasa de una fase a otra (o pantalla, ejemplo el Super Chase H.Q. y mogollon de juegos de Taito) haciendo cuadraditos recortados en pantalla, tiras, etc.
Tenia unas implementaciones que lo hacia, de los tiempos de DIV, echas en DIV, me molaria encontrar estos códigos, ya que en su tiempo eran un pelin pesadas, pero a modo de modulo creo que seria cojonudo tener esto ;)

Ya que se ha levantado la moda de los mods, y como no parece interesaros un concurso al respecto, que tal empezar un mod_effects de forma colectiva y cada uno iria aportando distintos efectos o transiciones ???
Que os parece ?
Title: Re: mod_notes
Post by: DCelso on February 25, 2010, 02:47:25 PM
uff, muy chungo eso que dices free.

Por otro lado, gracias SpliterGU por animarme y decirme que yo podía, porque poder he podido.
Jurl, jurl, me he creado mis constantes float, haciendo el truco del millón, pero lo conseguí :D.
Ya tengo el módulo funcional y limpito como quería, ole, ole. Me daría un besazo a mí mismo si pudiera :(.
Title: Re: mod_notes
Post by: DCelso on February 25, 2010, 04:23:23 PM
Os dejo aqui la cuarta versión de este módulo.
Como siempre, vienen unos ejemplos de cómo usarla.
Está en spanglis, ya que casi todo está en inglés pero las constantes de las notas y de las figuras están en español ya que eso de usar C,D,A,etc me lía bastante para componer.
Hay un ejemplo avanzado de como crearte tu propio formato de notas y cómo leerlo y tocarlo desde bennu.
Free, he usado en uno de los ejemplos tu música de mario, espero que no te importe.
Title: Re: mod_notes
Post by: FreeYourMind on February 25, 2010, 05:33:16 PM
A compartir entonces  ;D
Title: Re: mod_notes
Post by: SplinterGU on February 25, 2010, 08:02:33 PM
lo de los floats no va a quedar prolijo cuando tenga que hacer algo para corregir este tema...
Title: Re: mod_notes
Post by: FreeYourMind on February 25, 2010, 08:55:08 PM
Claro que no, si tengo suerte y consigo sacar el modulo este finde con multitrhead, ya llevará un ejemplo con todas las musicas que tengo hasta ahora incluida la que tu hiciste  ;D.
Title: Re: mod_notes
Post by: FreeYourMind on February 25, 2010, 09:08:44 PM
Macho, acabo de probar tu modulo, pues no se que te diga, me has quitado las ganas de seguir con el mio, me lo has plagiado completamente  ;D

El tuyo suena mucho mejor, será por los floats no ? Parece que decias de que no funcionaban en el mio...

Estaba con curiosidad para ver si el tuyo sonaria de fondo ejecutandose en multithread pero parece que tampoco lo hace...
Eso si, me joroba el sonido al ponerlo, y me dice que ya esta en uso (lo escribe en la consola), despues termina y la musica del juego no toca.

Mola mucho el sonido del mario, se ve gran diferencia, no se si es por los floats o por el tipo de audio ser distinto, ya que en mi portatil se emulan los bips y eso si, no es tan realistico como un autentico speaker.

Buen trabajo, creo que será mejor que termines por implementar el multiproceso en el tuyo, que lo haces mucho mejor que yo y tienes más experiencia.  ;)
Title: Re: mod_notes
Post by: DCelso on February 25, 2010, 10:47:09 PM
:D, es porque el mío toca por la tarjeta de sonido, sintetiza un seno para cada frecuencia de cada nota y lo discretiza a 22khz, mono,16 bits, por eso suena como más límpio, no tan speaker :D.
Quizás si lo pongo a 8khz y 8 bits se escuche peor, pero más retro :D.
Title: Re: mod_notes
Post by: DCelso on February 25, 2010, 10:51:25 PM
En cuanto a lo de multithread, es tan simple como poner la música a sonar en un "process" a parte.
¿Has visto el prg avanzado?
tiene un formato de texto propio que he llamado ".notes", que es más facil de usar para componer.

Lo de los float no tiene mucho que ver, creo. Yo he probado con ints el mío y se escucha más o menos igual, quizás un poquitín más limpio, pero no tengo oído de músico y para mí suenan prácticamente igual por no decir igual del todo :D.
Title: Re: mod_notes
Post by: FreeYourMind on February 25, 2010, 10:55:27 PM
Estoy como loco para saber como hacerlo, puedes poner un ejemplo ?, yo creo que todos estos modulos de sonido lo tienen que tener obligatoriamente, no vas a parar la ejecución de los gráficos para escuchar la musica antes....
Title: Re: mod_notes
Post by: DCelso on February 26, 2010, 12:00:18 AM
me refiero en código benno a:

begin
 set_mode(320,200,32);
  coche(200,100);
 loop
    frame;
 end
end

process coche(x,y)
begin
 graph = load_png("mi_coche.png");
 loop
    if (key(_left) )x--;end
    if (key(_right) )x++;end
    if (key(_space)) toca_clapson();end
    frame;
 end
 unload_map(0,graph);
end

process toca_clapson()
begin
  play_note(65,200);
  play_note(650,100);
  play_note(65,100);
  play_note(650,200);
end

por un decir.
Title: Re: mod_notes
Post by: Drumpi on February 26, 2010, 12:33:36 AM
Tened en cuenta que el midi usa un instrumento pre-grabado en memoria para hacer música, por lo que genera señales sinusoidales (según el instrumento puede ser un único seno, dos, tres... veinte) y que incluso varían con el tiempo.
El altavoz del PC usa una señal cuadrada para generar sonido. No se si se filtrará para obtener un seno, o si ya lo hacen las capacidades parásitas, pero es lo que había antes para generar música: un oscilador digital al cual se le podía modificar la frecuencia, conectado a un altavoz.

Probad a usar el instrumento "square wave" del midi y lo notaréis... o si no, se parecerá mucho a los viejos sonidos de PC de cintas o consolas portátiles :P
Title: Re: mod_notes
Post by: DCelso on February 26, 2010, 01:35:33 PM
Nueva versión.
he añadido las canciones que free puso en el post de mod_beep en formato ".notes" en el ejemplo avanzado. He modificado el ejemplo avanzado para que soporte inserción de frecuencias en hercios , silencios y duraciones en milisegundos en el formato ".notes"
he añadido una función para saber si sigue la música sonando.
y he dado soporte para configurar la frecuencia de muestreo y el  número de bits de muestreo. Son dos variables globales y para que surgan efecto hay que reiniciar el módulo notes con la funcion notes_init después de cambiar el valor de las variables.
He probado 8000,11025,22100 y 44100 y todas se escuchan mas o menos igual, he probado a cambiar los bits de muestreo a 8 y se escucha un ruido horripilante de fondo, no se si es que estoy haciendo algo mal al calcular la frecuencia.
Title: Re: mod_notes
Post by: Prg on March 16, 2010, 02:51:04 AM
excelente idea la de tener todas las direcciones de las librerias extraoficiales en un solo lugar.
karma++
de esta forma el buscar un módulo será tan fácil como visitar este tema :)