{{htmlmetatags>metatag-robots=() metatag-keywords=(AMOS,Amiga,Retroprogramming,color cycle,Matrix) metatag-title=("Effetto Matrix" usando AMOS e il color cycling) metatag-description=(Nei primi minuti del film, scorre un disorientante torrente di caratteri verdi: volendo replicare questo tipo di effetto, si è scelta la tecnica del "color cycling" su piattaforma Amiga/AMOS.) metatag-media-og:image=(:it:emu18.jpg) metatag-og:title=("Effetto Matrix" usando AMOS e il color cycling) metatag-og:description=(Nei primi minuti del film, scorre un disorientante torrente di caratteri verdi: volendo replicare questo tipo di effetto, si è scelta la tecnica del "color cycling" su piattaforma Amiga/AMOS.) }} ====== "Effetto Matrix" usando AMOS e il color cycling ====== ===== Cos'è l' "effetto Matrix"? ===== [[https://amzn.to/39psCMz|Matrix (The Matrix)]] è un film di fantascienza del 1999 scritto e diretto dai fratelli Andy e Larry Wachowski. {{youtube>QHVqpRRX6EU?medium}} Nei primi minuti del film, scorre un disorientante torrente di caratteri verdi. A prima vista, il codice sembra indecifrabile ma, osservandolo più da vicino, si notano degli ideogrammi giapponesi. E, per chi fosse curioso, l'uomo che ha creato il codice ha rivelato che quei caratteri sono [[https://www.cnet.com/news/lego-ninjago-movie-simon-whiteley-matrix-code-creator/|ricette giapponesi di sushi]]. Volendo replicare questo tipo di effetto, si è scelta la tecnica del "color cycling". ===== Origine del "color cycling" ===== Nel caso abbiate mai giocato a un videogame di fine anni '80 - inizio anni '90, potreste aver visto un particolare tipo di animazione, in cui alcuni elementi di scena sembravano muoversi in modo fluido e senza alcun tipo di esitazione, nonostante la complessità della scena. {{ ::waterfall_1_.gif?nolink | Fonte: The Sinclair QL Forum}} Questa tecnica, nota anche come "palette switch", funziona modificando in modo dinamico le mappature dei colori di un'immagine indicizzata, che a sua volta rimarrà assolutamente non modificata. ===== Un po' di teoria ===== Nelle immagini indicizzate il colore di ogni pixel è rappresentato da un indice che individua uno specifico valore presente in una tabella, chiamata "palette". Tale valore rappresenta il vero colore (secondo le tre componenti classiche, R (rosso), G (verde) e B (blu) ). Ne consegue che, ** ovunque sia usato quell'indice, sarà utilizzato quel colore **. {{ :it:color_cycling_esempio.gif?nolink |}} Si noti che un singolo colore può essere assegnato a più indici, e che ogni indice può essere utilizzato più di una volta all'interno dell'immagine. Inoltre, e in modo dinamico, vi è la possibilità di cambiare il colore associato a ogni indice. Questo fa cambiare, di conseguenza, anche tutte le aree corrispondenti nell'immagine. Ovviamente, non tutti gli indici devono essere necessariamente modificati: è possibile mantenere costanti alcuni di essi e far cambiare gli altri. Tuttavia, **vale sempre la regola che, allo stesso numero corrisponde sempre lo stesso colore nell'immagine** . In questo modo, è possibile produrre alcune immagini piuttosto interessanti purché si disponga di una tabella dei colori finita, che dia modo di applicare queste mappature dei colori. Per esempio, salvare una immagine in modalità indicizzata lo fa automaticamente. \adsense\ ===== Implementazione ===== ==== Piattaforma hardware e software ==== Per implementare l'effetto si è scelta una piattaforma hardware di retrocomputing che avesse, nativamente, la possibilità di definire una schermata grafica con l'utilizzo di una palette. La scelta è ricaduta sul [[https://it.wikipedia.org/wiki/Amiga|Commodore Amiga]], in particolare nella sua versione dotata degli "Original Chipset (OCS)", come ad esempio l'Amiga 1000, l'Amiga 500 o l'Amiga 2000. Dal punto di vista dell'implementazione degli algoritmi, la scelta è caduta su [[https://it.wikipedia.org/wiki/AMOS_BASIC|AMOS]], un dialetto del linguaggio di programmazione BASIC implementato sul computer Amiga. AMOS fu pubblicato da Europress Software e originariamente scritto da François Lionet con Constantin Sotiropoulos. Infine, come strumento per il disegno delle immagini è stato usato [[https://en.wikipedia.org/wiki/Deluxe_Paint|Deluxe Paint]] (anche chiamato "DPaint"), un editor grafico bitmap creato da Dan Silva per la Electronic Arts. ==== Preparazione ==== **[[https://github.com/spotlessmind1975/matrix-amos/blob/master/matrix.iff|IFF image file]]** ([[matrix_amos_color_cycling_image_preparation|Istruzioni "passo passo"]]) {{ :it:emu02.jpg?nolink&400 |}} In primo luogo, con **DPaint** si è generata una immagine di risoluzione adeguata. Si è scelta la risoluzione di 320x256 pixel (bassa risoluzione, standard PAL) con una profondità di 32 colori (equivalente a 5 bit per pixel, ovvero 5 bitplane). {{ :it:emu11.jpg?nolink&400 |}} Sono state quindi definite 4 sottopalette, ognuna da 8 colori. Poiché l'indice associato al colore di sfondo non viene variato, una di queste palette è in realtà di 7 colori. Quindi 8+8+8+7 = 31 colori. Ognuna di queste palette è stata sfumata in modo indipendente e secondo un colore diverso, per rendere più semplice disegnare in modo differenziato il "movimento" sotteso dall'effetto. Infine, sono state colorate in modo differenziato le varie caselle che rappresentano, idealmente, i kanji che scenderanno. {{ :it:emu12.jpg?nolink&400 |}} Infine, si è fatto sì che tutte le sottopalette fossero uniformate sulla sfumatura del verde, che è il colore primario dell'effetto Matrix. ==== Algoritmo ==== **[[https://github.com/spotlessmind1975/matrix-amos/blob/master/matrix.bas|Sorgente]]** ([[https://github.com/spotlessmind1975/matrix-amos/blob/master/matrix.amos|Formato AMOS]]) Utilizzando la versione **AMOS Professional** si è quindi scritto l'algoritmo, che può essere così sintetizzato: - si attiva una schermata grafica da 320x256 pixel a 32 colori; - si disattiva il flashing del cursore; - si carica l'immagine su tale schermo; - si effettua un loop infinito, in cui: - il colore all'indice 31 assume il valore dell'indice 1 - si effettua un loop per gli indici che vanno da 1 a 30, in cui - il colore all'indice i assume il valore dell'indice i+1 - si attende qualche istante, per apprezzare l'animazione ==== Risultato ==== Questo è il risultato che si ottiene mandando in esecuzione il programma. {{youtube>wh3SG-vf8NE?medium}} ===== Repository ===== Il repository ufficiale si trova [[https://github.com/spotlessmind1975/matrix-amos|cliccando qui]].