{
  "$type": "at.atmosynth.module",
  "descriptionVersion": 1,
  "moduleId": "waveshaper",
  "versionKey": "2",
  "name": "Waveshaper",
  "description": "Bends the shape of the sound, adding harmonics that were not there. Drive decides how hard it is pushed; the curve decides its character. Drive is an input too, with a depth for how far a signal there moves it.",
  "audioInputs": [
    {
      "id": "in",
      "label": "In"
    },
    {
      "id": "drive",
      "label": "Drive"
    }
  ],
  "audioOutputs": [
    {
      "id": "out",
      "label": "Out"
    }
  ],
  "midiInputs": [],
  "nodes": [
    {
      "id": "in",
      "kind": "moduleInput",
      "options": {
        "input": "in"
      }
    },
    {
      "id": "drive",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "shaper",
      "kind": "waveShaper",
      "options": {
        "curve": "soft",
        "oversample": "2x"
      }
    },
    {
      "id": "trim",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "out",
      "kind": "moduleOutput",
      "options": {
        "output": "out"
      }
    },
    {
      "id": "drivein",
      "kind": "moduleInput",
      "options": {
        "input": "drive"
      }
    },
    {
      "id": "drivedepth",
      "kind": "gain",
      "options": {}
    }
  ],
  "connections": [
    {
      "from": {
        "node": "in",
        "output": 0
      },
      "to": {
        "node": "drive",
        "input": 0
      }
    },
    {
      "from": {
        "node": "drive",
        "output": 0
      },
      "to": {
        "node": "shaper",
        "input": 0
      }
    },
    {
      "from": {
        "node": "shaper",
        "output": 0
      },
      "to": {
        "node": "trim",
        "input": 0
      }
    },
    {
      "from": {
        "node": "trim",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "drivein",
        "output": 0
      },
      "to": {
        "node": "drivedepth",
        "input": 0
      }
    },
    {
      "from": {
        "node": "drivedepth",
        "output": 0
      },
      "to": {
        "node": "drive",
        "param": "gain"
      }
    }
  ],
  "automation": [],
  "parameters": [
    {
      "id": "curve",
      "label": "Curve",
      "values": [
        "linear",
        "soft",
        "hard",
        "fold",
        "fuzz"
      ],
      "default": "soft",
      "targets": [
        {
          "node": "shaper",
          "option": "curve"
        }
      ]
    },
    {
      "id": "drive",
      "label": "Drive",
      "range": {
        "min": "0.1",
        "max": "20"
      },
      "default": "3",
      "targets": [
        {
          "node": "drive",
          "param": "gain"
        }
      ]
    },
    {
      "id": "trim",
      "label": "Output trim",
      "range": {
        "min": "0",
        "max": "2"
      },
      "default": "0.7",
      "targets": [
        {
          "node": "trim",
          "param": "gain"
        }
      ]
    },
    {
      "id": "driveAmount",
      "label": "Drive depth",
      "range": {
        "min": "-20",
        "max": "20"
      },
      "default": "5",
      "targets": [
        {
          "node": "drivedepth",
          "param": "gain"
        }
      ]
    }
  ],
  "sampleSlots": [],
  "createdAt": "2026-09-21T00:00:00.000Z"
}