jueves, 25 de noviembre de 2021

Regreso a los noventa: «Entonces» de Melodrama

Con el tiempo, «Entonces» se ha convertido en la favorita de las canciones que compuse en los noventa, no tanto porque no tenga los defectos habituales de mi música, sino porque por algún motivo, en ella me molestan menos. Además, su historia es bastante curiosa...

No voy a decir que en aquella época se me ocurrieran más proyectos que canciones, porque era muy prolífico componiendo, pero sí que es cierto que siempre tenía en mente proyectos grandiosos. Constantemente pensaba en escribir nuevas bandas sonoras para mis películas favoritas, adaptar canciones que me gustaban y, en general, convertir cualquier idea en una especie de sinfonía al estilo de Jean-Michel Jarre. En general, tenía suerte si de cada proyecto que empezaba salía una canción que mereciera más o menos la pena, dos o tres pasables y luego una retahíla de fragmentos incompletos hasta que centraba mi atención en otra cosa. Así, los discos que «lanzaba» (en aquellos tiempos, para mí «lanzar» un disco era dedicar una tarde a grabar una serie de canciones en un cassette, escribir los títulos y buscarle una portada), venían a ser una colección de «grandes éxitos» de proyectos incompletos.

«La noche del océano» fue diferente. Me había gustado bastante un cuento de H. P. Lovecraft cuyo protagonista viajaba a un misterioso y sombrío pueblo costero en cuyas casas medio abandonadas se ocultaban las terribles abominaciones cósmicas que tanto le gustaban a Lovecraft, así que pensé, cómo no, en crear un disco con ese tema. El primer problema fue cuando al  localizar el relato que había leído, me di cuenta de que no se llamaba «La noche del océano», sino «El horror de Dunwich», un título mucho menos atractivo, por lo que decidí mantener el título original, que también era de una obra de Lovecraft.

Cuando comencé a escribir las canciones pensé en ir más allá de mis habituales composiciones instrumentales incluyendo algunos fragmentos leídos para narrar la historia. Releí el relato buscando estos fragmentos, pero rápidamente me di cuenta de que Lovecraft era un maestro creando atmósferas, pero como escritor no era particularmente notable. Apenas encontré unas pocas frases que fueran pasables y finalmente decidí buscar otro libro más adecuado. Lo encontré en «Los ojos azules, el pelo negro» de Marguerite Duras, una novela que ni siquiera me había gustado demasiado, pero que descubrí que estaba pasmosamente bien escrita. A pesar de lo breve del libro, no tardé en encontrar varios fragmentos que encajaban sorprendentemente bien con lo que buscaba, un pueblo costero decadente y tenebroso, donde se mezclara el terror y el romance. Grabé los textos leídos por un amigo de cualquier manera con un micrófono casero y, por supuesto, no en un estudio de grabación, pero se convirtieron rápidamente en lo mejor de las canciones. Además, fue sorprendentemente fácil integrarlos en las canciones.

Escribí «Entonces» más o menos a mitad de la composición y recuerdo particularmente bien el momento en el que elegí el sintetizador que suena durante el estribillo. Una de las labores más divertidas era escuchar una y otra vez el mismo patrón musical, pero cambiando uno de los instrumentos, hasta encontrar el más adecuado. Recuerdo ir pasando de uno a otro y, de repente, al escucharlo por primera vez, tener la certeza de que era el adecuado.

Aunque este tema tal vez no destaque por su calidad, me gusta particularmente porque creo que consigue transmitir exactamente la idea que tenía en mente. Los sintetizadores tienen esa sonoridad acuática que buscaba y logran crear esa atmósfera de terror romántico que buscaba.

sábado, 16 de octubre de 2021

8+1: Los ocho mejores juegos para ZX Spectrum (y un extra muy especial)

