CodeSounding: trasformare la struttura dei file sorgenti in musica
CodeSounding può essere visto come un modo per creare computer-generated music,
ovvero una libreria che applica una "sonification" al codice sorgente: il suono prodotto a runtime è funzione della struttura del codice sorgente da cui è stato ottenuto il programma stesso.
L'idea del progetto è nata per caso, durante una discussione su come generare "algoritmicamente" della musica glitch (alcuni esempi). Durante lo sviluppo del progetto mi son sorti dubbi di pitagorica memoria: è possibile che il processo mentale che elabora l'algoritmo e che infine "coagula", si fissa, nell'insieme di istruzioni che compongono il codice sorgente, possa considerarsi anche da una prospettiva sonora? Esistono regole che instaurano un isomorfismo tra ragionamento e senso estetico? Ora, certamente la matematica presenta tanti esempi di bellezza: una semplice occhiata ai frattali credo sia eloquente. Perchè un algoritmo informatico non si dovrebbe poter rappresentare in un modo così stupefacente? Sempre di matematica si tratta. E se fosse possibile udire la sfuggente proprietà detta "qualità del software"?
CodeSounding non ha certo la pretesa di rispondere a questa domanda provocatoria, piuttosto è un'umile proof of concept.
Tecnicamente, il processo di "sonification" consiste nell'elaborazione dei file sorgenti in modo da aggiungervi delle callback negli eventi "if, for" ecc. Questa operazione è chiamata token stream rewriting. Le operazioni di callback sono strutturate sul design pattern template: ciò permette di scegliere e configurare a runtime, cioè quando l'applicazione viene eseguita, l'algoritmo che genera la musica. Propriamente dunque la "sonification" non è effettuata sulla struttura statica del codice sorgente ma sulla dinamica dell'esecuzione.
Per il parsing dei sorgenti uso una grammatica ANTLR,
mentre per generare la musica uso il linguaggio/notazione ABC (vedi i siti di Guido Gonzato
e Chris Walshaw), la libreria jMusic o il server audio JACK.
Novità
28-marzo-2008 - Musica e astronomia: ieri ho partecipato alla conferenza "L'eterna danza", tenuta presso il Planetario di Milano; cito dalla presentazione:
Sin dall'antichità, astronomi e filosofi hanno cercato di cogliere ordine e simmetria nel movimento dei pianeti,
che danzano contro lo sfondo delle stelle fisse. Questa armonia è stata spesso rappresentata come armonia
musicale, se non addirittura sonora. Nel 1600 Keplero elabora un modello del cosmo in cui confluiscono sia la tradizione
classica, sia importanti elementi di modernità. In piena rivoluzione copernicana, egli è convinto che le
velocità dei pianeti non siano casuali, ma tali da comporre una vera e propria musica celeste.
Sono rimasto veramente affascinato da questa "cosmo sonification". Consiglio vivamente di guardare e ascoltare
il seguente filmato Flash, che espone in modo oserei dire didattico le idee sviluppate da Keplero nel suo Harmonices Mundi
del 1619: http://www.calderon-online.com/trabajos/kepler/harmonicemundi.swf
7-marzo-2008 -
Rilascio della versione 1.4. E' stato aggiunto il supporto al server audio JACK, su piattaforme Linux; questo, mediante un'architettura client-server basato su callback, permette di mettere 'in pipe' l'audio di differenti software, sincronizzandoli attraverso un server temporale. L'audio generato da CodeSounding può dunque essere elaborato attraverso programmi JACK-compatibili, nonchè diventare sorgente dati per visualizzatori audio come projectM. Clicca qui per un esempio su YouTube.
Dal punto di vista concettuale considero l'audio prodotto dalla classe codesounding.jjack.SamplerSumProcessor come l'esperimento più riuscito nel creare un suono il più puro possibile, senza 'contaminazioni' legate all'arbitrarietà della scelta degli strumenti musicali, a funzioni logaritmiche, a troncamenti nella spartitura MIDI, come invece accadeva con i 'processor' delle precedenti release. Rimane la scelta delle ampiezze (float da -1 a +1) da associare a ciascun tipo di istruzione (for, if ecc), nonchè la scelta dell'intervallo di campionatura (in nanosecondi - ogni circa 11 millisecondi il server JACK (quando lanciato a 44,1 kHz) richiede ai propri client un frame di 512 elementi). Ogni campionatura è la risultante della somma delle ampiezze d'onda associate a ciascun tipo di istruzione.
22-agosto-2007 -
Rilascio della versione 1.3. Gli ultimi aggiornamenti sul Wiki:
11-dicembre-2006 -
Rilascio della versione 1.2. Il post-processamento dei file java è ora possibile
anche su macchine Linux.
29-luglio-2006 -
Rilascio della versione 1.1. La novità principale è la classe codesounding.jmusic.LogaRythm, che, oltre ad
utilizzare JMusic al posto di ABC, introduce un nuovo algoritmo di "sonification": ogni 50 millisecondi verifica quante istruzioni
per ciascun tipo sono state eseguite (fig. 1).
Ne calcola il logaritmo naturale (fig. 2), e il valore 10 di ordinata (posto come massimo raggiungibile) viene suddiviso tra i 128 toni disponibili in jm.constants.Pitches. Inoltre calcola la pendenza della
variazione tra un intervallo e l'altro (quanto velocemente varia una categoria - in valore assoluto)(fig. 3) e ne calcola
il logaritmo naturale (fig.4). I valori compresi tra 0 e 1, aumentati di un'unita' (per non avere durate brevissime),
rappresentano la durata di una nota: questa varia dunque nel range tra jm.constants.Durations.QUARTER_NOTE
e jm.constants.Durations.HALF_NOTE.
Infine, a ogni categoria (if, for, ecc) è assegnato uno strumento. Il suo ritmo indica quanto peso hanno le istruzioni corrispondenti durante l'esecuzione, e quanto velocemente tale peso varia.
Clicca qui per un esempio:
22-luglio-2006 -
Ilia Malinovsky ha creato un progetto molto simile a questo, con la differenza che nel suo la
musica viene prodotta durante l'analisi sintattica (parsing) di un codice sorgente,
mentre in CodeSounding viene creata durante l'esecuzione di un programma appositamente compilato. Bello e musicale già
dal nome: LYCAY - "Let Your Code plAY".
20-luglio-2006 -
Phil Burk precisa che questo progetto
è un tipo di sonification, in quanto converte dati non musicali (in questo caso del
codice sorgente scritto in java) in suoni o eventi musicali.