He avanzado bastante en la parte software de la Rockola. Consta de os partes: la primera es un menú, y la segunda es el front-end propiamente dicho.
En el menú se puede escoger la colección de música que se quiere escuchar (Rock, Pop, Salsa, etc.), y se puede filtrar por década (70s, 80s, etc) y por licencia (toda la música o sólo la de dominio público). En cada momento puedes ver el número de canciones que serán seleccionadas.
Además, hay diferentes opciones relacionadas con la máquina hardware que se está construyendo. Por ejemplo: Coin Acceptor habilita o deshabilita tener que poner las monedas para escuchar las canciones; Piped music habilita el hecho de que suene un hilo musical si hace rato que no hay música en la cola de la playlist; Efectos de luz habilita o deshabilita los leds que harán efectos con motivos decorativos; Enable Exit habilita o no que el usuario pueda volver al menú desd el front-end.
Una vez seleccionada una colección podemos ir a la Rockola, que lanza el front-end propiamente dicho. El front-end intenta ser fiel a los modelos clásics de Rockola. Se trata de ir rellenando las etiquetas de papel con las canciones. Cada etiqueta consta de un grupo y de dos canciones. La distribución de las etiquetas es de manera que los grupos queden bastante mezclados y que haya algunas etiquetas medio vacías con una sola canción. En cada pantalla caben 64 canciones, y se puede navegar por las diferentes pantallas.
El front-end gestiona los créditos de que se dispone (una moneda son dos créditos, que dan derecho a dos canciones). La manera de seleccionar una canción es bastante intuitiva. Se dispone de una pequeña pantalla con información de la canción seleccionada, y evidentmente se gestiona la playlist que controla las canciones que están a la espera de ser escuchadas. Tal como está avanzado ahora el proyecto ya se pueden escuchar las canciones. Funciona!
En definitiva, el software, formado por el menú y el front-end, está pensado para integrarse en una máquina con tan solo tres botones (izquierda, derecha y Enter), que ha de cumplir con el requisito de que sea fácil y claro de operar, sin mantenimiento.
Lo que de moment no resulta tan fácil es meter todos los ficheros MP3 en el sistema. Es bastante laborioso. Primero de todo hemos de disponer de unos ficheros mp3 que tengan los tags ID3 rellenados y con la información correcta. Si no es el caso, se ha de actualizar esta información. Se han de leer los tags de los ficheros mp3 y actualizar la base de datos. Se ha de decidir, para las canciones que se quiere incorporar, en qué colecciones saldrán. Se genera un fichero máster con todas las canciones de la base de datos y un fichero de configuración que lleva el recuento del número de canciones clasificado por colección y por década. Hay una serie de scripts que ayudan y automatizan todo el proceso, pero en definitiva si se quiere tener una base de datos de calidad el proceso no es fácil, aunque hay margen para mejorar y automatizar.
Un tema a destacar de estas dos piezas de software es que la geometría reside en ficheros de configuración, de manera que ha de ser fácilmente adaptable a diferentes formatos de monitor. Además, el código se ha compilado tanto en un portátil como en la Raspberry Pi (pues esta plataforma será el motor de la Rockola real que se está construyendo).
En resumen, la parte software ya va tomando forma y no tardaré mucho en hacer un video demostrativo. Paralelamente el mueble también va tomando forma, y espero no tardar demasiado en ver este proyecto de la Rockola finalizado.
Cuando tenga el software acabado publicaré un enlace para descargar el código fuente. De todas maneras este proyecto, programado en C++, se ha escrito de un tirón y de momento no quedará muy bien documentado.
Archivo de la categoría: Raspberry Pi
Avanzando en el proyecto de la rockola/gramola/jukebox
Estoy haciendo una caja de música. Este último mes he estado pensando en el diseño del mueble. me ha costado bastante decidirme por el amplificador que ha de integrar la caja de música. Finalmente me he decidido por un Neusonik NE08. Una vez tengo la pantalla y el altavoz, ya quedan bien definidas las dimensiones generales que tendrá la rockola. La botonera estaré en la zona de abajo. Com se ve en la foto, ya tengo los 15 agujeros donde se integrarán los módulos LED que harán los efectos de luz.
Me falta pensar dónde integraré el monedero electrónico (para poner las monedas de 5 duros), y también otros aspectos de decoración. Pero bueno, lo importante es que ya va tomando forma.
Paral·lelament, estic treballant amb el front-end, crec que està quedant bé, ja penjaré unes captures de pantalla.
Hackear una ROM de Gameboy
He tenido bastantes problemas para emular los juegos de Gameboy en la Raspberry Pi. Finalmente el emulador Fednafen es el que funciona, tal y como se hace en Pimame. El mundo de los emuladores es bastante complicado. Para entender cómo funciona una ROM por dentro y cómo se programa un emulador que trabaje con estas ROMs se tiene que estudiar la arquitectura del Z80, conocer el ensamblador, y técnicas avanzadas de depuración en lenguaje C. Pero aquí vamos a hacer una cosa relativamente sencilla.
Se trata de hacer un pequeño hack de una rom de Gameboy. Se trata de poner un libro dentro de la ROM, concretamente meter diferentes artículos y textos del gran filósofo catalán Francesc Pujols, aquél que dijo que un día Los catalanes iríamos por el mundo y lo tendríamos todo pagado.
Parto de una rom que ya es un libro, un libro en polaco: Ziarno_Prawdy_-_Book_by_Andrzej_Sapkowski_polish.gbc. Aunque no tengo ni puñetera idea de polaco, arranco la rom con el emulador y la idea está clara: con los botones puedes navegar por los diferentes capítulos, puedes ir al principio, y tienes dos modos de lectura: línea a línea, o página a página. La idea es localizar las posiciones de memoria donde está la información relevante, y substituirlo por la información (los bytes) que interesa.
Digo que este proyecto es bastante sencillo porque tenemos 5 capítulos con un tamaño concreto y me tengo que limitar a estas posiciones y bloques de información. Lo chulo sería poder meter más capítulos, de longitud variable, y poder navegar por todos los capítulos. Pero para hacerlo se tendría que desensamblar el código y entender cómo funcionan los jumps a los diferentes capítulos, y esto sí que sería interesante y más difícil.
Bien, manos a la obra. Uso la utilidad xxd como lector de ficheros binarios, que a una salida hexadecimal y en la parte derecha se puede localizar la información textual relevante.
0004040: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0004050: 2020 2020 2020 2020 2020 2041 6e64 727a Andrz
0004060: 656a 2053 6170 6b6f 7773 6b69 2020 2020 ej Sapkowski
0004070: 2020 2020 2020 2020 2020 2020 2020 2020
0004080: 2020 2020 205a 6961 726e 6f20 5072 6177 Ziarno Praw
0004090: 6479 2020 2020 2020 2020 2020 2020 2020 dy
En este bloque hemos localizado el título y el autor. El llibro se llama Ziarno Prawdy y el autor es Adrzej Sapkowski (un nombre muy polaco). La posición del autor empieza en 405b (hex), que es 16475 bytes en decimal. Y donde acaba Prawdy es la posición 4091 hex = 16529. Por tanto, son 16529-16475=54 bytes, que yo substituiré por «EL PENSAMENT I LA FILOSOFIA DE FRANCESC PUJOLS«. Con esta técnica hemos de substituir el título y el autor, el menú, y los diferentes capítulos (hay 5 capítulos).
Muestro un ejemplo de código en lenguaje C para substituir en un fichero binario unos bytes por otros en una posición determinada. Un ejemplo sencillo sería:
#include
#include
#includeint main()
{
int posicio = 10;
int tamany;char *str = «En un lugar de la Mancha»;
printf(«%d\», strlen(str));
tamany = strlen(str);int counter;
FILE *ptr_myfile;ptr_myfile=fopen(«b.gbc»,»r+b»);
if (!ptr_myfile)
{
printf(«Unable to open file!»);
return 1;}
fseek(ptr_myfile,sizeof(char)*posicio,SEEK_SET);
fwrite(str, 1, sizeof(char)*tamany, ptr_myfile);fclose(ptr_myfile);
return 0;
}
Partiendo de este ejemplo que funciona ya podemos hacer toda la substitución de las cadenas.
0004040: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0004050: 2020 2020 2020 2020 2020 2045 4c20 5045 EL PE
0004060: 4e53 414d 454e 5420 4920 4c41 2046 494c NSAMENT I LA FIL
0004070: 4f53 4f46 4941 2044 4520 4652 414e 4345 OSOFIA DE FRANCE
0004080: 5343 2050 554a 4f4c 5320 2020 2020 2020 SC PUJOLS
0004090: 2000 2020 2020 2020 2020 2020 2020 2020 .
00040a0: 492e 2042 494f 4752 4146 4941 0a0a 4c27 I. BIOGRAFIA..L’
00040b0: 6573 6372 6970 746f 722c 2070 6f65 7461 escriptor, poeta
00040c0: 2069 2066 696c c3b2 736f 6620 6361 7461 i fil..sof cata
00040d0: 6cc3 a02c 2046 7261 6e63 6573 6320 5075 l.., Francesc Pu
I el hack ha funcionado como se puede ver (y leer) en la foto. En cualquier caso, la Gameboy no es la mejor consola para leer libros, y por otra parte como era de esperar los acentos no funcionan. Puedes descargar el código entero en la wiki.
Máquina de marcianitos. Proyecto Pimame/PiPlay (Arcade bartop cabinet)
Uno de los recuerdos de mi infancia fueron las máquinas de marcianitos que había en los bares. De cuando en cuando conseguíamos 25 pesetas y podíamos jugar una partida. Entonces, cuando tenía 12 años, no sabía ni qué eran los juegos Arcade… para nosotros eran las máquinas de marcianitos, y basta. Con el tiempo, evidentmente, los juegos se fuero sofisticando a todos niveles: gráficos, sonido,… Paralelamente, en casa jugábamos al Spectrum, cargando los juegos desde las cintas de cassette. Y entonces llegó la era del PC doméstico que lo cambió todo.va canviar tot
Para los que somos de mi generación (40 y pico), las máquinas de los bares representan todo un mundo de recuerdos y vivencias asociados a un mundo en que la electrónica de consumo lo estaba cambiando todo (relojes digitales, coches teledirigidos, …).
Han pasado muchos años, el mundo de los videojuegos ha evolucionado muchísimo, es una industria tan potente com el cine. Cada vez la gente ve menos televisión y va menos al cine (cosa impensable hace tiempo), y la sociedad en que vivimos se caracteriza por una gran variedad de dispositivos conectados a Internet, con una gran y diversa oferta de ocio.
Una gente al entorno del proyecto MAME (Multi Arcade Machine Emulator,) ha emulado las ROMs originales de aquellas máquinas Arcade a diversas plataformas, concretamente al PC. Una ROM es el chip donde estaba el software (firmware) que hacía correr el juego. Este software en código máquina se puede traducir a líneas de código a otras plataformas y lenguajes de programación. Esto es lo que hacen los emuladores. Por tanto, ahora todo el mundo puede jugar a los juegos de los as ’70, ’80 y ’90 en su PC. I así lo hice hará unos tres años en una máquina Linux, cuando descubrí el proyecto MAME y ya pensé entonces en construirme una máquina Arcade.
En estos tres años también han pasado muchas cosas, y concretamente la eclosión del hardware libre, representado por dos proyectos paradigmáticos como son el Arduino y la Raspberry Pi (entre otros). I lo bueno del caso es que el proyecto MAME se ha portado y optimizado a la plataforma de la Raspberry Pi, con todas las ventajas que esto supone de cara construirse un mueble Arcade (presupuesto, espacio, consumo,…). Esta tarea se ha hecho gracias a Shea Silverman y al proyecto PiMAME, que ahora se llama PiPlay.
Así pues este curso pasado me puse manos a la obra y para el verano ya tenía a punto mi mueble bartop con más de 1000 juegos clasificados por categorías (plataforma, galería, shooter, puzzle, fighting, …) i jugabilidad (preferidos, muy buenos, buenos, malos). El proyecto ha sido muy variado y divertido, e incluye entre otras:
- Construcción del mueble (cortar las maderas, pulir, pintar,…)
- Configuración de la Raspberry Pi y de MAME
- Programación de un front-end propio (más detalles en este post)
- Interfície joystick-USB. Aunque funciona correctamente esta solución, se ha de explorar la posibilidad de configurar el joystick i los 6 botons sólo con los pines GPIO de la RPi. El resultado sería más sencillo y rápido de implementar.
- Fuente de alimentación 12V-5V
- Metacrilato, adhesivos
- Matriz de LEDs para la markee
- Pantalla plana, conversor HDMI-VGA
- Amplificador de sonido. La salia de sonido en la Raspberry Pi no es muy buena, y esto se nota a la hora de amplificar el sonido. En este aspecto faltan más pruebas a ver si hay posibilidad de obtener un sonido más limpio.
Después de muchas horas de trabajo, calculo que el presupuesto es de unos 250 euros. La bona noticia es que hay margen para automatizar/mejorar todo el proceso, por ejemplo utilizando una máquina CNC per cortar las maderas.
Aquí puedes ver el vídeo del mueble acabado.
Para más información:
Joanillo Arcade Frontend. Un simple frontend para PiMAME/PiPLAY
Al final he decidido hacerme mi propio front-end para la máquina arcade que me estoy construyendo, basada en PiMAME / PiPLAY. La historia es muy larga, y ahora no es el momento de explicarla. El caso es que AdvMENU, que es el front-end propuesto en el proyecto PiMAME, a mi no me funciona con mi configuración de teclas y la interficie de joystick que me fabriqué en su día, basado en V-USB. El caso es que no soy la primera persona que tiene problemas con la configuración de AdvMenu. Resumiendo, una cuestión que tendría que ser fácil de resolver se convierte en un problema irresoluble. Después de desestimar AdvMENU (y después de compilar desde las fuentes la versión 2.7 y de modificar y modificar el fichero advmenu.rc) consideré la posibilidad de instalar otro front-end para emuladores Arcade que se pudiese instalar bien en la Raspberry Pi. Los requisitos eran que funcionase bajo Linux/Raspberry Pi, y que no necesitase el servidor X de la RPi (lo que desestima el popular front-end Wahcade). Después de analizar las diferentes soluciones, la noticia mala fue que llegué a la conclusión de que tenía que programar mi propio front-end… que al final es una noticia buena, pues por fin tendría un front-end simple y eficiente, con tan sólo las funcionalidades que necesito, que funciona con mi configuración de botones, y que se adapta al diseño y filtros de ROMs a mi gusto.
El resultado es un código C++ de 700 líneas, que utiliza SDL de forma nativa, igual de bien en el portátil que en la Raspberry Pi, donde no hay que arrancar el entorno gráfico. Se puede navegar de forma fácil por la clasificación de los juegos (All Favourites, Bad, Good, Very good, Prefered), y por las categorías de los juegos (Platform, Shooter, Gallery,…). El fichero de configuración es muy simple, resources/romlist.txt, con una línea para cada ROM. Se ha programado a chorro, en muy poco tiempo, seguro que hay cosas a mejorar, pero la lista TODO ha quedado realmente pequeña. Este front-end sólo está pensado para los juegos de MAME (mame4all), por tanto si alguien lo quiere utilizar encontrará a faltar cambiar a otros emuladores. De todas formas, sería fácil hacer la adaptación y disponer de un botón para el cambio de emulador.
Sin embargo, el bartop que estoy construyendo se basa en la simplicidad (un solo joystick y tan solo seis botones, que están mapeados a las teclas ‘0’,…, ‘5’). Y esta simplicidad queda reflejada en el código fuente. Esto hace que lanzar una ROM y volver al front-end sea mucho más rápido (mucho más rápido que con AdvMenu), con una mejor experiencia de usuario. También se ha conseguido una solución elegante para ir a la consola de Linux, o para apagar la Raspberry Pi de forma correcta antes de apagar el interruptor.
En resumen, un front-end para MAME muy simple pero con un diseño correcto, que no tiene ni de largo todas las opciones del proyecto AdvMENU, pero que tampoco se encuentran a faltar.
Puedes descargarte el código fuente de:
http://wiki.joanillo.org/index.php/Fitxer:Joanillo_arcade_frontend.zip
Y aquí tienes un vídeo demostrativo de cómo funciona el front-end y de sus opciones básicas:
Solución portátil para un saxo electrónico: Raspberry PI + soft o hard sinte
Para tocar el controlador de viento EWI-USB normalmente me conecto al portátil. Ejecuto el fluidsynth o cualquier otro soft sinte. Por tanto, la solución para practicar es EWI-USB + portátil + auriculares. Existe una solución más portable y autónoma? Definitivamente sí utilizando la Raspberry Pi, buscando una solución puramente consola y totalment desatendida: enchufar y tocar. En esta ocasión no utilizo JACK, es una solución purament ALSA. Se trata de instalar fluidsynth, algún soundfont que suene bien y que no pese demasiado, configurar el usuario pi con prioridad realtime, desinstalar cualquier servicio que no tenga que utilizar.
Con un script en /etc/udev/rules.d/ewiusb.rules conseguimos que en el momento que conecto el EWI-USB por el puerto USB se ejecuten los comandos que me permitirán tocar automáticamente: ejecutar fluidsynth y conectar la salida midi del EWI-USB a la entrada midi del fluidsynth. He tenido bastantes problemas con la letencia, pero el script que se muestra más abajo a mi em funciona bien sin latencia.
Además, con un poco de electrónica simple y utilizando los pins GPIO se podría cambiar fácilmente el programa midi y poder escoger entre diferentes instrumentos: saxo, midi, flauta,…
Otra posibilidad, como se ve en la fotografía, es utilizar un sinte hardware com el Roland JV-1010. Como la entrada del JV-1010 es puramente midi se necesita un cable conversor USB2MIDI (por ej, http://www.amazon.com/dp/B0017H4EBG), que muestra sus puertos a ALSA. Con esta solución no has de temer por la latencia, es una magnífica experiencia de usuario, y podemos escoger entre centenares de sonidos.
/etc/udev/rules.d/ewiusb.rules
#/etc/udev/rules.d/ewiusb.rules
ACTION==»add», SUBSYSTEMS==»usb», ATTRS{product}==»EWI-USB», RUN+=»/home/pi/ewiscript.sh»
/home/pi/ewiscript.sh
#!/bin/sh
#/home/pi/ewiscript.sh
#script que s’ha d’executar quan connectem el EWI-USB. Dos casos: a) synth hardware (roland); b) synth software (fluidsynth)#mirem si tenim connectat el cable usb-midi
if [ -z `/usr/bin/aconnect -iol | grep USB2.0-MIDI | awk ‘/client/{print $1}’` ]; then#no està connectat: b) synth software (fluidsynth)
if [ -z `pidof -s fluidsynth` ]; then
screen -d -m -S fluidsynth -t «fluidsynth» /usr/bin/fluidsynth -a alsa -m alsa_seq -g 1 -c 4 -z 256 -r 48000 /home/pi/Natural_Oboe.sf2
/bin/sleep 3
/usr/bin/amixer set Master 40%+ > /dev/null
/bin/sleep 2
FLUIDSYNTH=$(/usr/bin/aconnect -o -l | awk ‘/FLUID/{print $2.»0″}’)
/bin/sleep 2
#echo $FLUIDSYNTH
EWIUSB=$(/usr/bin/aconnect -o -l | awk ‘/client/’ | awk ‘/EWI-USB/{print $2.»0″}’)
/bin/sleep 2
/usr/bin/aconnect $EWIUSB $FLUIDSYNTH
/bin/sleep 2
fi
else
#a) synth hardware (roland)
USBMIDI=$(/usr/bin/aconnect -o -l | awk ‘/client/’ | awk ‘/USB2.0/{print $2.»0″}’)
/usr/bin/aconnect EWI-USB:0 $USBMIDI
/bin/sleep 2
fi
Más información, aunque en catalán, en la wiki
RPIJERS: Raspberry Pi Internet Jazz European Radio Stations

Quieres escuchar jazz todo el santo día? En Internet tienes bastante para escoger, por ejemplo, http://www.listenlive.eu/jazz.html. En este proyecto hemos indexado todas estas estaciones de radio para escucharlas de una forma simple y con una interfaz mínima. Y esto lo hemos conseguido con la Blackberry Pi. Sólo necesitamos alimentarla, enchufarla a un cable de red, conectarla a un amplificador, y un botón que nos sirve para arrancar el servicio mpd (Music Player Daemon) y para seleccionar hasta 40 canales.
Puedes descargarte de la wiki (http://wiki.joanillo.org/index.php/Raspberry_Pi:_Internet_Ràdio) el bash script i el fichero con la lista de todas las emisoras. Si quieres que el sistema funcione de forma totalmente desatendida tienes que hacer que el script arranque en el inicio del sistema. La electrónica necesaria es mínima, creo que en el video quedan claras las conexiones, y si no en la wiki hay más información (aunque en catalán).
Os deseo un feliz 2013 y mucho jazz! Aquí va el vídeo:
