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