So far, patterns could not be used with synthdef variants for a few
reasons: the variant name interferes with synthdesc lookup, and the
msgFunc would overwrite the argument defaults given in the variants.
I've got rudimentary variant support working. It needs these changes:
1. The replacement msgFunc I proposed some weeks ago, which differs
from the original in that it adds a control name and value to the
argument array only if the value actually exists in the event. I've
been using this alternate for weeks now with no ill effect -- it's
broken exactly nothing in my pieces.
2. A synthdesc flag, hasVariants, populated while reading the
synthdef's binary stream.
3. A 'match' method for SynthDescLib that strips the variant name
(if present) and looks only for the main synthdef name. In the
current incarnation, defname.variant matches only if defname has
variants, but the variant name is not verified. I don't think it
would be hard to add that check. If the synthdef has no variants,
the entire instrument name from the pattern is used for the lookup
(because somebody might have a synthdef whose name has a '.').
4. Event prototypes should use ~synthLib.match(instrumentName)
instead of the current .at lookup.
With the attached patch, the following patterns produce quite
different sonic results as one would expect.
SynthDef("vartest", {|out=0, freq=440, amp=0.2, a = 0.01, r = 1|
// the EnvGen with doneAction: 2 frees the synth
automatically when done
Out.ar(out, SinOsc.ar(freq, 0, EnvGen.kr(Env.perc(a, r, amp),
doneAction: 2)));
}, variants: (alpha: [a: 0.5, r: 0.5], beta: [a: 3, r: 0.01], gamma:
[a: 0.01, r: 4])
).memStore;
p = Pbind(
\instrument, 'vartest',
\freq, Pexprand(200, 800, inf),
\delta, 0.25
).play;
p.stop;
p = Pbind(
\instrument, 'vartest.alpha',
\freq, Pexprand(200, 800, inf),
\delta, 0.25
).play;
p.stop;
Comments or concerns? Currently I'm not actually reading the variant
values into the synthdesc, but that won't be difficult. That would
also make it easy to check whether the variant name is valid.
hjh
?
: H. James Harkins
: jamshark70@xxxxxxxxxxxxxxxxx
: http://www.dewdrop-world.net
.::!:.:.......:.::........:..!.::.::...:..:...:.:.:.:..:
"Come said the Muse,
Sing me a song no poet has yet chanted,
Sing me the universal." -- Whitman
So far, patterns could not be used with synthdef variants for a few
reasons: the variant name interferes with synthdesc lookup, and the
msgFunc would overwrite the argument defaults given in the variants.
I've got rudimentary variant support working. It needs these changes:
1. The replacement msgFunc I proposed some weeks ago, which differs
from the original in that it adds a control name and value to the
argument array only if the value actually exists in the event. I've
been using this alternate for weeks now with no ill effect -- it's
broken exactly nothing in my pieces.
2. A synthdesc flag, hasVariants, populated while reading the
synthdef's binary stream.
3. A 'match' method for SynthDescLib that strips the variant name
(if present) and looks only for the main synthdef name. In the
current incarnation, defname.variant matches only if defname has
variants, but the variant name is not verified. I don't think it
would be hard to add that check. If the synthdef has no variants,
the entire instrument name from the pattern is used for the lookup
(because somebody might have a synthdef whose name has a '.').
4. Event prototypes should use ~synthLib.match(instrumentName)
instead of the current .at lookup.
With the attached patch, the following patterns produce quite
different sonic results as one would expect.
SynthDef("vartest", {|out=0, freq=440, amp=0.2, a = 0.01, r = 1|
// the EnvGen with doneAction: 2 frees the synth
automatically when done
Out.ar(out, SinOsc.ar(freq, 0, EnvGen.kr(Env.perc(a, r, amp),
doneAction: 2)));
}, variants: (alpha: [a: 0.5, r: 0.5], beta: [a: 3, r: 0.01], gamma:
[a: 0.01, r: 4])
).memStore;
p = Pbind(
\instrument, 'vartest',
\freq, Pexprand(200, 800, inf),
\delta, 0.25
).play;
p.stop;
p = Pbind(
\instrument, 'vartest.alpha',
\freq, Pexprand(200, 800, inf),
\delta, 0.25
).play;
p.stop;
Comments or concerns? Currently I'm not actually reading the variant
values into the synthdesc, but that won't be difficult. That would
also make it easy to check whether the variant name is valid.
hjh
Attachment converted: data:synth-variant.diff ( / ) (0008767E)
: H. James Harkins
: <mailto:jamshark70@xxxxxxxxxxxxxxxxx>jamshark70@xxxxxxxxxxxxxxxxx
: <http://www.dewdrop-world.net>http://www.dewdrop-world.net
.::!:.:.......:.::........:..!.::.::...:..:...:.:.:.:..:
"Come said the Muse,
Sing me a song no poet has yet chanted,
Sing me the universal." -- Whitman