1/*
2 * This is simulation of Mesa Dual Rectifier preamplifier (red channel, more gain)
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 "mesa_dual_rect_red";
21declare name "mesa_dual_rect_red";
22declare samplerate "96000";
23
24import("stdfaust.lib");
25import("amp_sim.lib");
26
27p1 =
28    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0,b4/a0,b5/a0),(a1/a0,a2/a0,a3/a0,a4/a0,a5/a0)) :
29    s01_stage1clip
30
31    with {
32        LogPot(a, x) = ba.if(a, (exp(a * x) - 1) / (exp(a) - 1), x);
33        fs = float(ma.SR);
34
35        gain = ampctrl.gain : LogPot(3.0) : si.smooth(0.999);
36
37        b0 = gain*(pow(fs,2)*gain*(fs*(4.75388127927614e-17*fs + 3.51837488502921e-14) + 6.1051452984792e-12) + fs*(fs*(fs*(-4.75388127927614e-17*fs - 5.89531552466728e-14) - 2.36970197236252e-11) - 3.0525726492396e-9));
38        b1 = gain*(pow(fs,2)*gain*(fs*(-1.42616438378284e-16*fs - 3.51837488502921e-14) + 6.1051452984792e-12) + fs*(fs*(fs*(1.42616438378284e-16*fs + 5.89531552466728e-14) - 2.36970197236252e-11) - 9.1577179477188e-9));
39        b2 = gain*(pow(fs,2)*gain*(fs*(9.50776255855229e-17*fs - 7.03674977005842e-14) - 1.22102905969584e-11) + fs*(fs*(fs*(-9.50776255855229e-17*fs + 1.17906310493346e-13) + 4.73940394472505e-11) - 6.1051452984792e-9));
40        b3 = gain*(pow(fs,2)*gain*(fs*(9.50776255855229e-17*fs + 7.03674977005842e-14) - 1.22102905969584e-11) + fs*(fs*(fs*(-9.50776255855229e-17*fs - 1.17906310493346e-13) + 4.73940394472505e-11) + 6.1051452984792e-9));
41        b4 = gain*(pow(fs,2)*gain*(fs*(-1.42616438378284e-16*fs + 3.51837488502921e-14) + 6.1051452984792e-12) + fs*(fs*(fs*(1.42616438378284e-16*fs - 5.89531552466728e-14) - 2.36970197236252e-11) + 9.1577179477188e-9));
42        b5 = gain*(pow(fs,2)*gain*(fs*(4.75388127927614e-17*fs - 3.51837488502921e-14) + 6.1051452984792e-12) + fs*(fs*(fs*(-4.75388127927614e-17*fs + 5.89531552466728e-14) - 2.36970197236252e-11) + 3.0525726492396e-9));
43
44        a0 = fs*(fs*(fs*(2.77018846582032e-20*fs + 5.54084203078628e-16) + 5.01340790630281e-13) + 1.1960884329196e-10) + gain*(pow(fs,2)*gain*(fs*(fs*(-1.99011961617702e-36*fs - 6.47844436758614e-19) - 5.88702348424581e-16) - 1.33698658429561e-13) + fs*(fs*(fs*(fs*(1.99011961617702e-36*fs + 6.20142552100412e-19) + 3.72391306054362e-16) + 3.48645631966802e-14) - 3.34246646073902e-12)) + 1.67123323036951e-9;
45        a1 = fs*(fs*(fs*(-8.31056539746097e-20*fs - 5.54084203078628e-16) + 5.01340790630281e-13) + 3.5882652987588e-10) + gain*(pow(fs,2)*gain*(fs*(fs*(9.95059808088511e-36*fs + 1.94353331027584e-18) + 5.88702348424581e-16) - 1.33698658429561e-13) + fs*(fs*(fs*(fs*(-9.95059808088511e-36*fs - 1.86042765630124e-18) - 3.72391306054362e-16) + 3.48645631966802e-14) - 1.00273993822171e-11)) + 8.35616615184755e-9;
46        a2 = fs*(fs*(fs*(5.54037693164065e-20*fs - 1.10816840615726e-15) - 1.00268158126056e-12) + 2.3921768658392e-10) + gain*(pow(fs,2)*gain*(fs*(fs*(-1.99011961617702e-35*fs - 1.29568887351723e-18) + 1.17740469684916e-15) + 2.67397316859122e-13) + fs*(fs*(fs*(fs*(1.99011961617702e-35*fs + 1.24028510420082e-18) - 7.44782612108724e-16) - 6.97291263933603e-14) - 6.68493292147804e-12)) + 1.67123323036951e-8;
47        a3 = fs*(fs*(fs*(5.54037693164065e-20*fs + 1.10816840615726e-15) - 1.00268158126056e-12) - 2.3921768658392e-10) + gain*(pow(fs,2)*gain*(fs*(fs*(1.99011961617702e-35*fs - 1.29568887351723e-18) - 1.17740469684916e-15) + 2.67397316859122e-13) + fs*(fs*(fs*(fs*(-1.99011961617702e-35*fs + 1.24028510420082e-18) + 7.44782612108724e-16) - 6.97291263933603e-14) + 6.68493292147804e-12)) + 1.67123323036951e-8;
48        a4 = fs*(fs*(fs*(-8.31056539746097e-20*fs + 5.54084203078628e-16) + 5.01340790630281e-13) - 3.5882652987588e-10) + gain*(pow(fs,2)*gain*(fs*(fs*(-9.95059808088511e-36*fs + 1.94353331027584e-18) - 5.88702348424581e-16) - 1.33698658429561e-13) + fs*(fs*(fs*(fs*(9.95059808088511e-36*fs - 1.86042765630124e-18) + 3.72391306054362e-16) + 3.48645631966802e-14) + 1.00273993822171e-11)) + 8.35616615184755e-9;
49        a5 = fs*(fs*(fs*(2.77018846582032e-20*fs - 5.54084203078628e-16) + 5.01340790630281e-13) - 1.1960884329196e-10) + gain*(pow(fs,2)*gain*(fs*(fs*(1.99011961617702e-36*fs - 6.47844436758614e-19) + 5.88702348424581e-16) - 1.33698658429561e-13) + fs*(fs*(fs*(fs*(-1.99011961617702e-36*fs + 6.20142552100412e-19) - 3.72391306054362e-16) + 3.48645631966802e-14) + 3.34246646073902e-12)) + 1.67123323036951e-9;
50    };
51
52s01_stage1clip =
53    _<:
54        ba.if(signbit(_), s01_stage1_neg_clip, s01_stage1_clip)
55    :>_
56
57    with {
58        signbit = ffunction(int signbit(float), "math.h", "");
59        s01_stage1_clip = ffunction(float s01_stage1clip(float), "generated/stage/mesa_dual_rect_red/s01_stage1_table.h", "");
60        s01_stage1_neg_clip = ffunction(float s01_stage1_negclip(float), "generated/stage/mesa_dual_rect_red/s01_stage1_neg_table.h", "");
61    };
62
63p2 =
64    fi.iir((b0/a0,b1/a0,b2/a0),(a1/a0,a2/a0)) :
65    s02_stage2clip
66
67    with {
68        fs = float(ma.SR);
69
70        b0 = -0.000655304158661071*fs - 0.18202893296141;
71        b1 = -0.364057865922819;
72        b2 = 0.000655304158661071*fs - 0.18202893296141;
73
74        a0 = fs*(2.03405658623965e-10*fs + 1.09382323078101e-5) + 0.0063182117555006;
75        a1 = -4.0681131724793e-10*pow(fs,2) + 0.0126364235110012;
76        a2 = fs*(2.03405658623965e-10*fs - 1.09382323078101e-5) + 0.0063182117555006;
77    };
78
79s02_stage2clip =
80    _<:
81        ba.if(signbit(_), s02_stage2_neg_clip, s02_stage2_clip)
82    :>_
83
84    with {
85        signbit = ffunction(int signbit(float), "math.h", "");
86        s02_stage2_clip = ffunction(float s02_stage2clip(float), "generated/stage/mesa_dual_rect_red/s02_stage2_table.h", "");
87        s02_stage2_neg_clip = ffunction(float s02_stage2_negclip(float), "generated/stage/mesa_dual_rect_red/s02_stage2_neg_table.h", "");
88    };
89
90
91p3 =
92    fi.iir((b0/a0,b1/a0),(a1/a0)) :
93    s03_stage3clip
94
95    with {
96        fs = float(ma.SR);
97
98        b0 = -0.146261721859089;
99        b1 = -0.146261721859089;
100
101        a0 = 1.88103770813187e-5*fs + 0.0971019000967005;
102        a1 = -1.88103770813187e-5*fs + 0.0971019000967005;
103    };
104
105s03_stage3clip =
106    _<:
107        ba.if(signbit(_), s03_stage3_neg_clip, s03_stage3_clip)
108    :>_
109
110    with {
111        signbit = ffunction(int signbit(float), "math.h", "");
112        s03_stage3_clip = ffunction(float s03_stage3clip(float), "generated/stage/mesa_dual_rect_red/s03_stage3_table.h", "");
113        s03_stage3_neg_clip = ffunction(float s03_stage3_negclip(float), "generated/stage/mesa_dual_rect_red/s03_stage3_neg_table.h", "");
114    };
115
116p4 =
117    fi.iir((b0/a0,b1/a0),(a1/a0)) :
118    s04_stage4clip
119
120    with {
121        fs = float(ma.SR);
122
123        b0 = -0.00149525527902205*fs - 0.415348688617234;
124        b1 = 0.00149525527902205*fs - 0.415348688617234;
125
126        a0 = 2.06413022257424e-5*fs + 0.00921749316436716;
127        a1 = -2.06413022257424e-5*fs + 0.00921749316436716;
128    };
129
130s04_stage4clip =
131    _<:
132        ba.if(signbit(_), s04_stage4_neg_clip, s04_stage4_clip)
133    :>_
134
135    with {
136        signbit = ffunction(int signbit(float), "math.h", "");
137        s04_stage4_clip = ffunction(float s04_stage4clip(float), "generated/stage/mesa_dual_rect_red/s04_stage4_table.h", "");
138        s04_stage4_neg_clip = ffunction(float s04_stage4_negclip(float), "generated/stage/mesa_dual_rect_red/s04_stage4_neg_table.h", "");
139    };
140
141p5 =
142    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0,b4/a0),(a1/a0,a2/a0,a3/a0,a4/a0))
143
144    with {
145        fs = float(ma.SR);
146
147        bass   = ampctrl.bass : si.smooth(0.999);
148        middle = ampctrl.middle : si.smooth(0.999);
149        treble = ampctrl.treble : si.smooth(0.999);
150        master = ampctrl.master : si.smooth(0.999);
151        presence = 0.8;
152
153        b0 = bass*(pow(fs,2)*master*middle*(fs*(3.30051659809705e-20*fs + 3.34529484863571e-16) + 6.40078398818915e-13) + fs*master*(fs*(3.82282057153329e-17*fs + 3.74097967699649e-13) + 6.40078398818915e-10)) + fs*master*(fs*(9.55705142883322e-19*fs + 9.35244919249122e-15) + 1.60019599704729e-11) + middle*(pow(fs,2)*master*middle*(fs*(-8.25129149524264e-22*fs - 8.36323712158926e-18) - 1.60019599704729e-14) + fs*master*(fs*(fs*(8.25129149524264e-22*fs + 9.05779027775447e-18) + 2.33065297055437e-14) + 1.54757833370144e-11)) + presence*(bass*(pow(fs,3)*master*middle*(3.75058704329211e-20*fs + 9.60117598228372e-17) + pow(fs,2)*master*(4.34411428583328e-17*fs + 9.60117598228372e-14)) + pow(fs,2)*master*(1.08602857145832e-18*fs + 2.40029399557093e-15) + middle*(pow(fs,3)*master*middle*(-9.37646760823027e-22*fs - 2.40029399557093e-18) + pow(fs,2)*master*(fs*(9.37646760823027e-22*fs + 3.18955894575866e-18) + 2.32136750055216e-15)) + treble*(5.93527242541174e-20*bass*pow(fs,4)*master - 1.48381810635294e-21*pow(fs,4)*master*middle + pow(fs,2)*master*(fs*(1.48381810635294e-21*fs + 2.96763621270587e-18) + 7.89264950187733e-16))) + treble*(bass*pow(fs,3)*master*(5.22303973436233e-20*fs + 3.95684828360783e-16) + pow(fs,3)*master*middle*(-1.30575993359058e-21*fs - 9.89212070901957e-18) + fs*master*(fs*(fs*(1.30575993359058e-21*fs + 1.25036405762007e-17) + 2.04787945742043e-14) + 5.26176633458489e-12));
154        b1 = bass*(pow(fs,3)*master*middle*(-1.32020663923882e-19*fs - 6.69058969727141e-16) + fs*master*(-7.64564114306658e-17*pow(fs,2) + 1.28015679763783e-9)) + fs*master*(-1.91141028576664e-18*pow(fs,2) + 3.20039199409457e-11) + middle*(pow(fs,3)*master*middle*(3.30051659809705e-21*fs + 1.67264742431785e-17) + fs*master*(pow(fs,2)*(-3.30051659809705e-21*fs - 1.81155805555089e-17) + 3.09515666740288e-11)) + presence*(bass*(pow(fs,3)*master*middle*(-1.50023481731684e-19*fs - 1.92023519645674e-16) - 8.68822857166656e-17*pow(fs,3)*master) - 2.17205714291664e-18*pow(fs,3)*master + middle*(pow(fs,3)*master*middle*(3.75058704329211e-21*fs + 4.80058799114186e-18) + pow(fs,3)*master*(-3.75058704329211e-21*fs - 6.37911789151733e-18)) + treble*(-2.3741089701647e-19*bass*pow(fs,4)*master + 5.93527242541174e-21*pow(fs,4)*master*middle + pow(fs,3)*master*(-5.93527242541174e-21*fs - 5.93527242541174e-18))) + treble*(bass*pow(fs,3)*master*(-2.08921589374493e-19*fs - 7.91369656721565e-16) + pow(fs,3)*master*middle*(5.22303973436233e-21*fs + 1.97842414180391e-17) + fs*master*(pow(fs,2)*(-5.22303973436233e-21*fs - 2.50072811524015e-17) + 1.05235326691698e-11));
155        b2 = bass*(pow(fs,2)*master*middle*(1.98030995885823e-19*pow(fs,2) - 1.28015679763783e-12) - 7.48195935399298e-13*pow(fs,2)*master) - 1.87048983849824e-14*pow(fs,2)*master + middle*(pow(fs,2)*master*middle*(-4.95077489714558e-21*pow(fs,2) + 3.20039199409457e-14) + pow(fs,2)*master*(4.95077489714558e-21*pow(fs,2) - 4.66130594110873e-14)) + presence*(bass*(2.25035222597526e-19*pow(fs,4)*master*middle - 1.92023519645674e-13*pow(fs,2)*master) - 4.80058799114186e-15*pow(fs,2)*master + middle*(-5.62588056493816e-21*pow(fs,4)*master*middle + pow(fs,2)*master*(5.62588056493816e-21*pow(fs,2) - 4.64273500110431e-15)) + treble*(3.56116345524704e-19*bass*pow(fs,4)*master - 8.90290863811761e-21*pow(fs,4)*master*middle + pow(fs,2)*master*(8.90290863811761e-21*pow(fs,2) - 1.57852990037547e-15))) + treble*(3.1338238406174e-19*bass*pow(fs,4)*master - 7.8345596015435e-21*pow(fs,4)*master*middle + pow(fs,2)*master*(7.8345596015435e-21*pow(fs,2) - 4.09575891484087e-14));
156        b3 = bass*(pow(fs,3)*master*middle*(-1.32020663923882e-19*fs + 6.69058969727141e-16) + fs*master*(7.64564114306658e-17*pow(fs,2) - 1.28015679763783e-9)) + fs*master*(1.91141028576664e-18*pow(fs,2) - 3.20039199409457e-11) + middle*(pow(fs,3)*master*middle*(3.30051659809705e-21*fs - 1.67264742431785e-17) + fs*master*(pow(fs,2)*(-3.30051659809705e-21*fs + 1.81155805555089e-17) - 3.09515666740288e-11)) + presence*(bass*(pow(fs,3)*master*middle*(-1.50023481731684e-19*fs + 1.92023519645674e-16) + 8.68822857166656e-17*pow(fs,3)*master) + 2.17205714291664e-18*pow(fs,3)*master + middle*(pow(fs,3)*master*middle*(3.75058704329211e-21*fs - 4.80058799114186e-18) + pow(fs,3)*master*(-3.75058704329211e-21*fs + 6.37911789151733e-18)) + treble*(-2.3741089701647e-19*bass*pow(fs,4)*master + 5.93527242541174e-21*pow(fs,4)*master*middle + pow(fs,3)*master*(-5.93527242541174e-21*fs + 5.93527242541174e-18))) + treble*(bass*pow(fs,3)*master*(-2.08921589374493e-19*fs + 7.91369656721565e-16) + pow(fs,3)*master*middle*(5.22303973436233e-21*fs - 1.97842414180391e-17) + fs*master*(pow(fs,2)*(-5.22303973436233e-21*fs + 2.50072811524015e-17) - 1.05235326691698e-11));
157        b4 = bass*(pow(fs,2)*master*middle*(fs*(3.30051659809705e-20*fs - 3.34529484863571e-16) + 6.40078398818915e-13) + fs*master*(fs*(-3.82282057153329e-17*fs + 3.74097967699649e-13) - 6.40078398818915e-10)) + fs*master*(fs*(-9.55705142883322e-19*fs + 9.35244919249122e-15) - 1.60019599704729e-11) + middle*(pow(fs,2)*master*middle*(fs*(-8.25129149524264e-22*fs + 8.36323712158926e-18) - 1.60019599704729e-14) + fs*master*(fs*(fs*(8.25129149524264e-22*fs - 9.05779027775447e-18) + 2.33065297055437e-14) - 1.54757833370144e-11)) + presence*(bass*(pow(fs,3)*master*middle*(3.75058704329211e-20*fs - 9.60117598228372e-17) + pow(fs,2)*master*(-4.34411428583328e-17*fs + 9.60117598228372e-14)) + pow(fs,2)*master*(-1.08602857145832e-18*fs + 2.40029399557093e-15) + middle*(pow(fs,3)*master*middle*(-9.37646760823027e-22*fs + 2.40029399557093e-18) + pow(fs,2)*master*(fs*(9.37646760823027e-22*fs - 3.18955894575866e-18) + 2.32136750055216e-15)) + treble*(5.93527242541174e-20*bass*pow(fs,4)*master - 1.48381810635294e-21*pow(fs,4)*master*middle + pow(fs,2)*master*(fs*(1.48381810635294e-21*fs - 2.96763621270587e-18) + 7.89264950187733e-16))) + treble*(bass*pow(fs,3)*master*(5.22303973436233e-20*fs - 3.95684828360783e-16) + pow(fs,3)*master*middle*(-1.30575993359058e-21*fs + 9.89212070901957e-18) + fs*master*(fs*(fs*(1.30575993359058e-21*fs - 1.25036405762007e-17) + 2.04787945742043e-14) - 5.26176633458489e-12));
158
159        a0 = bass*(fs*middle*(fs*(fs*(9.36636501686785e-20*fs + 5.550940631707e-16) + 7.69332141249659e-13) + 1.54757833370144e-11) + fs*(fs*(fs*(5.22303973436233e-20*fs + 7.08848818168071e-16) + 1.94674088009371e-12) + 7.98426613923246e-10) + 1.54757833370144e-8) + fs*(fs*(fs*(1.30575993359058e-21*fs + 2.03327403213829e-17) + 7.68282573623741e-14) + 8.54541804303259e-11) + middle*(fs*middle*(fs*(fs*(-2.34159125421696e-21*fs - 1.38773515792675e-17) - 1.92333035312415e-14) - 3.86894583425359e-13) + fs*(fs*(fs*(1.03583132062638e-21*fs + 8.39313633499656e-19) - 2.55659940727471e-15) + 1.58626779204397e-11)) + presence*(bass*(pow(fs,2)*middle*(fs*(3.8989688539274e-20*fs + 1.01165195674063e-16) + 2.32136750055216e-15) + fs*(fs*(fs*(5.93527242541174e-20*fs + 2.2097561511256e-16) + 1.05529366575101e-13) + 2.32136750055216e-12)) + fs*(fs*(fs*(1.48381810635294e-21*fs + 8.49202659051988e-18) + 1.21558409166413e-14) + 2.37940168806596e-12) + middle*(pow(fs,2)*middle*(fs*(-9.7474221348185e-22*fs - 2.52912989185157e-18) - 5.80341875138039e-17) + pow(fs,2)*(fs*(-5.09075892871085e-22*fs - 1.04577605899874e-18) + 2.37940168806596e-15)) + treble*(bass*(pow(fs,3)*middle*(6.4088313955244e-21*fs + 2.24244100553338e-17) + pow(fs,2)*(fs*(1.48381810635294e-20*fs + 4.85667222995519e-17) + 2.24244100553338e-14)) + fs*(fs*(fs*(3.70954526588234e-22*fs + 1.95607711066527e-18) + 2.9400119394493e-15) + 5.80341875138039e-13) + middle*(pow(fs,3)*middle*(-1.6022078488811e-22*fs - 5.60610251383346e-19) + pow(fs,2)*(fs*(-2.10733741700124e-22*fs - 3.33116236329232e-19) + 5.80341875138039e-16)) + treble*(bass*(-7.89264950187733e-21*pow(fs,4)*middle + pow(fs,3)*(-1.48381810635294e-20*fs - 7.89264950187733e-18)) + pow(fs,2)*(fs*(-3.70954526588234e-22*fs - 9.39225290723401e-19) - 1.97316237546933e-16) + middle*(1.97316237546933e-22*pow(fs,4)*middle + pow(fs,3)*(1.736382890413e-22*fs - 1.97316237546933e-19))))) + treble*(bass*(pow(fs,2)*middle*(fs*(2.61993027449037e-19*fs + 9.59435425698876e-16) + 1.49496067035559e-13) + fs*(fs*(fs*(6.0658484187708e-19*fs + 2.08432881469588e-15) + 1.24048803172573e-12) + 1.49496067035559e-10)) + fs*(fs*(fs*(1.5164621046927e-20*fs + 8.24374624612509e-17) + 1.33228202155789e-13) + 4.33244554519717e-11) + middle*(pow(fs,2)*middle*(fs*(-6.54982568622593e-21*fs - 2.39858856424719e-17) - 3.73740167588897e-15) + fs*(fs*(fs*(-8.61479536070106e-21*fs - 1.50226833524732e-17) + 2.15036009467815e-14) + 3.86894583425359e-12)) + treble*(bass*(pow(fs,3)*middle*(-3.22651511636745e-19*fs - 5.26176633458489e-17) + pow(fs,2)*(fs*(-6.0658484187708e-19*fs - 4.21572718726941e-16) - 5.26176633458489e-14)) + fs*(fs*(fs*(-1.5164621046927e-20*fs - 4.08685600620275e-17) - 1.43277897290746e-14) - 1.31544158364622e-12) + middle*(pow(fs,3)*middle*(8.06628779091864e-21*fs + 1.31544158364622e-18) + pow(fs,2)*(fs*(7.09833325600836e-21*fs - 6.90869919730996e-18) - 1.31544158364622e-15))) + 3.86894583425359e-9) + 1.58626779204397e-8;
160        a1 = bass*(fs*middle*(pow(fs,2)*(-3.74654600674714e-19*fs - 1.1101881263414e-15) + 3.09515666740288e-11) + fs*(pow(fs,2)*(-2.08921589374493e-19*fs - 1.41769763633614e-15) + 1.59685322784649e-9) + 6.19031333480575e-8) + fs*(pow(fs,2)*(-5.22303973436233e-21*fs - 4.06654806427659e-17) + 1.70908360860652e-10) + middle*(fs*middle*(pow(fs,2)*(9.36636501686785e-21*fs + 2.7754703158535e-17) - 7.73789166850719e-13) + fs*(pow(fs,2)*(-4.14332528250552e-21*fs - 1.67862726699931e-18) + 3.17253558408795e-11)) + presence*(bass*(pow(fs,3)*middle*(-1.55958754157096e-19*fs - 2.02330391348126e-16) + fs*(pow(fs,2)*(-2.3741089701647e-19*fs - 4.41951230225121e-16) + 4.64273500110431e-12)) + fs*(pow(fs,2)*(-5.93527242541174e-21*fs - 1.69840531810398e-17) + 4.75880337613192e-12) + middle*(pow(fs,3)*middle*(3.8989688539274e-21*fs + 5.05825978370315e-18) + pow(fs,3)*(2.03630357148434e-21*fs + 2.09155211799747e-18)) + treble*(bass*(pow(fs,3)*middle*(-2.56353255820976e-20*fs - 4.48488201106677e-17) + pow(fs,3)*(-5.93527242541174e-20*fs - 9.71334445991038e-17)) + fs*(pow(fs,2)*(-1.48381810635294e-21*fs - 3.91215422133053e-18) + 1.16068375027608e-12) + middle*(pow(fs,3)*middle*(6.4088313955244e-22*fs + 1.12122050276669e-18) + pow(fs,3)*(8.42934966800495e-22*fs + 6.66232472658464e-19)) + treble*(bass*(3.15705980075093e-20*pow(fs,4)*middle + pow(fs,3)*(5.93527242541174e-20*fs + 1.57852990037547e-17)) + pow(fs,3)*(1.48381810635294e-21*fs + 1.8784505814468e-18) + middle*(-7.89264950187733e-22*pow(fs,4)*middle + pow(fs,3)*(-6.94553156165202e-22*fs + 3.94632475093867e-19))))) + treble*(bass*(pow(fs,3)*middle*(-1.04797210979615e-18*fs - 1.91887085139775e-15) + fs*(pow(fs,2)*(-2.42633936750832e-18*fs - 4.16865762939176e-15) + 2.98992134071118e-10)) + fs*(pow(fs,2)*(-6.0658484187708e-20*fs - 1.64874924922502e-16) + 8.66489109039434e-11) + middle*(pow(fs,3)*middle*(2.61993027449037e-20*fs + 4.79717712849438e-17) + fs*(pow(fs,2)*(3.44591814428042e-20*fs + 3.00453667049463e-17) + 7.73789166850719e-12)) + treble*(bass*(pow(fs,3)*middle*(1.29060604654698e-18*fs + 1.05235326691698e-16) + pow(fs,3)*(2.42633936750832e-18*fs + 8.43145437453882e-16)) + fs*(pow(fs,2)*(6.0658484187708e-20*fs + 8.1737120124055e-17) - 2.63088316729244e-12) + middle*(pow(fs,3)*middle*(-3.22651511636745e-20*fs - 2.63088316729244e-18) + pow(fs,3)*(-2.83933330240335e-20*fs + 1.38173983946199e-17))) + 1.54757833370144e-8) + 6.3450711681759e-8;
161        a2 = bass*(pow(fs,2)*middle*(5.61981901012071e-19*pow(fs,2) - 1.53866428249932e-12) + pow(fs,2)*(3.1338238406174e-19*pow(fs,2) - 3.89348176018742e-12) + 9.28547000220863e-8) + pow(fs,2)*(7.8345596015435e-21*pow(fs,2) - 1.53656514724748e-13) + middle*(pow(fs,2)*middle*(-1.40495475253018e-20*pow(fs,2) + 3.84666070624829e-14) + pow(fs,2)*(6.21498792375828e-21*pow(fs,2) + 5.11319881454942e-15)) + presence*(bass*(pow(fs,2)*middle*(2.33938131235644e-19*pow(fs,2) - 4.64273500110431e-15) + pow(fs,2)*(3.56116345524704e-19*pow(fs,2) - 2.11058733150202e-13)) + pow(fs,2)*(8.90290863811761e-21*pow(fs,2) - 2.43116818332827e-14) + middle*(pow(fs,2)*middle*(-5.8484532808911e-21*pow(fs,2) + 1.16068375027608e-16) + pow(fs,2)*(-3.05445535722651e-21*pow(fs,2) - 4.75880337613192e-15)) + treble*(bass*(3.84529883731464e-20*pow(fs,4)*middle + pow(fs,2)*(8.90290863811761e-20*pow(fs,2) - 4.48488201106677e-14)) + pow(fs,2)*(2.2257271595294e-21*pow(fs,2) - 5.8800238788986e-15) + middle*(-9.6132470932866e-22*pow(fs,4)*middle + pow(fs,2)*(-1.26440245020074e-21*pow(fs,2) - 1.16068375027608e-15)) + treble*(bass*(-4.7355897011264e-20*pow(fs,4)*middle - 8.90290863811761e-20*pow(fs,4)) + pow(fs,2)*(-2.2257271595294e-21*pow(fs,2) + 3.94632475093867e-16) + middle*(1.1838974252816e-21*pow(fs,4)*middle + 1.0418297342478e-21*pow(fs,4))))) + treble*(bass*(pow(fs,2)*middle*(1.57195816469422e-18*pow(fs,2) - 2.98992134071118e-13) + pow(fs,2)*(3.63950905126248e-18*pow(fs,2) - 2.48097606345145e-12)) + pow(fs,2)*(9.0987726281562e-20*pow(fs,2) - 2.66456404311578e-13) + middle*(pow(fs,2)*middle*(-3.92989541173556e-20*pow(fs,2) + 7.47480335177794e-15) + pow(fs,2)*(-5.16887721642064e-20*pow(fs,2) - 4.3007201893563e-14)) + treble*(bass*(-1.93590906982047e-18*pow(fs,4)*middle + pow(fs,2)*(-3.63950905126248e-18*pow(fs,2) + 1.05235326691698e-13)) + pow(fs,2)*(-9.0987726281562e-20*pow(fs,2) + 2.86555794581493e-14) + middle*(4.83977267455118e-20*pow(fs,4)*middle + pow(fs,2)*(4.25899995360502e-20*pow(fs,2) + 2.63088316729244e-15))) + 2.32136750055216e-8) + 9.51760675226384e-8;
162        a3 = bass*(fs*middle*(pow(fs,2)*(-3.74654600674714e-19*fs + 1.1101881263414e-15) - 3.09515666740288e-11) + fs*(pow(fs,2)*(-2.08921589374493e-19*fs + 1.41769763633614e-15) - 1.59685322784649e-9) + 6.19031333480575e-8) + fs*(pow(fs,2)*(-5.22303973436233e-21*fs + 4.06654806427659e-17) - 1.70908360860652e-10) + middle*(fs*middle*(pow(fs,2)*(9.36636501686785e-21*fs - 2.7754703158535e-17) + 7.73789166850719e-13) + fs*(pow(fs,2)*(-4.14332528250552e-21*fs + 1.67862726699931e-18) - 3.17253558408795e-11)) + presence*(bass*(pow(fs,3)*middle*(-1.55958754157096e-19*fs + 2.02330391348126e-16) + fs*(pow(fs,2)*(-2.3741089701647e-19*fs + 4.41951230225121e-16) - 4.64273500110431e-12)) + fs*(pow(fs,2)*(-5.93527242541174e-21*fs + 1.69840531810398e-17) - 4.75880337613192e-12) + middle*(pow(fs,3)*middle*(3.8989688539274e-21*fs - 5.05825978370315e-18) + pow(fs,3)*(2.03630357148434e-21*fs - 2.09155211799747e-18)) + treble*(bass*(pow(fs,3)*middle*(-2.56353255820976e-20*fs + 4.48488201106677e-17) + pow(fs,3)*(-5.93527242541174e-20*fs + 9.71334445991038e-17)) + fs*(pow(fs,2)*(-1.48381810635294e-21*fs + 3.91215422133053e-18) - 1.16068375027608e-12) + middle*(pow(fs,3)*middle*(6.4088313955244e-22*fs - 1.12122050276669e-18) + pow(fs,3)*(8.42934966800495e-22*fs - 6.66232472658464e-19)) + treble*(bass*(3.15705980075093e-20*pow(fs,4)*middle + pow(fs,3)*(5.93527242541174e-20*fs - 1.57852990037547e-17)) + pow(fs,3)*(1.48381810635294e-21*fs - 1.8784505814468e-18) + middle*(-7.89264950187733e-22*pow(fs,4)*middle + pow(fs,3)*(-6.94553156165202e-22*fs - 3.94632475093867e-19))))) + treble*(bass*(pow(fs,3)*middle*(-1.04797210979615e-18*fs + 1.91887085139775e-15) + fs*(pow(fs,2)*(-2.42633936750832e-18*fs + 4.16865762939176e-15) - 2.98992134071118e-10)) + fs*(pow(fs,2)*(-6.0658484187708e-20*fs + 1.64874924922502e-16) - 8.66489109039434e-11) + middle*(pow(fs,3)*middle*(2.61993027449037e-20*fs - 4.79717712849438e-17) + fs*(pow(fs,2)*(3.44591814428042e-20*fs - 3.00453667049463e-17) - 7.73789166850719e-12)) + treble*(bass*(pow(fs,3)*middle*(1.29060604654698e-18*fs - 1.05235326691698e-16) + pow(fs,3)*(2.42633936750832e-18*fs - 8.43145437453882e-16)) + fs*(pow(fs,2)*(6.0658484187708e-20*fs - 8.1737120124055e-17) + 2.63088316729244e-12) + middle*(pow(fs,3)*middle*(-3.22651511636745e-20*fs + 2.63088316729244e-18) + pow(fs,3)*(-2.83933330240335e-20*fs - 1.38173983946199e-17))) + 1.54757833370144e-8) + 6.3450711681759e-8;
163        a4 = bass*(fs*middle*(fs*(fs*(9.36636501686785e-20*fs - 5.550940631707e-16) + 7.69332141249659e-13) - 1.54757833370144e-11) + fs*(fs*(fs*(5.22303973436233e-20*fs - 7.08848818168071e-16) + 1.94674088009371e-12) - 7.98426613923246e-10) + 1.54757833370144e-8) + fs*(fs*(fs*(1.30575993359058e-21*fs - 2.03327403213829e-17) + 7.68282573623741e-14) - 8.54541804303259e-11) + middle*(fs*middle*(fs*(fs*(-2.34159125421696e-21*fs + 1.38773515792675e-17) - 1.92333035312415e-14) + 3.86894583425359e-13) + fs*(fs*(fs*(1.03583132062638e-21*fs - 8.39313633499656e-19) - 2.55659940727471e-15) - 1.58626779204397e-11)) + presence*(bass*(pow(fs,2)*middle*(fs*(3.8989688539274e-20*fs - 1.01165195674063e-16) + 2.32136750055216e-15) + fs*(fs*(fs*(5.93527242541174e-20*fs - 2.2097561511256e-16) + 1.05529366575101e-13) - 2.32136750055216e-12)) + fs*(fs*(fs*(1.48381810635294e-21*fs - 8.49202659051988e-18) + 1.21558409166413e-14) - 2.37940168806596e-12) + middle*(pow(fs,2)*middle*(fs*(-9.7474221348185e-22*fs + 2.52912989185157e-18) - 5.80341875138039e-17) + pow(fs,2)*(fs*(-5.09075892871085e-22*fs + 1.04577605899874e-18) + 2.37940168806596e-15)) + treble*(bass*(pow(fs,3)*middle*(6.4088313955244e-21*fs - 2.24244100553338e-17) + pow(fs,2)*(fs*(1.48381810635294e-20*fs - 4.85667222995519e-17) + 2.24244100553338e-14)) + fs*(fs*(fs*(3.70954526588234e-22*fs - 1.95607711066527e-18) + 2.9400119394493e-15) - 5.80341875138039e-13) + middle*(pow(fs,3)*middle*(-1.6022078488811e-22*fs + 5.60610251383346e-19) + pow(fs,2)*(fs*(-2.10733741700124e-22*fs + 3.33116236329232e-19) + 5.80341875138039e-16)) + treble*(bass*(-7.89264950187733e-21*pow(fs,4)*middle + pow(fs,3)*(-1.48381810635294e-20*fs + 7.89264950187733e-18)) + pow(fs,2)*(fs*(-3.70954526588234e-22*fs + 9.39225290723401e-19) - 1.97316237546933e-16) + middle*(1.97316237546933e-22*pow(fs,4)*middle + pow(fs,3)*(1.736382890413e-22*fs + 1.97316237546933e-19))))) + treble*(bass*(pow(fs,2)*middle*(fs*(2.61993027449037e-19*fs - 9.59435425698876e-16) + 1.49496067035559e-13) + fs*(fs*(fs*(6.0658484187708e-19*fs - 2.08432881469588e-15) + 1.24048803172573e-12) - 1.49496067035559e-10)) + fs*(fs*(fs*(1.5164621046927e-20*fs - 8.24374624612509e-17) + 1.33228202155789e-13) - 4.33244554519717e-11) + middle*(pow(fs,2)*middle*(fs*(-6.54982568622593e-21*fs + 2.39858856424719e-17) - 3.73740167588897e-15) + fs*(fs*(fs*(-8.61479536070106e-21*fs + 1.50226833524732e-17) + 2.15036009467815e-14) - 3.86894583425359e-12)) + treble*(bass*(pow(fs,3)*middle*(-3.22651511636745e-19*fs + 5.26176633458489e-17) + pow(fs,2)*(fs*(-6.0658484187708e-19*fs + 4.21572718726941e-16) - 5.26176633458489e-14)) + fs*(fs*(fs*(-1.5164621046927e-20*fs + 4.08685600620275e-17) - 1.43277897290746e-14) + 1.31544158364622e-12) + middle*(pow(fs,3)*middle*(8.06628779091864e-21*fs - 1.31544158364622e-18) + pow(fs,2)*(fs*(7.09833325600836e-21*fs + 6.90869919730996e-18) - 1.31544158364622e-15))) + 3.86894583425359e-9) + 1.58626779204397e-8;
164    };
165
166p6 =
167    fi.iir((b0/a0,b1/a0,b2/a0),(a1/a0,a2/a0)) :
168    s06_stage5clip
169
170    with {
171        fs = float(ma.SR);
172
173        b0 = 2.82461475968336e-10*pow(fs,2);
174        b1 = -5.64922951936672e-10*pow(fs,2);
175        b2 = 2.82461475968336e-10*pow(fs,2);
176
177        a0 = fs*(4.33570405894608e-10*fs + 2.19519582346283e-8) + 9.08235621017275e-8;
178        a1 = -8.67140811789215e-10*pow(fs,2) + 1.81647124203455e-7;
179        a2 = fs*(4.33570405894608e-10*fs - 2.19519582346283e-8) + 9.08235621017275e-8;
180    };
181
182s06_stage5clip =
183    _<:
184        ba.if(signbit(_), s06_stage5_neg_clip, s06_stage5_clip)
185    :>_
186
187    with {
188        signbit = ffunction(int signbit(float), "math.h", "");
189        s06_stage5_clip = ffunction(float s06_stage5clip(float), "generated/stage/mesa_dual_rect_red/s06_stage5_table.h", "");
190        s06_stage5_neg_clip = ffunction(float s06_stage5_negclip(float), "generated/stage/mesa_dual_rect_red/s06_stage5_neg_table.h", "");
191    };
192
193p7 =
194    fi.iir((b0/a0,b1/a0),(a1/a0)) :
195    s07_stage6clip
196
197    with {
198        fs = float(ma.SR);
199
200        b0 = -0.00119749787393626*fs - 0.123708458051269;
201        b1 = 0.00119749787393626*fs - 0.123708458051269;
202
203        a0 = 2.07375662139675e-5*fs + 0.00459682172955979;
204        a1 = -2.07375662139675e-5*fs + 0.00459682172955979;
205    };
206
207s07_stage6clip =
208    _<:
209        ba.if(signbit(_), s07_stage6_neg_clip, s07_stage6_clip)
210    :>_
211
212    with {
213        signbit = ffunction(int signbit(float), "math.h", "");
214        s07_stage6_clip = ffunction(float s07_stage6clip(float), "generated/stage/mesa_dual_rect_red/s07_stage6_table.h", "");
215        s07_stage6_neg_clip = ffunction(float s07_stage6_negclip(float), "generated/stage/mesa_dual_rect_red/s07_stage6_neg_table.h", "");
216    };
217
218
219process =
220    *(pregain) :
221    *(0.02) :
222    p1 :
223    *(0.7) :
224    p2 :
225    *(1.05) :
226    p3 :
227    *(3.2) :
228    p4 :
229    p5 :
230    *(20.0) :
231    p6 :
232    *(8.0) :
233    p7 :
234    *(0.02) :
235    *(postgain)
236
237    with {
238        pregain     = ampctrl.pregain;
239        postgain    = ampctrl.postgain;
240        tune1       = ampctrl.tune1;
241        tune2       = ampctrl.tune2;
242        tune3       = ampctrl.tune3;
243        tune4       = ampctrl.tune4;
244        tune5       = ampctrl.tune5;
245        tune6       = ampctrl.tune6;
246        tune7       = ampctrl.tune7;
247        tune8       = ampctrl.tune8;
248        tune9       = ampctrl.tune9;
249        tune10      = ampctrl.tune10;
250    };
251
252