Introduzione

Un linguaggio di programmazione, in informatica, è un linguaggio formale, dotato al pari di un qualsiasi linguaggio naturale di un lessico, di una sintassi e di una semantica ben definiti.   Wiki

Linguaggi e codici

Se state leggendo queste parole significa che avete deciso di realizzare musica utilizzando un computer. Questo proposito vi pone nella situazione di dover conoscere in modo approfondito due linguaggi molto differenti tra loro:

Quando questi due linguaggi s’incontrano, non seguono strade indipendenti ma sono interlacciati tra loro attraverso diverse tipologie di relazioni. E’ necessario dunque cercare dei punti in comune per creare un metalinguaggio che permetta la comunicazione tra l’aspetto musicale e quello informatico. Un buon punto di partenza potrebbe essere prendere in considerazione due tra le diverse definizioni date dal vocabolario della lingua italiana della parola codice.

  1. Sequenza di segni (numeri, cifre o altro) atta ad identificare qualcuno o qualcosa.
    • codice di avviamento postale. Un luogo è identificato da una sequenza numerica.
    • codice a barre. Identifica un prodotto commerciale e il suo prezzo, è rilevato da lettori elettronici.
    • codice fiscale. Insieme di numeri e lettere che costituiscono l’identità del contribuente per l’anagrafe tributaria.

    image not found
    L'immagine qui sopra illustra come nel linguaggio musicale occidentale moderno, per identificare le altezze dei suoni possiamo utilizzare diversi simboli appartenenti a diversi codici. Più simboli corrispondono a una sola altezza. E’ possibile tradurre l’informazione da un codice all’altro. Il teorico musicale dirà ”gli intervalli di una scala di Do maggiore” e penserà ad un sistema intervallare relativo. Il musicista Jazz dirà ”C3” e penserà ai sistemi di tablature degli accordi. Il fisico acustico dirà ”l’insieme delle frequenze armoniche” e penserà a un sistema di corpi elastici vibranti. L’informatico dirà ”un array” e penserà ad allocazioni di memorie variabili, mentre il producer penserà ai trattini di un piano roll da inviare a banchi di suoni. L’altezza sarà sempre se stessa e una sola. Il suono ancora di più.

  2. Sistema di segni e di regole per la loro combinazione, convenzionalmente assunto.
    • codice cifrato. Sistema comunicativo concordato tra membri di un’organizzazione per non farsi capire dagli altri.
    • codice di trasmissione. Con un codice segreto o con un codice convenzionale internazionale.

    Nel linguaggio musicale (ammesso che la musica possa essere considerata un linguaggio), una linea melodica può essere definita come il presentarsi in una successione temporale delle note appartenenti a un modo, a una scala, a una serie, a una riserva armonica, a una distribuzione probabilistica o pseudo-casuale degli intervalli. Può seguire regole modali o contrappuntistiche, tonali o dodecafoniche, aleatorie o probabilistiche e, come illustrato nella figura sottostante può essere tradotta per essere meglio compresa dal linguaggio informatico sotto forma di sequenza numeriche (”numeric streams” o ”array” o ”liste” o ”sequenceable collections”).

    image not found

    Così come è possibile tradurre le altezze in sequenze numeriche è possibile anche trasformare le regole di un linguaggio musicale in algoritmi e in operazioni matematiche, che sono invece processi appartenenti al linguaggio informatico. Prendiamo come esempio una trasposizione delle altezze (tecnica comune a diversi linguaggi musicali come contrappunto, dodecafonia, armonia, etc.). Si può tradurre con la funzione:

    trasposizione = y + n


    Dove la lettera y è un valore variabile mentre la lettera n è un valore costante. Ogni qualvolta modifichiamo il valore della variabile y (che musicalmente corrisponde di volta in volta a una nuova nota della sequenza) sommiamo al suo valore il valore di n (fattore di trasposizione) come illustrato nella figura sottostante, ottenendo come risultato la sequenza trasposta (in questo caso una quarta sopra).

    image not found

A questo punto bisogna ricordare che nel secolo scorso il concetto di algoritmo venne formalizzato per risolvere il problema matematico della ”decisione” (Entscheidungsproblem) posto da David Hilbert nel 1928. E’ raccomandabile dunque affrontare la programmazione di algoritmi dedicati alla creazione musicale tenendo presente che, nella maggior parte dei casi, non devono avere una funzione strettamente deterministica. Se volete scrivere esattamente nota per nota una melodia con armonie prestabilite che la sostengono, non è necessario programmare un algoritmo, potrebbe essere anzi controproducente farlo. Se invece volete che il software esegua un’improvvisazione più o meno libera scegliendo tra diversi campi armonici costanti o variabili, oppure se volete costruire un brano iperstrutturalista dove la micro forma si espande nella macro forma e la struttura è troppo complessa per essere pensata e scritta a mano, un algoritmo potrebbe essere la soluzione migliore.

