{
  "format": "forge.graph/0",
  "name": "Tape Echo",
  "author": "Chirp",
  "license": "CC-BY-4.0",
  "remixed_from": null,
  "description": "Repeats saturate on the way onto tape, wow and flutter wander the pitch, and the feedback path can stay clean, saturate into self-oscillation, go lo-fi or darken. The Delay template's tape line, rebuilt as an effect anyone can open.",
  "tags": ["delay", "tape", "echo"],
  "face": {
    "knobs": [
      { "id": "time", "label": "Time", "default": 0.62,
        "controls": [ { "target": "line.time", "from": 0.02, "to": 2.0, "curve": "exp" } ] },
      { "id": "feedback", "label": "Repeats", "default": 0.45,
        "controls": [ { "target": "fb.amount", "from": 0, "to": 0.97 } ] },
      { "id": "mix", "label": "Mix", "default": 0.4,
        "controls": [ { "target": "mixer.mix", "from": 0, "to": 1 } ] },
      { "id": "tone", "label": "Tone", "default": 0.45,
        "controls": [ { "target": "echo.cutoff", "from": 700, "to": 15839, "curve": "exp" } ] },
      { "id": "wow", "label": "Wow", "default": 0.35,
        "controls": [ { "target": "mods.wow", "from": 0, "to": 0.006, "curve": "square" },
                      { "target": "mods.flutter", "from": 0, "to": 0.00072, "curve": "square" } ] },
      { "id": "saturation", "label": "Drive", "default": 0.5,
        "controls": [ { "target": "tape.drive", "from": 1, "to": 3 },
                      { "target": "tape.level", "from": 1, "to": 1.3 },
                      { "target": "mods.stretch", "from": 0, "to": 0.0015 } ] }
    ],
    "menus": [
      { "id": "path", "label": "Repeats", "options": ["Clean", "Saturate", "Lo-fi", "Dark"], "default": 1,
        "controls": [ { "target": "path.choice" } ] }
    ]
  },
  "nodes": {
    "line": { "block": "delay", "set": { "glide": 250 }, "in": { "x": ["in", "fb"] } },
    "tape": { "block": "saturate", "in": { "x": "line" } },
    "echo": { "block": "onepole", "in": { "x": "tape" } },

    "hot": { "block": "saturate", "set": { "drive": 1.8, "level": 1.1134 }, "in": { "x": "echo" } },
    "crush": { "block": "crush", "set": { "bits": 7, "rate_hz": 12000 }, "in": { "x": "echo" } },
    "lofi": { "block": "onepole", "set": { "cutoff": 3500 }, "in": { "x": "crush" } },
    "dark_hp": { "block": "onepole", "set": { "cutoff": 300 }, "in": { "x": "echo" } },
    "dark": { "block": "onepole", "set": { "cutoff": 2200 }, "in": { "x": "dark_hp:hp" } },
    "path": { "block": "select", "in": { "a": "echo", "b": "hot", "c": "lofi", "d": "dark" } },
    "fb": { "block": "gain", "in": { "x": "path" } },

    "mixer": { "block": "blend", "in": { "dry": "in", "wet": "echo" } },

    "drift": { "block": "random", "mono": true, "set": { "rate": 0.8, "seed": 11 } },
    "flutter": { "block": "lfo", "mono": true, "set": { "rate": 6.5 } },
    "tape_drift": { "block": "random", "mono": true, "set": { "rate": 0.5, "seed": 23 } }
  },
  "mods": {
    "wow": { "from": "drift", "target": "line.time", "amount": 0 },
    "flutter": { "from": "flutter:sine", "target": "line.time", "amount": 0 },
    "stretch": { "from": "tape_drift", "target": "line.time", "amount": 0 }
  },
  "out": "mixer"
}
