{
  "$type": "at.atmosynth.module",
  "descriptionVersion": 1,
  "moduleId": "osc-wavetable",
  "versionKey": "3",
  "name": "Wavetable oscillator",
  "description": "Five waves side by side and a knob that travels through them. At nothing it is a sine; at everything it is a buzz with every harmonic in it; and anywhere between it is the two waves it stands between, mixed sample for sample rather than one replacing the other — which is the whole of what a wavetable oscillator is, and why moving Position is a sound changing shape rather than a sound being swapped. The five are a sweep from dark to bright: a sine, a hollow one, a reedy one, a full one, and one with every harmonic near enough level. Position is an input as well as a knob, and Position amount is how far it travels — an envelope on it is the sweep nearly every wavetable patch is built on, and an LFO on it is the sound moving on its own. Every wave here is a set of harmonics rather than a recording, so each is band-limited to the note being played and the bright end of the sweep stays a sound rather than folding into a chord of frequencies nobody asked for. They also share the phase of every harmonic they have in common, which is why a blend of two of them thickens instead of hollowing out. What is patched into Detune can move the pitch by up to four octaves, enough for an envelope to drop it from a click to a boom in the first moments of the note. The Detune knob sets the pitch up to four octaves either side of the note, so a sub-bass or a whistle is a setting rather than something to patch.",
  "audioInputs": [
    {
      "id": "position",
      "label": "Position"
    },
    {
      "id": "detune",
      "label": "Detune"
    }
  ],
  "audioOutputs": [
    {
      "id": "out",
      "label": "Out"
    }
  ],
  "midiInputs": [
    {
      "id": "midi",
      "label": "Note"
    }
  ],
  "nodes": [
    {
      "id": "note",
      "kind": "midiInput",
      "options": {
        "midiInput": "midi"
      }
    },
    {
      "id": "osc0",
      "kind": "oscillator",
      "options": {
        "periodicWave": {
          "imag": [
            0,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ],
          "real": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ]
        },
        "type": "custom"
      }
    },
    {
      "id": "win0",
      "kind": "waveShaper",
      "options": {
        "curve": [
          0,
          0,
          0,
          0,
          0,
          -1,
          -1,
          -1,
          -1
        ]
      }
    },
    {
      "id": "mix0",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "osc1",
      "kind": "oscillator",
      "options": {
        "periodicWave": {
          "imag": [
            0,
            1,
            0,
            "0.111111",
            0,
            "0.04",
            0,
            "0.020408",
            0,
            "0.012346",
            0,
            "0.008264",
            0,
            "0.005917",
            0,
            "0.004444",
            0
          ],
          "real": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ]
        },
        "type": "custom"
      }
    },
    {
      "id": "win1",
      "kind": "waveShaper",
      "options": {
        "curve": [
          -1,
          -1,
          -1,
          -1,
          -1,
          0,
          -1,
          -1,
          -1
        ]
      }
    },
    {
      "id": "mix1",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "osc2",
      "kind": "oscillator",
      "options": {
        "periodicWave": {
          "imag": [
            0,
            1,
            0,
            "0.333333",
            0,
            "0.2",
            0,
            "0.142857",
            0,
            "0.111111",
            0,
            "0.090909",
            0,
            "0.076923",
            0,
            "0.066667",
            0
          ],
          "real": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ]
        },
        "type": "custom"
      }
    },
    {
      "id": "win2",
      "kind": "waveShaper",
      "options": {
        "curve": [
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          0,
          -1,
          -1
        ]
      }
    },
    {
      "id": "mix2",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "osc3",
      "kind": "oscillator",
      "options": {
        "periodicWave": {
          "imag": [
            0,
            1,
            "0.5",
            "0.333333",
            "0.25",
            "0.2",
            "0.166667",
            "0.142857",
            "0.125",
            "0.111111",
            "0.1",
            "0.090909",
            "0.083333",
            "0.076923",
            "0.071429",
            "0.066667",
            "0.0625"
          ],
          "real": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ]
        },
        "type": "custom"
      }
    },
    {
      "id": "win3",
      "kind": "waveShaper",
      "options": {
        "curve": [
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          0,
          -1
        ]
      }
    },
    {
      "id": "mix3",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "osc4",
      "kind": "oscillator",
      "options": {
        "periodicWave": {
          "imag": [
            0,
            1,
            "0.707107",
            "0.57735",
            "0.5",
            "0.447214",
            "0.408248",
            "0.377964",
            "0.353553",
            "0.333333",
            "0.316228",
            "0.301511",
            "0.288675",
            "0.27735",
            "0.267261",
            "0.258199",
            "0.25"
          ],
          "real": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ]
        },
        "type": "custom"
      }
    },
    {
      "id": "win4",
      "kind": "waveShaper",
      "options": {
        "curve": [
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          -1,
          0
        ]
      }
    },
    {
      "id": "mix4",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "pos",
      "kind": "constantSource",
      "options": {}
    },
    {
      "id": "posin",
      "kind": "moduleInput",
      "options": {
        "input": "position"
      }
    },
    {
      "id": "posdepth",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "detunein",
      "kind": "moduleInput",
      "options": {
        "input": "detune"
      }
    },
    {
      "id": "detunedepth",
      "kind": "gain",
      "options": {}
    },
    {
      "id": "out",
      "kind": "moduleOutput",
      "options": {
        "output": "out"
      }
    }
  ],
  "connections": [
    {
      "from": {
        "node": "osc0",
        "output": 0
      },
      "to": {
        "node": "mix0",
        "input": 0
      }
    },
    {
      "from": {
        "node": "mix0",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "pos",
        "output": 0
      },
      "to": {
        "node": "win0",
        "input": 0
      }
    },
    {
      "from": {
        "node": "win0",
        "output": 0
      },
      "to": {
        "node": "mix0",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "osc1",
        "output": 0
      },
      "to": {
        "node": "mix1",
        "input": 0
      }
    },
    {
      "from": {
        "node": "mix1",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "pos",
        "output": 0
      },
      "to": {
        "node": "win1",
        "input": 0
      }
    },
    {
      "from": {
        "node": "win1",
        "output": 0
      },
      "to": {
        "node": "mix1",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "osc2",
        "output": 0
      },
      "to": {
        "node": "mix2",
        "input": 0
      }
    },
    {
      "from": {
        "node": "mix2",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "pos",
        "output": 0
      },
      "to": {
        "node": "win2",
        "input": 0
      }
    },
    {
      "from": {
        "node": "win2",
        "output": 0
      },
      "to": {
        "node": "mix2",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "osc3",
        "output": 0
      },
      "to": {
        "node": "mix3",
        "input": 0
      }
    },
    {
      "from": {
        "node": "mix3",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "pos",
        "output": 0
      },
      "to": {
        "node": "win3",
        "input": 0
      }
    },
    {
      "from": {
        "node": "win3",
        "output": 0
      },
      "to": {
        "node": "mix3",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "osc4",
        "output": 0
      },
      "to": {
        "node": "mix4",
        "input": 0
      }
    },
    {
      "from": {
        "node": "mix4",
        "output": 0
      },
      "to": {
        "node": "out",
        "input": 0
      }
    },
    {
      "from": {
        "node": "pos",
        "output": 0
      },
      "to": {
        "node": "win4",
        "input": 0
      }
    },
    {
      "from": {
        "node": "win4",
        "output": 0
      },
      "to": {
        "node": "mix4",
        "param": "gain"
      }
    },
    {
      "from": {
        "node": "posin",
        "output": 0
      },
      "to": {
        "node": "posdepth",
        "input": 0
      }
    },
    {
      "from": {
        "node": "posdepth",
        "output": 0
      },
      "to": {
        "node": "pos",
        "param": "offset"
      }
    },
    {
      "from": {
        "node": "detunein",
        "output": 0
      },
      "to": {
        "node": "detunedepth",
        "input": 0
      }
    },
    {
      "from": {
        "node": "detunedepth",
        "output": 0
      },
      "to": {
        "node": "osc0",
        "param": "detune"
      }
    },
    {
      "from": {
        "node": "detunedepth",
        "output": 0
      },
      "to": {
        "node": "osc1",
        "param": "detune"
      }
    },
    {
      "from": {
        "node": "detunedepth",
        "output": 0
      },
      "to": {
        "node": "osc2",
        "param": "detune"
      }
    },
    {
      "from": {
        "node": "detunedepth",
        "output": 0
      },
      "to": {
        "node": "osc3",
        "param": "detune"
      }
    },
    {
      "from": {
        "node": "detunedepth",
        "output": 0
      },
      "to": {
        "node": "osc4",
        "param": "detune"
      }
    }
  ],
  "automation": [],
  "parameters": [
    {
      "id": "position",
      "label": "Position",
      "range": {
        "min": "0",
        "max": "1"
      },
      "default": "0.5",
      "targets": [
        {
          "node": "pos",
          "param": "offset"
        }
      ]
    },
    {
      "id": "positionAmount",
      "label": "Position amount",
      "range": {
        "min": "0",
        "max": "1"
      },
      "default": "0.5",
      "targets": [
        {
          "node": "posdepth",
          "param": "gain"
        }
      ]
    },
    {
      "id": "detune",
      "label": "Detune (cents)",
      "range": {
        "min": "-4800",
        "max": "4800"
      },
      "default": "0",
      "targets": [
        {
          "node": "osc0",
          "param": "detune"
        },
        {
          "node": "osc1",
          "param": "detune"
        },
        {
          "node": "osc2",
          "param": "detune"
        },
        {
          "node": "osc3",
          "param": "detune"
        },
        {
          "node": "osc4",
          "param": "detune"
        }
      ]
    },
    {
      "id": "detuneAmount",
      "label": "Detune amount (cents)",
      "range": {
        "min": "0",
        "max": "4800"
      },
      "default": "50",
      "targets": [
        {
          "node": "detunedepth",
          "param": "gain"
        }
      ]
    }
  ],
  "sampleSlots": [],
  "createdAt": "2026-09-21T00:00:00.000Z"
}