1/*
2 * This is simulation of Mesa/Boogie DC3 preamplifier (lead channel)
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 */
20
21declare id "mesa_dc3_lead";
22declare name "mesa_dc3_lead";
23declare samplerate "96000";
24
25import("stdfaust.lib");
26import("amp_sim.lib");
27
28p1 =
29    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0),(a1/a0,a2/a0,a3/a0)) :
30    c01_stage1clip
31
32    with {
33        fs = float(ma.SR);
34
35        b0 = fs*(fs*(-3.39648147814414e-13*fs - 1.41446620976163e-10) - 6.56277819866868e-9);
36        b1 = fs*(fs*(1.01894444344324e-12*fs + 1.41446620976163e-10) - 6.56277819866868e-9);
37        b2 = fs*(fs*(-1.01894444344324e-12*fs + 1.41446620976163e-10) + 6.56277819866868e-9);
38        b3 = fs*(fs*(3.39648147814414e-13*fs - 1.41446620976163e-10) + 6.56277819866868e-9);
39
40        a0 = fs*(fs*(8.89942320144513e-15*fs + 6.82850398703363e-12) + 1.29352204274063e-9) + 2.7061602658254e-8;
41        a1 = fs*(fs*(-2.66982696043354e-14*fs - 6.82850398703363e-12) + 1.29352204274063e-9) + 8.11848079747621e-8;
42        a2 = fs*(fs*(2.66982696043354e-14*fs - 6.82850398703363e-12) - 1.29352204274063e-9) + 8.11848079747621e-8;
43        a3 = fs*(fs*(-8.89942320144513e-15*fs + 6.82850398703363e-12) - 1.29352204274063e-9) + 2.7061602658254e-8;
44    };
45
46c01_stage1clip =
47    _<:
48        ba.if(signbit(_), c01_stage1_neg_clip, c01_stage1_clip)
49    :>_
50
51    with {
52        signbit = ffunction(int signbit(float), "math.h", "");
53        c01_stage1_clip = ffunction(float c01_stage1clip(float), "generated/stage/mesa_dc3_lead/c01_stage1_table.h", "");
54        c01_stage1_neg_clip = ffunction(float c01_stage1_negclip(float), "generated/stage/mesa_dc3_lead/c01_stage1_neg_table.h", "");
55    };
56
57p2 =
58    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0,b4/a0,b5/a0),(a1/a0,a2/a0,a3/a0,a4/a0,a5/a0)) :
59    c02_stage2clip
60
61    with {
62        fs = float(ma.SR);
63
64        b0 = fs*(fs*(fs*(-1.38696009917964e-19*fs - 7.07691453407809e-16) - 8.17458405579397e-13) - 1.98990640737372e-10);
65        b1 = fs*(fs*(fs*(4.16088029753892e-19*fs + 7.07691453407809e-16) - 8.17458405579397e-13) - 5.96971922212115e-10);
66        b2 = fs*(fs*(fs*(-2.77392019835928e-19*fs + 1.41538290681562e-15) + 1.63491681115879e-12) - 3.97981281474744e-10);
67        b3 = fs*(fs*(fs*(-2.77392019835928e-19*fs - 1.41538290681562e-15) + 1.63491681115879e-12) + 3.97981281474744e-10);
68        b4 = fs*(fs*(fs*(4.16088029753892e-19*fs - 7.07691453407809e-16) - 8.17458405579397e-13) + 5.96971922212115e-10);
69        b5 = fs*(fs*(fs*(-1.38696009917964e-19*fs + 7.07691453407809e-16) - 8.17458405579397e-13) + 1.98990640737372e-10);
70
71        a0 = fs*(fs*(fs*(fs*(3.34293501026707e-24*fs + 2.64768858761465e-20) + 6.78047575088276e-17) + 6.80456501843159e-14) + 2.3514292335315e-11) + 3.96245678087155e-10;
72        a1 = fs*(fs*(fs*(fs*(-1.67146750513354e-23*fs - 7.94306576284395e-20) - 6.78047575088276e-17) + 6.80456501843159e-14) + 7.0542877005945e-11) + 1.98122839043578e-9;
73        a2 = fs*(fs*(fs*(fs*(3.34293501026707e-23*fs + 5.2953771752293e-20) - 1.35609515017655e-16) - 1.36091300368632e-13) + 4.702858467063e-11) + 3.96245678087155e-9;
74        a3 = fs*(fs*(fs*(fs*(-3.34293501026707e-23*fs + 5.2953771752293e-20) + 1.35609515017655e-16) - 1.36091300368632e-13) - 4.702858467063e-11) + 3.96245678087155e-9;
75        a4 = fs*(fs*(fs*(fs*(1.67146750513354e-23*fs - 7.94306576284395e-20) + 6.78047575088276e-17) + 6.80456501843159e-14) - 7.0542877005945e-11) + 1.98122839043578e-9;
76        a5 = fs*(fs*(fs*(fs*(-3.34293501026707e-24*fs + 2.64768858761465e-20) - 6.78047575088276e-17) + 6.80456501843159e-14) - 2.3514292335315e-11) + 3.96245678087155e-10;
77    };
78
79c02_stage2clip =
80    _<:
81        ba.if(signbit(_), c02_stage2_neg_clip, c02_stage2_clip)
82    :>_
83
84    with {
85        signbit = ffunction(int signbit(float), "math.h", "");
86        c02_stage2_clip = ffunction(float c02_stage2clip(float), "generated/stage/mesa_dc3_lead/c02_stage2_table.h", "");
87        c02_stage2_neg_clip = ffunction(float c02_stage2_negclip(float), "generated/stage/mesa_dc3_lead/c02_stage2_neg_table.h", "");
88    };
89
90p3 =
91    fi.iir((b0/a0,b1/a0,b2/a0),(a1/a0,a2/a0)) :
92    c03_stage3clip
93
94    with {
95        fs = float(ma.SR);
96        LogPot(a, x) = ba.if(a, (exp(a * x) - 1) / (exp(a) - 1), x);
97
98        gain = ampctrl.gain : LogPot(3.0) : si.smooth(0.999);
99
100        b0 = fs*gain*(-2.3819226818044e-8*fs - 5.40118521951115e-6);
101        b1 = 4.76384536360881e-8*pow(fs,2)*gain;
102        b2 = fs*gain*(-2.3819226818044e-8*fs + 5.40118521951115e-6);
103
104        a0 = fs*(4.29738746630271e-10*fs + 2.05792195263156e-7) + 3.9023912239995e-6;
105        a1 = -8.59477493260542e-10*pow(fs,2) + 7.80478244799901e-6;
106        a2 = fs*(4.29738746630271e-10*fs - 2.05792195263156e-7) + 3.9023912239995e-6;
107    };
108
109c03_stage3clip =
110    _<:
111        ba.if(signbit(_), c03_stage3_neg_clip, c03_stage3_clip)
112    :>_
113
114    with {
115        signbit = ffunction(int signbit(float), "math.h", "");
116        c03_stage3_clip = ffunction(float c03_stage3clip(float), "generated/stage/mesa_dc3_lead/c03_stage3_table.h", "");
117        c03_stage3_neg_clip = ffunction(float c03_stage3_negclip(float), "generated/stage/mesa_dc3_lead/c03_stage3_neg_table.h", "");
118    };
119
120p4 =
121    fi.iir((b0/a0,b1/a0),(a1/a0)) :
122    c04_stage4clip
123
124    with {
125        fs = float(ma.SR);
126
127        b0 = -0.000835687299633219*fs - 0.278562433211075;
128        b1 = 0.000835687299633219*fs - 0.278562433211075;
129
130        a0 = 2.05613764909663e-5*fs + 0.0130539284336177;
131        a1 = -2.05613764909663e-5*fs + 0.0130539284336177;
132    };
133
134c04_stage4clip =
135    _<:
136        ba.if(signbit(_), c04_stage4_neg_clip, c04_stage4_clip)
137    :>_
138
139    with {
140        signbit = ffunction(int signbit(float), "math.h", "");
141        c04_stage4_clip = ffunction(float c04_stage4clip(float), "generated/stage/mesa_dc3_lead/c04_stage4_table.h", "");
142        c04_stage4_neg_clip = ffunction(float c04_stage4_negclip(float), "generated/stage/mesa_dc3_lead/c04_stage4_neg_table.h", "");
143    };
144
145p5 =
146    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0,b4/a0),(a1/a0,a2/a0,a3/a0,a4/a0))
147    with {
148        fs = float(ma.SR);
149
150        bass   = ampctrl.bass : si.smooth(0.999);
151        middle = ampctrl.middle : si.smooth(0.999);
152        treble = ampctrl.treble : si.smooth(0.999);
153        master = ampctrl.master : si.smooth(0.999);
154
155        b0 = master*(bass*fs*(fs*(4.20314834832866e-17*fs + 3.22459821904024e-13) + 4.77080423573361e-10) + fs*(fs*(1.05078708708217e-18*fs + 8.0614955476006e-15) + 1.1927010589334e-11)) + middle*(pow(fs,2)*master*middle*(-3.86318782015502e-18*fs - 1.1927010589334e-14) + master*(bass*pow(fs,2)*(1.54527512806201e-16*fs + 4.77080423573361e-13) + fs*(fs*(3.86318782015502e-18*fs + 1.48360375623423e-14) + 1.16361078920332e-11))) + treble*(-9.54160847146722e-18*pow(fs,3)*master*middle + master*(3.81664338858689e-16*bass*pow(fs,3) + fs*(fs*(1.21369259757063e-17*fs + 1.98744722795927e-14) + 2.9090269730083e-12)));
156        b1 = master*(bass*fs*(-8.40629669665732e-17*pow(fs,2) + 9.54160847146722e-10) + fs*(-2.10157417416433e-18*pow(fs,2) + 2.3854021178668e-11)) + middle*(7.72637564031004e-18*pow(fs,3)*master*middle + master*(-3.09055025612402e-16*bass*pow(fs,3) + fs*(-7.72637564031004e-18*pow(fs,2) + 2.32722157840664e-11))) + treble*(1.90832169429344e-17*pow(fs,3)*master*middle + master*(-7.63328677717377e-16*bass*pow(fs,3) + fs*(-2.42738519514126e-17*pow(fs,2) + 5.8180539460166e-12)));
157        b2 = -3.97489445591854e-14*pow(fs,2)*master*treble + master*(-6.44919643808048e-13*bass*pow(fs,2) - 1.61229910952012e-14*pow(fs,2)) + middle*(2.3854021178668e-14*pow(fs,2)*master*middle + master*(-9.54160847146722e-13*bass*pow(fs,2) - 2.96720751246846e-14*pow(fs,2)));
158        b3 = master*(bass*fs*(8.40629669665732e-17*pow(fs,2) - 9.54160847146722e-10) + fs*(2.10157417416433e-18*pow(fs,2) - 2.3854021178668e-11)) + middle*(-7.72637564031004e-18*pow(fs,3)*master*middle + master*(3.09055025612402e-16*bass*pow(fs,3) + fs*(7.72637564031004e-18*pow(fs,2) - 2.32722157840664e-11))) + treble*(-1.90832169429344e-17*pow(fs,3)*master*middle + master*(7.63328677717377e-16*bass*pow(fs,3) + fs*(2.42738519514126e-17*pow(fs,2) - 5.8180539460166e-12)));
159        b4 = master*(bass*fs*(fs*(-4.20314834832866e-17*fs + 3.22459821904024e-13) - 4.77080423573361e-10) + fs*(fs*(-1.05078708708217e-18*fs + 8.0614955476006e-15) - 1.1927010589334e-11)) + middle*(pow(fs,2)*master*middle*(3.86318782015502e-18*fs - 1.1927010589334e-14) + master*(bass*pow(fs,2)*(-1.54527512806201e-16*fs + 4.77080423573361e-13) + fs*(fs*(-3.86318782015502e-18*fs + 1.48360375623423e-14) - 1.16361078920332e-11))) + treble*(9.54160847146722e-18*pow(fs,3)*master*middle + master*(-3.81664338858689e-16*bass*pow(fs,3) + fs*(fs*(-1.21369259757063e-17*fs + 1.98744722795927e-14) - 2.9090269730083e-12)));
160
161        a0 = bass*(fs*(fs*(5.21411574331566e-15*fs + 2.37021932428928e-11) + 9.84531088744928e-9) + 5.8180539460166e-7) + fs*(fs*(1.6149670363376e-16*fs + 9.55623738630908e-13) + 1.23501576528278e-9) + master*(bass*fs*(fs*(fs*(2.60705787165783e-19*fs + 1.18510966214464e-15) + 4.92265544372464e-13) + 2.9090269730083e-11) + fs*(fs*(fs*(8.07483518168802e-21*fs + 4.77811869315454e-17) + 6.1750788264139e-14) + 7.70892147847199e-12) + master*(bass*fs*(fs*(fs*(-6.90889903268356e-20*fs - 3.10986619522479e-16) - 1.17536325817427e-13) - 5.8180539460166e-12) + fs*(fs*(fs*(-2.14247555884914e-21*fs - 1.26155842555098e-17) - 1.61235147200563e-14) - 2.00722861137573e-12))) + middle*(bass*fs*(fs*(2.33141057724777e-15*fs + 7.77873812582419e-12) + 5.8180539460166e-10) + fs*(fs*(-5.62140372264124e-17*fs - 2.28620429808722e-13) + 1.5417842956944e-10) + master*(bass*pow(fs,2)*(fs*(1.16570528862389e-19*fs + 3.88936906291209e-16) + 2.9090269730083e-14) + pow(fs,2)*(fs*(-2.81070186132062e-21*fs - 1.14310214904361e-17) + 7.70892147847199e-15) + master*(bass*pow(fs,2)*(fs*(-2.94952062847257e-20*fs - 9.68705982011763e-17) - 5.8180539460166e-15) + pow(fs,2)*(fs*(7.89277198316611e-22*fs + 3.21942015102828e-18) - 2.00722861137573e-15))) + middle*(fs*(fs*(-5.82852644311943e-17*fs - 1.94468453145605e-13) - 1.45451348650415e-11) + master*(pow(fs,2)*master*(fs*(7.37380157118143e-22*fs + 2.42176495502941e-18) + 1.45451348650415e-16) + pow(fs,2)*(fs*(-2.91426322155971e-21*fs - 9.72342265728024e-18) - 7.27256743252075e-16)))) + treble*(bass*fs*(fs*(5.03666602885078e-15*fs + 2.11265174887755e-11) + 5.67260259736618e-9) + fs*(fs*(1.58358119524258e-16*fs + 9.06359715926249e-13) + 1.17190151607639e-9) + master*(bass*pow(fs,2)*(fs*(2.51833301442539e-19*fs + 1.05632587443877e-15) + 2.83630129868309e-13) + fs*(fs*(fs*(7.91790597621291e-21*fs + 4.53179857963125e-17) + 5.85950758038196e-14) + 7.27256743252074e-12) + master*(bass*pow(fs,2)*(fs*(-5.03666602885078e-20*fs - 2.11265174887755e-16) - 5.67260259736618e-14) + fs*(fs*(fs*(-1.58358119524258e-21*fs - 9.06359715926249e-18) - 1.17190151607639e-14) - 1.45451348650415e-12))) + middle*(bass*pow(fs,2)*(9.77433062930788e-16*fs + 5.67260259736618e-12) + fs*(fs*(-9.48342793200705e-17*fs - 2.98902521476603e-13) + 1.45451348650415e-10) + master*(bass*pow(fs,3)*(4.88716531465394e-20*fs + 2.83630129868309e-16) + pow(fs,2)*(fs*(-4.74171396600353e-21*fs - 1.49451260738301e-17) + 7.27256743252075e-15) + master*(bass*pow(fs,3)*(-9.77433062930788e-21*fs - 5.67260259736618e-17) + pow(fs,2)*(fs*(9.48342793200705e-22*fs + 2.98902521476603e-18) - 1.45451348650415e-15))) + middle*(pow(fs,2)*(-2.44358265732697e-17*fs - 1.41815064934155e-13) + master*(pow(fs,3)*master*(2.44358265732697e-22*fs + 1.41815064934155e-18) + pow(fs,3)*(-1.22179132866349e-21*fs - 7.09075324670773e-18)))) + treble*(bass*pow(fs,2)*(-5.16643190406274e-15*fs - 1.45451348650415e-12) + fs*(fs*(-1.61602266404557e-16*fs - 2.84793740657512e-13) - 3.63628371626037e-11) + master*(bass*pow(fs,3)*(-2.58321595203137e-19*fs - 7.27256743252074e-17) + pow(fs,2)*(fs*(-8.08011332022785e-21*fs - 1.42396870328756e-17) - 1.81814185813019e-15) + master*(bass*pow(fs,3)*(5.16643190406274e-20*fs + 1.45451348650415e-17) + pow(fs,2)*(fs*(1.61602266404557e-21*fs + 2.84793740657512e-18) + 3.63628371626037e-16))) + middle*(-1.45451348650415e-15*bass*pow(fs,3) + pow(fs,2)*(8.29072687307365e-17*fs - 3.63628371626037e-14) + master*(-7.27256743252075e-20*bass*pow(fs,4) + pow(fs,3)*(4.14536343653682e-21*fs - 1.81814185813019e-18) + master*(1.45451348650415e-20*bass*pow(fs,4) + pow(fs,3)*(-8.29072687307365e-22*fs + 3.63628371626037e-19))) + middle*(3.63628371626037e-17*pow(fs,3) + master*(-3.63628371626037e-22*pow(fs,4)*master + 1.81814185813019e-21*pow(fs,4))))) + 1.45451348650415e-7) + 1.5417842956944e-7;
162        a1 = bass*(fs*(-1.04282314866313e-14*pow(fs,2) + 1.96906217748986e-8) + 2.32722157840664e-6) + fs*(-3.22993407267521e-16*pow(fs,2) + 2.47003153056556e-9) + master*(bass*fs*(pow(fs,2)*(-1.04282314866313e-18*fs - 2.37021932428928e-15) + 5.8180539460166e-11) + fs*(pow(fs,2)*(-3.22993407267521e-20*fs - 9.55623738630908e-17) + 1.5417842956944e-11) + master*(bass*fs*(pow(fs,2)*(2.76355961307342e-19*fs + 6.21973239044958e-16) - 1.16361078920332e-11) + fs*(pow(fs,2)*(8.56990223539657e-21*fs + 2.52311685110196e-17) - 4.01445722275145e-12))) + middle*(bass*fs*(-4.66282115449554e-15*pow(fs,2) + 1.16361078920332e-9) + fs*(1.12428074452825e-16*pow(fs,2) + 3.0835685913888e-10) + master*(bass*pow(fs,3)*(-4.66282115449554e-19*fs - 7.77873812582419e-16) + pow(fs,3)*(1.12428074452825e-20*fs + 2.28620429808722e-17) + master*(bass*pow(fs,3)*(1.17980825138903e-19*fs + 1.93741196402353e-16) + pow(fs,3)*(-3.15710879326645e-21*fs - 6.43884030205657e-18))) + middle*(fs*(1.16570528862389e-16*pow(fs,2) - 2.9090269730083e-11) + master*(pow(fs,3)*master*(-2.94952062847257e-21*fs - 4.84352991005882e-18) + pow(fs,3)*(1.16570528862389e-20*fs + 1.94468453145605e-17)))) + treble*(bass*fs*(-1.00733320577016e-14*pow(fs,2) + 1.13452051947324e-8) + fs*(-3.16716239048516e-16*pow(fs,2) + 2.34380303215279e-9) + master*(bass*pow(fs,3)*(-1.00733320577016e-18*fs - 2.11265174887755e-15) + fs*(pow(fs,2)*(-3.16716239048516e-20*fs - 9.06359715926249e-17) + 1.45451348650415e-11) + master*(bass*pow(fs,3)*(2.01466641154031e-19*fs + 4.22530349775509e-16) + fs*(pow(fs,2)*(6.33432478097032e-21*fs + 1.8127194318525e-17) - 2.9090269730083e-12))) + middle*(-1.95486612586158e-15*bass*pow(fs,3) + fs*(1.89668558640141e-16*pow(fs,2) + 2.9090269730083e-10) + master*(bass*pow(fs,3)*(-1.95486612586158e-19*fs - 5.67260259736618e-16) + pow(fs,3)*(1.89668558640141e-20*fs + 2.98902521476603e-17) + master*(bass*pow(fs,3)*(3.90973225172315e-20*fs + 1.13452051947324e-16) + pow(fs,3)*(-3.79337117280282e-21*fs - 5.97805042953205e-18))) + middle*(4.88716531465394e-17*pow(fs,3) + master*(pow(fs,3)*master*(-9.77433062930788e-22*fs - 2.83630129868309e-18) + pow(fs,3)*(4.88716531465394e-21*fs + 1.41815064934155e-17)))) + treble*(1.03328638081255e-14*bass*pow(fs,3) + fs*(3.23204532809114e-16*pow(fs,2) - 7.27256743252075e-11) + master*(bass*pow(fs,3)*(1.03328638081255e-18*fs + 1.45451348650415e-16) + pow(fs,3)*(3.23204532809114e-20*fs + 2.84793740657512e-17) + master*(bass*pow(fs,3)*(-2.06657276162509e-19*fs - 2.9090269730083e-17) + pow(fs,3)*(-6.46409065618228e-21*fs - 5.69587481315025e-18))) + middle*(2.9090269730083e-15*bass*pow(fs,3) - 1.65814537461473e-16*pow(fs,3) + master*(2.9090269730083e-19*bass*pow(fs,4) + pow(fs,3)*(-1.65814537461473e-20*fs + 3.63628371626037e-18) + master*(-5.8180539460166e-20*bass*pow(fs,4) + pow(fs,3)*(3.31629074922946e-21*fs - 7.27256743252074e-19))) + middle*(-7.27256743252074e-17*pow(fs,3) + master*(1.45451348650415e-21*pow(fs,4)*master - 7.27256743252075e-21*pow(fs,4))))) + 5.8180539460166e-7) + 6.16713718277759e-7;
163        a2 = bass*(-4.74043864857856e-11*pow(fs,2) + 3.49083236760996e-6) - 1.91124747726182e-12*pow(fs,2) + master*(bass*pow(fs,2)*(1.5642347229947e-18*pow(fs,2) - 9.84531088744928e-13) + pow(fs,2)*(4.84490110901281e-20*pow(fs,2) - 1.23501576528278e-13) + master*(bass*pow(fs,2)*(-4.14533941961014e-19*pow(fs,2) + 2.35072651634855e-13) + pow(fs,2)*(-1.28548533530949e-20*pow(fs,2) + 3.22470294401127e-14))) + middle*(-1.55574762516484e-11*bass*pow(fs,2) + 4.57240859617444e-13*pow(fs,2) + master*(bass*pow(fs,2)*(6.99423173174331e-19*pow(fs,2) - 5.8180539460166e-14) + pow(fs,2)*(-1.68642111679237e-20*pow(fs,2) - 1.5417842956944e-14) + master*(bass*pow(fs,2)*(-1.76971237708354e-19*pow(fs,2) + 1.16361078920332e-14) + pow(fs,2)*(4.73566318989967e-21*pow(fs,2) + 4.01445722275145e-15))) + middle*(3.88936906291209e-13*pow(fs,2) + master*(pow(fs,2)*master*(4.42428094270886e-21*pow(fs,2) - 2.9090269730083e-16) + pow(fs,2)*(-1.74855793293583e-20*pow(fs,2) + 1.45451348650415e-15)))) + treble*(-4.22530349775509e-11*bass*pow(fs,2) - 1.8127194318525e-12*pow(fs,2) + master*(bass*pow(fs,2)*(1.51099980865523e-18*pow(fs,2) - 5.67260259736618e-13) + pow(fs,2)*(4.75074358572774e-20*pow(fs,2) - 1.17190151607639e-13) + master*(bass*pow(fs,2)*(-3.02199961731047e-19*pow(fs,2) + 1.13452051947324e-13) + pow(fs,2)*(-9.50148717145549e-21*pow(fs,2) + 2.34380303215279e-14))) + middle*(-1.13452051947324e-11*bass*pow(fs,2) + 5.97805042953205e-13*pow(fs,2) + master*(2.93229918879236e-19*bass*pow(fs,4) + pow(fs,2)*(-2.84502837960212e-20*pow(fs,2) - 1.45451348650415e-14) + master*(-5.86459837758473e-20*bass*pow(fs,4) + pow(fs,2)*(5.69005675920423e-21*pow(fs,2) + 2.9090269730083e-15))) + middle*(2.83630129868309e-13*pow(fs,2) + master*(1.46614959439618e-21*pow(fs,4)*master - 7.33074797198091e-21*pow(fs,4)))) + treble*(2.9090269730083e-12*bass*pow(fs,2) + 5.69587481315025e-13*pow(fs,2) + master*(-1.54992957121882e-18*bass*pow(fs,4) + pow(fs,2)*(-4.84806799213671e-20*pow(fs,2) + 3.63628371626037e-15) + master*(3.09985914243764e-19*bass*pow(fs,4) + pow(fs,2)*(9.69613598427342e-21*pow(fs,2) - 7.27256743252075e-16))) + middle*(7.27256743252074e-14*pow(fs,2) + master*middle*(-2.18177022975622e-21*pow(fs,4)*master + 1.09088511487811e-20*pow(fs,4)) + master*(-4.36354045951245e-19*bass*pow(fs,4) + 2.48721806192209e-20*pow(fs,4) + master*(8.72708091902489e-20*bass*pow(fs,4) - 4.97443612384419e-21*pow(fs,4))))) + 8.72708091902489e-7) + 9.25070577416639e-7;
164        a3 = bass*(fs*(1.04282314866313e-14*pow(fs,2) - 1.96906217748986e-8) + 2.32722157840664e-6) + fs*(3.22993407267521e-16*pow(fs,2) - 2.47003153056556e-9) + master*(bass*fs*(pow(fs,2)*(-1.04282314866313e-18*fs + 2.37021932428928e-15) - 5.8180539460166e-11) + fs*(pow(fs,2)*(-3.22993407267521e-20*fs + 9.55623738630908e-17) - 1.5417842956944e-11) + master*(bass*fs*(pow(fs,2)*(2.76355961307342e-19*fs - 6.21973239044958e-16) + 1.16361078920332e-11) + fs*(pow(fs,2)*(8.56990223539657e-21*fs - 2.52311685110196e-17) + 4.01445722275145e-12))) + middle*(bass*fs*(4.66282115449554e-15*pow(fs,2) - 1.16361078920332e-9) + fs*(-1.12428074452825e-16*pow(fs,2) - 3.0835685913888e-10) + master*(bass*pow(fs,3)*(-4.66282115449554e-19*fs + 7.77873812582419e-16) + pow(fs,3)*(1.12428074452825e-20*fs - 2.28620429808722e-17) + master*(bass*pow(fs,3)*(1.17980825138903e-19*fs - 1.93741196402353e-16) + pow(fs,3)*(-3.15710879326645e-21*fs + 6.43884030205657e-18))) + middle*(fs*(-1.16570528862389e-16*pow(fs,2) + 2.9090269730083e-11) + master*(pow(fs,3)*master*(-2.94952062847257e-21*fs + 4.84352991005882e-18) + pow(fs,3)*(1.16570528862389e-20*fs - 1.94468453145605e-17)))) + treble*(bass*fs*(1.00733320577016e-14*pow(fs,2) - 1.13452051947324e-8) + fs*(3.16716239048516e-16*pow(fs,2) - 2.34380303215279e-9) + master*(bass*pow(fs,3)*(-1.00733320577016e-18*fs + 2.11265174887755e-15) + fs*(pow(fs,2)*(-3.16716239048516e-20*fs + 9.06359715926249e-17) - 1.45451348650415e-11) + master*(bass*pow(fs,3)*(2.01466641154031e-19*fs - 4.22530349775509e-16) + fs*(pow(fs,2)*(6.33432478097032e-21*fs - 1.8127194318525e-17) + 2.9090269730083e-12))) + middle*(1.95486612586158e-15*bass*pow(fs,3) + fs*(-1.89668558640141e-16*pow(fs,2) - 2.9090269730083e-10) + master*(bass*pow(fs,3)*(-1.95486612586158e-19*fs + 5.67260259736618e-16) + pow(fs,3)*(1.89668558640141e-20*fs - 2.98902521476603e-17) + master*(bass*pow(fs,3)*(3.90973225172315e-20*fs - 1.13452051947324e-16) + pow(fs,3)*(-3.79337117280282e-21*fs + 5.97805042953205e-18))) + middle*(-4.88716531465394e-17*pow(fs,3) + master*(pow(fs,3)*master*(-9.77433062930788e-22*fs + 2.83630129868309e-18) + pow(fs,3)*(4.88716531465394e-21*fs - 1.41815064934155e-17)))) + treble*(-1.03328638081255e-14*bass*pow(fs,3) + fs*(-3.23204532809114e-16*pow(fs,2) + 7.27256743252075e-11) + master*(bass*pow(fs,3)*(1.03328638081255e-18*fs - 1.45451348650415e-16) + pow(fs,3)*(3.23204532809114e-20*fs - 2.84793740657512e-17) + master*(bass*pow(fs,3)*(-2.06657276162509e-19*fs + 2.9090269730083e-17) + pow(fs,3)*(-6.46409065618228e-21*fs + 5.69587481315025e-18))) + middle*(-2.9090269730083e-15*bass*pow(fs,3) + 1.65814537461473e-16*pow(fs,3) + master*(2.9090269730083e-19*bass*pow(fs,4) + pow(fs,3)*(-1.65814537461473e-20*fs - 3.63628371626037e-18) + master*(-5.8180539460166e-20*bass*pow(fs,4) + pow(fs,3)*(3.31629074922946e-21*fs + 7.27256743252074e-19))) + middle*(7.27256743252074e-17*pow(fs,3) + master*(1.45451348650415e-21*pow(fs,4)*master - 7.27256743252075e-21*pow(fs,4))))) + 5.8180539460166e-7) + 6.16713718277759e-7;
165        a4 = bass*(fs*(fs*(-5.21411574331566e-15*fs + 2.37021932428928e-11) - 9.84531088744928e-9) + 5.8180539460166e-7) + fs*(fs*(-1.6149670363376e-16*fs + 9.55623738630908e-13) - 1.23501576528278e-9) + master*(bass*fs*(fs*(fs*(2.60705787165783e-19*fs - 1.18510966214464e-15) + 4.92265544372464e-13) - 2.9090269730083e-11) + fs*(fs*(fs*(8.07483518168802e-21*fs - 4.77811869315454e-17) + 6.1750788264139e-14) - 7.70892147847199e-12) + master*(bass*fs*(fs*(fs*(-6.90889903268356e-20*fs + 3.10986619522479e-16) - 1.17536325817427e-13) + 5.8180539460166e-12) + fs*(fs*(fs*(-2.14247555884914e-21*fs + 1.26155842555098e-17) - 1.61235147200563e-14) + 2.00722861137573e-12))) + middle*(bass*fs*(fs*(-2.33141057724777e-15*fs + 7.77873812582419e-12) - 5.8180539460166e-10) + fs*(fs*(5.62140372264124e-17*fs - 2.28620429808722e-13) - 1.5417842956944e-10) + master*(bass*pow(fs,2)*(fs*(1.16570528862389e-19*fs - 3.88936906291209e-16) + 2.9090269730083e-14) + pow(fs,2)*(fs*(-2.81070186132062e-21*fs + 1.14310214904361e-17) + 7.70892147847199e-15) + master*(bass*pow(fs,2)*(fs*(-2.94952062847257e-20*fs + 9.68705982011763e-17) - 5.8180539460166e-15) + pow(fs,2)*(fs*(7.89277198316611e-22*fs - 3.21942015102828e-18) - 2.00722861137573e-15))) + middle*(fs*(fs*(5.82852644311943e-17*fs - 1.94468453145605e-13) + 1.45451348650415e-11) + master*(pow(fs,2)*master*(fs*(7.37380157118143e-22*fs - 2.42176495502941e-18) + 1.45451348650415e-16) + pow(fs,2)*(fs*(-2.91426322155971e-21*fs + 9.72342265728024e-18) - 7.27256743252075e-16)))) + treble*(bass*fs*(fs*(-5.03666602885078e-15*fs + 2.11265174887755e-11) - 5.67260259736618e-9) + fs*(fs*(-1.58358119524258e-16*fs + 9.06359715926249e-13) - 1.17190151607639e-9) + master*(bass*pow(fs,2)*(fs*(2.51833301442539e-19*fs - 1.05632587443877e-15) + 2.83630129868309e-13) + fs*(fs*(fs*(7.91790597621291e-21*fs - 4.53179857963125e-17) + 5.85950758038196e-14) - 7.27256743252074e-12) + master*(bass*pow(fs,2)*(fs*(-5.03666602885078e-20*fs + 2.11265174887755e-16) - 5.67260259736618e-14) + fs*(fs*(fs*(-1.58358119524258e-21*fs + 9.06359715926249e-18) - 1.17190151607639e-14) + 1.45451348650415e-12))) + middle*(bass*pow(fs,2)*(-9.77433062930788e-16*fs + 5.67260259736618e-12) + fs*(fs*(9.48342793200705e-17*fs - 2.98902521476603e-13) - 1.45451348650415e-10) + master*(bass*pow(fs,3)*(4.88716531465394e-20*fs - 2.83630129868309e-16) + pow(fs,2)*(fs*(-4.74171396600353e-21*fs + 1.49451260738301e-17) + 7.27256743252075e-15) + master*(bass*pow(fs,3)*(-9.77433062930788e-21*fs + 5.67260259736618e-17) + pow(fs,2)*(fs*(9.48342793200705e-22*fs - 2.98902521476603e-18) - 1.45451348650415e-15))) + middle*(pow(fs,2)*(2.44358265732697e-17*fs - 1.41815064934155e-13) + master*(pow(fs,3)*master*(2.44358265732697e-22*fs - 1.41815064934155e-18) + pow(fs,3)*(-1.22179132866349e-21*fs + 7.09075324670773e-18)))) + treble*(bass*pow(fs,2)*(5.16643190406274e-15*fs - 1.45451348650415e-12) + fs*(fs*(1.61602266404557e-16*fs - 2.84793740657512e-13) + 3.63628371626037e-11) + master*(bass*pow(fs,3)*(-2.58321595203137e-19*fs + 7.27256743252074e-17) + pow(fs,2)*(fs*(-8.08011332022785e-21*fs + 1.42396870328756e-17) - 1.81814185813019e-15) + master*(bass*pow(fs,3)*(5.16643190406274e-20*fs - 1.45451348650415e-17) + pow(fs,2)*(fs*(1.61602266404557e-21*fs - 2.84793740657512e-18) + 3.63628371626037e-16))) + middle*(1.45451348650415e-15*bass*pow(fs,3) + pow(fs,2)*(-8.29072687307365e-17*fs - 3.63628371626037e-14) + master*(-7.27256743252075e-20*bass*pow(fs,4) + pow(fs,3)*(4.14536343653682e-21*fs + 1.81814185813019e-18) + master*(1.45451348650415e-20*bass*pow(fs,4) + pow(fs,3)*(-8.29072687307365e-22*fs - 3.63628371626037e-19))) + middle*(-3.63628371626037e-17*pow(fs,3) + master*(-3.63628371626037e-22*pow(fs,4)*master + 1.81814185813019e-21*pow(fs,4))))) + 1.45451348650415e-7) + 1.5417842956944e-7;
166    };
167
168p6 =
169    fi.iir((b0/a0,b1/a0,b2/a0),(a1/a0,a2/a0)) :
170    c06_stage5clip
171
172    with {
173        fs = float(ma.SR);
174
175        b0 = (fs*(4.43030830836957e-10*fs + 1.4767694361232e-7) + fs*(-1.41769865867826e-9*fs - 4.72566219559423e-7));
176        b1 = (-8.86061661673914e-10*pow(fs,2) + 2.83539731735652e-9*pow(fs,2));
177        b2 = (fs*(4.43030830836957e-10*fs - 1.4767694361232e-7) + fs*(-1.41769865867826e-9*fs + 4.72566219559423e-7));
178
179        a0 = fs*(4.60626343739698e-10*fs + 3.15389151463859e-7) + (fs*(-3.19269256529294e-11*fs - 4.23302139386303e-8) + (fs*(-6.63815151204305e-11*fs - 3.33208271963413e-8) + 1.63701979461576e-20) - 3.54476885067473e-6) + 1.1343260322159e-5;
180        a1 = -9.21252687479396e-10*pow(fs,2) + (6.38538513058588e-11*pow(fs,2) + (1.32763030240861e-10*pow(fs,2) + 3.27403958923153e-20) - 7.08953770134946e-6) + 2.26865206443179e-5;
181        a2 = fs*(4.60626343739698e-10*fs - 3.15389151463859e-7) + (fs*(-3.19269256529294e-11*fs + 4.23302139386303e-8) + (fs*(-6.63815151204305e-11*fs + 3.33208271963413e-8) + 1.63701979461576e-20) - 3.54476885067473e-6) + 1.1343260322159e-5;
182    };
183
184c06_stage5clip =
185    _<:
186        ba.if(signbit(_), c06_stage5_neg_clip, c06_stage5_clip)
187    :>_
188
189    with {
190        signbit = ffunction(int signbit(float), "math.h", "");
191        c06_stage5_clip = ffunction(float c06_stage5clip(float), "generated/stage/mesa_dc3_lead/c06_stage5_table.h", "");
192        c06_stage5_neg_clip = ffunction(float c06_stage5_negclip(float), "generated/stage/mesa_dc3_lead/c06_stage5_neg_table.h", "");
193    };
194
195process =
196    *(pregain) :
197//    *(0.01) :
198    *(0.05) :
199    p1 :
200    *(0.13) :
201//    *(0.5) :
202    p2 :
203    *(0.9) :
204//    *(1.6) :
205    p3 :
206    *(0.62) :
207//    *(1.5) :
208    p4 :
209    p5 :
210    *(3.28) :
211//    *(2.5) :
212    p6
213    *(4.36) :
214//    *(2.1) :
215    *(postgain)
216
217    with {
218        pregain     = ampctrl.pregain;
219        postgain    = ampctrl.postgain;
220        tune1       = ampctrl.tune1;
221        tune2       = ampctrl.tune2;
222        tune3       = ampctrl.tune3;
223        tune4       = ampctrl.tune4;
224        tune5       = ampctrl.tune5;
225        tune6       = ampctrl.tune6;
226        tune7       = ampctrl.tune7;
227        tune8       = ampctrl.tune8;
228        tune9       = ampctrl.tune9;
229        tune10      = ampctrl.tune10;
230    };
231