Resettable or Trigable Oscillators?

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);
)

grafik
grafik

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);
)

grafik
grafik

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);
)

grafik
grafik

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);
)

grafik
grafik
grafik

4 Likes