# Master volume, meter, softclip

The bottom of the Master Control panel is the final stage: the **master volume** (last gain before the output device), the **stereo peak meter**, the **CLIP indicator**, and the **softclip safety**. These are the four controls between your mix and your speakers.

## Master volume

Linear 0..1, unity = 1.0. The meter, softclip, and clip indicator all sit AFTER the master volume in the signal chain — so they reflect what's actually reaching the device, not what the mix bus looks like internally.

**Above-unity boost is intentionally not allowed.** If you're constantly wishing for it, the right move is to bring strip gains UP rather than pushing master past 1.0 — you have a strict per-strip 0..1 and a strict master 0..1, so the mix and the master ride the same scale.

The fader applies a 5 ms ramp on changes (no clicks). The setting persists per project.

> 🔘 **MCP**: `master.volume.set { volume: 0..1 }`. Same 5 ms ramp.

## The meter

Stereo peak meter, decaying over ~1 s after a peak. Each channel shows:

- **Bar** — current peak (linear; the bar's visual scale is dB-spaced so the upper half feels finer-grained than the lower half).
- **CLIP indicator** — the red box at the top of each channel. Sticky once lit — stays on until you clear it manually, even after the offending peak has decayed.

The peak value is also exposed in `system.state { sections: ["master"] }` as `peak` (per-channel) plus a `clip` Boolean (true after any clip until cleared). Useful when the AI wants to know "did that change clip the master?" without polling the UI.

> 🔘 **MCP**: `system.state { sections: ["master"] }` returns `{ volume, softclip, peak: [L, R], clip, sampleRate, latencyMs }`.

## CLIP indicator + clip recovery

A single output sample reaching ≥1.0 trips the clip indicator. It's sticky so a transient clip you missed visually still shows up; you have to acknowledge it explicitly.

Clear via the panel's red **CLIP** button or:

> 🔘 **MCP**: `master.clip.clear`. Returns the indicator to neutral; the next clip lights it fresh.

Why sticky: clipping in a long working session is the kind of thing you want to know about even if you weren't watching the meter at the moment it happened. Auto-clearing every sample would hide intermittent clips.

## Softclip

A gentle tanh-based saturation **at master output**, enabled by default. Catches digital overs at no audible cost for typical mix levels — if your mix is well-leveled, you won't hear softclip; if you push hot, it absorbs +0 to +3 dB worth of headroom with a musical roll-off rather than a hard digital crack.

Turn off only when:

- Monitoring at low levels and you want a perfectly linear output (rare).
- Auditioning unprocessed master output (e.g. comparing against a reference mix).
- Measuring something that needs a strictly linear output stage (calibration / metering tests).

Setting persists across sessions — you don't have to re-flip it every project.

> 🔘 **MCP**: `master.softclip.set { enabled: true | false }`.

## The four-control end-to-end demo

```yaml
actions:
  - action_id: system.state
    input: { sections: ["master"] }
    save_as: m
    label: "▶ 1. Snapshot master state"
  - action_id: master.volume.set
    input: { volume: 0.7 }
    label: "▶ 2. Drop master to 0.7"
  - action_id: master.softclip.set
    input: { enabled: false }
    label: "▶ 3. Bypass softclip (audition unprocessed)"
  - action_id: master.softclip.set
    input: { enabled: true }
    label: "▶ 4. Re-enable softclip"
  - action_id: master.clip.clear
    input: {}
    label: "■ Clear any clip indicator"
```

## Hiding the panel without stopping audio

The Master Control panel is a UI surface, not the audio engine. `surface.open { surface: "faustwave-bundled/mixer" }` puts it on screen; audio keeps running whatever the panel state is. Useful when you want screen real estate for the Builder canvas during a sound-design session.

## Common moves

- **"Why am I clipping?"** — `system.state { sections: ["mixer_tracks", "master"] }`, find the track with the highest per-track meter, pull its gain down. If softclip is bypassed, re-enable it as a safety net.
- **"Calibrate output level"** — `master.softclip.set { enabled: false }` for a linear path, then set every strip gain to 1.0 and master to your reference value; compare against an external meter.
- **"Set up a mix-down session"** — lower master to ~0.7 to leave headroom for tweaks; trust the per-strip meters + softclip; reach for the CLIP indicator to confirm the mix sits under digital full-scale.

## What this panel doesn't expose

A few master-bus features live elsewhere in the IDE:

- **The master bus as a Source** — the master is also a routing-table Source (`master` of kind `audio`), so you can wire it into another Sink (e.g. tap into the Recorder for capture, or feed back into a Builder for feedback experiments). See **FaustWave — Patchbay** § 1.
- **The master FX rack** — separate section, see § 2.
- **Per-track gain / mute / solo / sends + per-track FX** — separate section, see § 1.

## Where to go from here

- **FaustWave — Recorder** for capturing the master output (the Recorder taps the same post-volume signal you hear).
- **FaustWave — Patchbay** for understanding why master is BOTH a Source and a Sink in the routing table.
- **FaustWave — AI Assistant** for driving the four controls (volume / softclip / clip / state) from a chat conversation.
