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