Commit b2414199 authored by David Huss's avatar David Huss 💬
Browse files

Adding working summing normalization.

parent 4b64ba5d
......@@ -4,6 +4,10 @@ A set of modular PCBs that can be used to create a custom configuration for a Ma
<img src="images/final.jpg" height="auto" width="800px">
## What is a matrix mixer?
If you have for example a 4x4 Matrix Mixer, you have 16 knobs with each controlling a how much of a given input signal (`1-4`) will be mixed into a given output (`A-D`):
<img src="images/4x4-matrix.png" height="auto" width="600px">
......@@ -15,56 +19,57 @@ For example by turning up the knob at the intersection between Input `2` and Out
This makes Matrix mixers extremely flexible and allows for many possible combinations and use cases.
# Modules
# MAMI-Tiles
The 4x4 matrix above consists of:
- 2x MAMI-INPUT Module
- 2x MAMI-OUTPUT Module
- 4x MAMI-QUAD Module
The 4x4 matrix in the diagrams above consists of:
- 2x MAMI-INPUT Tiles
- 2x MAMI-OUTPUT Tiles
- 4x MAMI-QUAD Tiles
The modules are designed in a way they can be connected via wires or jumpers to each other, so multiple configurations are possible (e.g. 2x2, 2x4, 4x2, 8x8, 10x6 etc.).
The tiles are designed in a way they can be connected via wires or jumpers to each other, so multiple configurations are possible (e.g. 2x2, 2x4, 4x2, 8x8, 10x6 etc.).
Here an example 8x8 setup consisting of 4 Input modules, 4 Output modules and 16 Tiles:
Here an example 8x8 setup consisting of 4 Input tiles, 4 Output tiles and 16 Tiles:
![Example 8x8 setup consisting of 4 Input modules, 4 Output modules and 16 Tiles](images/8x8_pcbs.png)
## Input Module [MAMI-INPUT]
## Input Tile [MAMI-INPUT]
The Input Module has two 3.5mm Mono Input Jacks and two (On)-Off-On Switches that allows muting individual inputs (or momentarily/permanently switching them on).
The Input Tile has two 3.5mm Mono Input Jacks and two (On)-Off-On Switches that allows muting individual inputs (or momentarily/permanently switching them on). If you want to use another connector (e.g. 6.3mm TS) instead just connect the signals directly to the MAMI-QUAD tiles instead.
| Top | Bottom | 3D | Dimensions |
| ---- | ------ | --- | ------ |
| <img src="gerbers/MAMI-INPUT_Combined_Top.png" width="200px"> | <img src="gerbers/MAMI-INPUT_Combined_Bottom.png" width="200px"> | <img src="images/3d-input.png" width="200px"> | <img src="images/board_input.png" height="200px"> |
## 2x2 Tile Module [MAMI-QUAD]
## 2x2 Quad Tile [MAMI-QUAD]
Mixes two inputs onto two outputs using 4 Potentiometers.
Mixes two inputs onto two outputs using 4 Potentiometers. The only other parts required are one 0805 resistor for each potentiometer.
| Top | Bottom | 3D | Dimensions |
| ---- | ----- | --- | ------ |
| <img src="gerbers/MAMI-QUAD_Combined_Top.png" width="200px"> | <img src="gerbers/MAMI-QUAD_Combined_Bottom.png" width="200px"> | <img src="images/3d-quad.png" width="200px"> | <img src="images/board_quad.png" height="200px"> |
## Output Module [MAMI-OUTPUT]
## Output Tile [MAMI-OUTPUT]
Provides two 3.5mm Mono output jacks, with a Jumper (or switch) each row of tiles can be switched between unipolar and bipolar attenuation.
Provides two 3.5mm Mono output jacks, with a Jumper (or switch) each row of tiles can be switched between unipolar and bipolar attenuation. Each output is added to the next channel's output if no jack is plugged in (since rev 1.2). If you don't need normalization don't populate the parts `U3`, `R9`, `R10`, `R11`, `R12`, `R13`, `R14`, `C5` and `C6`
| Top | Bottom | 3D | Dimensions |
| ---- | ------ | --- | ---- |
| <img src="gerbers/MAMI-OUTPUT_Combined_Top.png" height="200px"> | <img src="gerbers/MAMI-OUTPUT_Combined_Bottom.png" height="200px"> | <img src="images/3d-output.png" height="200px"> | <img src="images/board_out.png" height="200px"> |
The summing section looks like this and allows a jumper (`J_ATT1` and `J_ATT2`) or a switch (2.54mm lead spacing) to be used to switch between unipolar and bipolar attenuation for each row seperately.
The summing section looks like this and allows a jumper (`J_ATT1` and `J_ATT2`) or a switch (2.54mm lead spacing) to be used to switch between unipolar and bipolar attenuation for each row separately.
<img src="images/schematic_summing.png" height="auto" width="600px">
## Envelope Follower Module [MAMI-ENV]
## Envelope Follower Tile[MAMI-ENV]
A dual Envelope follower that can be hooked up to a `MAMI-OUTPUT`-Module. Has two output jacks in the same 25mm spacing as the output module and two LEDs that correspond to the output levels.
A dual Envelope follower that can be hooked up to a `MAMI-OUTPUT`-Tile. Has two output jacks in the same 25mm spacing as the output module and two LEDs that correspond to the output levels.
| Top | Bottom | 3D | Dimensions |
| ---- | ------ | --- | --- |
| <img src="gerbers/MAMI-ENV_Combined_Top.png" height="200px"> | <img src="gerbers/MAMI-ENV_Combined_Bottom.png" height="200px"> | <img src="images/3d-env.png" height="200px"> | <img src="images/board_env.png" height="200px"> |
### Erata Output Module rev. 1.0 (has been fixed in 1.1)
# Erata
### Output Module rev. 1.0 (has been fixed in 1.1)
- Silkscreen for Vee and Vcc is swapped!
- `R4` and `R8` should have a value of 100 Ω not 100 kΩ (or bridge it with solder)
......
%% Cell type:code id: tags:
``` python
# Change these values to calculate the needed values
requirements = {"inputs": 8, "outputs":8}
INPUTS = 8
OUTPUTS = 8
# Should output normalization be used? (Needs more opamps, ...)
NORMALIZATION = True
# Do you want to build an envelope as well?
ENVELOPES = False
# Do not edit below this Point unless you know what you are doing
requirements = {"inputs": INPUTS, "outputs": OUTPUTS}
data = {
"mami-input": {
"input-channels": 2,
"parts": [
{"MPN": "PJ301M-12", "n": 2},
{"MPN": "Subminiature On-Off-(On) Toggle switch", "n": 2},
]
},
"mami-output": {
"output-channels": 2,
"parts": [
{"MPN": "LME49720", "n": 2},
{"MPN": "100nF 0603 25V", "n": 4},
{"MPN": "100k 0805", "n": 6},
{"MPN": "100R 0805", "n": 2},
{"MPN": "PJ301M-12", "n": 2}
]
},
"mami-quad": {
"input-channels":2, "output-channels":2,
"parts": [
{"MPN": "P0915N-FC15BR100K", "n": 4},
{"MPN": "Knob", "n": 4},
{"MPN": "100k 0805", "n": 4}
]
},
"mami-env": {
"output-channels":2,
"parts": [
{"MPN": "100nF 0603 25V", "n": 4},
{"MPN": "PJ301M-12", "n": 2},
{"MPN": "TL074CD", "n": 2},
{"MPN": "100k 0805", "n": 8},
{"MPN": "200k 0805", "n": 6},
{"MPN": "20k 0805", "n": 2},
{"MPN": "1k 0805", "n": 2},
{"MPN": "470R 0805", "n": 2},
{"MPN": "1M 0805", "n": 2},
{"MPN": "1nF 0603", "n": 2},
{"MPN": "1uF 5mm lead spacing (e.g. MKS2C041001F00J)", "n": 2},
{"MPN": "LED 3mm", "n": 2},
{"MPN": "BAV199", "n": 4}
]
}
}
# If normalization is desired use this list of parts instead
if NORMALIZATION:
data["mami-output"] = {
"output-channels": 2,
"parts": [
{"MPN": "LME49720", "n": 3},
{"MPN": "100nF 0603 25V", "n": 6},
{"MPN": "100k 0805", "n": 12},
{"MPN": "100R 0805", "n": 2},
{"MPN": "PJ301M-12", "n": 2}
]
}
# Calculate how many PCBs are needed
n_input_modules = int(requirements["inputs"] / data["mami-input"]["input-channels"])
n_output_modules = int(requirements["outputs"] / data["mami-output"]["output-channels"])
n_env_modules = n_output_modules
n_quad_modules = int((requirements["inputs"] * requirements["outputs"]) / (data["mami-output"]["output-channels"] * data["mami-input"]["input-channels"]))
envelopes = False
# Print the PCB
print("Needed for a {}x{} Matrix Mixer without envelopes".format(requirements["inputs"], requirements["outputs"]))
print("{}".format("="*50))
print("{0:>5}x MAMI-INPUT-Module".format(n_input_modules))
print("{0:>5}x MAMI-OUTPUT-Module".format(n_output_modules))
print("{0:>5}x MAMI-QUAD-Module".format(n_quad_modules))
if envelopes:
if ENVELOPES:
print("{0:>5}x MAMI-ENV-Module".format(n_env_modules))
print()
# Collect all the parts
bom = {}
def get_parts(data, n_input_modules, n_quad_modules, n_output_modules, n_env_modules):
parts = []
for part in data["mami-input"]["parts"]*n_input_modules:
parts.append(part)
for part in data["mami-quad"]["parts"]*n_quad_modules:
parts.append(part)
for part in data["mami-output"]["parts"]*n_output_modules:
parts.append(part)
if envelopes:
if ENVELOPES:
for part in data["mami-env"]["parts"]*n_env_modules:
parts.append(part)
return parts
for part in get_parts(data, n_input_modules, n_quad_modules, n_output_modules, n_env_modules):
if part["MPN"] in bom:
bom[part["MPN"]] += part["n"]
else:
bom[part["MPN"]] = part["n"]
# Print the BOM
print("Parts\n{}".format("="*50))
for key, value in bom.items():
print("{:>5}x {}".format(value, key))
# Print second variant
print()
print("="*80)
print()
envelopes = True
# Print the PCB
print("Needed for a {}x{} Matrix Mixer with envelopes".format(requirements["inputs"], requirements["outputs"]))
print("{}".format("="*50))
print("{0:>5}x MAMI-INPUT-Module".format(n_input_modules))
print("{0:>5}x MAMI-OUTPUT-Module".format(n_output_modules))
print("{0:>5}x MAMI-QUAD-Module".format(n_quad_modules))
if envelopes:
print("{0:>5}x MAMI-ENV-Module".format(n_env_modules))
print()
# Collect all the parts
bom = {}
def get_parts(data, n_input_modules, n_quad_modules, n_output_modules, n_env_modules):
parts = []
for part in data["mami-input"]["parts"]*n_input_modules:
parts.append(part)
for part in data["mami-quad"]["parts"]*n_quad_modules:
parts.append(part)
for part in data["mami-output"]["parts"]*n_output_modules:
parts.append(part)
if envelopes:
for part in data["mami-env"]["parts"]*n_env_modules:
parts.append(part)
return parts
for part in get_parts(data, n_input_modules, n_quad_modules, n_output_modules, n_env_modules):
if part["MPN"] in bom:
bom[part["MPN"]] += part["n"]
else:
bom[part["MPN"]] = part["n"]
# Print the BOM
print("Parts\n{}".format("="*50))
for key, value in bom.items():
print("{:>5}x {}".format(value, key))
```
%% Output
Needed for a 8x8 Matrix Mixer with envelopes
==================================================
4x MAMI-INPUT-Module
4x MAMI-OUTPUT-Module
16x MAMI-QUAD-Module
4x MAMI-ENV-Module
Parts
==================================================
24x PJ301M-12
8x Subminiature On-Off-(On) Toggle switch
64x P0915N-FC15BR100K
64x Knob
120x 100k 0805
8x LME49720
32x 100nF 0603 25V
8x 100R 0805
8x TL074CD
24x 200k 0805
8x 20k 0805
8x 1k 0805
8x 470R 0805
8x 1M 0805
8x 1nF 0603
8x 1uF 5mm lead spacing (e.g. MKS2C041001F00J)
8x LED 3mm
16x BAV199
================================================================================
Needed for a 8x8 Matrix Mixer without envelopes
==================================================
4x MAMI-INPUT-Module
4x MAMI-OUTPUT-Module
16x MAMI-QUAD-Module
Parts
==================================================
16x PJ301M-12
8x Subminiature On-Off-(On) Toggle switch
64x P0915N-FC15BR100K
64x Knob
88x 100k 0805
8x LME49720
16x 100nF 0603 25V
8x 100R 0805
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
```
......
This diff is collapsed.
......@@ -89,7 +89,7 @@
},
"40": {
"display_mode": "outline",
"visible": false
"visible": true
},
"50": {
"display_mode": "outline",
......@@ -97,12 +97,15 @@
},
"60": {
"display_mode": "outline",
"visible": false
"visible": true
}
}
},
"nets": {
"airwires_visible": null,
"net_colors": null
},
"parts": {
"parts_placed": null
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
images/3d-output.png

120 KB | W: | H:

images/3d-output.png

226 KB | W: | H:

images/3d-output.png
images/3d-output.png
images/3d-output.png
images/3d-output.png
  • 2-up
  • Swipe
  • Onion skin
images/board_out.png

103 KB | W: | H:

images/board_out.png

115 KB | W: | H:

images/board_out.png
images/board_out.png
images/board_out.png
images/board_out.png
  • 2-up
  • Swipe
  • Onion skin
images/schematic_summing.png

151 KB | W: | H:

images/schematic_summing.png

98.8 KB | W: | H:

images/schematic_summing.png
images/schematic_summing.png
images/schematic_summing.png
images/schematic_summing.png
  • 2-up
  • Swipe
  • Onion skin
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment