martedì 6 febbraio 2024

Come settare a 50 Hz la frequenza di aggiornamento di un monitor con Batocera

Tempo fa venni casualmente a sapere dell'esistenza di una distribuzione Linux del tutto orientata all'emulazione di vecchi computer e console dotata di un'interfaccia molto semplice da usare da cui era possibile accedere tramite un "carosello" a un numero praticamente infinito di sistemi, già configurati a dovere. L'operazione più "difficile" richiesta all'utente era l'inserimento delle ROM dei giochi nelle apposite cartelle.

Ovviamente decisi di installare la distribuzione su una chiavetta e di provarla in prima persona. Sto parlando - sicuramente l'avrete capito - di Batocera. Tuttavia per mancanza di tempo la provai giusto un paio di volte per poi dimenticarmene... fino a pochi mesi fa, quando decisi di provarne una nuova versione su una nuova chiavetta sul mio nuovo (ormai non più tanto) PC. Con mio grande stupore notai l'introduzione di filtri che rendono l'esperienza molto vicina a quella delle macchine reali su hardware (televisori a tubo catodico) dell'epoca, il tutto con una fluidità impressionante (e ci credo: con quella potenza...).

Decisi allora di rispolverare anche la vecchia chiavetta per riprovare la vecchia distribuzione sul mio vecchio PC, sia per vedere se ci fossero anche i filtri, sia - in caso affermativo - come (ma soprattutto se) funzionassero a dovere.

I filtri non c'erano, e oltretutto restai deluso per la quasi totale assenza di fluidità nei giochi, nonostante fossero vecchi e stessi usando un monitor CRT. Questo problema non riguardava soltanto i giochi PAL (che girano a una frequenza (50 Hz) che molti monitor non "agganciano"), ma anche quelli NTSC. Probabilmente dipendeva dalla frequenza del monitor, settata credo a 75 Hz. La cosa assurda era che non riuscivo a modificarla dal monitor stesso, perché è un'operazione che va fatta dalla scheda grafica, ovvero dal PC.

A questo punto i miei ricordi si fanno un po' fumosi: non ricordo ad esempio se la mia versione di Batocera avesse più di una risoluzione selezionabile nelle impostazioni, ma sicuramente le opzioni disponibili non avevano risolto i miei problemi.

Decisi allora di cercare nella rete una qualche soluzione, sicuro che qualcuno avesse sollevato (e auspicabilmente risolto) il problema prima di me.

Purtroppo la maggior parte delle informazioni da me trovate riguardava versioni recenti di Batocera. Per la versione in mio possesso (5.20) c'era poco o niente.

Ma non mi sono arreso e alla fine sono riuscito, seppur con notevole dispendio di tempo e di energie, a risolvere il problema. Cercherò qui di seguito di riassumere come.

Innanzitutto, e questo vale per tutte le versioni di Batocera, è impossibile modificare le impostazioni del sistema operativo direttamente dal PC su cui sta girando. E' necessario connettervisi "da remoto", da un altro PC collegato alla stessa LAN (ovvero allo stesso router), sfruttando il protocollo SSH. Esistono vari metodi per farlo,  ma forse quello più basilare consiste nell'utilizzare un programmino che si chiama "Putty" e che va installato sul PC che si collega a quello su cui gira Batocera.

Nel campo "Host Name" va scritto "root@batocera.local:linux". In Connection type va selezionato "SSH".


Infine si clicca su "Open" o si preme semplicemente invio. Come password si inserisce "linux" (senza virgolette), e successivamente si preme Invio. Durante la digitazione della password il cursore non si muove: è del tutto normale!

Una volta stabilita la connessione bisogna digitare:

export DISPLAY=:0.0


seguito dalla pressione del tasto Invio.


Questo dovrebbe servire a settare come display il monitor del PC a cui siamo collegati (ovvero quello su cui gira Batocera). Successivamente si lancia un programmino che ci permetterà di modificare le impostazioni del monitor:


xrandr


Scrivendo:


xrandr -display :0.0 | grep "connected"


otteniamo le informazioni sul monitor connesso. Nel mio caso era:


VGA-1 connected primary 1024x768+0+0 (normal left inverted right x axis y axis) 312mm x 234mm


e tutte le risoluzioni da esso supportate. Quello che ci serve è quello che a me compare come "VGA-1", cioè l'identificativo del monitor (è il monitor collegato al primo attacco VGA).


Ora scriviamo:


cd /etc/X11/xinit/xinitrc


e diamo invio. Siamo così entrati nella directory "/etc/X11/xinit/xinitrc". Ora scriviamo:


cp xinitrc xinitrc_old


e diamo invio per copiare nel nuovo file "xinitrc_old" il file "xinitrc", che è più o meno il file di inizializzazione di X, un programma che gestisce l'ambiente grafico del sistema operativo su cui si basa Batocera (1).


Ora scriviamo:


nano /etc/X11/xinit/xinitrc


e diamo invio. Possiamo così leggere le risoluzioni attualmente disponibili nel nostro Batocera nonché quella da esso usata di "default" (nano è un editor di testo tramite cui apriamo il file xinitrc).

Facciamo finta che non ce ne sia neanche una che ci vada bene.

Vogliamo creare delle risoluzioni personalizzate che portino il monitor alle frequenze di 60 e di 50 Hz scegliendole possibilmente tra quelle indicate da xrandr (che dovrebbero essere quelle supportate dal monitor. Niente comunque ci impedisce di tentare, a nostro (e soprattutto del monitor) rischio e pericolo, con risoluzioni/frequenze più fedeli a quelle delle macchine che vogliamo emulare ma non supportate dal nostro monitor). Per farlo ci serve il comando "cvt".


Supponiamo di voler creare una risoluzione 1024x768 a 50 Hz. Digitiamo, seguìto da Invio:


cvt 1024 768 50


Il risultato da me ottenuto è stato il seguente:


1024x768 49.98 Hz (CVT 0.79M3) hsync: 39.63 kHz; pclk: 52.00 MHz

Modeline "1024x768_50.00"   52.00  1024 1072 1168 1312  768 771 775 793 -hsync +vsync

Una volta ottenuti questi dati ho aperto con "nano" il file xinitrc (nano /etc/X11/xinit/xinitrc) e ho inserito le seguenti righe:

xrandr -display :0.0 --newmode "1024x768_50.00"   52.00  1024 1072 1168 1312  768 771 775 793 -hsync +vsync
xrandr -display :0.0 --addmode VGA-1 1024x768_50.00
xrandr -display :0.0 --output VGA-1 --mode 1024x768_50.00

La prima riga setta una nuova risoluzione con i parametri ricavati dal lancio del comando "cvt" (la parte tra virgolette, che è l'identificativo della risoluzione (in questo caso "1024x768_50.00"), può essere modificata a piacimento, ma bisogna poi riportare la stringa esatta anche nelle due righe seguenti); la seconda aggiunge la nuova modalità ad X; la terza la setta come risoluzione del monitor.

Premiamo poi CTRL + S per salvare e CTRL + X per uscire da nano.

NOTA: Non ricordo con precisione, ma "a intùito" credo che lanciando i tre comandi sopra riportati direttamente dalla riga di comando si possa testare (ovviamente sul monitor del PC su cui gira Batocera) la risoluzione trovata. Se il quadro va via o se si perde il sincronismo ovviamente conviene tornare a una risoluzione funzionante ed evitare di aggiungere le righe al file xinitrc.

Ho poi creato una risoluzione 1024x768 a 60 Hz col seguente comando:

cvt 1024 768 60


Ho poi di nuovo aperto xinitrc tramite "nano" e aggiunto le seguenti righe:

xrandr -display :0.0 --newmode "1024x768_60.00"   63.50  1024 1072 1176 1328  768 771 775 798 -hsync +vsync

xrandr -display :0.0 --addmode VGA-1 1024x768_60.00

Ancora una volta salviamo (CTRL+S) e usciamo (CTRL+X).

Per riassumere, abbiamo aggiunto le seguenti righe:

xrandr -display :0.0 --newmode "1024x768_50.00"   52.00  1024 1072 1168 1312  768 771 775 793 -hsync +vsync xrandr -display :0.0 --addmode VGA-1 1024x768_50.00 xrandr -display :0.0 --newmode "1024x768_60.00"   63.50  1024 1072 1176 1328  768 771 775 798 -hsync +vsync xrandr -display :0.0 --addmode VGA-1 1024x768_60.00 xrandr -display :0.0 --output VGA-1 --mode 1024x768_60.00

La riga col comando "--output" è una sola perché una è la risoluzione visualizzabile dal monitor! :D In questo caso ho optato per quella a 60 Hz, ma nella pratica l'ho sostituita con quella a 50 perché ho notato che nel passaggio da 60 a 50 l'emulatore del Commodore 64 "impazzisce" e i giochi "scattano" come se andassero a 60 Hz...

NOTA: Dai miei appunti non capisco se poi ho aggiunto anche altre risoluzioni. In ogni caso sentitevi liberi di sperimentare, e se qualcosa andasse storto ripristinate il vecchio file xinitrc. Io comunque non mi assumo alcuna responsabilità in caso di danni ai vostri monitor e PC.

NOTA: Questo discorso riguarda la versione 5.20. Per le versioni più recenti il procedimento potrebbe essere diverso. Riporto qui di seguito quanto trovato tempo fa in rete (purtroppo privo di fonte perché non pensai a segnarmela...):

If you'd like to edit the display output, you can add your modification in a script /userdata/system/custom-es-config that will be automatically invoked by /usr/bin/emulationstation-standalone.

You can edit the file from SSH by running the following:

nano /userdata/system/custom-es-config

and then saving that file to /userdata/system/custom-es-config with [Ctrl] + [O].


Ma non è finita qui! Se infatti proviamo a riavviare Batocera scopriamo che nulla è cambiato dall'avvio precedente! Questo perché, nonostante i salvataggi, le modifiche al filesystem non sono permanenti. Per renderle tali serve lanciare il seguente comando:

/recalbox/scripts/recalbox-save-overlay.sh

NOTA: Nelle versioni più recenti il comando da lanciare dovrebbe essere il seguente:

batocera-save-overlay

Fatto ciò, riavviamo Batocera. Nel menu andiamo in "Games Settings" -> "Advanced" e per ogni console selezioniamo la risoluzione opportuna tra quelle che abbiamo creato (sperando che il programma non si impalli! :D). Poi avviamo il gioco e se tutto è andato bene dovremmo vederlo bello fluido!


(1) - https://wiki.debian.org/XWindowSystem


Nessun commento:

 
Licenza Creative Commons
Independent Games Italy by Aldo Chiummo is licensed under a Creative Commons Attribuzione - Non opere derivate 3.0 Unported License.
Based on a work at indygamesita.blogspot.com.