I made this sketch in Faust to allow us to test different types of saturation
import("stdfaust.lib");
// Parameters
drive = hslider("Drive", 1, 1, 10, 0.1);
saturationType = nentry("Saturation Type", 0, 0, 4, 1);
dryWet = hslider("Dry/Wet", 1, 0, 1, 0.01);
outGain = hslider("Output Gain", 1, 0, 2, 0.1);
// Saturation Functions
saturate(x) =
(saturationType == 0) * aa.tanh1(x) +
(saturationType == 1) * aa.arctan(x) +
(saturationType == 2) * aa.hardclip(x) +
(saturationType == 3) * aa.cubic1(x) +
(saturationType == 4) * aa.hyperbolic(x);
// Main Process
process = _ <: (_, (*(drive) : saturate)) : dry_wet(dryWet) : *(outGain)
with {
dry_wet(mix, dry, wet) = (1-mix)*dry + mix*wet;
};