Best sounding SAW oscillator for high frequencies

Hello there, I would like to have your point of view on what is the best sounding (less aliasing, clearest) Sawtooth oscillator when playing above 3khz. I tried Saw, SawDPW, DPW4Saw, BlitB3Saw, but it doesn’t appear that one of them is really better. ( at least for my ears).
So far, the most convincing digital saw oscillator that I use, is the antialiasing oscillator from Kyma. But it’s a wavetable oscillator and it has a kind of aesthetic (even if it’s supposed to be a pure waveform) that I find special and I prefer the one on SC.
I don’t know if you have tricks, ideas, or references to get a crystal clear saw wave on SC that could be really nice at 3,4,8,10 khz etc…? I was wondering about FM synthesis (by the way if someone could give the line code to produce a pure sawtooth waveform using PMOsc, or FM7.ar or a classic conbination of two SinOsc (carrier and modulator), it would be really nice) I know the theory (the 1:1 ratio) but I didn’t manage to get the expected result). Maybe additive synthesis could produce interesting results too?
Thanks a lot.

1 Like

Hello and welcome to the forum!

I did some tests and didn’t see any aliasing with Saw.
E.g. run

{ Saw.ar(3500, 0.1) }.play

do

s.freqscope

and switch to the linear FrqScl on the right hand side of the gui.
Looks as it should.

So my assumption is that you might prefer a wavefrom that somehow differs from a sawtooth approximation without aliasing.

FWIW you can check an approximation with additive synthesis, it takes a maximum number of partials and sets all to zero that would be above half nyquist.

(
SynthDef(\additiveSaw, { |out, gate = 1, freq = 1000, amp = 0.1|	
	var partialNum = (SampleRate.ir / 2 / freq).floor;
	var sig, maxPartialNum = 200; // max number of partials
	var indicatorSig = { |i| i <= (partialNum - 1) } ! maxPartialNum;

	sig = Mix(SinOsc.ar((1..maxPartialNum) * freq * indicatorSig, 0, amp ** 2.sqrt) / (1..maxPartialNum));
	Out.ar(out, sig * EnvGen.ar(Env.asr, gate, doneAction: 2))
}).add
)


x = Synth(\additiveSaw, [freq: 3500])

x.release

Personally I don’t hear a difference to

{ Saw.ar(3500, 0.1) }.play

Regards

Daniel