summaryrefslogtreecommitdiff
path: root/plugins/ZamChild670/wdfcircuits.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/ZamChild670/wdfcircuits.h')
-rw-r--r--plugins/ZamChild670/wdfcircuits.h633
1 files changed, 633 insertions, 0 deletions
diff --git a/plugins/ZamChild670/wdfcircuits.h b/plugins/ZamChild670/wdfcircuits.h
new file mode 100644
index 0000000..fda90ac
--- /dev/null
+++ b/plugins/ZamChild670/wdfcircuits.h
@@ -0,0 +1,633 @@
+/************************************************************************************
+*
+* Wavechild670 v0.1
+*
+* wdfcircuits.h
+*
+* By Peter Raffensperger 10 July 2012
+*
+* Reference:
+* Toward a Wave Digital Filter Model of the Fairchild 670 Limiter, Raffensperger, P. A., (2012).
+* Proc. of the 15th International Conference on Digital Audio Effects (DAFx-12),
+* York, UK, September 17-21, 2012.
+*
+* Note:
+* Fairchild (R) a registered trademark of Avid Technology, Inc., which is in no way associated or
+* affiliated with the author.
+*
+* License:
+* Wavechild670 is licensed under the GNU GPL v2 license. If you use this
+* software in an academic context, we would appreciate it if you referenced the original
+* paper.
+*
+************************************************************************************/
+
+
+
+//Autogenerated wave digital filter circuits
+//Peter Raffensperger
+#ifndef WDFCIRCUITS_H
+#define WDFCIRCUITS_H
+
+#include "glue.h"
+#include "generatedwdfutilities.h"
+
+// AUTOGENERATED Wave digital filter 2012-03-14 15:24:51.084121
+// Advanced Machine Audio Python WDF Generator
+// Peter Raffensperger, 2012
+class TubeStageCircuit {
+ /*Circuit schematic: (B = winding symbol)
+ VplateSource
+ |
+ Rplate Primary Secondary
+ | Np : Ns
+ --------Lp---Rp--------------B B------Rs----Ls------------------------
+ | | B B | | |
+ Rc Lm B TXFMR B Cw Routput Rsidechain
+ | | B B | | |
+ -----------------------------B B--------------------------------------
+ |
+ Vgate --Tube
+ |
+ -----------------
+ | |
+ Rcathode Ccathode
+ | |
+ VcathodeSource cathodeCapacitorConn
+ */
+public:
+ TubeStageCircuit(Real C_Ccathode, Real C_Cw, Real E_VcathodeBias, Real E_Vplate, Real L_Lm, Real L_Lp, Real L_Ls, Real NpOverNs, Real R_Rc, Real R_Routput, Real R_Rp, Real R_Rs, Real R_Rsidechain, Real R_VcathodeBias, Real R_Vplate, Real R_cathodeCapacitorConn, BidirectionalUnitDelayInterface* cathodeCapacitorConn_, Real sampleRate, WDFTubeInterface& tube_) : tube(tube_){
+ updateRValues(C_Ccathode, C_Cw, E_VcathodeBias, E_Vplate, L_Lm, L_Lp, L_Ls, NpOverNs, R_Rc, R_Routput, R_Rp, R_Rs, R_Rsidechain, R_VcathodeBias, R_Vplate, R_cathodeCapacitorConn, cathodeCapacitorConn_, sampleRate);
+ Ccathodea = 0.0;
+ Lpa = 0.0;
+ Lma = 0.0;
+ Lsa = 0.0;
+ Cwa = 0.0;
+ Vcathode = 0.0;
+ }
+
+ void updateRValues(Real C_Ccathode, Real C_Cw, Real E_VcathodeBias, Real E_Vplate, Real L_Lm, Real L_Lp, Real L_Ls, Real NpOverNs, Real R_Rc, Real R_Routput, Real R_Rp, Real R_Rs, Real R_Rsidechain, Real R_VcathodeBias, Real R_Vplate, Real R_cathodeCapacitorConn, BidirectionalUnitDelayInterface* cathodeCapacitorConn_, Real sampleRate){
+ Real VcathodeBiasR = R_VcathodeBias;
+ VcathodeBiasE = E_VcathodeBias;
+ Real CcathodeR = 1.0 / (2.0*C_Ccathode*sampleRate);
+ Real VplateR = R_Vplate;
+ VplateE = E_Vplate;
+ Real RoutputR = R_Routput;
+ Real RsidechainR = R_Rsidechain;
+ Real outputParallelConn_1R = RoutputR;
+ Real outputParallelConn_2R = RsidechainR;
+ Real outputParallelConn_3R = 1.0 /(1.0 / outputParallelConn_1R + 1.0 / outputParallelConn_2R);
+ outputParallelConn_3Gamma1 = 1.0 / outputParallelConn_1R/(1.0 / outputParallelConn_1R + 1.0 / outputParallelConn_2R);
+ Assert(outputParallelConn_3Gamma1 >= 0.0 && outputParallelConn_3Gamma1 <= 1.0);
+ Real LpR = 2.0*L_Lp*sampleRate;
+ Real RpR = R_Rp;
+ Real LmR = 2.0*L_Lm*sampleRate;
+ Real RcR = R_Rc;
+ Real LsR = 2.0*L_Ls*sampleRate;
+ Real RsR = R_Rs;
+ Real CwR = 1.0 / (2.0*C_Cw*sampleRate);
+ transformern = 1.0 / NpOverNs;
+ transformerOneOvern = NpOverNs;
+ Real secondaryOutputParallelConn_1R = outputParallelConn_3R;
+ Real secondaryOutputParallelConn_2R = CwR;
+ Real secondaryOutputParallelConn_3R = 1.0 /(1.0 / secondaryOutputParallelConn_1R + 1.0 / secondaryOutputParallelConn_2R);
+ secondaryOutputParallelConn_3Gamma1 = 1.0 / secondaryOutputParallelConn_1R/(1.0 / secondaryOutputParallelConn_1R + 1.0 / secondaryOutputParallelConn_2R);
+ Assert(secondaryOutputParallelConn_3Gamma1 >= 0.0 && secondaryOutputParallelConn_3Gamma1 <= 1.0);
+ Real secondarySeriesConn2_3R = (RsR + LsR);
+ secondarySeriesConn2_3Gamma1 = RsR/(RsR + LsR);
+ Assert(secondarySeriesConn2_3Gamma1 >= 0.0 && secondarySeriesConn2_3Gamma1 <= 1.0);
+ secondarySeriesConn1_3Gamma1 = secondaryOutputParallelConn_3R/(secondaryOutputParallelConn_3R + secondarySeriesConn2_3R);
+ Assert(secondarySeriesConn1_3Gamma1 >= 0.0 && secondarySeriesConn1_3Gamma1 <= 1.0);
+ Real transformerR = (secondaryOutputParallelConn_3R + secondarySeriesConn2_3R)/(transformern*transformern);
+ Real primaryParallelConn1_1R = transformerR;
+ Real primarySeriesConn2_3R = (LpR + RpR);
+ primarySeriesConn2_3Gamma1 = LpR/(LpR + RpR);
+ Assert(primarySeriesConn2_3Gamma1 >= 0.0 && primarySeriesConn2_3Gamma1 <= 1.0);
+ Real primaryParallelConn2_1R = LmR;
+ Real primaryParallelConn2_2R = RcR;
+ Real primaryParallelConn2_3R = 1.0 /(1.0 / primaryParallelConn2_1R + 1.0 / primaryParallelConn2_2R);
+ primaryParallelConn2_3Gamma1 = 1.0 / primaryParallelConn2_1R/(1.0 / primaryParallelConn2_1R + 1.0 / primaryParallelConn2_2R);
+ Assert(primaryParallelConn2_3Gamma1 >= 0.0 && primaryParallelConn2_3Gamma1 <= 1.0);
+ Real primaryParallelConn1_2R = primaryParallelConn2_3R;
+ Real primaryParallelConn1_3R = 1.0 /(1.0 / primaryParallelConn1_1R + 1.0 / primaryParallelConn1_2R);
+ primaryParallelConn1_3Gamma1 = 1.0 / primaryParallelConn1_1R/(1.0 / primaryParallelConn1_1R + 1.0 / primaryParallelConn1_2R);
+ Assert(primaryParallelConn1_3Gamma1 >= 0.0 && primaryParallelConn1_3Gamma1 <= 1.0);
+ Real primaryInputSeriesConn_3R = (primarySeriesConn2_3R + primaryParallelConn1_3R);
+ primaryInputSeriesConn_3Gamma1 = primarySeriesConn2_3R/(primarySeriesConn2_3R + primaryParallelConn1_3R);
+ Assert(primaryInputSeriesConn_3Gamma1 >= 0.0 && primaryInputSeriesConn_3Gamma1 <= 1.0);
+ Real cathodeCapacitorConnR = R_cathodeCapacitorConn;
+ Real cathodeCapSeriesConn_3R = (CcathodeR + cathodeCapacitorConnR);
+ cathodeCapSeriesConn_3Gamma1 = CcathodeR/(CcathodeR + cathodeCapacitorConnR);
+ Assert(cathodeCapSeriesConn_3Gamma1 >= 0.0 && cathodeCapSeriesConn_3Gamma1 <= 1.0);
+ Real cathodeParallelConn_1R = VcathodeBiasR;
+ Real cathodeParallelConn_2R = cathodeCapSeriesConn_3R;
+ Real cathodeParallelConn_3R = 1.0 /(1.0 / cathodeParallelConn_1R + 1.0 / cathodeParallelConn_2R);
+ cathodeParallelConn_3Gamma1 = 1.0 / cathodeParallelConn_1R/(1.0 / cathodeParallelConn_1R + 1.0 / cathodeParallelConn_2R);
+ Assert(cathodeParallelConn_3Gamma1 >= 0.0 && cathodeParallelConn_3Gamma1 <= 1.0);
+ Real tubeSeriesConn1_3R = (primaryInputSeriesConn_3R + VplateR);
+ tubeSeriesConn1_3Gamma1 = primaryInputSeriesConn_3R/(primaryInputSeriesConn_3R + VplateR);
+ Assert(tubeSeriesConn1_3Gamma1 >= 0.0 && tubeSeriesConn1_3Gamma1 <= 1.0);
+ Real tubeSeriesConn2_3R = (tubeSeriesConn1_3R + cathodeParallelConn_3R);
+ tubeSeriesConn2_3Gamma1 = tubeSeriesConn1_3R/(tubeSeriesConn1_3R + cathodeParallelConn_3R);
+ Assert(tubeSeriesConn2_3Gamma1 >= 0.0 && tubeSeriesConn2_3Gamma1 <= 1.0);
+ cathodeCapacitorConn = cathodeCapacitorConn_;
+ tubeR = tubeSeriesConn2_3R;
+ }
+
+ Real advance(Real vgate){
+ //Get Bs
+ //tubeSeriesConn2_3GetB
+ //tubeSeriesConn1_3GetB
+ //primaryInputSeriesConn_3GetB
+ //primarySeriesConn2_3GetB
+ Real Lpb = -Lpa;
+ //primarySeriesConn2_1SetA
+ //RpGetB
+ //primarySeriesConn2_2SetA
+ Real primarySeriesConn2_3b3 = -(Lpb);
+ //primaryInputSeriesConn_1SetA
+ //primaryParallelConn1_3GetB
+ //transformerGetB
+ //secondarySeriesConn1_3GetB
+ //secondaryOutputParallelConn_3GetB
+ //outputParallelConn_3GetB
+ //RoutputGetB
+ //outputParallelConn_1SetA
+ //RsidechainGetB
+ //outputParallelConn_2SetA
+ Real outputParallelConn_3b3 = -outputParallelConn_3Gamma1*(0.0);
+ //secondaryOutputParallelConn_1SetA
+ Real Cwb = Cwa;
+ //secondaryOutputParallelConn_2SetA
+ Real secondaryOutputParallelConn_3b3 = Cwb - secondaryOutputParallelConn_3Gamma1*(Cwb - outputParallelConn_3b3);
+ //secondarySeriesConn1_1SetA
+ //secondarySeriesConn2_3GetB
+ //RsGetB
+ //secondarySeriesConn2_1SetA
+ Real Lsb = -Lsa;
+ //secondarySeriesConn2_2SetA
+ Real secondarySeriesConn2_3b3 = -(Lsb);
+ //secondarySeriesConn1_2SetA
+ Real secondarySeriesConn1_3b3 = -(secondaryOutputParallelConn_3b3 + secondarySeriesConn2_3b3);
+ //primaryParallelConn1_1SetA
+ //primaryParallelConn2_3GetB
+ Real Lmb = -Lma;
+ //primaryParallelConn2_1SetA
+ //RcGetB
+ //primaryParallelConn2_2SetA
+ Real primaryParallelConn2_3b3 = -primaryParallelConn2_3Gamma1*(-Lmb);
+ //primaryParallelConn1_2SetA
+ Real primaryParallelConn1_3b3 = primaryParallelConn2_3b3 - primaryParallelConn1_3Gamma1*(primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern);
+ //primaryInputSeriesConn_2SetA
+ Real primaryInputSeriesConn_3b3 = -(primarySeriesConn2_3b3 + primaryParallelConn1_3b3);
+ //tubeSeriesConn1_1SetA
+ //VplateGetB
+ //tubeSeriesConn1_2SetA
+ Real tubeSeriesConn1_3b3 = -(primaryInputSeriesConn_3b3 + VplateE);
+ //tubeSeriesConn2_1SetA
+ //cathodeParallelConn_3GetB
+ //VcathodeBiasGetB
+ //cathodeParallelConn_1SetA
+ //cathodeCapSeriesConn_3GetB
+ Real Ccathodeb = Ccathodea;
+ //cathodeCapSeriesConn_1SetA
+ //cathodeCapacitorConnGetB
+ //cathodeCapSeriesConn_2SetA
+ Real cathodeCapSeriesConn_3b3 = -(Ccathodeb + cathodeCapacitorConn->getB());
+ //cathodeParallelConn_2SetA
+ Real cathodeParallelConn_3b3 = cathodeCapSeriesConn_3b3 - cathodeParallelConn_3Gamma1*(cathodeCapSeriesConn_3b3 - VcathodeBiasE);
+ //tubeSeriesConn2_2SetA
+ Real tubeSeriesConn2_3b3 = -(tubeSeriesConn1_3b3 + cathodeParallelConn_3b3);
+ //Call tube model
+ Real b = tube.getB(tubeSeriesConn2_3b3, tubeR, vgate, Vcathode);
+ //Set As
+ //tubeSeriesConn2_3SetA
+ Real tubeSeriesConn2_3b1 = tubeSeriesConn1_3b3 - tubeSeriesConn2_3Gamma1*(tubeSeriesConn1_3b3 + cathodeParallelConn_3b3 + b);
+ //tubeSeriesConn1_3SetA
+ Real tubeSeriesConn1_3b1 = primaryInputSeriesConn_3b3 - tubeSeriesConn1_3Gamma1*(primaryInputSeriesConn_3b3 + VplateE + tubeSeriesConn2_3b1);
+ //primaryInputSeriesConn_3SetA
+ Real primaryInputSeriesConn_3b1 = primarySeriesConn2_3b3 - primaryInputSeriesConn_3Gamma1*(primarySeriesConn2_3b3 + primaryParallelConn1_3b3 + tubeSeriesConn1_3b1);
+ //primarySeriesConn2_3SetA
+ Real primarySeriesConn2_3b1 = Lpb - primarySeriesConn2_3Gamma1*(Lpb + primaryInputSeriesConn_3b1);
+ Lpa = primarySeriesConn2_3b1;
+ //RpSetA
+ Real primaryInputSeriesConn_3b2 = -(primarySeriesConn2_3b3 + tubeSeriesConn1_3b1 - primaryInputSeriesConn_3Gamma1*(primarySeriesConn2_3b3 + primaryParallelConn1_3b3 + tubeSeriesConn1_3b1));
+ //primaryParallelConn1_3SetA
+ Real primaryParallelConn1_3b1 = primaryInputSeriesConn_3b2 + primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern - primaryParallelConn1_3Gamma1*(primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern);
+ //transformerSetA
+ //secondarySeriesConn1_3SetA
+ Real secondarySeriesConn1_3b1 = secondaryOutputParallelConn_3b3 - secondarySeriesConn1_3Gamma1*(secondaryOutputParallelConn_3b3 + secondarySeriesConn2_3b3 + primaryParallelConn1_3b1*transformern);
+ //secondaryOutputParallelConn_3SetA
+ //outputParallelConn_3SetA
+ //RoutputSetA
+ //RsidechainSetA
+ Real secondaryOutputParallelConn_3b2 = secondarySeriesConn1_3b1 - secondaryOutputParallelConn_3Gamma1*(Cwb - outputParallelConn_3b3);
+ Cwa = secondaryOutputParallelConn_3b2;
+ Real secondarySeriesConn1_3b2 = -(secondaryOutputParallelConn_3b3 + primaryParallelConn1_3b1*transformern - secondarySeriesConn1_3Gamma1*(secondaryOutputParallelConn_3b3 + secondarySeriesConn2_3b3 + primaryParallelConn1_3b1*transformern));
+ //secondarySeriesConn2_3SetA
+ //RsSetA
+ Real secondarySeriesConn2_3b2 = -(secondarySeriesConn1_3b2 - secondarySeriesConn2_3Gamma1*(Lsb + secondarySeriesConn1_3b2));
+ Lsa = secondarySeriesConn2_3b2;
+ Real primaryParallelConn1_3b2 = primaryInputSeriesConn_3b2 - primaryParallelConn1_3Gamma1*(primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern);
+ //primaryParallelConn2_3SetA
+ Real primaryParallelConn2_3b1 = primaryParallelConn1_3b2 - Lmb - primaryParallelConn2_3Gamma1*(-Lmb);
+ Lma = primaryParallelConn2_3b1;
+ //RcSetA
+ Real tubeSeriesConn2_3b2 = -(tubeSeriesConn1_3b3 + b - tubeSeriesConn2_3Gamma1*(tubeSeriesConn1_3b3 + cathodeParallelConn_3b3 + b));
+ //cathodeParallelConn_3SetA
+ Real cathodeParallelConn_3b2 = tubeSeriesConn2_3b2 - cathodeParallelConn_3Gamma1*(cathodeCapSeriesConn_3b3 - VcathodeBiasE);
+ //cathodeCapSeriesConn_3SetA
+ Real cathodeCapSeriesConn_3b1 = Ccathodeb - cathodeCapSeriesConn_3Gamma1*(Ccathodeb + cathodeCapacitorConn->getB() + cathodeParallelConn_3b2);
+ Ccathodea = cathodeCapSeriesConn_3b1;
+ Real cathodeCapSeriesConn_3b2 = -(Ccathodeb + cathodeParallelConn_3b2 - cathodeCapSeriesConn_3Gamma1*(Ccathodeb + cathodeCapacitorConn->getB() + cathodeParallelConn_3b2));
+ //cathodeCapacitorConnSetA
+ Real cathodeCapacitorConna = cathodeCapSeriesConn_3b2;
+ cathodeCapacitorConn->setA(cathodeCapacitorConna);
+ Vcathode = -(Ccathodea + Ccathodeb);
+ return -(Cwa + Cwb);
+ }
+
+ std::vector<Real> getState(){
+ std::vector<Real> state(6, 0.0);
+ state[0] = Ccathodea;
+ state[1] = Lpa;
+ state[2] = Lma;
+ state[3] = Lsa;
+ state[4] = Cwa;
+ state[5] = Vcathode;
+ return state;
+ }
+ void setState(std::vector<Real> state) {
+ Assert(state.size() == 6);
+ Ccathodea = state[0];
+ Lpa = state[1];
+ Lma = state[2];
+ Lsa = state[3];
+ Cwa = state[4];
+ Vcathode = state[5];
+ }
+private:
+ //State variables
+ Real Ccathodea;
+ Real Lpa;
+ Real Lma;
+ Real Lsa;
+ Real Cwa;
+ Real Vcathode;
+
+ //R values
+ Real outputParallelConn_3Gamma1;
+ BidirectionalUnitDelayInterface* cathodeCapacitorConn;
+ Real primarySeriesConn2_3Gamma1;
+ Real cathodeCapSeriesConn_3Gamma1;
+ Real tubeSeriesConn1_3Gamma1;
+ Real VplateE;
+ Real secondarySeriesConn2_3Gamma1;
+ Real primaryInputSeriesConn_3Gamma1;
+ Real secondaryOutputParallelConn_3Gamma1;
+ Real cathodeParallelConn_3Gamma1;
+ Real secondarySeriesConn1_3Gamma1;
+ Real transformerOneOvern;
+ Real transformern;
+ Real VcathodeBiasE;
+ Real tubeSeriesConn2_3Gamma1;
+ Real primaryParallelConn2_3Gamma1;
+ Real primaryParallelConn1_3Gamma1;
+ Real tubeR;
+ //Extra members
+ WDFTubeInterface tube;
+};
+
+
+
+// AUTOGENERATED Wave digital filter 2012-03-14 15:24:51.132756
+// Advanced Machine Audio Python WDF Generator
+// Peter Raffensperger, 2012
+class TransformerCoupledInputCircuit {
+ /*Circuit schematic:
+ Primary Secondary
+ Np : Ns
+ ----Rin-------Lp---Rp--------------B B------Rs----Ls------------
+ | | | | B B | |
+ Vin RinTerm Rc Lm B TXFMR B Cw Rload
+ | | | | B B | |
+ -----------------------------------B B--------------------------
+ B = winding symbol
+ */
+public:
+ TransformerCoupledInputCircuit(Real C_Cw, Real E_inputSource, Real L_Lm, Real L_Lp, Real L_Ls, Real NpOverNs, Real R_Rc, Real R_RinputTermination, Real R_Rload, Real R_Rp, Real R_Rs, Real R_inputSource, Real sampleRate){
+ updateRValues(C_Cw, E_inputSource, L_Lm, L_Lp, L_Ls, NpOverNs, R_Rc, R_RinputTermination, R_Rload, R_Rp, R_Rs, R_inputSource, sampleRate);
+ Lpa = 0.0;
+ Lma = 0.0;
+ Lsa = 0.0;
+ Cwa = 0.0;
+ }
+
+ void updateRValues(Real C_Cw, Real E_inputSource, Real L_Lm, Real L_Lp, Real L_Ls, Real NpOverNs, Real R_Rc, Real R_RinputTermination, Real R_Rload, Real R_Rp, Real R_Rs, Real R_inputSource, Real sampleRate){
+ Real RloadR = R_Rload;
+ Real inputSourceR = R_inputSource;
+ inputSourceE = E_inputSource;
+ Real RinputTerminationR = R_RinputTermination;
+ Real LpR = 2.0*L_Lp*sampleRate;
+ Real RpR = R_Rp;
+ Real LmR = 2.0*L_Lm*sampleRate;
+ Real RcR = R_Rc;
+ Real LsR = 2.0*L_Ls*sampleRate;
+ Real RsR = R_Rs;
+ Real CwR = 1.0 / (2.0*C_Cw*sampleRate);
+ transformern = 1.0 / NpOverNs;
+ transformerOneOvern = NpOverNs;
+ Real secondaryOutputParallelConn_1R = RloadR;
+ Real secondaryOutputParallelConn_2R = CwR;
+ Real secondaryOutputParallelConn_3R = 1.0 /(1.0 / secondaryOutputParallelConn_1R + 1.0 / secondaryOutputParallelConn_2R);
+ secondaryOutputParallelConn_3Gamma1 = 1.0 / secondaryOutputParallelConn_1R/(1.0 / secondaryOutputParallelConn_1R + 1.0 / secondaryOutputParallelConn_2R);
+ Assert(secondaryOutputParallelConn_3Gamma1 >= 0.0 && secondaryOutputParallelConn_3Gamma1 <= 1.0);
+ Real secondarySeriesConn2_3R = (RsR + LsR);
+ secondarySeriesConn2_3Gamma1 = RsR/(RsR + LsR);
+ Assert(secondarySeriesConn2_3Gamma1 >= 0.0 && secondarySeriesConn2_3Gamma1 <= 1.0);
+ secondarySeriesConn1_3Gamma1 = secondaryOutputParallelConn_3R/(secondaryOutputParallelConn_3R + secondarySeriesConn2_3R);
+ Assert(secondarySeriesConn1_3Gamma1 >= 0.0 && secondarySeriesConn1_3Gamma1 <= 1.0);
+ Real transformerR = (secondaryOutputParallelConn_3R + secondarySeriesConn2_3R)/(transformern*transformern);
+ Real primaryParallelConn1_1R = transformerR;
+ Real primarySeriesConn2_3R = (LpR + RpR);
+ primarySeriesConn2_3Gamma1 = LpR/(LpR + RpR);
+ Assert(primarySeriesConn2_3Gamma1 >= 0.0 && primarySeriesConn2_3Gamma1 <= 1.0);
+ Real primaryParallelConn2_1R = LmR;
+ Real primaryParallelConn2_2R = RcR;
+ Real primaryParallelConn2_3R = 1.0 /(1.0 / primaryParallelConn2_1R + 1.0 / primaryParallelConn2_2R);
+ primaryParallelConn2_3Gamma1 = 1.0 / primaryParallelConn2_1R/(1.0 / primaryParallelConn2_1R + 1.0 / primaryParallelConn2_2R);
+ Assert(primaryParallelConn2_3Gamma1 >= 0.0 && primaryParallelConn2_3Gamma1 <= 1.0);
+ Real primaryParallelConn1_2R = primaryParallelConn2_3R;
+ Real primaryParallelConn1_3R = 1.0 /(1.0 / primaryParallelConn1_1R + 1.0 / primaryParallelConn1_2R);
+ primaryParallelConn1_3Gamma1 = 1.0 / primaryParallelConn1_1R/(1.0 / primaryParallelConn1_1R + 1.0 / primaryParallelConn1_2R);
+ Assert(primaryParallelConn1_3Gamma1 >= 0.0 && primaryParallelConn1_3Gamma1 <= 1.0);
+ Real primaryInputSeriesConn_3R = (primarySeriesConn2_3R + primaryParallelConn1_3R);
+ primaryInputSeriesConn_3Gamma1 = primarySeriesConn2_3R/(primarySeriesConn2_3R + primaryParallelConn1_3R);
+ Assert(primaryInputSeriesConn_3Gamma1 >= 0.0 && primaryInputSeriesConn_3Gamma1 <= 1.0);
+ Real parallelConn_3R = (primaryInputSeriesConn_3R + RinputTerminationR);
+ parallelConn_3Gamma1 = primaryInputSeriesConn_3R/(primaryInputSeriesConn_3R + RinputTerminationR);
+ Assert(parallelConn_3Gamma1 >= 0.0 && parallelConn_3Gamma1 <= 1.0);
+ seriesConn_3Gamma1 = parallelConn_3R/(parallelConn_3R + inputSourceR);
+ Assert(seriesConn_3Gamma1 >= 0.0 && seriesConn_3Gamma1 <= 1.0);
+ }
+
+ Real advance(Real vin){
+ inputSourceE = vin;
+ //Get Bs
+ //seriesConn_3GetB
+ //parallelConn_3GetB
+ //primaryInputSeriesConn_3GetB
+ //primarySeriesConn2_3GetB
+ Real Lpb = -Lpa;
+ //primarySeriesConn2_1SetA
+ //RpGetB
+ //primarySeriesConn2_2SetA
+ Real primarySeriesConn2_3b3 = -(Lpb);
+ //primaryInputSeriesConn_1SetA
+ //primaryParallelConn1_3GetB
+ //transformerGetB
+ //secondarySeriesConn1_3GetB
+ //secondaryOutputParallelConn_3GetB
+ //RloadGetB
+ //secondaryOutputParallelConn_1SetA
+ Real Cwb = Cwa;
+ //secondaryOutputParallelConn_2SetA
+ Real secondaryOutputParallelConn_3b3 = Cwb - secondaryOutputParallelConn_3Gamma1*(Cwb);
+ //secondarySeriesConn1_1SetA
+ //secondarySeriesConn2_3GetB
+ //RsGetB
+ //secondarySeriesConn2_1SetA
+ Real Lsb = -Lsa;
+ //secondarySeriesConn2_2SetA
+ Real secondarySeriesConn2_3b3 = -(Lsb);
+ //secondarySeriesConn1_2SetA
+ Real secondarySeriesConn1_3b3 = -(secondaryOutputParallelConn_3b3 + secondarySeriesConn2_3b3);
+ //primaryParallelConn1_1SetA
+ //primaryParallelConn2_3GetB
+ Real Lmb = -Lma;
+ //primaryParallelConn2_1SetA
+ //RcGetB
+ //primaryParallelConn2_2SetA
+ Real primaryParallelConn2_3b3 = -primaryParallelConn2_3Gamma1*(-Lmb);
+ //primaryParallelConn1_2SetA
+ Real primaryParallelConn1_3b3 = primaryParallelConn2_3b3 - primaryParallelConn1_3Gamma1*(primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern);
+ //primaryInputSeriesConn_2SetA
+ Real primaryInputSeriesConn_3b3 = -(primarySeriesConn2_3b3 + primaryParallelConn1_3b3);
+ //parallelConn_1SetA
+ //RinputTerminationGetB
+ //parallelConn_2SetA
+ Real parallelConn_3b3 = -(primaryInputSeriesConn_3b3);
+ //seriesConn_1SetA
+ //inputSourceGetB
+ //seriesConn_2SetA
+ Real seriesConn_3b3 = -(parallelConn_3b3 + inputSourceE);
+ Real b = -(seriesConn_3b3);
+ //Set As
+ //seriesConn_3SetA
+ Real seriesConn_3b1 = parallelConn_3b3 - seriesConn_3Gamma1*(parallelConn_3b3 + inputSourceE + b);
+ //parallelConn_3SetA
+ Real parallelConn_3b1 = primaryInputSeriesConn_3b3 - parallelConn_3Gamma1*(primaryInputSeriesConn_3b3 + seriesConn_3b1);
+ //primaryInputSeriesConn_3SetA
+ Real primaryInputSeriesConn_3b1 = primarySeriesConn2_3b3 - primaryInputSeriesConn_3Gamma1*(primarySeriesConn2_3b3 + primaryParallelConn1_3b3 + parallelConn_3b1);
+ //primarySeriesConn2_3SetA
+ Real primarySeriesConn2_3b1 = Lpb - primarySeriesConn2_3Gamma1*(Lpb + primaryInputSeriesConn_3b1);
+ Lpa = primarySeriesConn2_3b1;
+ //RpSetA
+ Real primaryInputSeriesConn_3b2 = -(primarySeriesConn2_3b3 + parallelConn_3b1 - primaryInputSeriesConn_3Gamma1*(primarySeriesConn2_3b3 + primaryParallelConn1_3b3 + parallelConn_3b1));
+ //primaryParallelConn1_3SetA
+ Real primaryParallelConn1_3b1 = primaryInputSeriesConn_3b2 + primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern - primaryParallelConn1_3Gamma1*(primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern);
+ //transformerSetA
+ //secondarySeriesConn1_3SetA
+ Real secondarySeriesConn1_3b1 = secondaryOutputParallelConn_3b3 - secondarySeriesConn1_3Gamma1*(secondaryOutputParallelConn_3b3 + secondarySeriesConn2_3b3 + primaryParallelConn1_3b1*transformern);
+ //secondaryOutputParallelConn_3SetA
+ //RloadSetA
+ Real secondaryOutputParallelConn_3b2 = secondarySeriesConn1_3b1 - secondaryOutputParallelConn_3Gamma1*(Cwb);
+ Cwa = secondaryOutputParallelConn_3b2;
+ Real secondarySeriesConn1_3b2 = -(secondaryOutputParallelConn_3b3 + primaryParallelConn1_3b1*transformern - secondarySeriesConn1_3Gamma1*(secondaryOutputParallelConn_3b3 + secondarySeriesConn2_3b3 + primaryParallelConn1_3b1*transformern));
+ //secondarySeriesConn2_3SetA
+ //RsSetA
+ Real secondarySeriesConn2_3b2 = -(secondarySeriesConn1_3b2 - secondarySeriesConn2_3Gamma1*(Lsb + secondarySeriesConn1_3b2));
+ Lsa = secondarySeriesConn2_3b2;
+ Real primaryParallelConn1_3b2 = primaryInputSeriesConn_3b2 - primaryParallelConn1_3Gamma1*(primaryParallelConn2_3b3 - secondarySeriesConn1_3b3*transformerOneOvern);
+ //primaryParallelConn2_3SetA
+ Real primaryParallelConn2_3b1 = primaryParallelConn1_3b2 - Lmb - primaryParallelConn2_3Gamma1*(-Lmb);
+ Lma = primaryParallelConn2_3b1;
+ //RcSetA
+ //RinputTerminationSetA
+ return -(Cwa + Cwb);
+ }
+
+ std::vector<Real> getState(){
+ std::vector<Real> state(4, 0.0);
+ state[0] = Lpa;
+ state[1] = Lma;
+ state[2] = Lsa;
+ state[3] = Cwa;
+ return state;
+ }
+ void setState(std::vector<Real> state) {
+ Assert(state.size() == 4);
+ Lpa = state[0];
+ Lma = state[1];
+ Lsa = state[2];
+ Cwa = state[3];
+ }
+private:
+ //State variables
+ Real Lpa;
+ Real Lma;
+ Real Lsa;
+ Real Cwa;
+
+ //R values
+ Real primarySeriesConn2_3Gamma1;
+ Real seriesConn_3Gamma1;
+ Real secondarySeriesConn2_3Gamma1;
+ Real primaryInputSeriesConn_3Gamma1;
+ Real parallelConn_3Gamma1;
+ Real secondaryOutputParallelConn_3Gamma1;
+ Real secondarySeriesConn1_3Gamma1;
+ Real transformerOneOvern;
+ Real inputSourceE;
+ Real transformern;
+ Real primaryParallelConn2_3Gamma1;
+ Real primaryParallelConn1_3Gamma1;
+ //Extra members
+};
+
+
+
+// AUTOGENERATED Wave digital filter 2012-03-14 15:24:51.156199
+// Advanced Machine Audio Python WDF Generator
+// Peter Raffensperger, 2012
+class LevelTimeConstantCircuit {
+ /*Circuit schematic:
+ --------------------------
+ | | | | |
+ | | | R2 R3
+ Iin R1 C1 | |
+ | | | C2 C3
+ | | | | |
+ --------------------------
+ */
+public:
+ LevelTimeConstantCircuit(Real C_C1, Real C_C2, Real C_C3, Real R_R1, Real R_R2, Real R_R3, Real sampleRate){
+ updateRValues(C_C1, C_C2, C_C3, R_R1, R_R2, R_R3, sampleRate);
+ C1a = 0.0;
+ C2a = 0.0;
+ C3a = 0.0;
+ }
+
+ void updateRValues(Real C_C1, Real C_C2, Real C_C3, Real R_R1, Real R_R2, Real R_R3, Real sampleRate){
+ Real R1R = R_R1;
+ Real C1R = 1.0 / (2.0*C_C1*sampleRate);
+ Real R2R = R_R2;
+ Real C2R = 1.0 / (2.0*C_C2*sampleRate);
+ Real R3R = R_R3;
+ Real C3R = 1.0 / (2.0*C_C3*sampleRate);
+ Real serialConn2_3R = (R2R + C2R);
+ serialConn2_3Gamma1 = R2R/(R2R + C2R);
+ Assert(serialConn2_3Gamma1 >= 0.0 && serialConn2_3Gamma1 <= 1.0);
+ Real serialConn3_3R = (R3R + C3R);
+ serialConn3_3Gamma1 = R3R/(R3R + C3R);
+ Assert(serialConn3_3Gamma1 >= 0.0 && serialConn3_3Gamma1 <= 1.0);
+ Real parallelConn23_1R = serialConn2_3R;
+ Real parallelConn23_2R = serialConn3_3R;
+ Real parallelConn23_3R = 1.0 /(1.0 / parallelConn23_1R + 1.0 / parallelConn23_2R);
+ parallelConn23_3Gamma1 = 1.0 / parallelConn23_1R/(1.0 / parallelConn23_1R + 1.0 / parallelConn23_2R);
+ Assert(parallelConn23_3Gamma1 >= 0.0 && parallelConn23_3Gamma1 <= 1.0);
+ Real parallelConn1_1R = R1R;
+ Real parallelConn1_2R = C1R;
+ Real parallelConn1_3R = 1.0 /(1.0 / parallelConn1_1R + 1.0 / parallelConn1_2R);
+ parallelConn1_3Gamma1 = 1.0 / parallelConn1_1R/(1.0 / parallelConn1_1R + 1.0 / parallelConn1_2R);
+ Assert(parallelConn1_3Gamma1 >= 0.0 && parallelConn1_3Gamma1 <= 1.0);
+ Real parallelConnInput_1R = parallelConn1_3R;
+ Real parallelConnInput_2R = parallelConn23_3R;
+ Real parallelConnInput_3R = 1.0 /(1.0 / parallelConnInput_1R + 1.0 / parallelConnInput_2R);
+ parallelConnInput_3Gamma1 = 1.0 / parallelConnInput_1R/(1.0 / parallelConnInput_1R + 1.0 / parallelConnInput_2R);
+ Assert(parallelConnInput_3Gamma1 >= 0.0 && parallelConnInput_3Gamma1 <= 1.0);
+ Rsource = parallelConnInput_3R;
+ }
+
+ Real advance(Real Iin){
+ //parallelConnInput_3GetB
+ //parallelConn1_3GetB
+ //R1GetB
+ //parallelConn1_1SetA
+ Real C1b = C1a;
+ //parallelConn1_2SetA
+ Real parallelConn1_3b3 = C1b - parallelConn1_3Gamma1*(C1b);
+ //parallelConnInput_1SetA
+ //parallelConn23_3GetB
+ //serialConn2_3GetB
+ //R2GetB
+ //serialConn2_1SetA
+ Real C2b = C2a;
+ //serialConn2_2SetA
+ Real serialConn2_3b3 = -(C2b);
+ //parallelConn23_1SetA
+ //serialConn3_3GetB
+ //R3GetB
+ //serialConn3_1SetA
+ Real C3b = C3a;
+ //serialConn3_2SetA
+ Real serialConn3_3b3 = -(C3b);
+ //parallelConn23_2SetA
+ Real parallelConn23_3b3 = serialConn3_3b3 - parallelConn23_3Gamma1*(serialConn3_3b3 - serialConn2_3b3);
+ //parallelConnInput_2SetA
+ Real parallelConnInput_3b3 = parallelConn23_3b3 - parallelConnInput_3Gamma1*(parallelConn23_3b3 - parallelConn1_3b3);
+ //Current source law
+ Real e = Iin * Rsource;
+ Real b = (parallelConnInput_3b3) - 2.0*e;
+ //parallelConnInput_3SetA
+ Real parallelConnInput_3b1 = b + parallelConn23_3b3 - parallelConn1_3b3 - parallelConnInput_3Gamma1*(parallelConn23_3b3 - parallelConn1_3b3);
+ //parallelConn1_3SetA
+ //R1SetA
+ Real parallelConn1_3b2 = parallelConnInput_3b1 - parallelConn1_3Gamma1*(C1b);
+ C1a = parallelConn1_3b2;
+ Real parallelConnInput_3b2 = b - parallelConnInput_3Gamma1*(parallelConn23_3b3 - parallelConn1_3b3);
+ //parallelConn23_3SetA
+ Real parallelConn23_3b1 = parallelConnInput_3b2 + serialConn3_3b3 - serialConn2_3b3 - parallelConn23_3Gamma1*(serialConn3_3b3 - serialConn2_3b3);
+ //serialConn2_3SetA
+ //R2SetA
+ Real serialConn2_3b2 = -(parallelConn23_3b1 - serialConn2_3Gamma1*(C2b + parallelConn23_3b1));
+ C2a = serialConn2_3b2;
+ Real parallelConn23_3b2 = parallelConnInput_3b2 - parallelConn23_3Gamma1*(serialConn3_3b3 - serialConn2_3b3);
+ //serialConn3_3SetA
+ //R3SetA
+ Real serialConn3_3b2 = -(parallelConn23_3b2 - serialConn3_3Gamma1*(C3b + parallelConn23_3b2));
+ C3a = serialConn3_3b2;
+ return -(C1a + C1b);
+ }
+
+ std::vector<Real> getState(){
+ std::vector<Real> state(3, 0.0);
+ state[0] = C1a;
+ state[1] = C2a;
+ state[2] = C3a;
+ return state;
+ }
+ void setState(std::vector<Real> state) {
+ Assert(state.size() == 3);
+ C1a = state[0];
+ C2a = state[1];
+ C3a = state[2];
+ }
+private:
+ //State variables
+ Real C1a;
+ Real C2a;
+ Real C3a;
+
+ //R values
+ Real serialConn2_3Gamma1;
+ Real Rsource;
+ Real parallelConn1_3Gamma1;
+ Real serialConn3_3Gamma1;
+ Real parallelConnInput_3Gamma1;
+ Real parallelConn23_3Gamma1;
+ //Extra members
+};
+
+#endif
+