Tecniche interattive e composizione algoritmica. Un'introduzione

1. Introduzione

Le tecniche interattive e la composizione algoritmica in tempo reale assumono una grande importanza nelle opere, mie e di altri compositori, in cui l'elaboratore è al centro della produzione di eventi musicali.

Questo documento intende esporre in modo semplice anche se per forza di cose incompleto, l'utilizzo che si è fatto di tecniche interattive e per la composizione algoritmica in tempo reale ed in generale fornire al lettore una panoramica sull'argomento qui trattato.

Si intende anche delineare, in modo sintetico, le necessità che hanno spinto, in precedenza, altri compositori ad utilizzare tecniche interattive nei lori pezzi, assieme ad una breve panoramica di precedenti realizzazioni di questo tipo.

2. Uno sguardo al passato

Per prima cosa definiamo il concetto di composizione algoritmica.

Si definisce come algoritmico quel processo musicale che si svolge, prevalentemente mediante elaboratore digitale, in base ad un ben determinato schema che viene utilizzato per la generazione delle strutture musicali. L'oggetto del comporre, in questo caso, non sono gli eventi sonori in senso stretto (altezze, durate, timbro), ma il processo stesso di composizione.

Per composizione algoritmica si intende quindi la composizione, a partire da qualche materiale preesistente, mediante tecniche definite, con o senza l'uso dell'elaboratore elettronico di materiale musicale originale o riconducibile al materiale di partenza.

I primi esempi di composizione algoritmica si possono ravvisare nel XVIII secolo, quando si diffuse tra compositori come Bach, Haydn e Haendel il divertimento di comporre musica mediante l' utilizzo dei dadi.

Nel 1757 Kirnberger pubblicò la guida alla composizione delle polonaise e dei minuetti con l'aiuto dei dadi.

Si deve inoltre a W.A. Mozart la pubblicazione di un manuale per la composizione di Valzer con l'aiuto dei dadi.

Il manuale conteneva una tabella ad otto linee (corrispondenti alle otto battute della composizione) e sei colonne (corrispondenti alle facce di un dado). In ogni casella di questa tabella si trovava una sequenza di note della durata di una battuta.

Le otto battute si ottenevano gettando il dado otto volte e scegliendo le note corrispondenti alla casella individuata dal numero ottenuto in base al lancio dei dadi e dalla battuta in costruzione. Il numero delle possibili composizioni è dato da :

6

8

= 1.679.616


L'abilità del compositore stava nel preparare la tabella in modo che ogni combinazione di note scritta in una casella potesse gradevolmente proseguire con una qualsiasi combinazione di note contenuta in una successiva casella.

Nel nostro secolo, uno tra i primi compositori ad utilizzare tecniche di composizione algoritmica è senza dubbio John Cage.

In John Cage, le tecniche di composizione algoritmica si potrebbero definire IN TEMPO DIFFERITO, in quanto consistevano per lo più di istruzioni date ai performers per selezionare o generare elementi più o meno estesi della composizione come ad esempio i fogli che compongono il brano o per generare dal nulla gli eventi sonori stessi.

Solo più tardi, quando la tecnologia lo ha reso possibile (vedi elaboratori digitali) John Cage, affiancato dal programmatore Andrew Culver ha realizzato delle vere e proprie composizioni algoritmiche che, comunque, forse per abitudine, non erano destinate all'utilizzo in tempo reale.

Erano dei veri e propri generatori di materiale musicale ma non solo; venivano generati anche parametri relativi alla disposizione di sedie e luci, ed altro.

3. La composizione algoritmica

Un utilizzo originale di tecniche compositive di tipo algoritmico si deve al compositore greco Iannis Xenakis. Inizialmente attivo nell'area dell'architettura (fu collaboratore di Le Corbusier), egli elabora un personale utilizzo di processi naturali, teorie fisiche e matematiche (termodinamica, calcolo combinatorio) per creare delle collezioni di eventi sonori individuali che concorrono in modo aleatorio ad un'esplosione fonica globale.

Stimolato dalle originali idee di Dennis Gabor (Gabor, 1947) egli tende a lavorare sia a livello maro che micro-strutturale per 'nuvole' di eventi sonori, trascurando il particolare per interessarsi piuttosto della globalità dell'opera.

Il ruolo dell'elaboratore nella composizione algoritmica è fondamentale in quanto ci permette di passare da un processo che avviene PRIMA della trascrizione degli eventi musicali su spartito o della realizzazione del nastro magnetico, alla generazione degli eventi sonori in tempo reale con una eventuale interazione tra esecutore ed elaboratore.

Il tema dell'interazione tra esecutore ed elaboratore è centrale, in quanto grazie alle nuove tecnologie si è superata la dicotomia nastro-esecutore tipica della musica elettronica dal suo nascere fino ai primi anni Ottanta.

Sicuramente è grazie all'elaboratore personale che la composizione algoritmica ha avuto quello sviluppo che tuttora noi osserviamo; la disponibilità di tale tecnologia anche al di fuori dei grossi centri di elaborazione e la contemporanea disponibilità di sintetizzatori operanti secondo lo standard MIDI, ha consentito anche ai singoli compositori di realizzare sistemi per la composizione algoritmica.

Aver portato il computer fuori dai grossi centri di ricerca, oltre ad una ovvia democratizzazione del mezzo (accessibilità, economicità), ha permesso di superare il tipico connubio nastro esecutore o alle performance per solo nastro o per solo elaboratore.

Comunque, dai grossi centri di ricerca sono venuti gli stimoli maggiori per la realizzazione di sistemi in tempo reale, anche se, storicamente, in quei centri, la ricerca musicale si è sviluppata prevalentemente verso l'aspetto timbrico.

Contemporaneamente a queste ricerche, che avvenivano principalmente nei grossi centri di ricerca, si è visto un fiorire di software musicale per elaboratori personali e principalmente per i computers Apple Macintosh ed Atari serie ST che vanno dai semplici sequencers (Vision, Cubase, Notator) ai più complessi programmi per le gestione di eventi sonori con metodologie algoritmiche (Jam Factory, M!) ai veri e propri ambienti di programmazione, dedicati e non alle applicazioni musicali (Formula , HTMSL, HyperLisp, Max ) agli editors di campionamenti e timbri di sintetizzatori (TurboSynth, Alchemy, Galaxy).

Vogliamo qui ricordare i compositori Larry Polansky e Tod Machover che, seguendo strade e tecnologie diverse, per il primo il linguaggio HMSL e le scale microtonali, per il secondo l'utilizzo di DataGloves e del linguaggio HyperLisp, hanno realizzato veri e propri capolavori del genere.

Un ruolo importantissimo nella ricerca sui sistemi in tempo reale è stato espletato dall'IRCAM, centro parigino di ricerca fondato e diretto per molti anni dal compositore francese Pierre Boulez, autore a sua volta di importanti opere che utilizzano sistemi in tempo reale. All'IRCAM nei primi anni Ottanta Giuseppe di Giugno ha realizzato le sue macchine della serie 4, e sempre all'IRCAM il linguaggio MAX è stato concepito.

Si vuole inoltre ricordare l'importante contributo del compositore e ricercatore Rober Rowe che realizza, per le proprie esigenze compositive un programma per Macintosh denominato "Cypher".

4. Tecniche compositive

Iniziamo qui una breve introduzione alle tecniche compositive che, di norma vengono impiegate nei processi di composizione algoritmica. Il problema principale è quello di generare 'dal nulla' degli eventi musicali.

Abbiamo visto nella parte introduttiva un semplice esempio di processo musicale che dà luogo alla generazione di eventi sonori, in quel caso strutturati nella forma di valzer.

In generale, è possibile implementare ogni meccanismo mentale a sua volta descrivibile mediante una sequenza di operazioni elementari sotto forma di un algoritmo. E' così possibile utilizzare come fonte di partenza delle equazioni matematiche che descrivono dei fenomeni caotici, naturali e non, come pure realizzare alcuni algoritmi che trasformino materiale musicale preesistente applicando le operazioni tipiche della teoria dodecafonica.

Altri formalismi spesso utilizzati sono quelli che fanno uso di catene di Markov come pure ogni altro tipo di equazione differenziale che porti ad una generazione stocastica di eventi, interpretati poi musicalmente.


5. Tecniche interattive

Ciò che rende la Computer Music attuale così stimolante è però la possibilità di interazione tra l'elaboratore e l'esecutore.

Nel caso di performances ci sarà interazione tra il computer ed il performer, nel caso di installazioni ci sarà interazione tra il computer e l'audience. Le tecniche interattive ci permettono quindi di realizzare situazioni sonore sempre vive e diverse a causa della diversità di interazione tra il computer e ciò che egli accetta come input dall'esterno.

Possiamo difatti distinguere tre diverse fasi in un sistema per la Computer Music Interattiva:

La prima è la fase di 'sensing' o di ascolto nella quale si analizzano e memorizzano eventi che hanno origine da 'strumenti' (devices) controllati dai performers o dai sensori che catturano eventi esterni come il movimento dell'audience o un cambiamento della temperatura ambientale.

La seconda fase è quella di 'processing' o di elaborazione, quando le informazioni raccolte durante la prima fase vengolo elaborate dal sistema ed eventualmente trasformate. Ai dati in input possono aggiungersi dati che vengono generati durante questa fase senza nessuna relazione con la prima.

La terza fase e quella di 'response' o di risposta del sistema quando il risultato musicale dell'intero processo viene, mediante schede sonore o sintetizzatori e campionatori MIDI realizzato per l'ascolto sonoro.

Le tre fasi vengono delineate in questo modo perchè corrispondono a diversi tipi di devices da utilizzare: nella prima fase controllers midi come tastiere, pedali, pitch trackers, nella seconda un'unità di elaborazione (personal computer o dispositivo dedicato) nella terza sintetizzatori, campionatori, schede sonore.

Tra i vari dispositivi di input ricordiamo inoltre i DataGloves ed in particolare l'economico Powerglove della Nintendo che permettono al performer di interagire in modo 'virtuale' con il computer rendendo possibile l'elaborazione di informazioni relative alla posizione nello spazio del guanto, alla sua torsione ed alla flessione delle dita.

Inoltre resta aperta la possibilità di collegare al computer, con apposite interfacce realizzate allo scopo, una serie di devices come sensori all'infrarosso e ad ultrasuoni, ricevitori radio, telecamere, etc.

6. Un utilizzo personale

Sin da quando queste tecnologie si sono rese disponibili, il mio interesse verso di esse fu notevole, a partire dalle idee del compositore Mauro Graziani da lui ben esposte nel Bollettino del LIMB.

In "Isole" tale approccio è solo accennato: per la scarsa disponibilità di software/hardware adatto allo scopo avevo deciso di adottare per l'occasione alcuni nastri ed un sequencer.

La disponibilità, nel 1991 di Max mi ha aperto sicuramente nuove strade, portandomi alla realizzazione di FELE, installazione interattiva multimediale dove faccio uso di un sistema interattivo in tempo reale con composizione algoritmica degli eventi.

In "Fele" ho utilizzato per la parte di 'sensing' dei sensori all'infrarosso e alle microonde che rilevando i movimenti dell'audience, rendevano il campo sonoro realizzato continuamente mutevole ed interessante.

Per la parte di processing ho deciso di utilizzare algoritmi che fanno uso di tabelle dove ho memorizzato alcune curve di marea. Da meccanismi di alea controllata riesco a ricavare, in base a queste tabelle, gli eventi sonori, definiti di volta in volta secondo macroparametri identificativi ma, come singoli eventi, sempre diversi.

In "Chaos Logos Kronos", utilizzerò per la parte di sensing una tastiera MIDI con pedali e switch ed un Powerglove che controllerà diversi parametri esecutivi tra cui il cambio di stato del pezzo.

In Sky Waves, invece, ho utilizzato per la parte di sensing dei ricevitori radio ad onde corte che inviano all'elaboratore centrale dati meteo trasmessi da una serie di stazioni meteo sparse in una certa zona.







L'abitudine ti ha portato a non creare di volta in volta risposte originali e pertinenti a un dato momento. Non creando le tue risposte, ma aspettandoti di fatto che esse scaturiscano in modo passivo, passi la tua vita in stato di ipnosi, programmato a rispondere agli stimoli in base ai dati raccolti nei tuoi primissimi anni di vita; Rivoluzione come sconvolgimento di automatismi, abitudini e/o funzioni fisiologiche;


(
    var a,b,c,d;
    a=Pseq([Pseq([0,0,0,0,0],1),Pseq([1,1,1,-1,-1],1)],1);
    b=Pseq([Pseq([1,1,1,1,1],1),Pseq([4,-1,4,-1,-1],1)],1);
    c=Pseq([Pseq([0,0,0,0,0],1),Pseq([0,0,0,0,0],1)],1);
    d=Pseq([Pseq([-1,-1,-1,-1,-1],1),Pseq([2,2,2,1,1],1)],1);
    Pbindef(~bzbass,\instrument,\bz_bass,\scale,Scale.yu,\root,5,\octave,3,
        \degree,Pseq([Pn(a,2),Pn(b,2),Pn(a,2),Pn(b,2),Pn(c,2),Pn(d,2),Pn(c,2),Pn(d,2)],inf),\dur,Pbjorklund2(5,9)/3,\amp,0.4,\rel, 0.3,\pan, -0.3);
)


(
    var a,b,c,d;
    a=Pseq([Pseq([0,0,0,0,0],1),Pseq([1,1,1,-1,-1],1)],1);
    b=Pseq([Pseq([1,1,1,1,1],1),Pseq([4,-1,4,-1,-1],1)],1);
    c=Pseq([Pseq([0,0,0,0,0],1),Pseq([0,0,0,0,0],1)],1);
    d=Pseq([Pseq([-1,-1,-1,-1,-1],1),Pseq([2,2,2,1,1],1)],1);
    //~synth =
    Pbindef(~x, \instrument,\synth,\scale,Scale.yu,\root,5,\octave,Pseq([2,3],inf),
    \degree,Pseq([Pn(a,2),Pn(b,2),Pn(a,2),Pn(b,2),Pn(c,2),Pn(d,2),Pn(c,2),Pn(d,2)],inf),\dur,Pbjorklund2(5,9)/3,\amp,0.3,\rel, 0.3,\pan, 0.3);
)

(
    var a,b,c,d;
    c=Pseq([0,0,0,0,0,0,0,0],1);
    d=Pseq([-1,-1,-1,-1,-1,-1,-1,-1,2,2,2,2,2,2,2,2,-1,-1,-1,-1,-1,-1,-1,-1,2,2,2,2,2,2,2,1],1);
    Pbindef(~bzbass2, \instrument,\bz_bass,\scale,Scale.yu,\root,5,\octave,2,
    \degree,Pseq([Pn(c,4),Pn(d,1)],inf),\dur,Pbjorklund2(8,9)/3,\amp,0.4,\rel,
    0.3,\pan,-0.3);
)
Alcune Strategie potrebbero essere:

Destructive/Analytical Programming : Rimuovi parti di codice esistente per esplorare come ciascuna parte rimossa contribuisce all'intero processo. In generale, la programmazione conversazionale interattiva può essere uno strumento utile per imparare come funziona il codice esistente.

Proxy Refactoring : riorganizza il codice esistente: se si tratta di un singolo Proxy, trasforma i suoi componenti in singoli Proxy, in modo che vengano esposti per modifiche indipendenti. Se il codice è composto da Proxy più piccoli, uniscili in un numero minore, più grandi. A causa di una diversa struttura di dipendenza, in ogni fase, le modifiche alle singole parti generano diversi cambiamenti sonori.

Time-Warping :  Utilizzare un singolo parametro che rappresenti il ​​Tempo (o il conteggio) per parametrizzare vari processi, che possono essere funzioni stateless o routine stateful. Di conseguenza, ogni processo è una funzione diretta del Tempo.

Switchboard Programming : Avvia processi multipli continui, quindi controlla quelli che diventano udibili commutando gli algoritmi.

Parameter Modification: Avvia un processo, quindi modifica ciascuno dei suoi parametri almeno una volta.

Mixed Mode Parameter Tweaking: consente di passare dalla modifica dei parametri alla riscrittura dei processi audio che questi parametri controllano. Lo stesso parametro può assumere un altro significato durante una revisione. Task o input esterni possono continuamente variare i parametri, mentre la loro interconnessione viene riscritta.

Purloined Letters: prendi il codice di un co-musicista e modificalo; diversi Esploratori possono decidere di creare set di variazioni parallele dello stesso codice di partenza.

Topic Exploration: concorda un argomento da esplorare e crea suoni partendo da questo Topic.

Tandem Programming: programmando da terminale, riscrivi un singolo processo audio in rete. In alternativa, più Live Coder possono programmare variazioni di un singolo flusso di input.

Conversational Sonification: Scegli alcune fonti di dati come argomento per la Sonificazione; prova a creare diverse rappresentazioni sonore per la stessa fonte di dati, discutendo il dominio e le implicazioni epistemologiche.

Chat Model: Conversazione terminale, raffinamento e sviluppo iterativo tramite dialogo con il programma.

Ex Nihilo, editor di testo vuoto/canvas: inizia con l'editor vuoto e aggiungi le cose nel più breve tempo possibile. Nelle situazioni Multicoders, inizia con un documento vuoto e scrivi il codice per diluire i suoni dell'intero gruppo.

Isolation Exercises

Typing Practice : (il record mondiale di velocità di digitazione al momento si attesta su una media di 12 caratteri al secondo).

Memory: tenere a mente tutti i processi e i dettagli (specialmente senza alcun promemoria grafico durante la codifica dal vivo) può essere di aiuto negli esercizi di pratica della memoria.

Algorithmic Building Blocks: prendi spunto dai meccanismi linguistici di incapsulamento/ricorsione/iterazione e ciclo condizionale a algoritmi specifici per l'ordinamento o l'organizzazione dei dati.

Mathematical Constructs: potrebbero essere di ispirazione particolari problemi matematici discreti come riff per mostrare l'engagement algoritmico: il problema 3x + 1, la radice quadrata di Babylonian, teorie dei numeri (cioè setacci, sommari Goldbach, algoritmi di numeri primi ecc.), teoria dei gruppi (simmetrie, catene di permutazione).

Computer Music Constructs: sintesi del suono e tecniche di composizione algoritmica, rappresentazioni da accordature non standard (ad esempio Just Intonation to x-limit) per parametrizzazioni timbriche, mappature musicali incluso conoscenza della psicoacustica e della cognizione musicale.

Attention and Awareness: mentre l'automatismo può aiutare per una migliore gestione delle proprie risorse potenziali, allenare la concentrazione può portare enormi benefici. La meditazione e la riflessione possono anche avere un ruolo nella gestione dello stress e dell'ansia da concerto, anche se il sovraccarico di adrenalina tende ad essere ridotto per gli artisti esperti dopo che hanno accumulato ore e ore di performance.

Fonti : Improvising Formalisation Conversational Programming and Live Coding, Julian Rohrhuber and Alberto de Campo; Live Coding Practice, Click Nilson




John Howard Carpenter (Carthage, 16 gennaio 1948) è un regista, sceneggiatore, compositore, musicista, attore, produttore cinematografico e montatore statunitense.

la Freak Track è composta Realtime, generando, valutando e modificando codice;

(
    ~sinfb = Pbind(\instrument,\daf_bass,\scale,Scale.major,\root,2,\octave,[3,4],
    \degree,Pseq([7,1,3,1],inf),\dur,Pbjorklund2(5,8)/4,\amp,0.15,\fb,0.1,\rel,
    0.3);
    ~feedback = {SinOsc.kr(0.1,-1,1).range(0,1.713)};
    ~sinfb.set(\fb,~feedback);
    ~sinfb.play(quant:0.1);
    ~h.play;
    ~k.play;
    ~k2.play;
)

(
    var i=2;
    ~sinfb = Pbind(\instrument,\daf_bass,\scale,Scale.major,\root,2,\octave,[3,4],
    \degree,Pseq([1,Pfunc({i=i+1;if (i==18) {i=17}; i}),1,Pfunc({i=i+1;if (i==18)
    {i=17}; i})],inf),\dur,Pbjorklund2(5,8)/4,\amp,0.15,\fb,0.1,\rel,
    0.3);
    ~feedback = {SinOsc.kr(0.1,-1,1).range(0,1.713)};
    ~sinfb.set(\fb,~feedback);
    ~sinfb.play;
    ~h.play;
    ~k.stop;
    ~k2.stop;
    ~piano.stop(1);
    ~piano2.stop(1);

)

(
    ~sinfb = Pbind(\instrument,\daf_bass,\scale,Scale.major,\root,2,\octave,[3,4],
    \degree,Pseq([1,1,1,1],inf),\dur,Pbjorklund2(5,8)/4,\amp,0.15,\fb,0.1,\rel,
    0.3,\pan, -0.7);
    ~feedback = {SinOsc.kr(0.1,-1,1).range(0,1.713)};
    ~sinfb.set(\fb,~feedback);
    ~sinfb.play(fadeTime:0);
    ~h.play;
    ~chords.play(fadeTime:0);
)


(
    ~piano = Pbind(\instrument,\pianovel,\scale,Scale.major,\root,2,\octave,[5,6],
    \degree,Pseq([Pseq([1,2,3,4,5,6,7,8,9].reverse,3),Pseq([2,3,4,5,6,7,8,9].reverse,1),
    Pseq([1,2,3,4,5,6,7,8,9],4),Pseq([1,1,1,1,1,1,1,1,1],4)], inf),\dur,Pbjorklund2(5,8)/4,\amp,1.5,\rel,
    0.3,\pan, 0.7);
    ~piano.play;
)

(
(
~chords = Pbind(\instrument,\bpfsaw,
\dur,Pwhite(4.5,7.0,inf),
\degree,Pseq([
\D,
\F,
\A,
].chordProg,inf),
\detune, Pexprand(0.0001,0.1,inf),
\cfmin,100,
\cfmax,1500,
\rqmin,Pexprand(0.02,0.15,inf),
\atk,Pwhite(2.0,4.5,inf),
\rel,Pwhite(6.5,10.0,inf),
\ldb,6,
\amp,Pwhite(0.8,2.0),
\out,0)
);
~chords.play;
)