En Antakira hemos querido rendir un homenaje muy especial a Ian Sinclair, el creador del famosísimo ZX Spectrum, mediante una recopilación de nuestros juegos favoritos para esta máquina. Aunque los orígenes de los ordenadores son muy anteriores al lanzamiento de esta gama de ordenadores, sí que puede atribuirse buena parte del mérito de la popularización de los ordenadores y la informática doméstica a estas máquinas. Con un precio asequible y el atractivo de juegos similares a los que se habían hecho famosos en las máquinas recreativas, el ZX Spectrum sirvió para inspirar y formar a toda una generación que gracias a él se acostumbró a interactuar con sistemas digitales. Y es que para los primeros usuarios del Spectrum, era prácticamente inevitable aprender informática si se quería sacarle algún partido a este aparato. Antes de que fuera posible comprar las cintas de cassette con programas y juegos, no quedaba otra que escribir manualmente los programas que publicaban revistas como Microhobby, a quién también hay que reconocer la labor que desempeñó a la hora de difundir y popularizar esta nueva tecnología en este país. Para jugar a un juego muchas veces había que pasar antes una o dos horas tecleando el código de listados como el que podemos ver abajo.

Aparte del trabajo que suponía introducir a mano el código, cuanto más largo era el listado más fácil era que se deslizaran errores durante este proceso, por lo que tras introducir la última línea, muchas veces había que dedicar un buen rato a depurar el programa, hasta conseguir localizar la línea que no se había escrito correctamente. Todo ello para disfrutar de un juego que, además, solía ser de una calidad bastante inferior a los disponibles comercialmente. Tras pasar cuantas tardes dedicadas a este entretenimiento, era fácil pensar en dar el salto al otro lado de la revista en convertirse en uno de los programadores cuyas obras se publicaban. Además, al tratarse un mundo emergente, era fácil idear aplicaciones y juegos que aún no se habían explorado, de una manera que tal vez podría compararse con los horizontes salvajes que se colonizaron durante la conquista del Oeste americano. Siendo así, es fácil comprender por qué hay tantos profesionales informáticos que conservan un especial cariño por el ordenador con el que dieron sus primeros pasos y que ha hecho que, incluso hoy, exista una escena muy activa de programadores que siguen creando para un ordenador que hace varias décadas que dejó de fabricarse. Y, sin más, vamos con la lista de los juegos que nos marcaron.

1. Underwurlde

 

Si hay una compañía de juegos mítica, sin duda es Ultimate Play The Game. Esta empresa inglesa, con su aura de misterio y sus increíbles avances técnicos, no tardó en convertirse en la referencia del sector. Dado que sería fácil monopolizar esta lista solo con sus juegos, hemos optado por citar tan solo uno. Si bien otros de sus títulos han logrado mayor fama, como Knight Lore o Alien 8, hemos elegido Underwurlde como el mejor y es que, además de ser impecable visualmente, es un juego realmente divertido. También fue muy innovador en su jugabilidad, ya que los numerosos enemigos de este juego no mataban al protagonista por contacto, como era habitual, sino que tan solo lo empujaban, muchas veces hacia una caída que sí que podía ser letal. Un mapa gigantesco para la época y un diseño de niveles muy inteligente convierte a este juego en una absoluta obra maestra.

2. Jet Set Willy


Manic Miner fue todo un hito en su época, con su dificultad endiablada y esa musiquilla repetitiva, pero que no querías parar de oír. Jet Set Willy fue la continuación que lo mejoró todo. Con más niveles, una trama mejor hilvanada y, sí, todavía más difícil que el anterior, esta secuela se convirtió en el juego de plataformas que marcaría lo que estaba por llegar.

3. Batman

 
Si, tal como hemos señalado antes, se suele atribuir a Ultimate la creación del primer juego con perspectiva isométrica que logró el éxito masivo, el fantástico Knight Lore. Lo cierto es que fue Jon Ritman el que supo aprovechar al máximo el potencial de esta fórmula con este Batman y su título posterior, Head over Heels. Aparte del detallismo gráfico, aquí tenemos también una excelente jugabilidad con un exquisito diseño de puzles y una ambientación que reflejaba a la
perfección el universo del héroe de cómic que protagonizó este juego.

4. Pyjamarama

 
Tal vez los primeros juegos que cristalizaron la fusión de la trama de las aventuras conversacionales con las mecánicas de los juegos de plataformas fueron los de la saga de Wally que creó Mikrogen y que, aparte de este título, también incluye Everyone's a Wally, Herbert Dummy Run y Three Weeks in Paradise. Gráficos increíbles para la época, con especial cuidado por un color al que muchos otros juegos renunciaban por las limitaciones técnicas del Spectrum, casaban a la perfección con un argumento original y un tanto surrealista.

