├── docs ├── screenshot.png └── fullsnareschematics.png ├── .gitignore ├── src ├── plugin.hpp ├── plugin.cpp ├── WDR8-sd.cpp └── WDF_structs.hpp ├── plugin.json ├── Makefile ├── res ├── WDR-8_Trimpot.svg ├── WDR-8_TinyTrimpot.svg ├── WDR-8_Trimpot_bg.svg ├── WDR-8_TinyTrimpot_bg.svg ├── WDR-8_SmallKnob.svg ├── WDR-8_SmallKnob_bg.svg ├── WDR-8_SmallKnob_Orange_bg.svg ├── WDR-8_SmallKnob_White_bg.svg └── WDR-8_SmallKnob_Yellow_bg.svg ├── README.md └── .github └── workflows └── build-plugin.yml /docs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Simon-L/WDR-8-rack/HEAD/docs/screenshot.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /dist 3 | /plugin.so 4 | /plugin.dylib 5 | /plugin.dll 6 | .DS_Store 7 | /dep -------------------------------------------------------------------------------- /docs/fullsnareschematics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Simon-L/WDR-8-rack/HEAD/docs/fullsnareschematics.png -------------------------------------------------------------------------------- /src/plugin.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include "chowdsp_filters/chowdsp_filters.h" 4 | 5 | using namespace rack; 6 | 7 | // Declare the Plugin, defined in plugin.cpp 8 | extern Plugin* pluginInstance; 9 | 10 | // Declare each Model, defined in each module source file 11 | extern Model* modelWDR8sd; 12 | -------------------------------------------------------------------------------- /src/plugin.cpp: -------------------------------------------------------------------------------- 1 | #include "plugin.hpp" 2 | 3 | 4 | Plugin* pluginInstance; 5 | 6 | 7 | void init(Plugin* p) { 8 | pluginInstance = p; 9 | 10 | // Add modules here 11 | p->addModel(modelWDR8sd); 12 | 13 | // Any other plugin initialization may go here. 14 | // As an alternative, consider lazy-loading assets and lookup tables when your module is created to reduce startup times of Rack. 15 | } 16 | -------------------------------------------------------------------------------- /plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "slug": "WDR8", 3 | "name": "WDR-8", 4 | "version": "2.0.0", 5 | "license": "GPL-3.0", 6 | "brand": "WDR", 7 | "author": "FergusL", 8 | "authorEmail": "", 9 | "authorUrl": "", 10 | "pluginUrl": "", 11 | "manualUrl": "", 12 | "sourceUrl": "", 13 | "donateUrl": "", 14 | "changelogUrl": "", 15 | "modules": [ 16 | { 17 | "slug": "WDR8sd", 18 | "name": "WDR8sd", 19 | "description": "emulation of TR-808 snare drum using WDF", 20 | "tags": [] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # If RACK_DIR is not defined when calling the Makefile, default to two directories above 2 | RACK_DIR ?= ../.. 3 | 4 | # FLAGS will be passed to both the C and C++ compiler 5 | FLAGS += -ffast-math -DXTENSOR_USE_XSIMD -std=c++17 -Idep/chowdsp_utils/modules/dsp -Idep/chowdsp_utils/modules/common -Idep/chowdsp_wdf/include -Idep/xsimd/include 6 | CFLAGS += 7 | CXXFLAGS += 8 | 9 | ifdef ARCH_MAC 10 | # Obvioulsy get rid of this one day 11 | FLAGS += -Wno-c++11-extensions 12 | endif 13 | 14 | 15 | chowdsp := dep/libchowdsp/libchowdsp.a 16 | OBJECTS += $(chowdsp) 17 | DEPS += $(chowdsp) 18 | $(chowdsp): 19 | git clone https://github.com/Chowdhury-DSP/chowdsp_utils dep/chowdsp_utils 20 | mkdir dep/libchowdsp 21 | touch dep/libchowdsp/CMakeLists.txt 22 | echo "add_subdirectory(../chowdsp_utils .)" >> dep/libchowdsp/CMakeLists.txt 23 | echo "setup_chowdsp_lib(chowdsp MODULES chowdsp_filters)" >> dep/libchowdsp/CMakeLists.txt 24 | echo "target_compile_features(chowdsp PRIVATE cxx_std_17)" >> dep/libchowdsp/CMakeLists.txt 25 | cd dep/libchowdsp && $(CMAKE) . -DCMAKE_BUILD_TYPE=Release && make -j16 26 | git clone https://github.com/Chowdhury-DSP/chowdsp_wdf dep/chowdsp_wdf 27 | git clone https://github.com/xtensor-stack/xsimd/ dep/xsimd 28 | 29 | # Careful about linking to shared libraries, since you can't assume much about the user's environment and library search path. 30 | # Static libraries are fine, but they should be added to this plugin's build system. 31 | LDFLAGS += 32 | 33 | # Add .cpp files to the build 34 | SOURCES += $(wildcard src/*.cpp) 35 | 36 | # Add files to the ZIP package when running `make dist` 37 | # The compiled plugin and "plugin.json" are automatically added. 38 | DISTRIBUTABLES += res 39 | DISTRIBUTABLES += $(wildcard LICENSE*) 40 | DISTRIBUTABLES += $(wildcard presets) 41 | 42 | # Include the Rack plugin Makefile framework 43 | include $(RACK_DIR)/plugin.mk 44 | 45 | CXXFLAGS := $(filter-out -std=c++11,$(CXXFLAGS)) -------------------------------------------------------------------------------- /res/WDR-8_Trimpot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 39 | 41 | 49 | 54 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /res/WDR-8_TinyTrimpot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 39 | 42 | 50 | 55 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WDR-8 2 | 3 | ### Wave Digital Rhythm drum machine, based on TR-808 4 | 5 | __:floppy_disk: Download nightly builds [here](https://github.com/Simon-L/WDR-8/releases/tag/Nightly)__ 6 | 7 | ## WDR-8 Snare 8 | 9 | This module emulates the TR-808 snare as faithfully as possible while providing precise control over various parts to allow different snare and percussion sounds to be possible. 10 | As with the original, it is made of two "resonators", high and low, representing the ringing of the drum shell when hit. The other part is made from noise (more precisely violet noise), shaped by an envelope generator that I believe is very important to get the 808 sound. 11 | In the (near?) future, I plan to assemble the actual white noise source circuit and analyse it to make the noise used in the module closer to the original. 12 | 13 | ![](docs/screenshot.png) 14 | 15 | [Original schematics](docs/fullsnareschematics.png) 16 | 17 | W.N = White noise 18 | Trigger comes from top left 19 | 20 | This module uses WDF models for : 21 | - A simplified envelope generator (Q47) with adjustable R and C compononents 22 | - The low shell resonator (IC 14, left) with the shaper at the input 23 | - The high shell resonator (IC 14, right) 24 | - A very simplified diode clipper used as the base for the VCA (Q48) 25 | 26 | The high pass filter (Q49, C66, C67, R201, R202) is not simulated, instead a matching 2-pole Butterworth HPF from ChowDSP is used. 27 | IC 13 has not been analysed and is considered ideal, the Volume knob has this purpose. 28 | 29 | The shell resonators are the work of Jatin Chowdhury, as part of the WaveDigitalFilters repo: https://github.com/jatinchowdhury18/WaveDigitalFilters/tree/master/TR_808/SnareResonator/src 30 | 31 | The programming of this module was the easiest part, most of the time was spent running electronics simulation in a software called LTspice, it has allowed me to simulate and understand the various parts of the complete snare drum circuit and calibrate this real time software version so that it matches the simulation as closely as possible. 32 | It goes without saying that the work also paves the way for other 808 instruments, as well as other Roland drum machines! 33 | 34 | ## Design 35 | 36 | Fonts: [Olyford Semi Bold](https://www.fonts.com/font/nicolassfonts/olyford/semi-bold) and [Noto Sans](https://fonts.google.com/noto/specimen/Noto+Sans) 37 | 38 | Coolors.co palette: https://coolors.co/1d1d1b-c4cac8-fdf189-ff5a00-d54400-e02a12 39 | 40 | ## Acknowledgments 41 | Many thanks to Jatin Chowdhury, Paulbacon, EvilDragon, hemmer, Steve Norgate, Eric Archer, Kurt J. Werner 42 | 43 | https://norgatronics.blogspot.com/2021/11/sd-8081-tuning.html 44 | http://www.ericarcher.net/wp-content/uploads/2014/07/808-svc-man.pdf 45 | https://stacks.stanford.edu/file/druid:jy057cz8322/KurtJamesWernerDissertation-augmented.pdf 46 | https://github.com/jatinchowdhury18/WaveDigitalFilters 47 | 48 | ## License 49 | GPL v3 50 | -------------------------------------------------------------------------------- /res/WDR-8_Trimpot_bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 39 | 45 | 53 | 57 | 61 | 62 | 68 | 76 | 80 | 84 | 85 | 91 | 98 | 106 | 107 | -------------------------------------------------------------------------------- /res/WDR-8_TinyTrimpot_bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 39 | 46 | 54 | 58 | 62 | 63 | 70 | 78 | 82 | 86 | 87 | 94 | 102 | 110 | 111 | -------------------------------------------------------------------------------- /res/WDR-8_SmallKnob.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 47 | 48 | 51 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 120 | -------------------------------------------------------------------------------- /res/WDR-8_SmallKnob_bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 46 | 47 | 49 | 57 | 61 | 65 | 66 | 73 | 78 | 84 | 85 | 93 | 97 | 101 | 102 | 109 | 110 | 111 | 116 | 122 | 123 | 166 | -------------------------------------------------------------------------------- /res/WDR-8_SmallKnob_Orange_bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 46 | 47 | 49 | 57 | 61 | 65 | 66 | 73 | 78 | 84 | 85 | 93 | 97 | 101 | 102 | 109 | 110 | 111 | 116 | 122 | 123 | 170 | -------------------------------------------------------------------------------- /res/WDR-8_SmallKnob_White_bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 46 | 47 | 49 | 57 | 61 | 65 | 66 | 73 | 78 | 84 | 85 | 93 | 97 | 101 | 102 | 109 | 110 | 111 | 116 | 122 | 123 | 176 | -------------------------------------------------------------------------------- /res/WDR-8_SmallKnob_Yellow_bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 46 | 47 | 49 | 57 | 61 | 65 | 66 | 73 | 78 | 84 | 85 | 93 | 97 | 101 | 102 | 109 | 110 | 111 | 116 | 122 | 123 | 176 | -------------------------------------------------------------------------------- /.github/workflows/build-plugin.yml: -------------------------------------------------------------------------------- 1 | # Taken from https://github.com/baconpaul/BaconPlugs/blob/main/.github/workflows/build-plugin.yml 2 | # Base image by @qno! 3 | name: Build VCV Rack Plugin 4 | on: 5 | push: 6 | branches: 7 | - main 8 | - 'releases/**' 9 | pull_request: 10 | 11 | env: 12 | rack-sdk-version: 2.1.2 13 | rack-plugin-toolchain-dir: /home/build/rack-plugin-toolchain 14 | 15 | defaults: 16 | run: 17 | shell: bash 18 | 19 | jobs: 20 | 21 | modify-plugin-version: 22 | name: Modify plugin version 23 | runs-on: ubuntu-latest 24 | if: github.repository_owner == 'Simon-L' 25 | steps: 26 | - uses: actions/checkout@v3 27 | - uses: actions/cache@v2 28 | id: plugin-version-cache 29 | with: 30 | path: plugin.json 31 | key: ${{ github.sha }}-${{ github.run_id }} 32 | - run: | 33 | gitrev=`git rev-parse --short HEAD` 34 | pluginversion=`jq -r '.version' plugin.json` 35 | echo "Set plugin version from $pluginversion to $pluginversion-$gitrev" 36 | cat <<< `jq --arg VERSION "$pluginversion-nightly-$gitrev" '.version=$VERSION' plugin.json` > plugin.json 37 | # only modify plugin version if no tag was created 38 | if: "! startsWith(github.ref, 'refs/tags/v')" 39 | 40 | build: 41 | name: ${{ matrix.platform }} 42 | needs: modify-plugin-version 43 | runs-on: ubuntu-latest 44 | if: github.repository_owner == 'Simon-L' 45 | container: 46 | image: ghcr.io/qno/rack-plugin-toolchain-win-linux:v2 47 | options: --user root 48 | strategy: 49 | fail-fast: false 50 | matrix: 51 | platform: [ win, linux ] 52 | steps: 53 | - uses: actions/checkout@v3 54 | with: 55 | submodules: recursive 56 | - uses: actions/cache@v2 57 | id: plugin-version-cache 58 | with: 59 | path: plugin.json 60 | key: ${{ github.sha }}-${{ github.run_id }} 61 | - name: Build plugin 62 | run: | 63 | export PLUGIN_DIR=$GITHUB_WORKSPACE 64 | pushd ${{ env.rack-plugin-toolchain-dir }} 65 | sed -i "s/-G 'MSYS Makefiles'/-DCMAKE_SYSTEM_NAME=Windows/g" Rack-SDK-win/dep.mk 66 | make plugin-build-${{ matrix.platform }} 67 | - name: Upload artifact 68 | uses: actions/upload-artifact@v2 69 | with: 70 | path: ${{ env.rack-plugin-toolchain-dir }}/plugin-build 71 | name: ${{ matrix.platform }} 72 | 73 | build-mac: 74 | name: mac 75 | needs: modify-plugin-version 76 | runs-on: macos-12 77 | if: github.repository_owner == 'Simon-L' 78 | steps: 79 | - uses: actions/checkout@v3 80 | with: 81 | submodules: recursive 82 | - uses: actions/cache@v2 83 | id: plugin-version-cache 84 | with: 85 | path: plugin.json 86 | key: ${{ github.sha }}-${{ github.run_id }} 87 | - name: Get Rack-SDK 88 | run: | 89 | pushd $HOME 90 | curl -o Rack-SDK.zip https://vcvrack.com/downloads/Rack-SDK-${{ env.rack-sdk-version }}-mac.zip 91 | unzip Rack-SDK.zip 92 | - name: Build plugin 93 | run: | 94 | export RACK_DIR=$HOME/Rack-SDK 95 | make -j dep 96 | make -j dist 97 | - name: Upload artifact 98 | uses: actions/upload-artifact@v2 99 | with: 100 | path: dist 101 | name: mac 102 | 103 | publish: 104 | name: Publish Release 105 | # only create a release if a tag was created that is called e.g. v1.2.3 106 | # see also https://vcvrack.com/manual/Manifest#version 107 | if: startsWith(github.ref, 'refs/tags/v') && github.repository_owner == 'Simon-L' 108 | runs-on: ubuntu-latest 109 | needs: [ build, build-mac ] 110 | steps: 111 | - uses: actions/checkout@v3 112 | - uses: FranzDiebold/github-env-vars-action@v1.2.1 113 | - name: Check if plugin version matches tag 114 | run: | 115 | pluginversion=`jq -r '.version' plugin.json` 116 | if [ "v$pluginversion" != "${{ env.GITHUB_REF_NAME }}" ]; then 117 | echo "Plugin version from plugin.json 'v$pluginversion' doesn't match with tag version '${{ env.GITHUB_REF_NAME }}'" 118 | exit 1 119 | fi 120 | - name: Create Release 121 | uses: actions/create-release@v1 122 | env: 123 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 124 | with: 125 | tag_name: ${{ github.ref }} 126 | release_name: Release ${{ github.ref }} 127 | body: | 128 | ${{ env.GITHUB_REPOSITORY_NAME }} VCV Rack Plugin ${{ env.GITHUB_REF_NAME }} 129 | draft: false 130 | prerelease: false 131 | - uses: actions/download-artifact@v2 132 | with: 133 | path: _artifacts 134 | - name: Upload release assets 135 | uses: svenstaro/upload-release-action@v2 136 | with: 137 | repo_token: ${{ secrets.GITHUB_TOKEN }} 138 | file: _artifacts/**/*.vcvplugin 139 | tag: ${{ github.ref }} 140 | file_glob: true 141 | 142 | publish-nightly: 143 | name: Publish Nightly 144 | # only create a release if a tag was created that is called e.g. v1.2.3 145 | # see also https://vcvrack.com/manual/Manifest#version 146 | if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'Simon-L' }} 147 | runs-on: ubuntu-latest 148 | needs: [ build, build-mac ] 149 | steps: 150 | - uses: actions/download-artifact@v2 151 | with: 152 | path: _artifacts 153 | - name: Delete old release assets 154 | uses: mknejp/delete-release-assets@v1 155 | with: 156 | token: ${{ github.token }} 157 | tag: Nightly # This may also be of the form 'refs/tags/staging' 158 | assets: '*' 159 | - name: Upload release assets 160 | uses: svenstaro/upload-release-action@v2 161 | with: 162 | repo_token: ${{ secrets.GITHUB_TOKEN }} 163 | file: _artifacts/**/*.vcvplugin 164 | tag: Nightly 165 | file_glob: true 166 | -------------------------------------------------------------------------------- /src/WDR8-sd.cpp: -------------------------------------------------------------------------------- 1 | #include "plugin.hpp" 2 | 3 | #include "WDF_structs.hpp" 4 | 5 | // very short current peak with exponential decay, constants selected manually by fitting curves with LTspice 6 | float I1(float x) { 7 | if (x <= 0.0) return 0.0; 8 | return -0.045 * ( 1 / std::exp(x/0.000177)); 9 | } 10 | 11 | struct WDR8sd : Module { 12 | 13 | chowdsp::ButterworthFilter< 2, chowdsp::ButterworthFilterType::Highpass, float> fi; 14 | 15 | EnvelopeGenerator env; 16 | DiodeClipper> vca; 17 | 18 | SnareResonatorLow resoLow; 19 | SnareResonatorHigh resoHigh; 20 | 21 | enum ParamId { 22 | RESOHIGH_FREQ_PARAM, 23 | RESOHIGH_VOL_PARAM, 24 | RESOLOW_FREQ_PARAM, 25 | RESOLOW_VOL_PARAM, 26 | RESO_TUNE_PARAM, 27 | ENVCAP_PARAM, 28 | ENVRES_PARAM, 29 | ENVATTEN_PARAM, 30 | NOISEFREQ_PARAM, 31 | NOISERESO_PARAM, 32 | TONE_PARAM, 33 | SNAPPY_PARAM, 34 | TONECV_PARAM, 35 | SNAPPYCV_PARAM, 36 | ENVRESCV_PARAM, 37 | TUNINGCV_PARAM, 38 | ACCENT_PARAM, 39 | VOLUME_PARAM, 40 | PARAMS_LEN 41 | }; 42 | enum InputId { 43 | TRIGGER_INPUT, 44 | ACCENT_INPUT, 45 | TONE_INPUT, 46 | SNAPPY_INPUT, 47 | ENVRES_INPUT, 48 | TUNING_INPUT, 49 | INPUTS_LEN 50 | }; 51 | enum OutputId { 52 | RESOLOW_OUTPUT, 53 | RESOHIGH_OUTPUT, 54 | ENV_OUTPUT, 55 | CLIP_OUTPUT, 56 | FULL_OUTPUT, 57 | OUTPUTS_LEN 58 | }; 59 | enum LightId { 60 | LIGHTS_LEN 61 | }; 62 | 63 | bool prepared = false; 64 | float I1time = 1000.0; // offset I1 time (envelope current pulse) so that it doesn't trigger when the module initializes, I1time is reset to 0.0 on every trigger 65 | 66 | dsp::SchmittTrigger trigger; 67 | dsp::PulseGenerator pulse; 68 | dsp::ClockDivider parametersDivider; 69 | 70 | WDR8sd() { 71 | config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN); 72 | configParam(RESOHIGH_FREQ_PARAM, -1.0f, 1.0f, 0.0f, "High resonator frequency"); 73 | configParam(RESOHIGH_VOL_PARAM, 0.0f, 2.0f, 1.0f, "High resonator volume"); 74 | configParam(RESOLOW_FREQ_PARAM, -1.0f, 1.0f, 0.0f, "Low resonator frequency"); 75 | configParam(RESOLOW_VOL_PARAM, 0.0f, 4.0f, 1.0f, "Low resonator volume"); 76 | configParam(RESO_TUNE_PARAM, -1.0f, 1.0f, 0.0f, "Resonators tuning"); 77 | configParam(ENVCAP_PARAM, -1.0f, 1.0f, 0.0f, "Envelope capacitor"); 78 | configParam(ENVRES_PARAM, 1.0f, -1.0f, 0.0f, "Envelope resistor"); 79 | configParam(ENVATTEN_PARAM, 0.0f, 2.0f, 1.0f, "Envelope attenuator"); 80 | configParam(NOISERESO_PARAM, 0.01f, 3.0f, 1.0f, "Noise high-pass resonance"); 81 | configParam(TONE_PARAM, 0.0f, 1.0f, 0.5f, "Tone"); 82 | configParam(SNAPPY_PARAM, 0.1f, 2.0f, 0.75f, "Snappy"); 83 | configParam(TONECV_PARAM, 0.0f, 1.0f, 0.0f, "Tone modulation"); 84 | configParam(SNAPPYCV_PARAM, 0.0f, 1.0f, 0.0f, "Snappy modulation"); 85 | configParam(ENVRESCV_PARAM, 0.0f, 1.0f, 0.0f, "Env. decay modulation"); 86 | configParam(TUNINGCV_PARAM, 0.0f, 1.0f, 0.0f, "Main tuning modulation"); 87 | configParam(ACCENT_PARAM, 0.0f, 1.0f, 0.5f, "Accent amount"); 88 | configParam(VOLUME_PARAM, 0.0f, 2.0f, 1.0f, "Output volume"); 89 | 90 | configParam(NOISEFREQ_PARAM, 150.f, 10000.f, 2841.f, "Noise high-pass frequency", " Hz"); 91 | 92 | configInput(TRIGGER_INPUT, "Trigger"); 93 | configInput(ACCENT_INPUT, "Accent"); 94 | configInput(TONE_INPUT, "Tone CV"); 95 | configInput(SNAPPY_INPUT, "Snappy CV"); 96 | configInput(ENVRES_INPUT, "Envelope resistor/decay CV"); 97 | configInput(TUNING_INPUT, "Main tuning CV"); 98 | 99 | configOutput(RESOLOW_OUTPUT, "Low resonator"); 100 | configOutput(RESOHIGH_OUTPUT, "High resonator"); 101 | configOutput(ENV_OUTPUT, "Envelope"); 102 | configOutput(CLIP_OUTPUT, "Clipper VCA"); 103 | configOutput(FULL_OUTPUT, "Full"); 104 | 105 | parametersDivider.setDivision(16); 106 | } 107 | 108 | void prepare(float sr) { 109 | env.prepare(sr); 110 | env.reset(); 111 | 112 | vca.prepare(sr); 113 | vca.reset(); 114 | 115 | resoLow.prepare(sr); 116 | resoLow.reset(); 117 | 118 | resoHigh.prepare(sr); 119 | resoHigh.reset(); 120 | 121 | fi.prepare(1); 122 | fi.calcCoefs(2841, 1.0, sr); 123 | 124 | prepared = true; 125 | } 126 | 127 | void onSampleRateChange(const SampleRateChangeEvent& e) override { 128 | prepare(e.sampleRate); 129 | } 130 | 131 | // https://www.musicdsp.org/en/latest/Synthesis/216-fast-whitenoise-generator.html 132 | float g_fScale = 2.0f / 0xffffffff; 133 | int g_x1 = 0x67452301; 134 | int g_x2 = 0xefcdab89; 135 | 136 | void whitenoise( 137 | float* _fpDstBuffer, // Pointer to buffer 138 | unsigned int _uiBufferSize, // Size of buffer 139 | float _fLevel ) // Noiselevel (0.0 ... 1.0) 140 | { 141 | _fLevel *= g_fScale; 142 | 143 | while( _uiBufferSize-- ) 144 | { 145 | g_x1 ^= g_x2; 146 | *_fpDstBuffer++ = g_x2 * _fLevel; 147 | g_x2 += g_x1; 148 | } 149 | } 150 | 151 | float lastNoiseRes_Param; 152 | float lastNoiseFreq_Param; 153 | float lastEnvCap_Param; 154 | float lastEnvRes_Param; 155 | float filteredPulse = 0.0; 156 | bool accent; 157 | void process(const ProcessArgs& args) override { 158 | I1time += args.sampleTime; 159 | 160 | if (trigger.process(inputs[TRIGGER_INPUT].getVoltage())) { 161 | I1time = 0.0; 162 | pulse.trigger(1e-3); // Gate time is 1ms 163 | accent = inputs[ACCENT_INPUT].getVoltage() > 0.1; // Latch accent to trigger 164 | } 165 | 166 | if (!prepared) prepare(args.sampleRate); 167 | 168 | if (parametersDivider.process()) { 169 | if (params[NOISERESO_PARAM].getValue() != lastNoiseRes_Param || 170 | params[NOISEFREQ_PARAM].getValue() != lastNoiseFreq_Param) { 171 | lastNoiseFreq_Param = params[NOISEFREQ_PARAM].getValue(); 172 | lastNoiseRes_Param = params[NOISERESO_PARAM].getValue(); 173 | fi.calcCoefs(lastNoiseFreq_Param, lastNoiseRes_Param, args.sampleRate); 174 | } 175 | if (!inputs[TUNING_INPUT].isConnected()) { 176 | resoHigh.setRackParameters((params[RESOHIGH_FREQ_PARAM].getValue() + params[RESO_TUNE_PARAM].getValue()) * 0.5); 177 | resoLow.setRackParameters((params[RESOLOW_FREQ_PARAM].getValue() + params[RESO_TUNE_PARAM].getValue()) * 0.5); 178 | } 179 | if (((params[ENVCAP_PARAM].getValue() != lastEnvCap_Param || 180 | params[ENVRES_PARAM].getValue() != lastEnvRes_Param)) && 181 | (!inputs[ENVRES_INPUT].isConnected())) { 182 | lastEnvRes_Param = params[ENVRES_PARAM].getValue(); 183 | lastEnvCap_Param = params[ENVCAP_PARAM].getValue(); 184 | env.setRackParameters(params[ENVCAP_PARAM].getValue(), params[ENVRES_PARAM].getValue()); 185 | } 186 | if (inputs[ENVRES_INPUT].isConnected()) { 187 | lastEnvRes_Param = params[ENVRES_PARAM].getValue(); 188 | lastEnvCap_Param = params[ENVCAP_PARAM].getValue(); 189 | float envres_param = math::clamp(params[ENVRES_PARAM].getValue() + (params[ENVRESCV_PARAM].getValue() * 190 | (inputs[ENVRES_INPUT].getVoltage() / 10.f)) * -1.f, -1.f, 1.f); 191 | env.setRackParameters(params[ENVCAP_PARAM].getValue(), envres_param); 192 | } 193 | if (inputs[TUNING_INPUT].isConnected()) { 194 | float reso_tune_param = math::clamp(params[RESO_TUNE_PARAM].getValue() + (params[TUNINGCV_PARAM].getValue() * 195 | (inputs[TUNING_INPUT].getVoltage() / 10.f)), -1.f, 1.f); 196 | resoHigh.setRackParameters((params[RESOHIGH_FREQ_PARAM].getValue() + reso_tune_param) * 0.5); 197 | resoLow.setRackParameters((params[RESOLOW_FREQ_PARAM].getValue() + reso_tune_param) * 0.5); 198 | } 199 | } 200 | 201 | alignas (16) float values_in_4[4]; 202 | alignas (16) float values_out_4[4]; 203 | whitenoise(values_in_4, 4, 1.0f); // input 204 | auto out_4 = vca.processSample(xsimd::load_aligned(values_in_4)); 205 | out_4.store_aligned(values_out_4); 206 | for (int i = 0; i < 3; ++i) { 207 | values_out_4[i+1] += values_out_4[i]; 208 | } 209 | values_out_4[3] /= 4.0; 210 | float vca_noise_out = (values_out_4[3] < -10.0f ? -10.0f : (values_out_4[3] > 10.0f ? 10.0f : values_out_4[3])); 211 | 212 | 213 | // All the constants and multipliers below were selected either by fitting curves with simulation or by subjective listening tests 214 | float accent_boost = (accent ? params[ACCENT_PARAM].getValue() * 10.f : 0.f); 215 | bool pulse_high = pulse.process(args.sampleTime); 216 | filteredPulse += ((pulse_high ? 4.f + accent_boost : 0.0) - filteredPulse) * 0.344; 217 | float resoLow_out = 0.8255 * resoLow.processSample(filteredPulse); 218 | float resoHigh_out = -0.63085 * resoHigh.processSample((pulse_high ? 26.126e-3 * (4.f + accent_boost) : 0.0)); 219 | resoLow_out *= params[RESOLOW_VOL_PARAM].getValue(); 220 | resoHigh_out *= params[RESOHIGH_VOL_PARAM].getValue(); 221 | 222 | float tone_param = math::clamp(params[TONE_PARAM].getValue() + 223 | (params[TONECV_PARAM].getValue() * (inputs[TONE_INPUT].getVoltage() / 10.f)), 0.0, 1.0); 224 | float resonators = resoHigh_out * 0.5 * tone_param + resoLow_out * 0.25 * (1 - tone_param); 225 | 226 | float env_out = 0.00926 * (env.processSample(I1(I1time))) * (4.f + accent_boost) * params[ENVATTEN_PARAM].getValue(); 227 | float vca_out = 2 * (vca_noise_out + 0.425) + 0.66; 228 | 229 | float snappy_param = math::clamp(params[SNAPPY_PARAM].getValue() + math::rescale( 230 | params[SNAPPYCV_PARAM].getValue() * (inputs[SNAPPY_INPUT].getVoltage() / 10.f), 0.f, 1.f, 0.1f, 2.f), 231 | 0.1f, 2.f); 232 | float out = params[VOLUME_PARAM].getValue() * 4.0 * (fi.processSample(vca_out * env_out) * snappy_param + resonators); 233 | outputs[RESOLOW_OUTPUT].setVoltage(resoLow_out); 234 | outputs[RESOHIGH_OUTPUT].setVoltage(resoHigh_out); 235 | outputs[ENV_OUTPUT].setVoltage(env_out); 236 | outputs[CLIP_OUTPUT].setVoltage(vca_out); 237 | outputs[FULL_OUTPUT].setVoltage((out < -10.0f ? -10.0f : (out > 10.0f ? 10.0f : out))); 238 | } 239 | }; 240 | 241 | struct WDR8OrangeKnob : RoundSmallBlackKnob { 242 | WDR8OrangeKnob() { 243 | setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_SmallKnob.svg"))); 244 | bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_SmallKnob_Orange_bg.svg"))); 245 | } 246 | }; 247 | 248 | struct WDR8WhiteKnob : RoundSmallBlackKnob { 249 | WDR8WhiteKnob() { 250 | setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_SmallKnob.svg"))); 251 | bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_SmallKnob_White_bg.svg"))); 252 | } 253 | }; 254 | 255 | struct WDR8YellowKnob : RoundSmallBlackKnob { 256 | WDR8YellowKnob() { 257 | setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_SmallKnob.svg"))); 258 | bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_SmallKnob_Yellow_bg.svg"))); 259 | } 260 | }; 261 | 262 | struct WDR8Trimpot : Trimpot { 263 | WDR8Trimpot() { 264 | setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_Trimpot.svg"))); 265 | bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_Trimpot_bg.svg"))); 266 | } 267 | }; 268 | 269 | struct WDR8TinyTrimpot : Trimpot { 270 | WDR8TinyTrimpot() { 271 | setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_TinyTrimpot.svg"))); 272 | bg->setSvg(Svg::load(asset::plugin(pluginInstance, "res/WDR-8_TinyTrimpot_bg.svg"))); 273 | } 274 | }; 275 | 276 | struct WDR8sdWidget : ModuleWidget { 277 | WDR8sdWidget(WDR8sd* module) { 278 | setModule(module); 279 | setPanel(createPanel(asset::plugin(pluginInstance, "res/wdr-8-sd_vector.svg"))); 280 | 281 | addChild(createWidget(Vec(RACK_GRID_WIDTH, 0))); 282 | addChild(createWidget(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); 283 | addChild(createWidget(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); 284 | addChild(createWidget(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); 285 | 286 | // guides X and Y values, see design SVG file 287 | float xGuides[] = {8.68, 21.73, 36.95}; 288 | float yGuides[] = {25.74, 38.74, 45.75, 61.34, 72.4, 71.02, 85.41, 93.67, 101.27}; 289 | addParam(createParamCentered(mm2px(Vec(xGuides[0], yGuides[0])), module, WDR8sd::RESOLOW_FREQ_PARAM)); 290 | addParam(createParamCentered(mm2px(Vec(xGuides[1], yGuides[0])), module, WDR8sd::RESOHIGH_FREQ_PARAM)); 291 | addParam(createParamCentered(mm2px(Vec(xGuides[2], yGuides[0])), module, WDR8sd::ENVCAP_PARAM)); 292 | 293 | addParam(createParamCentered(mm2px(Vec(xGuides[0], yGuides[1])), module, WDR8sd::RESOLOW_VOL_PARAM)); 294 | addParam(createParamCentered(mm2px(Vec(xGuides[1], yGuides[1])), module, WDR8sd::RESOHIGH_VOL_PARAM)); 295 | addParam(createParamCentered(mm2px(Vec(xGuides[2], yGuides[1])), module, WDR8sd::ENVRES_PARAM)); 296 | 297 | addParam(createParamCentered(mm2px(Vec(xGuides[2], yGuides[3])), module, WDR8sd::NOISEFREQ_PARAM)); 298 | addParam(createParamCentered(mm2px(Vec(xGuides[2], yGuides[4])), module, WDR8sd::NOISERESO_PARAM)); 299 | 300 | addParam(createParamCentered(mm2px(Vec(15.22, 56.57)), module, WDR8sd::RESO_TUNE_PARAM)); 301 | 302 | addParam(createParamCentered(mm2px(Vec(xGuides[2], 50.25)), module, WDR8sd::ENVATTEN_PARAM)); 303 | 304 | addParam(createParamCentered(mm2px(Vec(xGuides[0], yGuides[5])), module, WDR8sd::TONE_PARAM)); 305 | addParam(createParamCentered(mm2px(Vec(xGuides[1], yGuides[5])), module, WDR8sd::SNAPPY_PARAM)); 306 | addParam(createParamCentered(mm2px(Vec(xGuides[0], yGuides[6])), module, WDR8sd::ACCENT_PARAM)); 307 | addParam(createParamCentered(mm2px(Vec(xGuides[1], yGuides[6])), module, WDR8sd::VOLUME_PARAM)); 308 | 309 | addParam(createParamCentered(mm2px(Vec(xGuides[0], yGuides[7])), module, WDR8sd::TONECV_PARAM)); 310 | addParam(createParamCentered(mm2px(Vec(xGuides[1], yGuides[7])), module, WDR8sd::SNAPPYCV_PARAM)); 311 | addParam(createParamCentered(mm2px(Vec(xGuides[2], yGuides[7])), module, WDR8sd::ENVRESCV_PARAM)); 312 | 313 | addInput(createInputCentered(mm2px(Vec(xGuides[0], 113.81)), module, WDR8sd::TRIGGER_INPUT)); 314 | addInput(createInputCentered(mm2px(Vec(xGuides[1], 113.81)), module, WDR8sd::ACCENT_INPUT)); 315 | addInput(createInputCentered(mm2px(Vec(xGuides[0], yGuides[8])), module, WDR8sd::TONE_INPUT)); 316 | addInput(createInputCentered(mm2px(Vec(xGuides[1], yGuides[8])), module, WDR8sd::SNAPPY_INPUT)); 317 | addInput(createInputCentered(mm2px(Vec(xGuides[2], yGuides[8])), module, WDR8sd::ENVRES_INPUT)); 318 | addInput(createInputCentered(mm2px(Vec(xGuides[2], yGuides[6]-2)), module, WDR8sd::TUNING_INPUT)); 319 | addParam(createParamCentered(mm2px(Vec(42, 78)), module, WDR8sd::TUNINGCV_PARAM)); 320 | 321 | addOutput(createOutputCentered(mm2px(Vec(xGuides[2], 113.81)), module, WDR8sd::FULL_OUTPUT)); 322 | } 323 | }; 324 | 325 | Model* modelWDR8sd = createModel("WDR8sd"); -------------------------------------------------------------------------------- /src/WDF_structs.hpp: -------------------------------------------------------------------------------- 1 | #include "xsimd/xsimd.hpp" 2 | #include "chowdsp_wdf/chowdsp_wdf.h" 3 | using namespace chowdsp::wdft; 4 | 5 | class EnvelopeGenerator 6 | { 7 | public: 8 | EnvelopeGenerator() = default; 9 | 10 | void prepare (double sampleRate) 11 | { 12 | C52.prepare ((float) sampleRate); 13 | C51.prepare ((float) sampleRate); 14 | } 15 | 16 | void reset() 17 | { 18 | C52.reset(); 19 | C51.reset(); 20 | } 21 | 22 | float C52_nrange = 99.9e-9; 23 | float C52_prange = 600.0e-9; 24 | float R185_nrange = 34.99e3; 25 | float R185_prange = 100.0e3; 26 | void setRackParameters(float capMod, float resMod) { 27 | capMod *= -1.f; 28 | resMod *= -1.f; 29 | if (capMod < 0) 30 | C52.setCapacitanceValue(C52_value + (capMod)*(capMod) * C52_nrange * -1.f); 31 | if (capMod >= 0) 32 | C52.setCapacitanceValue(C52_value + (capMod)*(capMod) * C52_prange); 33 | if (resMod < 0) 34 | R185.setResistanceValue(R185_value + (resMod)*(resMod) * R185_nrange * -1.f); 35 | if (resMod >= 0) 36 | R185.setResistanceValue(R185_value + (resMod)*(resMod) * R185_prange); 37 | } 38 | 39 | void setCircuitElements (float c51, float c52) 40 | { 41 | C51.setCapacitanceValue(c51); 42 | C52.setCapacitanceValue(c52); 43 | } 44 | 45 | inline float processSample (float x) 46 | { 47 | I1.setCurrent(x); 48 | 49 | I1.incident (P1.reflected()); 50 | P1.incident (I1.reflected()); 51 | 52 | return voltage (R185); 53 | } 54 | float C52_value = 100e-9f; 55 | float R185_value = 35000.0f; 56 | CapacitorT C52 { C52_value }; // C52: slight adjustment 57 | CapacitorT C51 { 470e-9f }; // C51: value from schematics 58 | ResistorT R185 { R185_value }; // selected manually by fitting curves, should be 15k equal to R184 59 | ResistorT R184 { 15000.0f }; // R184: value from schematics 60 | 61 | 62 | WDFParallelT P2 {R185, C52}; 63 | WDFSeriesT S1 {R184, P2}; 64 | WDFParallelT P1 {C51, S1}; 65 | IdealCurrentSourceT I1 { P1 }; 66 | }; // EnvelopeGenerator 67 | 68 | template 69 | class DiodeClipper 70 | { 71 | public: 72 | DiodeClipper() = default; 73 | 74 | void prepare (double sampleRate) 75 | { 76 | C1.prepare ((float) sampleRate); 77 | } 78 | 79 | void reset() 80 | { 81 | C1.reset(); 82 | } 83 | 84 | inline FloatType processSample (FloatType x) 85 | { 86 | Vs.setVoltage (x); 87 | 88 | dp.incident (P1.reflected()); 89 | auto y = voltage (C1); 90 | P1.incident (dp.reflected()); 91 | 92 | return y; 93 | } 94 | 95 | private: 96 | ResistorT R1 { 411.5f }; 97 | ResistiveVoltageSourceT Vs; 98 | WDFSeriesT S1 { Vs, R1 }; 99 | 100 | CapacitorT C1 { 47.0e-9f }; 101 | WDFParallelT P1 { S1, C1 }; 102 | 103 | // GZ34 diode pair 104 | DiodePairT dp { P1, 2.52e-9f }; 105 | }; 106 | 107 | /** 108 | * Resonators from TR-808 snare drum circuit. 109 | * Reference: http://www.ericarcher.net/wp-content/uploads/2014/07/tr808_snare_diy_project.pdf 110 | * Based on the snare resonator from https://github.com/jatinchowdhury18/WaveDigitalFilters 111 | * Adjusted with values found here: https://norgatronics.blogspot.com/2021/11/sd-8081-tuning.html 112 | * ♡(㋭ ਊ ㋲)♡ -> Infinite and endless love & thanks to Steve Norgate and Jatin Chowdhury! 113 | */ 114 | class SnareResonatorLow 115 | { 116 | public: 117 | SnareResonatorLow() = default; 118 | 119 | float vinDivider = 1.0; 120 | 121 | void prepare (double sampleRate) 122 | { 123 | C58.prepare ((float) sampleRate); 124 | C59.prepare ((float) sampleRate); 125 | C57.prepare ((float) sampleRate); 126 | } 127 | 128 | void reset() 129 | { 130 | C58.reset(); 131 | C59.reset(); 132 | C57.reset(); 133 | } 134 | 135 | float C58_range = 35.0e-9; 136 | void setRackParameters(float freqMod) { 137 | C58.setCapacitanceValue(C58_value + (freqMod * -1.0) * C58_range); 138 | } 139 | 140 | void setParameters (float freqHz, float Rmult01) 141 | { 142 | constexpr auto Rfb = 1.0e6f; 143 | const auto Rg = 250.0f * std::pow (2500.0f / 250.0f, Rmult01); 144 | float C = 1.0f / (2 * M_PI * freqHz * std::sqrt (Rfb * Rg)); 145 | 146 | setParameters (Rfb, Rg, C); 147 | } 148 | 149 | void setParameters (float Rfb, float Rg, float Cval) 150 | { 151 | R197.setResistanceValue (Rfb); 152 | R196.setResistanceValue (Rg); 153 | C58.setCapacitanceValue (Cval); 154 | C59.setCapacitanceValue (Cval); 155 | } 156 | 157 | inline float processSample (float x) 158 | { 159 | x *= vinDivider; 160 | Vin.setVoltage (x); 161 | 162 | Vin.incident (S1.reflected()); 163 | S1.incident (Vin.reflected()); 164 | 165 | return voltage (R196) + voltage (C59); 166 | } 167 | 168 | float C58_value = 0.04131e-6f; 169 | private: 170 | // Port B 171 | ResistorT R197 { 820.0e3f }; 172 | 173 | // Port C 174 | CapacitorT C58 { C58_value }; // Revised value, Original value is 27n, cheated to match the freq exactly 175 | 176 | // Port D 177 | CapacitorT C59 { 0.027e-6f }; 178 | 179 | // Port E 180 | ResistorT R196 { 680.0f }; 181 | 182 | struct ImpedanceCalc 183 | { 184 | template 185 | static float calcImpedance (RType& R) 186 | { 187 | constexpr float Ag = 100000.0f; // op-amp gain 188 | constexpr float Ri = 500.0e6f; // op-amp input impedance 189 | constexpr float Ro = 1.0e-1f; // op-amp output impedance 190 | const auto [Rb, Rc, Rd, Re] = R.getPortImpedances(); 191 | 192 | // This scattering matrix was derived using the R-Solver python script (https://github.com/jatinchowdhury18/R-Solver), 193 | // invoked with command: r_solver.py --adapt 0 --out scratch/snare_res_scatt.txt scratch/snare_res2.txt 194 | R.setSMatrixData ({ { 0, -(Rc * Rd + (Rc + Rd) * Re - Rc * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro), (Rb * Rd + Rb * Re - (Rb + Rd) * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro), (Rb * Re + Rc * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro), (Rb * Rd - (Rb + Rc + Rd) * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro) }, 195 | { (Ag * Rb * Rd * Ri - Rb * Rc * Rd + Rb * Rc * Ro - (Rb * Rc + Rb * Rd) * Re) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Rd + (Rb * Rb * Rc + Rb * Rb * Rd) * Re * Re + (Rb * Rb * Rc - Rc * Rc * Rd - Rc * Rd * Rd + (Rb * Rb - Rc * Rc - 2 * Rc * Rd - Rd * Rd) * Re + (Rb * Rb - Rc * Rc - 2 * Rc * Rd - Rd * Rd) * Ri) * Ro * Ro + (2 * Rb * Rb * Rc * Rd + Rb * Rb * Rd * Rd) * Re - (((Ag + 1) * Rc * Rc - Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb - (Ag + 1) * Rc * Rc - 2 * (Ag + 1) * Rc * Rd - (Ag + 1) * Rd * Rd) * Re * Re + (2 * (Ag + 1) * Rc * Rd * Rd - ((Ag + 2) * Rb * Rb - 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - (2 * Rb * Rb * Rc * Rd - Rc * Rc * Rd * Rd + (Rb * Rb - Rc * Rc - 2 * Rc * Rd - Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc - Rc * Rd * Rd + (Rb * Rb - Rc * Rc) * Rd) * Re - ((Ag + 2) * Rc * Rd * Rd + ((Ag + 2) * Rc * Rc - 2 * Rb * Rb) * Rd - ((Ag + 2) * Rb * Rb - (Ag + 2) * Rc * Rc - 2 * (Ag + 2) * Rc * Rd - (Ag + 2) * Rd * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Rd + (Rb * Rb * Rc + Rb * Rb * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rd + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Ri) * Ro * Ro + (2 * Rb * Rb * Rc * Rd + Rb * Rb * Rd * Rd) * Re + (((Ag + 2) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rb * Rb + (Ag + 1) * Rb * Rc + (Ag + 1) * Rb * Rd) * Re * Re + (2 * (Ag + 1) * Rb * Rd * Rd + ((3 * Ag + 4) * Rb * Rb + 4 * (Ag + 1) * Rb * Rc) * Rd) * Re) * Ri - (2 * Rb * Rb * Rc * Rd + Rb * Rc * Rd * Rd + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re * Re + (2 * Rb * Rb * Rc + Rb * Rd * Rd + 3 * (Rb * Rb + Rb * Rc) * Rd) * Re + ((Ag + 2) * Rb * Rd * Rd + ((Ag + 4) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc) * Rd + 2 * ((Ag + 2) * Rb * Rb + (Ag + 2) * Rb * Rc + (Ag + 2) * Rb * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Re + (Rb * Rb * Rc + Rb * Rb * Rd) * Re * Re + (2 * Rb * Rb * Rc + Rb * Rc * Rc + 2 * Rb * Rc * Rd + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc) * Rd * Re + 2 * ((Ag + 1) * Rb * Rb + (Ag + 1) * Rb * Rc + (Ag + 1) * Rb * Rd) * Re * Re) * Ri - (2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re * Re + (2 * Rb * Rb * Rc + Rb * Rc * Rc) * Rd + (3 * Rb * Rb * Rc + Rb * Rc * Rc + (2 * Rb * Rb + 3 * Rb * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + 2 * Rb * Rb) * Rd + 2 * ((Ag + 2) * Rb * Rb + (Ag + 2) * Rb * Rc + (Ag + 2) * Rb * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Rd - (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rc * Rd) * Ro * Ro + (Rb * Rb * Rc * Rd + Rb * Rb * Rd * Rd) * Re + (((Ag + 2) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rb * Rd * Rd + ((Ag + 1) * Rb * Rb + (Ag + 1) * Rb * Rc) * Rd) * Re) * Ri + (Rb * Rc * Rc * Rd - Rb * Rc * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc - Rb * Rb * Rd - Rb * Rd * Rd) * Re - ((Ag + 2) * Rb * Rd * Rd + ((Ag + 2) * Rb * Rb + (Ag + 2) * Rb * Rc) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) }, 196 | { (Ag * Rc * Rd * Ri + Rb * Rc * Rd + Rb * Rc * Re - (Rb * Rc + Rc * Rd) * Ro) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rc * Rc * Rd * Rd + (Rb * Rc * Rc + Rb * Rc * Rd) * Re * Re + (Rb * Rc * Rc + Rc * Rc * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Ri) * Ro * Ro + (2 * Rb * Rc * Rc * Rd + Rb * Rc * Rd * Rd) * Re + (((Ag + 2) * Rc * Rc + 2 * Rb * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rc * Rd) * Re * Re + ((Ag + 2) * Rc * Rd * Rd + (2 * (Ag + 2) * Rb * Rc + (3 * Ag + 4) * Rc * Rc) * Rd) * Re) * Ri - (2 * Rb * Rc * Rc * Rd + Rc * Rc * Rd * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re * Re + (2 * Rb * Rc * Rc + Rc * Rd * Rd + 3 * (Rb * Rc + Rc * Rc) * Rd) * Re + (2 * Rc * Rd * Rd + ((Ag + 4) * Rc * Rc + 4 * Rb * Rc) * Rd + 2 * ((Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rc * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rc * Rc * Rd * Rd + (Rb * Rc * Rc - Rb * Rb * Rd - Rb * Rd * Rd) * Re * Re + (Rb * Rc * Rc + Rc * Rc * Rd - (Rb * Rb - Rc * Rc + 2 * Rb * Rd + Rd * Rd) * Re - (Rb * Rb - Rc * Rc + 2 * Rb * Rd + Rd * Rd) * Ri) * Ro * Ro + (2 * Rb * Rc * Rc * Rd - Rb * Rb * Rd * Rd) * Re + (((Ag + 1) * Rc * Rc - Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb - (Ag + 1) * Rc * Rc + 2 * (Ag + 1) * Rb * Rd + (Ag + 1) * Rd * Rd) * Re * Re - ((Ag + 2) * Rb * Rd * Rd + ((Ag + 2) * Rb * Rb - 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - (2 * Rb * Rc * Rc * Rd + Rc * Rc * Rd * Rd - (Rb * Rb - Rc * Rc + 2 * Rb * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rc * Rc - Rb * Rd * Rd - (Rb * Rb - Rc * Rc) * Rd) * Re - (2 * Rb * Rd * Rd - ((Ag + 2) * Rc * Rc - 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb - (Ag + 2) * Rc * Rc + 2 * (Ag + 2) * Rb * Rd + (Ag + 2) * Rd * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb * Rc + 2 * Rb * Rc * Rc) * Rd * Re + (Rb * Rb * Rc + 2 * Rb * Rc * Rc + 2 * Rb * Rc * Rd) * Re * Re + (Rb * Rc * Rc + Rc * Rc * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd * Re + 2 * ((Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rc * Rd) * Re * Re) * Ri - (Rb * Rc * Rc * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re * Re + (Rb * Rb * Rc + 3 * Rb * Rc * Rc + (3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc * Rc + 2 * Rb * Rc) * Rd + 2 * ((Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rc * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb * Rc + 2 * Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd) * Ro * Ro + (2 * Rb * Rc * Rd * Rd + (Rb * Rb * Rc + 2 * Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rc * Rd * Rd + ((Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - (2 * (Rb * Rc + Rc * Rc) * Rd * Rd + (2 * Rb * Rb * Rc + 3 * Rb * Rc * Rc) * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + 2 * Rc * Rd * Rd + (3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re + ((Ag + 2) * Rc * Rd * Rd + ((Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) }, 197 | { (Rb * Rd * Re - (Ag * Rb + Ag * Rc) * Rd * Ri + Rc * Rd * Ro) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rc * Rd * Rd * Re + (Rb * Rc * Rd + Rb * Rd * Rd) * Re * Re + (2 * Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Ag * Rb * Rc + Ag * Rc * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rd * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + (3 * Ag + 2) * Rc) * Rd * Rd + (Ag * Rb * Rc + Ag * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re * Re + ((2 * Rb + 3 * Rc) * Rd * Rd + (3 * Rb * Rc + Rc * Rc) * Rd) * Re + (2 * ((Ag + 1) * Rc + Rb) * Rd * Rd + (Ag * Rb * Rc + Ag * Rc * Rc) * Rd + 2 * ((Ag + 2) * Rd * Rd + ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb + 2 * Rb * Rc) * Rd * Rd * Re + (2 * Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rc * Rd + Rc * Rd * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro - ((Ag * Rb * Rb + Ag * Rb * Rc) * Rd * Rd - 2 * ((Ag + 1) * Rd * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re - (2 * ((Ag + 1) * Rc + Rb) * Rd * Rd - (Ag * Rb * Rb + Ag * Rb * Rc) * Rd) * Re) * Ri - (Rb * Rc * Rd * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re * Re + ((3 * Rb + 2 * Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc) * Rd) * Re - (((Ag - 2) * Rb - (Ag + 2) * Rc) * Rd * Rd + (Ag * Rb * Rb + Ag * Rb * Rc) * Rd - 2 * ((Ag + 2) * Rd * Rd + ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb + 2 * Rb * Rc) * Rd * Rd * Re + (Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd - (Rb * Rb * Rc + Rb * Rc * Rc - Rb * Rd * Rd) * Re * Re - (Rb * Rb * Rc + Rb * Rc * Rc - Rc * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc - Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc - Rd * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd * Re + ((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc - (Ag + 1) * Rd * Rd) * Re * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd - (Rb * Rb + 2 * Rb * Rc + Rc * Rc - Rd * Rd) * Re * Re - 2 * (Rb * Rb * Rc + Rb * Rc * Rc - (Rb + Rc) * Rd * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd - ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc - (Ag + 2) * Rd * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), (2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rc * Rd * Rd + (Rb * Rc + Rc * Rc) * Rd) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd * Rd + 2 * (((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((3 * Rb * Rc + 2 * Rc * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + ((Rb + 2 * Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) }, 198 | { (Rb * Rd * Re + (Ag * Rb + Ag * Rc + Ag * Rd) * Re * Ri - (Rb + Rc + Rd) * Re * Ro) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rc * Rd * Rd * Re - (Rb * Rc + Rc * Rc + Rc * Rd) * Re * Ro * Ro + (Rb * Rc * Rd + Rb * Rd * Rd) * Re * Re - ((Ag * Rb * Rc + Ag * Rc * Rc - (Ag + 2) * Rd * Rd - ((Ag + 2) * Rb + 2 * Rc) * Rd) * Re * Re - (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd - (Ag * Rb * Rc + Ag * Rc * Rc) * Rd) * Re) * Ri + ((Rb * Rc + Rc * Rc - Rb * Rd - Rd * Rd) * Re * Re + (Ag * Rb * Rc + Ag * Rc * Rc + ((Ag - 2) * Rc - 2 * Rb) * Rd - 2 * Rd * Rd) * Re * Ri + (Rc * Rc * Rd - Rc * Rd * Rd) * Re) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb + 2 * Rb * Rc) * Rd * Rd * Re + (Rb * Rb + Rb * Rc + (2 * Rb + Rc) * Rd + Rd * Rd) * Re * Ro * Ro + (2 * Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + ((Ag * Rb * Rb + Ag * Rb * Rc + 2 * (Ag + 1) * Rd * Rd + ((3 * Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + (Ag * Rb * Rb + Ag * Rb * Rc) * Rd) * Re) * Ri - ((Rb * Rb + Rb * Rc + (3 * Rb + 2 * Rc) * Rd + 2 * Rd * Rd) * Re * Re + (Ag * Rb * Rb + Ag * Rb * Rc + (Ag + 2) * Rd * Rd + (2 * (Ag + 1) * Rb + (Ag + 2) * Rc) * Rd) * Re * Ri + (2 * (Rb + Rc) * Rd * Rd + (2 * Rb * Rb + 3 * Rb * Rc) * Rd) * Re) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), ((Rb * Rc + Rc * Rc + Rc * Rd) * Re * Ro * Ro + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Re + (2 * Rb * Rb * Rc + 2 * Rb * Rc * Rc + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (2 * ((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Re + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc + ((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd) * Re * Re) * Ri - ((Rb * Rb + 3 * Rb * Rc + 2 * Rc * Rc + (Rb + 2 * Rc) * Rd) * Re * Re + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb + ((Ag + 2) * Rc + 2 * Rb) * Rd) * Re * Ri + (2 * Rb * Rb * Rc + 2 * Rb * Rc * Rc + (3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd - (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd - (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) } }); 199 | 200 | auto Ra = (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro); 201 | return Ra; 202 | } 203 | }; 204 | 205 | using RType = RtypeAdaptor; 206 | RType R { R197, C58, C59, R196 }; 207 | 208 | ResistorT R190 { 680.0f }; 209 | ResistorT R189 { 100000.0f }; 210 | CapacitorT C57 { 0.0068e-6f }; 211 | 212 | // Port A 213 | WDFParallelT P2 { R, R190 }; 214 | WDFParallelT P1 { C57, R189 }; 215 | WDFSeriesT S1 { P2, P1 }; 216 | IdealVoltageSourceT Vin { S1 }; 217 | 218 | }; // SnareResonatorLow 219 | 220 | class SnareResonatorHigh 221 | { 222 | public: 223 | SnareResonatorHigh() = default; 224 | 225 | float vinDivider = 1.0f; 226 | 227 | void prepare (double sampleRate) 228 | { 229 | C60.prepare ((float) sampleRate); 230 | C61.prepare ((float) sampleRate); 231 | } 232 | 233 | void reset() 234 | { 235 | C60.reset(); 236 | C61.reset(); 237 | } 238 | 239 | float C61_range = 9.0e-9; 240 | void setRackParameters(float freqMod) { 241 | // freqMod/decayMod [-1.0, +1.0] 242 | C61.setCapacitanceValue(C61_value + (freqMod * -1.0) * C61_range); 243 | } 244 | 245 | void setParameters (float freqHz, float Rmult01) 246 | { 247 | constexpr auto Rfb = 1.0e6f; 248 | const auto Rg = 250.0f * std::pow (2500.0f / 250.0f, Rmult01); 249 | float C = 1.0f / (2 * M_PI * freqHz * std::sqrt (Rfb * Rg)); 250 | 251 | setParameters (Rfb, Rg, C); 252 | } 253 | 254 | void setParameters (float Rfb, float Rg, float Cval) 255 | { 256 | R198.setResistanceValue (Rfb); 257 | R195.setResistanceValue (Rg); 258 | C60.setCapacitanceValue (Cval); 259 | C61.setCapacitanceValue (Cval); 260 | } 261 | 262 | inline float processSample (float x) 263 | { 264 | x *= vinDivider; 265 | Vin.setVoltage (x); 266 | 267 | Vin.incident (R.reflected()); 268 | R.incident (Vin.reflected()); 269 | 270 | return voltage (R195) + voltage (C61); 271 | } 272 | 273 | float C61_value = 0.01141e-6f; // Revised value, Original value is 6.8n, cheated to match the freq exactly 274 | private: 275 | // Port B 276 | ResistorT R198 { 1.0e6 }; 277 | 278 | // Port C 279 | CapacitorT C60 { 0.0068e-6f }; 280 | 281 | // Port D 282 | CapacitorT C61 { C61_value }; 283 | 284 | // Port E 285 | ResistorT R195 { 2.2e3 }; 286 | 287 | struct ImpedanceCalc 288 | { 289 | template 290 | static float calcImpedance (RType& R) 291 | { 292 | constexpr float Ag = 100000.0f; // op-amp gain 293 | constexpr float Ri = 500.0e6f; // op-amp input impedance 294 | constexpr float Ro = 1.0e-1f; // op-amp output impedance 295 | const auto [Rb, Rc, Rd, Re] = R.getPortImpedances(); 296 | 297 | // This scattering matrix was derived using the R-Solver python script (https://github.com/jatinchowdhury18/R-Solver), 298 | // invoked with command: r_solver.py --adapt 0 --out scratch/snare_res_scatt.txt scratch/snare_res2.txt 299 | R.setSMatrixData ({ { 0, -(Rc * Rd + (Rc + Rd) * Re - Rc * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro), (Rb * Rd + Rb * Re - (Rb + Rd) * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro), (Rb * Re + Rc * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro), (Rb * Rd - (Rb + Rc + Rd) * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro) }, 300 | { (Ag * Rb * Rd * Ri - Rb * Rc * Rd + Rb * Rc * Ro - (Rb * Rc + Rb * Rd) * Re) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Rd + (Rb * Rb * Rc + Rb * Rb * Rd) * Re * Re + (Rb * Rb * Rc - Rc * Rc * Rd - Rc * Rd * Rd + (Rb * Rb - Rc * Rc - 2 * Rc * Rd - Rd * Rd) * Re + (Rb * Rb - Rc * Rc - 2 * Rc * Rd - Rd * Rd) * Ri) * Ro * Ro + (2 * Rb * Rb * Rc * Rd + Rb * Rb * Rd * Rd) * Re - (((Ag + 1) * Rc * Rc - Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb - (Ag + 1) * Rc * Rc - 2 * (Ag + 1) * Rc * Rd - (Ag + 1) * Rd * Rd) * Re * Re + (2 * (Ag + 1) * Rc * Rd * Rd - ((Ag + 2) * Rb * Rb - 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - (2 * Rb * Rb * Rc * Rd - Rc * Rc * Rd * Rd + (Rb * Rb - Rc * Rc - 2 * Rc * Rd - Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc - Rc * Rd * Rd + (Rb * Rb - Rc * Rc) * Rd) * Re - ((Ag + 2) * Rc * Rd * Rd + ((Ag + 2) * Rc * Rc - 2 * Rb * Rb) * Rd - ((Ag + 2) * Rb * Rb - (Ag + 2) * Rc * Rc - 2 * (Ag + 2) * Rc * Rd - (Ag + 2) * Rd * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Rd + (Rb * Rb * Rc + Rb * Rb * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rd + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Ri) * Ro * Ro + (2 * Rb * Rb * Rc * Rd + Rb * Rb * Rd * Rd) * Re + (((Ag + 2) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rb * Rb + (Ag + 1) * Rb * Rc + (Ag + 1) * Rb * Rd) * Re * Re + (2 * (Ag + 1) * Rb * Rd * Rd + ((3 * Ag + 4) * Rb * Rb + 4 * (Ag + 1) * Rb * Rc) * Rd) * Re) * Ri - (2 * Rb * Rb * Rc * Rd + Rb * Rc * Rd * Rd + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re * Re + (2 * Rb * Rb * Rc + Rb * Rd * Rd + 3 * (Rb * Rb + Rb * Rc) * Rd) * Re + ((Ag + 2) * Rb * Rd * Rd + ((Ag + 4) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc) * Rd + 2 * ((Ag + 2) * Rb * Rb + (Ag + 2) * Rb * Rc + (Ag + 2) * Rb * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Re + (Rb * Rb * Rc + Rb * Rb * Rd) * Re * Re + (2 * Rb * Rb * Rc + Rb * Rc * Rc + 2 * Rb * Rc * Rd + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re + 2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc) * Rd * Re + 2 * ((Ag + 1) * Rb * Rb + (Ag + 1) * Rb * Rc + (Ag + 1) * Rb * Rd) * Re * Re) * Ri - (2 * (Rb * Rb + Rb * Rc + Rb * Rd) * Re * Re + (2 * Rb * Rb * Rc + Rb * Rc * Rc) * Rd + (3 * Rb * Rb * Rc + Rb * Rc * Rc + (2 * Rb * Rb + 3 * Rb * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + 2 * Rb * Rb) * Rd + 2 * ((Ag + 2) * Rb * Rb + (Ag + 2) * Rb * Rc + (Ag + 2) * Rb * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rb * Rc * Rd * Rd - (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rc * Rd) * Ro * Ro + (Rb * Rb * Rc * Rd + Rb * Rb * Rd * Rd) * Re + (((Ag + 2) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rb * Rd * Rd + ((Ag + 1) * Rb * Rb + (Ag + 1) * Rb * Rc) * Rd) * Re) * Ri + (Rb * Rc * Rc * Rd - Rb * Rc * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc - Rb * Rb * Rd - Rb * Rd * Rd) * Re - ((Ag + 2) * Rb * Rd * Rd + ((Ag + 2) * Rb * Rb + (Ag + 2) * Rb * Rc) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) }, 301 | { (Ag * Rc * Rd * Ri + Rb * Rc * Rd + Rb * Rc * Re - (Rb * Rc + Rc * Rd) * Ro) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rc * Rc * Rd * Rd + (Rb * Rc * Rc + Rb * Rc * Rd) * Re * Re + (Rb * Rc * Rc + Rc * Rc * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Ri) * Ro * Ro + (2 * Rb * Rc * Rc * Rd + Rb * Rc * Rd * Rd) * Re + (((Ag + 2) * Rc * Rc + 2 * Rb * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rc * Rd) * Re * Re + ((Ag + 2) * Rc * Rd * Rd + (2 * (Ag + 2) * Rb * Rc + (3 * Ag + 4) * Rc * Rc) * Rd) * Re) * Ri - (2 * Rb * Rc * Rc * Rd + Rc * Rc * Rd * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re * Re + (2 * Rb * Rc * Rc + Rc * Rd * Rd + 3 * (Rb * Rc + Rc * Rc) * Rd) * Re + (2 * Rc * Rd * Rd + ((Ag + 4) * Rc * Rc + 4 * Rb * Rc) * Rd + 2 * ((Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rc * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -(Rb * Rc * Rc * Rd * Rd + (Rb * Rc * Rc - Rb * Rb * Rd - Rb * Rd * Rd) * Re * Re + (Rb * Rc * Rc + Rc * Rc * Rd - (Rb * Rb - Rc * Rc + 2 * Rb * Rd + Rd * Rd) * Re - (Rb * Rb - Rc * Rc + 2 * Rb * Rd + Rd * Rd) * Ri) * Ro * Ro + (2 * Rb * Rc * Rc * Rd - Rb * Rb * Rd * Rd) * Re + (((Ag + 1) * Rc * Rc - Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb - (Ag + 1) * Rc * Rc + 2 * (Ag + 1) * Rb * Rd + (Ag + 1) * Rd * Rd) * Re * Re - ((Ag + 2) * Rb * Rd * Rd + ((Ag + 2) * Rb * Rb - 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - (2 * Rb * Rc * Rc * Rd + Rc * Rc * Rd * Rd - (Rb * Rb - Rc * Rc + 2 * Rb * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rc * Rc - Rb * Rd * Rd - (Rb * Rb - Rc * Rc) * Rd) * Re - (2 * Rb * Rd * Rd - ((Ag + 2) * Rc * Rc - 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb - (Ag + 2) * Rc * Rc + 2 * (Ag + 2) * Rb * Rd + (Ag + 2) * Rd * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb * Rc + 2 * Rb * Rc * Rc) * Rd * Re + (Rb * Rb * Rc + 2 * Rb * Rc * Rc + 2 * Rb * Rc * Rd) * Re * Re + (Rb * Rc * Rc + Rc * Rc * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd * Re + 2 * ((Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rc * Rd) * Re * Re) * Ri - (Rb * Rc * Rc * Rd + 2 * (Rb * Rc + Rc * Rc + Rc * Rd) * Re * Re + (Rb * Rb * Rc + 3 * Rb * Rc * Rc + (3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc * Rc + 2 * Rb * Rc) * Rd + 2 * ((Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rc * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb * Rc + 2 * Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd) * Ro * Ro + (2 * Rb * Rc * Rd * Rd + (Rb * Rb * Rc + 2 * Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rc * Rd * Rd + ((Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - (2 * (Rb * Rc + Rc * Rc) * Rd * Rd + (2 * Rb * Rb * Rc + 3 * Rb * Rc * Rc) * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + 2 * Rc * Rd * Rd + (3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re + ((Ag + 2) * Rc * Rd * Rd + ((Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) }, 302 | { (Rb * Rd * Re - (Ag * Rb + Ag * Rc) * Rd * Ri + Rc * Rd * Ro) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rc * Rd * Rd * Re + (Rb * Rc * Rd + Rb * Rd * Rd) * Re * Re + (2 * Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Ag * Rb * Rc + Ag * Rc * Rc) * Rd * Rd + 2 * ((Ag + 1) * Rd * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + (3 * Ag + 2) * Rc) * Rd * Rd + (Ag * Rb * Rc + Ag * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re * Re + ((2 * Rb + 3 * Rc) * Rd * Rd + (3 * Rb * Rc + Rc * Rc) * Rd) * Re + (2 * ((Ag + 1) * Rc + Rb) * Rd * Rd + (Ag * Rb * Rc + Ag * Rc * Rc) * Rd + 2 * ((Ag + 2) * Rd * Rd + ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb + 2 * Rb * Rc) * Rd * Rd * Re + (2 * Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rc * Rd + Rc * Rd * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro - ((Ag * Rb * Rb + Ag * Rb * Rc) * Rd * Rd - 2 * ((Ag + 1) * Rd * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re - (2 * ((Ag + 1) * Rc + Rb) * Rd * Rd - (Ag * Rb * Rb + Ag * Rb * Rc) * Rd) * Re) * Ri - (Rb * Rc * Rd * Rd + 2 * ((Rb + Rc) * Rd + Rd * Rd) * Re * Re + ((3 * Rb + 2 * Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc) * Rd) * Re - (((Ag - 2) * Rb - (Ag + 2) * Rc) * Rd * Rd + (Ag * Rb * Rb + Ag * Rb * Rc) * Rd - 2 * ((Ag + 2) * Rd * Rd + ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb + 2 * Rb * Rc) * Rd * Rd * Re + (Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd - (Rb * Rb * Rc + Rb * Rc * Rc - Rb * Rd * Rd) * Re * Re - (Rb * Rb * Rc + Rb * Rc * Rc - Rc * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc - Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc - Rd * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd * Re + ((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc - (Ag + 1) * Rd * Rd) * Re * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd - (Rb * Rb + 2 * Rb * Rc + Rc * Rc - Rd * Rd) * Re * Re - 2 * (Rb * Rb * Rc + Rb * Rc * Rc - (Rb + Rc) * Rd * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd - ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc - (Ag + 2) * Rd * Rd) * Re) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), (2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rc * Rd * Rd + (Rb * Rc + Rc * Rc) * Rd) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd * Rd + 2 * (((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((3 * Rb * Rc + 2 * Rc * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + ((Rb + 2 * Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) }, 303 | { (Rb * Rd * Re + (Ag * Rb + Ag * Rc + Ag * Rd) * Re * Ri - (Rb + Rc + Rd) * Re * Ro) / (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro), -(Rb * Rc * Rd * Rd * Re - (Rb * Rc + Rc * Rc + Rc * Rd) * Re * Ro * Ro + (Rb * Rc * Rd + Rb * Rd * Rd) * Re * Re - ((Ag * Rb * Rc + Ag * Rc * Rc - (Ag + 2) * Rd * Rd - ((Ag + 2) * Rb + 2 * Rc) * Rd) * Re * Re - (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd - (Ag * Rb * Rc + Ag * Rc * Rc) * Rd) * Re) * Ri + ((Rb * Rc + Rc * Rc - Rb * Rd - Rd * Rd) * Re * Re + (Ag * Rb * Rc + Ag * Rc * Rc + ((Ag - 2) * Rc - 2 * Rb) * Rd - 2 * Rd * Rd) * Re * Ri + (Rc * Rc * Rd - Rc * Rd * Rd) * Re) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), -((Rb * Rb + 2 * Rb * Rc) * Rd * Rd * Re + (Rb * Rb + Rb * Rc + (2 * Rb + Rc) * Rd + Rd * Rd) * Re * Ro * Ro + (2 * Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + ((Ag * Rb * Rb + Ag * Rb * Rc + 2 * (Ag + 1) * Rd * Rd + ((3 * Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + (Ag * Rb * Rb + Ag * Rb * Rc) * Rd) * Re) * Ri - ((Rb * Rb + Rb * Rc + (3 * Rb + 2 * Rc) * Rd + 2 * Rd * Rd) * Re * Re + (Ag * Rb * Rb + Ag * Rb * Rc + (Ag + 2) * Rd * Rd + (2 * (Ag + 1) * Rb + (Ag + 2) * Rc) * Rd) * Re * Ri + (2 * (Rb + Rc) * Rd * Rd + (2 * Rb * Rb + 3 * Rb * Rc) * Rd) * Re) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), ((Rb * Rc + Rc * Rc + Rc * Rd) * Re * Ro * Ro + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Re + (2 * Rb * Rb * Rc + 2 * Rb * Rc * Rc + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (2 * ((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Re + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc + ((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd) * Re * Re) * Ri - ((Rb * Rb + 3 * Rb * Rc + 2 * Rc * Rc + (Rb + 2 * Rc) * Rd) * Re * Re + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb + ((Ag + 2) * Rc + 2 * Rb) * Rd) * Re * Ri + (2 * Rb * Rb * Rc + 2 * Rb * Rc * Rc + (3 * Rb * Rc + 2 * Rc * Rc) * Rd) * Re) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro), ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd - (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd - ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd - (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd) * Ri) * Ro) / ((Rb * Rb * Rc + Rb * Rc * Rc) * Rd * Rd + (Rb * Rb * Rc + Rb * Rc * Rc + Rb * Rd * Rd + (Rb * Rb + 2 * Rb * Rc) * Rd) * Re * Re + (Rb * Rb * Rc + Rb * Rc * Rc + Rc * Rd * Rd + (2 * Rb * Rc + Rc * Rc) * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Ri) * Ro * Ro + ((Rb * Rb + 2 * Rb * Rc) * Rd * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd) * Re + (((Ag + 2) * Rb * Rc + (Ag + 1) * Rc * Rc + Rb * Rb) * Rd * Rd + ((Ag + 1) * Rb * Rb + 2 * (Ag + 1) * Rb * Rc + (Ag + 1) * Rc * Rc + (Ag + 1) * Rd * Rd + 2 * ((Ag + 1) * Rb + (Ag + 1) * Rc) * Rd) * Re * Re + (((Ag + 2) * Rb + 2 * (Ag + 1) * Rc) * Rd * Rd + ((Ag + 2) * Rb * Rb + (3 * Ag + 4) * Rb * Rc + 2 * (Ag + 1) * Rc * Rc) * Rd) * Re) * Ri - ((2 * Rb * Rc + Rc * Rc) * Rd * Rd + (Rb * Rb + 2 * Rb * Rc + Rc * Rc + 2 * (Rb + Rc) * Rd + Rd * Rd) * Re * Re + 2 * (Rb * Rb * Rc + Rb * Rc * Rc) * Rd + 2 * (Rb * Rb * Rc + Rb * Rc * Rc + (Rb + Rc) * Rd * Rd + (Rb * Rb + 3 * Rb * Rc + Rc * Rc) * Rd) * Re + (((Ag + 2) * Rc + 2 * Rb) * Rd * Rd + ((Ag + 4) * Rb * Rc + (Ag + 2) * Rc * Rc + 2 * Rb * Rb) * Rd + ((Ag + 2) * Rb * Rb + 2 * (Ag + 2) * Rb * Rc + (Ag + 2) * Rc * Rc + (Ag + 2) * Rd * Rd + 2 * ((Ag + 2) * Rb + (Ag + 2) * Rc) * Rd) * Re) * Ri) * Ro) } }); 304 | 305 | auto Ra = (Rb * Rc * Rd + (Rb * Rc + Rb * Rd) * Re + (((Ag + 1) * Rc + Rb) * Rd + ((Ag + 1) * Rb + (Ag + 1) * Rc + (Ag + 1) * Rd) * Re) * Ri - (Rb * Rc + Rc * Rd + (Rb + Rc + Rd) * Re + (Rb + Rc + Rd) * Ri) * Ro) / ((Rb + Rc) * Rd + (Rb + Rc + Rd) * Re - (Rb + Rc + Rd) * Ro); 306 | return Ra; 307 | } 308 | }; 309 | 310 | using RType = RtypeAdaptor; 311 | RType R { R198, C60, C61, R195 }; 312 | 313 | // Port A 314 | IdealVoltageSourceT Vin { R }; 315 | }; // SnareResonatorHigh 316 | 317 | --------------------------------------------------------------------------------