commit 47dcfa8baf66c54ba0b6302e13bfcfb9d669e160
parent 8ee3fd95d72548ecef9008b1819886d2ea9f8e7f
Author: Matt Demanett <matt@demanett.net>
Date: Mon, 5 Oct 2020 23:19:10 -0400
MX88CV, MX88M: CV and mutes expanders for MATRIX88. #144
Diffstat:
25 files changed, 3934 insertions(+), 11 deletions(-)
diff --git a/README-prerelease.md b/README-prerelease.md
@@ -628,7 +628,7 @@ _Polyphony:_ <a href="#polyphony">Polyphonic</a>, as on MATRIX44.
#### <a name="matrix44"></a> MATRIX44
-A 4x4 channel matrix mixer. Each input can be routed with an independent level to each of the eight output mixes. MATRIX44 is expandable with <a href="matrix44cvm">MATRIX44CVM</a>.
+A 4x4 channel matrix mixer. Each input can be routed with an independent level to each of the eight output mixes. MATRIX44 is expandable with <a href="matrix44cvm">MX44CVM</a>.
*Note that the matrix knobs are attenuverters, and default to zero.* That means there will be no output, regardless of the inputs, until some knobs are changed to non-zero values.
@@ -644,16 +644,28 @@ _Polyphony:_ <a href="#polyphony">Polyphonic</a>, with polyphonic channels defin
#### <a name="matrix44cvm"></a> MX44CVM
-An expander for MATRIX44, adding CVs and mutes for each point in the mix matrix. The CVs are bipolar (+/-5v), and each is attenuverted by its corresponding knob when in use. The mute buttons will mute the corresponding mix point, overriding the knob and CV. As <a href="mix8">MIX8</a> and others, the mute buttons can be right-clicked to solo that mix point -- all others will be muted. A subsequent click on a soloed button restores the previous state, and other muted buttons retake effect.
+An expander for MATRIX44, adding CVs and mutes for each point in the mix matrix. The CVs are bipolar (+/-5v), and each is attenuverted by its corresponding knob when in use. The mute buttons will mute the corresponding mix point, overriding the knob and CV. As on <a href="mix8">MIX8</a> and others, the mute buttons can be right-clicked to solo that mix point -- all others will be muted. A subsequent click on a soloed button restores the previous state, and other muted buttons retake effect.
MX44CVM must be positioned to the right of, and adjacent to, the MATRIX44 module it will expand. See <a href="#expanders">notes on expanders</a>.
#### <a name="matrix88"></a> MATRIX88
-An 8x8 version of MATRIX44.
+An 8x8 version of MATRIX44. It is expanable with <a href="matrix88cv">MX88CV</a> and <a href="matrix88m">MX88M</a>.
_Polyphony:_ <a href="#polyphony">Polyphonic</a>, with polyphonic channels defined by the first/topmost input.
+#### <a name="matrix88cv"></a> MX88CV
+
+An expander for MATRIX88, adding CVs for each point in the mix matrix. The CVs are bipolar (+/-5v), and each is attenuverted by its corresponding knob when in use.
+
+MX88CV must be positioned to the right of, and adjacent to, the MATRIX88 module it will expand, or a MX88M module that is itself expanding a MATRIX88. See <a href="#expanders">notes on expanders</a>.
+
+#### <a name="matrix88cvm"></a> MX88CVM
+
+An expander for MATRIX88, adding mutes for each point in the mix matrix. The mute buttons will mute the corresponding mix point, overriding the knob (and CV if a MX88CV is in use). As on <a href="mix8">MIX8</a> and others, the mute buttons can be right-clicked to solo that mix point -- all others will be muted. A subsequent click on a soloed button restores the previous state, and other muted buttons retake effect.
+
+MX88M must be positioned to the right of, and adjacent to, the MATRIX88 module it will expand, or a MX88CV module that is itself expanding a MATRIX88. See <a href="#expanders">notes on expanders</a>.
+
#### <a name="switch81"></a> SWITCH81

