SuperCollider/Schroeder 混响中的声音设计
外观
首先启动服务器,如果你还没有启动的话
s.boot;
然后,为了获得一些源素材,我们将加载 SC 附带的标准声音文件
b = Buffer.read(s, "sounds/a11wlk01-44_1.aiff");
// Hear it raw:
b.play
现在,这段代码在一个单独的合成器中创建混响,并有四条独立的延迟线相互交叉交叉
(
Ndef(\verb, {
var input, output, delrd, sig, deltimes;
// Choose which sort of input you want by (un)commenting these lines:
input = Pan2.ar(PlayBuf.ar(1, b, loop: 0), -0.5); // buffer playback, panned halfway left
//input = SoundIn.ar([0,1]); // TAKE CARE of feedback - use headphones
//input = Dust2.ar([0.1, 0.01]); // Occasional clicks
// Read our 4-channel delayed signals back from the feedback loop
delrd = LocalIn.ar(4);
// This will be our eventual output, which will also be recirculated
output = input + delrd[[0,1]];
// Cross-fertilise the four delay lines with each other:
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]];
// Attenutate the delayed signals so they decay:
sig = sig * [0.4, 0.37, 0.333, 0.3];
// Here we give delay times in milliseconds, convert to seconds,
// then compensate with ControlDur for the one-block delay
// which is always introduced when using the LocalIn/Out fdbk loop
deltimes = [101, 143, 165, 177] * 0.001 - ControlDur.ir;
// Apply the delays and send the signals into the feedback loop
LocalOut.ar(DelayC.ar(sig, deltimes, deltimes));
// Now let's hear it:
output
}).play
)
这里还有另一种完成同样事情的方法,这次使用矩阵来表示延迟流的交叉混合。单个矩阵取代了所有这些加号和减号,因此它是表示混合的一种简洁方法 - 看看哪种对你来说最易读。
(
Ndef(\verb, {
var input, output, delrd, sig, deltimes;
// Choose which sort of input you want by (un)commenting these lines:
input = Pan2.ar(PlayBuf.ar(1, b, loop: 0), -0.5); // buffer playback, panned halfway left
//input = SoundIn.ar([0,1]); // TAKE CARE of feedback - use headphones
//input = Dust2.ar([0.1, 0.01]); // Occasional clicks
// Read our 4-channel delayed signals back from the feedback loop
delrd = LocalIn.ar(4);
// This will be our eventual output, which will also be recirculated
output = input + delrd[[0,1]];
sig = output ++ delrd[[2,3]];
// Cross-fertilise the four delay lines with each other:
sig = ([ [1, 1, 1, 1],
[1, -1, 1, -1],
[1, 1, -1, -1],
[1, -1, -1, 1]] * sig).sum;
// Attenutate the delayed signals so they decay:
sig = sig * [0.4, 0.37, 0.333, 0.3];
// Here we give delay times in milliseconds, convert to seconds,
// then compensate with ControlDur for the one-block delay
// which is always introduced when using the LocalIn/Out fdbk loop
deltimes = [101, 143, 165, 177] * 0.001 - ControlDur.ir;
// Apply the delays and send the signals into the feedback loop
LocalOut.ar(DelayC.ar(sig, deltimes, deltimes));
// Now let's hear it:
output
}).play
)
// To stop it:
Ndef(\verb).free;