{
  "$type": "at.atmosynth.module",
  "descriptionVersion": 1,
  "moduleId": "glide",
  "versionKey": "1",
  "name": "Gliding oscillator",
  "description": "An oscillator that does not arrive at a note so much as travel to it. The note played is a steady value, and this one follows it rather than taking it: Glide is how quickly it catches up, high for almost at once and low for a long slur between notes. Give it one instance for the whole patch — declare it shared — or every note starts its own journey from nowhere and there is nothing to glide from. Shared, it is one voice at a time, which is what portamento is on the instruments it comes from. Tune is the oscillator's own pitch, which the note is added to rather than replacing — at nothing it plays the note, and away from nothing it sits that many hertz above or below it. Glide shape at a half settles on the note without passing it; higher leans in and overshoots, which is a sound of its own.",
  "audioInputs": [
    {
      "id": "detune",
      "label": "Detune"
    }
  ],
  "audioOutputs": [
    {
      "id": "out",
      "label": "Out"
    }
  ],
  "midiInputs": [
    {
      "id": "midi",
      "label": "Note"
    }
  ],
  "nodes": [
    {
      "id": "note",
      "kind": "midiInput",
      "options": {
        "midiInput": "midi"
      }
    },
    {
      "id": "slew",
      "kind": "biquadFilter",
      "options": {
        "type": "lowpass"
      }
    },
    {
      "id": "osc",
      "kind": "oscillator",
      "options": {
        "type": "sawtooth"
      }
    },
    {
      "id": "detunein",
      "kind": "moduleInput",
      "options": {
        "input": "detune"
      }
    },
    {
      "id": "detunedepth",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "out",
      "kind": "moduleOutput",
      "options": {
        "output": "out"
      }
    }
  ],
  "connections": [
    {
      "from": {
        "node": "note",
        "output": 0
      },
      "to": {
        "node": "slew",
        "input": 0
      }
    },
    {
      "from": {
        "node": "slew",
        "output": 0
      },
      "to": {
        "node": "osc",
        "param": "frequency"
      }
    },
    {
      "from": {
        "node": "osc",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "detunein",
        "output": 0
      },
      "to": {
        "node": "detunedepth",
        "input": 0
      }
    },
    {
      "from": {
        "node": "detunedepth",
        "output": 0
      },
      "to": {
        "node": "osc",
        "param": "detune"
      }
    }
  ],
  "automation": [],
  "parameters": [
    {
      "id": "glide",
      "label": "Glide (higher is faster)",
      "range": {
        "min": "0.5",
        "max": "200"
      },
      "default": "6",
      "targets": [
        {
          "node": "slew",
          "param": "frequency"
        }
      ]
    },
    {
      "id": "glideShape",
      "label": "Glide shape",
      "range": {
        "min": "0.3",
        "max": "2"
      },
      "default": "0.5",
      "targets": [
        {
          "node": "slew",
          "param": "Q"
        }
      ]
    },
    {
      "id": "tune",
      "label": "Tune (Hz)",
      "range": {
        "min": "-50",
        "max": "50"
      },
      "default": "0",
      "targets": [
        {
          "node": "osc",
          "param": "frequency"
        }
      ]
    },
    {
      "id": "shape",
      "label": "Shape",
      "values": [
        "sawtooth",
        "square",
        "triangle",
        "sine"
      ],
      "default": "sawtooth",
      "targets": [
        {
          "node": "osc",
          "option": "type"
        }
      ]
    },
    {
      "id": "detune",
      "label": "Detune (cents)",
      "range": {
        "min": "-1200",
        "max": "1200"
      },
      "default": "0",
      "targets": [
        {
          "node": "osc",
          "param": "detune"
        }
      ]
    },
    {
      "id": "detuneAmount",
      "label": "Detune amount (cents)",
      "range": {
        "min": "0",
        "max": "1200"
      },
      "default": "50",
      "targets": [
        {
          "node": "detunedepth",
          "param": "gain"
        }
      ]
    }
  ],
  "sampleSlots": [],
  "createdAt": "2026-08-29T00:00:00.000Z"
}