Arxiu de la categoria: Raspberry Pi

El software per a la rockola va prenent forma

He avançat bastant en la part software de la Rockola. Consta de dues parts: la primera és un menú, i la segona és el front-end pròpiament dit.
En el menú es pot escollir la col·lecció de música que es vol escoltar (Rock, Pop, Salsa, etc.), i es pot filtrar per dècada (70s, 80s, etc) i per llicència (tota la música o només la de domini públic). En cada moment pots veure el número de cançons que seran seleccionades.
A més, hi ha diferents opcions relacionades amb la màquina hardware que s’està construïnt. Per exemple: Coin Acceptor habilita o deshabilita haver de ficar les monedes per escoltar les cançons; Piped music habilita el fet de què soni un fil musical si fa estona que no hi ha música a la cua de la playlist; Efectes de llum habilita o deshabilita els leds que faran pampallugues amb motius decoratius; Enable Exit habilita o no que l’usuari pugui tornar al menú des del frontend.
Un cop seleccionada una col·lecció podem anar a la Rockola, que llença el front-end pròpiament dit. El front-end intenta ser fidel als models clàssics de Rockola. Es tracta d’anar omplint les etiquetes de paper de les cançons. Cada etiqueta consta d’un grup i de dues cançons. La distribució de les etiquetes es fa de manera que els grups quedin bastant barrejats i que hi hagi algunes etiquetes mig buides amb una sola cançó. A cada pantalla hi caben 64 cançons, i es pot navegar per les diferents pantalles.
El front-end gestiona els crèdits de què es disposa (una moneda són dos crèdits, que donen dret a dues cançons). La manera de seleccionar una cançó és bastant intuïtiva. Es disposa d’una petita pantalla amb informació de la cançó seleccionada, i evidentment es gestiona la playlist que controla les cançons que estan a l’espera de sonar. Tal com està ara d’avançat el projecte ja es poden escoltar les cançons. Funciona!
En definitiva, el software, format pel menú i el front-end, està pensat per integrar-se en una màquina amb només tres botons (esquerra, dreta i Enter), que ha de complir amb el requisit de què sigui fàcil i clar d’operar, sense manteniment.
El que de moment no és tan fàcil és ficar tots els fitxers MP3 en el sistema. És bastant laboriós. Primer de tot s’ha de disposar de fitxers mp3 que tinguin els tags ID3 omplerts i amb informació correcta. Si no és el cas, s’ha d’actualitzar aquesta informació. S’han de llegir els tags dels fitxers mp3 i actualitzar la base de dades. S’ha de decidir, per a les cançons que es vol incorporar, en quines col·leccions sortiran. Es genera un fitxer master amb totes les cançons de la base de dades i un fitxer de configuració que porta el compte del número de cançons classificat per col·lecció i per dècada. Hi ha una sèrie de scripts que ajuden i automatitzen tot el procés, però en definitiva si es vol tenir una base de dades de qualitat el procés no és fàcil, tot i que hi ha marge per millorar i automatitzar.
Un tema a destacar d’aquestes dues peces de software és que la geometria resideix en fitxers de configuració, de manera que ha de ser fàcilment adaptable a diferents formats de monitor. A més, el codi s’ha compilat tant en un portàtil com en la Raspberry Pi (doncs aquesta plataforma serà el motor de la Rockola real que s’està construïnt).
En resum, la part software ja va prenent forma i no trigaré gaire a fer un video demostratiu. Paral·lelament el moble també va prenent forma, i espero no trigar massa en veure aquest el projecte de la Rockola acomplert.
Quan tingui el software acabat publicaré un enllaç per descarregar el codi font. De totes maneres aquest projecte, programat amb C++, s’ha escrit bastant a raig i de moment no quedarà massa ben documentat.

Avançant en el projecte de la rockola/gramola/jukebox

Estinc fent una caixa de música. Aquest últim mes he estat pensant en el disseny que ha de tenir. M’ha costat bastant de decidir-me en l’amplificador que ha d’integrar la caixa de música. Finalment m’he decidit per un Neusonik NE08. Un cop tinc la pantalla i l’altaveu, ja queda ben definit les dimensions generals que tindrà la caixa de música. La botonera estarà a la zona de baix. Com es veu a la foto, ja tinc fets els 15 forats on s’integraran els mòduls LED que faran els efectes de llum.

Em falta pensar on integraré el moneder electrònic (per posar les monedes de 5 duros), i també altres aspectes de decoració. Però bé, l’important és que ja va prenent forma.

