Soundscape Composer
Guida all'uso, filosofia, preparazione dei file, riferimento dei controlli.
Filosofia generale
Soundscape Composer ricostruisce un paesaggio sonoro in tempo reale muovendo un puntatore sulla mappa di un luogo reale. Ogni posizione attiva una combinazione diversa di suoni stratificati, pescati dalle clip caricate dall'utente e organizzati secondo le cinque categorie della teoria del soundscape di R. Murray Schafer.
Lo strumento non ricombina le clip in modo casuale: segue un modello ispirato a diverse tradizioni teoriche e compositive.
- R. Murray Schafer, The Soundscape (1977)
- Distinzione funzionale tra tonica (keynote), segnale (signal) e soundmark. Ogni paesaggio sonoro si articola su questi tre livelli di salienza percettiva.
- Bernie Krause
- Composizione triadica biofonia, antropofonia, geofonia. Le fonti sonore si bilanciano in modo ecologico.
- Tradizione GRM (Parmegiani, Ferrari, Westerkamp)
- Costruzione drammaturgica per stratificazione di livelli tonici continui e gesti in primo piano. Il tempo non si misura, si modella.
Il controllo è intenzionalmente semplice: un solo puntatore sulla mappa. Tutto il resto è continuo (toniche e pad in loop), ciclico (segnali ed eventi probabilistici) o reattivo (soundmark al passaggio). La mappa non è una divisione, è un campo di attrazione: ogni zona ha un peso che decade con la distanza dal suo centro, e le zone possono sovrapporsi.
Principi compositivi cui il sistema si attiene:
- Nessun sequencer, nessuna griglia temporale. Il tempo emerge dal gesto sulla mappa e dai generatori stocastici.
- Le categorie si stratificano, non si alternano. Una tonica può convivere con un pad, un soundmark e due segnali; ciò che cambia è la loro densità e intensità.
- La mappa come partitura. Le zone sono campi con pesi proporzionali alla distanza dal centro. Pointer al centro di una zona, gain pieno; tra due zone, entrambi i contributi normalizzati; fuori da tutte, il sistema aggancia comunque il contributo della zona più vicina.
- Nessuna sincronia forzata. Ogni sorgente ha il suo tempo: le toniche girano in loop, i segnali appaiono a intervalli random, i soundmark rispondono al movimento del puntatore.
Flusso di lavoro
- Preparare le clip secondo le indicazioni della sezione Preparazione dei file.
- Caricare ogni clip nella propria categoria tramite drag o selezione.
- Calibrare le zone con "Modifica zone": trascinare gli handle colorati sui punti reali del luogo, regolare raggi e nomi. Le posizioni si salvano automaticamente nel browser.
- Avviare la composizione con "Avvia composizione".
- Muovere il puntatore sulla mappa per modellare la stratificazione.
- Registrare il risultato con "Registra", fermare e scaricare il file.
Le cinque categorie
Toniche (keynotes)
Suono di fondo continuo che definisce l'identità acustica del luogo. È presente in modo persistente anche quando non vi si presta attenzione. In montagna: vento nelle conifere. In fabbrica: brusio dei macchinari. In un borgo agricolo: traffico lontano e insetti diffusi.
Comportamento nel Composer: sempre in loop, gain modulato dal peso della zona cui è assegnata. Una tonica per zona (round-robin sulle clip caricate).
Pad
Texture stratificata che colora l'ambiente senza definirne l'identità: meno saliente della tonica, utile per creare profondità e stratificazione armonica o timbrica. Esempi buoni: registrazioni di spazi vuoti, code di riverberi naturali, droni ambientali non intonati.
Comportamento: loop come le toniche, ma a volume leggermente inferiore (x0.7 rispetto alla tonica stessa zona).
Segnali
Suoni in primo piano che attirano l'attenzione: hanno inizio e fine chiaramente percettibili. Richiami vocali, campanacci, suoni meccanici brevi, clacson, rintocchi isolati.
Comportamento: triggerati in modo probabilistico a intervalli random, solo se il puntatore si trova dentro una zona. Pan automatico in base alla posizione della zona dominante.
Soundmark
Il suono identitario del luogo, quello che lo rende riconoscibile. In un monastero: la campana che scandisce le ore. A Villa Ficana: un elemento specifico del borgo (voce di guida, scricchiolio di una porta di terra cruda, campana locale).
Comportamento: triggerato una volta all'ingresso in una zona, con gain che segue la vicinanza del puntatore. Se esci dalla zona mentre è in corso, il volume cala fino al fade-out.
Eventi brevi
One-shot sporadici, ispirati all'arte acusmatica. Uno scricchiolio, uno scatto, un passo isolato, uno schiocco, il tintinnio di un oggetto. Sfalsano il continuum con un gesto puntuale.
Comportamento: come i segnali, trigger probabilistico con intervalli tipicamente più lunghi.
Preparazione dei file
Durate consigliate
| Categoria | Durata | Loop | Dinamica |
|---|---|---|---|
| Toniche | 30 s - 3 min | Si | Compressa (crest factor basso) |
| Pad | 30 s - 3 min | Si | Compressa, evolutiva lenta |
| Segnali | 2 - 15 s (singola emissione) | No | Attacco riconoscibile |
| Soundmark | 10 - 40 s | No | Ben registrato, dinamica naturale |
| Eventi brevi | 1 - 10 s | No | Energia concentrata |
File lunghi e segmentazione automatica
Se hai una registrazione lunga di 2 minuti con molti segnali diversi (una piazza in una mattinata di mercato, una foresta con richiami discontinui), puoi caricarla come singolo file e attivare "Estrai porzioni casuali dai file lunghi" nel pannello Trigger. Lo scheduler analizzerà il file, calcolerà l'RMS su finestre di 1 secondo, e ad ogni trigger pescherà una porzione random dal top 30% per energia, con una durata random tra min e max configurabili. Utile per segnali, soundmark ed eventi.
Livelli consigliati
Il Composer non normalizza le clip in ingresso: i livelli che carichi sono quelli che suoneranno. Suggerimenti su LUFS integrato (misurabile con Reaper, Audacity + plugin dpMeter, Youlean Loudness Meter, ffmpeg loudnorm).
| Categoria | LUFS integrato | True peak consigliato |
|---|---|---|
| Toniche, pad | -23 a -18 LUFS | -6 dBTP |
| Segnali, soundmark | -18 a -14 LUFS | -3 dBTP |
| Eventi brevi | -16 a -12 LUFS | -3 dBTP |
Lasciare almeno 3 dB di headroom: gli FX per categoria aggiungono guadagno (riverbero, delay) e il limiter finale potrebbe distorcere se il totale supera i -1 dBFS.
Loop pulito per toniche e pad
- Tagliare al zero-crossing su entrambe le estremità per evitare click.
- Evitare fade-in o fade-out lunghi: il Composer applica un suo fade-in di 2 s all'avvio.
- Se il contenuto lo permette, applicare un crossfade di 50-200 ms fra i tagli (l'ultima cosa nel file il cui inizio viene mescolato con la fine).
- Evitare eventi puntuali riconoscibili (un colpo, una voce riconoscibile): creano pattern ripetitivi al loop.
Formati accettati
Il Composer accetta i formati gestiti nativamente da Web Audio API nel browser corrente:
- WAV (PCM 16 / 24 / 32 bit)
- MP3
- OGG Vorbis
- M4A / AAC
- FLAC (attenzione su Safari vecchie)
- WebM Opus
Da evitare se si punta a un workflow stabile:
- FLAC ad alto bit depth su Safari < 14.1.
- MP3 VBR con header non standard: alcuni decoder falliscono con
I/O read operation failed. Se ti capita, riesporta in WAV o MP3 CBR. - File mono convertiti a stereo con soli canali duplicati: sprecano spazio senza aggiungere informazione spaziale.
Controlli libreria
Ogni pannello categoria (sulla sinistra) contiene la stessa struttura:
| Controllo | Funzione |
|---|---|
| Titolo + conteggio | Nome della categoria e numero di clip attualmente caricate. |
| Drop zone | Trascinare o cliccare per caricare uno o più file audio. Accetta drop multipli. |
| Lista clip | Ogni riga mostra nome, durata, slider volume clip, bottoni Play e Elimina. |
| Play / Stop | Preview manuale della clip. Stop chiude anche le istanze avviate dallo scheduler (soundmark, segnali, eventi) con fade breve. |
| Slider volume clip | Trim per-clip, 0-120%. Si applica a un nodo di gain indipendente e viene salvato in IndexedDB (resta al reload). |
| Elimina | Rimuove la clip dalla libreria e dalla cache, liberando memoria. |
| Pannello Effetti | Richiudibile. Contiene EQ 16 bande, compressore, delay, riverbero, limiter della categoria. |
| Pannello Trigger | Solo per segnali, soundmark, eventi brevi. Controlli per intervalli, overlap, segmentazione RMS. |
Gain, Solo, Mute per categoria
Nella testata di ogni categoria, accanto al contatore:
- Slider volume categoria (0-120%)
- Gain applicato all'output della FX chain della categoria, prima del master. Curva lineare.
- S (Solo)
- Quando attivo (giallo), silenzia tutte le altre categorie che non sono a loro volta in solo. Si possono mettere più categorie in solo contemporaneamente: suonano tutte quelle con S attivo.
- M (Mute)
- Quando attivo (rosso), silenzia la categoria indipendentemente da qualsiasi altra cosa. Se una categoria è sia in solo che in mute, prevale il mute.
Tutte le transizioni solo/mute hanno un ramp di 120 ms via setTargetAtTime, nessun click.
Catena effetti per categoria
Ogni categoria ha la sua catena indipendente. Routing:
sorgente → EQ 16 bande → Compressore → (dry + Delay + Riverbero paralleli) → Limiter → gain categoria → master
EQ 16 bande parametrico
Filtri peaking in serie, Q fisso 1.4, range ±12 dB. Frequenze centro:
32, 64, 125, 200, 315, 500, 800, 1250, 2000, 3150, 5000, 6300, 8000, 10000, 14000, 18000 Hz.
Reset: azzera tutte le bande.
Compressore
| Parametro | Range | Default |
|---|---|---|
| Threshold | -60 dB a 0 dB | -18 dB |
| Ratio | 1:1 a 20:1 | 3:1 |
| Attack | 1 - 200 ms | 8 ms |
| Release | 10 - 1000 ms | 150 ms |
Il compressore è basato su DynamicsCompressorNode, con knee fisso a 6 dB.
Delay
| Parametro | Range | Default |
|---|---|---|
| Send | 0 - 1 | 0 (off) |
| Tempo | 20 ms - 2.5 s | 350 ms |
| Feedback | 0 - 0.95 | 0.35 |
Il feedback è limitato a 0.95 per evitare auto-oscillazione incontrollata. Il delay è parallelo (send/wet).
Riverbero
| Parametro | Range | Default |
|---|---|---|
| Send | 0 - 1 | 0 (off) |
| Dimensione (decay) | 0.3 - 6 s | 2.5 s |
Basato su ConvolverNode con IR sintetica (rumore bianco con inviluppo esponenziale). Cambiando Dimensione, l'IR viene rigenerata.
Limiter
Threshold configurabile (default -1 dB), ratio fisso 20:1, attack 1 ms, release 50 ms, knee 0. Protegge l'output della categoria da clipping dopo gli FX.
Mappa e zone
La mappa usa Leaflet con tile satellitari Esri World Imagery. Il luogo di default è Villa Ficana, Macerata (43.29883 N, 13.43201 E, zoom 19), che è anche la demo. Con il bottone Cambia luogo nell'intestazione della mappa si passa a un altro posto, la propria posizione GPS, un luogo cercato per nome (ricerca a cura di OpenStreetMap, Nominatim) o coordinate scritte a mano. Le quattro zone circolari si dispongono attorno al centro del luogo scelto con nomi generici (Ingresso, Centro, Margine, Verde) e si salvano per luogo nel browser; a Villa Ficana restano i nomi del borgo.
Puntatore
Icona microfono 3D trascinabile. Si sposta con drag del marker, click su un punto della mappa, o bottone "Centra" (lo riporta al centroide delle zone). Il punto di riferimento per il calcolo dei pesi di zona è la base del microfono (dove appoggia l'ombra).
Editing delle zone
Bottone "Modifica zone" nell'header della mappa:
- Appaiono handle colorati trascinabili sul centro di ogni zona.
- Si apre un pannello sotto la mappa con rename, slider raggio (3-80 m), colore.
- Salvataggio automatico in localStorage: al prossimo reload le zone sono dove le hai lasciate.
- Bottone "Reset posizioni" per tornare ai placeholder di default.
- "Fine modifica" chiude il pannello.
Motore spaziale
Il peso di ogni zona rispetto alla posizione del puntatore si calcola come:
peso_grezzo = max(0, 1 - distanza / raggio) ^ 1.6
I pesi vengono poi normalizzati (somma = 1) quando il totale grezzo supera 0.05. Se il puntatore è fuori da tutte le zone, la zona più vicina riceve comunque un peso di fallback di 0.35 per evitare silenzio totale.
La curva ^1.6 rende la transizione più morbida ai bordi (contributi piccoli restano presenti anche ai margini della zona) mentre il centro resta ben definito.
Illuminazione visiva
Quando il puntatore si trova in una zona di sovrapposizione tra più cerchi, tutte le zone coinvolte si illuminano proporzionalmente al loro peso (curva ^0.7 per dare visibilità anche ai contributi piccoli). Questo rispecchia esattamente il comportamento audio: ogni zona contribuisce in proporzione, non solo la dominante.
Modulazione audio delle toniche e dei pad
All'avvio composizione, una clip per categoria ambient (tonica, pad) viene assegnata a ogni zona in round-robin sulle clip caricate. Parte in loop a gain 0, e il suo gain viene poi aggiornato di continuo dal motore spaziale in base al peso della zona, con glide esponenziale (setTargetAtTime, time constant 0.2 s, ~95% in 0.6 s).
Questo garantisce crossfade continui senza scatti, anche quando il puntatore si muove rapidamente.
Scheduler e trigger
I pannelli Trigger appaiono solo per segnali, soundmark, eventi brevi (toniche e pad non hanno trigger: girano sempre in loop).
Parametri scheduler (segnali, eventi brevi)
- Attivo durante la composizione
- Toggle principale. Se off, quella categoria non viene mai triggerata automaticamente.
- Intervallo min / max
- Tempo di attesa tra un trigger e il successivo. Lo scheduler estrae un valore random dall'intervallo ad ogni tick.
- Overlap max
- Numero massimo di istanze della categoria che possono suonare sovrapposte. Se già N istanze sono attive, il nuovo trigger viene scartato (non in coda) finché una non termina.
- Estrai porzioni casuali dai file lunghi (RMS)
- Checkbox per abilitare la segmentazione. Se attivo e il file caricato è più lungo di "Durata estratto min", lo scheduler sceglie una porzione random dal top 30% per RMS e la suona per una durata random tra min e max.
- Durata estratto min / max
- Intervallo di durata della porzione estratta.
Condizioni perché un trigger scatti
- Composizione avviata.
- Trigger della categoria attivo.
- Almeno una clip caricata nella categoria.
- Puntatore dentro una zona (peso dominante > 0.15).
- Overlap sotto il limite.
Pan automatico
Il pan stereo di ogni trigger è calcolato in base alla longitudine della zona dominante rispetto al centroide delle zone, con una piccola variazione random per evitare ripetitività. Zone a est: pan a destra. Zone a ovest: pan a sinistra.
Soundmark
Il soundmark ha un comportamento particolare, distinto da segnali ed eventi.
- Ad ogni zona viene assegnato automaticamente un soundmark (round-robin sulle clip caricate).
- Il soundmark parte all'ingresso del puntatore nella zona, con fade-in di 0.5 s e gain iniziale proporzionale al peso della zona (minimo 15% per restare udibile).
- Mentre il puntatore è nella zona, il gain del soundmark segue il peso (glide 0.5 s).
- Se il puntatore esce (peso < 0.08), il soundmark fa fade-out di 1 s e si chiude, lasciando la zona pronta per un nuovo ingresso.
- Finché il soundmark di una zona è in vita, un nuovo ingresso nella stessa zona non lo ri-triggera.
- Se hai attivato la segmentazione per soundmark, vale la stessa logica RMS dei segnali: porzione random dal top 30%, durata configurabile.
Registrazione
Bottone "Registra" nell'header (si sblocca dopo aver premuto "Avvia" per l'AudioContext). Cattura il bus master, ovvero tutto il mix dopo le FX chain di categoria e il master gain.
Formato:
- WebM Opus su Chrome, Firefox, Edge.
- M4A AAC su Safari.
- OGG Opus come fallback.
Bitrate 256 kbps stereo. Il file si scarica automaticamente alla pressione di "Ferma registrazione" con nome soundscape-YYYYMMDD-HHmmss.<ext>.
Consigli pratici di composizione
Pre-bilanciare le clip prima del caricamento
Il Composer non normalizza. Una tonica a -10 LUFS e un'altra a -22 LUFS produrranno squilibri marcati. Spendere 15 minuti con un loudness meter prima del caricamento risolve la maggior parte dei problemi di mix.
File mono per segnali puntuali
I trigger di segnali ed eventi applicano un pan automatico: se il file di partenza è stereo con un'immagine già definita, il pan aggiunto può suonare strano (doppio pan). Per segnali vocali, percussivi o puntuali, preferire file mono.
Toniche loopabili
La tonica è la struttura portante. Spendere tempo su un buon loop di 1-2 minuti che non "respiri" in modo prevedibile vale più di dieci toniche non loopabili. Se il file ha un respiro naturale (crescendo/decrescendo), cercare il punto di loop nel punto di "riposo" dell'onda.
Soundmark identitari
Resistere alla tentazione di usare campane qualsiasi o suoni generici. Il soundmark è quello che rende riconoscibile il luogo: registrare sul posto, anche con un microfono modesto, rende di più di una libreria di sample generici.
Gestire la densità con Overlap
Overlap 1 per segnali e eventi genera una tessitura "rarefatta" con eventi ben distinti. Overlap 3 genera un ambiente affollato (piazza animata, foresta densa). Dipende dal paesaggio che vuoi rappresentare.
Usare gli FX in modo minimale
Il riverbero lungo a 3 s su tutte le categorie contemporaneamente satura il mix. Meglio: riverbero medio solo sui segnali, niente riverbero sulle toniche (che spesso lo hanno già registrato). Delay: solo su eventi singolari, mai su continui.
Risoluzione problemi
- "Impossibile avviare la composizione: The I/O read operation failed"
- Safari non è riuscito a decodificare uno specifico file. La composizione parte comunque saltando il file problematico e logga il nome in console. Riconvertire il file in WAV o MP3 CBR risolve.
- Non sento nulla dopo "Avvia composizione"
- Verificare: è stata caricata almeno una tonica? Il puntatore è dentro una zona? Le zone sono effettivamente sul luogo giusto (ricalibrabili con "Modifica zone")? Il master gain è sopra 0? La categoria non è in mute o esclusa da un solo altrove attivo?
- Il puntatore non è visibile
- Cliccare "Centra" per riportarlo al centroide delle zone. Fare hard reload (Cmd+Shift+R) se il service worker ha una versione cachata.
- Le modifiche non hanno effetto dopo il reload
- Il service worker potrebbe aver cachato una versione vecchia. Hard reload risolve. In casi estremi: DevTools → Application → Service Workers → Unregister.
- iOS non produce audio al primo tap
- iOS richiede una gesture esplicita per sbloccare l'AudioContext. Il bottone "Avvia" serve esattamente a questo. Se non parte: toccare qualunque elemento della pagina, poi riprovare.
- Scheduler attivato ma i trigger non scattano
- Controllare: il puntatore è dentro una zona? Almeno una clip è caricata? L'intervallo min/max non è troppo lungo? L'overlap è sotto il limite?
Tool correlati
soundscape-audio-analysis
Pipeline Python per l'analisi delle clip prima del caricamento nel Composer. Progetto di ricerca personale, distribuito come skill di Claude Code. Consigliata per bilanciare e verificare i file destinati alle cinque categorie.
Calcola:
- Livelli: peak, RMS, crest factor, LUFS integrato (ITU-R BS.1770), true peak.
- Diagnosi tecnica: clipping, DC offset, hum 50/60 Hz con baseline locale.
- Spettro: bande Schafer, centroide, rolloff, flatness, picchi spettrali, onset density.
- Indici ecoacustici: ACI (Acoustic Complexity Index), NDSI, entropia H, BI, ADI/AEI.
- Classificazione semantica: PANNs CNN14, YAMNet, auto-tagging CLAP italiano su 70 prompt.
- Confronto con profili GRM: Parmegiani, Westerkamp, Ferrari, Krause.
- Report PDF: singola clip o corpus comparativo (LUFS, dynamic range, heatmap bande, radar ecoacustico, similarità CLAP).
Workflow consigliato: analizzare le clip con soundscape-audio-analysis, verificare i livelli LUFS rispetto ai target di questa guida (sezione Preparazione dei file), correggere i livelli in DAW, poi caricare nel Composer.
Repository pubblico: github.com/francmo/soundscape-audio-analysis. Licenza: codice Apache 2.0, dati/documenti CC BY 4.0.