diff --git a/plugin.json b/plugin.json
@@ -627,6 +627,28 @@
]
},
{
+ "slug": "Bogaudio-Matrix88Cv",
+ "name": "MX88CV",
+ "description": "CV expander for MATRIX88",
+ "manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#matrix88cv",
+ "tags": [
+ "Mixer",
+ "Expander",
+ "Polyphonic"
+ ]
+ },
+ {
+ "slug": "Bogaudio-Matrix88M",
+ "name": "MX88M",
+ "description": "Mutes expander for MATRIX88",
+ "manualUrl": "https://github.com/bogaudio/BogaudioModules/blob/master/README.md#matrix88m",
+ "tags": [
+ "Mixer",
+ "Expander",
+ "Polyphonic"
+ ]
+ },
+ {
"slug": "Bogaudio-Switch81",
"name": "SWITCH81",
"description": "8-channel mixer",
diff --git a/res-pp/Matrix88Cv-dark-pp.svg b/res-pp/Matrix88Cv-dark-pp.svg
@@ -0,0 +1,554 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="380.0" viewBox="0 0 300.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+
+
+text {
+ fill: #eee;
+}
+
+polyline {
+ stroke: #ccc;
+}
+path {
+ stroke: #ccc;
+}
+
+rect.module-background, .background-fill {
+ fill: #111;
+}
+polyline.module-border-inner {
+ stroke: #191919;
+}
+polyline.module-border-middle {
+ stroke: #111;
+}
+polyline.module-border-outer {
+ stroke: #000;
+}
+
+rect.input-background, rect.input-background-filler {
+ fill: #aaa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #666;
+}
+text.input-label {
+ fill: #222;
+}
+polyline.input-label, path.input-label {
+ stroke: #222;
+}
+text.output-label {
+ fill: #ddd;
+}
+polyline.output-label, path.output-label {
+ stroke: #ddd;
+}
+
+circle.port-rim {
+ stroke: #c0c0c0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #888;
+}
+circle.knob-rim {
+ fill: #444;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="300.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 299.0,1 299.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 299.5,0.5 299.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 300.0,0 300.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="12pt" letter-spacing="4px" text-anchor="middle" transform="translate(150.0 19)">MX88CV</text>
+ <g transform="translate(0 374)">
+ <text class="brand" font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate(150.0 0)">BOGAUDIO</text>
+ <rect class="background-fill" width="3" height="3" transform="translate(134.5 -5)"/>
+ </g>
+
+
+ <g transform="translate(27.5 42)">
+ <g transform="translate(-12 -12)"><svg id="CV11_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 25)"><svg id="CV21_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 62)"><svg id="CV31_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 99)"><svg id="CV41_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 136)"><svg id="CV51_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 173)"><svg id="CV61_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 210)"><svg id="CV71_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 247)"><svg id="CV81_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(23 -12)"><svg id="CV12_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 25)"><svg id="CV22_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 62)"><svg id="CV32_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 99)"><svg id="CV42_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 136)"><svg id="CV52_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 173)"><svg id="CV62_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 210)"><svg id="CV72_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 247)"><svg id="CV82_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(58 -12)"><svg id="CV13_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 25)"><svg id="CV23_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 62)"><svg id="CV33_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 99)"><svg id="CV43_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 136)"><svg id="CV53_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 173)"><svg id="CV63_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 210)"><svg id="CV73_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 247)"><svg id="CV83_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(93 -12)"><svg id="CV14_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 25)"><svg id="CV24_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 62)"><svg id="CV34_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 99)"><svg id="CV44_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 136)"><svg id="CV54_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 173)"><svg id="CV64_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 210)"><svg id="CV74_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 247)"><svg id="CV84_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(128 -12)"><svg id="CV15_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 25)"><svg id="CV25_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 62)"><svg id="CV35_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 99)"><svg id="CV45_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 136)"><svg id="CV55_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 173)"><svg id="CV65_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 210)"><svg id="CV75_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 247)"><svg id="CV85_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(163 -12)"><svg id="CV16_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 25)"><svg id="CV26_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 62)"><svg id="CV36_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 99)"><svg id="CV46_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 136)"><svg id="CV56_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 173)"><svg id="CV66_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 210)"><svg id="CV76_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 247)"><svg id="CV86_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(198 -12)"><svg id="CV17_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 25)"><svg id="CV27_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 62)"><svg id="CV37_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 99)"><svg id="CV47_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 136)"><svg id="CV57_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 173)"><svg id="CV67_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 210)"><svg id="CV77_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 247)"><svg id="CV87_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(233 -12)"><svg id="CV18_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 25)"><svg id="CV28_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 62)"><svg id="CV38_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 99)"><svg id="CV48_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 136)"><svg id="CV58_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 173)"><svg id="CV68_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 210)"><svg id="CV78_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 247)"><svg id="CV88_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ </g>
+
+
+
+
+</svg>
diff --git a/res-pp/Matrix88Cv-lowcontrast-pp.svg b/res-pp/Matrix88Cv-lowcontrast-pp.svg
@@ -0,0 +1,554 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="380.0" viewBox="0 0 300.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+
+
+text {
+ fill: #b3b3b3;
+}
+
+polyline {
+ stroke: #b3b3b3;
+}
+path {
+ stroke: #b3b3b3;
+}
+
+rect.module-background, .background-fill {
+ fill: #333;
+}
+polyline.module-border-inner {
+ stroke: #191919;
+}
+polyline.module-border-middle {
+ stroke: #111;
+}
+polyline.module-border-outer {
+ stroke: #000;
+}
+
+rect.input-background, rect.input-background-filler {
+ fill: #b3b3b3;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #888;
+}
+text.input-label {
+ fill: #666;
+}
+polyline.input-label, path.input-label {
+ stroke: #666;
+}
+text.output-label {
+ fill: #ccc;
+}
+polyline.output-label, path.output-label {
+ stroke: #ccc;
+}
+
+circle.port-rim {
+ stroke: #bbb;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #bbb;
+}
+circle.knob-rim {
+ fill: #555;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="300.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 299.0,1 299.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 299.5,0.5 299.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 300.0,0 300.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="12pt" letter-spacing="4px" text-anchor="middle" transform="translate(150.0 19)">MX88CV</text>
+ <g transform="translate(0 374)">
+ <text class="brand" font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate(150.0 0)">BOGAUDIO</text>
+ <rect class="background-fill" width="3" height="3" transform="translate(134.5 -5)"/>
+ </g>
+
+
+ <g transform="translate(27.5 42)">
+ <g transform="translate(-12 -12)"><svg id="CV11_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 25)"><svg id="CV21_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 62)"><svg id="CV31_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 99)"><svg id="CV41_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 136)"><svg id="CV51_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 173)"><svg id="CV61_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 210)"><svg id="CV71_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 247)"><svg id="CV81_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(23 -12)"><svg id="CV12_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 25)"><svg id="CV22_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 62)"><svg id="CV32_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 99)"><svg id="CV42_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 136)"><svg id="CV52_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 173)"><svg id="CV62_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 210)"><svg id="CV72_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 247)"><svg id="CV82_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(58 -12)"><svg id="CV13_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 25)"><svg id="CV23_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 62)"><svg id="CV33_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 99)"><svg id="CV43_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 136)"><svg id="CV53_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 173)"><svg id="CV63_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 210)"><svg id="CV73_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 247)"><svg id="CV83_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(93 -12)"><svg id="CV14_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 25)"><svg id="CV24_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 62)"><svg id="CV34_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 99)"><svg id="CV44_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 136)"><svg id="CV54_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 173)"><svg id="CV64_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 210)"><svg id="CV74_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 247)"><svg id="CV84_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(128 -12)"><svg id="CV15_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 25)"><svg id="CV25_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 62)"><svg id="CV35_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 99)"><svg id="CV45_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 136)"><svg id="CV55_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 173)"><svg id="CV65_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 210)"><svg id="CV75_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 247)"><svg id="CV85_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(163 -12)"><svg id="CV16_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 25)"><svg id="CV26_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 62)"><svg id="CV36_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 99)"><svg id="CV46_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 136)"><svg id="CV56_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 173)"><svg id="CV66_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 210)"><svg id="CV76_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 247)"><svg id="CV86_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(198 -12)"><svg id="CV17_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 25)"><svg id="CV27_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 62)"><svg id="CV37_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 99)"><svg id="CV47_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 136)"><svg id="CV57_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 173)"><svg id="CV67_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 210)"><svg id="CV77_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 247)"><svg id="CV87_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(233 -12)"><svg id="CV18_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 25)"><svg id="CV28_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 62)"><svg id="CV38_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 99)"><svg id="CV48_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 136)"><svg id="CV58_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 173)"><svg id="CV68_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 210)"><svg id="CV78_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 247)"><svg id="CV88_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ </g>
+
+
+
+
+</svg>
diff --git a/res-pp/Matrix88Cv-pp.svg b/res-pp/Matrix88Cv-pp.svg
@@ -0,0 +1,490 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="380.0" viewBox="0 0 300.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="300.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 299.0,1 299.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 299.5,0.5 299.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 300.0,0 300.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="12pt" letter-spacing="4px" text-anchor="middle" transform="translate(150.0 19)">MX88CV</text>
+ <g transform="translate(0 374)">
+ <text class="brand" font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate(150.0 0)">BOGAUDIO</text>
+ <rect class="background-fill" width="3" height="3" transform="translate(134.5 -5)"/>
+ </g>
+
+
+ <g transform="translate(27.5 42)">
+ <g transform="translate(-12 -12)"><svg id="CV11_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 25)"><svg id="CV21_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 62)"><svg id="CV31_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 99)"><svg id="CV41_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 136)"><svg id="CV51_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 173)"><svg id="CV61_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 210)"><svg id="CV71_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-12 247)"><svg id="CV81_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(23 -12)"><svg id="CV12_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 25)"><svg id="CV22_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 62)"><svg id="CV32_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 99)"><svg id="CV42_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 136)"><svg id="CV52_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 173)"><svg id="CV62_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 210)"><svg id="CV72_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(23 247)"><svg id="CV82_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(58 -12)"><svg id="CV13_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 25)"><svg id="CV23_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 62)"><svg id="CV33_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 99)"><svg id="CV43_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 136)"><svg id="CV53_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 173)"><svg id="CV63_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 210)"><svg id="CV73_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(58 247)"><svg id="CV83_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(93 -12)"><svg id="CV14_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 25)"><svg id="CV24_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 62)"><svg id="CV34_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 99)"><svg id="CV44_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 136)"><svg id="CV54_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 173)"><svg id="CV64_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 210)"><svg id="CV74_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(93 247)"><svg id="CV84_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(128 -12)"><svg id="CV15_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 25)"><svg id="CV25_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 62)"><svg id="CV35_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 99)"><svg id="CV45_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 136)"><svg id="CV55_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 173)"><svg id="CV65_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 210)"><svg id="CV75_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(128 247)"><svg id="CV85_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(163 -12)"><svg id="CV16_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 25)"><svg id="CV26_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 62)"><svg id="CV36_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 99)"><svg id="CV46_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 136)"><svg id="CV56_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 173)"><svg id="CV66_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 210)"><svg id="CV76_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(163 247)"><svg id="CV86_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(198 -12)"><svg id="CV17_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 25)"><svg id="CV27_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 62)"><svg id="CV37_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 99)"><svg id="CV47_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 136)"><svg id="CV57_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 173)"><svg id="CV67_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 210)"><svg id="CV77_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(198 247)"><svg id="CV87_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(233 -12)"><svg id="CV18_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 25)"><svg id="CV28_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 62)"><svg id="CV38_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 99)"><svg id="CV48_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 136)"><svg id="CV58_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 173)"><svg id="CV68_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 210)"><svg id="CV78_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ <g transform="translate(233 247)"><svg id="CV88_INPUT">
+ <g transform="translate(12 12)">
+ <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0"/>
+ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#0f0" fill="none"/>
+ </g>
+ </svg></g>
+ </g>
+
+
+
+
+</svg>
diff --git a/res-pp/Matrix88M-dark-pp.svg b/res-pp/Matrix88M-dark-pp.svg
@@ -0,0 +1,492 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="380.0" viewBox="0 0 300.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+
+
+text {
+ fill: #eee;
+}
+
+polyline {
+ stroke: #ccc;
+}
+path {
+ stroke: #ccc;
+}
+
+rect.module-background, .background-fill {
+ fill: #111;
+}
+polyline.module-border-inner {
+ stroke: #191919;
+}
+polyline.module-border-middle {
+ stroke: #111;
+}
+polyline.module-border-outer {
+ stroke: #000;
+}
+
+rect.input-background, rect.input-background-filler {
+ fill: #aaa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #666;
+}
+text.input-label {
+ fill: #222;
+}
+polyline.input-label, path.input-label {
+ stroke: #222;
+}
+text.output-label {
+ fill: #ddd;
+}
+polyline.output-label, path.output-label {
+ stroke: #ddd;
+}
+
+circle.port-rim {
+ stroke: #c0c0c0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #888;
+}
+circle.knob-rim {
+ fill: #444;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="300.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 299.0,1 299.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 299.5,0.5 299.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 300.0,0 300.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="12pt" letter-spacing="4px" text-anchor="middle" transform="translate(150.0 19)">MX88M</text>
+ <g transform="translate(0 374)">
+ <text class="brand" font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate(150.0 0)">BOGAUDIO</text>
+ <rect class="background-fill" width="3" height="3" transform="translate(134.5 -5)"/>
+ </g>
+
+
+
+
+ <g transform="translate(27.5 42)">
+ <g transform="translate(-9 -9)"><svg id="MUTE11_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 28)"><svg id="MUTE21_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 65)"><svg id="MUTE31_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 102)"><svg id="MUTE41_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 139)"><svg id="MUTE51_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 176)"><svg id="MUTE61_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 213)"><svg id="MUTE71_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 250)"><svg id="MUTE81_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(26 -9)"><svg id="MUTE12_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 28)"><svg id="MUTE22_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 65)"><svg id="MUTE32_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 102)"><svg id="MUTE42_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 139)"><svg id="MUTE52_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 176)"><svg id="MUTE62_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 213)"><svg id="MUTE72_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 250)"><svg id="MUTE82_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(61 -9)"><svg id="MUTE13_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 28)"><svg id="MUTE23_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 65)"><svg id="MUTE33_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 102)"><svg id="MUTE43_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 139)"><svg id="MUTE53_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 176)"><svg id="MUTE63_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 213)"><svg id="MUTE73_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 250)"><svg id="MUTE83_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(96 -9)"><svg id="MUTE14_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 28)"><svg id="MUTE24_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 65)"><svg id="MUTE34_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 102)"><svg id="MUTE44_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 139)"><svg id="MUTE54_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 176)"><svg id="MUTE64_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 213)"><svg id="MUTE74_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 250)"><svg id="MUTE84_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(131 -9)"><svg id="MUTE15_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 28)"><svg id="MUTE25_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 65)"><svg id="MUTE35_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 102)"><svg id="MUTE45_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 139)"><svg id="MUTE55_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 176)"><svg id="MUTE65_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 213)"><svg id="MUTE75_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 250)"><svg id="MUTE85_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(166 -9)"><svg id="MUTE16_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 28)"><svg id="MUTE26_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 65)"><svg id="MUTE36_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 102)"><svg id="MUTE46_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 139)"><svg id="MUTE56_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 176)"><svg id="MUTE66_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 213)"><svg id="MUTE76_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 250)"><svg id="MUTE86_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(201 -9)"><svg id="MUTE17_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 28)"><svg id="MUTE27_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 65)"><svg id="MUTE37_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 102)"><svg id="MUTE47_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 139)"><svg id="MUTE57_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 176)"><svg id="MUTE67_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 213)"><svg id="MUTE77_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 250)"><svg id="MUTE87_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(236 -9)"><svg id="MUTE18_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 28)"><svg id="MUTE28_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 65)"><svg id="MUTE38_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 102)"><svg id="MUTE48_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 139)"><svg id="MUTE58_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 176)"><svg id="MUTE68_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 213)"><svg id="MUTE78_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 250)"><svg id="MUTE88_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+
+
+
+</svg>
diff --git a/res-pp/Matrix88M-lowcontrast-pp.svg b/res-pp/Matrix88M-lowcontrast-pp.svg
@@ -0,0 +1,492 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="380.0" viewBox="0 0 300.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+
+
+text {
+ fill: #b3b3b3;
+}
+
+polyline {
+ stroke: #b3b3b3;
+}
+path {
+ stroke: #b3b3b3;
+}
+
+rect.module-background, .background-fill {
+ fill: #333;
+}
+polyline.module-border-inner {
+ stroke: #191919;
+}
+polyline.module-border-middle {
+ stroke: #111;
+}
+polyline.module-border-outer {
+ stroke: #000;
+}
+
+rect.input-background, rect.input-background-filler {
+ fill: #b3b3b3;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #888;
+}
+text.input-label {
+ fill: #666;
+}
+polyline.input-label, path.input-label {
+ stroke: #666;
+}
+text.output-label {
+ fill: #ccc;
+}
+polyline.output-label, path.output-label {
+ stroke: #ccc;
+}
+
+circle.port-rim {
+ stroke: #bbb;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #bbb;
+}
+circle.knob-rim {
+ fill: #555;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="300.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 299.0,1 299.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 299.5,0.5 299.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 300.0,0 300.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="12pt" letter-spacing="4px" text-anchor="middle" transform="translate(150.0 19)">MX88M</text>
+ <g transform="translate(0 374)">
+ <text class="brand" font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate(150.0 0)">BOGAUDIO</text>
+ <rect class="background-fill" width="3" height="3" transform="translate(134.5 -5)"/>
+ </g>
+
+
+
+
+ <g transform="translate(27.5 42)">
+ <g transform="translate(-9 -9)"><svg id="MUTE11_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 28)"><svg id="MUTE21_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 65)"><svg id="MUTE31_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 102)"><svg id="MUTE41_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 139)"><svg id="MUTE51_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 176)"><svg id="MUTE61_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 213)"><svg id="MUTE71_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 250)"><svg id="MUTE81_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(26 -9)"><svg id="MUTE12_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 28)"><svg id="MUTE22_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 65)"><svg id="MUTE32_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 102)"><svg id="MUTE42_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 139)"><svg id="MUTE52_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 176)"><svg id="MUTE62_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 213)"><svg id="MUTE72_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 250)"><svg id="MUTE82_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(61 -9)"><svg id="MUTE13_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 28)"><svg id="MUTE23_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 65)"><svg id="MUTE33_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 102)"><svg id="MUTE43_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 139)"><svg id="MUTE53_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 176)"><svg id="MUTE63_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 213)"><svg id="MUTE73_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 250)"><svg id="MUTE83_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(96 -9)"><svg id="MUTE14_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 28)"><svg id="MUTE24_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 65)"><svg id="MUTE34_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 102)"><svg id="MUTE44_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 139)"><svg id="MUTE54_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 176)"><svg id="MUTE64_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 213)"><svg id="MUTE74_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 250)"><svg id="MUTE84_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(131 -9)"><svg id="MUTE15_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 28)"><svg id="MUTE25_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 65)"><svg id="MUTE35_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 102)"><svg id="MUTE45_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 139)"><svg id="MUTE55_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 176)"><svg id="MUTE65_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 213)"><svg id="MUTE75_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 250)"><svg id="MUTE85_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(166 -9)"><svg id="MUTE16_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 28)"><svg id="MUTE26_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 65)"><svg id="MUTE36_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 102)"><svg id="MUTE46_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 139)"><svg id="MUTE56_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 176)"><svg id="MUTE66_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 213)"><svg id="MUTE76_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 250)"><svg id="MUTE86_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(201 -9)"><svg id="MUTE17_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 28)"><svg id="MUTE27_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 65)"><svg id="MUTE37_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 102)"><svg id="MUTE47_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 139)"><svg id="MUTE57_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 176)"><svg id="MUTE67_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 213)"><svg id="MUTE77_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 250)"><svg id="MUTE87_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(236 -9)"><svg id="MUTE18_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 28)"><svg id="MUTE28_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 65)"><svg id="MUTE38_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 102)"><svg id="MUTE48_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 139)"><svg id="MUTE58_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 176)"><svg id="MUTE68_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 213)"><svg id="MUTE78_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 250)"><svg id="MUTE88_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+
+
+
+</svg>
diff --git a/res-pp/Matrix88M-pp.svg b/res-pp/Matrix88M-pp.svg
@@ -0,0 +1,428 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="300.0" height="380.0" viewBox="0 0 300.0 380.0">
+ <style>text {
+ fill: #333;
+ font-family: 'Roboto', sans-serif;
+ font-weight: bold;
+}
+text.title {
+ font-family: 'Comfortaa', sans-serif;
+ font-weight: normal;
+}
+text.brand {
+ font-family: 'Audiowide', sans-serif;
+ font-weight: bold;
+}
+
+polyline {
+ stroke: #333;
+}
+polyline.guide {
+ stroke: #0f0;
+}
+path {
+ stroke: #333;
+}
+
+rect.module-background, .background-fill {
+ fill: #ddd;
+}
+polyline.module-border-inner {
+ stroke: #e4e4e4;
+}
+polyline.module-border-middle {
+ stroke: #ebebeb;
+}
+polyline.module-border-outer {
+ stroke: #f2f2f2;
+}
+
+g.io-group {
+}
+rect.input-background, rect.input-background-filler {
+ fill: #fafafa;
+}
+rect.output-background, rect.output-background-filler {
+ fill: #bbb;
+}
+text.input-label, text.output-label {
+ /* font-size: 6pt; */
+}
+polyline.input-label, polyline.output-label {
+}
+path.input-label, path.output-label {
+}
+
+circle.port-rim {
+ stroke: #f0f0f0;
+}
+circle.port-barrel {
+ stroke: #222;
+ fill: #222;
+}
+circle.knob-center {
+ fill: #eee;
+}
+circle.knob-rim {
+ fill: #333;
+}
+circle.knob-tick {
+ fill: #fff;
+}
+polyline.knob-tick {
+ stroke: #fff;
+}
+</style>
+
+
+
+ <rect class="module-background background-fill" width="300.0" height="380.0"/>
+
+
+ <polyline class="module-border-inner" points="1,1 299.0,1 299.0,379.0 1,379.0 1,1" stroke-width="0.5" fill="none"/>
+ <polyline class="module-border-middle" points="0.5,0.5 299.5,0.5 299.5,379.5 0.5,379.5 0.5,0.5" stroke-width="0.8" fill="none"/>
+ <polyline class="module-border-outer" points="0,0 300.0,0 300.0,380.0 0,380.0 0,0" stroke-width="1" fill="none"/>
+
+ <text class="title" font-size="12pt" letter-spacing="4px" text-anchor="middle" transform="translate(150.0 19)">MX88M</text>
+ <g transform="translate(0 374)">
+ <text class="brand" font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate(150.0 0)">BOGAUDIO</text>
+ <rect class="background-fill" width="3" height="3" transform="translate(134.5 -5)"/>
+ </g>
+
+
+
+
+ <g transform="translate(27.5 42)">
+ <g transform="translate(-9 -9)"><svg id="MUTE11_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 28)"><svg id="MUTE21_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 65)"><svg id="MUTE31_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 102)"><svg id="MUTE41_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 139)"><svg id="MUTE51_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 176)"><svg id="MUTE61_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 213)"><svg id="MUTE71_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(-9 250)"><svg id="MUTE81_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(26 -9)"><svg id="MUTE12_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 28)"><svg id="MUTE22_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 65)"><svg id="MUTE32_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 102)"><svg id="MUTE42_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 139)"><svg id="MUTE52_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 176)"><svg id="MUTE62_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 213)"><svg id="MUTE72_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(26 250)"><svg id="MUTE82_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(61 -9)"><svg id="MUTE13_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 28)"><svg id="MUTE23_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 65)"><svg id="MUTE33_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 102)"><svg id="MUTE43_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 139)"><svg id="MUTE53_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 176)"><svg id="MUTE63_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 213)"><svg id="MUTE73_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(61 250)"><svg id="MUTE83_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(96 -9)"><svg id="MUTE14_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 28)"><svg id="MUTE24_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 65)"><svg id="MUTE34_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 102)"><svg id="MUTE44_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 139)"><svg id="MUTE54_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 176)"><svg id="MUTE64_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 213)"><svg id="MUTE74_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(96 250)"><svg id="MUTE84_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(131 -9)"><svg id="MUTE15_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 28)"><svg id="MUTE25_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 65)"><svg id="MUTE35_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 102)"><svg id="MUTE45_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 139)"><svg id="MUTE55_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 176)"><svg id="MUTE65_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 213)"><svg id="MUTE75_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(131 250)"><svg id="MUTE85_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(166 -9)"><svg id="MUTE16_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 28)"><svg id="MUTE26_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 65)"><svg id="MUTE36_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 102)"><svg id="MUTE46_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 139)"><svg id="MUTE56_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 176)"><svg id="MUTE66_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 213)"><svg id="MUTE76_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(166 250)"><svg id="MUTE86_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(201 -9)"><svg id="MUTE17_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 28)"><svg id="MUTE27_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 65)"><svg id="MUTE37_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 102)"><svg id="MUTE47_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 139)"><svg id="MUTE57_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 176)"><svg id="MUTE67_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 213)"><svg id="MUTE77_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(201 250)"><svg id="MUTE87_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+
+ <g transform="translate(236 -9)"><svg id="MUTE18_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 28)"><svg id="MUTE28_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 65)"><svg id="MUTE38_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 102)"><svg id="MUTE48_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 139)"><svg id="MUTE58_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 176)"><svg id="MUTE68_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 213)"><svg id="MUTE78_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ <g transform="translate(236 250)"><svg id="MUTE88_PARAM">
+ <g transform="translate(9 9)">
+ <circle cx="0" cy="0" r="8.5" stroke-width="1" stroke="#00f" fill="#f00"/>
+ </g>
+ </svg></g>
+ </g>
+
+
+
+
+</svg>
diff --git a/res-src/Matrix88Cv-src.svg b/res-src/Matrix88Cv-src.svg
@@ -0,0 +1,99 @@
+<module hp="20">
+ <style/>
+
+ <def xlink:href="#module" var-name="MX88CV"/>
+
+ <g transform="translate(27.5 42)" var-x="35" var-y="37">
+ <def id="CV11_INPUT" xlink:href="#input" transform="translate(0*$x-12 0*$y-12)"/>
+ <def id="CV21_INPUT" xlink:href="#input" transform="translate(0*$x-12 1*$y-12)"/>
+ <def id="CV31_INPUT" xlink:href="#input" transform="translate(0*$x-12 2*$y-12)"/>
+ <def id="CV41_INPUT" xlink:href="#input" transform="translate(0*$x-12 3*$y-12)"/>
+ <def id="CV51_INPUT" xlink:href="#input" transform="translate(0*$x-12 4*$y-12)"/>
+ <def id="CV61_INPUT" xlink:href="#input" transform="translate(0*$x-12 5*$y-12)"/>
+ <def id="CV71_INPUT" xlink:href="#input" transform="translate(0*$x-12 6*$y-12)"/>
+ <def id="CV81_INPUT" xlink:href="#input" transform="translate(0*$x-12 7*$y-12)"/>
+
+ <def id="CV12_INPUT" xlink:href="#input" transform="translate(1*$x-12 0*$y-12)"/>
+ <def id="CV22_INPUT" xlink:href="#input" transform="translate(1*$x-12 1*$y-12)"/>
+ <def id="CV32_INPUT" xlink:href="#input" transform="translate(1*$x-12 2*$y-12)"/>
+ <def id="CV42_INPUT" xlink:href="#input" transform="translate(1*$x-12 3*$y-12)"/>
+ <def id="CV52_INPUT" xlink:href="#input" transform="translate(1*$x-12 4*$y-12)"/>
+ <def id="CV62_INPUT" xlink:href="#input" transform="translate(1*$x-12 5*$y-12)"/>
+ <def id="CV72_INPUT" xlink:href="#input" transform="translate(1*$x-12 6*$y-12)"/>
+ <def id="CV82_INPUT" xlink:href="#input" transform="translate(1*$x-12 7*$y-12)"/>
+
+ <def id="CV13_INPUT" xlink:href="#input" transform="translate(2*$x-12 0*$y-12)"/>
+ <def id="CV23_INPUT" xlink:href="#input" transform="translate(2*$x-12 1*$y-12)"/>
+ <def id="CV33_INPUT" xlink:href="#input" transform="translate(2*$x-12 2*$y-12)"/>
+ <def id="CV43_INPUT" xlink:href="#input" transform="translate(2*$x-12 3*$y-12)"/>
+ <def id="CV53_INPUT" xlink:href="#input" transform="translate(2*$x-12 4*$y-12)"/>
+ <def id="CV63_INPUT" xlink:href="#input" transform="translate(2*$x-12 5*$y-12)"/>
+ <def id="CV73_INPUT" xlink:href="#input" transform="translate(2*$x-12 6*$y-12)"/>
+ <def id="CV83_INPUT" xlink:href="#input" transform="translate(2*$x-12 7*$y-12)"/>
+
+ <def id="CV14_INPUT" xlink:href="#input" transform="translate(3*$x-12 0*$y-12)"/>
+ <def id="CV24_INPUT" xlink:href="#input" transform="translate(3*$x-12 1*$y-12)"/>
+ <def id="CV34_INPUT" xlink:href="#input" transform="translate(3*$x-12 2*$y-12)"/>
+ <def id="CV44_INPUT" xlink:href="#input" transform="translate(3*$x-12 3*$y-12)"/>
+ <def id="CV54_INPUT" xlink:href="#input" transform="translate(3*$x-12 4*$y-12)"/>
+ <def id="CV64_INPUT" xlink:href="#input" transform="translate(3*$x-12 5*$y-12)"/>
+ <def id="CV74_INPUT" xlink:href="#input" transform="translate(3*$x-12 6*$y-12)"/>
+ <def id="CV84_INPUT" xlink:href="#input" transform="translate(3*$x-12 7*$y-12)"/>
+
+ <def id="CV15_INPUT" xlink:href="#input" transform="translate(4*$x-12 0*$y-12)"/>
+ <def id="CV25_INPUT" xlink:href="#input" transform="translate(4*$x-12 1*$y-12)"/>
+ <def id="CV35_INPUT" xlink:href="#input" transform="translate(4*$x-12 2*$y-12)"/>
+ <def id="CV45_INPUT" xlink:href="#input" transform="translate(4*$x-12 3*$y-12)"/>
+ <def id="CV55_INPUT" xlink:href="#input" transform="translate(4*$x-12 4*$y-12)"/>
+ <def id="CV65_INPUT" xlink:href="#input" transform="translate(4*$x-12 5*$y-12)"/>
+ <def id="CV75_INPUT" xlink:href="#input" transform="translate(4*$x-12 6*$y-12)"/>
+ <def id="CV85_INPUT" xlink:href="#input" transform="translate(4*$x-12 7*$y-12)"/>
+
+ <def id="CV16_INPUT" xlink:href="#input" transform="translate(5*$x-12 0*$y-12)"/>
+ <def id="CV26_INPUT" xlink:href="#input" transform="translate(5*$x-12 1*$y-12)"/>
+ <def id="CV36_INPUT" xlink:href="#input" transform="translate(5*$x-12 2*$y-12)"/>
+ <def id="CV46_INPUT" xlink:href="#input" transform="translate(5*$x-12 3*$y-12)"/>
+ <def id="CV56_INPUT" xlink:href="#input" transform="translate(5*$x-12 4*$y-12)"/>
+ <def id="CV66_INPUT" xlink:href="#input" transform="translate(5*$x-12 5*$y-12)"/>
+ <def id="CV76_INPUT" xlink:href="#input" transform="translate(5*$x-12 6*$y-12)"/>
+ <def id="CV86_INPUT" xlink:href="#input" transform="translate(5*$x-12 7*$y-12)"/>
+
+ <def id="CV17_INPUT" xlink:href="#input" transform="translate(6*$x-12 0*$y-12)"/>
+ <def id="CV27_INPUT" xlink:href="#input" transform="translate(6*$x-12 1*$y-12)"/>
+ <def id="CV37_INPUT" xlink:href="#input" transform="translate(6*$x-12 2*$y-12)"/>
+ <def id="CV47_INPUT" xlink:href="#input" transform="translate(6*$x-12 3*$y-12)"/>
+ <def id="CV57_INPUT" xlink:href="#input" transform="translate(6*$x-12 4*$y-12)"/>
+ <def id="CV67_INPUT" xlink:href="#input" transform="translate(6*$x-12 5*$y-12)"/>
+ <def id="CV77_INPUT" xlink:href="#input" transform="translate(6*$x-12 6*$y-12)"/>
+ <def id="CV87_INPUT" xlink:href="#input" transform="translate(6*$x-12 7*$y-12)"/>
+
+ <def id="CV18_INPUT" xlink:href="#input" transform="translate(7*$x-12 0*$y-12)"/>
+ <def id="CV28_INPUT" xlink:href="#input" transform="translate(7*$x-12 1*$y-12)"/>
+ <def id="CV38_INPUT" xlink:href="#input" transform="translate(7*$x-12 2*$y-12)"/>
+ <def id="CV48_INPUT" xlink:href="#input" transform="translate(7*$x-12 3*$y-12)"/>
+ <def id="CV58_INPUT" xlink:href="#input" transform="translate(7*$x-12 4*$y-12)"/>
+ <def id="CV68_INPUT" xlink:href="#input" transform="translate(7*$x-12 5*$y-12)"/>
+ <def id="CV78_INPUT" xlink:href="#input" transform="translate(7*$x-12 6*$y-12)"/>
+ <def id="CV88_INPUT" xlink:href="#input" transform="translate(7*$x-12 7*$y-12)"/>
+ </g>
+
+ <!-- <text font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate($width/2.0 330)">CV</text> -->
+
+ <!-- <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(27.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(62.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(97.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(132.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(167.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(202.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(237.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(273.5 0)" />
+
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 42)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 79)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 116)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 153)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 190)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 227)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 264)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 301)" /> -->
+</module>
diff --git a/res-src/Matrix88M-src.svg b/res-src/Matrix88M-src.svg
@@ -0,0 +1,101 @@
+<module hp="20">
+ <style/>
+
+ <def xlink:href="#module" var-name="MX88M"/>
+
+ <!-- <def id="MIX11_PARAM" xlink:href="#button" transform="translate(4.5 9)"/> -->
+
+ <g transform="translate(27.5 42)" var-x="35" var-y="37">
+ <def id="MUTE11_PARAM" xlink:href="#button" transform="translate(0*$x-9 0*$y-9)"/>
+ <def id="MUTE21_PARAM" xlink:href="#button" transform="translate(0*$x-9 1*$y-9)"/>
+ <def id="MUTE31_PARAM" xlink:href="#button" transform="translate(0*$x-9 2*$y-9)"/>
+ <def id="MUTE41_PARAM" xlink:href="#button" transform="translate(0*$x-9 3*$y-9)"/>
+ <def id="MUTE51_PARAM" xlink:href="#button" transform="translate(0*$x-9 4*$y-9)"/>
+ <def id="MUTE61_PARAM" xlink:href="#button" transform="translate(0*$x-9 5*$y-9)"/>
+ <def id="MUTE71_PARAM" xlink:href="#button" transform="translate(0*$x-9 6*$y-9)"/>
+ <def id="MUTE81_PARAM" xlink:href="#button" transform="translate(0*$x-9 7*$y-9)"/>
+
+ <def id="MUTE12_PARAM" xlink:href="#button" transform="translate(1*$x-9 0*$y-9)"/>
+ <def id="MUTE22_PARAM" xlink:href="#button" transform="translate(1*$x-9 1*$y-9)"/>
+ <def id="MUTE32_PARAM" xlink:href="#button" transform="translate(1*$x-9 2*$y-9)"/>
+ <def id="MUTE42_PARAM" xlink:href="#button" transform="translate(1*$x-9 3*$y-9)"/>
+ <def id="MUTE52_PARAM" xlink:href="#button" transform="translate(1*$x-9 4*$y-9)"/>
+ <def id="MUTE62_PARAM" xlink:href="#button" transform="translate(1*$x-9 5*$y-9)"/>
+ <def id="MUTE72_PARAM" xlink:href="#button" transform="translate(1*$x-9 6*$y-9)"/>
+ <def id="MUTE82_PARAM" xlink:href="#button" transform="translate(1*$x-9 7*$y-9)"/>
+
+ <def id="MUTE13_PARAM" xlink:href="#button" transform="translate(2*$x-9 0*$y-9)"/>
+ <def id="MUTE23_PARAM" xlink:href="#button" transform="translate(2*$x-9 1*$y-9)"/>
+ <def id="MUTE33_PARAM" xlink:href="#button" transform="translate(2*$x-9 2*$y-9)"/>
+ <def id="MUTE43_PARAM" xlink:href="#button" transform="translate(2*$x-9 3*$y-9)"/>
+ <def id="MUTE53_PARAM" xlink:href="#button" transform="translate(2*$x-9 4*$y-9)"/>
+ <def id="MUTE63_PARAM" xlink:href="#button" transform="translate(2*$x-9 5*$y-9)"/>
+ <def id="MUTE73_PARAM" xlink:href="#button" transform="translate(2*$x-9 6*$y-9)"/>
+ <def id="MUTE83_PARAM" xlink:href="#button" transform="translate(2*$x-9 7*$y-9)"/>
+
+ <def id="MUTE14_PARAM" xlink:href="#button" transform="translate(3*$x-9 0*$y-9)"/>
+ <def id="MUTE24_PARAM" xlink:href="#button" transform="translate(3*$x-9 1*$y-9)"/>
+ <def id="MUTE34_PARAM" xlink:href="#button" transform="translate(3*$x-9 2*$y-9)"/>
+ <def id="MUTE44_PARAM" xlink:href="#button" transform="translate(3*$x-9 3*$y-9)"/>
+ <def id="MUTE54_PARAM" xlink:href="#button" transform="translate(3*$x-9 4*$y-9)"/>
+ <def id="MUTE64_PARAM" xlink:href="#button" transform="translate(3*$x-9 5*$y-9)"/>
+ <def id="MUTE74_PARAM" xlink:href="#button" transform="translate(3*$x-9 6*$y-9)"/>
+ <def id="MUTE84_PARAM" xlink:href="#button" transform="translate(3*$x-9 7*$y-9)"/>
+
+ <def id="MUTE15_PARAM" xlink:href="#button" transform="translate(4*$x-9 0*$y-9)"/>
+ <def id="MUTE25_PARAM" xlink:href="#button" transform="translate(4*$x-9 1*$y-9)"/>
+ <def id="MUTE35_PARAM" xlink:href="#button" transform="translate(4*$x-9 2*$y-9)"/>
+ <def id="MUTE45_PARAM" xlink:href="#button" transform="translate(4*$x-9 3*$y-9)"/>
+ <def id="MUTE55_PARAM" xlink:href="#button" transform="translate(4*$x-9 4*$y-9)"/>
+ <def id="MUTE65_PARAM" xlink:href="#button" transform="translate(4*$x-9 5*$y-9)"/>
+ <def id="MUTE75_PARAM" xlink:href="#button" transform="translate(4*$x-9 6*$y-9)"/>
+ <def id="MUTE85_PARAM" xlink:href="#button" transform="translate(4*$x-9 7*$y-9)"/>
+
+ <def id="MUTE16_PARAM" xlink:href="#button" transform="translate(5*$x-9 0*$y-9)"/>
+ <def id="MUTE26_PARAM" xlink:href="#button" transform="translate(5*$x-9 1*$y-9)"/>
+ <def id="MUTE36_PARAM" xlink:href="#button" transform="translate(5*$x-9 2*$y-9)"/>
+ <def id="MUTE46_PARAM" xlink:href="#button" transform="translate(5*$x-9 3*$y-9)"/>
+ <def id="MUTE56_PARAM" xlink:href="#button" transform="translate(5*$x-9 4*$y-9)"/>
+ <def id="MUTE66_PARAM" xlink:href="#button" transform="translate(5*$x-9 5*$y-9)"/>
+ <def id="MUTE76_PARAM" xlink:href="#button" transform="translate(5*$x-9 6*$y-9)"/>
+ <def id="MUTE86_PARAM" xlink:href="#button" transform="translate(5*$x-9 7*$y-9)"/>
+
+ <def id="MUTE17_PARAM" xlink:href="#button" transform="translate(6*$x-9 0*$y-9)"/>
+ <def id="MUTE27_PARAM" xlink:href="#button" transform="translate(6*$x-9 1*$y-9)"/>
+ <def id="MUTE37_PARAM" xlink:href="#button" transform="translate(6*$x-9 2*$y-9)"/>
+ <def id="MUTE47_PARAM" xlink:href="#button" transform="translate(6*$x-9 3*$y-9)"/>
+ <def id="MUTE57_PARAM" xlink:href="#button" transform="translate(6*$x-9 4*$y-9)"/>
+ <def id="MUTE67_PARAM" xlink:href="#button" transform="translate(6*$x-9 5*$y-9)"/>
+ <def id="MUTE77_PARAM" xlink:href="#button" transform="translate(6*$x-9 6*$y-9)"/>
+ <def id="MUTE87_PARAM" xlink:href="#button" transform="translate(6*$x-9 7*$y-9)"/>
+
+ <def id="MUTE18_PARAM" xlink:href="#button" transform="translate(7*$x-9 0*$y-9)"/>
+ <def id="MUTE28_PARAM" xlink:href="#button" transform="translate(7*$x-9 1*$y-9)"/>
+ <def id="MUTE38_PARAM" xlink:href="#button" transform="translate(7*$x-9 2*$y-9)"/>
+ <def id="MUTE48_PARAM" xlink:href="#button" transform="translate(7*$x-9 3*$y-9)"/>
+ <def id="MUTE58_PARAM" xlink:href="#button" transform="translate(7*$x-9 4*$y-9)"/>
+ <def id="MUTE68_PARAM" xlink:href="#button" transform="translate(7*$x-9 5*$y-9)"/>
+ <def id="MUTE78_PARAM" xlink:href="#button" transform="translate(7*$x-9 6*$y-9)"/>
+ <def id="MUTE88_PARAM" xlink:href="#button" transform="translate(7*$x-9 7*$y-9)"/>
+ </g>
+
+ <!-- <text font-size="8pt" letter-spacing="2px" text-anchor="middle" transform="translate($width/2.0 330)">MUTE</text> -->
+
+ <!-- <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(27.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(62.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(97.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(132.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(167.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(202.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(237.5 0)" />
+ <polyline class="guide" points="0,0 0,380" stroke="#0f0" stroke-width="1" fill="none" transform="translate(273.5 0)" />
+
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 42)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 79)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 116)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 153)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 190)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 227)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 264)" />
+ <polyline class="guide" points="0,0 $width,0" stroke="#0f0" stroke-width="1" fill="none" transform="translate(0 301)" /> -->
+</module>
diff --git a/res/Matrix88Cv-dark.svg b/res/Matrix88Cv-dark.svg
Binary files differ.
diff --git a/res/Matrix88Cv-lowcontrast.svg b/res/Matrix88Cv-lowcontrast.svg
Binary files differ.
diff --git a/res/Matrix88Cv.svg b/res/Matrix88Cv.svg
Binary files differ.
diff --git a/res/Matrix88M-dark.svg b/res/Matrix88M-dark.svg
Binary files differ.
diff --git a/res/Matrix88M-lowcontrast.svg b/res/Matrix88M-lowcontrast.svg
Binary files differ.
diff --git a/res/Matrix88M.svg b/res/Matrix88M.svg
Binary files differ.
diff --git a/src/Matrix44.cpp b/src/Matrix44.cpp
@@ -5,8 +5,9 @@ void Matrix44::elementsChanged() {
// base-class caller holds lock on _elements.
Input** cvs = NULL;
Param** mutes = NULL;
- for (int i = 1, n = _elements.size(); i < n; ++i) {
- auto e = _elements[i];
+ if (_elements.size() > 1) {
+ auto e = _elements[1];
+ assert(e);
if (e->cvs) {
cvs = e->cvs;
}
diff --git a/src/Matrix88.cpp b/src/Matrix88.cpp
@@ -1,6 +1,32 @@
#include "Matrix88.hpp"
+void Matrix88::elementsChanged() {
+ // base-class caller holds lock on _elements.
+ Input** cvs = NULL;
+ Param** mutes = NULL;
+ for (int i = 1, n = std::min(3, (int)_elements.size()); i < n; ++i) {
+ auto e = _elements[i];
+ assert(e);
+ if (e->cvs) {
+ cvs = e->cvs;
+ }
+ if (e->mutes) {
+ mutes = e->mutes;
+ }
+ }
+ setCVInputs(cvs);
+ setMuteParams(mutes);
+}
+
+void Matrix88::processAlways(const ProcessArgs& args) {
+ if (expanderConnected()) {
+ Matrix88ExpanderMessage* te = toExpander();
+ te->baseID = _id;
+ te->position = 1;
+ }
+}
+
struct Matrix88Widget : KnobMatrixModuleWidget {
static constexpr int hp = 22;
diff --git a/src/Matrix88.hpp b/src/Matrix88.hpp
@@ -1,13 +1,12 @@
#pragma once
-#include "bogaudio.hpp"
-#include "matrix_base.hpp"
-
-extern Model* modelMatrix88;
+#include "Matrix88_shared.hpp"
namespace bogaudio {
-struct Matrix88 : KnobMatrixModule {
+typedef ChainableExpandableModule<Matrix88ExpanderMessage, Matrix88Element, 1, KnobMatrixModule> Matrix88Base;
+
+struct Matrix88 : Matrix88Base {
enum ParamsIds {
MIX11_PARAM,
MIX21_PARAM,
@@ -100,8 +99,9 @@ struct Matrix88 : KnobMatrixModule {
NUM_OUTPUTS
};
- Matrix88() : KnobMatrixModule(8, 8, MIX11_PARAM, IN1_INPUT, OUT1_OUTPUT) {
+ Matrix88() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
+ configMatrixModule(8, 8, MIX11_PARAM, IN1_INPUT, OUT1_OUTPUT);
configParam(MIX11_PARAM, -1.0f, 1.0f, 0.0f, "Mix 1A", "%", 0.0f, 100.0f);
configParam(MIX21_PARAM, -1.0f, 1.0f, 0.0f, "Mix 2A", "%", 0.0f, 100.0f);
configParam(MIX31_PARAM, -1.0f, 1.0f, 0.0f, "Mix 3A", "%", 0.0f, 100.0f);
@@ -166,7 +166,14 @@ struct Matrix88 : KnobMatrixModule {
configParam(MIX68_PARAM, -1.0f, 1.0f, 0.0f, "Mix 6H", "%", 0.0f, 100.0f);
configParam(MIX78_PARAM, -1.0f, 1.0f, 0.0f, "Mix 7H", "%", 0.0f, 100.0f);
configParam(MIX88_PARAM, -1.0f, 1.0f, 0.0f, "Mix 8H", "%", 0.0f, 100.0f);
+
+ setLocalElements({new Matrix88Element(NULL, NULL)});
+ registerBase();
+ setExpanderModelPredicate([](Model* m) { return m == modelMatrix88Cv || m == modelMatrix88M; });
}
+
+ void elementsChanged() override;
+ void processAlways(const ProcessArgs& args) override;
};
} // namespace bogaudio
diff --git a/src/Matrix88Cv.cpp b/src/Matrix88Cv.cpp
@@ -0,0 +1,164 @@
+
+#include "Matrix88Cv.hpp"
+
+void Matrix88Cv::processAlways(const ProcessArgs& args) {
+ int position = 0;
+ int baseID = 0;
+ if (baseConnected()) {
+ Matrix88ExpanderMessage* bm = fromBase();
+ baseID = bm->baseID;
+ position = bm->position;
+ }
+ setBaseIDAndPosition(baseID, position);
+
+ if (expanderConnected()) {
+ Matrix88ExpanderMessage* te = toExpander();
+ te->baseID = _baseID;
+ te->position = _position > 0 ? _position + 1 : 0;
+ }
+}
+
+struct Matrix88CvWidget : BGModuleWidget {
+ static constexpr int hp = 20;
+
+ Matrix88CvWidget(Matrix88Cv* module) {
+ setModule(module);
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+ setPanel(box.size, "Matrix88Cv");
+ createScrews();
+
+ // generated by svg_widgets.rb
+ auto cv11InputPosition = Vec(15.5, 30.0);
+ auto cv21InputPosition = Vec(15.5, 67.0);
+ auto cv31InputPosition = Vec(15.5, 104.0);
+ auto cv41InputPosition = Vec(15.5, 141.0);
+ auto cv51InputPosition = Vec(15.5, 178.0);
+ auto cv61InputPosition = Vec(15.5, 215.0);
+ auto cv71InputPosition = Vec(15.5, 252.0);
+ auto cv81InputPosition = Vec(15.5, 289.0);
+ auto cv12InputPosition = Vec(50.5, 30.0);
+ auto cv22InputPosition = Vec(50.5, 67.0);
+ auto cv32InputPosition = Vec(50.5, 104.0);
+ auto cv42InputPosition = Vec(50.5, 141.0);
+ auto cv52InputPosition = Vec(50.5, 178.0);
+ auto cv62InputPosition = Vec(50.5, 215.0);
+ auto cv72InputPosition = Vec(50.5, 252.0);
+ auto cv82InputPosition = Vec(50.5, 289.0);
+ auto cv13InputPosition = Vec(85.5, 30.0);
+ auto cv23InputPosition = Vec(85.5, 67.0);
+ auto cv33InputPosition = Vec(85.5, 104.0);
+ auto cv43InputPosition = Vec(85.5, 141.0);
+ auto cv53InputPosition = Vec(85.5, 178.0);
+ auto cv63InputPosition = Vec(85.5, 215.0);
+ auto cv73InputPosition = Vec(85.5, 252.0);
+ auto cv83InputPosition = Vec(85.5, 289.0);
+ auto cv14InputPosition = Vec(120.5, 30.0);
+ auto cv24InputPosition = Vec(120.5, 67.0);
+ auto cv34InputPosition = Vec(120.5, 104.0);
+ auto cv44InputPosition = Vec(120.5, 141.0);
+ auto cv54InputPosition = Vec(120.5, 178.0);
+ auto cv64InputPosition = Vec(120.5, 215.0);
+ auto cv74InputPosition = Vec(120.5, 252.0);
+ auto cv84InputPosition = Vec(120.5, 289.0);
+ auto cv15InputPosition = Vec(155.5, 30.0);
+ auto cv25InputPosition = Vec(155.5, 67.0);
+ auto cv35InputPosition = Vec(155.5, 104.0);
+ auto cv45InputPosition = Vec(155.5, 141.0);
+ auto cv55InputPosition = Vec(155.5, 178.0);
+ auto cv65InputPosition = Vec(155.5, 215.0);
+ auto cv75InputPosition = Vec(155.5, 252.0);
+ auto cv85InputPosition = Vec(155.5, 289.0);
+ auto cv16InputPosition = Vec(190.5, 30.0);
+ auto cv26InputPosition = Vec(190.5, 67.0);
+ auto cv36InputPosition = Vec(190.5, 104.0);
+ auto cv46InputPosition = Vec(190.5, 141.0);
+ auto cv56InputPosition = Vec(190.5, 178.0);
+ auto cv66InputPosition = Vec(190.5, 215.0);
+ auto cv76InputPosition = Vec(190.5, 252.0);
+ auto cv86InputPosition = Vec(190.5, 289.0);
+ auto cv17InputPosition = Vec(225.5, 30.0);
+ auto cv27InputPosition = Vec(225.5, 67.0);
+ auto cv37InputPosition = Vec(225.5, 104.0);
+ auto cv47InputPosition = Vec(225.5, 141.0);
+ auto cv57InputPosition = Vec(225.5, 178.0);
+ auto cv67InputPosition = Vec(225.5, 215.0);
+ auto cv77InputPosition = Vec(225.5, 252.0);
+ auto cv87InputPosition = Vec(225.5, 289.0);
+ auto cv18InputPosition = Vec(260.5, 30.0);
+ auto cv28InputPosition = Vec(260.5, 67.0);
+ auto cv38InputPosition = Vec(260.5, 104.0);
+ auto cv48InputPosition = Vec(260.5, 141.0);
+ auto cv58InputPosition = Vec(260.5, 178.0);
+ auto cv68InputPosition = Vec(260.5, 215.0);
+ auto cv78InputPosition = Vec(260.5, 252.0);
+ auto cv88InputPosition = Vec(260.5, 289.0);
+ // end generated by svg_widgets.rb
+
+ addInput(createInput<Port24>(cv11InputPosition, module, Matrix88Cv::CV11_INPUT));
+ addInput(createInput<Port24>(cv21InputPosition, module, Matrix88Cv::CV21_INPUT));
+ addInput(createInput<Port24>(cv31InputPosition, module, Matrix88Cv::CV31_INPUT));
+ addInput(createInput<Port24>(cv41InputPosition, module, Matrix88Cv::CV41_INPUT));
+ addInput(createInput<Port24>(cv51InputPosition, module, Matrix88Cv::CV51_INPUT));
+ addInput(createInput<Port24>(cv61InputPosition, module, Matrix88Cv::CV61_INPUT));
+ addInput(createInput<Port24>(cv71InputPosition, module, Matrix88Cv::CV71_INPUT));
+ addInput(createInput<Port24>(cv81InputPosition, module, Matrix88Cv::CV81_INPUT));
+ addInput(createInput<Port24>(cv12InputPosition, module, Matrix88Cv::CV12_INPUT));
+ addInput(createInput<Port24>(cv22InputPosition, module, Matrix88Cv::CV22_INPUT));
+ addInput(createInput<Port24>(cv32InputPosition, module, Matrix88Cv::CV32_INPUT));
+ addInput(createInput<Port24>(cv42InputPosition, module, Matrix88Cv::CV42_INPUT));
+ addInput(createInput<Port24>(cv52InputPosition, module, Matrix88Cv::CV52_INPUT));
+ addInput(createInput<Port24>(cv62InputPosition, module, Matrix88Cv::CV62_INPUT));
+ addInput(createInput<Port24>(cv72InputPosition, module, Matrix88Cv::CV72_INPUT));
+ addInput(createInput<Port24>(cv82InputPosition, module, Matrix88Cv::CV82_INPUT));
+ addInput(createInput<Port24>(cv13InputPosition, module, Matrix88Cv::CV13_INPUT));
+ addInput(createInput<Port24>(cv23InputPosition, module, Matrix88Cv::CV23_INPUT));
+ addInput(createInput<Port24>(cv33InputPosition, module, Matrix88Cv::CV33_INPUT));
+ addInput(createInput<Port24>(cv43InputPosition, module, Matrix88Cv::CV43_INPUT));
+ addInput(createInput<Port24>(cv53InputPosition, module, Matrix88Cv::CV53_INPUT));
+ addInput(createInput<Port24>(cv63InputPosition, module, Matrix88Cv::CV63_INPUT));
+ addInput(createInput<Port24>(cv73InputPosition, module, Matrix88Cv::CV73_INPUT));
+ addInput(createInput<Port24>(cv83InputPosition, module, Matrix88Cv::CV83_INPUT));
+ addInput(createInput<Port24>(cv14InputPosition, module, Matrix88Cv::CV14_INPUT));
+ addInput(createInput<Port24>(cv24InputPosition, module, Matrix88Cv::CV24_INPUT));
+ addInput(createInput<Port24>(cv34InputPosition, module, Matrix88Cv::CV34_INPUT));
+ addInput(createInput<Port24>(cv44InputPosition, module, Matrix88Cv::CV44_INPUT));
+ addInput(createInput<Port24>(cv54InputPosition, module, Matrix88Cv::CV54_INPUT));
+ addInput(createInput<Port24>(cv64InputPosition, module, Matrix88Cv::CV64_INPUT));
+ addInput(createInput<Port24>(cv74InputPosition, module, Matrix88Cv::CV74_INPUT));
+ addInput(createInput<Port24>(cv84InputPosition, module, Matrix88Cv::CV84_INPUT));
+ addInput(createInput<Port24>(cv15InputPosition, module, Matrix88Cv::CV15_INPUT));
+ addInput(createInput<Port24>(cv25InputPosition, module, Matrix88Cv::CV25_INPUT));
+ addInput(createInput<Port24>(cv35InputPosition, module, Matrix88Cv::CV35_INPUT));
+ addInput(createInput<Port24>(cv45InputPosition, module, Matrix88Cv::CV45_INPUT));
+ addInput(createInput<Port24>(cv55InputPosition, module, Matrix88Cv::CV55_INPUT));
+ addInput(createInput<Port24>(cv65InputPosition, module, Matrix88Cv::CV65_INPUT));
+ addInput(createInput<Port24>(cv75InputPosition, module, Matrix88Cv::CV75_INPUT));
+ addInput(createInput<Port24>(cv85InputPosition, module, Matrix88Cv::CV85_INPUT));
+ addInput(createInput<Port24>(cv16InputPosition, module, Matrix88Cv::CV16_INPUT));
+ addInput(createInput<Port24>(cv26InputPosition, module, Matrix88Cv::CV26_INPUT));
+ addInput(createInput<Port24>(cv36InputPosition, module, Matrix88Cv::CV36_INPUT));
+ addInput(createInput<Port24>(cv46InputPosition, module, Matrix88Cv::CV46_INPUT));
+ addInput(createInput<Port24>(cv56InputPosition, module, Matrix88Cv::CV56_INPUT));
+ addInput(createInput<Port24>(cv66InputPosition, module, Matrix88Cv::CV66_INPUT));
+ addInput(createInput<Port24>(cv76InputPosition, module, Matrix88Cv::CV76_INPUT));
+ addInput(createInput<Port24>(cv86InputPosition, module, Matrix88Cv::CV86_INPUT));
+ addInput(createInput<Port24>(cv17InputPosition, module, Matrix88Cv::CV17_INPUT));
+ addInput(createInput<Port24>(cv27InputPosition, module, Matrix88Cv::CV27_INPUT));
+ addInput(createInput<Port24>(cv37InputPosition, module, Matrix88Cv::CV37_INPUT));
+ addInput(createInput<Port24>(cv47InputPosition, module, Matrix88Cv::CV47_INPUT));
+ addInput(createInput<Port24>(cv57InputPosition, module, Matrix88Cv::CV57_INPUT));
+ addInput(createInput<Port24>(cv67InputPosition, module, Matrix88Cv::CV67_INPUT));
+ addInput(createInput<Port24>(cv77InputPosition, module, Matrix88Cv::CV77_INPUT));
+ addInput(createInput<Port24>(cv87InputPosition, module, Matrix88Cv::CV87_INPUT));
+ addInput(createInput<Port24>(cv18InputPosition, module, Matrix88Cv::CV18_INPUT));
+ addInput(createInput<Port24>(cv28InputPosition, module, Matrix88Cv::CV28_INPUT));
+ addInput(createInput<Port24>(cv38InputPosition, module, Matrix88Cv::CV38_INPUT));
+ addInput(createInput<Port24>(cv48InputPosition, module, Matrix88Cv::CV48_INPUT));
+ addInput(createInput<Port24>(cv58InputPosition, module, Matrix88Cv::CV58_INPUT));
+ addInput(createInput<Port24>(cv68InputPosition, module, Matrix88Cv::CV68_INPUT));
+ addInput(createInput<Port24>(cv78InputPosition, module, Matrix88Cv::CV78_INPUT));
+ addInput(createInput<Port24>(cv88InputPosition, module, Matrix88Cv::CV88_INPUT));
+ }
+};
+
+Model* modelMatrix88Cv = createModel<Matrix88Cv, Matrix88CvWidget>("Bogaudio-Matrix88Cv", "MX88CV", "CV expander for MATRIX88", "Mixer", "Expander", "Polyphonic");
diff --git a/src/Matrix88Cv.hpp b/src/Matrix88Cv.hpp
@@ -0,0 +1,105 @@
+#pragma once
+
+#include "Matrix88_shared.hpp"
+
+namespace bogaudio {
+
+typedef ChainableExpanderModule<Matrix88ExpanderMessage, Matrix88Element, 1, BGModule> Matrix88CvBase;
+
+struct Matrix88Cv : Matrix88CvBase {
+ enum ParamsIds {
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ CV11_INPUT,
+ CV21_INPUT,
+ CV31_INPUT,
+ CV41_INPUT,
+ CV51_INPUT,
+ CV61_INPUT,
+ CV71_INPUT,
+ CV81_INPUT,
+ CV12_INPUT,
+ CV22_INPUT,
+ CV32_INPUT,
+ CV42_INPUT,
+ CV52_INPUT,
+ CV62_INPUT,
+ CV72_INPUT,
+ CV82_INPUT,
+ CV13_INPUT,
+ CV23_INPUT,
+ CV33_INPUT,
+ CV43_INPUT,
+ CV53_INPUT,
+ CV63_INPUT,
+ CV73_INPUT,
+ CV83_INPUT,
+ CV14_INPUT,
+ CV24_INPUT,
+ CV34_INPUT,
+ CV44_INPUT,
+ CV54_INPUT,
+ CV64_INPUT,
+ CV74_INPUT,
+ CV84_INPUT,
+ CV15_INPUT,
+ CV25_INPUT,
+ CV35_INPUT,
+ CV45_INPUT,
+ CV55_INPUT,
+ CV65_INPUT,
+ CV75_INPUT,
+ CV85_INPUT,
+ CV16_INPUT,
+ CV26_INPUT,
+ CV36_INPUT,
+ CV46_INPUT,
+ CV56_INPUT,
+ CV66_INPUT,
+ CV76_INPUT,
+ CV86_INPUT,
+ CV17_INPUT,
+ CV27_INPUT,
+ CV37_INPUT,
+ CV47_INPUT,
+ CV57_INPUT,
+ CV67_INPUT,
+ CV77_INPUT,
+ CV87_INPUT,
+ CV18_INPUT,
+ CV28_INPUT,
+ CV38_INPUT,
+ CV48_INPUT,
+ CV58_INPUT,
+ CV68_INPUT,
+ CV78_INPUT,
+ CV88_INPUT,
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ NUM_OUTPUTS
+ };
+
+ Input** _cvs = NULL;
+
+ Matrix88Cv() {
+ config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
+ _cvs = new Input*[64];
+ for (int i = 0; i < 64; ++i) {
+ _cvs[i] = &inputs[CV11_INPUT + i];
+ }
+ setLocalElements({new Matrix88Element(NULL, _cvs)});
+ setBaseModelPredicate([](Model* m) { return m == modelMatrix88 || m == modelMatrix88M; });
+ setExpanderModelPredicate([](Model* m) { return m == modelMatrix88M; });
+ }
+ virtual ~Matrix88Cv() {
+ delete[] _cvs;
+ }
+
+ void processAlways(const ProcessArgs& args) override;
+};
+
+} // namespace bogaudio
diff --git a/src/Matrix88M.cpp b/src/Matrix88M.cpp
@@ -0,0 +1,165 @@
+
+#include "Matrix88M.hpp"
+#include "mixer.hpp"
+
+void Matrix88M::processAlways(const ProcessArgs& args) {
+ int position = 0;
+ int baseID = 0;
+ if (baseConnected()) {
+ Matrix88ExpanderMessage* bm = fromBase();
+ baseID = bm->baseID;
+ position = bm->position;
+ }
+ setBaseIDAndPosition(baseID, position);
+
+ if (expanderConnected()) {
+ Matrix88ExpanderMessage* te = toExpander();
+ te->baseID = _baseID;
+ te->position = _position > 0 ? _position + 1 : 0;
+ }
+}
+
+struct Matrix88MWidget : BGModuleWidget {
+ static constexpr int hp = 20;
+
+ Matrix88MWidget(Matrix88M* module) {
+ setModule(module);
+ box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
+ setPanel(box.size, "Matrix88M");
+ createScrews();
+
+ // generated by svg_widgets.rb
+ auto mute11ParamPosition = Vec(18.5, 33.0);
+ auto mute21ParamPosition = Vec(18.5, 70.0);
+ auto mute31ParamPosition = Vec(18.5, 107.0);
+ auto mute41ParamPosition = Vec(18.5, 144.0);
+ auto mute51ParamPosition = Vec(18.5, 181.0);
+ auto mute61ParamPosition = Vec(18.5, 218.0);
+ auto mute71ParamPosition = Vec(18.5, 255.0);
+ auto mute81ParamPosition = Vec(18.5, 292.0);
+ auto mute12ParamPosition = Vec(53.5, 33.0);
+ auto mute22ParamPosition = Vec(53.5, 70.0);
+ auto mute32ParamPosition = Vec(53.5, 107.0);
+ auto mute42ParamPosition = Vec(53.5, 144.0);
+ auto mute52ParamPosition = Vec(53.5, 181.0);
+ auto mute62ParamPosition = Vec(53.5, 218.0);
+ auto mute72ParamPosition = Vec(53.5, 255.0);
+ auto mute82ParamPosition = Vec(53.5, 292.0);
+ auto mute13ParamPosition = Vec(88.5, 33.0);
+ auto mute23ParamPosition = Vec(88.5, 70.0);
+ auto mute33ParamPosition = Vec(88.5, 107.0);
+ auto mute43ParamPosition = Vec(88.5, 144.0);
+ auto mute53ParamPosition = Vec(88.5, 181.0);
+ auto mute63ParamPosition = Vec(88.5, 218.0);
+ auto mute73ParamPosition = Vec(88.5, 255.0);
+ auto mute83ParamPosition = Vec(88.5, 292.0);
+ auto mute14ParamPosition = Vec(123.5, 33.0);
+ auto mute24ParamPosition = Vec(123.5, 70.0);
+ auto mute34ParamPosition = Vec(123.5, 107.0);
+ auto mute44ParamPosition = Vec(123.5, 144.0);
+ auto mute54ParamPosition = Vec(123.5, 181.0);
+ auto mute64ParamPosition = Vec(123.5, 218.0);
+ auto mute74ParamPosition = Vec(123.5, 255.0);
+ auto mute84ParamPosition = Vec(123.5, 292.0);
+ auto mute15ParamPosition = Vec(158.5, 33.0);
+ auto mute25ParamPosition = Vec(158.5, 70.0);
+ auto mute35ParamPosition = Vec(158.5, 107.0);
+ auto mute45ParamPosition = Vec(158.5, 144.0);
+ auto mute55ParamPosition = Vec(158.5, 181.0);
+ auto mute65ParamPosition = Vec(158.5, 218.0);
+ auto mute75ParamPosition = Vec(158.5, 255.0);
+ auto mute85ParamPosition = Vec(158.5, 292.0);
+ auto mute16ParamPosition = Vec(193.5, 33.0);
+ auto mute26ParamPosition = Vec(193.5, 70.0);
+ auto mute36ParamPosition = Vec(193.5, 107.0);
+ auto mute46ParamPosition = Vec(193.5, 144.0);
+ auto mute56ParamPosition = Vec(193.5, 181.0);
+ auto mute66ParamPosition = Vec(193.5, 218.0);
+ auto mute76ParamPosition = Vec(193.5, 255.0);
+ auto mute86ParamPosition = Vec(193.5, 292.0);
+ auto mute17ParamPosition = Vec(228.5, 33.0);
+ auto mute27ParamPosition = Vec(228.5, 70.0);
+ auto mute37ParamPosition = Vec(228.5, 107.0);
+ auto mute47ParamPosition = Vec(228.5, 144.0);
+ auto mute57ParamPosition = Vec(228.5, 181.0);
+ auto mute67ParamPosition = Vec(228.5, 218.0);
+ auto mute77ParamPosition = Vec(228.5, 255.0);
+ auto mute87ParamPosition = Vec(228.5, 292.0);
+ auto mute18ParamPosition = Vec(263.5, 33.0);
+ auto mute28ParamPosition = Vec(263.5, 70.0);
+ auto mute38ParamPosition = Vec(263.5, 107.0);
+ auto mute48ParamPosition = Vec(263.5, 144.0);
+ auto mute58ParamPosition = Vec(263.5, 181.0);
+ auto mute68ParamPosition = Vec(263.5, 218.0);
+ auto mute78ParamPosition = Vec(263.5, 255.0);
+ auto mute88ParamPosition = Vec(263.5, 292.0);
+ // end generated by svg_widgets.rb
+
+ addParam(createParam<SoloMuteButton>(mute11ParamPosition, module, Matrix88M::MUTE11_PARAM));
+ addParam(createParam<SoloMuteButton>(mute21ParamPosition, module, Matrix88M::MUTE21_PARAM));
+ addParam(createParam<SoloMuteButton>(mute31ParamPosition, module, Matrix88M::MUTE31_PARAM));
+ addParam(createParam<SoloMuteButton>(mute41ParamPosition, module, Matrix88M::MUTE41_PARAM));
+ addParam(createParam<SoloMuteButton>(mute51ParamPosition, module, Matrix88M::MUTE51_PARAM));
+ addParam(createParam<SoloMuteButton>(mute61ParamPosition, module, Matrix88M::MUTE61_PARAM));
+ addParam(createParam<SoloMuteButton>(mute71ParamPosition, module, Matrix88M::MUTE71_PARAM));
+ addParam(createParam<SoloMuteButton>(mute81ParamPosition, module, Matrix88M::MUTE81_PARAM));
+ addParam(createParam<SoloMuteButton>(mute12ParamPosition, module, Matrix88M::MUTE12_PARAM));
+ addParam(createParam<SoloMuteButton>(mute22ParamPosition, module, Matrix88M::MUTE22_PARAM));
+ addParam(createParam<SoloMuteButton>(mute32ParamPosition, module, Matrix88M::MUTE32_PARAM));
+ addParam(createParam<SoloMuteButton>(mute42ParamPosition, module, Matrix88M::MUTE42_PARAM));
+ addParam(createParam<SoloMuteButton>(mute52ParamPosition, module, Matrix88M::MUTE52_PARAM));
+ addParam(createParam<SoloMuteButton>(mute62ParamPosition, module, Matrix88M::MUTE62_PARAM));
+ addParam(createParam<SoloMuteButton>(mute72ParamPosition, module, Matrix88M::MUTE72_PARAM));
+ addParam(createParam<SoloMuteButton>(mute82ParamPosition, module, Matrix88M::MUTE82_PARAM));
+ addParam(createParam<SoloMuteButton>(mute13ParamPosition, module, Matrix88M::MUTE13_PARAM));
+ addParam(createParam<SoloMuteButton>(mute23ParamPosition, module, Matrix88M::MUTE23_PARAM));
+ addParam(createParam<SoloMuteButton>(mute33ParamPosition, module, Matrix88M::MUTE33_PARAM));
+ addParam(createParam<SoloMuteButton>(mute43ParamPosition, module, Matrix88M::MUTE43_PARAM));
+ addParam(createParam<SoloMuteButton>(mute53ParamPosition, module, Matrix88M::MUTE53_PARAM));
+ addParam(createParam<SoloMuteButton>(mute63ParamPosition, module, Matrix88M::MUTE63_PARAM));
+ addParam(createParam<SoloMuteButton>(mute73ParamPosition, module, Matrix88M::MUTE73_PARAM));
+ addParam(createParam<SoloMuteButton>(mute83ParamPosition, module, Matrix88M::MUTE83_PARAM));
+ addParam(createParam<SoloMuteButton>(mute14ParamPosition, module, Matrix88M::MUTE14_PARAM));
+ addParam(createParam<SoloMuteButton>(mute24ParamPosition, module, Matrix88M::MUTE24_PARAM));
+ addParam(createParam<SoloMuteButton>(mute34ParamPosition, module, Matrix88M::MUTE34_PARAM));
+ addParam(createParam<SoloMuteButton>(mute44ParamPosition, module, Matrix88M::MUTE44_PARAM));
+ addParam(createParam<SoloMuteButton>(mute54ParamPosition, module, Matrix88M::MUTE54_PARAM));
+ addParam(createParam<SoloMuteButton>(mute64ParamPosition, module, Matrix88M::MUTE64_PARAM));
+ addParam(createParam<SoloMuteButton>(mute74ParamPosition, module, Matrix88M::MUTE74_PARAM));
+ addParam(createParam<SoloMuteButton>(mute84ParamPosition, module, Matrix88M::MUTE84_PARAM));
+ addParam(createParam<SoloMuteButton>(mute15ParamPosition, module, Matrix88M::MUTE15_PARAM));
+ addParam(createParam<SoloMuteButton>(mute25ParamPosition, module, Matrix88M::MUTE25_PARAM));
+ addParam(createParam<SoloMuteButton>(mute35ParamPosition, module, Matrix88M::MUTE35_PARAM));
+ addParam(createParam<SoloMuteButton>(mute45ParamPosition, module, Matrix88M::MUTE45_PARAM));
+ addParam(createParam<SoloMuteButton>(mute55ParamPosition, module, Matrix88M::MUTE55_PARAM));
+ addParam(createParam<SoloMuteButton>(mute65ParamPosition, module, Matrix88M::MUTE65_PARAM));
+ addParam(createParam<SoloMuteButton>(mute75ParamPosition, module, Matrix88M::MUTE75_PARAM));
+ addParam(createParam<SoloMuteButton>(mute85ParamPosition, module, Matrix88M::MUTE85_PARAM));
+ addParam(createParam<SoloMuteButton>(mute16ParamPosition, module, Matrix88M::MUTE16_PARAM));
+ addParam(createParam<SoloMuteButton>(mute26ParamPosition, module, Matrix88M::MUTE26_PARAM));
+ addParam(createParam<SoloMuteButton>(mute36ParamPosition, module, Matrix88M::MUTE36_PARAM));
+ addParam(createParam<SoloMuteButton>(mute46ParamPosition, module, Matrix88M::MUTE46_PARAM));
+ addParam(createParam<SoloMuteButton>(mute56ParamPosition, module, Matrix88M::MUTE56_PARAM));
+ addParam(createParam<SoloMuteButton>(mute66ParamPosition, module, Matrix88M::MUTE66_PARAM));
+ addParam(createParam<SoloMuteButton>(mute76ParamPosition, module, Matrix88M::MUTE76_PARAM));
+ addParam(createParam<SoloMuteButton>(mute86ParamPosition, module, Matrix88M::MUTE86_PARAM));
+ addParam(createParam<SoloMuteButton>(mute17ParamPosition, module, Matrix88M::MUTE17_PARAM));
+ addParam(createParam<SoloMuteButton>(mute27ParamPosition, module, Matrix88M::MUTE27_PARAM));
+ addParam(createParam<SoloMuteButton>(mute37ParamPosition, module, Matrix88M::MUTE37_PARAM));
+ addParam(createParam<SoloMuteButton>(mute47ParamPosition, module, Matrix88M::MUTE47_PARAM));
+ addParam(createParam<SoloMuteButton>(mute57ParamPosition, module, Matrix88M::MUTE57_PARAM));
+ addParam(createParam<SoloMuteButton>(mute67ParamPosition, module, Matrix88M::MUTE67_PARAM));
+ addParam(createParam<SoloMuteButton>(mute77ParamPosition, module, Matrix88M::MUTE77_PARAM));
+ addParam(createParam<SoloMuteButton>(mute87ParamPosition, module, Matrix88M::MUTE87_PARAM));
+ addParam(createParam<SoloMuteButton>(mute18ParamPosition, module, Matrix88M::MUTE18_PARAM));
+ addParam(createParam<SoloMuteButton>(mute28ParamPosition, module, Matrix88M::MUTE28_PARAM));
+ addParam(createParam<SoloMuteButton>(mute38ParamPosition, module, Matrix88M::MUTE38_PARAM));
+ addParam(createParam<SoloMuteButton>(mute48ParamPosition, module, Matrix88M::MUTE48_PARAM));
+ addParam(createParam<SoloMuteButton>(mute58ParamPosition, module, Matrix88M::MUTE58_PARAM));
+ addParam(createParam<SoloMuteButton>(mute68ParamPosition, module, Matrix88M::MUTE68_PARAM));
+ addParam(createParam<SoloMuteButton>(mute78ParamPosition, module, Matrix88M::MUTE78_PARAM));
+ addParam(createParam<SoloMuteButton>(mute88ParamPosition, module, Matrix88M::MUTE88_PARAM));
+ }
+};
+
+Model* modelMatrix88M = createModel<Matrix88M, Matrix88MWidget>("Bogaudio-Matrix88M", "MX88M", "Mutes expander for MATRIX88", "Mixer", "Expander", "Polyphonic");
diff --git a/src/Matrix88M.hpp b/src/Matrix88M.hpp
@@ -0,0 +1,177 @@
+#pragma once
+
+#include "Matrix88_shared.hpp"
+
+namespace bogaudio {
+
+typedef ChainableExpanderModule<Matrix88ExpanderMessage, Matrix88Element, 1, BGModule> Matrix88MBase;
+
+struct Matrix88M : Matrix88MBase {
+ enum ParamsIds {
+ MUTE11_PARAM,
+ MUTE21_PARAM,
+ MUTE31_PARAM,
+ MUTE41_PARAM,
+ MUTE51_PARAM,
+ MUTE61_PARAM,
+ MUTE71_PARAM,
+ MUTE81_PARAM,
+ MUTE12_PARAM,
+ MUTE22_PARAM,
+ MUTE32_PARAM,
+ MUTE42_PARAM,
+ MUTE52_PARAM,
+ MUTE62_PARAM,
+ MUTE72_PARAM,
+ MUTE82_PARAM,
+ MUTE13_PARAM,
+ MUTE23_PARAM,
+ MUTE33_PARAM,
+ MUTE43_PARAM,
+ MUTE53_PARAM,
+ MUTE63_PARAM,
+ MUTE73_PARAM,
+ MUTE83_PARAM,
+ MUTE14_PARAM,
+ MUTE24_PARAM,
+ MUTE34_PARAM,
+ MUTE44_PARAM,
+ MUTE54_PARAM,
+ MUTE64_PARAM,
+ MUTE74_PARAM,
+ MUTE84_PARAM,
+ MUTE15_PARAM,
+ MUTE25_PARAM,
+ MUTE35_PARAM,
+ MUTE45_PARAM,
+ MUTE55_PARAM,
+ MUTE65_PARAM,
+ MUTE75_PARAM,
+ MUTE85_PARAM,
+ MUTE16_PARAM,
+ MUTE26_PARAM,
+ MUTE36_PARAM,
+ MUTE46_PARAM,
+ MUTE56_PARAM,
+ MUTE66_PARAM,
+ MUTE76_PARAM,
+ MUTE86_PARAM,
+ MUTE17_PARAM,
+ MUTE27_PARAM,
+ MUTE37_PARAM,
+ MUTE47_PARAM,
+ MUTE57_PARAM,
+ MUTE67_PARAM,
+ MUTE77_PARAM,
+ MUTE87_PARAM,
+ MUTE18_PARAM,
+ MUTE28_PARAM,
+ MUTE38_PARAM,
+ MUTE48_PARAM,
+ MUTE58_PARAM,
+ MUTE68_PARAM,
+ MUTE78_PARAM,
+ MUTE88_PARAM,
+ NUM_PARAMS
+ };
+
+ enum InputsIds {
+ NUM_INPUTS
+ };
+
+ enum OutputsIds {
+ NUM_OUTPUTS
+ };
+
+ Param** _mutes = NULL;
+
+ Matrix88M() {
+ config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
+ configParam(MUTE11_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1A");
+ configParam(MUTE21_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2A");
+ configParam(MUTE31_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3A");
+ configParam(MUTE41_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4A");
+ configParam(MUTE51_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5A");
+ configParam(MUTE61_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6A");
+ configParam(MUTE71_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7A");
+ configParam(MUTE81_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8A");
+
+ configParam(MUTE12_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1B");
+ configParam(MUTE22_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2B");
+ configParam(MUTE32_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3B");
+ configParam(MUTE42_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4B");
+ configParam(MUTE52_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5B");
+ configParam(MUTE62_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6B");
+ configParam(MUTE72_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7B");
+ configParam(MUTE82_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8B");
+
+ configParam(MUTE13_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1C");
+ configParam(MUTE23_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2C");
+ configParam(MUTE33_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3C");
+ configParam(MUTE43_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4C");
+ configParam(MUTE53_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5C");
+ configParam(MUTE63_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6C");
+ configParam(MUTE73_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7C");
+ configParam(MUTE83_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8C");
+
+ configParam(MUTE14_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1D");
+ configParam(MUTE24_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2D");
+ configParam(MUTE34_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3D");
+ configParam(MUTE44_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4D");
+ configParam(MUTE54_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5D");
+ configParam(MUTE64_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6D");
+ configParam(MUTE74_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7D");
+ configParam(MUTE84_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8D");
+
+ configParam(MUTE15_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1E");
+ configParam(MUTE25_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2E");
+ configParam(MUTE35_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3E");
+ configParam(MUTE45_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4E");
+ configParam(MUTE55_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5E");
+ configParam(MUTE65_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6E");
+ configParam(MUTE75_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7E");
+ configParam(MUTE85_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8E");
+
+ configParam(MUTE16_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1F");
+ configParam(MUTE26_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2F");
+ configParam(MUTE36_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3F");
+ configParam(MUTE46_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4F");
+ configParam(MUTE56_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5F");
+ configParam(MUTE66_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6F");
+ configParam(MUTE76_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7F");
+ configParam(MUTE86_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8F");
+
+ configParam(MUTE17_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1G");
+ configParam(MUTE27_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2G");
+ configParam(MUTE37_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3G");
+ configParam(MUTE47_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4G");
+ configParam(MUTE57_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5G");
+ configParam(MUTE67_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6G");
+ configParam(MUTE77_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7G");
+ configParam(MUTE87_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8G");
+
+ configParam(MUTE18_PARAM, 0.0f, 3.0f, 0.0f, "Mute 1H");
+ configParam(MUTE28_PARAM, 0.0f, 3.0f, 0.0f, "Mute 2H");
+ configParam(MUTE38_PARAM, 0.0f, 3.0f, 0.0f, "Mute 3H");
+ configParam(MUTE48_PARAM, 0.0f, 3.0f, 0.0f, "Mute 4H");
+ configParam(MUTE58_PARAM, 0.0f, 3.0f, 0.0f, "Mute 5H");
+ configParam(MUTE68_PARAM, 0.0f, 3.0f, 0.0f, "Mute 6H");
+ configParam(MUTE78_PARAM, 0.0f, 3.0f, 0.0f, "Mute 7H");
+ configParam(MUTE88_PARAM, 0.0f, 3.0f, 0.0f, "Mute 8H");
+
+ _mutes = new Param*[64];
+ for (int i = 0; i < 64; ++i) {
+ _mutes[i] = ¶ms[MUTE11_PARAM + i];
+ }
+ setLocalElements({new Matrix88Element(_mutes, NULL)});
+ setBaseModelPredicate([](Model* m) { return m == modelMatrix88 || m == modelMatrix88Cv; });
+ setExpanderModelPredicate([](Model* m) { return m == modelMatrix88Cv; });
+ }
+ virtual ~Matrix88M() {
+ delete[] _mutes;
+ }
+
+ void processAlways(const ProcessArgs& args) override;
+};
+
+} // namespace bogaudio
diff --git a/src/Matrix88_shared.hpp b/src/Matrix88_shared.hpp
@@ -0,0 +1,30 @@
+#pragma once
+
+#include "bogaudio.hpp"
+#include "matrix_base.hpp"
+#include "expanders.hpp"
+
+extern Model* modelMatrix88;
+extern Model* modelMatrix88Cv;
+extern Model* modelMatrix88M;
+
+namespace bogaudio {
+
+typedef ChainableExpanderMessage Matrix88ExpanderMessage;
+
+struct Matrix88Element {
+ Param** mutes;
+ Input** cvs;
+
+ Matrix88Element(
+ Param** mutes,
+ Input** cvs
+ )
+ : mutes(mutes)
+ , cvs(cvs)
+ {}
+};
+
+typedef ChainableRegistry<Matrix88Element, 1> Matrix88Registry;
+
+} // namespace bogaudio
diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp
@@ -50,6 +50,8 @@
#include "Matrix44Cvm.hpp"
#include "Matrix81.hpp"
#include "Matrix88.hpp"
+#include "Matrix88Cv.hpp"
+#include "Matrix88M.hpp"
#include "MegaGate.hpp"
#include "Mix1.hpp"
#include "Mix2.hpp"
@@ -191,6 +193,8 @@ void init(rack::Plugin *p) {
p->addModel(modelMatrix44);
p->addModel(modelMatrix44Cvm);
p->addModel(modelMatrix88);
+ p->addModel(modelMatrix88Cv);
+ p->addModel(modelMatrix88M);
p->addModel(modelSwitch81);
p->addModel(modelSwitch18);
p->addModel(modelSwitch44);