Pan2, Balance2
You are using a 2‑channel signal together with Pan2:
...
sig = PlayBuf.ar(
numChannels: 2,
...
sig = Pan2.ar(sig
...
but for stereo input Balance2 is usually the better choice.
ir, kr, ar
...
rate: BufRateScale.ir(buf) * \rate.ir(10),
...
sig = Pan2.ar(sig, \pan.ir(0), \amp.ir(0.9));
...
Also, .ir is appropriate only when you do not need to control a parameter while the Synth is running. To control parameters of a running Synth, .kr is generally the better choice, and .ar is used when audio-rate modulation or very subtle, sample-accurate changes are required.
(
s.waitForBoot {
SynthDef(\playa, {
var buf = \buf.kr(0);
var rate = BufRateScale.kr(buf) * \rate.kr(10);
// var rate = BufRateScale.kr(buf) * \rate.ir(10);
var env = Env([0,1, 1, 0], [\atk.kr(0.001), \sust.kr(1), \rel.kr(3)], -2);
var sig = PlayBuf.ar(2, buf, rate, 1, \start.kr(0), \loop.kr(0));
env = env.ar(Done.freeSelf);
sig = sig * env;
sig = Balance2.ar(sig[0], sig[1], \pan.kr(0), \amp.kr(0.9));
// sig = Balance2.ar(sig[0], sig[1], \pan.ir(0), \amp.ir(0.9));
Out.ar(\out.kr(0), sig);
}).add;
~buf = Buffer.read(s, ExampleFiles.sinedPink);
~bufSwap = Buffer.readChannel(s, ExampleFiles.sinedPink, channels: [1, 0]);
s.sync;
fork {
100.do { |i|
var duration = 0.2;
Synth(\playa, [
buf: ~buf,
rate: [1/2, 1, 1, 2].pyramid[i % 4] / 4,
loop: 1,
sust: duration * 0.1,
rel: 0.1,
pan: 1.0.rand2,
amp: (-9, -10.5 .. -15).choose.dbamp
]);
duration.wait
}
};
fork {
var synth = Synth(\playa, [buf: ~bufSwap, loop: 1, sust: 20]);
10.do { |i|
synth.set(
\rate, (24 - i).midiratio, // this only works when using .kr
\amp, [-15, -27][i % 2].dbamp // this only works when using .kr
);
1.wait
}
}
}
)
Could you read the following draft, which I intend to include as a guide in the next version of SC? It is not final yet, so there may be many inaccuracies:
github.com/supercollider/supercollider
You can leave feedback here or there.