Andrew; You're just making swells, right? I was assuming the Envelope was for click-removal and the rest of the tone was desired to be of constant volume. I may well be misunderstanding the question.
In that case, the only change should be that you need to provide ramp-down time of e.duration() => now.
Yes, while it may not be needed here this is a great trick. Any function returning a dur may be chucked to now. This is great as it leads to compact code, it's expressive, and there is only a single thing to change if we need to speed the piece up or down. You can even take it further, this is perfectly legal as well. 10::my_SinOsc.period() => now; //advances time by exactly 10 cycles.
Also, make sure you scale the gain so that you keep the overall power of the signal below 1.0.
Yes, that too is a good trick and a good reason to keep track of the number of UGens connected to the dac. and then once you expand from 4 to 100 SinOscs you'll only have to
change the one line of code.
This too is great advice that could stand repeating. As a rule of thumb I tend to scan my code with my eyes half-closed; anything that looks monotonous or repetitive when looking at it like that is cause for adding a array (or more rarely a function). This keeps code-size down, cuts down on editing time and errors. All good notes on style. Kas.