Astra Harmonica


Astra Harmonica è un sistema solare interattivo navigabile, usabile per fini didattici. E’ stato sviluppato all’interno del corso Creative Programming and Computing (Polimi) insieme ad Alessandro Manattini.

L’idea è quella di creare un “universo di suoni” in cui ogni corpo celeste diventa una sorgente di informazione e armonia: è possibile navigare tra i pianeti e gli asteroidi e fare domande ai chatbot dei relativi pianeti.

Se non ti andasse di leggere l’intero articolo, puoi guardare la demo video qui sotto.

Se invece vuoi provare il progetto in prima persona, puoi farlo a questo link. A tal fine, do innanzitutto delle semplici indicazioni sull’uso del progetto:

  • scroll su/giù per fare zoom in/out;
  • pinch & move per spostarsi sul piano parallelo allo schermo;
  • avvicinati ad un pianeta per far scattare il sistema di auto-aggancio gravitazionalem in modo da seguirlo nella sua orbita e fare domande al suo chatbot.

Leggi il resto dell’articolo se vuoi un maggior approfondimento.

Architettura, oggetti nello spazio e ottimizzazioni

Il sistema usa Three.js come motore grafico e struttura gli elementi della scena secondo una gerarchia, in cui gli oggetti più grandi orbitano attorno ai più piccoli, ricreando il sistema solare.

Il diagramma delle classi è il seguente: Interfaccia Vocoder

Le velocità di rivoluzione, di orbita, l’inclinazione degli assi e le distanze sono tutti fedeli alla realtà (anche se scalati secondo un fattore logaritmico, in modo da rendere navigabile lo spazio che, altrimenti, risulterebbe molto più vasto e complesso da gestire).

Data la grande quantità di elementi nella scena e l’intenzione di rendere il sistema fruibile da qualsiasi piattaforma, è stato necessario adottare un approccio fortemente votato all’ottimizzazione:

  • Mappe di immagini ad alta risoluzione per definire i dettagli della superficie tramite texture statiche.
  • Rumore Simplex 4D per introdurre variazioni procedurali. Si tratta di un’estensione del rumore di Perlin a quattro dimensioni: tre coordinate spaziali più il tempo. Come nella versione tradizionale, la superficie viene suddivisa in una griglia; per ogni cella si calcolano gradienti ai vertici e, tramite una combinazione pesata (interpolazione), si ottengono transizioni continue e visivamente naturali. Il segnale finale è costruito sovrapponendo più livelli di rumore (octave), in cui la frequenza viene raddoppiata o dimezzata a ogni livello: la loro somma genera l’effetto complessivo mostrato nel video.
  • Ogni pianeta è gestito all’interno di un unico contenitore THREE.LOD, con tre livelli di dettaglio geometrico a risoluzione crescente, selezionati in base alla distanza dalla camera.

La fascia di asteroidi

La fascia degli asteroidi contiene migliaia di corpi e, senza accorgimenti, diventerebbe rapidamente il principale collo di bottiglia sia in termini di aggiornamento della scena sia per la parte sonora. Per questo abbiamo adottato un approccio di attivazione locale basato sulla vicinanza alla camera, evitando di controllare e far “suonare” tutto contemporaneamente.

Il primo livello di ottimizzazione è uno spatial hashing 3D. Invece di verificare circa 3.000 asteroidi a ogni frame, lo spazio viene suddiviso in una griglia tridimensionale di celle. Ogni cella ha un lato pari a un quarto della massima distanza di ascolto e viene identificata da una chiave hash del tipo “15,3,-7”, corrispondente alle coordinate discrete della griglia. Quando bisogna trovare gli asteroidi vicini alla camera, non si scansiona l’intero insieme: si controllano solo le celle adiacenti alla posizione corrente (tipicamente un piccolo cubo di celle), che contengono pochi asteroidi invece di migliaia. In questo modo la complessità del problema diventa legata alla densità locale, non alla dimensione totale della fascia.

Il secondo livello riguarda l’audio: per non istanziare migliaia di synth in Tone.js, usiamo un voice pooling con un numero limitato di voci, in particolare otto synth ri-assegnabili dinamicamente. Il comportamento è simile a un’orchestra molto piccola: le voci disponibili “si spostano” dove serve nel momento in cui un asteroide deve suonare. Quando il sistema deve riprodurre una nota, richiede una voce libera dal pool; se tutte sono occupate, viene riutilizzata la prima che si libera, riciclandola per la nuova emissione sonora. Questo mantiene stabile il carico computazionale e rende prevedibile il consumo di risorse.

