UGens are either unipolar (0 to 1) or bipolar (-1 to +1); knowing which is essential before routing their output
UGen output ranges fall into two categories: unipolar (0 to 1, e.g., LFPulse) and bipolar (-1 to +1, e.g., SinOsc, LFNoise0). This distinction is critical before routing a UGen as a control signal: a bipolar UGen used directly as amplitude produces negative amplitudes (phase inversion, effectively silence). The .range(lo, hi) method rescales any UGen’s native output to any target range. Checking polarity via .poll or the Help file is a prerequisite for routing. LFPulse in particular outputs only 0 or 1, never intermediate values.
Examples
{SinOsc.kr(1).poll}.play; // bipolar: see -1..+1
{LFPulse.kr(1).poll}.play; // unipolar: see 0 and 1 only
{SinOsc.ar(LFNoise0.kr(5).range(200,800),0,0.1)}.play;
Assessment
Without running code: if SinOsc.kr is used directly as the mul argument of another SinOsc, what amplitudes will occur? How would you fix this using .range? Verify with .poll.