{
  "format": "forge.graph/0",
  "name": "Freeze",
  "author": "Chirp",
  "license": "CC-BY-4.0",
  "remixed_from": null,
  "description": "A reverb that can hold a chord forever. With Freeze off it is a lush, slowly moving room; switch Freeze on and the reverb stops taking in new sound and keeps what it has, a pad you can play over. Switch it off and the pad fades away.",
  "tags": ["reverb", "freeze", "ambient", "pad", "stereo"],
  "face": {
    "display": { "kind": "lamp", "label": "Frozen", "source": "hold_ease", "range": [0, 1] },
    "knobs": [
      { "id": "decay", "label": "Decay", "default": 0.55,
        "controls": [ { "target": "decay.v", "from": 0.4, "to": 0.9 } ] },
      { "id": "tone", "label": "Tone", "default": 0.5,
        "controls": [ { "target": "t1_damp.cutoff", "from": 2000, "to": 12000, "curve": "exp" },
                      { "target": "t2_damp.cutoff", "from": 2000, "to": 12000, "curve": "exp" } ] },
      { "id": "drift", "label": "Drift", "default": 0.4,
        "controls": [ { "target": "mods.drift1", "from": 0, "to": 0.0015 }, { "target": "mods.drift2", "from": 0, "to": 0.0015 } ] },
      { "id": "mix", "label": "Mix", "default": 0.45,
        "controls": [ { "target": "mixer.mix", "from": 0, "to": 1 } ] }
    ],
    "menus": [
      { "id": "freeze", "label": "Freeze", "options": ["Off", "On"], "default": 0,
        "controls": [ { "target": "hold.v", "values": [0, 1] } ] }
    ]
  },
  "nodes": {
    "hold": { "block": "value", "mono": true },
    "hold_ease": { "block": "formula", "mono": true, "set": { "expr": "b + (a - b) * 0.0004" }, "in": { "a": "hold", "b": "hold_mem" } },
    "hold_mem": { "block": "history", "mono": true, "in": { "x": "hold_ease" } },
    "decay": { "block": "value", "mono": true },
    "keep": { "block": "formula", "mono": true, "set": { "expr": "mix(a, 0.9995, b)" }, "in": { "a": "decay", "b": "hold_ease" } },
    "feed": { "block": "formula", "set": { "expr": "a * (1 - b)" }, "in": { "a": "in", "b": "hold_ease" } },
    "d1": { "block": "allpass", "set": { "time": 0.0053, "g": 0.75 }, "in": { "x": "feed" } },
    "d2": { "block": "allpass", "set": { "time": 0.0041, "g": 0.75 }, "in": { "x": "d1" } },
    "d3": { "block": "allpass", "set": { "time": 0.0139, "g": 0.65 }, "in": { "x": "d2" } },
    "d4": { "block": "allpass", "set": { "time": 0.0101, "g": 0.65 }, "in": { "x": "d3" } },
    "wander": { "block": "lfo", "set": { "rate": 0.35, "stereo_phase": 0.5 } },
    "t1_ap": { "block": "allpass", "set": { "time": 0.031, "g": -0.7 }, "in": { "x": ["d4", "t2_fb"] } },
    "t1": { "block": "delay", "set": { "time": 0.173, "max": 0.19, "glide": 1 }, "in": { "x": "t1_ap" } },
    "t1_damp": { "block": "onepole", "in": { "x": "t1" } },
    "t1_fb": { "block": "formula", "set": { "expr": "a * b" }, "in": { "a": "t1_damp", "b": "keep" } },
    "t2_ap": { "block": "allpass", "set": { "time": 0.043, "g": -0.7 }, "in": { "x": "t1_fb" } },
    "t2": { "block": "delay", "set": { "time": 0.141, "max": 0.16, "glide": 1 }, "in": { "x": "t2_ap" } },
    "t2_damp": { "block": "onepole", "in": { "x": "t2" } },
    "t2_fb": { "block": "formula", "set": { "expr": "a * b" }, "in": { "a": "t2_damp", "b": "keep" } },
    "wet": { "block": "gain", "set": { "amount": 0.75 }, "in": { "x": ["t1_damp", "t2_damp"] } },
    "mixer": { "block": "blend", "in": { "dry": "in", "wet": "wet" } }
  },
  "mods": {
    "drift1": { "from": "wander:sine", "target": "t1_ap.time", "amount": 0 },
    "drift2": { "from": "wander:tri", "target": "t2_ap.time", "amount": 0 }
  },
  "out": "mixer"
}
