Phaseshaping Osc Algorithms

Is this what you mean:

({
	var width = MouseX.kr;
	var phasor = LFSaw.ar(MouseY.kr(100, 1000)).range(width.neg, 1-width);
	phasor = phasor.bilin(0, width.neg, 1-width, 0, -1, 1).abs*2-1;
	phasor.dup*0.1
}.scope)

Have you looked at the Maths quark? The Maths is basically a variable slope triangle (I think), with a slope you can warp towards exponential or logarithmic. The quark is implemented in Faust, but this thread made me realize I could do it is SC as well. Below is the working code in SC. I will fold that into the quark when I have the time. To use this, just save this into a .sc file and save it into the extensions folder. The help for Maths will work with Maths2. They should give the exact same results.

Maths2 {
	*ar {|rise=0.1, fall=0.1, linExp = 0.5, loop = 1, plugged = 0, trig = 0|

		var freq = 1/(rise.clip(0.001,10*60)+fall.clip(0.001,10*60)), width=rise.clip(0.001,10*60)/(rise.clip(0.001,10*60)+fall.clip(0.001,10*60));

		var plugTrig = Trig1.ar(1-plugged, 1/SampleRate.ir);
		var loopTrig = Trig1.ar(loop, 1/SampleRate.ir);

		var phasor = Phasor.ar(Silent.ar+loopTrig+plugTrig, 2*freq/SampleRate.ir, -1, 1, -1);

		var phasorTrig = Trig1.ar(0.5-phasor, 1/SampleRate.ir)+EnvGen.ar(Env([0,0,1,0], [1/SampleRate.ir,1/SampleRate.ir,1/SampleRate.ir]));
		var latchTrig = (phasorTrig+(DelayN.ar(loopTrig, 0.01, 0.01))).clip(0,1);
		var postEnv =(Latch.ar(K2A.ar(loop), latchTrig)>0);


		var eof, eor;


		var inTrig = Trig1.ar(trig, 1/SampleRate.ir);
		var phasor2 = Phasor.ar(inTrig, 2*freq/SampleRate.ir, -1, 1, -1);
		var postEnv2 = SetResetFF.ar(Delay1.ar(inTrig), Trig1.ar(0.5-phasor2, 1/SampleRate.ir));
		var maths, maths2, interp;

		phasor = phasor.linlin(-1,1,width.neg, 1-width);
		maths = phasor.bilin(0, width.neg, 1-width, 0, -1, 1);
		maths = 1-(maths.abs);
		maths = maths*postEnv;

		phasor2 = phasor2.linlin(-1,1,width.neg, 1-width);
		maths2 = phasor2.bilin(0, width.neg, 1-width, 0, -1, 1);
		maths2 = 1-(maths2.abs);
		maths2 = maths2*postEnv2;

		maths = Select.ar(plugged, [maths,maths2]);

		interp = Select.kr(linExp>0.5, [linExp.linlin(0, 0.5, 1, 0) , linExp.linlin(0.5, 1, 0, 1)]);
		maths = Select.ar(linExp>0.5, [ maths-1, maths]);
		maths = (maths**8*interp)+(maths*(1-interp));
		maths = Select.ar(linExp>0.5, [ maths+1, maths]);

		eof = Select.ar(plugged, [(phasor*postEnv).neg>0, (phasor2*postEnv2).neg>0]);
		eor = Select.ar(plugged, [(phasor*postEnv)>0, (phasor2*postEnv2)>0]);

		^[maths, eof, eor]
	}
}