Composizione algoritmica e notazione automatica. Lo strano caso di “Historia universalis” / 2

di Andrea Valle

[Pubblichiamo la seconda parte dell’articolo di Andrea Valle “Composizione algoritmica e notazione automatica. Lo strano caso di ‘Historia universalis'”. Per la prima parte, cliccare qui.] 

II.

Il secondo passaggio è di tipo analitico, ed è fondamentale per capire la struttura dell’informazione in modo da poterla sfruttare.

[fig. 2]

L’assunto era infatti che in qualche modo ogni pezzo dovesse essere strutturalmente legato ai fatti dell’anno in questione. Che informazione estrarre? Un’analisi compiutamente semantica della dimensione linguistica sarebbe stata interessante, ma avrebbe rischiato di aprire un vaso di Pandora ingestibile (quali relazioni semantiche? Come modellarle? Attraverso quali strumenti? Più che un lavoro di composizione diventa un programma di ricerca). L’informazione estratta riguarda perciò un indice linguistico di base, ma non irrilevante: la distribuzione delle parole. La fase di analisi (analysis) importa tutti i file, ne scompone le stringhe contenute in parole, elimina la punteggiatura, esclude un elenco di termini non lessicali o empiricamente troppo “vaghi” (articoli, pronomi, numeri, essere/avere etc., un lavoro aiutato dalla natura isolante e non flessiva dell’inglese), infine produce due strutture dati. Ranks è un dizionario che associa a ogni parola il numero delle occorrenze nel corpus complessivo. Ad esempio, “byzantine” è associato a 516 occorrenze nei primi 1000 anni di storia raccontati da Wikipedia. Il dizionario wordRanks, invece, associa le parole a pari numero di occorrenze a quel numero. Attraverso quest’ultima struttura emerge un’interessante gerarchia linguistica. La seguente è la top ten delle parole più frequenti nel racconto dei primi 1000 anni dopo Cristo (nel formato: numero occorrenze [parole]): nessuna sorpresa, ma comunque un’immagine icastica di che cosa sia la storia nel racconto sociale.

1526[ king ]

1304[ emperor ]

891[ roman ]

678[ becomes ]

649[ date ]

592[ empire ]

581[ approximate ]

573[ against ]

547[ army ]

527[ pope ]

In undicesima posizione, il nostro “byzantine” a pari merito con “battle”:

516 [byzantine, battle]

Evidentemente, associate a una singola occorrenza (cioè a 1) vi sono moltissime parole (8909 per la precisione), ovvero quelle che costituiscono dei veri e propri hapax legomena nel corpus prescelto. Se si disegna la curva che lega numero di parole e numero di occorrenze, si ottiene il classico diagramma della legge di potenza, che in linguistica è conosciuto come legge di Zipf (fig. 3): poche parole per molte occorrenze, molte parole per poche occorrenze.

[fig. 3]

Da queste due strutture se ne può derivare una terza. Se ogni anno può essere rappresentato da una lista di fatti (cioè, di stringhe), allora ogni stringa può essere convertita nella sequenza dei valori numerici di occorrenza delle parole che la compongono (di fatto la sequenza dei ranghi nel corpus). Ad esempio, il secondo fatto dell’anno 1 è

“Gaius Caesar and Lucius Aemilius Paullus are appointed consuls.”

e viene convertito nella sequenza di ranghi

[ 32, 71, 0, 55, 7, 4, 0, 76, 66 ]

dove il punto finale è eliminato, e le entrate speciali (and, are) ricevono valore 0.

Un altro dato analitico immediato ma interessante concerne quella che si potrebbe chiamare la densità storica. Molto semplicemente, alcuni anni sono ricchi di fatti, altri meno, altri ancora sono noiosamente (o meglio, quietamente) vuoti. Un istogramma della densità in funzione della sequenza degli anni (Figura 4) rivela un fatto – a scelta – ovvio o doloroso.

[fig. 4]

Non c’è nessun pattern nella storia, ma soltanto un segnale rumoroso, “full of sound and fury, signifying nothing”, come direbbe il poeta. Se però si disegna la curva che lega numero di fatti in ascissa e numero di anni che hanno lo stesso numero di fatti in ordinata si ottiene una curva interessante (Figura 5).

[fig. 5]

In alcuni anni non succede nulla (0 fatti), in tanti tra i 5 e gli 11 fatti. Sopra i 14 fatti (a parte la lieve risalita a 16), quello specifico numero di fatti caratterizza un singolo anno: in sostanza la distribuzione termina in una coda lunga (come si dice) quantitativamente poco significativa. Per concludere, alla fine dell’analisi, ogni anno è una sequenza di sequenze di valori numerici (i fatti scomposti in ranghi di parole), la cui dimensione è tipica rispetto a una certa distribuzione. Questo passaggio analitico, a parte le bizzarre ma – almeno per chi scrive – non inutili divagazioni a cui conduce, è fondamentale per la composizione, perché è noto che la composizione algoritmica è una “art of mapping”: il giusto modo di correlare un dominio in ingresso e un codominio in uscita. E quindi bisogna conoscere il dominio per organizzarne la relazione con il codominio.

III.

Il terzo passaggio concerne la notazione vera e propria, un passaggio che è strettamente imbricato alla composizione. A tal fine, con un certo sforzo di fantasia e un buon ripasso della letteratura [1], ho approntato 15 notazioni differenti. Queste notazioni sono molto eterogenee, alcune volte includono una linea temporale rispetto alla quale sono specificati eventi, altre volte semplicemente un sistema di relazioni tra eventi da realizzare, alcune volte prevedono notazione tradizionale, altre volte esclusivamente elementi grafici non standard, in un caso semplicemente si prevede l’indicazione verbale “Free!”. Ogni notazione è dunque associata a un numero di fatti, da 0 a 13 (ovvero la campana della curva di Figura 5), mentre un’ultima notazione è associata a tutti i fatti superiori a 14 (la coda della distribuzione di Figura 5). Non sfido la pazienza del lettore entrando nel dettaglio delle 15 notazioni. La Figura 6 riporta sei dei 15 tipi (come si nota, lo sfondo di ogni notazione riprende i fatti dell’anno).

[fig. 6]

Il punto è che una certa notazione è dunque associata ad un numero di fatti e parametrizzata in funzione (variabile da notazione a notazione) dei ranghi dei singoli fatti in ognuno degli anni. Per quanto possano essere indeterminate nei risultati (per dirla con Cage), non c’è alcun elemento stocastico alla base della parametrizzazione, ogni notazione è generata del tutto deterministicamente. Risultato: 1000 pezzi diversi attraverso in 15 notazioni.

L’intero processo è descritto in Figura 7.

[fig. 7]

Come si vede in Figura 6, queste notazioni prevedono sempre l’inclusione in un formato rettangolare di dimensione fissa. Per questo contenitore grafico è stato impiegato NodeBox, un insieme di librerie in Python per la grafica generativa con un orientamento esplicito alla generazione di immagini vettoriali. Anche gli elementi grafici della notazione sono stati generati in NodeBox. Quelli musicali invece sono stati ottenuti attraverso il software di tipografia musicale automatica LilyPond. Infine, un tipo di notazione richiedeva la costruzione di grafi (si veda in Figura 6 l’esempio XXVI), per i quali GraphViz era il candidato perfetto. Ciò che caratterizza tutti questi software è la descrizione del contenuto grafico in forma testuale, un elemento essenziale per poter essere inseriti in una procedura generativa. In tutti e tre i casi precedenti, sono disponibili software dotati di interfaccia grafica per scrivere e compilare i file sorgenti (ad esempio, NodeBox si presenta come una applicazione complessiva dotata di GUI; per LilyPond, oltre all’editor di riferimento, è disponibile Frescobaldi; mentre molti frontend esistono per il formato dot di GraphViz). Una interfaccia grafica è fondamentale in fase di prototipazione e verifica, ma in tutti e tre i casi la compilazione può avvenire da linea di comando via terminale. Stante questa situazione, si tratta allora di generare un insieme di file di testo e di compilarli nei file vettoriali (pdf) risultanti.

La generazione delle notazioni è affidata a una collezione di 15 programmi in SuperCollider [da ora in poi SC], i notatori (in Figura 7 notator.scd), raccolti in un dizionario (Notator dictionary). Ogni notatore, una volta selezionato, riceve in ingresso i dati relativi all’anno, fatti e statistiche. Il notatore legge il contenuto di un file template in Nodebox (template.ly) e, se richiesto, quello di un file template LilyPond o GraphViz (rispettivamente .ly o .dot). I template sono molto utili, perché codificano tutta l’informazione grafica e includono informazioni extra-notazionali quali il numero progressivo e un identificativo del tipo di notazione (per riferimento). Il processo di generazione in SC si limita a inserire nel contenuto dei template un insieme di parametri numerici calcolati a partire dalle informazioni dell’anno in questione. Il notatore SC quindi scrive un file NodeBox (year.py) con le istruzioni per la generazione della notazione e gli opportuni parametri. Nel caso siano richiesti file LilyPond o GraphViz, genera questi file a partire dai relativi template e inserisce nel file year.py i riferimenti alle immagini risultanti (in Figura 7 si assume di generare lily.ly). Il processo complessivo (generator) effettua un un batch processing [2] su tutti i 1000 file. Per ognuno (year), analizza il numero dei fatti e seleziona dal dizionario dei notatori quello richiesto, a cui vengono passati i dati relativi all’anno. Il notatore quindi scrive un file year.py ed eventuali file LilyPond (.ly) e GraphViz (.dot).

Il passaggio si conclude con la compilazione in batch processing sempre da SC (attraverso compiler) di tutti i file generati, in primo luogo quelli LilyPond e GraphViz (nel nostro caso, lily.ly) poiché i file NodeBox (year.py) possono contenere riferimenti alle immagini risultanti da questi, in modo che vi vengano incluse.

IV.

Dunque, il risultato finale del passaggio III è costituito da 1000 file di immagini vettoriali in pdf che costituiscono le 1000 notazioni, una per anno. L’assemblaggio in un documento unitario è operato attraverso ConTeXt, un sistema per la redazione avanzata dei documenti che si basa sul motore tipografico TeX e che, di nuovo, funziona attraverso la compilazione di file di testo. Come si vede in Figura 8, diventa così possibile generare un file di testo che faccia riferimento a tutti i mille file immagine nel corretto ordine.

[fig. 8]

Di nuovo, la generazione automatica è essenziale data la mole dei comandi da inserire nel file historia.tex (1502 righe). La sua compilazione darà origine a un documento unitario. A questo blocco centrale si possono poi aggiungere gli altri elementi necessari (copertina, note esecutive, etc). Tuttavia, l’oggetto risultante dalla compilazione non è particolarmente maneggevole, poiché si tratta di un pdf di 513 pagine (due notazioni per pagina più altre informazioni, come si vede qui). La stampa in copisteria è problematica non solo per il costo ma anche per la dimensione. La soluzione per la stampa, in qualche modo centrata sull’oggetto libro, è stata quella di usare il sistema di print-on-demand di Lulu.com. In questo modo lo strano oggetto si costituisce in un vero e proprio volume.

Cosa rimane dalla costruzione di un simile marchingegno?

Continuando a saltare volutamente a piè pari la questione strettamente musicale, due considerazioni in fine di partita. La prima concerne il problema della relazione tra notazione e composizione, due dimensioni che non sono ortogonali nella composizione scritta: si scrive per una certa musica, si compone a partire da una certa scrittura. Di qui il mio sospetto per soluzioni integrate pre-assemblate di composizione e notazione, e la mia preferenza per sistemi fluidi, la cui definizione è parte del lavoro compositivo. La seconda, più filosofica e meno tecnologica, riguarda l’idea di esplorazione della forma. La forma in Historia universalis è quella di un dato abbastanza inusuale, per non dire bislacco. La possibilità di individuare e manipolare una forma anche in questo caso, e di farlo interattivamente, è l’elemento più affascinante dell’approccio algoritmico. Si fa mentre si fa, “con molta pazienza imparando la tecnica mentre opero e senza sapere prima che cosa verrà fuori dopo” (B. Munari).

[1] Tre classici lungo quarant’anni: J. Cage e A. Knowles, Notations, New York, Something Else Press 1969; D. Lombardi, Spartito preso, Torino, Vallecchi 1981; T. Sauer, Notation 21, New York, Mark Batty 2009. Alcune mie considerazioni teoriche sono in A. Valle, La notazione musicale contemporanea, Torino, EDT 2002.

[2] Ovvero: l’esecuzione di un insieme di processi in un programma o in un calcolatore senza intervento manuale/interattivo.

 

 

Composizione algoritmica e notazione automatica. Lo strano caso di “Historia universalis” / 2 ultima modifica: 2018-03-30T09:59:00+02:00 da Luisa Santacesaria

Lascia una risposta