Moog Subharmonicon

I’ve recently been captivated by the Moog Subharmonicon. Does anyone know the mechanics behind how it generates subharmonics?

This is what I came up with after a few minutes but I have no idea if it is a good approach:

// --- how do we generate subharmonics from an oscillator? ---
// --- how does moog do it?? ---

(
SynthDef(\subh2,{
	arg freq = 440, div = 4;
	var osc, sub, env;
	osc = Saw.ar(freq);
	p = PulseDivider.ar(osc, div);
	a = 0.5 * freq/(div * s.sampleRate);
	sub = LeakDC.ar(Phasor.ar(p, 1, 0, inf, 0) * a);
	env = EnvGen.ar(Env.perc(0.001,8), doneAction:2);
	Out.ar(0, Splay.ar(osc + sub * env));
}).add;
)

(
Pbind(
	\instrument, \subh2,
	\degree, Pseq([0,5,9,[0,12]], inf),
	\dur, 2,
	\div, Pseq([[2,4,8],[3,6,9],[4,8,16]],inf),
	\strum,0.2
).play;
)

I assume it is just a separate oscillator: “Two analog VCOs and four subharmonic oscillators are combined for a total of six powerful sound sources.”

This clarifies things nicely:

https://www.youtube.com/watch?v=czdefQgD5F8

I’m pretty sure it’s not a separate oscillator, actually. It only follows subharmonics of the main oscillator, it is not freely adjustable.

[Edit: Also the oscillators are analogue, but they don’t have to be separately tuned, which suggests the subharmonic oscillator is sync’d to the main oscillator somehow. That’s what I tried to accomplish in my code, and I think I was successful, but I’m curious how Moog does it/if there is a better way]

Usually the way you would generate subharmonics in an analog synthesizer is to use comparator and a divide-by-n counter to create a divided square wave version of the input signal. Then you can use a shaper (basically a one-pole lowpass filter) to shape the square wave into a sawtooth.

Its not SC but this is a nice video which recreates the subharmonicon in VCV rack using pretty simple modules: https://www.youtube.com/watch?v=r7_U4Dgln-0

It helped me a lot understand what the subharmonicon really does (I don’t own one).

For comparison, here’s a square wave version:

(
SynthDef(\subh3,{
	arg freq = 440, div = 4;
	var osc, sub, env;
	osc = Saw.ar(freq);
	p = PulseDivider.ar(osc, div * 0.5);
	sub = 0.5 * LeakDC.ar(ToggleFF.ar(p) - 0.5);
	env = EnvGen.ar(Env.perc(0.001,8), doneAction:2);
	Out.ar(0, Splay.ar(osc + sub * env));
}).add;
)

(
Pbind(
	\instrument, \subh3,
	\degree, Pseq([0,5,9,[0,12]], inf),
	\dur, 2,
	\div, Pseq([[2,4,8],[3,6,9],[4,8,16]],inf),
	\strum,0.2
).play;
)