{
  "$type": "at.atmosynth.module",
  "descriptionVersion": 1,
  "moduleId": "filter-multi",
  "versionKey": "1",
  "name": "Filter",
  "description": "Removes part of the sound: low-pass keeps what is below the cutoff, high-pass what is above, band-pass what is around it. Slope is how sharply — at nothing one stage, twelve decibels an octave, and at one a second stage behind it doubles that, which is the steeper slope the Oberheims and Junos are known for. Resonance lifts whatever is sitting at the cutoff, and for low-pass and high-pass the number is decibels rather than a bare ratio: at thirty, what sits on the cutoff leaves thirty decibels above what sits below it, which is loud enough to drive whatever comes next. It reaches the first stage and only the first. Two stages both carrying it would add in decibels rather than share the number, so the steeper slope would be a peak twice as tall instead of a skirt twice as steep — and a note with a harmonic landing on the cutoff would arrive a thousandfold, which is a different sound played in one octave and not in the next. Level is what leaves, for taking back what resonance adds or making up what the cutoff took away. The cutoff is an input as well as a knob — an envelope patched into Cutoff opens the filter as a note starts, an LFO sweeps it — and Cutoff amount is how far, in cents, so the sweep is even to the ear wherever the cutoff sits. Below nothing that amount runs the other way: the same envelope closes the filter as the note starts instead, which is the polarity switch those instruments put beside theirs. Key tracking moves the cutoff with the note played, at one rising with the pitch, so a phrase keeps its brightness as it climbs rather than going dull at the top — it needs the note routed here as well as to the oscillator. Shelf gain is for the three shapes that lift or cut a region rather than remove it, low-shelf, high-shelf and peaking, and does nothing to the others; at the steeper slope it applies to both stages, as the shape and the cutoff do.",
  "audioInputs": [
    {
      "id": "in",
      "label": "In"
    },
    {
      "id": "cutoff",
      "label": "Cutoff"
    }
  ],
  "audioOutputs": [
    {
      "id": "out",
      "label": "Out"
    }
  ],
  "midiInputs": [
    {
      "id": "midi",
      "label": "Note"
    }
  ],
  "nodes": [
    {
      "id": "in",
      "kind": "moduleInput",
      "options": {
        "input": "in"
      }
    },
    {
      "id": "filter",
      "kind": "biquadFilter",
      "options": {
        "type": "lowpass"
      }
    },
    {
      "id": "filter2",
      "kind": "biquadFilter",
      "options": {
        "type": "lowpass"
      }
    },
    {
      "id": "one",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "two",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "level",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "slopesrc",
      "kind": "constantSource",
      "options": {}
    },
    {
      "id": "slopegain",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "slopeinvert",
      "kind": "waveShaper",
      "options": {
        "curve": [
          1,
          -1
        ]
      }
    },
    {
      "id": "cutoffin",
      "kind": "moduleInput",
      "options": {
        "input": "cutoff"
      }
    },
    {
      "id": "cutoffdepth",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "note",
      "kind": "midiInput",
      "options": {
        "midiInput": "midi"
      }
    },
    {
      "id": "trackdepth",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "out",
      "kind": "moduleOutput",
      "options": {
        "output": "out"
      }
    }
  ],
  "connections": [
    {
      "from": {
        "node": "in",
        "output": 0
      },
      "to": {
        "node": "filter",
        "input": 0
      }
    },
    {
      "from": {
        "node": "filter",
        "output": 0
      },
      "to": {
        "node": "one",
        "input": 0
      }
    },
    {
      "from": {
        "node": "filter",
        "output": 0
      },
      "to": {
        "node": "filter2",
        "input": 0
      }
    },
    {
      "from": {
        "node": "filter2",
        "output": 0
      },
      "to": {
        "node": "two",
        "input": 0
      }
    },
    {
      "from": {
        "node": "one",
        "output": 0
      },
      "to": {
        "node": "level",
        "input": 0
      }
    },
    {
      "from": {
        "node": "two",
        "output": 0
      },
      "to": {
        "node": "level",
        "input": 0
      }
    },
    {
      "from": {
        "node": "level",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "slopesrc",
        "output": 0
      },
      "to": {
        "node": "slopegain",
        "input": 0
      }
    },
    {
      "from": {
        "node": "slopegain",
        "output": 0
      },
      "to": {
        "node": "slopeinvert",
        "input": 0
      }
    },
    {
      "from": {
        "node": "slopeinvert",
        "output": 0
      },
      "to": {
        "node": "one",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "cutoffin",
        "output": 0
      },
      "to": {
        "node": "cutoffdepth",
        "input": 0
      }
    },
    {
      "from": {
        "node": "cutoffdepth",
        "output": 0
      },
      "to": {
        "node": "filter",
        "param": "detune"
      }
    },
    {
      "from": {
        "node": "cutoffdepth",
        "output": 0
      },
      "to": {
        "node": "filter2",
        "param": "detune"
      }
    },
    {
      "from": {
        "node": "note",
        "output": 0
      },
      "to": {
        "node": "trackdepth",
        "input": 0
      }
    },
    {
      "from": {
        "node": "trackdepth",
        "output": 0
      },
      "to": {
        "node": "filter",
        "param": "frequency"
      }
    },
    {
      "from": {
        "node": "trackdepth",
        "output": 0
      },
      "to": {
        "node": "filter2",
        "param": "frequency"
      }
    }
  ],
  "automation": [],
  "parameters": [
    {
      "id": "type",
      "label": "Shape",
      "values": [
        "lowpass",
        "highpass",
        "bandpass",
        "notch",
        "peaking",
        "lowshelf",
        "highshelf",
        "allpass"
      ],
      "default": "lowpass",
      "targets": [
        {
          "node": "filter",
          "option": "type"
        },
        {
          "node": "filter2",
          "option": "type"
        }
      ]
    },
    {
      "id": "cutoff",
      "label": "Cutoff (Hz)",
      "range": {
        "min": "20",
        "max": "20000"
      },
      "default": "2000",
      "targets": [
        {
          "node": "filter",
          "param": "frequency"
        },
        {
          "node": "filter2",
          "param": "frequency"
        }
      ]
    },
    {
      "id": "resonance",
      "label": "Resonance (decibels, for lowpass and highpass)",
      "range": {
        "min": "0.0001",
        "max": "30"
      },
      "default": "1",
      "targets": [
        {
          "node": "filter",
          "param": "Q"
        }
      ]
    },
    {
      "id": "slope",
      "label": "Slope (12 to 24 dB per octave)",
      "range": {
        "min": "0",
        "max": "1"
      },
      "default": "0",
      "targets": [
        {
          "node": "two",
          "param": "gain"
        },
        {
          "node": "slopegain",
          "param": "gain"
        }
      ]
    },
    {
      "id": "cutoffAmount",
      "label": "Cutoff amount (cents, below nothing to invert)",
      "range": {
        "min": "-4800",
        "max": "4800"
      },
      "default": "2400",
      "targets": [
        {
          "node": "cutoffdepth",
          "param": "gain"
        }
      ]
    },
    {
      "id": "keyTrack",
      "label": "Key tracking",
      "range": {
        "min": "0",
        "max": "2"
      },
      "default": "0",
      "targets": [
        {
          "node": "trackdepth",
          "param": "gain"
        }
      ]
    },
    {
      "id": "gain",
      "label": "Shelf gain (dB)",
      "range": {
        "min": "-40",
        "max": "40"
      },
      "default": "0",
      "targets": [
        {
          "node": "filter",
          "param": "gain"
        },
        {
          "node": "filter2",
          "param": "gain"
        }
      ]
    },
    {
      "id": "level",
      "label": "Level",
      "range": {
        "min": "0",
        "max": "2"
      },
      "default": "1",
      "targets": [
        {
          "node": "level",
          "param": "gain"
        }
      ]
    }
  ],
  "sampleSlots": [],
  "createdAt": "2026-08-28T00:00:00.000Z"
}