Premesso che la maggior parte dei software musicali a nostra disposizione oggigiorno può fare (quasi) tutto (Csound, Super Collider, Pure Data, Max, Ableton Live, Logic, etc.), bisogna tener presente che ognuno di loro possiede caratteristiche proprie, esattamente come gli strumenti acustici. Queste caratteristiche fanno si che un software sia più orientato a compiere determinate operazioni piuttosto che altre (alcuni sono ottimizzati per l’elaborazione del suono in tempo reale, altri per la sintesi, altri per la realizzazione di brani acusmatici, altri per la composizione algoritmica, altri ancora per l’interazione audiovideo, etc.). E’ quindi importante conoscere e saper scegliere il software più appropriato per ogni singolo progetto musicale. Nel corso di questo scritto saranno approfondite anche tecniche che prevedono l’utilizzo di più software nella realizzazione di un singolo progetto.

In ultima istanza è fondamentale comprendere che il software e il linguaggio di programmazione utilizzato sono solo uno strumento attraverso il quale realizzare al meglio un’idea musicale La progettazione e la programmazione di un algoritmo non devono essere o diventare l’idea musicale stessa (tranne che in rarissimi casi).


SuperCollider

Download, installazione e risorse in rete

Super Collider (SC) è un software multi-piattaforma Open Source rilasciato sotto una licenza GNU versione 3 ed basato sul paradigma della programmazione orientata ad oggetti (OOP - Object Oriented Programming). Imparare un software che usa un linguaggio OOP facilita l’apprendimento di altri programmi che seguono lo stesso paradigma, magari non necessariamente dedicati alla musica ma che possono creare prodotti multimediali interagendo con SuperCollider in diversi modi (Processing, Lilypond, Arduino, etc.).

Altri software musicali simili utilizzati in ambito professionale, come Max, Pure Data, Open Music, PWGL, si basano su di una programmazione grafica a oggetti (VPL - Visual Programming Language) che rappresenta un diverso paradigma di programmazione, molto più legato alla specificità dell’informatica musicale. Sono oltretutto ottimizzati per scopi molto specifici (Open music e PWGL per la composizione assistita e la sintesi del suono, Max e Pure Data per l’interazione in tempo reale), mentre SuperCollider è più ”aperto” nel plasmarsi alle diverse esigenze musicali ed espressive.

E’ possibile scaricarlo direttamente dalla rete: Download SuperCollider scegliendo la versione più adatta al proprio sistema operativo (MAC, WIN o LINUX) e seguendo le istruzioni d’installazione. Allo stesso link possiamo trovare tutte le notizie relative al software (Documentazione, Mailing list, link, etc.).

Di seguito sono indicati alcuni link dove è possibile sia trovare manuali e tutorials scaricabili gratuitamente, sia curiosare tra le potenzialità di SuperCollider.


Interfaccia utente

Una volta scaricato il software, possiamo lanciare l’applicazione con un doppio click sull’icona. Compare l’interfaccia utente che, dalla versione 3.4 in poi è cambiata radicalmente. La figura sottostante mostra la schermata iniziale delle versioni più recenti (IDE) che è uguale su tutti i sistemi operativi ed è divisa in quattro parti:

image not found

Architettura

SuperCollider è un linguaggio OOP (Object-Oriented Programmation) basato su Smalltalk e, anche se vediamo una sola interfaccia utente suddivisa in diverse parti non è un applicazione unica ma due applicazioni separate. Entrambe sono aperte contemporaneamente e comunicano tra loro attraverso il protocollo OSC.


Comandi principali

Esploriamo ora i comandi principali nell’ordine in cui solitamente si effettuano le operazioni più o meno quotidiane. Per prima cosa dobbiamo creare un nuovo file oppure aprirne uno esistente.

New file

Per creare un nuovo file: MAC: cmd+n, WIN: ctrl+n

Open file

Per aprire un file esistente: MAC: cmd+o, WIN: ctrl+o

Dopo aver creato o aperto un file, se vogliamo far compiere un’azione a SuperCollider (come eseguire un’operazione matematica, scrivere una partitura, definire un algoritmo di sintesi, cambiare i parametri di un Synth, farlo suonare, stopparlo, etc.) dobbiamo:

  1. scrivere nell’interprete una o più righe di codice contenenti una sequenza di istruzioni
  2. selezionare una o più righe di codice con il mouse
  3. eseguire (valutare) il codice selezionato schiacciando i tasti shift+invio

Entriamo nel dettaglio di queste operazioni.

Eseguire il codice (Evaluate)

L’Interprete è suddiviso in righe numerate da 1 a n e ogni riga termina con un ; (punto e virgola). Se scriviamo su più righe ma non mettiamo punto e virgola prima di andare a capo, SuperCollider le interpreta come una sola. Se invece scriviamo del codice sulla stessa riga dopo un punto e virgola SuperCollider lo interpreta come se fosse scritto una riga sotto.

1+2;      // questa e' una riga
(         // ma anche da qua...
1+
2/
3;        // a qua per SC e' una sola riga...
1+2; 3*7; // Queste sono due righe...
)							

Possiamo eseguire il codice in tre possibili modi:

In queste ultime due modalità le operazioni sono eseguite consecutivamente da sinistra a destra, riga dopo riga, dall’alto verso il basso in quasi tutti i casi (vedremo le eccezioni di volta in volta nel dettaglio).

Eseguendo i due esempi precedenti probabilmente non avete sentito alcun suono. Questo perché se vogliamo generare o elaborare segnali audio, prima dobbiamo accendere il Server (boot) e poi eseguire il codice.

Boot del Server

Abbiamo a disposizione tre possibili modi di accendere e spegnere il server:

Tutti gli esempi di codice che seguono questo punto si intendono da eseguire con il Server acceso.

Stop dei processi in corso, audio compreso

Per fermare la computazione dei processi in corso (anche quella audio) senza spegnere il Server, possiamo usare la seguente abbreviazione da tastiera: MAC: cmd+., WIN: alt+.

Eseguendo il ”Boot” del Server, accendiamo o spegnamo la computazione dell’audio in SuperCollider. Se però non inviamo alcun segnale all’uscita, non udiremo alcun suono. E’ possibile paragonare quest’azione all’accendere o spegnere la corrente di un sistema elettroacustico minimo (mixer, amplificatore e altoparlanti). Quando invece eseguiamo il codice e fermiamo l’esecuzione come abbiamo visto, è come se schiacciassimo i pulsanti ”Play” e ”Stop” di un CD player o di un altro generatore di suono collegato al sistema elettroacustico di cui sopra.

Se finora tutto è tutto andato bene, sentiremo il risultato sonoro delle istruzioni date a SuperCollider, se invece abbiamo commesso qualche errore nello scrivere il codice compariranno nella post window uno o più messaggi di errore.

Messaggi di errore

Eseguiamo il seguente codice che contiene volutamente un errore (manca la virgola prima di 0.1)

play({SinOsc.ar(LFNoise0.kr(12, mul: 600, add: 1000) 0.1)})					

Leggiamo nella post window cosa ci dice SuperCollider: le freccette o il pallino indicano dove si è interrotta la compilazione, quindi l’errore sarà necessariamente prima e tocca a noi scovarlo. In seguito incontreremo ulteriori informazioni riguardo i messaggi di errore [METTI LINK]

Cancellare il contenuto della post window

Se vogliamo cancellare (pulire) il contenuto della post window possiamo utilizzare la seguente abbreviazione da tastiera: MAC, cmd+shift+p, WIN: ctrl+shift+p

Commenti

Come potrete presto realizzare, è molto utile inserire dei commenti nel codice sia per agevolare la memoria nel caso volessimo modificare un patch a distanza di tempo, sia nel caso volessimo passarlo a qualcuno che sarebbe così agevolato nell’analisi del codice e nella lettura dei processi mentali da noi usati per programmarlo. I commenti sono colorati di rosso e ci sono due possibili sintassi:

Possiamo anche utilizzare un’abbreviazione da tastiera: scriviamo il testo e lo selezioniamo digitando cmd + shift + /.

Help files

Gli Help files sono i nostri migliori amici quando incontriamo qualche oggetto (parola) di SuperCollider sul quale vogliamo ottenere informazioni.

Per richiamare un help file dobbiamo selezionare la parola (Doppio click o Click and drag)

SinOsc;		

dopodichè schiacciare: MAC: cmd + d, WIN: ctrl + d.

Per sapere se un oggetto (parola) ha un help file o meno, possiamo eseguire la riga seguente, sostituendo ”Array” con il nome dell’oggetto del quale vogliamo richiamare l’Help.

Array.hasHelpFile;	

Le istruzioni precedenti sono quelle più comunemente usate, ma vediamo ora come possiamo ottenere altre informazioni utili. Al momento alcuni termini potranno risultare oscuri, in seguito però potremo tornare a questo paragrafo e utilizzarlo come reference.

- Per richiamare le definizioni di una Classe oppure vedere quali Classi rispondono a un metodo: MAC e WIN: Cmd+i

SinOsc;    // cmd + i
rand(100); // cmd + i	

- Per richiamare la gerarchia di una Classe.

Clock.dumpClassSubtree;

- Per richiamare i metodi d’Istanza e di Classe che possono essere invocati da messaggi (Come possiamo notare per i metodi di Classe bisogna aggiungere 'Meta_' al nome della Classe).

Array.dumpInterface;      // metodi d'istanza
Meta_Array.dumpInterface; // metodi di classe

- Per richiamare un Browser grafico contenente una serie di informazioni.

Array.browse;

Save

Infine quando siamo soddisfatti del nostro lavoro oppure quando la giornata lavorativa è terminata per orologio o sfinimento e dobbiamo salvare il file: MAC: cmd+s, WIN: alt+s.

Si aprirà un menù a comparsa nel quale possiamo specificare quattro formati differenti:

In questi formati viene salvato il codice scritto nell’interprete, non l’audio eventualmente prodotto da esso.