Panning

Nel corso di questo paragrafo ci occuperemo delle principali tecniche di panning ovvero di come posizionare un segnale monofonico in uno spazio bi o tri-dimensionale delimitato in vari modi da due o più altoparlanti.

Facciamo attenzione a non confondere le tecniche di pannning con quelle di spazializzazione in quanto le prime implicano solo lo spostamento del segnale in uno spazio neutro e fondamentalmente si ottengono con fadein e fadeout del segnale sincronizzati tra i diversi altoparlanti mentre le seconde vogliono simulare il movimento di una sorgente sonora virtuale in relazione ad un punto di ascolto preciso e implicano anche parametri come gain (più la sorgente si allontana e più il volume diminuisce), riverberazione dinamica (più la sorgente si allontana maggiore sarà l'ampiezza del riverbero rispetto a quella del suono diretto), assorbimento dell'aria, effetto doppler, etc.

Espansione multicanale

Cominciamo ad esplorare uno spazio sonoro soffermandoci su di una particolarità di SuperCollider ovvero l'espansione multicanale. Abbiamo visto che nella maggior parte dei casi possiamo specificare gli argomenti delle UGens sia come singoli valori che come singoli segnali audio o di controllo.

s.options.numOutputBusChannels_(8);
s.reboot;
s.plotTree;
s.scope;      
s.meter;

{SinOsc.ar(980,0,0.3)}.play                   // singolo valore
{SinOsc.ar(980,0,SinOsc.kr(1).unipolar)}.play // segnale		

Se però includiamo più UGens in un Array oppure sostituiamo il singolo argomento di una sola UGen con un Array (di valori o di segnali), SuperCollider crea tante istanze della UGen che li contiene quante gli items dell'Array e ogni singola istanza (segnale monofonico) viene scritta su un canale audio differente.

// Array di UGens:
(
{[SinOsc.ar(440),
  SinOsc.ar(550),        // possono anche essere diverse UGens
  SinOsc.ar(660),
  SinOsc.ar(880)]}.play; // 4 segnali che escono su 4 canali differenti e contigui
)                        

// Array di argomenti come valori:

{SinOsc.ar(440)}.play;
{SinOsc.ar([440,550,660,880])}.play;

// Array di argomenti come segnali:

{SinOsc.ar(mul: SinOsc.kr(1).unipolar)}.play;
{SinOsc.ar(mul: SinOsc.kr([1,0.5,0.2,0.4]).unipolar)}.play;	

Se non stiamo utilizzando una scheda audio multicanale udiremo solo i primi due oscillatori (nel caso delle freqenze: 440 e 550) in quanto la prima istanza viene scritta di default sul canale sinistro (bus 0) mentre tutte le altre (se presenti) sui canali attigui in ordine crescente.

image not found

image not found

Vediamo ora cosa succede quando utilizziamo Array di lunghezza diversa per più argomenti della stessa UGen:

(
{SinOsc.ar(freq:[440,550,660,880,990,999],
           mul: [0.2,0.6,0.4]
)}.play
)

image not found

In questo caso l'Array che specifica le ampiezze (mul:) ha meno items di quello che specifica le frequenze (freq:) e quando termina ricomincia dal primo item:

440 --> 0.2
550 --> 0.6
660 --> 0.4
880 --> 0.2
990 --> 0.6
999 --> 0.4

Tutte le UGen hanno questa caratteristica, anche gli Env:

(
SynthDef(\multi,
               {arg t_trig = 0;
                var freq, bpf, env, sig;
                    freq = #[200,974,1500,2465];
                    env = Env.perc([0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]).kr(gate:t_trig);
                    sig = SinOsc.ar(freq, mul: env);
				Out.ar(0,sig*0.5)
                }).add;

{~synth = Synth(\multi)}.defer(0.1)
)

~synth.set(\t_trig,1);	

Visualizzazione multicanale

Possiamo visualizzare insiemi di segnali o inviluppi sotto forma di Array facendo sì che ognuno sia posizionato in un proprio piano cartesiano:

image not found

image not found

(
{[SinOsc.ar(440),LFNoise0.ar(443),Saw.ar(447)]}
.plot(name:"Sig", bounds:300@200, minval:-1, maxval:1);

[Env.perc(0.1,2,0.7),Env.perc(0.5,2,0.7),Env.perc(0.7,2,0.7)]
.plot(name:"Env", bounds:300@200, minval:0, maxval:1)
)	

Se utilizziamo la notazione per l'espansione multicanale però inviuppi e segnali si comportano in modo differente:

Implosione multicanale

Possiamo sfruttare la caratteristica appena illustrata in molte situazioni musicali che implicano l'uso di diversi canali audio. Spesso però nel programmare algoritmi di sintesi o elaborazione del suono abbiamo la necessità di effettuare l'operazione opposta, ovvero miscelare tra loro più segnali per ottenerne uno monofonico in uscita come ad esempio nella sintesi additiva. Questo ristultato può essere ottenuto con la Classe Mix.new().

s.options.numOutputBusChannels_(6);
s.reboot;
s.plotTree;
s.scope;      
s.meter;

{SinOsc.ar([600,800,1000,1200,1500], mul:0.1)}.scope;          // multicanale
{Mix.new(SinOsc.ar([600,800,1000,1200,1500], mul:0.1))}.scope; // mono	

Nel codice seguente un esempio riassuntivo con inviluppi differenti applicati a segnali differenti:

(
SynthDef(\envi, {arg t_trig = 0;
                 var freq,env,sig;
                     freq = #[200,974,1500,1800];
                     env  = Env.perc([0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]).kr(gate:t_trig);
                     sig  = SinOsc.ar(freq, mul:env); // multicanale
                     sig  = Mix(sig);                 // mono
                Out.ar(0,sig*0.3)
                }
        ).add;

{~synth = Synth(\envi)}.defer(0.1);

)
~synth.set(\t_trig,1);	

Per generare un Mix monofonico da più istanze di una sola UGen o da più UGens differenti possiamo invocare anche la maggior parte dei metodi invocabili sugli Arrays come ad esempio .fill(). I suoi argomenti sono il numero di istanze da creare e i segnali da includere nell'Array:

(
{var n = rrand(1,85);   // Numero di istanze da creare e mixare
     n.postln;
 Mix.fill(n, {SinOsc.ar(rrand(20,20000),mul:1/n)})
}.play;
)	

Oppure l'abbreviazione sintattica del metodo n.dup():

{Mix({SinOsc.ar(rrand(200,1200),mul:1/8)} ! 8)}.play;

Approfondiremo queste ed altre tecniche nel paragrafo dedicato alla sintesi additiva (METTI LINK)

Tipologie di spazi sonori

Prima di affrontare le diverse tecniche di panning con i loro specifici controlli, credo sia necessario soffermarci sui tre possibili modi di pensare lo spazio nell'utilizzo di sistemi di diffusione stereofonici e multicanale, sopratutto in relazione al pensiero musicale:

  1. gli altoparlanti delimitano uno spazio acustico all'interno del quale posizionare le diverse sorgenti monofoniche. In questo caso devono assumere il più possibile una funzione neutra ovvero l'ascoltatore non dovrebbe percepire la loro presenza, come se fossero le pareti di una sala da concerto. Utilizzeremo principalmente questo tipo di panning quando le nostre esigenze musicali sono quelle di avere diversi personaggi sonori che si muovono virtualmente all'interno dello stesso ambiente percepito come luogo inclusivo/immersivo e non come strumento.

  2. gli altoparlanti sono uno strumento di diffusione del suono caratteristico e riconoscibile e la loro disposizione in sistema (tipicamente ma non necessariamente circolare come l'ottofonia oppure in orchestre di altoparlanti come gli acousimonium) assume una precisa valenza musicale che ai nostri giorni ha ormai sviluppato proprie tecniche strumentali storicizzate e codificate come il panning circolare, randomico, le traiettorie a spirale tipiche della diffusione su acousmonium, etc.) che rispondono a necessità estetiche e musicali molto precise come in passato è avvenuto per l'evoluzione delle tecniche esecutive degli strumenti acustici.

  3. gli altoparlanti assumono la stessa valenza dei singoli strumenti acustici, di personaggi o di sculture sonore. In questo caso la caratterizzazione musicale deve essere massima in quanto anche se inseriti in un sistema di diffusione più ampio, ogni altoparlante deve rappresentare se stesso, ed essere sempre riconoscibile sia musicalmente che come punto di diffusione del suono nello spazio, esattamente come il singolo strumento di un quartetto d'archi o le sezioni di un'orchestra sinfonica.

Ognuno di questi tre modi di pensare lo spazio può essere realizzato con i diversi sistemi di diffusione del suono, dalla monofonia alla multifonia e in SuperCollider ci sono diverse UGens specifiche per ognuno di essi.