That is phase shaping / phase increment distortion. You find some more information in this thread i have written: On the path of the halfAHeart window - phase shaping vs. phase increment distortion
Thats an easingOutIn function also called a seat.
You can check out my collection of unit shapers here:
You can get this one from the collection (try out different easing cores), with height 0.5 you get the desired shape (all the params are normalized between 0 and 1 and you can modulate them at Audio rate)
(
var easeIn = { |x|
x * x * x;
};
var easeOutIn = { |x, height = 0.5|
Select.ar(x > 0.5, [
height - (height * easeIn.(1 - (x * 2))),
height + ((1 - height) * easeIn.((x - 0.5) * 2))
]);
};
var cubicSeatReversedToLinear = { |x, shape, height = 0.5|
var mix = shape * 2;
var easeOut = 1 - easeOutIn.(1 - x, height);
easeOut * (1 - mix) + (x * mix);
};
var linearToCubicSeat = { |x, shape, height = 0.5|
var mix = (shape - 0.5) * 2;
var easeIn = easeOutIn.(x, height);
x * (1 - mix) + (easeIn * mix);
};
var cubicSeatToLinearMorph = { |x, shape, height = 0.5|
Select.ar(shape > 0.5, [
cubicSeatReversedToLinear.(x, shape, height),
linearToCubicSeat.(x, shape, height)
]);
};
{
var phase = Phasor.ar(DC.ar(0), 50 * SampleDur.ir);
var sigA = cubicSeatToLinearMorph.(phase, \shapeA.kr(0), \height.kr(0.875));
var sigB = cubicSeatToLinearMorph.(phase, \shapeB.kr(0.5), \height.kr(0.875));
var sigC = cubicSeatToLinearMorph.(phase, \shapeC.kr(1), \height.kr(0.875));
[sigA, sigB, sigC];
}.plot(0.02).superpose_(true).plotColor_([Color.red, Color.blue, Color.magenta]);
)
You could also check out the cubic bezier through two given points here: