Juego educativo para aprender a leer las notas en clave de Sol. En pantalla aparece un pentagrama con una nota y hay que pulsar la tecla que le corresponde en un pequeño piano de siete teclas: A S D F G H J = DO RE MI FA SOL LA SI. Seis niveles progresivos van introduciendo las notas una a una, el modo "My first song" recorre la melodía de Martinillo y el modo Arcade no termina hasta el primer error, con tabla de puntajes.
Pianissimo fue el proyecto final de la materia Programación Estructurada, Ingeniería en Computación, UABC Ensenada, semestre 2019-2. Autor: Joel Ernesto López Verdugo.
Este repositorio guarda dos cosas: el juego tal como se entregó en 2019, intacto como recuerdo, y una versión nueva en Allegro 5 que conserva el aspecto, los tiempos y las reglas del original y corrige sus defectos.
legacy/ Original de 2019, sin ninguna modificación
codeblocks/ Código (Allegro 4, main.cpp + inicia.cpp), BMP, WAV y tabla.txt
visual-studio/ Esbozo con Allegro 5 de aquella época (solo abre una ventana)
material/ Material fuente: imágenes, videos de cada nota y Reporte.pdf
src/ Versión nueva en C11 y Allegro 5
assets/ Recursos de la versión nueva (PNG y OGG; notas de piano nuevas)
tools/convert-assets.sh Regenera imágenes, intro y fallo a partir de legacy/codeblocks
tools/fetch-notes.sh Descarga y procesa las 7 notas de piano (University of Iowa MIS)
docs/legacy-spec.md Especificación funcional exacta del original
docs/auditoria-legacy.md Auditoría de defectos del código original
docs/MIGRACION.md Guía técnica de la migración de Allegro 4 a Allegro 5
CMakeLists.txt Compilación de la versión nueva
legacy/material/Reporte.pdf es el reporte original que se entregó con el proyecto.
| Tecla | Acción |
|---|---|
A S D F G H J |
Responder DO, RE, MI, FA, SOL, LA, SI |
| Flecha arriba / abajo | Moverse por el menú (circular; mantener repite cada 250 ms) |
Enter |
Elegir opción del menú; saltar el logotipo inicial y las pantallas de resultado |
Enter o Espacio |
Saltar la presentación de un nivel ("HOY APRENDEREMOS") |
Esc |
Volver al menú desde cualquier pantalla; en el menú, salir; en la captura del nombre, cancelar sin guardar |
F11 |
Alternar pantalla completa |
Letras, números, Retroceso, Enter |
Escribir, borrar y guardar el nombre (hasta 4 caracteres) tras una partida de Arcade |
Reglas: en los niveles hay que acertar 10, 15, 20, 25, 30 y 35 notas seguidas; un solo error manda a la pantalla de fallo. En "My first song" hay que tocar las 32 notas de la canción sin fallar. En Arcade cada acierto vale 10 puntos y la partida termina con el primer error.
Requisitos: un compilador de C11, CMake 3.16 o superior, pkg-config y Allegro 5.2 con los addons de imagen, audio, códecs, fuentes y primitivas. El addon de diálogos nativos es opcional (solo se usa para mostrar errores fatales en una ventana).
Arch Linux:
sudo pacman -S allegro cmake pkgconfDebian y Ubuntu (en estas distribuciones los addons vienen en paquetes separados):
sudo apt install build-essential cmake pkg-config liballegro5-dev \
liballegro-image5-dev liballegro-audio5-dev liballegro-acodec5-dev liballegro-dialog5-devmacOS con Homebrew:
brew install allegro cmake pkg-configCompilar y ejecutar desde la raíz del repositorio:
cmake -S . -B build
cmake --build build
./build/pianissimoEl ejecutable busca los recursos en este orden: la variable de entorno PIANISSIMO_ASSETS, la carpeta assets/ junto al ejecutable y, por último, la carpeta assets/ del repositorio donde se compiló. Para llevarse el juego a otra carpeta, cmake --install build --prefix ~/pianissimo copia el ejecutable y assets/ juntos.
La tabla de puntajes se guarda en el directorio de datos del usuario (en Linux, ~/.local/share/pianissimo/tabla.txt). La primera vez se siembra con los puntajes que traía el tabla.txt original de 2019.
./build/pianissimo --selftest ejecuta una batería de comprobaciones: carga de los 29 recursos gráficos y 9 sonidos, lectura y guardado de la tabla, recorrido del menú, un nivel ganado, un nivel perdido, la canción completa, una partida de Arcade con captura de nombre y el dibujo de cada pantalla. Termina con código 0 si todo pasa.
El original se escribió para Windows con Code::Blocks y Allegro 4. Compila en Linux con dos ajustes que se hacen sobre una copia, sin tocar legacy/:
main.cppincluye<stDIO.h>con mayúsculas mezcladas, que solo existe en sistemas de archivos que no distinguen mayúsculas. En Linux el compilador se detiene confatal error: stDIO.h: No such file or directory.- El código pide
DO.wav,RE.wav,MI.wav, etc., pero los archivos se llamanDo.wav,Re.wav,Mi.wav. En Linux esas cargas fallan y el primer acierto intenta reproducir una muestra nula.
Instalar Allegro 4 (sudo pacman -S allegro4 en Arch, sudo apt install liballegro4-dev en Debian y Ubuntu) y, en bash:
cp -r legacy/codeblocks /tmp/pianissimo-2019
cd /tmp/pianissimo-2019
sed -i 's/stDIO\.h/stdio.h/' main.cpp
for n in Do Re Mi Fa Sol La Si; do cp "$n.wav" "$(echo "$n" | tr a-z A-Z).wav"; done
g++ main.cpp inicia.cpp -lalleg -o pianissimo-2019
./pianissimo-2019Se ejecuta desde su propia carpeta porque carga todos los recursos por nombre relativo y escribe tabla.txt en el directorio de trabajo. Tiene los defectos del original: ocupa un núcleo de CPU en el menú, no responde al botón de cerrar la ventana (se sale con la opción Exit) y cada partida de "My first song" pierde memoria.
Cifras medidas en este repositorio. El uso de CPU es la media de 10 segundos en el menú sin tocar ninguna tecla (del segundo 5 al 15 tras el arranque), leída de /proc/<pid>/stat, en dos corridas por versión, en un Intel Core i5-10400 con NVIDIA GeForce RTX 3060 Ti bajo XWayland. El original se compiló con g++ -O2 contra Allegro 4.4.3.1 sobre una copia con los dos ajustes anteriores.
| Aspecto | Original (2019) | Versión nueva |
|---|---|---|
| Biblioteca | Allegro 4.4 | Allegro 5.2 |
| Lenguaje | C++ en estilo C | C11 |
| Archivos de código | 3 (main.cpp, inicia.cpp, inicia.h) |
9 (5 .c, 4 .h) |
Líneas totales (wc -l) |
2320 | 2047, de las que unas 360 son pruebas integradas (--selftest) |
Líneas de código sin comentarios ni blancos (tokei) |
2000 | 1643 |
Líneas de comentario (tokei) |
15 | 212 |
Recursos que carga el juego (du -b) |
29 BMP + 9 WAV = 66 878 562 bytes (63,8 MiB) | 29 PNG + 9 OGG = 3 094 676 bytes (3,0 MiB), unas 22 veces menos |
| Fidelidad de las imágenes | Referencia | Idénticas píxel a píxel (lo comprueba tools/convert-assets.sh) |
| CPU en el menú | 80,5 % y 79,2 % de un núcleo | 1,8 % y 1,8 % |
| Memoria residente en el menú | 65 MB | 320 MB (ver nota) |
| Compila en Linux sin cambios | No (stDIO.h) |
Sí |
| Sonido de las notas fuera de Windows | No (DO.wav frente a Do.wav) |
Sí |
| Grabaciones de las notas | Volumen muy bajo y desigual (picos de -18 a -28 dBFS), duraciones de 1,1 a 2,1 s | Piano Steinway real (University of Iowa MIS), 2,2 s cada una, normalizadas a -16 LUFS |
| Cerrar la ventana | No responde | Sale limpiamente desde cualquier pantalla |
| Ventana | Fija de 1280x720 | Redimensionable, con proporción 16:9 conservada, y pantalla completa con F11 |
| Pruebas automáticas | Ninguna | --selftest |
Nota sobre la memoria: la versión nueva carga y decodifica las 29 imágenes una sola vez al arrancar (cada una ocupa unos 3,5 MiB descomprimida, unos 100 MiB en total) y usa el controlador OpenGL, de ahí la cifra mayor en el menú. A cambio no vuelve a leer nada del disco ni pierde memoria. El original solo tiene cargadas las imágenes del menú en ese momento, pero recarga los recursos en cada modo sin liberarlos; según la auditoría, una partida completa de "My first song" pierde del orden de 337 MiB (estimación a partir del código, no medida aquí).
El código se publica bajo la licencia MIT (ver LICENSE), a nombre de Joel Ernesto López Verdugo. Cubre el código fuente del original en legacy/ y de la versión nueva en src/, además de los scripts y la documentación.
La licencia no cubre las imágenes de clip-art ni los audios de terceros incluidos en legacy/ y en assets/ (fotografías, ilustraciones, iconos de teclas y grabaciones que se usaron en 2019 con fines escolares). Pertenecen a sus respectivos autores y no se relicencian aquí.
Las 7 notas de piano de la versión nueva (assets/audio/do.ogg a si.ogg) provienen de los University of Iowa Musical Instrument Samples, grabados por Lawrence Fritts en el University of Iowa Electronic Music Studios, que se ofrecen para usarse en cualquier proyecto sin restricciones. tools/fetch-notes.sh documenta y repite su procesamiento.
La migración a Allegro 5 se hizo con una orquestación multiagente de Claude Code, en etapas separadas y encadenadas: una especificación funcional exacta del original (docs/legacy-spec.md), una auditoría de defectos (docs/auditoria-legacy.md), la conversión verificada de los recursos (tools/convert-assets.sh), la implementación, dos revisiones adversariales independientes y una ronda final de corrección de lo que esas revisiones encontraron. El juego, su diseño y sus recursos son el trabajo original de 2019.