# Wavetables

Any sample can be played as a wavetable. When you use the `scan` parameter, the sample automatically becomes a pitched oscillator that can morph between cycles.

## What is a Wavetable?

A wavetable is a series of single-cycle waveforms stored end-to-end in an audio file. Each cycle is a complete waveform that starts and ends at zero crossing, allowing it to loop seamlessly at any pitch.

```
Sample: [cycle 0][cycle 1][cycle 2][cycle 3]
         ↑                           ↑
      scan 0                      scan 1
```

The oscillator reads through one cycle at audio rate (determining pitch), while `scan` selects which cycle to play. Values between cycles crossfade smoothly, creating timbral morphing.

## Basic Usage

Just add `scan` to any sample and it becomes a wavetable:

```forth
pad 0 scan .                 ( play pad as wavetable, first cycle )
pad 0.5 scan .               ( blend to middle cycles )
pad 440 freq 0 scan .        ( play at A4 )
```

Without `scan`, the sample plays normally. With `scan`, it becomes a looping wavetable oscillator.

## Parameters

| Parameter | Range | Description |
|-----------|-------|-------------|
| `scan` | 0-1 | Position in wavetable (0 = first cycle, 1 = last) |
| `wtlen` | samples | Cycle length in samples (0 = entire sample) |
| `scanlfo` | Hz | LFO rate for scan modulation |
| `scandepth` | 0-1 | LFO modulation depth |
| `scanshape` | shape | LFO waveform |

## Cycle Length

The `wtlen` parameter tells the engine how many samples make up one cycle. This must match how the wavetable was created, otherwise you'll hear the wrong pitch or glitchy artifacts.

```forth
pad 0 scan 2048 wtlen .      ( Serum-style 2048-sample cycles )
pad 0 scan 1024 wtlen .      ( 1024-sample cycles )
```

Common cycle lengths are powers of two: 256, 512, 1024, 2048. Serum uses 2048 samples per cycle. The number of cycles in a wavetable is the total sample length divided by `wtlen`. If `wtlen` is 0 (default), the entire sample is treated as one cycle. The sample still loops as a pitched oscillator, but `scan` has no morphing effect since there's only one cycle.

## Scanning

The `scan` parameter selects which cycle to play:

```forth
pad 0 scan .                 ( first cycle only )
pad 0.5 scan .               ( blend between middle cycles )
pad 1 scan .                 ( last cycle only )
```

## LFO Modulation

Automate the scan position with a built-in LFO:

```forth
pad 0 scan 2 scanlfo 0.3 scandepth .   ( 2 Hz modulation, 30% depth )
```

Available LFO shapes:

| Shape | Description |
|-------|-------------|
| `sine` | Smooth oscillation (default) |
| `tri` | Triangle wave |
| `saw` | Sawtooth, ramps up |
| `square` | Alternates between extremes |
| `sh` | Sample and hold, random steps |

## Creating Wavetables

A proper wavetable file:

- Contains multiple single-cycle waveforms of identical length
- Each cycle starts and ends at zero crossing for seamless looping
- Uses power-of-two cycle lengths (256, 512, 1024, 2048)
- Has cycles that morph smoothly from one to the next

You can find wavetable packs online or create your own in tools like Serum, WaveEdit, or Audacity (using zero-crossing snap). Single-cycle waveforms also work. With `wtlen` set to 0, a single-cycle sample becomes a basic pitched oscillator.