5. 3D Death Chase
 
Imposible hacer más con menos. Este juego, lanzado en los primeros años del ordenadores y el único de la lista que podía ejecutarse en un Spectrum 16K, demostraba que era posible poner en pie una idea interesante con recursos mínimos. Y es que este juego, con su ritmo frenético y su acción trepidante, lograba hacerte sentir que estabas al mando de las icónicas motos voladoras de El retorno del Jedi.
 
6. Nebulus
 
 
Y tras uno de los primeros juegos pasamos a uno de los últimos. Nebulus nació ya en el ocaso del Spectrum, cuando las máquinas de 16 bits, como el Amiga 500, empezaban a popularizarse. El virtuosismo que se había alcanzado en la programación del Spectrum resulta particularmente evidente en este título, con un escenario giratorio y unos gráficos fluidos que redondean un juego fantástico.
 
7. The Sentinel
 
 
Único en su especie. Un juego tridimensional, con una mecánica de juego que nunca antes se había visto, fácil de comprender, pero difícil de dominar. Diez mil niveles diferentes creados procedimentalmente. Este juego lograba que resultara realmente aterradora la figura del centinela que barría el paisaje. Todo ello conformaban un juego que realmente parecía llegado del futuro.
 
8. La Aventura Original
 
 
En España se crearon un elevado número de juegos, entre los que hay que destacar las creaciones de Dinamic para la saga de Johny Jones, como Saimazoom, Babaliba y Abu Simbel Profanation. Sin embargo, hemos optado por este título, que además de conseguir un gran éxito que fue fundamental para el despegue de las aventuras conversacionales, nos resultó particularmente inspirador. Con unos gráficos llamativos que se dibujaban rápidamente, un intérprete que parecía entenderlo todo y una trama divertida y tan larga que había obligado a dividir el juego en dos partes (o caras), este juego abrió nuevas fronteras a la hora de crear experiencias para el jugador.

8+1. Professional Adventure Writing System (PAWS)

 
Sin ser un juego, sin duda es uno de los programas que más horas de diversión nos dieron. Este creador de aventuras conversacionales venía avalado por ser el motor con el que funcionaban varios éxitos de la época. Teniendo en cuenta la tecnología de la época, resulta increíble lo avanzado que fue. Aparte de incluir un motor gráfico especial, su manera de organizar los comandos era de una ingeniosidad abrumadora y hasta incluía un sistema de compresión de texto que permitía aprovechar al máximo la reducida memoria de los ordenadores de la época.

Ha sido realmente difícil elegir unos pocos entre todos los títulos memorables que surgieron en la época, por lo que hemos intentando centrarnos en títulos que, aparte de su calidad, fueron particularmente relevantes y revolucionarios. Sin embargo, es posible que la lista se haya quedado incompleta, así que nos encantaría que nos comentarais qué juego de esta época os gustaría incluir.

martes, 24 de agosto de 2021

Gymzilla entra en la nueva década

Parece que hayan pasado más de ocho años desde la última versión, pero durante este tiempo el proyecto Gymzilla no ha dejado de progresar, incluyendo mejoras en prácticamente todos los aspectos.

Tras un largo período de pruebas para garantizar que lanzábamos una versión de la máxima calidad, nos complace anunciar que ya es posible descargar una nueva versión desde la página oficial de Gymzilla.

Para quienes aún no conozcan Gymzilla, es una aplicación diseñada para ayudarte en prácticamente todo lo relacionado con el fitness, como por ejemplo:

  • ponte en forma llevando a cabo las divertidas sesiones que incluye
  • registra las actividades que lleves a cabo en cualquier otro sitio
  • crea tus propias sesiones de entrenamiento
  • sigue tus progresos en las medidas, como por ejemplo, el peso y los centímetros totales, entre muchas otras medidas

Dado que el desarrollo del proyecto continúa, nos encantaría saber de cualquier idea y sugerencia para próximas sesiones o, sencillamente, cuéntanos cómo ha sido tu experiencia con Gymzilla.



viernes, 28 de septiembre de 2018

Octavo lugar de Momo en el premio Loebner de 2018





