47 lines
1.1 KiB
Text
47 lines
1.1 KiB
Text
// Drive at 4x oversampling: soft (rational tanh), hard clip, a wavefolder
|
|
// or asymmetric tube-ish saturation, then a tone low-pass and a DC
|
|
// blocker. At 1x the harmonics a clipper makes fold back as inharmonic
|
|
// fizz; at 4x they are filtered away (58 dB down).
|
|
let amount = param(0.5, 0, 1)
|
|
let mode = param(0, 0, 3)
|
|
let tone = param(9000, 500, 18000)
|
|
let blend = param(1, 0, 1)
|
|
let level = param(0.8, 0, 2)
|
|
|
|
var os_l = Os4{}
|
|
var os_r = Os4{}
|
|
var tl = OnePole{}
|
|
var tr = OnePole{}
|
|
var dl = DcBlock{}
|
|
var dr = DcBlock{}
|
|
var pre = 1.0
|
|
var post = 1.0
|
|
|
|
fn block() {
|
|
onepole_set(tl, tone)
|
|
onepole_set(tr, tone)
|
|
pre = exp2(amount * 5.0)
|
|
post = 1.0 / soft_clip(pre)
|
|
}
|
|
|
|
fn shape(x) {
|
|
match int(mode) {
|
|
0 => soft_clip(x),
|
|
1 => hard_clip(x),
|
|
2 => fold(x),
|
|
_ => asym_clip(x, 0.3),
|
|
}
|
|
}
|
|
|
|
fn channel(o, x) {
|
|
for k in 0..4 {
|
|
os4_push(o, shape(os4_up(o, x * pre, k)))
|
|
}
|
|
os4_out(o) * post
|
|
}
|
|
|
|
fn effect(l, r) {
|
|
let yl = dc_block(dl, onepole_lp(tl, channel(os_l, l)))
|
|
let yr = dc_block(dr, onepole_lp(tr, channel(os_r, r)))
|
|
vec2(mix(l, yl * level, blend), mix(r, yr * level, blend))
|
|
}
|