CodeSounding library: trasformare codici sorgenti in computer generated music sounds (sonification)

SourceForge.net Logo

Demo
Wiki Home   Computer generated music sounds from a source code structure Download   Sonification examples Documentazione   How to make computer generated music sounds with CodeSounding java library

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.

 ABC
 jMusic
Codice sorgente Spartito

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

    Altre risorse in italiano:
  • 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).
    Fig.1  Fig.2  Fig.3  Fig.4 
    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.


~ Copyright © 2006 2008 - Roberto Mannai (robermann@gmail.com) ~