Por segundo año consecutivo, hemos presentado a un bot, llamado Momo, y desarrollado por Antakira Software al premio Loebner, una de las más prestigiosas competiciones de chabots a nivel mundial, que se celebra desde 1991 y organiza AISB. Los resultados pueden consultarse aquí.

Respecto al año pasado, nuestra evolución ha sido muy positiva. Hemos ascendido a la octava plaza, y sólo cuatro puntos nos han separado de poder acceder a la fase final, para la que se clasificaban los cuatro primeros.

En particular, estamos muy satisfechos con las respuestas que dió Momo a cuestiones derivadas de los esquemas de Winograd. Varios expertos nos han dado públicamente su enhorabuena, como puede comprobarse aquí.

Pueden verse las conversaciones de todos los contendientes, también las de nuestro Momo (en inglés), en el sitio del AISB.

La clasificación de la competición en la primera parte de la misma fue la siguiente:

Pos.  Nombre        Puntuación
1     Tutor                    27
2     Mitsuku               25
3     Uberbot               22
4     Colombina          21
5     Arckon                20
6     Midge                 19
7     Mary                   18
8     Momo                 17
9     Talk2Me             14
10   Aidan                  13
11    Johnny & Co.     12

El ganador de la competición fue Mitsuko, por cuarta ocasión.

martes, 17 de octubre de 2017

Cuento interactivo: «El expreso intergaláctico» de Javier Nodras

Fieles a nuestra tradición de innovar y buscar nuevas experiencias que combinen ocio y cultura, nos enorgullece presentar el cuento infantil interactivo «El expreso intergaláctico» escrito por Javier Nodras e ilustrado por Miriam Roig. A la manera de las novelas del tipo «Elige tu propia aventura», en este cuento el lector tiene la oportunidad de elegir entre varias opciones en diversas situaciones, participando así en el desarrollo de la historia. Este tipo de novelas, muy populares en los ochenta, se ha revitalizado ahora con los libros electrónicos creando los llamados librojuegos, que permiten ofrecer historias mucho más ricas y complejas, a la vez que simplifican la búsqueda de la página por la que debe continuar su historia.

Portada de «El expreso intergaláctico»

Una mención especial merecen las ilustraciones de la artista Miriam Roig, que transportan a los jóvenes lectores a esta curiosa aventura espacial.

En este caso, nuestra labor ha consistido en la creación de un software específico con el que es posible generar la historia interactiva, comprobar que la historia está bien hilvanada y tiene la variedad deseada en número de bifurcaciones y finales, además de generar directamente un archivo HTML que es posible cargar a la principal plataforma de libros electrónicos, el Kindle de Amazon. Para crear una historia con esta herramienta, solo se necesita una escribir en una hoja de cálculo las diferentes situaciones, enlazándolas con una sintaxis muy intuitiva y sencilla.

La herramienta está todavía en proceso de desarrollo, ya que tenemos previstas varias funciones para hacerla todavía más cómoda y útil. Cuando esté totalmente terminada, estamos barajando la posibilidad de publicarla en nuestra página, para que todo el mundo pueda crear su propia novela interactiva.

Por otro lado, informamos que ya están iniciados los trabajos para la traducción de «El expreso intergaláctico» al inglés y al italiano.

lunes, 15 de mayo de 2017

MoMo: Mil maneras de decir lo mismo

Al hablar, tenemos una variedad infinita de maneras diferentes de expresar prácticamente la misma idea, lo cual con frecuencia supone todo un desafío cuando queremos crear un chat de conversación. Por ejemplo, imaginemos las siguientes frases que puede decir un usuario:
>Háblame del amor.
>¿Qué opinas del amor?
>¿Qué te parece el amor?
>¿Cuál es tu opinión sobre el amor?
>Quiero que me hables del amor.

Cinco maneras diferentes de, básicamente, interrogar a un bot sobre el amor. Dado que todas estas opciones solo comparten una palabra en común «amor», podemos pensar que basta con crear una regla sobre el amor. Por ejemplo,
amor Cuando el amor llega así de esa manera, uno no se da ni cuenta.

Esta regla saltará en todas las ocasiones anteriores, así que problema solucionado, ¿o no?

Lamentablemente la respuesta es que no necesariamente. Sí, la regla se activará en todos los casos anteriores, pero siempre que no haya una regla que tenga mayor prioridad.

