After some more time with ENOSC, I came to the realization that it’s really not an additive synthesis engine (though in very limited ways it can be used as such) – it’s a bank of waveshaping oscillators.
I suspect that each individual oscillator is a phase accumulator (rising ramp), which undergoes phase distortion (Twist) and phase modulation (Cross FM), a sine lookup, and then wavefolding (Warp). It’s then mixed with other oscillators – but if you keep the Balance knob fully CCW or fully CW, you can isolate one and work it in a fairly conventional way. It offers a wide variety of timbres with just one audible oscillator. (That’s what I was doing in my demo above.)
The real complexity comes when you’re hearing a whole bank of oscillators, and the myriad of FM relationships between them. For instance, if you’re using a major chord and Cross FM in “up” mode, you’ll a blend of integer FM ratios (on the octave, octave+fifth, etc.) and non-integer FM ratios (the thirds), and those ratios are different for every oscillator. Those 16 oscillators could be producing hundreds of sidebands. In “all” mode, each oscillator FMs the next highest – so with that major chord there are only 3 different FM ratios in play, but all of them are non-integer ratios and there are still several of them across the spectrum.
But if you choose the circle of fifths or Bohlen-Pierce major scales for instance, every ratio from one oscillator to the next is equal, so Cross FM in “all” mode produces sets of sidebands that align, while “up” or “down” modes produce a tangle of inharmonic complexity.
And adding to all this, there’s the doubling and crossfading of oscillators that happens when their frequency falls between quantized values on the scale. This effect can cause interesting shifts to happen with the FM as Spread or Root are modulated.
…
Aside: for what it’s worth, I believe (but can’t prove) that the FM modulation is always a sine, and “all” mode works from the top down rather than involving a serial chain of modulations. (The phase accumulator for the modulator probably runs through a separate sine lookup, without phase distortion or phase modulation.)
E.g. every FM mode is {1 unmodulated oscillator + 15x 2OP FM]. That’s complex enough… the alternative would be that All mode is [1 osc + 2OP + 3OP + 4OP + 5OP + 6OP + 7OP + 8OP + 9OP + 10OP + 11OP + 12OP + 13OP + 14OP + 15OP] and you might as well just use a white noise generator
And this is assuming no crossfading is happening…!
…
TLDR: set Balance to either extreme and ENOSC is a “simple” waveshaping oscillator with a diverse range of timbres. Set Balance somewhere in between but leave Cross FM at zero, and it’s a whole stack of waveshaping oscillators. But as soon as you involve Cross FM and multiple oscillators, things can get complicated in there… yet it still feels easy to turn knobs and get great results.