Paral·lelament, estic treballant amb el front-end, crec que està quedant bé, ja penjaré unes captures de pantalla.

Hackejar una ROM de Gameboy

He tingut bastants problemes per emular els jocs de Gameboy a la Raspberry Pi. Finalment l’emulador Fednafen és el que funciona, tal i com es fa a Pimame. El món dels emuladors és bastant complicat. Per entendre com funciona una ROM per dins i com es programa un emulador que treballi amb aquestes ROMs s’ha d’estudiar l’arquitectura del Z80, conèixer l’ensamblador, i tècniques avançades de depuració amb llenguatge C. Però aquí anem a fer una cosa relativament senzilla.

Es tracta de fer un petit hack d’una rom de Gameboy. Es tracta de ficar un llibre a dins de la ROM, concretament ficar diferents articles i textos del gran filòsof català Francesc Pujols, aquell que va dir que que Els catalans aniríem pel món i ho tindríem tot pagat.

Parteixo d’una rom que ja és un llibre, un llibre en polonès: Ziarno_Prawdy_-_Book_by_Andrzej_Sapkowski_polish.gbc. Encara que no tinc ni punyetera idea de polonès, arrenco la rom amb l’emulador i la idea està clara: amb els botons pots navegar pels diferents capítols, pots anar a l’inici, i tens dos modes de lectura: línia a línia, o pàgina a pàgina. La idea és localitzar les posicions de memòria on està la informació rellevant, i substituir-ho per la informació (els bytes) que interessa.

Dic que aquest projecte és bastant senzill perquè tenim 5 capítols amb un tamany concret i m’he de limitar a aquestes posicions i blocs d’informació. Allò xulo seria poder ficar més capíols, de longitud variable, i poder navegar per tots els capítols. Però per fer-ho s’hauria de desensamblar el codi i entendre com funcionen els jumps als diferents capítols, i això sí que seria interessant i més difícil.

Bé, mans a l’obra. Faig servir la utilitat xxd com a lector de fitxers binaris, que dóna una sortida hexadecimal i a la part dreta es pot localitzar la informació textual rellevant.

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 aquest bloc hem localitzar el títol i l’autor. El llibre es diu Ziarno Prawdy i l’autor és Adrzej Sapkowski (un nom ben polonès). La posició de l’autor comença a 405b (hex), que és 16475 bytes en decimal. I on acaba Prawdy és la posició 4091 hex = 16529. Per tant, són 16529-16475=54 bytes, que jo substituiré per “EL PENSAMENT I LA FILOSOFIA DE FRANCESC PUJOLS“. Amb aquesta tècnica hem de substituir el títol i autor, el menú, i els diferents capítols (hi ha 5 capítols).

Mostro un exemple de codi amb llenguatge C per substituir en un fitxer binari uns bytes per uns altres en una posició determinada. Un exemple senzill seria:

#include
#include
#include

int 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;
}

Partint d’aquest exemple que funciona ja podem fer tota la substitució de les cadenes.

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 funcionat com pots veure (i llegir a la foto). En qualsevol cas, la Gameboy no és la millor consola per llegir llibres, i d’altra banda com era d’esperar els accents no funcionen. Pots descarregar el codi sencer a la wiki:

Màquina de marcianitos. Projecte Pimame/PiPlay (Arcade bartop cabinet)

Un dels records de la meva infància eren les màquines de marcianitos que hi havia en els bars. De quan en quan aconseguíem 25 pessetes i podíem jugar a una partida. Aleshores, quan tenia 12 anys, no sabia ni què eren els jocs Arcade… per nosaltres eren les màquines de marcianitos, i prou. Amb el temps, evidentment, els jocs es van anar sofisticant en tots els nivells: gràfics, so,… Paral·lelament, a casa jugàvem al Spectrum, carregant els jocs des de les cintes de cassette. I alehores va arribar l’era del PC domèstic que ho va canviar tot.

Per als que som de la meva generació (40 i pico), les màquines Arcade dels bars representen tot un món de records i vivències associats a un món en què l’electrònica de consum ho estava canviant tot (rellotges digitals, cotxes teledirigits,…).

Han passat molts anys, el món dels videojocs ha evolucionat moltíssim, és una indústria tan potent com el cinema. Cada vegada la gent veu menys televisió i va menys al cine (cosa impensable fa temps), i la societat en què vivim es caracteritza per una gran varietat de dispositius connectats a Internet, amb una gran i diversa oferta d’oci.

