Il linguaggio MusicXII, da me ideato nel 2005, tuttora in fase di sviluppo, trae origine dagli studi condotti presso l’IRCAM di Parigi (Institut de Recherche et Coordination Acoustique/Musique, fondato da Pierre Boulez) da Carlos Agon e Gérard Assayag, membri dell’equipe di ricerca Representation Musicales dello stesso istituto. Finalità del gruppo di ricerca è lo studio delle modalità di rappresentazione simbolica delle strutture musicali e delle loro applicazioni per la Composizione Musicale Assistita dal Computer (CMAC) e per l’Informatica Musicale (Musicologia Computazionale: teoria e analisi musicale al computer). La Composizione Musicale Assistita da Computer (CMAC) costituisce il punto più elevato della ricerca musicale nel campo dell’informatica musicale: scopo della ricerca è lo studio, lo sviluppo, la descrizione e la formulazione teorica di procedure di flusso (istruzioni di processo) per la risoluzione di problemi inerenti la composizione e la teoria musicale. Lo studio ha avuto inizio verso la fine degli anni ’50 con i primi esperimenti di scrittura automatica di partiture di Lejaren Hiller e con la sintesi sonora di Max Mathews. All’inizio vennero utilizzati gli sterili e ostici codici in linguaggio macchina (pensiamo a Pietro Grossi impegnato con le schede perforate) che fornivano istruzioni dirette al processore per l’esecuzione di calcoli. Oggi utilizziamo linguaggi evoluti quasi simili al linguaggio umano, provvisti di sistemi di compilazione automatica (trasparenti all’utente) che permettono in tempo reale di convertire istruzioni in lingua inglese in codici macchina. Non bisogna tuttavia pensare che l’ausilio dell’elaboratore si risolva in una sterile lista di istruzioni, a volte pre-compilate, contenenti automatismi e algoritmi pronti per la produzione di eventi. Gli stessi algoritmi sono oggi in grado di modificare la propria struttura interna in modo dinamico e interattivo. L’elaborazione assistita consente di svolgere, con tranquillità e certezza del risultato, compiti noiosi, ripetitivi, estremamente complessi, lasciando al compositore la possibilità di occuparsi della parte creativa, molto più gratificante. In particolare, i software CMAC consentono di generare sintesi sonore, mediante l’uso di tecniche diversificate secondo il tipo e la complessità dell’elaborato; di utilizzare i codici MIDI per trasferire informazioni standard fra macchine con hardware e sistema operativo diversi; di generare istruzioni di scrittura melodico-armonica o strutturata secondo particolari direttive; svolgere compiti che richiedono l’insieme delle possibilità esaminate. OpenMusic (OM), ad esempio, è un ambiente di programmazione visuale finalizzato alla creazione di applicazioni per la composizione assistita dal computer ed è disponibile per i sistemi operativi Mac 0S 9, Mac OS X, Linux (una versione per i sistemi Windows è in fase di sviluppo). Le funzionalità open-source sono limitate dal momento che i sorgenti di OM e dei software collegati non sono di pubblico dominio: alcuni richiedono anche di sostenere costi non indifferenti. Si è quindi ritenuto opportuno, nello sviluppo di un software CMAC in grado di generare e controllare strutture correlate alla teoria dei Sonemi, di scrivere un codice proprietario, realmente OpenSource, disponibile su rete Internet sia nei sorgenti che nei moduli, in linguaggio (anch’esso OpenSource) PHP: MusicXII. MusicXII (leggi "music-twelve") mutua da OpenMusic la logica strutturale: un programma principale coordina e gestisce una serie di moduli (plug-in) che possono generare script più complessi organizzandosi in forme più elevate nella tecnica della programmazione ad oggetti. MusicXII è un software di gestione di processi compositivi, non di funzionalità hardware: scopo degli script è quello di generare un file MIDI standard di tipo 1 che possa essere importato e letto da altri software compositivi e/o notazionali (ad es. Finale, Cubase, Logic), implementato e modificato secondo le necessità del compositore ed eventualmente corretto sia nella parte generativa che in quella esecutiva in ambito deterministico. La logica di MusicXII è la seguente: abbiamo quattro tipologie strutturali definite CODICI > MODULI > OGGETTI > FLUSSI. I CODICI sono costituiti da istruzioni base per la generazione di semplici eventi sonori di tipo MIDI: ad es. l’istruzione n:a,b,c,d genera il controllo MIDI (decimale) di un evento sonoro (nota) di durata determinata. È costituito, oltre al marker oggettuale (n:), da quattro elementi (a,b,c,d): (a) valore del canale midi; (b) evento codificato in tre cifre (nome della nota, alterazione, ottava); (c) durata (numeratore/denominatore o valore numerico in tick); intensità (in forma letterale da ppp a fff o numerica da 0 a 127). Le istruzioni sono disposte progressivamente in una lista testuale con ogni linea di comando terminata da un return (termine linea). Es.: n:1,Cn0,1/4,mf n:2,En0,3/8,30 Le linee verranno lette, interpretate e codificate in un codice MIDI eseguibile da un apposito compilatore. Il file che contiene le istruzioni, definito FLUSSO, ha estensione “.flx”. Da notare la scrittura “naturale” dei codici: la progressione è data dalla posizione in lista, il canale midi determina l’esecuzione del codice in modalità contemporanea o sequenziale (canale identico per eventi sequenziali, ovvero con DeltaTime identico). Nell’esempio precedente gli eventi verranno eseguiti contemporaneamente perchè i canali midi sono diversi. Le note vengono indicate in notazione anglosassone utilizzando le lettere minuscole n, d, b per le alterazioni (naturale, diesis, bemolle). Nulla vieta di usare indicazioni di frequenza (es. 125H) predisponendo lo script alla conversione e disponendo di un hardware in grado di gestire l’evento. Le ottave sono indicate con numeri da 0 a 8. Per l’indicazione di durata viene utilizzata la notazione standard (es. 3/8, numeratore per numero di unità del denominatore, nell’es. tre crome) o il valore espresso in tick. I tick sono denominati anche ppqn (pulse per quarter notes o pulsazioni per note da un quarto): una semiminima in notazione standard corrisponde a 240 ppqn o tick. Nello script in esame, nella prima istruzione, ad es., è possibile usare indifferentemente il vslore “1/4” o “240”. L’intensità viene indicata con i codici “ppp, pp, p, mp, mf, f, ff, fff” o con i valori da 0 a 127. Valori superiori vengono ignorati e normalizzati a 127; lo 0 viene utilizzato per generare codici silenziosi (pause). La modalità di scrittura naturale permette di apprendere velocemente il linguaggio e scrivere quasi subito i primi codici generativi. I CODICI comprendono praticamente tutte le istruzioni disponibili nel linguaggio SMF (Standard Midi File). I MODULI sono funzioni e/o classi pre-compilate, nel senso che sono in grado di generare una o più sequenze di codici in base a parametri variabili. Nel flusso l’istruzione appare come (ad es.): mod:nome_modulo-a,b,n I moduli sono sempre preceduti dal prefisso “mod:”. I termini a,b costituiscono i parametri variabili (illimitati, n). Ad esempio, nel modulo “cpunto_a”: mod:cpunto_a-3,200 Il modulo determina la generazione di un evento sonoro multiplo casuale parzialmente controllato. Il codice è costituito dal tag mod: seguito dal nome del modulo (cpunto_a) e dal numero delle voci complessive (a) distinte da un trattino (-a). Segue, separato da una virgola, il numero complessivo degli eventi singoli (b). Può essere ripetuto ed inserito in qualsiasi sequenza di flusso. In cpunto_a il range è il seguente: note (C,D,E,F,G,A,B); ottave (da 2 a 5); alterazioni (d,b,n); dinamiche (pp,p,mp,mf,f); numeratore (da 4 a 12); denominatore (8,16,32,64). Il modulo opera quindi sia in base a parametri (variabili) forniti dal compositore (composizione a 3 voci, quindi su 3 canali midi diversi; 200 eventi complessivi), sia in base ad altri parametri (pre-definiti ma ugualmente variabili poiché selezionati in modo casuale) già presenti all’interno della funzione. Un generatore di numeri casuali determina, per ogni evento, la frequenza, l’ottava, le alterazioni, le dinamiche, il numeratore e il denominatore temporale. Viene prodotta una sequenza di CODICI interpretati successivamente dal compilatore. Nel flusso scriveremo: mod:cpunto_a-3,200 mod:cpunto_a-2,500 mod:cpunto_a-1,120 Con possibilità di alternare moduli e codici: mod:cpunto_a-3,200 n:1,Cn0,1/4,mf Ogni compositore può produrre propri moduli con funzioni specifiche ma, per questo, è richiesta la conoscenza del linguaggio di programmazione PHP (simile a C++) e gli script specifici di interfacciamento con MusicXII (disponibili in quanto OpenSource). I moduli possono produrre qualsiasi tipo di istruzione multipla con infinite varianti e parametri di controllo. Vediamo un esempio di modulo seriale. Nel flusso l’istruzione appare come: mxii:miditest mthd:1,240 copy: 0,Copyright 2008 ABerg nomeseq:0,Brano Test mod: serie-1,0,2,4,7,s,[1;3;2;1],[1/4;1/4;1/8;1/4],[32;ff;mf;64;64] Il mod. serie è delegato alla scrittura di brani seriali: in questa sede possiamo esaminare solo superficialmente il modulo che permette una completa gestione di procedimenti a serializzazione totale. Esso determina la generazione di serie dodecafoniche con indicazione del tipo e delle note iniziali e finali, sulla base di pattern intervallici, ritmici e dinamici racchiusi tra parentesi quadre. Il codice è costituito dal tag /mod:serie-/ seguito da: (a) canale di assegnazione, (b) nota di origine in notazione numerica (0-11), (c) ottava iniziale, (d) nota di destinazione in notazione numerica (0-11) o lettera "a" per determinazione automatica in base al numero degli intervalli, (e) ottava finale o lettera "a" per determinazione automatica in base al numero degli intervalli, (f) tipo di serie: s= serie, s4= serie alla IV, s5= serie alla V, i= inversione, i4= inversione alla IV, i5= inversione alla V, r= retrogrado, r4= retrogrado alla IV, r5= retrogrado alla V, ir= inversione retrograda, ir4= inversione retrograda alla IV, ir5= inversione retrograda alla V (g) pattern intervallico reale costituito da serie di valori (da un singolo valore a undici intervalli od oltre) separati da ";" racchiusi tra parentesi quadre, (h) pattern ritmico costituito da serie di valori (numeratore/denominatore o valore numerico durata) separati da ";" e racchiusi tra parentesi quadre, (i) pattern dinamico costituito da serie di valori (letterali o numerici) separati da ";" e racchiusi tra parentesi quadre. Può essere ripetuto ed inserito in qualsiasi sequenza di flusso. Il file di flusso deve sempre contenere come prima istruzione il comando mxii seguito da due punti e il nome del file: in mancanza del codice convenzionale non viene riconosciuto e quindi ignorato in fase di compilazione. La seconda istruzione (mthd:1,240) definisce il valore standard della semiminima (in questo caso 240 ppqn); seguono quindi codici di copyright e di assegnazione del nome della sequenza (facoltativi) e il modulo serie. In fase di compilazione il file viene compilato come: # 1: mxii:miditest # 2: mthd:1,240 # 3: copy:0,Copyright 2008 ABerg # 4: nomeseq:0,Brano Test # 5: mod:serie-1,0,2,4,7,s,[1;3;2;1],[1/4;1/4;1/8;1/4],[32;ff;mf;64;64] # 6: n:1,Cn2,1/4,32,serie # 7: n:1,Cd2,1/4,ff,serie # 8: n:1,En2,1/8,mf,serie # 9: n:1,Fd2,1/4,64,serie # 10: n:1,Gn2,1/4,64,serie # 11: n:1,Gd2,1/4,32,serie # 12: n:1,Bn2,1/8,ff,serie # 13: n:1,Cd3,1/4,mf,serie # 14: n:1,Dn3,1/4,64,serie # 15: n:1,Dd3,1/4,64,serie # 16: n:1,Fd3,1/8,32,serie # 17: n:1,Gd3,1/4,ff,serie # 18: n:1,An3,1/4,mf,serie # 19: n:1,Ad3,1/4,64,serie # 20: n:1,Cd4,1/8,64,serie # 21: n:1,Dd4,1/4,32,serie # 22: n:1,En4,1/4,ff,serie # 23: n:1,Fn4,1/4,mf,serie # 24: n:1,Gd4,1/8,64,serie # 25: n:1,Ad4,1/4,64,serie # 26: n:1,Bn4,1/4,32,serie # 27: n:1,En5,1/4,ff,serie Il modulo serie viene sviluppato producendo una sequenza di codici di tipo “n” (note ad esecuzione immediata). Vengono quindi generati i codici SMF decimali che, convertiti in formato eseguibile, consentiranno di ascoltare il brano in tempo reale o di esportarlo verso altri software per elaborazioni successive. MusicXII genera contemporaneamente anche un file di report che permette di avere una completa analisi delle procedure e dei dati prodotti. Ad es. l’analisi del midifile generato: #0> dt=0 - p=1 - ch=1 - n=Cn2 - ott=2 - cod=48 - mod=0 - v=32 - dur=240 - #1> dt=240 - p=2 - ch=1 - n=C#2 - ott=2 - cod=49 - mod=1 - v=112 - dur=240 - #2> dt=480 - p=3 - ch=1 - n=En2 - ott=2 - cod=52 - mod=4 - v=80 - dur=120 - #3> dt=600 - p=4 - ch=1 - n=F#2 - ott=2 - cod=54 - mod=6 - v=64 - dur=240 - #4> dt=840 - p=5 - ch=1 - n=Gn2 - ott=2 - cod=55 - mod=7 - v=64 - dur=240 - #5> dt=1080 - p=6 - ch=1 - n=G#2 - ott=2 - cod=56 - mod=8 - v=32 - dur=240 - #6> dt=1320 - p=7 - ch=1 - n=Bn2 - ott=2 - cod=59 - mod=11 - v=112 - dur=120 - #7> dt=1440 - p=8 - ch=1 - n=C#3 - ott=3 - cod=61 - mod=1 - v=80 - dur=240 - #8> dt=1680 - p=9 - ch=1 - n=Dn3 - ott=3 - cod=62 - mod=2 - v=64 - dur=240 - #9> dt=1920 - p=10 - ch=1 - n=D#3 - ott=3 - cod=63 - mod=3 - v=64 - dur=240 - #10> dt=2160 - p=11 - ch=1 - n=F#3 - ott=3 - cod=66 - mod=6 - v=32 - dur=120 - #11> dt=2280 - p=12 - ch=1 - n=G#3 - ott=3 - cod=68 - mod=8 - v=112 - dur=240 - #12> dt=2520 - p=13 - ch=1 - n=An3 - ott=3 - cod=69 - mod=9 - v=80 - dur=240 - #13> dt=2760 - p=14 - ch=1 - n=A#3 - ott=3 - cod=70 - mod=10 - v=64 - dur=240 - #14> dt=3000 - p=15 - ch=1 - n=C#4 - ott=4 - cod=73 - mod=1 - v=64 - dur=120 - #15> dt=3120 - p=16 - ch=1 - n=D#4 - ott=4 - cod=75 - mod=3 - v=32 - dur=240 - #16> dt=3360 - p=17 - ch=1 - n=En4 - ott=4 - cod=76 - mod=4 - v=112 - dur=240 - #17> dt=3600 - p=18 - ch=1 - n=Fn4 - ott=4 - cod=77 - mod=5 - v=80 - dur=240 - #18> dt=3840 - p=19 - ch=1 - n=G#4 - ott=4 - cod=80 - mod=8 - v=64 - dur=120 - #19> dt=3960 - p=20 - ch=1 - n=A#4 - ott=4 - cod=82 - mod=10 - v=64 - dur=240 - #20> dt=4200 - p=21 - ch=1 - n=Bn4 - ott=4 - cod=83 - mod=11 - v=32 - dur=240 - #21> dt=4440 - p=22 - ch=1 - n=En5 - ott=5 - cod=88 - mod=4 - v=112 - dur=240 - (Legenda: dt = delta time / p = posizione evento / ch = canale di emissione / n = nota prodotta / ott = ottava / cod = codice decimale SMF / mod = numerazione mod. 12 / v = valore di intensità / dur = durata della nota) Se i MODULI possono già produrre interessanti sequenze formali, gli OGGETTI permettono di generare strutture di complessità illimitata compilando istruzioni in grado di generare MODULI che a loro volta verranno compilati per generare CODICI esecutivi. Si tratta di un processo di composizione “a scatole cinesi” che permette al compositore la massima libertà e autonomia espressiva ottenendo il controllo di strutture a qualsiasi livello di complessità. In fase di compilazione è possibile altresì visualizzare le strutture generate mediante partiture grafiche prospettiche particolarmente precise e completamente personalizzabili nel numero e tipo di valori richiesti, nelle forme grafiche, nella posizione della linea di fuga (linea dei canali), stampa video dei dati, ecc. In definitiva, MusicXII permette all’utente non in possesso di conoscenze informatiche di utilizzare il naturale e relativamente semplice file di flusso per scrivere sequenze di istruzioni anche complesse utilizzando le librerie incluse nel programma (FLUSSI); l’utente in possesso di adeguata esperienza di programmazione potrà invece avvalersi degli esempi già realizzati e scrivere nuove procedure ad hoc per compiti specifici. Nella composizione per Sonemi, MusicXII è fondamentale nella produzione delle radici generative primarie (RAW) grazie al preciso e massimo controllo delle strutture formali che consente di ottenere una solida base strutturale e una completa documentazione delle procedure di sviluppo nonché precise partiture grafiche del complesso del materiale di base utilizzato. Molto si potrebbe ancora dire sullo sviluppo degli algoritmi, sulle connessioni estetiche tra definizioni di codici di flusso e individuazione dei livelli neutri, sulla gestione del materiale in fase di interpretazione mediante assegnazione di valori timbrici e agogiche, ma lo spazio e il tempo, necessariamente limitati per ogni opera, non consentono, in questa sede, ulteriori approfondimenti. Tutto ciò che riguarda, e riguarderà, la produzione di opere basate sulla teoria dei sonemi sarà pubblicato su rete Internet quando saranno disponibili i primi lavori completi in MusicXII. |