here are some ideas:
triangle with variable skew
(
var getTriangle = { |phase, skew|
phase = phase.linlin(0, 1, skew.neg, 1 - skew);
phase.bilin(0, skew.neg, 1 - skew, 1, 0, 0);
};
{
var reset = \reset.tr(0);
var phase = Phasor.ar(reset, 100 * SampleDur.ir);
var triangle = getTriangle.(phase, \skew.kr(0.5));
[phase, triangle];
}.plot(0.02);
)
sinusoid with variable skew
(
var getTriangle = { |phase, skew|
phase = phase.linlin(0, 1, skew.neg, 1 - skew);
phase.bilin(0, skew.neg, 1 - skew, 1, 0, 0);
};
var getSine = { |phase|
1 - cos(phase * pi) / 2;
};
{
var reset = \reset.tr(0);
var phase = Phasor.ar(reset, 100 * SampleDur.ir);
var triangle = getTriangle.(phase, \skew.kr(0.5));
var sine = getSine.(triangle);
[phase, sine];
}.plot(0.02);
)
trapezoid with variable skew, shape and width
(
var getTriangle = { |phase, skew|
phase = phase.linlin(0, 1, skew.neg, 1 - skew);
phase.bilin(0, skew.neg, 1 - skew, 1, 0, 0);
};
var getTrapezoid = { |phase, duty, shape, skew|
var offset = phase - (1 - duty);
var steepness = 1 / (1 - shape);
var trapezoid = (offset * steepness + (1 - duty)).clip(0, 1);
var pulse = offset > 0;
Select.ar(shape |==| 1, [trapezoid, pulse]);
};
{
var reset = \reset.tr(0);
var phase = Phasor.ar(reset, 100 * SampleDur.ir);
var triangle = getTriangle.(phase, \skew.kr(0.5));
var trapezoid = getTrapezoid.(triangle, \duty.kr(0.25), \shape.kr(0.75));
[phase, trapezoid];
}.plot(0.02);
)
combine them all!!!
(
var getTriangle = { |phase, skew|
phase = phase.linlin(0, 1, skew.neg, 1 - skew);
phase.bilin(0, skew.neg, 1 - skew, 1, 0, 0);
};
var getSine = { |phase|
1 - cos(phase * pi) / 2;
};
var getTrapezoid = { |phase, duty, shape, skew|
var offset = phase - (1 - duty);
var steepness = 1 / (1 - shape);
var trapezoid = (offset * steepness + (1 - duty)).clip(0, 1);
var pulse = offset > 0;
Select.ar(shape |==| 1, [trapezoid, pulse]);
};
var getMultiLFO = { |phase, skew, width, shape, mix|
var triangle = getTriangle.(phase, skew);
var trapezoid = getTrapezoid.(triangle, width, shape);
var sine = getSine.(trapezoid);
trapezoid * (1 - mix) + (sine * mix);
};
{
var reset = \reset.tr(0);
var phase = Phasor.ar(reset, 100 * SampleDur.ir);
var lfo = getMultiLFO.(phase, \skew.kr(0.5), \width.kr(0.25), \shape.kr(0.75), \mix.kr(1));
[phase, lfo];
}.plot(0.02);
)