Una sèrie de gent a l’entorn del projecte MAME (Multi Arcade Machine Emulator,) ha emulat les ROMs originals d’aquelles màquines Arcade a diverses plataformes, concretament al PC. Una ROM és el xip on estava el software (firmware) que feia córrer la màquina Arcade. Aquest software en codi màquina es pot traduir a línies de codi en altres plataformes i llenguatges de programació. Això és el que fan els emuladors. Per tant, ara tothom pot jugar als jocs dels anys ’70, ’80 i ’90 al seu PC. I així ho vaig fer fa uns tres anys des de la meva màquina Linux, quan vaig descobrir el projecte MAME i ja vaig pensar aleshores a construir una màquina Arcade.

En aquests tres anys també han passat moltes coses, i concretament l’eclosió del hardware lliure representats per dos projectes paradigmàtics com Arduino i la Raspberry Pi (entre d’altres). I el bo del cas és que el projecte MAME s’ha portat i optimitzat a la plataforma de la Raspberry Pi, amb totes les avantatges que això suposa de cara construir-se un moble Arcade (pressupost, espai, consum,…). Aquesta feina s’ha fet gràcies a Shea Silverman i al projecte PiMAME, que ara s’anomena PiPlay.

Així doncs aquest curs passat em vaig posar les mans a l’obra i per l’estiu ja tenia a punt el meu moble bartop amb més de 1000 jocs classificats per categories (plataforma, galeria, shooter, puzzle, fighting, …) i jugabilitat (preferits, molt bons, bons, dolents). El projecte és molt variat, que inclou entre d’altres:

  • construcció del moble (tallar, pulir, pintar,…)
  • configuració de la Raspberry Pi i de MAME
  • programació d’un front-end propi (veure enllaç per a més detalls)
  • interfície joystick-USB (veure enllaç per a més detalls). Tot i que funciona correctament aquesta solució, s’ha d’explorar la possibilitat de configurar el joystick i els 6 botons només amb els pins GPIO de la RPi. El resultat seria més senzill i ràpid d’implementar.
  • font d’alimentació 12V-5V
  • metacril·lat, adhesius
  • matriu de LEDs per a la markee
  • pantalla plana, conversor HDMI-VGA
  • amplificador de so. La sortida de so en la Raspberry Pi no és massa bona, i això es nota a l’hora d’amplificar el so. En aquest aspecte falten més proves a veure si hi ha possibilitat d’obtenir un so més net.

Després de moltes hores de feina, calculo que el pressupost és d’uns 250 euros. La bona notícia és que hi ha marge per automatitzar/millorar tot el procés, per exemple utilitzant una màquina CNC per tallar les fustes, o construir mobles bartop de 3 en 3, en vistes a una possible comercialització.

Aquí pots veure el video del moble acabat.

Per a més informació:

Joanillo Arcade Frontend. Un simple frontend per a PiMAME/PiPLAY

Joanillo Arcade FrontendAl final he decidit fer-me el meu propi front-end per a la màquina arcade que m’estic construïnt, basada en PiMAME / PiPLAY. La història és molt llarga, i ara no és temps d’explicar-la. El cas és que AdvMENU, que és el front-end proposat en el projecte PiMAME, a mi no em funciona amb la meva configuració de tecles i la interfície de joystick que em vaig fabricar en el meu dia, basat en V-USB. El cas és que no sóc la primera persona a la qual li és impossible la configuració correcta dels botons. Resumint, una qüestió que hauria de ser fàcil de resoldre es converteix en un problema irresoluble. Després de desestimar AdvMENU (i després de compilar des de les fonts la versió 2.7 i de modificar i modificar el fitxer advmenu.rc) vaig considerar la possibilitat d’instal·lar un altre front-end per a emuladors Arcade que es pogués instal·lar bé en la Raspberry Pi. Els requisits havien de ser que funcionés sota Linux/Raspberry Pi, i que no necessités el servidor X de la RPi (la qual cosa desestima el popular front-end Wahcade). Després d’analitzar les diferents solucions, la notícia dolenta va ser que vaig arribar a la conclusió de què hauria de programar el meu propi front-end… la qual cosa esdevé al final una notícia bona, doncs per fi tindria un front-end simple i eficient, amb només les funcionalitats que necessito, que funcioni amb la meva configuració dels botons, i que s’adapti al disseny i filtres de ROMs del meu gust.

