--- releases/caps-0.9.24/Saturate.h 2014-11-10 08:56:20.000000000 +0100 +++ Saturate.h 2016-09-14 06:50:45.031674258 +0200 @@ -1,7 +1,7 @@ /* Saturate.h - Copyright 2004-13 Tim Goetze + Copyright 2004-16 Tim Goetze http://quitte.de/dsp/ @@ -90,6 +90,8 @@ public: Splitter split[2]; DSP::IIR2 shape[2]; + struct {float lo, hi;} vol; + DSP::ChebPoly<5> cheby; uint remain; @@ -112,6 +114,8 @@ Splitter split[2]; DSP::IIR2 shape[2]; } chan[2]; + struct {float lo, hi;} vol; + DSP::ChebPoly<5> cheby; uint remain; --- releases/caps-0.9.24/Saturate.cc 2014-11-10 09:52:25.000000000 +0100 +++ Saturate.cc 2016-09-13 18:08:36.348934794 +0200 @@ -1,7 +1,7 @@ /* Saturate.cc - Copyright 2003-13 Tim Goetze + Copyright 2003-16 Tim Goetze http://quitte.de/dsp/ @@ -222,7 +222,7 @@ Spice::init() { float amps[] = {0,0,1,.3,.01}; - cheby.calculate (amps); + cheby.calculate(amps); } void @@ -235,7 +235,7 @@ split[i].reset(); shape[i].reset(); } - compress.init(fs); + compress.init(fs,32); compress.set_threshold(0); compress.set_attack(0); compress.set_release(0); @@ -244,19 +244,23 @@ void Spice::cycle (uint frames) { - struct { float f, squash, gain; } - lo = {getport(0)*over_fs, getport(1), getport(2)}, - hi = {getport(3)*over_fs, 0, getport(4)}; + struct { float f, squash, gain, vol; } + lo = {getport(0)*over_fs, getport(1), getport(2), getport(3)}, + hi = {getport(4)*over_fs, 0, getport(5), getport(6)}; - if (split[0].f != lo.f) + if (split[0].f != lo.f || lo.vol != vol.lo) { + vol.lo = lo.vol; split[0].set_f(lo.f); DSP::RBJ::BP (2*lo.f,.7,shape[0]); + shape[0].scale(db2lin(vol.lo)); } - if (split[1].f != hi.f) + if (split[1].f != hi.f || hi.vol != vol.hi) { + vol.hi = hi.vol; split[1].set_f(hi.f); DSP::RBJ::HP (2*hi.f,.7,shape[1]); + shape[1].scale(db2lin(vol.hi)); } lo.gain = pow (24,lo.gain) - 1; @@ -264,8 +268,8 @@ sample_t dc = cheby.process(0); - sample_t * s = ports[5]; - sample_t * d = ports[6]; + sample_t * s = ports[7]; + sample_t * d = ports[8]; while (frames) { @@ -315,11 +319,13 @@ PortInfo Spice::port_info [] = { - { "lo.f (Hz)", CTRL_IN, {LOG | DEFAULT_MID, 50, 400}}, + { "lo.f (Hz)", CTRL_IN, {LOG | DEFAULT_LOW, 50, 800}}, { "lo.compress", CTRL_IN, {DEFAULT_MID, 0, 1}}, { "lo.gain", CTRL_IN, {DEFAULT_LOW, 0, 1}}, - { "hi.f (Hz)", CTRL_IN | GROUP, {LOG | DEFAULT_MID, 400, 5000}}, + { "lo.vol (dB)", CTRL_IN, {DEFAULT_0, -60, 60}}, + { "hi.f (Hz)", CTRL_IN | GROUP, {LOG | DEFAULT_LOW, 400, 5000}}, { "hi.gain", CTRL_IN, {DEFAULT_LOW, 0, 1}}, + { "hi.vol (dB)", CTRL_IN, {DEFAULT_0, -60, 60}}, { "in", INPUT | AUDIO }, { "out", OUTPUT | AUDIO }, @@ -358,7 +364,7 @@ chan[c].split[i].reset(); chan[c].shape[i].reset(); } - compress.init(fs); + compress.init(fs,64); compress.set_threshold(0); compress.set_attack(0); compress.set_release(0); @@ -367,34 +373,38 @@ void SpiceX2::cycle (uint frames) { - struct { float f, squash, gain; } - lo = {getport(0)*over_fs, getport(1), getport(2)}, - hi = {getport(3)*over_fs, 0, getport(4)}; + struct { float f, squash, gain, vol; } + lo = {getport(0)*over_fs, getport(1), getport(2), getport(3)}, + hi = {getport(4)*over_fs, 0, getport(5), getport(6)}; - if (chan[0].split[0].f != lo.f) + if (chan[0].split[0].f != lo.f || lo.vol != vol.lo) { + vol.lo = lo.vol; for (int c=0; c<2; ++c) { chan[c].split[0].set_f(lo.f); DSP::RBJ::BP (2*lo.f,.7,chan[c].shape[0]); + chan[c].shape[0].scale(db2lin(vol.lo)); } } - if (chan[0].split[1].f != hi.f) + if (chan[0].split[1].f != hi.f || hi.vol != vol.hi) { + vol.hi = hi.vol; for (int c=0; c<2; ++c) { chan[c].split[1].set_f(hi.f); DSP::RBJ::BP (2*hi.f,.7,chan[c].shape[1]); + chan[c].shape[1].scale(db2lin(vol.hi)); } } - lo.gain = pow (24,lo.gain) - 1; - hi.gain = pow (8,hi.gain) - 1; + lo.gain = pow(24,lo.gain) - 1; + hi.gain = pow(8,hi.gain) - 1; sample_t dc = cheby.process(0); - sample_t * s[2] = {ports[5],ports[6]}; - sample_t * d[2] = {ports[7],ports[8]}; + sample_t * s[2] = {ports[7],ports[8]}; + sample_t * d[2] = {ports[9],ports[10]}; while (frames) { @@ -452,8 +462,10 @@ { "lo.f (Hz)", CTRL_IN, {LOG | DEFAULT_LOW, 50, 800}}, { "lo.compress", CTRL_IN, {DEFAULT_MID, 0, 1}}, { "lo.gain", CTRL_IN, {DEFAULT_LOW, 0, 1}}, + { "lo.vol (dB)", CTRL_IN, {DEFAULT_0, -60, 60}}, { "hi.f (Hz)", CTRL_IN | GROUP, {LOG | DEFAULT_LOW, 400, 5000}}, { "hi.gain", CTRL_IN, {DEFAULT_LOW, 0, 1}}, + { "hi.vol (dB)", CTRL_IN, {DEFAULT_0, -60, 60}}, { "in:l", INPUT | AUDIO }, { "in:r", INPUT | AUDIO },