Projetando sons no SuperCollider/Reverb de Schroeder

Fig 14.28: Recirculando Reverb de Shoroeder

editar

Primeiro inicie o servidor, se você ainda não o fez:

s = Server.local; //escolhendo servidor 'localhost' como padrão;
s.boot; //

Iremos precisar de alguma fonte sonora; iremos utilizar um arquivo que vem junto com o SC, e é utilizado como padrão em vários exemplos:

b = Buffer.read(s, "sounds/a11wlk01-44_1.aiff");
// Testando o arquivo:
b.play

Abaixo é um código que cria um reverb em um simples Synth, com 4 delay-lines separados entrecruzando-se

(
x = {	
	var input, output, delrd, sig, deltimes;
	
        // Escolha qual tipo de input você quer (des)comentando as seguintes linhas:
	input = Pan2.ar(PlayBuf.ar(1, b, loop: 0), -0.5); // toca o buffer, localizado um pouco mais à esquerda 
	//input = SoundIn.ar([0,1]); // TOME CUIDADO COM O FEEDBACK ( use fones de ouvido )
	//input = Dust2.ar([0.1, 0.01]); // impulsos aleatórios
	
        // Para ler nossos sinais atrasados (em 4 canais) de volta a partir do feedback
	delrd = LocalIn.ar(4);
	
        // Este será nossa saída, onde as coisas também serão recirculadas
	output = input + delrd[[0,1]];
	
        // entrecruzamento dos 4 delay lines entre si
	sig = [output[0]+output[1], output[0]-output[1], delrd[2]+delrd[3], delrd[2]-delrd[3]];
	sig = [sig[0]+sig[2], sig[1]+sig[3], sig[0]-sig[2], sig[1]-sig[3]];
 
        //Atenuando os delays para em um decay
	sig = sig * [0.4, 0.37, 0.333, 0.3];
	
        // Aqui temos tempos de delay em milisegundos, converta em segundos, 
        // e então compense com um ControlDur para um bloco de delay, que sempre irá
        // ser introdzido quando usarmos o feedback loop com LocalIn/Out 
	deltimes = [101, 143, 165, 177] * 0.001 - ControlDur.ir;
	
        // Aplique os delays e envie os sinais em um feedback loop
	LocalOut.ar(DelayC.ar(sig, deltimes, deltimes));
	
	// Para ouvir:
	Out.ar(0, output);
	
}.play
)

Aqui temos uma forma alternativa de fazer a mesma coisa; dessa vez utilizaremos uma matriz para representar o entrecruzamento dos fluxos de delay. A matriz substitui todos os pontos positivos e negativos, então isso é uma forma elegante para representar a mistura - veja qual você acha mais legível.

(
x = {	
	var input, output, delrd, sig, deltimes;
	
	// Escolha qual tipo de input você quer (des)comentando as seguintes linhas:
	input = Pan2.ar(PlayBuf.ar(1, b, loop: 0), -0.5); // // toca o buffer, localizado um pouco mais à esquerda 
	//input = SoundIn.ar([0,1]); // TOME CUIDADO COM O FEEDBACK ( use fones de ouvido )
	//input = Dust2.ar([0.1, 0.01]); // Impulsos aleatórios
	
	// Para ler nossos sinais atrasados (em 4 canais) de volta a partir do feedback
	delrd = LocalIn.ar(4);
	
	// Este será nossa saída, onde as coisas também serão recirculadas
	output = input + delrd[[0,1]];
	
	sig = output ++ delrd[[2,3]];
	// entrecruzamento dos 4 delay lines entre si
	sig = ([ [1,  1,  1,  1],
	         [1, -1,  1, -1],
	         [1,  1, -1, -1],
	         [1, -1, -1,  1]] * sig).sum;
	
        //Atenuando os delays para em um decay
	sig = sig * [0.4, 0.37, 0.333, 0.3];
	
        // Aqui temos tempos de delay em milisegundos, converta em segundos, 
        // e então compense com um ControlDur para um bloco de delay, que sempre irá
        // ser introdzido quando usarmos o feedback loop com LocalIn/Out 
	deltimes = [101, 143, 165, 177] * 0.001 - ControlDur.ir;
	
	// Aplique os delays e envie os sinais em um feedback loop
	LocalOut.ar(DelayC.ar(sig, deltimes, deltimes));
	
	//Para ouvir:
	Out.ar(0, output);
	
}.play
)

x.free;

Projetando sons no SuperCollider/thiscodeisby