From 5d19069c188e38fc251327569312f27b735db40d Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Thu, 10 Jan 2019 20:25:16 +1100 Subject: Modify circuit to include transformers --- plugins/ZamTube/ZamTubePlugin.cpp | 44 ++++-- plugins/ZamTube/ZamTubePlugin.hpp | 26 +++- plugins/ZamTube/wdfcircuits.h | 299 ++++++++++++++++++++++++++++++++------ 3 files changed, 306 insertions(+), 63 deletions(-) diff --git a/plugins/ZamTube/ZamTubePlugin.cpp b/plugins/ZamTube/ZamTubePlugin.cpp index 23ecc6e..35ec202 100644 --- a/plugins/ZamTube/ZamTubePlugin.cpp +++ b/plugins/ZamTube/ZamTubePlugin.cpp @@ -240,16 +240,30 @@ void ZamTubePlugin::activate() T Fs = getSampleRate(); // Passive components - ci = 1.0e-7; - ri = 1.0e+6; - rg = 2.0e+4; - rk = 1.0e+3; - ck = 1.0e-5; - e = 500.0; - rp = 1.0e+5; - er = rp; - co = 1.0e-8; - ro = 1.0e+6; + ci = 100e-9; + ri = 1e+6; + rg = 20e+3; + rk = 20.; + ck = 10e-6; + e = 500.; + er = 1.; + rp1 = 131.; + rp2 = 9.2e+3; + lp = 7.6; + teen = 28.; + rs1 = 8.; + rs2 = 225.; + ls = 8.2e-3; + cs = 145e-9; + re = 6.95; + le = 690e-6; + temn = 8.3; + rm = 1.; + cm = 27e-3; + lm = 560e-6; + tman = 1./0.0204; + ca = 398e-3; + ra = 122e-6; // 12AX7 triode model RSD-1 v.g = 2.242e-3; @@ -271,7 +285,7 @@ void ZamTubePlugin::activate() v.cg2 = 11.99; v.ig02 = 3.917e-8; - ckt.updateRValues(ci, ck, co, e, er, rg, ri, rk, 1., ro, Fs, v); + ckt.updateRValues(ca, ci, ck, cm, cs, e, le, lm, lp, ls, teen, temn, tman, er, ra, re, rg, ri, rk, rm, rp1, rp2, rs1, rs2, 1000., Fs, v); ckt.warmup_tubes(); fSamplingFreq = Fs; @@ -346,10 +360,10 @@ void ZamTubePlugin::run(const float** inputs, float** outputs, uint32_t frames) // protect against overflowing circuit in = fabs(in) < DANGER ? in : 0.f; - double pregain = from_dB(tubedrive*3.6364); // 0 to +40dB - double ViE = in * pregain * from_dB(15.); // assume in -15dBFS - double postgain = from_dB(mastergain*2. - 8.); - tubeout = ckt.advanc(ViE) * postgain * from_dB(tubedrive) / (2. * e); + double pregain = from_dB(tubedrive*3.6364*2.); //0 to +80dB + double ViE = in * pregain * from_dB(-15.); // assume in -15dBFS + double postgain = from_dB(mastergain*5.); + tubeout = ckt.advanc(ViE) * pregain * postgain / e; //Tone Stack sim fRec0[0] = ((float)tubeout - (fSlow31 * (((fSlow30 * fRec0[1]) + (fSlow29 * fRec0[2])) + (fSlow27 * fRec0[3])))); outputs[0][i] = sanitize_denormal((float)(fSlow31 * ((((fSlow46 * fRec0[0]) + (fSlow45 * fRec0[1])) + (fSlow43 * fRec0[2])) + (fSlow41 * fRec0[3])))); diff --git a/plugins/ZamTube/ZamTubePlugin.hpp b/plugins/ZamTube/ZamTubePlugin.hpp index 45568e5..a0cb994 100644 --- a/plugins/ZamTube/ZamTubePlugin.hpp +++ b/plugins/ZamTube/ZamTubePlugin.hpp @@ -50,15 +50,29 @@ public: Triode v; TubeStageCircuit ckt; T ci; + T ri; + T rg; + T rk; T ck; - T co; T e; T er; - T rp; - T rg; - T ro; - T ri; - T rk; + T rp1; + T rp2; + T lp; + T teen; + T rs1; + T rs2; + T ls; + T cs; + T re; + T le; + T temn; + T rm; + T cm; + T lm; + T tman; + T ca; + T ra; float fConst0; float fConst1; diff --git a/plugins/ZamTube/wdfcircuits.h b/plugins/ZamTube/wdfcircuits.h index a54517b..b2c402d 100644 --- a/plugins/ZamTube/wdfcircuits.h +++ b/plugins/ZamTube/wdfcircuits.h @@ -1,3 +1,5 @@ +//Autogenerated zamtube circuit +//Damien Zammit #ifndef WDFCIRCUITS_H #define WDFCIRCUITS_H #include "glue.h" @@ -6,13 +8,16 @@ class TubeStageCircuit { /*Tube Preamp*/ public: - Triode t; - bool on; - TubeStageCircuit() { Cia = 0.0; Cka = 0.0; - Coa = 0.0; + Lpa = 0.0; + Lsa = 0.0; + Csa = 0.0; + Lea = 0.0; + Cma = 0.0; + Lma = 0.0; + Caa = 0.0; Vk = 0.0; Vg = 0.0; on = false; @@ -29,18 +34,36 @@ public: - void updateRValues(Real C_Ci, Real C_Ck, Real C_Co, Real E_E500, Real R_E500, Real R_Rg, Real R_Ri, Real R_Rk, Real R_Vi, Real R_Ro, Real sampleRate, Triode& tube) { + void updateRValues(Real C_Ca, Real C_Ci, Real C_Ck, Real C_Cm, Real C_Cs, Real E_E500, Real L_Le, Real L_Lm, Real L_Lp, Real L_Ls, Real Tee_pos, Real Tem_pos, Real Tma_pos, Real R_E500, Real R_Ra, Real R_Re, Real R_Rg, Real R_Ri, Real R_Rk, Real R_Rm, Real R_Rp1, Real R_Rp2, Real R_Rs1, Real R_Rs2, Real R_Vi, Real sampleRate, Triode &tube) { t = tube; Real ViR = R_Vi; Real CiR = 1.0 / (2.0*C_Ci*sampleRate); Real RiR = R_Ri; Real RgR = R_Rg; - Real RoR = R_Ro; Real RkR = R_Rk; Real CkR = 1.0 / (2.0*C_Ck*sampleRate); Real E500R = R_E500; E500E = E_E500; - Real CoR = 1.0 / (2.0*C_Co*sampleRate); + Real Rp1R = R_Rp1; + Real Rp2R = R_Rp2; + Real LpR = 2.0*L_Lp*sampleRate; + Teen = 1.0 / Tee_pos; + TeeOneOvern = Tee_pos; + Real Rs1R = R_Rs1; + Real Rs2R = R_Rs2; + Real LsR = 2.0*L_Ls*sampleRate; + Real CsR = 1.0 / (2.0*C_Cs*sampleRate); + Real ReR = R_Re; + Real LeR = 2.0*L_Le*sampleRate; + Temn = 1.0 / Tem_pos; + TemOneOvern = Tem_pos; + Real RmR = R_Rm; + Real CmR = 1.0 / (2.0*C_Cm*sampleRate); + Real LmR = 2.0*L_Lm*sampleRate; + Tman = 1.0 / Tma_pos; + TmaOneOvern = Tma_pos; + Real CaR = 1.0 / (2.0*C_Ca*sampleRate); + Real RaR = R_Ra; Real S0_3R = (CiR + ViR); S0_3Gamma1 = CiR/(CiR + ViR); Assert(S0_3Gamma1 >= 0.0 && S0_3Gamma1 <= 1.0); @@ -56,38 +79,155 @@ public: Real P1_3R = 1.0 /(1.0 / P1_1R + 1.0 / P1_2R); P1_3Gamma1 = 1.0 / P1_1R/(1.0 / P1_1R + 1.0 / P1_2R); Assert(P1_3Gamma1 >= 0.0 && P1_3Gamma1 <= 1.0); - Real S3_3R = (CoR + RoR); - S3_3Gamma1 = CoR/(CoR + RoR); + S7_3Gamma1 = CaR/(CaR + RaR); + Assert(S7_3Gamma1 >= 0.0 && S7_3Gamma1 <= 1.0); + Real TmaR = (CaR + RaR)/(Tman*Tman); + Real P9_1R = TmaR; + Real P9_2R = CmR; + Real P9_3R = 1.0 /(1.0 / P9_1R + 1.0 / P9_2R); + P9_3Gamma1 = 1.0 / P9_1R/(1.0 / P9_1R + 1.0 / P9_2R); + Assert(P9_3Gamma1 >= 0.0 && P9_3Gamma1 <= 1.0); + Real P8_1R = P9_3R; + Real P8_2R = LmR; + Real P8_3R = 1.0 /(1.0 / P8_1R + 1.0 / P8_2R); + P8_3Gamma1 = 1.0 / P8_1R/(1.0 / P8_1R + 1.0 / P8_2R); + Assert(P8_3Gamma1 >= 0.0 && P8_3Gamma1 <= 1.0); + Real P7_1R = P8_3R; + Real P7_2R = RmR; + P7_3Gamma1 = 1.0 / P7_1R/(1.0 / P7_1R + 1.0 / P7_2R); + Assert(P7_3Gamma1 >= 0.0 && P7_3Gamma1 <= 1.0); + Real TemR = 1.0 /(1.0 / P7_1R + 1.0 / P7_2R)/(Temn*Temn); + Real S6_3R = (ReR + LeR); + S6_3Gamma1 = ReR/(ReR + LeR); + Assert(S6_3Gamma1 >= 0.0 && S6_3Gamma1 <= 1.0); + Real S5_3R = (TemR + S6_3R); + S5_3Gamma1 = TemR/(TemR + S6_3R); + Assert(S5_3Gamma1 >= 0.0 && S5_3Gamma1 <= 1.0); + Real P6_1R = CsR; + Real P6_2R = LsR; + Real P6_3R = 1.0 /(1.0 / P6_1R + 1.0 / P6_2R); + P6_3Gamma1 = 1.0 / P6_1R/(1.0 / P6_1R + 1.0 / P6_2R); + Assert(P6_3Gamma1 >= 0.0 && P6_3Gamma1 <= 1.0); + Real P5_1R = P6_3R; + Real P5_2R = Rs2R; + Real P5_3R = 1.0 /(1.0 / P5_1R + 1.0 / P5_2R); + P5_3Gamma1 = 1.0 / P5_1R/(1.0 / P5_1R + 1.0 / P5_2R); + Assert(P5_3Gamma1 >= 0.0 && P5_3Gamma1 <= 1.0); + Real S4_3R = (P5_3R + Rs1R); + S4_3Gamma1 = P5_3R/(P5_3R + Rs1R); + Assert(S4_3Gamma1 >= 0.0 && S4_3Gamma1 <= 1.0); + Real P4_1R = S4_3R; + Real P4_2R = S5_3R; + P4_3Gamma1 = 1.0 / P4_1R/(1.0 / P4_1R + 1.0 / P4_2R); + Assert(P4_3Gamma1 >= 0.0 && P4_3Gamma1 <= 1.0); + Real TeeR = 1.0 /(1.0 / P4_1R + 1.0 / P4_2R)/(Teen*Teen); + Real P3_1R = LpR; + Real P3_2R = Rp2R; + Real P3_3R = 1.0 /(1.0 / P3_1R + 1.0 / P3_2R); + P3_3Gamma1 = 1.0 / P3_1R/(1.0 / P3_1R + 1.0 / P3_2R); + Assert(P3_3Gamma1 >= 0.0 && P3_3Gamma1 <= 1.0); + Real S3_3R = (P3_3R + Rp1R); + S3_3Gamma1 = P3_3R/(P3_3R + Rp1R); Assert(S3_3Gamma1 >= 0.0 && S3_3Gamma1 <= 1.0); Real P2_1R = S3_3R; - Real P2_2R = E500R; + Real P2_2R = TeeR; Real P2_3R = 1.0 /(1.0 / P2_1R + 1.0 / P2_2R); P2_3Gamma1 = 1.0 / P2_1R/(1.0 / P2_1R + 1.0 / P2_2R); Assert(P2_3Gamma1 >= 0.0 && P2_3Gamma1 <= 1.0); - S2_3Gamma1 = P1_3R/(P1_3R + P2_3R); + Real S2_3R = (P2_3R + E500R); + S2_3Gamma1 = P2_3R/(P2_3R + E500R); Assert(S2_3Gamma1 >= 0.0 && S2_3Gamma1 <= 1.0); - } + S8_3Gamma1 = S2_3R/(S2_3R + P1_3R); + Assert(S8_3Gamma1 >= 0.0 && S8_3Gamma1 <= 1.0); + } - Real advanc(Real ViE) { - Real fudge = 0.997; // Critical to make Vk = ~2V when -15dbFS sine wave is input + Real advanc(Real ViE){ + Real fudge = 0.997; //Get Bs + //S8_3GetB + //S2_3GetB + //P2_3GetB + //S3_3GetB + //P3_3GetB + Real Lpb = -Lpa; + //P3_1SetA + //Rp2GetB + //P3_2SetA + Real P3_3b3 = -P3_3Gamma1*(-Lpb); + //S3_1SetA + //Rp1GetB + //S3_2SetA + Real S3_3b3 = -(P3_3b3); + //P2_1SetA + //TeeGetB + //P4_3GetB + //S4_3GetB + //P5_3GetB + //P6_3GetB + Real Csb = Csa; + //P6_1SetA + Real Lsb = -Lsa; + //P6_2SetA + Real P6_3b3 = Lsb - P6_3Gamma1*(Lsb - Csb); + //P5_1SetA + //Rs2GetB + //P5_2SetA + Real P5_3b3 = -P5_3Gamma1*(-P6_3b3); + //S4_1SetA + //Rs1GetB + //S4_2SetA + Real S4_3b3 = -(P5_3b3); + //P4_1SetA + //S5_3GetB + //TemGetB + //P7_3GetB + //P8_3GetB + //P9_3GetB + //TmaGetB + //S7_3GetB + Real Cab = Caa; + //S7_1SetA + //RaGetB + //S7_2SetA + Real S7_3b3 = -(Cab); + //P9_1SetA + Real Cmb = Cma; + //P9_2SetA + Real P9_3b3 = Cmb - P9_3Gamma1*(Cmb - S7_3b3*TmaOneOvern); + //P8_1SetA + Real Lmb = -Lma; + //P8_2SetA + Real P8_3b3 = Lmb - P8_3Gamma1*(Lmb - P9_3b3); + //P7_1SetA + //RmGetB + //P7_2SetA + Real P7_3b3 = -P7_3Gamma1*(-P8_3b3); + //S5_1SetA + //S6_3GetB + //ReGetB + //S6_1SetA + Real Leb = -Lea; + //S6_2SetA + Real S6_3b3 = -(Leb); + //S5_2SetA + Real S5_3b3 = -(P7_3b3*TemOneOvern + S6_3b3); + //P4_2SetA + Real P4_3b3 = S5_3b3 - P4_3Gamma1*(S5_3b3 - S4_3b3); + //P2_2SetA + Real P2_3b3 = P4_3b3*TeeOneOvern - P2_3Gamma1*(P4_3b3*TeeOneOvern - S3_3b3); + //S2_1SetA + //E500GetB + //S2_2SetA + Real S2_3b3 = -(P2_3b3 + E500E); + //S8_1SetA //P1_3GetB Real Ckb = Cka; //P1_1SetA //RkGetB //P1_2SetA Real P1_3b3 = -fudge*P1_3Gamma1*(-Ckb); - Real Cob = Coa; - //S3_1SetA - //RoGetB - //S3_2SetA - Real S3_3b3 = -(Cob); - //P2_1SetA - //E500GetB - //P2_2SetA - Real P2_3b3 = E500E - fudge*P2_3Gamma1*(E500E - S3_3b3); - //S2_2SetA - Real S2_3b3 = -(P1_3b3 + P2_3b3); + //S8_2SetA + Real S8_3b3 = -(S2_3b3 + P1_3b3); //S1_3GetB //RgGetB //S1_1SetA @@ -104,49 +244,124 @@ public: Real P0_3b3 = -P0_3Gamma1*(-S0_3b3); //S1_2SetA Real S1_3b3 = -(P0_3b3); - //Call tube model + //P1_3GetB Vg = -S1_3b3; - Real b = t.compute(-S2_3b3, S2_3Gamma1, Vg-Vk, Vk); + //Call tube model + Real b = t.compute(S8_3b3, S8_3Gamma1, Vg-Vk, Vk); //Set As + //S8_3SetA + Real S8_3b1 = S2_3b3 - S8_3Gamma1*(S2_3b3 + P1_3b3 + b); //S2_3SetA - Real S2_3b1 = P1_3b3 - S2_3Gamma1*(P1_3b3 + P2_3b3 + b); + Real S2_3b1 = P2_3b3 - S2_3Gamma1*(P2_3b3 + E500E + S8_3b1); + //P2_3SetA + Real P2_3b1 = S2_3b1 + P4_3b3*TeeOneOvern - S3_3b3 - P2_3Gamma1*(P4_3b3*TeeOneOvern - S3_3b3); + //S3_3SetA + Real S3_3b1 = P3_3b3 - S3_3Gamma1*(P3_3b3 + P2_3b1); + //P3_3SetA + Real P3_3b1 = S3_3b1 - Lpb - P3_3Gamma1*(-Lpb); + Lpa = P3_3b1; + //Rp2SetA + //Rp1SetA + Real P2_3b2 = S2_3b1 - P2_3Gamma1*(P4_3b3*TeeOneOvern - S3_3b3); + //TeeSetA + //P4_3SetA + Real P4_3b1 = P2_3b2*Teen + S5_3b3 - S4_3b3 - P4_3Gamma1*(S5_3b3 - S4_3b3); + //S4_3SetA + Real S4_3b1 = P5_3b3 - S4_3Gamma1*(P5_3b3 + P4_3b1); + //P5_3SetA + Real P5_3b1 = S4_3b1 - P6_3b3 - P5_3Gamma1*(-P6_3b3); + //P6_3SetA + Real P6_3b1 = P5_3b1 + Lsb - Csb - P6_3Gamma1*(Lsb - Csb); + Csa = P6_3b1; + Real P6_3b2 = P5_3b1 - P6_3Gamma1*(Lsb - Csb); + Lsa = P6_3b2; + //Rs2SetA + //Rs1SetA + Real P4_3b2 = P2_3b2*Teen - P4_3Gamma1*(S5_3b3 - S4_3b3); + //S5_3SetA + Real S5_3b1 = P7_3b3*TemOneOvern - S5_3Gamma1*(P7_3b3*TemOneOvern + S6_3b3 + P4_3b2); + //TemSetA + //P7_3SetA + Real P7_3b1 = S5_3b1*Temn - P8_3b3 - P7_3Gamma1*(-P8_3b3); + //P8_3SetA + Real P8_3b1 = P7_3b1 + Lmb - P9_3b3 - P8_3Gamma1*(Lmb - P9_3b3); + //P9_3SetA + Real P9_3b1 = P8_3b1 + Cmb - S7_3b3*TmaOneOvern - P9_3Gamma1*(Cmb - S7_3b3*TmaOneOvern); + //TmaSetA + //S7_3SetA + Real S7_3b1 = Cab - S7_3Gamma1*(Cab + P9_3b1*Tman); + Caa = S7_3b1; + Real S7_3b2 = Cab + P9_3b1*Tman - S7_3Gamma1*(Cab + P9_3b1*Tman); + //RaSetA + Real Raa = S7_3b2; + Real P9_3b2 = P8_3b1 - P9_3Gamma1*(Cmb - S7_3b3*TmaOneOvern); + Cma = P9_3b2; + Real P8_3b2 = P7_3b1 - P8_3Gamma1*(Lmb - P9_3b3); + Lma = P8_3b2; + //RmSetA + Real S5_3b2 = P7_3b3*TemOneOvern + P4_3b2 - S5_3Gamma1*(P7_3b3*TemOneOvern + S6_3b3 + P4_3b2); + //S6_3SetA + Real S6_3b1 = -S6_3Gamma1*(Leb + S5_3b2); + //ReSetA + Real Rea = S6_3b1; + Real S6_3b2 = S5_3b2 - S6_3Gamma1*(Leb + S5_3b2); + Lea = S6_3b2; + Real S8_3b2 = S2_3b3 + b - S8_3Gamma1*(S2_3b3 + P1_3b3 + b); //P1_3SetA - Real P1_3b1 = S2_3b1 - Ckb - P1_3Gamma1*(-Ckb); + Real P1_3b1 = S8_3b2 - Ckb - P1_3Gamma1*(-Ckb); Cka = P1_3b1; //RkSetA - Real S2_3b2 = P1_3b3 + b - S2_3Gamma1*(P1_3b3 + P2_3b3 + b); - //P2_3SetA - Real P2_3b1 = S2_3b2 + E500E - S3_3b3 - P2_3Gamma1*(E500E - S3_3b3); - //S3_3SetA - Real S3_3b1 = Cob - S3_3Gamma1*(Cob + P2_3b1); - Coa = S3_3b1; - Real S3_3b2 = Cob + P2_3b1 - S3_3Gamma1*(Cob + P2_3b1); - //RoSetA - Real Roa = S3_3b2; Vk = -P1_3b3; - //printf("Vk=%f Vg=%f Vpk(b)=%f(%f) in=%f out=%f\n", Vk,Vg,P2_3b3,b, ViE,Roa); - return (Roa); + return Raa; } + Triode t; + bool on; private: //State variables - Real Coa; Real Cia; Real Cka; + Real Lpa; + Real Lsa; + Real Csa; + Real Lea; + Real Cma; + Real Lma; + Real Caa; Real Vk; Real Vg; //R values + Real S8_3Gamma1; Real P3_3Gamma1; Real P0_3Gamma1; + Real P9_3Gamma1; + Real P6_3Gamma1; + Real Teen; + Real TmaOneOvern; + Real P7_3Gamma1; + Real P4_3Gamma1; + Real TemOneOvern; Real S1_3Gamma1; Real S3_3Gamma1; + Real S4_3Gamma1; + Real S7_3Gamma1; Real P1_3Gamma1; - Real ViE; + Real TeeOneOvern; Real S0_3Gamma1; Real S2_3Gamma1; + Real S6_3Gamma1; Real P2_3Gamma1; + Real P5_3Gamma1; + Real Temn; + Real Tman; + Real P8_3Gamma1; + Real S5_3Gamma1; Real E500E; }; + + + #endif + -- cgit v1.2.3