Pit Stop 4

Server

//====================================================================

// Servers: motori di sintesi di SuperCollider

//====================================================================

s = Server.internal; // Server di default interno al Client
s = Server.local;    // Server di default in un app separata dal Client
y = Server.new(\local2, NetAddr("127.0.0.1", 57111)); // Nuovo Server

//====================================================================

// Messaggi generali

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

//====================================================================

// Options

ServerOptions.devices;          // riporta i devices collegati
ServerOptions.inDevices;        // riporta i devices collegati in input
ServerOptions.outDevices;       // riporta i devices collegati in output

o = s.options;                  // crea un'istanza di opzioni del Server
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;

o.inDevice  = "Built-in Microph";  // seleziona il device per gli Inputs
o.outDevice = "Soundflower (2ch)"; // seleziona il device per gli Outputs
s.reboot;
o.device = nil;                    // 'nil' specifica i driver del computer
s.reboot;

o.numOutputBusChannels.postln; // riporta il numero di canali in output
o.numOutputBusChannels = 8;    // cambia il numero di canali in output

o.numInputBusChannels.postln;  // riporta il numero di canali in input
o.numInputBusChannels = 8;     // cambia il numero di canali in input

o.sampleRate;                  // riporta la sample rate
o.sampleRate = 44100;          // cambia la sample rate

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

//====================================================================

// Monitors

s.status;       // Riporta il nome del Server in uso
s.avgCPU;       // Riporta l'utilizzo medio della CPU
s.peakCPU;      // Riporta l'utilizzo di picco della CPU
s.numUGens;     // Riporta il numero di UGens
s.numSynths;    // Riporta il numero di Synths
s.numGroups;    // Riporta il numero di Gruppi
s.numSynthDefs; // Riporta il numero di SynthDefs
s.volume;       // Riporta il volume massimo in uscita (dB)

//====================================================================

// GUI

s.meter(2,2);       // Visualizza segnali in input e ouput
s.scope(2);         // Oscilloscopio del master out (il numero di canali si accorda
                    // con quello specificato nelle ServerOption oppure possiamo spe-
                    // cificarlo come argomento)
s.freqscope;        // Spettroscopio del master out (monofonico, possiamo scegliere
                    // quale canale (Bus) visualizzare specificandone l'ID nel box
                    // a destra. Possiamo inoltre specificare se la visualizzazione
                    // deve essere lineare o logaritmica (di default) e anche il li-
                    // mite inferiore in dB -(96 di default)
s.makeWindow;       // Visualizza il Server

{Pan2.ar(Mix(SinOsc.ar(Array.rand(20,200,5000),0,0.1)),0.3)}.play // Test

Segnali e UGens

//====================================================================

// UGens: Classi che generano o elaborano un segnale numerico

//====================================================================

// Sintassi

Nome.ar(arg1,arg2,...) 

// Nome: Specifica il tipo di segnale o di elaborazione:

(
{[SinOsc.ar,     // Oscillatore sinusoidale
  WhiteNoise.ar, // Generatore di rumore bianco
  Saw.ar,        // Generatore di onde a dente di sega
  Pulse.ar,      // Generatore di onde quadre
  Blip.ar,       // Treno d'impulsi (PulseTrain)

  LFPar.kr,      // Parabolica (Quasi-Sine)
  LFNoise0.kr,   // Generatore di valori pseudo-casuali
  LFSaw.kr,
  LFPulse.kr,
  Impulse.kr]
}.plot(0.05)
)

// Metodo: specifica quanti valori sono generati al secondo
(
{[SinOsc.ar,            // Audio rate = Sample rate
  SinOsc.kr,            // Control rate (sample_rate/block_size)
  ControlDur.ir]}.plot; // Inizialization rate (solo alla valutazione del codice)
)

// Argomenti: specificano i parametri controllabili:

SinOsc.ar(freq:440, phase:0, mul:1, add:0);

// Per sapere quali argomenti accetta una UGen richiamarne l'Help file

//====================================================================

// Monitors

{SinOsc.ar}.play;                // Uditivo
                                 
