You can also of course use the audio library. Teensy 3.2 can synthesize and mix dozens of waveforms and Teensy 4.0 can handle hundreds of voices. You can output the final mixed result using the DAC pin on Teensy 3.2 or MSQ on Teensy 4.0. Or use the audio shield or PT8211 DAC for higher quality. With the audio library you can control the waveform amplitude, phase, shape (sine, triangle, sawtooth, etc) of each waveform, so much more musical than just mixing square waves of fixed amplitued. The library also gives modulated waveforms (using other waveforms as your LFOs) and a ton of other features. You also don't need external circuitry to mix all the waveforms, as it can be done with DSP inside the audio library. Yeah, it's Teensy-specific, so if you're looking to write code that can run on all Arduino compatible boards, you don't get that sort of lowest common denominator style. But isn't as many waveforms as you want, mixed entire in software at any relative amplitues, a pretty compelling feature?