Server

SuperCollider è formato da due applicazioni distinte che operano in parallelo: Client (o Interpreter o SClang) e Server (o SC synth). Il Client utilizza processi di scheduling (o controllo) dove, se non compiamo alcuna azione (come la valutazione del codice) o generiamo un qualche tipo di automazione (come nelle Routine e nei Task) il software non produce alcun valore nel tempo, mentre il Server è il motore di sintesi del suono di SuperCollider, dove possiamo leggere, produrre e modificare segnali audio digitali lavorando a una determinata rata di campionamento. In questa Parte approfondiremo le sue caratteristiche ed esploreremo le sue potenzialità. Azzardiamo infine un paragone musicale per chiarire ulteriormente la differenza tra Client e Server pensando a uno strumento ad arco come il violino. Il corpo dello strumento (che produce suono) può essere paragonato al Server mentre il Client può assumere al tempo stesso tre differenti funzioni in una: la partitura, l'archetto e il braccio dello strumentista che interpretando la prima muove il secondo. Da questo punto in poi per evitare errori di programmazione diventa fondamentale tenere sempre a mente questa separazione che è presente in tutti i software audio ma che in SuperCollider è informaticamente strutturale.

Scarica patch di Max

Boot info

Quando accendiamo (boot) il Server, SuperCollider riporta nella nella Post window alcune informazioni che ci possono tornare utili:

Settaggi

In SuperCollider ci possono essere diversi Servers su uno stesso computer che possono essere controllati da un solo interprete, così come un interprete che abita un computer può controllare in rete uno o più Servers che sono su altri computers. Quando lanciamo l'applicazione SuperCollider crea automaticamente due Servers: localhost e internal. Successivamente possiamo selezionare uno o l'altro dal codice invocando i metodi omonimi sulla Classe Server:

s = Server.internal;
s = Server.local;

La Classe Server è la rappresentazione nel Client dell'applicazione Server in quanto quest'ultima essendo indipendente, non necessita della prima e può essere programmata direttamente dal terminale del computer attraverso linee di comando UNIX. Il Client infatti assume la semplice funzione di tradurre il codice da noi programmato in comandi UNIX inviati all'applicazione Server attraverso il protocollo OSC.

Server.default

Quando lanciamo l'applicazione si aprono automaticamente i due Server appena illustrati ma se effettuiamo il boot senza specificare nulla, ad esempio con cmd + . questa azione sarà effettuata su quello dei due che è di default, usualmente il localhost. Possiamo cambiare il Server di default invocando il metodo .default

Server.default = Server.internal;
Server.default = Server.local;

// oppure...

s = Server.local;
Server.default_(s);

Server.new

Oltre ai due Server che abbiamo appena illustrato possiamo crearne quanti ne vogliamo invocando il metodo .new():

y = Server.new(\local2, NetAddr("127.0.0.1", 57111));

Questo metodo accetta quattro argomenti, ma i più importanti sono i primi due:

Messaggi al Server

A qualsiasi server possiamo inviare una serie di messaggi. Di seguito i principali.

s = Server.local;
s.boot;              // Boot del Server
y.boot;              // Boot di un secondo Server...
s.reboot;            // Chiude e riapre il Server
s.waitForBoot({...}) // Accende il Server e terminato il booting esegue il codice successivo tra le parentesi
s.freeAll;           // Libera tutti i nodi nel Server
s.quit;              // Chiude il Server
s.volume = 0;        // Setta il voume in uscita (in dB)
s.mute;              // Mute del Server
s.unmute;            // Unmute

Schede audio

Di default SuperCollider legge i valori in ingresso e scrive quelli in uscita sul driver utilizzato in quel momento dal sistema operativo del computer e se colleghiamo una scheda audio esterna il miglior modo di far comunicare SuperCollider con la scheda consiste nel selezionarla nelle preferenze audio di sistema. Per chi ha un computer Mac:

Possiamo selezionare la scheda audio in uso anche dal codice invocando il metodo .options sul Server desiderato ma lo sconsiglio in quanto a volte può dare dei problemi:

s = Server.local;
o = s.options;

Dopodichè possiamo specificare tutti i parametri che abbiamo visto descritti nella post window al momento del boot:

o.device;                       // riporta il device in uso
o.device = "Soundflower (2ch)"; // seleziona il device specificando il nome
o.device_("Soundflower (2ch)"); // altra scrittura...
s.reboot;                 
o.device = nil;                 // 'nil' specifica i driver del computer
s.reboot;

Se vogliamo utilizzare devices differenti per i segnali inEntrata e quelli in Uscita:

o.inDevice  = "Built-in Microph";
o.outDevice = "Soundflower (2ch)";
s.reboot;
o.device = nil;
s.reboot;

I Server di SuperCollider supportano di default 8 canali (Bus) in Uscita i cui indici vanno da 0 a 7. Se vogliamo verificare o modificare questo parametro possiamo farlo invocando il metodo .numOutputBusChannels. Lo stesso dicasi per i canali (Bus) in Entrata i cui indici vanno da 8 a 15 (cambia solo il metodo):

o.numOutputBusChannels.postln; // riporta l'informazione
o.numOutputBusChannels = 8;    // cambia i settings

o.numInputBusChannels.postln; // riporta
o.numInputBusChannels = 8;    // cambia

Per verificare possiamo visualizzare i meter:

(
o.numOutputBusChannels = 2; // 2 canali
o.numInputBusChannels  = 2; // 2 canali
s.meter;
)

(
o.numOutputBusChannels = 8; // 8 canali
o.numInputBusChannels  = 8; // 8 canali
s.meter;
)

Possiamo specificare la Sample Rate facendo attenzione che quella scelta sia supportata dal device specificato:

o.sampleRate;         // riporta
o.sampleRate = 44100; // cambia

Lo stesso dicasi per il Block size che di default è di 64 samples:

o.blockSize = 64; // cambia
o.blockSize;      // riporta il block size corrente

Torniamo infine a quella scritta che abbiamo letto in precedenza nella Post window: a ServerOptions. Ogni Server possiede al suo interno un'istanza di questo oggetto che rappresenta un pacchetto di opzioni. Con questo oggetto possiamo dunque creare un pacchetto di opzioni personalizzato da applicare a più Servers differenti. Per farlo dobbiamo:

h = ServerOptions.new;      // creare una nuova istanza e assegnarla a una variabile

h.sampleRate_(44100);       // specificare le opzioni desiderate
h.numOutputBusChannels_(2);

y = Server.new(\Local2, NetAddr("127.0.0.1", 57111), h).meter; // assegnarle ad un Server come terzo argomento

Questo metodo è utile anche quando vogliamo ottenere nuovamente una lista dei devices a disposizione:

ServerOptions.devices;
ServerOptions.inDevices;
ServerOptions.outDevices;

Monitors

A chiosa di questo Capitolo dedicato al Server vediamo quali sono le principali possibilità che abbiamo a disposizione per monitorare le attività di un Server. Ci sono tre possibilità:

Scarica patch di Max