Por tanto, surgirá un problema si se nos ocurre crear una regla como:
me hables del * No sé qué decir del *1.

La idea de la regla es buena. Aunque no sepa exactamente qué decir, el bot se está dando cuenta de que se le está preguntando sobre un tema y reconoce su ignorancia. El problema es que antes teníamos una regla que nos hubiera dado una respuesta bastante mejor cuando el usuario está interesado en cuestiones de amor, pero ha dejado de activarse porque la nueva regla tiene prioridad cuando el usuario dice cosas como:
>Quiero que me hables del amor.

A simple vista parece el típico caso en el que, al aumentar el número de reglas, disminuye la calidad de ciertas respuestas. Afortunadamente, con un poco de ingenio y un pequeño script, podemos crear un bot que aúne lo mejor de ambos mundos. Para ver cómo hacerlo, vamos a crear un bot con solo cinco líneas:
%id="xhello" Hola.
me hables del * $respuesta$%script="$especifica$=1;$respuesta$=getOutput(*1);if($especifica$==0){$respuesta$=No sé qué decir del *1.;}"
amor Cuando el amor llega así de esa manera, uno no se da ni cuenta.
* %script="$especifica$=0;"
%id="xnone" No sé que decir.

La magia de este pequeño bot se concentra en un par de scripts. Ahora vemos que cuando el usuario dice «Quiero que me hables del amor.» se ejecuta el siguiente script, que pasamos a comentar línea por línea:
$especifica$=1; 
Esta línea consiste sencillamente en una instrucción que establece una variable que utilizaremos a modo de baliza.
$respuesta$=getOutput(*1);
La instrucción getOutput() nos permite obtener una respuesta al texto que queramos. En este caso *1=amor, con lo que nos quitamos de encima todo el enunciado genérico del texto del usuario y nos quedamos con la palabra clave. El problema de este método es que el bot normalmente siempre encontrará una respuesta y, en el peor de los casos, mostrará el xnone, algo que no nos interesa.
Y aquí viene el truco, podemos ver que hay una regla que siempre se cumple y que consiste únicamente en un script.
script="$especifica$=0;"

Pues bien, si el bot encuentra una respuesta antes de esta regla, $especifica$ conservará el valor 1, pero si no la encuentra, tomará el valor 0. De esta manera, podemos dividir el archivo de reglas en dos partes: una con las reglas que preferimos a una respuesta genérica y otra con las que no.

if($especifica$==0){$respuesta$=No sé qué decir del *1.;}

Ahora lo único que queda por hacer es que si no hemos encontrado una respuesta que nos satisfaga, procederemos a mostrar una respuesta que al menos demuestre que hemos entendido la intención del usuario. De lo contrario, se mostrará la respuesta que se encontró en la instrucción anterior.

Una de las grandes ventajas de MoMo es que, gracias a las variables y las funciones, podemos modelar comportamientos mucho más inteligentes de lo permiten las reglas estáticas. Y no se necesitan complicados programas para ello. En el ejemplo anterior, hemos visto que bastan cuatro instrucciones y un par de variables para resolver un problema bastante complicado.

Esperamos que este tutorial os anime a comenzar a utilizar las funciones de script de MoMo y, si tenéis cualquier duda, será un placer atenderos bien a través de este blog o mediante nuestro foro sobre MoMo.

¡Feliz programación!

domingo, 30 de abril de 2017

MoMo: Cómo crear un chatbot que gestione los contactos

Una de las grandes ventajas de MoMo es la gran flexibilidad que ofrece el lenguaje de script y la gestión automática de los recuerdos, lo que nos permite abordar rápidamente todo tipo de tareas.



Por ejemplo, supongamos que queremos que nuestro flamante bot incluya una pequeña base de datos con nuestros contactos. En principio, vamos a almacenar solo el nombre del contacto y su número de teléfono. Esta sencilla regla se encarga de ello:

<rule>
    <input>teléfono de <wildcard lengthmin="1" name="$name$" /> es el <wildcard lengthmin="1" name="$phone$" /></input>
    <output script="forget();recentMemoryGetByItem(contact);recentMemoryFilterByAttributeValue(name,$name$);if(getRecentMemoryCount()==0){recentMemoryCreate(contact);recentMemorySetAttribute(name,$name$);};recentMemorySetAttribute(phone,$phone$);">Muy bien, el teléfono de $name$ es el $phone$.</output>
