summaryrefslogtreecommitdiff
path: root/plugins/ZamTube/ZamTubePlugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/ZamTube/ZamTubePlugin.cpp')
-rw-r--r--plugins/ZamTube/ZamTubePlugin.cpp55
1 files changed, 30 insertions, 25 deletions
diff --git a/plugins/ZamTube/ZamTubePlugin.cpp b/plugins/ZamTube/ZamTubePlugin.cpp
index 719a2ae..81f8587 100644
--- a/plugins/ZamTube/ZamTubePlugin.cpp
+++ b/plugins/ZamTube/ZamTubePlugin.cpp
@@ -78,7 +78,7 @@ void ZamTubePlugin::initParameter(uint32_t index, Parameter& parameter)
switch (index)
{
case paramTubedrive:
- parameter.hints = kParameterIsAutomable | kParameterIsLogarithmic;
+ parameter.hints = kParameterIsAutomable;
parameter.name = "Tube Drive";
parameter.symbol = "tubedrive";
parameter.unit = " ";
@@ -127,8 +127,8 @@ void ZamTubePlugin::initParameter(uint32_t index, Parameter& parameter)
parameter.name = "Output level";
parameter.symbol = "gain";
parameter.unit = " ";
- parameter.ranges.def = 0.0f;
- parameter.ranges.min = -30.0f;
+ parameter.ranges.def = 15.0f;
+ parameter.ranges.min = 0.0f;
parameter.ranges.max = 30.0f;
break;
case paramInsane:
@@ -136,7 +136,7 @@ void ZamTubePlugin::initParameter(uint32_t index, Parameter& parameter)
parameter.name = "Quality Insane";
parameter.symbol = "insane";
parameter.unit = " ";
- parameter.ranges.def = 1.0f;
+ parameter.ranges.def = 0.0f;
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
break;
@@ -223,9 +223,9 @@ void ZamTubePlugin::loadProgram(uint32_t index)
middle = 5.f;
treble = 5.f;
tonestack = 0.0f;
- mastergain = 0.0f;
- insane = 1.0f;
- insaneold = 1.0f;
+ mastergain = 15.0f;
+ insane = 0.0f;
+ insaneold = 0.0f;
/* Default variable values */
@@ -251,7 +251,7 @@ void ZamTubePlugin::activate()
co[0] = 10e-9;
ro[0] = 1e+6;
- /* Matt's preamp */
+ /* Matt's preamp
ci[1] = 100e-9;
rg[1] = 1.;
rk[1] = 820.;
@@ -260,6 +260,7 @@ void ZamTubePlugin::activate()
er[1] = 120e+3;
co[1] = 4.7e-9;
ro[1] = 470e+3;
+ */
/* CLA's preamp
ci[1] = 1.0e-7;
@@ -273,8 +274,9 @@ void ZamTubePlugin::activate()
*/
int pre = 0;
- ckt.updateRValues(ci[pre], ck[pre], co[pre], e[pre], er[pre], rg[pre], 0., rk[pre], 136e+3, ro[pre], Fs, v);
- ckt.t.insane = insane;
+ float volumepot = 1e+6;
+ ckt.on = false;
+ ckt.updateRValues(ci[pre], ck[pre], co[pre], e[pre], er[pre], rg[pre], volumepot, rk[pre], 136e+3, ro[pre], Fs, v);
ckt.warmup_tubes();
fSamplingFreq = Fs;
@@ -282,7 +284,19 @@ void ZamTubePlugin::activate()
fConst0 = (2 * float(MIN(192000, MAX(1, fSamplingFreq))));
fConst1 = faustpower<2>(fConst0);
fConst2 = (3 * fConst0);
- for (int i=0; i<4; i++) fRec0[i] = 0;
+ fRec0[3] = 0.f;
+ fRec0[2] = 0.f;
+ fRec0[1] = 0.f;
+ fRec0[0] = 0.f;
+}
+
+void ZamTubePlugin::deactivate()
+{
+ ckt.warmup_tubes();
+ fRec0[3] = 0.f;
+ fRec0[2] = 0.f;
+ fRec0[1] = 0.f;
+ fRec0[0] = 0.f;
}
void ZamTubePlugin::run(const float** inputs, float** outputs, uint32_t frames)
@@ -339,23 +353,14 @@ void ZamTubePlugin::run(const float** inputs, float** outputs, uint32_t frames)
float tubeout = 0.f;
- if (insane != insaneold) {
- ckt.reset_tubes();
- ckt.warmup_tubes();
- fRec0[3] = fRec0[2] = fRec0[1] = fRec0[0] = 0.f;
- insaneold = insane;
- }
- int pre = insane < 0.5 ? 0 : 1;
- float volumepot = tubedrive / 11. * 1e+6;
- ckt.updateRValues(ci[pre], ck[pre], co[pre], e[pre], er[pre], rg[pre], volumepot, rk[pre], 136e+3, ro[pre], getSampleRate(), v);
+ float cut = insane ? 0. : -15.;
+ float pregain = from_dB(tubedrive*3.6364 + cut);
+ float postgain = from_dB(mastergain + 36.*(1. - tubedrive/11.));
- double pregain = from_dB(tubedrive*3.6364 + 15.);
- double postgain = from_dB(mastergain*3.) / e[pre];
-
for (uint32_t i = 0; i < frames; ++i) {
//Step 1: read input sample as voltage for the source
- double in = inputs[0][i] * pregain;
+ float in = inputs[0][i] * pregain;
// protect against overflowing circuit
in = fabs(in) < DANGER ? in : 0.f;
@@ -363,7 +368,7 @@ void ZamTubePlugin::run(const float** inputs, float** outputs, uint32_t frames)
tubeout = ckt.advanc(in) * postgain;
//Tone Stack (post tube)
- fRec0[0] = ((float)tubeout - (fSlow31 * (((fSlow30 * fRec0[1]) + (fSlow29 * fRec0[2])) + (fSlow27 * fRec0[3]))));
+ fRec0[0] = ((float)tubeout - (fSlow31 * (((fSlow30 * fRec0[1]) + (fSlow29 * fRec0[2])) + (fSlow27 * fRec0[3])))) + 1e-20;
outputs[0][i] = sanitize_denormal((float)(fSlow31 * ((((fSlow46 * fRec0[0]) + (fSlow45 * fRec0[1])) + (fSlow43 * fRec0[2])) + (fSlow41 * fRec0[3]))));
// update filter states