The key thing is sum up two inverted sawtooth waves and change their phase relationship:
{[LFSaw.ar(iphase: 0.0),LFSaw.ar(iphase: pi/2, mul:-1.0),LFSaw.ar(iphase: 0.0) + LFSaw.ar(iphase: pi/2, mul: -1.0), LFSaw.ar(iphase: 0.0) + LFSaw.ar(iphase: pi/4, mul: -1.0)] }.plot;
But you said you want to build a sawtooth with sines using FM, so you can use a feedback sine that will it will produce something really close to a sawtooth:
{[SinOscFB.ar(feedback: 0.5),SinOscFB.ar(feedback: 1.0),SinOscFB.ar(feedback: 1.2) ]}.plot
Now it just a matter of introducing some delay between them:
(
{[
SinOscFB.ar(feedback: 1.2) + DelayC.ar(SinOscFB.ar(feedback: 1.2, mul: -1.0), delaytime: 0.0015),
SinOscFB.ar(feedback: 1.2) + DelayC.ar(SinOscFB.ar(feedback: 1.2, mul: -1.0), delaytime: 0.0010),
SinOscFB.ar(feedback: 1.2) + DelayC.ar(SinOscFB.ar(feedback: 1.2, mul: -1.0), delaytime: 0.0005)
]}.plot;
)
Sound comparison:
{SinOscFB.ar(feedback: 1.9) + DelayC.ar(SinOscFB.ar(feedback: 1.9, mul: -1.0), delaytime: SinOsc.ar(1).range(0.000001,0.00090)) *0.5}.play
{LFPulse.ar(width:SinOsc.ar(1).range(0.0,0.5) )*0.5}.play