1/*
2 * Simulation of Marshall JCM-800 Low-gain input
3 *
4 * This file is part of tamgamp.lv2 <https://github.com/sadko4u/tamgamp.lv2>.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 3 of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20declare id "marshall_jcm800lo";
21declare name "marshall_jcm800lo";
22declare samplerate "96000";
23
24import("stdfaust.lib");
25import("amp_sim.lib");
26
27p2 =
28    fi.iir((b0/a0,b1/a0,b2/a0),(a1/a0,a2/a0)) :
29    s02_stage2clip
30
31    with {
32        fs = float(ma.SR);
33        LogPot(a, x) = ba.if(a, (exp(a * x) - 1) / (exp(a) - 1), x);
34
35        gain = ampctrl.gain : LogPot(3.0) : si.smooth(0.999);
36
37        b0 = gain*(fs*gain*(1.18724587211056e-8*fs + 2.68729260323803e-5) + fs*(-1.18724587211056e-8*fs - 3.28091553929331e-5) - 0.0134364630161901);
38        b1 = gain*(-2.37449174422112e-8*pow(fs,2)*gain + 2.37449174422112e-8*pow(fs,2) - 0.0268729260323803);
39        b2 = gain*(fs*gain*(1.18724587211056e-8*fs - 2.68729260323803e-5) + fs*(-1.18724587211056e-8*fs + 3.28091553929331e-5) - 0.0134364630161901);
40
41        a0 = 2.38987184143621e-6*fs + gain*(fs*gain*(-1.52821736799322e-9*fs - 3.45907054774382e-6) + fs*(1.52821736799322e-9*fs + 1.83330739030423e-6)) + 0.00254241685259171;
42        a1 = gain*(3.05643473598644e-9*pow(fs,2)*gain - 3.05643473598644e-9*pow(fs,2)) + 0.00508483370518342;
43        a2 = -2.38987184143621e-6*fs + gain*(fs*gain*(-1.52821736799322e-9*fs + 3.45907054774382e-6) + fs*(1.52821736799322e-9*fs - 1.83330739030423e-6)) + 0.00254241685259171;
44    };
45
46s02_stage2clip =
47    _<:
48        ba.if(signbit(_), s02_stage2_neg_clip, s02_stage2_clip)
49    :>_
50
51    with {
52        signbit = ffunction(int signbit(float), "math.h", "");
53        s02_stage2_clip = ffunction(float s02_stage2clip(float), "generated/stage/marshall_jcm800lo/s02_stage2_table.h", "");
54        s02_stage2_neg_clip = ffunction(float s02_stage2_negclip(float), "generated/stage/marshall_jcm800lo/s02_stage2_neg_table.h", "");
55    };
56
57p3 =
58    fi.iir((b0/a0,b1/a0),(a1/a0)) :
59    s03_stage3clip
60    with {
61        fs = float(ma.SR);
62
63        b0 = -0.000807713873033297*fs - 1.8282342078617;
64        b1 = 0.000807713873033297*fs - 1.8282342078617;
65
66        a0 = 1.90378516271373e-5*fs + 0.0861831218974076;
67        a1 = -1.90378516271373e-5*fs + 0.0861831218974076;
68    };
69
70s03_stage3clip =
71    _<:
72        ba.if(signbit(_), s03_stage3_neg_clip, s03_stage3_clip)
73    :>_
74
75    with {
76        signbit = ffunction(int signbit(float), "math.h", "");
77        s03_stage3_clip = ffunction(float s03_stage3clip(float), "generated/stage/marshall_jcm800lo/s03_stage3_table.h", "");
78        s03_stage3_neg_clip = ffunction(float s03_stage3_negclip(float), "generated/stage/marshall_jcm800lo/s03_stage3_neg_table.h", "");
79    };
80
81p4 =
82    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0),(a1/a0,a2/a0,a3/a0))
83    with {
84        fs = float(ma.SR);
85        LogPot(a, x) = ba.if(a, (exp(a * x) - 1) / (exp(a) - 1), x);
86
87        bass   = ampctrl.bass : LogPot(10) : si.smooth(0.999);
88        middle = ampctrl.middle : si.smooth(0.999);
89        treble = ampctrl.treble : si.smooth(0.999) ;
90        master = ampctrl.master : si.smooth(0.999);
91
92        b0 = master*(bass*(bass*(-5.40199666291365e-12*pow(fs,3)*treble + pow(fs,2)*middle*(-4.14153077490047e-12*fs - 1.77865988241706e-8) + fs*(-4.83649838966099e-9*fs - 1.83745855621597e-5)) + fs*(-2.12805929145083e-10*fs - 8.08481764735027e-7) + middle*(pow(fs,2)*middle*(1.82227354095621e-13*fs + 7.82610348263506e-10) + fs*(fs*(-1.82227354095621e-13*fs - 7.58055817977535e-10) + 8.45541676514158e-9)) + treble*(2.37687853168201e-13*pow(fs,3)*middle + fs*(fs*(-2.37687853168201e-13*fs - 2.45545302859712e-10) - 8.45541676514158e-8))) + fs*(-2.34086522059592e-12*fs - 8.8932994120853e-9) + middle*(fs*(fs*(-2.00450089505183e-15*fs - 8.0685141646072e-12) + 1.86019168833115e-10) + middle*(pow(fs,2)*middle*(-2.00450089505183e-15*fs - 8.60871383089857e-12) + fs*(fs*(4.00900179010365e-15*fs + 1.90180932161017e-11) + 8.70728024325218e-9))) + treble*(fs*(fs*(-2.61456638485021e-15*fs - 5.40199666291365e-12) - 1.86019168833115e-9) + middle*(-2.61456638485021e-15*pow(fs,3)*middle + fs*(fs*(5.22913276970042e-15*fs + 5.40199666291365e-12) + 1.86019168833115e-9))));
93        b1 = master*(bass*(bass*(1.6205989988741e-11*pow(fs,3)*treble + pow(fs,2)*middle*(1.24245923247014e-11*fs + 1.77865988241706e-8) + fs*(4.83649838966099e-9*fs - 1.83745855621597e-5)) + fs*(2.12805929145083e-10*fs - 8.08481764735027e-7) + middle*(pow(fs,2)*middle*(-5.46682062286862e-13*fs - 7.82610348263506e-10) + fs*(fs*(5.46682062286862e-13*fs + 7.58055817977535e-10) + 8.45541676514158e-9)) + treble*(-7.13063559504602e-13*pow(fs,3)*middle + fs*(fs*(7.13063559504602e-13*fs + 2.45545302859712e-10) - 8.45541676514158e-8))) + fs*(2.34086522059592e-12*fs - 8.8932994120853e-9) + middle*(fs*(fs*(6.01350268515548e-15*fs + 8.0685141646072e-12) + 1.86019168833115e-10) + middle*(pow(fs,2)*middle*(6.01350268515548e-15*fs + 8.60871383089857e-12) + fs*(fs*(-1.2027005370311e-14*fs - 1.90180932161017e-11) + 8.70728024325218e-9))) + treble*(fs*(fs*(7.84369915455063e-15*fs + 5.40199666291365e-12) - 1.86019168833115e-9) + middle*(7.84369915455063e-15*pow(fs,3)*middle + fs*(fs*(-1.56873983091013e-14*fs - 5.40199666291365e-12) + 1.86019168833115e-9))));
94        b2 = master*(bass*(bass*(-1.6205989988741e-11*pow(fs,3)*treble + pow(fs,2)*middle*(-1.24245923247014e-11*fs + 1.77865988241706e-8) + fs*(4.83649838966099e-9*fs + 1.83745855621597e-5)) + fs*(2.12805929145083e-10*fs + 8.08481764735027e-7) + middle*(pow(fs,2)*middle*(5.46682062286862e-13*fs - 7.82610348263506e-10) + fs*(fs*(-5.46682062286862e-13*fs + 7.58055817977535e-10) - 8.45541676514158e-9)) + treble*(7.13063559504602e-13*pow(fs,3)*middle + fs*(fs*(-7.13063559504602e-13*fs + 2.45545302859712e-10) + 8.45541676514158e-8))) + fs*(2.34086522059592e-12*fs + 8.8932994120853e-9) + middle*(fs*(fs*(-6.01350268515548e-15*fs + 8.0685141646072e-12) - 1.86019168833115e-10) + middle*(pow(fs,2)*middle*(-6.01350268515548e-15*fs + 8.60871383089857e-12) + fs*(fs*(1.2027005370311e-14*fs - 1.90180932161017e-11) - 8.70728024325218e-9))) + treble*(fs*(fs*(-7.84369915455063e-15*fs + 5.40199666291365e-12) + 1.86019168833115e-9) + middle*(-7.84369915455063e-15*pow(fs,3)*middle + fs*(fs*(1.56873983091013e-14*fs - 5.40199666291365e-12) - 1.86019168833115e-9))));
95        b3 = master*(bass*(bass*(5.40199666291365e-12*pow(fs,3)*treble + pow(fs,2)*middle*(4.14153077490047e-12*fs - 1.77865988241706e-8) + fs*(-4.83649838966099e-9*fs + 1.83745855621597e-5)) + fs*(-2.12805929145083e-10*fs + 8.08481764735027e-7) + middle*(pow(fs,2)*middle*(-1.82227354095621e-13*fs + 7.82610348263506e-10) + fs*(fs*(1.82227354095621e-13*fs - 7.58055817977535e-10) - 8.45541676514158e-9)) + treble*(-2.37687853168201e-13*pow(fs,3)*middle + fs*(fs*(2.37687853168201e-13*fs - 2.45545302859712e-10) + 8.45541676514158e-8))) + fs*(-2.34086522059592e-12*fs + 8.8932994120853e-9) + middle*(fs*(fs*(2.00450089505183e-15*fs - 8.0685141646072e-12) - 1.86019168833115e-10) + middle*(pow(fs,2)*middle*(2.00450089505183e-15*fs - 8.60871383089857e-12) + fs*(fs*(-4.00900179010365e-15*fs + 1.90180932161017e-11) - 8.70728024325218e-9))) + treble*(fs*(fs*(2.61456638485021e-15*fs - 5.40199666291365e-12) + 1.86019168833115e-9) + middle*(2.61456638485021e-15*pow(fs,3)*middle + fs*(fs*(-5.22913276970042e-15*fs + 5.40199666291365e-12) - 1.86019168833115e-9))));
96
97        a0 = bass*(fs*middle*(fs*(8.52074940296914e-15*fs + 3.68862555090236e-11) + 7.91570931204744e-10) + fs*(fs*(1.08039933258273e-14*fs + 6.24077688445545e-11) + 3.92929922532365e-8) + treble*(pow(fs,2)*middle*(1.3468978346198e-15*fs + 7.49870974548878e-12) + fs*(fs*(2.37687853168201e-15*fs + 1.26394880011049e-11) + 7.74660097674461e-9) + treble*(-1.58458568778801e-15*pow(fs,3)*middle + pow(fs,2)*(-2.37687853168201e-15*fs - 1.63696868573141e-12))) + 8.17738565294157e-7) + fs*(fs*(2.37687853168201e-16*fs + 1.86406152029962e-12) + 3.40826695848827e-9) + middle*(fs*middle*(fs*(-1.87456486865321e-16*fs - 8.1149762119852e-13) - 1.74145604865044e-11) + fs*(fs*(-5.02313663028798e-17*fs - 1.74166502337627e-13) + 8.08985491691248e-10)) + treble*(fs*(fs*(5.22913276970042e-17*fs + 3.8610866928258e-13) + 7.30065869850135e-10) + middle*(pow(fs,2)*middle*(-2.96317523616357e-17*fs - 1.64971614400753e-13) + fs*(fs*(-2.26595753353685e-17*fs - 5.18744927771992e-14) + 1.74145604865044e-10)) + treble*(fs*(fs*(-5.22913276970042e-17*fs - 1.44053244344364e-13) - 3.7203833766623e-11) + middle*(3.48608851313361e-17*pow(fs,3)*middle + pow(fs,2)*(1.74304425656681e-17*fs - 3.6013311086091e-14))) + 1.79902484364715e-7) + 8.35728813730628e-7;
98        a1 = bass*(fs*middle*(fs*(-2.55622482089074e-14*fs - 3.68862555090236e-11) + 7.91570931204744e-10) + fs*(fs*(-3.24119799774819e-14*fs - 6.24077688445545e-11) + 3.92929922532365e-8) + treble*(pow(fs,2)*middle*(-4.04069350385941e-15*fs - 7.49870974548878e-12) + fs*(fs*(-7.13063559504602e-15*fs - 1.26394880011049e-11) + 7.74660097674461e-9) + treble*(4.75375706336402e-15*pow(fs,3)*middle + pow(fs,2)*(7.13063559504602e-15*fs + 1.63696868573141e-12))) + 2.45321569588247e-6) + fs*(fs*(-7.13063559504602e-16*fs - 1.86406152029962e-12) + 3.40826695848827e-9) + middle*(fs*middle*(fs*(5.62369460595963e-16*fs + 8.1149762119852e-13) - 1.74145604865044e-11) + fs*(fs*(1.50694098908639e-16*fs + 1.74166502337627e-13) + 8.08985491691248e-10)) + treble*(fs*(fs*(-1.56873983091013e-16*fs - 3.8610866928258e-13) + 7.30065869850135e-10) + middle*(pow(fs,2)*middle*(8.88952570849071e-17*fs + 1.64971614400753e-13) + fs*(fs*(6.79787260061054e-17*fs + 5.18744927771992e-14) + 1.74145604865044e-10)) + treble*(fs*(fs*(1.56873983091013e-16*fs + 1.44053244344364e-13) - 3.7203833766623e-11) + middle*(-1.04582655394008e-16*pow(fs,3)*middle + pow(fs,2)*(-5.22913276970042e-17*fs + 3.6013311086091e-14))) + 5.39707453094144e-7) + 2.50718644119189e-6;
99        a2 = bass*(fs*middle*(fs*(2.55622482089074e-14*fs - 3.68862555090236e-11) - 7.91570931204744e-10) + fs*(fs*(3.24119799774819e-14*fs - 6.24077688445545e-11) - 3.92929922532365e-8) + treble*(pow(fs,2)*middle*(4.04069350385941e-15*fs - 7.49870974548878e-12) + fs*(fs*(7.13063559504602e-15*fs - 1.26394880011049e-11) - 7.74660097674461e-9) + treble*(-4.75375706336402e-15*pow(fs,3)*middle + pow(fs,2)*(-7.13063559504602e-15*fs + 1.63696868573141e-12))) + 2.45321569588247e-6) + fs*(fs*(7.13063559504602e-16*fs - 1.86406152029962e-12) - 3.40826695848827e-9) + middle*(fs*middle*(fs*(-5.62369460595963e-16*fs + 8.1149762119852e-13) + 1.74145604865044e-11) + fs*(fs*(-1.50694098908639e-16*fs + 1.74166502337627e-13) - 8.08985491691248e-10)) + treble*(fs*(fs*(1.56873983091013e-16*fs - 3.8610866928258e-13) - 7.30065869850135e-10) + middle*(pow(fs,2)*middle*(-8.88952570849071e-17*fs + 1.64971614400753e-13) + fs*(fs*(-6.79787260061054e-17*fs + 5.18744927771992e-14) - 1.74145604865044e-10)) + treble*(fs*(fs*(-1.56873983091013e-16*fs + 1.44053244344364e-13) + 3.7203833766623e-11) + middle*(1.04582655394008e-16*pow(fs,3)*middle + pow(fs,2)*(5.22913276970042e-17*fs + 3.6013311086091e-14))) + 5.39707453094144e-7) + 2.50718644119189e-6;
100        a3 = bass*(fs*middle*(fs*(-8.52074940296914e-15*fs + 3.68862555090236e-11) - 7.91570931204744e-10) + fs*(fs*(-1.08039933258273e-14*fs + 6.24077688445545e-11) - 3.92929922532365e-8) + treble*(pow(fs,2)*middle*(-1.3468978346198e-15*fs + 7.49870974548878e-12) + fs*(fs*(-2.37687853168201e-15*fs + 1.26394880011049e-11) - 7.74660097674461e-9) + treble*(1.58458568778801e-15*pow(fs,3)*middle + pow(fs,2)*(2.37687853168201e-15*fs - 1.63696868573141e-12))) + 8.17738565294157e-7) + fs*(fs*(-2.37687853168201e-16*fs + 1.86406152029962e-12) - 3.40826695848827e-9) + middle*(fs*middle*(fs*(1.87456486865321e-16*fs - 8.1149762119852e-13) + 1.74145604865044e-11) + fs*(fs*(5.02313663028798e-17*fs - 1.74166502337627e-13) - 8.08985491691248e-10)) + treble*(fs*(fs*(-5.22913276970042e-17*fs + 3.8610866928258e-13) - 7.30065869850135e-10) + middle*(pow(fs,2)*middle*(2.96317523616357e-17*fs - 1.64971614400753e-13) + fs*(fs*(2.26595753353685e-17*fs - 5.18744927771992e-14) - 1.74145604865044e-10)) + treble*(fs*(fs*(5.22913276970042e-17*fs - 1.44053244344364e-13) + 3.7203833766623e-11) + middle*(-3.48608851313361e-17*pow(fs,3)*middle + pow(fs,2)*(-1.74304425656681e-17*fs - 3.6013311086091e-14))) + 1.79902484364715e-7) + 8.35728813730628e-7;
101    };
102
103p5 =
104    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0,b4/a0),(a1/a0,a2/a0,a3/a0,a4/a0)) :
105    s05_stage4clip
106    with {
107        fs = float(ma.SR);
108
109        presence = ampctrl.presence : si.smooth(0.999);
110
111        b0 = pow(fs,2)*presence*(fs*(1.01658253199921e-20*fs + 1.94491729153694e-15) + 9.62805428549019e-15) + fs*(fs*(2.31041484545276e-18*fs + 4.42026657167486e-13) + 2.18819415579322e-12);
112        b1 = pow(fs,3)*presence*(-4.06633012799685e-20*fs - 3.88983458307388e-15) + fs*(-4.62082969090551e-18*pow(fs,2) + 4.37638831158645e-12);
113        b2 = pow(fs,2)*presence*(6.09949519199528e-20*pow(fs,2) - 1.92561085709804e-14) - 8.84053314334972e-13*pow(fs,2);
114        b3 = pow(fs,3)*presence*(-4.06633012799685e-20*fs + 3.88983458307388e-15) + fs*(4.62082969090551e-18*pow(fs,2) - 4.37638831158645e-12);
115        b4 = pow(fs,2)*presence*(fs*(1.01658253199921e-20*fs - 1.94491729153694e-15) + 9.62805428549019e-15) + fs*(fs*(-2.31041484545276e-18*fs + 4.42026657167486e-13) - 2.18819415579322e-12);
116
117        a0 = fs*presence*(fs*(fs*(5.74478583620837e-20*fs + 1.05646886954294e-14) + 1.3795504704645e-13) + 1.15188971565309e-13) + fs*(fs*(fs*(1.00564523200911e-20*fs + 1.84640338108797e-15) + 2.4282553920437e-12) + 3.1377111557384e-11) + 2.61793117193885e-11;
118        a1 = fs*presence*(pow(fs,2)*(-2.29791433448335e-19*fs - 2.11293773908589e-14) + 2.30377943130619e-13) + fs*(pow(fs,2)*(-4.02258092803644e-20*fs - 3.69280676217593e-15) + 6.2754223114768e-11) + 1.04717246877554e-10;
119        a2 = pow(fs,2)*presence*(3.44687150172502e-19*pow(fs,2) - 2.75910094092901e-13) + pow(fs,2)*(6.03387139205466e-20*pow(fs,2) - 4.85651078408741e-12) + 1.57075870316331e-10;
120        a3 = fs*presence*(pow(fs,2)*(-2.29791433448335e-19*fs + 2.11293773908589e-14) - 2.30377943130619e-13) + fs*(pow(fs,2)*(-4.02258092803644e-20*fs + 3.69280676217593e-15) - 6.2754223114768e-11) + 1.04717246877554e-10;
121        a4 = fs*presence*(fs*(fs*(5.74478583620837e-20*fs - 1.05646886954294e-14) + 1.3795504704645e-13) - 1.15188971565309e-13) + fs*(fs*(fs*(1.00564523200911e-20*fs - 1.84640338108797e-15) + 2.4282553920437e-12) - 3.1377111557384e-11) + 2.61793117193885e-11;
122    };
123
124s05_stage4clip =
125    _<:
126        ba.if(signbit(_), s05_stage4_neg_clip, s05_stage4_clip)
127    :>_
128
129    with {
130        signbit = ffunction(int signbit(float), "math.h", "");
131        s05_stage4_clip = ffunction(float s05_stage4clip(float), "generated/stage/marshall_jcm800lo/s05_stage4_table.h", "");
132        s05_stage4_neg_clip = ffunction(float s05_stage4_negclip(float), "generated/stage/marshall_jcm800lo/s05_stage4_neg_table.h", "");
133    };
134
135
136process =
137    *(pregain) :
138//    *(6.5) :
139    *(7.86) :
140    p2 :
141    *(14.280) :
142//    *(15.85) :
143    p3 :
144    p4 :
145    *(31.6) :
146//    *(31.6) :
147    p5
148    *(15.85)
149//    *(15.85) :
150    *(postgain)
151    with {
152        pregain     = ampctrl.pregain;
153        postgain    = ampctrl.postgain;
154        tune1       = ampctrl.tune1;
155        tune2       = ampctrl.tune2;
156        tune3       = ampctrl.tune3;
157        tune4       = ampctrl.tune4;
158        tune5       = ampctrl.tune5;
159        tune6       = ampctrl.tune6;
160        tune7       = ampctrl.tune7;
161        tune8       = ampctrl.tune8;
162        tune9       = ampctrl.tune9;
163        tune10      = ampctrl.tune10;
164    };
165
166
167
168
169