(
SynthDef(\wtable_vosc_dual_clean, { |freq = 440, vel = 1, gate = 1, amp = 0.5, driveDB = 0, fmod = 0, res = 0.6, fltRange = 6000, direct = 1|

	var env, sig, wtbufnum, wtbufnMod, osc, modOsc, fenv;
	var wtbufnumRange = [ ~wtbufnums.minItem, ~wtbufnums.maxItem ];

	// Standard ADSR Envelope
	env = EnvGen.kr(
		Env.adsr(0.1, 0.5, 0.6, 1, peakLevel:1.0, curve:-1.0, bias:0.0),
		gate,
		doneAction: 2
	) * vel;

	// Select a wavetable buffer in range
	wtbufnum = \bufn.kr(wtbufnumRange[0]);

	// Optional modulation oscillator (wavetable-based)
	modOsc = VOsc.ar(
		\wtmodbufn.kr(wtbufnumRange[0]),
		\wtmodfreq.kr(2),
		\modPhase.kr(0),
		\wtmodamp.kr(1)
	);

	// Main oscillator using VOsc
	osc = VOsc.ar(
		wtbufnum,
		freq
	);

	// Optional filtered modulation of the filter cutoff
	fenv = VOsc.ar(
		\fmodbufn.kr(wtbufnumRange[0]),
		\fmodFreq.kr(0)
	).range(0.5, 1.5);

	// Apply envelope and optional distortion/filtering
	sig = osc * env;
	sig = RLPF.ar(
		sig * driveDB.dbamp,
		(freq * fenv).clip(40, fltRange),
		res
	);

	sig = Resonz.ar(sig, Line.kr(200, 840), bwr:Line.kr(0.5, 0.1), mul:1.0, add:0.0);
	sig = CombL.ar(sig, maxdelaytime:0.8, delaytime:0.5, decaytime:0.5, mul:1.0, add:0.0);

	// Final level and output
	sig = sig * amp * direct;


	Out.ar(0, sig.dup);

}).add;
)