</rule>

El corazón de esta regla es un script, que vamos a analizar en detalle ahora:

forget();
Esta línea sencillamente indica que gestionaremos personalmente cómo se almacena la información (si no, el bot la almacenará en un formato predeterminado menos cómodo).
recentMemoryGetByItem(contact);
Cargamos en la memoria reciente del bot todos los datos de los contactos.
recentMemoryFilterByAttributeValue(name,$name$);
Filtramos los datos de los contactos, para dejar solo aquellos en los que el atributo "name" tiene como valor el nombre que el usuario ha indicado mediante el comodín $name$.
if(getRecentMemoryCount()==0){recentMemoryCreate(contact);recentMemorySetAttribute(name,$name$);};Si no se ha encontrado ningún contacto, creamos un nuevo contacto y definimos que su atributo "name" sea el valor del comodín $name$ especificado por el usuario.
recentMemorySetAttribute(phone,$phone$);
Definimos que su atributo "phone" sea el valor del comodín $phone$ especificado por el usuario.

¡Solo 7 instrucciones y hemos creado un sistema que no solo almacena los datos que nos interesan, sino que además evita que se introduzca información duplicada! Por supuesto, nuestro script podría ser más sofisticado. Por ejemplo, podría comprobar si ya se ha indicado el número de teléfono y, en tal caso, dependiendo de si coincide o no con el que ha indicado el usuario, mostrar una advertencia o, sencillamente, informar que ya se conocía el número de teléfono.

Claro que, por interesante que sea almacenar los datos de nuestros contactos, necesitamos una manera de recuperar esta información. Para ello, utilizaremos los siguientes reglas:

<rule>
    <input>teléfono de <wildcard lengthmin="1" name="$name$" /> ?</input>
    <output script="forget();recentMemoryGetByItem(contact);recentMemoryFilterByAttributeValue(name,$name$);if(getRecentMemoryCount()==0){throwExceptionById(xContactPhoneUnknown);};$result$=getRecentMemoryAttribute(phone);if(length($result$)==0){$data$=número de teléfono;throwExceptionById(xContactMissingData);}">El teléfono de $name$ es el $result$.</output>
</rule>
 <rule id="xContactPhoneUnknown">
    <output>No conozco a $name$.</output>
</rule>
 <rule id="xContactMissingData">
    <output>No sé su $data$.</output>
</rule>

Aunque son un total de tres reglas, dos de ellas se limitan a mostrar mensajes de advertencia, por lo que el corazón se encuentra, al igual que para la introducción de datos en un sencillo script, que también analizaremos a continuación:

forget();
Una vez más, indicamos que procesaremos nosotros la información.
recentMemoryGetByItem(contact);
Recuperamos todos los contactos...
recentMemoryFilterByAttributeValue(name,$name$);
...y dejamos solo aquellos en los que el atributo "name" sea el nombre indicado por el usuario.
if(getRecentMemoryCount()==0){throwExceptionById(xContactPhoneUnknown);};Si no hay ningún contacto con este nombre, es que se trata de un contacto desconocido.
$result$=getRecentMemoryAttribute(phone);
Recuperamos como resultado el atributo "phone" del contacto obtenido.
if(length($result$)==0){$data$=número de teléfono;throwExceptionById(xContactMissingData);}
Si la longitud del resultado es cero, indicamos que no conocemos el dato en cuestión.

Lo más enfoque es que este método es muy ampliable. Es decir, hemos escrito las reglas para guardar y recuperar los nombres y los números de teléfono de nuestros contactos, pero esa misma estructura puede utilizarse para guardar más datos, como el número de móvil, la dirección, el correo electrónico, etc. La información queda almacenada para utilizarla en cualquier otro punto del bot. Por ejemplo, el bot podría preguntarnos cada cierto tiempo si hemos visto a un contacto, pedir que le rellenemos los datos que desconoce, etc. ¡Y todo ello utilizando únicamente funciones básicas!

Si quieres practicar estos conocimientos, ¿podrías crear las reglas necesarias para registrar también el número de móvil? Y, si te tropiezas con alguna dificultad, ¡no dudes en avisarnos!