{Pulse.ar}.plot;                 // Grafico fisso (,plot)
{Pulse.ar+Saw.ar}.plot(duration: 0.01 );              // Durata della finestra in secondi
{Pulse.ar*Saw.ar}.plot(bounds: Rect(0,0,500,100));    // Dimensioni grafiche finestra
{Pulse.ar*PinkNoise.ar}.plot(bounds: 500@100);        // Abbreviazione
{Pulse.ar+WhiteNoise.kr}.plot(minval: -2, maxval: 2); // Minimo e massimo
{Pulse.ar*SinOsc.ar}.plot(bounds: 500@100);           // Abbreviazione

(                                // Grafico dinamico (.scope)
{var ksig,sig;
     ksig = 2000+(1000*LFNoise0.kr(5).scope(\pitch)); // Control rate
     sig  = SinOsc.ar(ksig).scope(\sine)              // Audio rate
}.play
)

(                                // Numerico (.poll)
{SinOsc.ar(
	MouseX.kr(40,10000,1).poll(10) // 10 campioni dell'output al secondo 
	       ) 
}.play
)

//====================================================================

// Indici e Nodi
// Ogni istanza di Synth generata = 1 Nodo

s.plotTree;                                  // Visualizza una GUI
{SinOsc.ar(rrand(400,1900))*SinOsc.ar}.play; // Eseguire più volte
s.freeAll;                                   // Elimina tutti i nodi

SynthDef e Synth

//====================================================================

// SynthDef: Istruzioni necessarie alla costruzione di un algoritmo di 
// sintesi o di elaborazione di un segnale

//====================================================================

// Sintassi

(
SynthDef("strum_1",                                         // Nome per accesso (come le variabil globali)
               {arg fmin=200, fmax=400, amin=0.0, amax=1.0; // Eventuali Argomenti (con o senza valori di default) 
                var freq,amp,sig;                           // Eventuali Variabili locali
                    freq = MouseY.kr(fmax,fmin);                    
                    amp  = MouseX.kr(amin,amax);
                    sig  = SinOsc.ar(freq, mul:amp);                 
                Out.ar(0,sig);                              // Bus Out (0 = Sinistra)
                                                            // Se il segnale è multicanale i bus out saranno
                                                            // quelli attigui partendo dal valore specificato
                                                            // ad esempio se stereo:
                                                            // 0 = sinistra,
                                                            // 1 (sottinteso) = destra
                }).add;                                     // '.add' memorizza le istruzioni sul Server
)                                                           // fino a quando non usciamo da SuperCollider                                               
     
SynthDescLib.global.read.browse; // Visualizza in un Browser grafico tutte le SynthDef
                                 // presenti in un Server in un determinato momento

//====================================================================

// Synth: Crea istanze di Synth derivate da una SynthDef

//====================================================================

s.plotTree;         // Apre l'albero dei Nodi

// Creare un'istanza di Synth:

Synth("strum_1");   // Crea un Synth dalla SynthDef strum_1 con i parametri di default
                    // (se li abbiamo specificati come argomenti nella SynthDef)

// Creare un'istanza di Synth modificando i parametri di default:

Synth("strum_1", [\fmin,1000,\fmax,2500,\amin,0.1,\amax, 0.3]); // Crea un nuovo Synth con i parametri specificati
Synth("strum_1", [\fmin,400, \fmax,500, \amin,0.7,\amax,0.9]);  // Crea un nuovo Synth con i parametri specificati

s.freeAll;          // Distrugge tutti i Nodi (Synth) presenti sul Server

// Modificare i parametri di un'istanza di Synth dinamicamente:

a = Synth("strum_1",[\fmin,200, \fmax,300, \amin,0.2,\amax,0.6]); // Crea il Synth e lo assegna a 'b'

a.set(\fmin, 1200)
a.set(\fmin, 250, \amax, 0.3);

a.run(false); // ferma la computazione audio senza distruggere il Synth
a.run(true);  // fa ripartire la computazione audio

a.free;       // distrugge il Synth e libera la variabile 'a'