View Raw SPL
sawtooth(t, w, duty)
{
        local t0, t1, tp, dx, s;

        if (argc < 3)
        {
                if (argc < 2)
                {
                        if (argc < 1) error("sawtooth - input series required");

                        w = 1.0;
                }

                duty = 100;
        }

        dx = deltax(t);

        duty /= 100;

        tp = t / (2 * pi);

        t0 = tp - floor(tp);
        t1 = t0 / duty;

        s = zeros(length(tp), 1);

        if (w > 0)
        {
                s = (t1 <= w && t0 < duty) * t1 / w;
        }

        if (w < 1)
        {
                s += (t1 > w && t0 < duty) * (1 - t1) / (1 - w);
        }

        /* rescale -1 to 1 */
        s = 2 * (s - 0.5);

        if (isarray(t))
        {
                s = xy(t, s);
        }

        return(s);
}