Infine, anche il timing del sistema è adattivo: l’intervallo del loop si modula in funzione della velocità della camera, così che durante spostamenti rapidi la densità degli eventi resti controllata e la scena rimanga leggibile, mentre in avvicinamento e in esplorazione lenta aumenta la precisione e la ricchezza percettiva.

Sistemi di navigazione

La visuale del sistema è “eliocentrica”, cioè punta sempre verso il centro del sistema solare. Attraverso gli input di navigazione, l’utente ha il controllo su due principali parametri:

  • la distanza \(y\) tra il sole e la camera, che possiamo immaginare come il raggio di una sfera;
  • gli angoli \(\phi\) e \(\theta\) che identificano la posizione dell’utente sulla superficie della sfera di raggio \(y\) precedentemente citato.

I modi in cui l’utente può variare questi parametri sono due.

Mouse/Touchpad

Il primo sistema di controllo è il mouse. Le gestures sono:

  • Drag + rotate per spostarsi sulla superficie della sfera;
  • Scroll-up per zoom-in;
  • Scroll-down to zoom-out.

Hand Tracking

Abbiamo anche implementato un sistema di controllo tramite “aero-gestures”, che sfrutta mediapipe per tracciare una singola semplice gesture: il pinch in/out.

Il modo in cui funziona è illustrato nella gif sotto.

HT

Gravità

Il modulo “Gravity” coordina l’aggancio della camera ai pianeti e crea transizioni fluide e contestuali. Quando l’utente effettua lo zoom, il codice calcola le proiezioni NDC di ogni pianeta e usa una soglia di prossimità dinamica per scegliere un target. A quel punto disabilita i controlli liberi, blocca la camera e la sposta in orbita tramite interpolazione lineare dei vettori. Per decidere quale corpo seguire, proiettiamo la posizione 3D di ciascun pianeta nello spazio schermo e consideriamo solo quelli entro un raggio centrale. La distanza di “attrazione” si adatta in base al raggio del pianeta (o del Sole), garantendo un targeting coerente tra corpi di dimensioni diverse.

Da notare che è anche presente una Rim light per rivelare il lato notturno del pianeta che, altrimenti, risulterebbe buio (ed essendo proprio il lato su cui la camera è proiettata, questo sarebbe un problema).

gravity

Chatbot

Il chatbot è una funzionalità centrale del software, pensata per offrire un’esperienza didattica altamente focalizzata e immersiva: è progettato con vincoli specifici, in modo che le risposte siano esclusivamente legate al corpo celeste che l’utente sta osservando attraverso la camera, consentendo di esplorare in profondità storia, caratteristiche e peculiarità di un singolo pianeta, favorendo una comprensione più solida.

Chatbot

Suono

In Astra Harmonica il suono è una componente strutturale dell’esperienza: l’obiettivo è creare un “universo di suoni” in cui la navigazione nello spazio corrisponde a variazioni armoniche e timbriche, mantenendo coerenza musicale e una chiara relazione tra ciò che si vede e ciò che si ascolta.

Alla base c’è una progressione armonica generativa: gli accordi non sono scelti in modo totalmente casuale, ma seguono una catena di Markov, che favorisce transizioni plausibili e musicalmente credibili (ad esempio Cmaj9 → Am9 → Dm9), introducendo varietà senza perdere identità. Su questa progressione si appoggia un loop in Tone.js che, a ogni ciclo, aggiorna l’accordo, configura i synth e imposta la spazializzazione in funzione della disposizione degli oggetti nello spazio.

L’audio è inoltre reattivo alla camera: quando la camera si aggancia a un corpo celeste tramite il sistema di gravità, il suono relativo viene percettivamente “messo a fuoco”: il panning tende a centrarsi e il volume aumenta, in modo coerente con l’idea di osservazione ravvicinata. Viceversa, la distanza influenza direttamente l’intensità percepita: più un oggetto è lontano, più il suo contributo viene attenuato, ottenendo un volume spazializzato che riduce il mascheramento e mantiene leggibile il mix complessivo.

Ogni categoria di corpo celeste ha un ruolo musicale dedicato, così da costruire una stratificazione stabile. Il Sole fornisce la base suonando la tonica bassa dell’accordo. I pianeti lavorano su note sostenute, con un comportamento di “glide” sulla tonica che enfatizza continuità e massa. Gli asteroidi, infine, aggiungono dettagli rapidi con pluck brevi e fluidi, contribuendo alla micro-dinamica senza appesantire la scena sonora.

notes


Angelo Antona, 23 Dicembre 2025