If often use a combination of Pdefs and Pchains for these scenarios (if I understand you correctly):
(
SynthDef(\a, {
var sig = LFSaw.ar(\freq.kr(220)) * 0.1;
var env = Env.asr(\atk.kr(0.1), 1, \rel.kr(1)).kr(2, \gate.kr(1));
sig = Pan2.ar(sig, \pan.kr(0));
Out.ar(\out.kr(0), sig * \amp.kr(1) * env ! 2)
}).add;
SynthDef(\b, {
var sig = LFPulse.ar(\freq.kr(220)) * 0.2;
var env = Env.asr(\atk.kr(0.1), 1, \rel.kr(1)).kr(2, \gate.kr(1));
sig = Pan2.ar(sig, \pan.kr(0));
Out.ar(\out.kr(0), sig * \amp.kr(1) * env)
}).add
)
(
Pdef(\aPat, Pbind(\instrument, \a, \pan, -1, \amp, Pseq([0.1, 1], inf)));
Pdef(\bPat, Pbind(\instrument, \b, \pan, 1, \amp, Pseq([1, 0.1], inf)));
Pdef(\basePat, Pbind(\dur, Prand([0.25, 0.5, 0.75, 1], inf), \midinote, Prand([50, 53, 55, 57, 60], inf, \amp, 1)));
Pdef(\test, Pchain(Ppar([Pdef(\aPat), Pdef(\bPat)]), Pdup(2, Pdef(\basePat)))).play
// Alternative shorter syntax for Pchain using <>
// Pdef(\test, Ppar([Pdef(\aPat), Pdef(\bPat)]) <> Pdup(2, Pdef(\basePat))).play
)
// Now you can change all 3 patterns while playing as you wish
// note that because of Pdup, the randomly chosen values of the basePat is propagated to both \aPat and \bPat
// note also that because the \basePat is before \aPat and \bPat (the Pchain reads right-to-left), the \amp keys in
// \aPat and \bPat overrides the \amp key in the \basePat
Pdef(\aPat, Pbind(\atk, 0.1, \rel, 0.1, \pan, Pwhite(-1, 1), \amp, Pwhite(0.1, 0.5)))
Pdef(\bPat, Pbind(\atk, 0.1, \rel, Pwhite(0.1, 0.5), \pan, Pwhite(-1, 1), \amp, Pwhite(0.1, 0.5)))
// change the basePat
Pdef(\basePat, Pbind(\dur, Prand([0.25, 0.5, 0.75, 1], inf), \midinote, Prand([50, 53, 55, 57, 60] + 3, inf, \amp, 1)));
// override the \midinote of the basePat
Pdef(\bPat, Pbind(\atk, 0.1, \rel, 0.1, \midinote, 69))
Pdef(\test).stop