{
  "$type": "at.atmosynth.module",
  "descriptionVersion": 1,
  "moduleId": "sync-delay",
  "versionKey": "2",
  "name": "Sync delay",
  "description": "A delay whose repeats fall on the beat. Its two times are counted in beats rather than in seconds, against the one tempo the whole instrument keeps — the same one the arpeggiator and the sequencer count against — so a phrase written at 90 repeats in the same place at 140, and moving the tempo moves the delay with it. There is no tempo knob here, and that is the point: a second tempo would be free to disagree with the first. Left and Right are the two taps, one to each side, and having a time each is what makes this a stereo effect rather than one delay heard twice — a quarter against an eighth is the cross-rhythm every dub delay is built on, and the same value on both is a delay straight up the middle. A beat is a quarter note, so a half is an eighth, a quarter is a sixteenth and a four is a whole bar. Feedback is how much of each repeat goes round again, and Damp is the lowpass it passes through on the way: bring it down and every pass is darker than the one before, which is what a tape echo did without being asked. Dry/Wet is one knob rather than two — at nothing it is only what came in, at everything only the repeats. The tail outlives the note that made it, so give this one instance for the whole patch — after the mixer, or declared shared — or each note takes its own repeats with it when it ends. Feedback is an input as well, with a depth for how far a signal there moves it — both sides at once — and what reaches the loop is held inside the knob's own range, so the repeats can swell but never run away.",
  "audioInputs": [
    {
      "id": "in",
      "label": "In"
    },
    {
      "id": "feedback",
      "label": "Feedback"
    }
  ],
  "audioOutputs": [
    {
      "id": "out",
      "label": "Out"
    }
  ],
  "midiInputs": [],
  "nodes": [
    {
      "id": "in",
      "kind": "moduleInput",
      "options": {
        "input": "in"
      }
    },
    {
      "id": "dry",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "mixsrc",
      "kind": "constantSource",
      "options": {}
    },
    {
      "id": "mixneg",
      "kind": "waveShaper",
      "options": {
        "curve": [
          1,
          -1
        ]
      }
    },
    {
      "id": "beat",
      "kind": "constantSource",
      "options": {
        "signal": "beat"
      }
    },
    {
      "id": "lbeats",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "rbeats",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "dll",
      "kind": "delay",
      "options": {
        "maxDelayTime": 12
      }
    },
    {
      "id": "dlr",
      "kind": "delay",
      "options": {
        "maxDelayTime": 12
      }
    },
    {
      "id": "dampl",
      "kind": "biquadFilter",
      "options": {
        "type": "lowpass"
      }
    },
    {
      "id": "dampr",
      "kind": "biquadFilter",
      "options": {
        "type": "lowpass"
      }
    },
    {
      "id": "fbl",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "fbr",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "sides",
      "kind": "channelMerger",
      "options": {
        "numberOfInputs": 2
      }
    },
    {
      "id": "wet",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "out",
      "kind": "moduleOutput",
      "options": {
        "output": "out"
      }
    },
    {
      "id": "feedbackin",
      "kind": "moduleInput",
      "options": {
        "input": "feedback"
      }
    },
    {
      "id": "feedbackbase",
      "kind": "constantSource",
      "options": {}
    },
    {
      "id": "feedbackdepth",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "feedbackclamp",
      "kind": "waveShaper",
      "options": {
        "curve": [
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          "-0.95",
          "-0.9",
          "-0.85",
          "-0.8",
          "-0.75",
          "-0.7",
          "-0.65",
          "-0.6",
          "-0.55",
          "-0.5",
          "-0.45",
          "-0.4",
          "-0.35",
          "-0.3",
          "-0.25",
          "-0.2",
          "-0.15",
          "-0.1",
          "-0.05",
          "-0.05"
        ]
      }
    }
  ],
  "connections": [
    {
      "from": {
        "node": "in",
        "output": 0
      },
      "to": {
        "node": "dry",
        "input": 0
      }
    },
    {
      "from": {
        "node": "dry",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "mixsrc",
        "output": 0
      },
      "to": {
        "node": "mixneg",
        "input": 0
      }
    },
    {
      "from": {
        "node": "mixneg",
        "output": 0
      },
      "to": {
        "node": "dry",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "beat",
        "output": 0
      },
      "to": {
        "node": "lbeats",
        "input": 0
      }
    },
    {
      "from": {
        "node": "beat",
        "output": 0
      },
      "to": {
        "node": "rbeats",
        "input": 0
      }
    },
    {
      "from": {
        "node": "lbeats",
        "output": 0
      },
      "to": {
        "node": "dll",
        "param": "delayTime"
      }
    },
    {
      "from": {
        "node": "rbeats",
        "output": 0
      },
      "to": {
        "node": "dlr",
        "param": "delayTime"
      }
    },
    {
      "from": {
        "node": "in",
        "output": 0
      },
      "to": {
        "node": "dll",
        "input": 0
      }
    },
    {
      "from": {
        "node": "in",
        "output": 0
      },
      "to": {
        "node": "dlr",
        "input": 0
      }
    },
    {
      "from": {
        "node": "dll",
        "output": 0
      },
      "to": {
        "node": "dampl",
        "input": 0
      }
    },
    {
      "from": {
        "node": "dlr",
        "output": 0
      },
      "to": {
        "node": "dampr",
        "input": 0
      }
    },
    {
      "from": {
        "node": "dampl",
        "output": 0
      },
      "to": {
        "node": "fbl",
        "input": 0
      }
    },
    {
      "from": {
        "node": "fbl",
        "output": 0
      },
      "to": {
        "node": "dll",
        "input": 0
      }
    },
    {
      "from": {
        "node": "dampr",
        "output": 0
      },
      "to": {
        "node": "fbr",
        "input": 0
      }
    },
    {
      "from": {
        "node": "fbr",
        "output": 0
      },
      "to": {
        "node": "dlr",
        "input": 0
      }
    },
    {
      "from": {
        "node": "dampl",
        "output": 0
      },
      "to": {
        "node": "sides",
        "input": 0
      }
    },
    {
      "from": {
        "node": "dampr",
        "output": 0
      },
      "to": {
        "node": "sides",
        "input": 1
      }
    },
    {
      "from": {
        "node": "sides",
        "output": 0
      },
      "to": {
        "node": "wet",
        "input": 0
      }
    },
    {
      "from": {
        "node": "wet",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "feedbackbase",
        "output": 0
      },
      "to": {
        "node": "feedbackclamp",
        "input": 0
      }
    },
    {
      "from": {
        "node": "feedbackdepth",
        "output": 0
      },
      "to": {
        "node": "feedbackclamp",
        "input": 0
      }
    },
    {
      "from": {
        "node": "feedbackin",
        "output": 0
      },
      "to": {
        "node": "feedbackdepth",
        "input": 0
      }
    },
    {
      "from": {
        "node": "feedbackclamp",
        "output": 0
      },
      "to": {
        "node": "fbl",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "feedbackclamp",
        "output": 0
      },
      "to": {
        "node": "fbr",
        "param": "gain"
      }
    }
  ],
  "automation": [],
  "parameters": [
    {
      "id": "left",
      "label": "Left (beats)",
      "range": {
        "min": "0.0625",
        "max": "4"
      },
      "default": "0.5",
      "targets": [
        {
          "node": "lbeats",
          "param": "gain"
        }
      ]
    },
    {
      "id": "right",
      "label": "Right (beats)",
      "range": {
        "min": "0.0625",
        "max": "4"
      },
      "default": "1",
      "targets": [
        {
          "node": "rbeats",
          "param": "gain"
        }
      ]
    },
    {
      "id": "feedback",
      "label": "Feedback",
      "range": {
        "min": "0",
        "max": "0.95"
      },
      "default": "0.4",
      "targets": [
        {
          "node": "feedbackbase",
          "param": "offset"
        }
      ]
    },
    {
      "id": "damp",
      "label": "Damp (Hz, lower is darker)",
      "range": {
        "min": "200",
        "max": "18000"
      },
      "default": "4500",
      "targets": [
        {
          "node": "dampl",
          "param": "frequency"
        },
        {
          "node": "dampr",
          "param": "frequency"
        }
      ]
    },
    {
      "id": "mix",
      "label": "Dry/Wet",
      "range": {
        "min": "0",
        "max": "1"
      },
      "default": "0.35",
      "targets": [
        {
          "node": "mixsrc",
          "param": "offset"
        },
        {
          "node": "wet",
          "param": "gain"
        }
      ]
    },
    {
      "id": "feedbackAmount",
      "label": "Feedback depth",
      "range": {
        "min": "-0.95",
        "max": "0.95"
      },
      "default": "0.3",
      "targets": [
        {
          "node": "feedbackdepth",
          "param": "gain"
        }
      ]
    }
  ],
  "sampleSlots": [],
  "createdAt": "2026-09-21T00:00:00.000Z"
}