OrchardDocs

Audio Engine

Ten-band equalizer, automatic EQ, per-track gain, stereo balance, output routing, live spectrum, and profile import and export.

The Orchard Audio Engine is a Web Audio processing chain sitting between playback and your output device. It lives in Settings → Audio Engine.

Signal chain

Audio from the media element enters an input node and splits into a dry path and a wet path. The wet path carries preamp, the ten-band equalizer, and stereo balance; the dry path bypasses the equalizer entirely. Crossfading between the two happens with a 12 ms time constant, so toggling the equalizer does not click.

source → input ─┬─ dry ────────────────────────────┐
                └─ preamp → 10× peaking filters ───┴─ balance → track gain → output

Per-track gain sits at the end, after balance, so remembered gain applies regardless of equalizer state.

Ten-band equalizer

Bands are fixed at 31, 62, 125, 250, 500 Hz, 1k, 2k, 4k, 8k, and 16k Hz, implemented as peaking biquad filters.

ControlRangeDefault
Band gain−12 to +12 dB0
Preamp−12 to +6 dB0 dB
Q0.4 to 2.41.1
Balance−1 (left) to +1 (right)0

Preamp exists so you can pull overall level down after boosting bands, avoiding clipping.

Built-in presets

PresetCharacter
FlatNo change
Bass boostLifts 31 to 250 Hz, slight dip through the mids
ElectronicBoosted lows and highs, scooped mids
RockBoosted lows and upper mids
VocalCut lows, lifted 500 Hz to 4 kHz
AcousticGentle lift at the extremes and through presence
BrightProgressive lift from 1 kHz up

Automatic EQ

Automatic EQ replaces the manual curve with one derived from what Orchard measured about the track. It is off by default.

Automatic EQ and the manual equalizer are mutually exclusive: enabling automatic EQ forces the manual equalizer off. When automatic EQ is active, filter Q is pinned to the default 1.1 and gain changes move with a much slower 350 ms time constant, so the curve drifts between tracks instead of stepping.

Learned profiles are keyed by track and store nine measured features, the ten resulting band gains, tempo, a sample count, and a timestamp. Profiles accumulate as you listen, and they are shared with Best Mix.

Per-track gain

Orchard remembers a gain offset per track, so a mastering-loud single and a quiet album cut stop jumping in level relative to each other. Gain is applied at the end of the chain and persists across sessions.

Separately, volume normalization can be toggled in playback settings for dynamic leveling.

Output device routing

Choose which output device Orchard plays to, independent of your system default. The default value is default, meaning follow the system.

Live spectrum

The player can show a live spectrum analysis of what is currently playing, driven by the same engine.

Profiles: import and export

Audio engine configuration can be written to a file and read back. The format is validated strictly:

{
  "app": "orchard",
  "type": "audio-engine-profile",
  "version": 1,
  "config": { "...": "..." }
}

A file that does not match is rejected with a clear error rather than partially applied.

Validation uses Zod in jitless mode. Zod’s optional JIT probes Function() before compiling object validators, and Orchard’s renderer runs under a strict Content Security Policy that forbids that.

Persistence

Engine configuration and per-track gains live in renderer local storage under the key orchard:audio-engine. Learned automatic-EQ profiles are stored alongside. If local storage is unavailable, the engine falls back to defaults rather than failing.

Native analysis

Feature extraction that feeds automatic EQ and Smart Crossfade runs through an N-API addon rather than in JavaScript. See Native Audio Analyzer.

Source map

PathRole
src/audio/engine/audioEngine.jsNode graph, presets, config normalization
src/audio/engine/automaticEq.jsAutomatic curve derivation
src/audio/engine/audioAnalyzer.jsFeature extraction and spectrum
src/audio/engine/audioProfileStore.jsLearned profile persistence
src/audio/engine/audioEngineSchemas.jsProfile validation
src/components/settings/AudioEngineSection.vueSettings UI