El resultat és un codi C++ de 700 línies, que utiltiza SDL de forma nadiua, igual de bé en el portàtil que en la Raspberry Pi, on no necessita arrencar les X. Es pot navegar de forma fàcil per la classificació dels jocs (All Favourites, Bad, Good, Very good, Prefered), i per les categories dels jocs (Platform, Shooter, Gallery,…). El fitxer de configuració és molt simple, resources/romlist.txt, amb una línia per cada ROM. S’ha programat a raig, bastant ràpid, segur que hi ha coses a millorar, però la llista TODO ha quedat realment molt petita. Aquest emulador només està pensat per als jocs de MAME (mame4all), per tant algú que el vulgui utiltizar trobarà a faltar canviar d’emulador. De totes maneres, seria fàcil fer l’adaptació i disposar d’un botó per al canvi d’emulador.

Tanmateix, el bartop que estic construint es basa en la simplicitat (un sol joystick i només sis botons, que estan mapejats a les tecles ‘0’,…, ‘5’). I aquesta simplicitat queda reflexada en el codi font. Això fa que llençar una ROM i tornar al front-end sigui molt ràpid (molt més ràpid que amb AdvMenu), amb una millor experiència d’usuari. També s’ha aconseguit una solució elegant per anar a la consola de Linux, o per apagar la Raspberry Pi de forma correcta abans d’apagar l’interruptor.

En resum, un front-end per a MAME molt simple però amb un disseny correcte, que no té ni de bon tros totes les opcions del projecte AdvMENU, però que tampoc es troben a faltar.

Pots descarregar-te el codi font de:
http://wiki.joanillo.org/index.php/Fitxer:Joanillo_arcade_frontend.zip

I aquí tens un video demostratiu de com funciona el front-end i de les seves opcions bàsiques:

Solució portàtil per a un saxo electrònic: Raspberry PI + soft o hard sinte

EWI-USB and Raspberry Pi

EWI-USB and Raspberry Pi

Per tocar el controlador de vent EWI-USB normalment em connecto al portàtil. Faig córrer el fluidsynth o qualsevol altre soft synth. Per tant, la solució per practicar és EWI-USB + portàtil + auriculars. Existeix una solució més portable i autònoma? Definitivament sí utilitzant la Raspberry Pi, buscant una solució purament consola i totalment desatesa: enxufar i tocar. En aquesta ocasió no utilitzo JACK, és una solució purament ALSA. Es tracta d’instal·lar el fluidsynth, algun soundfont que soni bé i que no pesi massa, configurar l’usuari pi amb prioritat realtime, i desinstal·lar qualsevol servei que no hagi de fer servir.

Amb un script a /etc/udev/rules.d/ewiusb.rules aconseguim que en el moment que connecto el EWI-USB pel port USB s’executin les comandes que em permetran tocar automàticament: executar fluidsynth i connectar la sortida midi del EWI-USB a l’entrada midi del fluidsynth. He tingut bastants problemes per tal de no tenir latència, però el script que es dóna més avall a mi em funciona bé sense latència.

A més, amb una mica d’electrònica senzilla i utilitzant els pins GPIO es podria canviar fàcilment el programa midi i poder triar entre diferents instruments: saxo, midi, flauta,…

Una altra possibilitat, com es veu a la fotografia, és utilitzar un sinte hardware com ara el Roland JV-1010. Com que l’entrada del JV-1010 és purament midi es necessita un cable conversor USB2MIDI (per ex, http://www.amazon.com/dp/B0017H4EBG), que mostra els seus ports a ALSA. Amb aquesta solució no has de témer per la latència, és una magnífica experiència d’usuari, i podem triar entre centenars de sons.

/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ó a la wiki

RPIJERS: Raspberry Pi Internet Jazz European Radio Stations


Vols escoltar jazz tot el sant dia? A Internet tens bastant per escollir, per exemple, http://www.listenlive.eu/jazz.html. En aquest projecte hem indexat totes aquestes estacions de radio per escoltar-les d’una forma simple i amb una interfície mínima. I això ho hem aconseguit amb la Blackberry Pi. Només necessitem alimentar-la, endollar-la a un cable de xarxa, connectar-la a un amplificador, i un botó que ens serveix per arrencar el servei mpd (Music Player Daemon) i per seleccionar fins a 40 canals.

Pots descarregar-te de la wiki (http://wiki.joanillo.org/index.php/Raspberry_Pi:_Internet_Ràdio) el bash script i el fitxer amb la llista de totes les emissores. Si vols que el sistema funcioni de forma totalment desatesa has de fer que el script arrenqui en l’inici del sistema. L’electrònica necessària és mínima, crec que en el video queden clares les connexions, i si no a la wiki hi ha més informació (encara que en català).

Us desitjo un feliç 2013 i molt de jazz! Aquí va el vídeo: