# SuperCollider

SuperCollider è un ambiente di sviluppo e un linguaggio di programmazione creato nel 1996 da James McCartney per la sintesi audio in tempo reale e la composizione algoritmica.
Da allora, si è evoluto in un sistema utilizzato e, successivamente, sviluppato sia da scienziati che da artisti che lavorano col suono. Si tratta di un linguaggio di programmazione dinamica efficiente ed espressivo che offre un framework per la ricerca acustica, musica algoritmica e programmazione interattiva.
Distribuito sotto licenza GNU nel 2002, SuperCollider è un software libero. La versione più recente (3.10.0) è stata distribuita il 25 novembre 2018.

## Architettura

A partire dalla versione 3, l'ambiente di sviluppo di SuperCollider è stata divisa in due componenti: un server (scsynth) e un client (sclang). Questi componenti comunicano tramite OSC (Open Sound Control).
Il linguaggio SC combina la struttura orientata agli oggetti di Smalltalk con le caratteristiche della programmazione funzionale con una sintassi simile a quella di C.
L'applicazione Server SC supporta una semplice API per plugin in C, facilitando la scrittura di algoritmi sonori efficienti, che possono essere combinati in grafici o calcoli. Poiché il controllo esterno nel server viene effettuato tramite OSC, è possibile usarlo con altri linguaggi o applicazioni.

### Il SuperCollider synthesis server (scsynth)

La generazione del suono di SuperCollider è impacchettata all'interno di un file eseguibile da linea di comando che si chiama scsynth. Nella maggior parte dei casi è controllato dall'interno del linguaggio di programmazione SuperCollider, ma può essere usato indipendentemente. Il server audio ha le seguenti caratteristiche:
* accesso all'Open Sound Control;
* semplice API per plugin in C;
* supporta un qualunque numero di canali di input e output, inclusi massicci settaggi multicanale;
* offre l'accesso a una struttura ad albero ordinata di nodi di sintesi che definiscono l'ordine di esecuzione;
* sistema a bus che permette di ristrutturare dinamicamente il flusso del segnale;
* buffer di scrittura e lettura;
* calcolo a tassi diversi in base alle necessità: tasso audio, frequenza di controllo, tasso di richiesta.
Supernova, un'implementazione indipendente dell'architettura del server, aggiunge un supporto multi-processore con un raggruppamento parallelo esplicito dei nodi di sintesi.

### Il SuperCollider programming language (sclang)

SuperCollider è un linguaggio con una tipizzazione dinamica, dotato di garbage collection, orientato agli oggetti a ereditarietà multipla ed è un linguaggio funzionale simile a Smalltalk, con una sintassi simile a quella di Ruby o di C. La sua architettura offre un compromesso tra la necessità di computazione in tempo reale e la flessibilità e la semplicità di un linguaggio astratto. Come molti linguaggi funzionali, implementa funzioni come oggetti di prima classe, con la possibilità di combinarle tra loro. Funzioni e metodi possono avere valori di default per gli argomenti e liste di argomenti a lunghezza variabile e possono essere richiamate con qualunque ordine di argomenti chiave. Le chiusure sono lessicali e la visibilità è sia lessicale che dinamica. La maggior parte delle caratteristiche tipiche dei linguaggi funzionali è supportata, inclusa la creazione di chiusure tramite applicazione parziale esplicita, ottimizzazione delle chiamate di coda, Comprensione di lista e coroutine. Le specifiche includono l'espansione implicita di tuple e il sistema stateless pattern. Il suo tempo di ricerca dei messaggi costante e il garbage collection in tempo reale permettono a grandi sistemi di essere efficienti e di gestire flessibilmente il processo di segnali.
Supportando metodologie di riflessione, programmazione interattiva e programmazione letterale, SuperCollider rende relativamente semplice losviluppo di nuovi algoritmi sonori e sviluppare software e framework personalizzati. Per quanto riguarda la conoscenza specifica del dominio, è sia generico (per esempio, permette di rappresentare proprietà come tempo e pitch a livelli di astrazione variabili) che pieno di esempi di implementazioni per scopi specifici.

### GUI

SuperCollider permette agli utenti di costruire per le applicazioni delle GUI multi-piattaforma. La libreria standard con le componenti per le interfacce utente può essere estesa con un grande numero di framework disponibili. Per quanto riguarda la programmazione interattiva, il sistema supporta l'accesso programmatico a file .rtc (rich text code). Può essere usato per generare algoritmicamente grafica vettoriale.

## Interfaccia e supporto di sistema
### Client

Poiché il server viene gestito tramite OSC, è possibile usare diverse applicazioni per controllarlo. Solitamente si usano ambienti di sviluppo per il linguaggio SuperCollider (vedi sotto), ma è possibile usare anche altri sistemi OSC-aware come Pure Data.
Esistono client di "terze parti" per il server SuperCollider, come rsc3, un client Scheme, hsc3, basato su Haskell, ScalaCollider, basato su Scala e Overtone, basato su Clojure. Questi sono diversi dagli ambienti di sviluppo menzionati di seguito perché non forniscono un'interfaccia al linguaggio di SuperCollider, ma comunicano direttamente con il server audio per facilitare l'utente.

### Sistemi operativi supportati

SuperCollider può essere eseguito sotto macOS, Linux, Windows e FreeBSD. Tuttavia, la versione per Windows è rimasta indietro rispetto alle altre, poiché la maggior parte dello sviluppo si è svolta su Mac e Linux. Per ognuno di questi sistemi operativi, esistono diversi ambienti di language-editing e client che possono essere usati con SuperCollider.
Si è dimostrato che SuperCollider può essere eseguito sotto iOS e Android.

### Editor

La versione di SuperCollider per Mac è solitamente usata con l'interfaccia (Cocoa), specifica per Mac; su Windows e Linux, è possibile usare vari editor e diversi ambienti di sviluppo integrato comuni, come:
* Emacs (Linux, Mac, Windows)
* Vim (Linux, Mac)
* gedit (Linux, Windows)
* Kate (Linux)
Per ognuno dei precedenti ambienti, un plugin abilita l'esecuzione in tempo reale del codice SuperCollider e l'interazione col server audio.
Precedenti tentativi di portare SuperCollider su Windows hanno dato vita ad ambienti di sviluppo basati su Python, chiamati PsyCollider, e un a plugin per Eclipse, ma non sono stati aggiornati recentemente. Ad ogni modo, è tuttora in atto un nuovo tentativo di sviluppare un IDE multi-piattaforma basato sul framework Qt.

## Live coding

Come linguaggio di programmazione dinamica versatile, SuperCollider può essere usato per live coding, ad esempio per performance che coinvolgono l'esecutore modificando ed eseguendo codice on-the-fly. Tipi specifici di proxy pattern possono essere utilizzati come placeholder ("segnaposto") di alto livello per gli oggetti di sintesi, che possono essere interscambiati o modificati a runtime. Gli ambienti permettono la condivisione e la modifica di oggetti e la dichiarazione di processi all'interno del network. Varie librerie supportano diversi tipi di astrazione e accesso agli oggetti sonori, ad esempio dewdrop_lib permette la creazione live e la modifica di pseudo-classi e oggetti.