1/*
2 * Simulation of Peavey 5150II crunch 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 */
20declare id "peavey_5150ii_crunch";
21declare name "peavey_5150ii_crunch";
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),(a1/a0,a2/a0,a3/a0,a4/a0)) :
29    s01_stage1clip
30
31    with {
32        fs = float(ma.SR);
33
34        b0 = pow(fs,2)*(-1.41619366649534e-13*fs - 8.63532723472799e-13);
35        b1 = 2.83238733299068e-13*pow(fs,3);
36        b2 = 1.7270654469456e-12*pow(fs,2);
37        b3 = -2.83238733299068e-13*pow(fs,3);
38        b4 = pow(fs,2)*(1.41619366649534e-13*fs - 8.63532723472799e-13);
39
40        a0 = fs*(fs*(fs*(6.72246728677859e-21*fs + 8.7052636265908e-15) + 6.86307224330787e-13) + 1.208780256712e-11) + 4.40771504790753e-11;
41        a1 = fs*(pow(fs,2)*(-2.68898691471143e-20*fs - 1.74105272531816e-14) + 2.41756051342399e-11) + 1.76308601916301e-10;
42        a2 = pow(fs,2)*(4.03348037206715e-20*pow(fs,2) - 1.37261444866157e-12) + 2.64462902874452e-10;
43        a3 = fs*(pow(fs,2)*(-2.68898691471143e-20*fs + 1.74105272531816e-14) - 2.41756051342399e-11) + 1.76308601916301e-10;
44        a4 = fs*(fs*(fs*(6.72246728677859e-21*fs - 8.7052636265908e-15) + 6.86307224330787e-13) - 1.208780256712e-11) + 4.40771504790753e-11;
45    };
46
47s01_stage1clip =
48    _<:
49        ba.if(signbit(_), s01_stage1_neg_clip, s01_stage1_clip)
50    :>_
51    with {
52        signbit = ffunction(int signbit(float), "math.h", "");
53        s01_stage1_clip = ffunction(float s01_stage1clip(float), "generated/stage/peavey_5150ii_crunch/s01_stage1_table.h", "");
54        s01_stage1_neg_clip = ffunction(float s01_stage1_negclip(float), "generated/stage/peavey_5150ii_crunch/s01_stage1_neg_table.h", "");
55    };
56
57p2 =
58    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0,b4/a0),(a1/a0,a2/a0,a3/a0,a4/a0)) :
59    s02_stage2clip
60
61    with {
62        LogPot(a, x) = ba.if(a, (exp(a * x) - 1) / (exp(a) - 1), x);
63        fs = float(ma.SR);
64
65        gain = ampctrl.gain : LogPot(3.0) : si.smooth(0.999);
66
67        b0 = gain*(pow(fs,2)*gain*(fs*(4.65094790958669e-17*fs + 1.37304022225245e-13) + 7.25018598718153e-11) + fs*(fs*(fs*(-4.65094790958669e-17*fs - 1.40723836864647e-13) - 8.25977438589657e-11) - 5.33101910822171e-9));
68        b1 = gain*(pow(fs,3)*gain*(-1.86037916383467e-16*fs - 2.7460804445049e-13) + fs*(pow(fs,2)*(1.86037916383467e-16*fs + 2.81447673729294e-13) - 1.06620382164434e-8));
69        b2 = gain*(pow(fs,2)*gain*(2.79056874575201e-16*pow(fs,2) - 1.45003719743631e-10) + pow(fs,2)*(-2.79056874575201e-16*pow(fs,2) + 1.65195487717931e-10));
70        b3 = gain*(pow(fs,3)*gain*(-1.86037916383467e-16*fs + 2.7460804445049e-13) + fs*(pow(fs,2)*(1.86037916383467e-16*fs - 2.81447673729294e-13) + 1.06620382164434e-8));
71        b4 = gain*(pow(fs,2)*gain*(fs*(4.65094790958669e-17*fs - 1.37304022225245e-13) + 7.25018598718153e-11) + fs*(fs*(fs*(-4.65094790958669e-17*fs + 1.40723836864647e-13) - 8.25977438589657e-11) + 5.33101910822171e-9));
72
73        a0 = fs*(fs*(1.96553718457028e-16*fs + 1.13349301191717e-12) + 1.11617868321251e-9) + gain*(fs*gain*(fs*(fs*(-6.53431917359364e-19*fs - 4.15013217407039e-15) - 4.94521757525643e-12) - 1.12107818776202e-9) + fs*(fs*(fs*(6.53431917359364e-19*fs + 4.00162492012508e-15) + 4.12028433597e-12) + 4.0496760992863e-10) + 6.22821215423343e-8) + 5.85451942497945e-8;
74        a1 = fs*(-3.93107436914056e-16*pow(fs,2) + 2.23235736642502e-9) + gain*(fs*gain*(pow(fs,2)*(2.61372766943745e-18*fs + 8.30026434814079e-15) - 2.24215637552403e-9) + fs*(pow(fs,2)*(-2.61372766943745e-18*fs - 8.00324984025017e-15) + 8.09935219857261e-10) + 2.49128486169337e-7) + 2.34180776999178e-7;
75        a2 = -2.26698602383433e-12*pow(fs,2) + gain*(pow(fs,2)*gain*(-3.92059150415618e-18*pow(fs,2) + 9.89043515051286e-12) + pow(fs,2)*(3.92059150415618e-18*pow(fs,2) - 8.24056867194e-12) + 3.73692729254006e-7) + 3.51271165498767e-7;
76        a3 = fs*(3.93107436914056e-16*pow(fs,2) - 2.23235736642502e-9) + gain*(fs*gain*(pow(fs,2)*(2.61372766943745e-18*fs - 8.30026434814079e-15) + 2.24215637552403e-9) + fs*(pow(fs,2)*(-2.61372766943745e-18*fs + 8.00324984025017e-15) - 8.09935219857261e-10) + 2.49128486169337e-7) + 2.34180776999178e-7;
77        a4 = fs*(fs*(-1.96553718457028e-16*fs + 1.13349301191717e-12) - 1.11617868321251e-9) + gain*(fs*gain*(fs*(fs*(-6.53431917359364e-19*fs + 4.15013217407039e-15) - 4.94521757525643e-12) + 1.12107818776202e-9) + fs*(fs*(fs*(6.53431917359364e-19*fs - 4.00162492012508e-15) + 4.12028433597e-12) - 4.0496760992863e-10) + 6.22821215423343e-8) + 5.85451942497945e-8;
78    };
79
80s02_stage2clip =
81    _<:
82        ba.if(signbit(_), s02_stage2_neg_clip, s02_stage2_clip)
83    :>_
84
85    with {
86        signbit = ffunction(int signbit(float), "math.h", "");
87        s02_stage2_clip = ffunction(float s02_stage2clip(float), "generated/stage/peavey_5150ii_crunch/s02_stage2_table.h", "");
88        s02_stage2_neg_clip = ffunction(float s02_stage2_negclip(float), "generated/stage/peavey_5150ii_crunch/s02_stage2_neg_table.h", "");
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.000471052261884848*fs - 0.0486624237484344;
99        b1 = 0.000471052261884848*fs - 0.0486624237484344;
100
101        a0 = 2.07565118653794e-5*fs + 0.00368743046178661;
102        a1 = -2.07565118653794e-5*fs + 0.00368743046178661;
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/peavey_5150ii_crunch/s03_stage3_table.h", "");
113        s03_stage3_neg_clip = ffunction(float s03_stage3_negclip(float), "generated/stage/peavey_5150ii_crunch/s03_stage3_neg_table.h", "");
114    };
115
116p4 =
117    fi.iir((b0/a0,b1/a0),(a1/a0))
118
119    with {
120        fs = float(ma.SR);
121
122        b0 = 5.82287201278019e-6*fs + 0.00107591870154845;
123        b1 = -5.82287201278019e-6*fs + 0.00107591870154845;
124
125        a0 = 2.07583450601951e-5*fs + 0.0035994371106348;
126        a1 = -2.07583450601951e-5*fs + 0.0035994371106348;
127    };
128
129p5 =
130    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0),(a1/a0,a2/a0,a3/a0))
131    with {
132        LogPot(a, x) = ba.if(a, (exp(a * x) - 1) / (exp(a) - 1), x);
133        fs = float(ma.SR);
134
135        bass   = ampctrl.bass : LogPot(3) : si.smooth(0.999);
136        middle = ampctrl.middle : LogPot(3) : si.smooth(0.999);
137        treble = ampctrl.treble : si.smooth(0.999) ;
138        master = ampctrl.master : LogPot(3) : si.smooth(0.999);
139
140        b0 = bass*fs*(9.89404969304451e-12*fs + 2.81767586220316e-8) + fs*(2.47351242326113e-13*fs + 7.0441896555079e-10) + middle*(bass*pow(fs,2)*(9.74689135900239e-15*fs + 3.09944344842348e-11) + pow(fs,2)*middle*(-2.4367228397506e-16*fs - 7.74860862105869e-13) + fs*(fs*(2.4367228397506e-16*fs + 9.70550136098047e-13) + 6.86629031551501e-10)) + treble*(bass*(bass*fs*(fs*(4.54625321338628e-13*fs + 3.95761987721781e-10) + 1.12707034488126e-6) + fs*(fs*(2.27312660669314e-14*fs + 3.05588370266185e-11) + 3.52927322217472e-8)) + fs*(fs*(2.84140825836642e-16*fs + 5.1661968333935e-13) + 1.77899339992889e-10) + middle*(bass*(bass*pow(fs,2)*(3.89875654360096e-13*fs + 1.23977737936939e-9) + fs*(fs*(-1.2984374707929e-14*fs + 2.89279557508774e-11) - 7.11597359971556e-10)) + fs*(fs*(-5.68281651673284e-16*fs - 7.63970925665462e-13) - 8.82318305543679e-10) + middle*(bass*pow(fs,2)*(-1.94937827180048e-14*fs - 6.19888689684695e-11) + pow(fs,2)*middle*(2.4367228397506e-16*fs + 7.74860862105869e-13) + fs*(fs*(4.04685418615824e-17*fs - 9.70550136098047e-13) - 6.86629031551501e-10))));
141        b1 = bass*fs*(-9.89404969304451e-12*fs + 2.81767586220316e-8) + fs*(-2.47351242326113e-13*fs + 7.0441896555079e-10) + middle*(bass*pow(fs,2)*(-2.92406740770072e-14*fs - 3.09944344842348e-11) + pow(fs,2)*middle*(7.3101685192518e-16*fs + 7.74860862105869e-13) + fs*(fs*(-7.3101685192518e-16*fs - 9.70550136098047e-13) + 6.86629031551501e-10)) + treble*(bass*(bass*fs*(fs*(-1.36387596401588e-12*fs - 3.95761987721781e-10) + 1.12707034488126e-6) + fs*(fs*(-6.81937982007941e-14*fs - 3.05588370266185e-11) + 3.52927322217472e-8)) + fs*(fs*(-8.52422477509927e-16*fs - 5.1661968333935e-13) + 1.77899339992889e-10) + middle*(bass*(bass*pow(fs,2)*(-1.16962696308029e-12*fs - 1.23977737936939e-9) + fs*(fs*(3.8953124123787e-14*fs - 2.89279557508774e-11) - 7.11597359971556e-10)) + fs*(fs*(1.70484495501985e-15*fs + 7.63970925665462e-13) - 8.82318305543679e-10) + middle*(bass*pow(fs,2)*(5.84813481540144e-14*fs + 6.19888689684695e-11) + pow(fs,2)*middle*(-7.3101685192518e-16*fs - 7.74860862105869e-13) + fs*(fs*(-1.21405625584747e-16*fs + 9.70550136098047e-13) - 6.86629031551501e-10))));
142        b2 = bass*fs*(-9.89404969304451e-12*fs - 2.81767586220316e-8) + fs*(-2.47351242326113e-13*fs - 7.0441896555079e-10) + middle*(bass*pow(fs,2)*(2.92406740770072e-14*fs - 3.09944344842348e-11) + pow(fs,2)*middle*(-7.3101685192518e-16*fs + 7.74860862105869e-13) + fs*(fs*(7.3101685192518e-16*fs - 9.70550136098047e-13) - 6.86629031551501e-10)) + treble*(bass*(bass*fs*(fs*(1.36387596401588e-12*fs - 3.95761987721781e-10) - 1.12707034488126e-6) + fs*(fs*(6.81937982007941e-14*fs - 3.05588370266185e-11) - 3.52927322217472e-8)) + fs*(fs*(8.52422477509927e-16*fs - 5.1661968333935e-13) - 1.77899339992889e-10) + middle*(bass*(bass*pow(fs,2)*(1.16962696308029e-12*fs - 1.23977737936939e-9) + fs*(fs*(-3.8953124123787e-14*fs - 2.89279557508774e-11) + 7.11597359971556e-10)) + fs*(fs*(-1.70484495501985e-15*fs + 7.63970925665462e-13) + 8.82318305543679e-10) + middle*(bass*pow(fs,2)*(-5.84813481540144e-14*fs + 6.19888689684695e-11) + pow(fs,2)*middle*(7.3101685192518e-16*fs - 7.74860862105869e-13) + fs*(fs*(1.21405625584747e-16*fs + 9.70550136098047e-13) + 6.86629031551501e-10))));
143        b3 = bass*fs*(9.89404969304451e-12*fs - 2.81767586220316e-8) + fs*(2.47351242326113e-13*fs - 7.0441896555079e-10) + middle*(bass*pow(fs,2)*(-9.74689135900239e-15*fs + 3.09944344842348e-11) + pow(fs,2)*middle*(2.4367228397506e-16*fs - 7.74860862105869e-13) + fs*(fs*(-2.4367228397506e-16*fs + 9.70550136098047e-13) - 6.86629031551501e-10)) + treble*(bass*(bass*fs*(fs*(-4.54625321338628e-13*fs + 3.95761987721781e-10) - 1.12707034488126e-6) + fs*(fs*(-2.27312660669314e-14*fs + 3.05588370266185e-11) - 3.52927322217472e-8)) + fs*(fs*(-2.84140825836642e-16*fs + 5.1661968333935e-13) - 1.77899339992889e-10) + middle*(bass*(bass*pow(fs,2)*(-3.89875654360096e-13*fs + 1.23977737936939e-9) + fs*(fs*(1.2984374707929e-14*fs + 2.89279557508774e-11) + 7.11597359971556e-10)) + fs*(fs*(5.68281651673284e-16*fs - 7.63970925665462e-13) + 8.82318305543679e-10) + middle*(bass*pow(fs,2)*(1.94937827180048e-14*fs - 6.19888689684695e-11) + pow(fs,2)*middle*(-2.4367228397506e-16*fs + 7.74860862105869e-13) + fs*(fs*(-4.04685418615824e-17*fs - 9.70550136098047e-13) + 6.86629031551501e-10))));
144
145        a0 = bass*fs*(fs*(1.13656330334657e-14*fs + 4.97734638455557e-11) + 2.81767586220316e-8) + fs*(fs*(2.84140825836642e-16*fs + 1.76095627947824e-12) + 2.69501894883964e-9) + middle*(bass*pow(fs,2)*(9.74689135900239e-15*fs + 3.09944344842348e-11) + pow(fs,2)*middle*(-2.4367228397506e-16*fs - 7.74860862105869e-13) + fs*(fs*(-4.04685418615824e-17*fs - 2.64352177147328e-14) + 6.86629031551501e-10)) + 6.24208210501365e-7;
146        a1 = bass*fs*(fs*(-3.40968991003971e-14*fs - 4.97734638455557e-11) + 2.81767586220316e-8) + fs*(fs*(-8.52422477509927e-16*fs - 1.76095627947824e-12) + 2.69501894883964e-9) + middle*(bass*pow(fs,2)*(-2.92406740770072e-14*fs - 3.09944344842348e-11) + pow(fs,2)*middle*(7.3101685192518e-16*fs + 7.74860862105869e-13) + fs*(fs*(1.21405625584747e-16*fs + 2.64352177147328e-14) + 6.86629031551501e-10)) + 1.87262463150409e-6;
147        a2 = bass*fs*(fs*(3.40968991003971e-14*fs - 4.97734638455557e-11) - 2.81767586220316e-8) + fs*(fs*(8.52422477509927e-16*fs - 1.76095627947824e-12) - 2.69501894883964e-9) + middle*(bass*pow(fs,2)*(2.92406740770072e-14*fs - 3.09944344842348e-11) + pow(fs,2)*middle*(-7.3101685192518e-16*fs + 7.74860862105869e-13) + fs*(fs*(-1.21405625584747e-16*fs + 2.64352177147328e-14) - 6.86629031551501e-10)) + 1.87262463150409e-6;
148        a3 = bass*fs*(fs*(-1.13656330334657e-14*fs + 4.97734638455557e-11) - 2.81767586220316e-8) + fs*(fs*(-2.84140825836642e-16*fs + 1.76095627947824e-12) - 2.69501894883964e-9) + middle*(bass*pow(fs,2)*(-9.74689135900239e-15*fs + 3.09944344842348e-11) + pow(fs,2)*middle*(2.4367228397506e-16*fs - 7.74860862105869e-13) + fs*(fs*(4.04685418615824e-17*fs - 2.64352177147328e-14) - 6.86629031551501e-10)) + 6.24208210501365e-7;
149    };
150
151p6 =
152    fi.iir((b0/a0,b1/a0,b2/a0,b3/a0),(a1/a0,a2/a0,a3/a0)) :
153    s06_stage4clip
154
155    with {
156        fs = float(ma.SR);
157
158        b0 = 8.82123032648896e-15*pow(fs,3);
159        b1 = -2.64636909794669e-14*pow(fs,3);
160        b2 = 2.64636909794669e-14*pow(fs,3);
161        b3 = -8.82123032648896e-15*pow(fs,3);
162
163        a0 = fs*(fs*(9.03361060537002e-15*fs + 4.14420870053604e-13) + 2.29677429297512e-12) + 1.14901989819789e-12;
164        a1 = fs*(fs*(-2.71008318161101e-14*fs - 4.14420870053604e-13) + 2.29677429297512e-12) + 3.44705969459367e-12;
165        a2 = fs*(fs*(2.71008318161101e-14*fs - 4.14420870053604e-13) - 2.29677429297512e-12) + 3.44705969459367e-12;
166        a3 = fs*(fs*(-9.03361060537002e-15*fs + 4.14420870053604e-13) - 2.29677429297512e-12) + 1.14901989819789e-12;
167    };
168
169s06_stage4clip =
170    _<:
171        ba.if(signbit(_), s06_stage4_neg_clip, s06_stage4_clip)
172    :>_
173
174    with {
175        signbit = ffunction(int signbit(float), "math.h", "");
176        s06_stage4_clip = ffunction(float s06_stage4clip(float), "generated/stage/peavey_5150ii_crunch/s06_stage4_table.h", "");
177        s06_stage4_neg_clip = ffunction(float s06_stage4_negclip(float), "generated/stage/peavey_5150ii_crunch/s06_stage4_neg_table.h", "");
178    };
179
180p7 =
181    fi.iir((b0/a0,b1/a0,b2/a0),(a1/a0,a2/a0)) :
182    s07_stage5clip
183
184    with {
185        fs = float(ma.SR);
186
187        b0 = fs*(-6.2021647107889e-9*fs - 0.000199940835293);
188        b1 = 1.24043294215778e-8*pow(fs,2);
189        b2 = fs*(-6.2021647107889e-9*fs + 0.000199940835293);
190
191        a0 = fs*(1.3725322285498e-10*fs + 1.42420224832928e-5) + 0.00015149534407047;
192        a1 = -2.74506445709959e-10*pow(fs,2) + 0.00030299068814094;
193        a2 = fs*(1.3725322285498e-10*fs - 1.42420224832928e-5) + 0.00015149534407047;
194    };
195
196s07_stage5clip =
197    _<:
198        ba.if(signbit(_), s07_stage5_neg_clip, s07_stage5_clip)
199    :>_
200
201    with {
202        signbit = ffunction(int signbit(float), "math.h", "");
203        s07_stage5_clip = ffunction(float s07_stage5clip(float), "generated/stage/peavey_5150ii_crunch/s07_stage5_table.h", "");
204        s07_stage5_neg_clip = ffunction(float s07_stage5_negclip(float), "generated/stage/peavey_5150ii_crunch/s07_stage5_neg_table.h", "");
205    };
206
207p8 =
208    fi.iir((b0/a0,b1/a0,b2/a0),(a1/a0,a2/a0)) :
209    s08_stage6clip
210
211    with {
212        fs = float(ma.SR);
213
214        b0 = fs*(4.86576834283976e-12*fs + 6.31789783214569e-10) + 6.84578809362547e-11;
215        b1 = -9.73153668567952e-12*pow(fs,2) + 1.36915761872509e-10;
216        b2 = fs*(4.86576834283976e-12*fs - 6.31789783214569e-10) + 6.84578809362547e-11;
217
218        a0 = fs*(4.33699283765577e-10*fs + 1.57671526976176e-8) + 2.6874624433038e-8;
219        a1 = -8.67398567531154e-10*pow(fs,2) + 5.37492488660761e-8;
220        a2 = fs*(4.33699283765577e-10*fs - 1.57671526976176e-8) + 2.6874624433038e-8;
221    };
222
223s08_stage6clip =
224    _<:
225        ba.if(signbit(_), s08_stage6_neg_clip, s08_stage6_clip)
226    :>_
227
228    with {
229        signbit = ffunction(int signbit(float), "math.h", "");
230        s08_stage6_clip = ffunction(float s08_stage6clip(float), "generated/stage/peavey_5150ii_crunch/s08_stage6_table.h", "");
231        s08_stage6_neg_clip = ffunction(float s08_stage6_negclip(float), "generated/stage/peavey_5150ii_crunch/s08_stage6_neg_table.h", "");
232    };
233
234process =
235    *(pregain) :
236//    *(0.2) :
237    *(0.1) :
238    p1 :
239//    *(1.05) :
240    *(0.7) :
241    p2 :
242    *(1.35) :
243    p3 :
244    p4 :
245//    *(2.15) :
246    *(2.4) :
247    p5 :
248//    *(3.4) :
249    *(4.9) :
250    p6 :
251//    *(5.0) :
252    *(10.24) :
253    p7 :
254//    *(11.8) :
255    *(21.9) :
256    p8 :
257//    *(71.5) :
258    *(75.21) :
259    *(postgain)
260
261    with {
262        pregain     = ampctrl.pregain;
263        postgain    = ampctrl.postgain;
264        tune1       = ampctrl.tune1;
265        tune2       = ampctrl.tune2;
266        tune3       = ampctrl.tune3;
267        tune4       = ampctrl.tune4;
268        tune5       = ampctrl.tune5;
269        tune6       = ampctrl.tune6;
270        tune7       = ampctrl.tune7;
271        tune8       = ampctrl.tune8;
272        tune9       = ampctrl.tune9;
273        tune10      = ampctrl.tune10;
274    };
275