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]
}
}