ambivalence/README.md

537 lines
31 KiB
Markdown
Raw Permalink Normal View History

2026-08-15 15:36:04 +02:00
# Ambivalence
**Algorithmic Reverb VST3 Plugin** - 16-ch FDN | SAPF Absorption | ISM-ER | ADAA Saturator | 44.1-192 kHz
Ambivalence is a hard fork of **[Ambience 1.0.1](https://github.com/OTODESK4193/Ambience1.0.1)**, a professional-grade algorithmic reverb built on a 16-channel Feedback Delay Network (FDN) architecture. Developed with the JUCE 8 framework and modern C++20, it delivers lush, natural-sounding reverberation with the stability and precision demanded by professional audio production. This port adds macOS and Linux support and removes the original Windows-only build configuration.
2026-08-15 18:33:52 +02:00
![Ambivalence Screenshot](shot.png)
2026-08-15 15:36:04 +02:00
---
## System Requirements
| Requirement | Specification |
| --------------- | ------------------------------------------------- |
| Operating System| macOS 11+, Windows 10/11 (64-bit), Linux (x86-64) |
| Plugin Format | VST3 / Standalone |
| CPU | Any 64-bit CPU (no SIMD-specific instructions) |
| RAM | 4 GB minimum, 8 GB recommended |
| JUCE Version | 8.0.x |
---
## Installation
1. Build or download the latest `Ambivalence.vst3` / `Ambivalence.app`.
2. Copy the `.vst3` bundle to your VST3 directory:
- macOS: `~/Library/Audio/Plug-Ins/VST3/`
- Windows: `C:\Program Files\Common Files\VST3\`
- Linux: `~/.local/lib/vst3/`
3. (Optional) Extract the factory preset pack into `~/Documents/Ambivalence/Presets/` (see [Preset Management](#preset-management)).
4. Rescan plugins in your DAW. Ambivalence appears under VST3 effects.
---
## Interface Overview
The UI is divided into five main zones:
2026-08-15 18:31:51 +02:00
- **Header Bar** - plugin title, EQ button, ER SOLO button, IN/OUT VU meters, and a footer showing the technical spec (`16ch FDN | SAPF | ISM-ER | 44.1-192kHz`).
2026-08-15 15:36:04 +02:00
- **Algorithm Selector** - 7 reverb type buttons.
2026-08-15 18:31:51 +02:00
- **Parameter Panel** - Normal Mode or EQ Mode knobs (toggles with the EQ button).
2026-08-15 15:36:04 +02:00
- **Visualizer Area** - RT60 graph (top) and Decay Curve (bottom).
- **Preset Panel** - preset browser with SAVE / LOAD / DELETE controls.
### Header Bar Controls
| Control | Description |
| ---------- | ----------- |
2026-08-15 18:31:51 +02:00
| EQ | Toggle button: switches the EQ Parameter Panel between Normal and EQ Mode. |
2026-08-15 15:36:04 +02:00
| ER SOLO | Toggle button: mutes Late Reverb so only Early Reflections are audible. Useful for tuning ER Level and Room Size. |
| IN / OUT | Stereo VU meters for input and output signal levels. |
---
## Algorithms
2026-08-15 18:31:51 +02:00
Seven reverb topology buttons appear below the header. Selecting an algorithm resets HF Damping, LF Absorption, Diffusion, and all EQ Mode band multipliers to their defaults for that algorithm.
2026-08-15 15:36:04 +02:00
| Algorithm | Acoustic Character | Best For |
| --------- | -------------------------------------------------------------- | ------------------------------ |
| ROOM1 | Small-medium rooms, ER active, Input Diffuser bypassed | Drums, percussion, tight ambience |
| ROOM2 | Large studio / live room, ER active, Input Diffuser bypassed | Full band, orchestral tracking |
| HALL1 | Medium concert hall, ER + Input Diffuser active | Strings, piano, vocals |
| HALL2 | Large concert hall, ER + Input Diffuser active | Orchestral, cinematic |
| PLATE | EMT 140-style metal plate, ER bypassed | Vocals, snare, acoustic guitar |
| SPRING | Spring tank character, ER bypassed | Guitar, retro/vintage sounds |
| GOLDFOIL | Experimental large space, ER bypassed | Ambient, pads, special FX |
---
## Normal Mode Parameters
Normal Mode presents 19 knobs organized into six sections: TIME, FREQUENCY, DIFFUSION, STEREO, CHARACTER, MIX, OUT EQ, and DUCKING.
### TIME Section
| Parameter | Range | Default | Description |
| ---------- | ----------- | ------- | ----------- |
| PRE-DELAY | 0-500 ms | 10 ms | Delay before the reverb onset. Separates the dry signal from the reverb tail, creating a sense of space without muddying the attack. |
| ROOM SIZE | 0.3-2.0 | 1.0 | Scales all 16 FDN delay lines proportionally. Larger values create a larger perceived room. Also scales Early Reflection tap timings. |
| DECAY | 0.1-20.0 s | 1.5 s | Sets the mid-band RT60 target (500 Hz reference). The Stage 2 GEQ solver uses this as the anchor for all frequency bands. |
### FREQUENCY Section
| Parameter | Range | Default | Description |
| --------- | ----- | ------- | ----------- |
| HF DAMP | 0.0-1.0 | 0.0 | High-frequency absorption. At 0.0 the RT60 curve is flat; increasing reduces RT60 of high bands (2k-16k Hz), simulating carpet or heavy drapes. Reflected in the RT60 graph (orange curve). |
| LF ABSORB | 0.0-1.0 | 0.0 | Low-frequency absorption. Increasing reduces RT60 of low bands (31-250 Hz), simulating rooms with less bass build-up. Reflected in the RT60 graph. |
Both default to 0.0. When a new algorithm is loaded they reset to 0.0 so the orange and gray RT60 curves are perfectly aligned.
### DIFFUSION Section
| Parameter | Range | Default | Description |
| --------- | --------- | ------- | ----------- |
| DIFFUSION | 0.0-1.0 | 0.7 | Controls density of early reflections and tail diffusion. Low values = sparser echoes (small room); high values = smooth dense tail (large hall). Adjusts Input Diffuser Allpass gain and Nested Allpass gain within the FDN. Algorithm-specific sensitivity multipliers apply. |
| MOD AMT | 0.0-1.0 | 0.25 | Depth of LFO modulation applied to FDN delay times. Higher values add pitch modulation and reduce metallic resonances at the cost of mild pitch drift. Keep below 0.3 for natural sound; higher for chorus/shimmer effects. |
| MOD RATE | 0.05-2.0 Hz | 0.5 Hz | Base frequency of the BandlimitedNoise LFO. Each of the 16 FDN channels uses a unique rate multiplier (Golden Ratio Weyl sequence), so no two channels are ever synchronized. |
### STEREO Section
| Parameter | Range | Default | Description |
| --------- | ------- | ------- | ----------- |
| WIDTH | 0.0-1.0 | 0.8 | Stereo width of the reverb output. At 0.0 the reverb is mono; at 1.0 L/R are fully decorrelated. Controls three mechanisms: (1) side-component injection strength into the FDN (`sideBoost = width x 1.5`), (2) FDN output L/R cross-bleed (`crossLeak = 1 - width`), (3) ER tap left/right separation (`erLeakage`). |
### CHARACTER Section
| Parameter | Range | Default | Description |
| --------- | ------- | ------- | ----------- |
| ER LEVEL | 0.0-1.0 | 0.6 | Level of the Early Reflections path (ISM tap pattern), blended with the Late Reverb output. Set to 0 for a pure diffuse tail; increase for clarity and room definition. |
| SATURATE | 0.0-1.0 | 0.0 | Amount of ADAA saturation applied to the wet signal. Algorithm-dependent multiplier (PLATE 1.00x, SPRING 1.05x, ROOM 0.90x). Drive curve: `1 + amount^2 x 2.5`. Wet mix: `amount^2 x 0.7`. Dry mix: `1 - amount x 0.25`. At 0, saturation is completely bypassed. |
### MIX Section
| Parameter | Range | Default | Description |
| --------- | ---------- | ------- | ----------- |
| WET | -60 to 0 dB | -4 dB | Wet signal level. An internal -1 dB offset is applied, so 0 dB on the knob = -1 dB effective. Smoothed sample-accurately via `SmoothedValue` to prevent zipper noise under automation. |
| DRY | -60 to 0 dB | 0 dB | Dry (unprocessed) signal level. The dry path bypasses all DSP - no EQ, saturation, or limiting. Smoothed sample-accurately. |
> **Send/return usage:** Set DRY to -60 dB (silent) and control the return level with WET exclusively.
### OUT EQ Section
| Parameter | Range | Default | Description |
| --------- | -------- | ------- | ----------- |
| LO CUT | 20-500 Hz | 20 Hz | High-pass filter applied to the wet path only. Linkwitz-Riley topology (1st-order IIR x 2 stages = 12 dB/oct). At 20 Hz the filter is effectively bypassed with no phase shift. |
| HI CUT | 1k-20k Hz | 20 kHz | Low-pass filter applied to the wet path only. Same Linkwitz-Riley topology (12 dB/oct). At 20 kHz, effectively bypassed. |
### DUCKING Section
Ducking reduces the wet signal level when the input exceeds the threshold, creating space between the dry signal and the reverb tail - particularly effective on percussive material and vocals.
| Parameter | Range | Default | Description |
| --------- | ----------- | ------- | ----------- |
| AMOUNT | 0-20 dB | 0 dB | Maximum gain reduction applied to the wet signal when the input exceeds the threshold. Set to 0 to disable ducking entirely. |
| THRESH | -60 to 0 dB | -20 dB | Input level (peak) at which ducking begins. |
| ATTACK | 0.5-100 ms | 10 ms | Time for the ducking envelope to follow an increase in input level. |
| RELEASE | 10-2000 ms | 200 ms | Time for the gain to recover after the input drops below the threshold. Longer values prevent pumping after transients. |
---
2026-08-15 18:31:51 +02:00
## EQ Mode
2026-08-15 15:36:04 +02:00
2026-08-15 18:31:51 +02:00
Press the **EQ** button in the header bar to reveal the EQ Mode panel. Two rows of advanced controls replace the Normal Mode rows. All EQ Mode adjustments are retained when switching back to Normal Mode - they are only reset when a different algorithm is selected.
2026-08-15 15:36:04 +02:00
### RT60 Per Band (Row 1)
Ten knobs control a per-band RT60 multiplier for each octave band from 31 Hz to 16 kHz, applied on top of the base Decay time.
| Knob | Center Frequency | Range | Default | Effect |
| --------- | ---------------- | ------- | ------- | ---------------------------- |
| RT 31Hz | 31 Hz | 0.5-2.0x | 1.0x | Sub-bass reverb duration |
| RT 63Hz | 63 Hz | 0.5-2.0x | 1.0x | Bass reverb duration |
| RT 125Hz | 125 Hz | 0.5-2.0x | 1.0x | Low-mid reverb duration |
| RT 250Hz | 250 Hz | 0.5-2.0x | 1.0x | Mid reverb duration |
| RT 500Hz | 500 Hz | 0.5-2.0x | 1.0x | Mid reverb (anchor band) |
| RT 1kHz | 1 kHz | 0.5-2.0x | 1.0x | Upper-mid reverb duration |
| RT 2kHz | 2 kHz | 0.5-2.0x | 1.0x | Presence reverb duration |
| RT 4kHz | 4 kHz | 0.5-2.0x | 1.0x | High reverb duration |
| RT 8kHz | 8 kHz | 0.5-2.0x | 1.0x | Treble reverb duration |
| RT 16kHz | 16 kHz | 0.5-2.0x | 1.0x | Air reverb duration |
Example: set RT 31Hz to 1.6 and RT 16kHz to 0.6 for a warm, concert hall-style curve with extended bass and attenuated treble.
### Tilt EQ (Row 2, left)
Three knobs provide broad RT60 tilt control across frequency groups, applied simultaneously with the per-band multipliers.
| Knob | Bands Affected | Range | Description |
| --------- | --------------- | ------- | ----------- |
| TILT LOW | 31, 63, 125 Hz | 0.5-2.0x | Multiplies RT60 for all low bands at once. |
| TILT MID | 250, 500, 1k, 2k Hz | 0.5-2.0x | Multiplies RT60 for mid bands. Controls the body/core of the reverb. |
| TILT HIGH | 4k, 8k, 16k Hz | 0.5-2.0x | Multiplies RT60 for high bands. Reduce for darker reverb; increase for brighter, airier tails. |
### Sat Type & Out EQ (Row 2, right)
| Control | Description |
| ---------- | ----------- |
2026-08-15 18:31:51 +02:00
| SAT TYPE | Selects the ADAA Saturator character: Warm, Tape, Tube, Hard (see [DSP Technical Reference](#dsp-technical-reference)). Only visible in EQ Mode. |
| LO CUT (EQ) | Same parameter as Normal Mode LO CUT - both knobs control the same value. |
| HI CUT (EQ) | Same parameter as Normal Mode HI CUT - both knobs control the same value. |
2026-08-15 15:36:04 +02:00
---
## Visualizers
### RT60 Graph
Displays the frequency-dependent reverberation time across 10 octave bands (31 Hz - 16 kHz) on a logarithmic vertical scale.
| Element | Description |
| -------------- | ----------- |
2026-08-15 18:31:51 +02:00
| Gray curve | The reference RT60 of the current algorithm preset - the "ideal" before any HF Damping, LF Absorption, or EQ Mode adjustments. |
2026-08-15 15:36:04 +02:00
| Orange curve | The actual effective RT60 after all adjustments. This is what you hear. |
| Dynamic Y axis | Auto-adjusts to the current maximum RT60 with smooth exponential tracking; grid lines at standard RT60 values. |
| Frequency labels | X-axis: 31, 63, 125, 250, 500, 1k, 2k, 4k, 8k, 16k Hz. |
When an algorithm is first selected and HF/LF are at default (0.0), the orange and gray curves perfectly overlap.
### Decay Curve Visualizer
A time-domain view of the reverb structure with a split time axis.
| Zone | Time Range | Color | Description |
| ----------- | ------------ | ------ | ----------- |
| ER Zone | 0-200 ms | Blue | Expanded 2x zoom showing Early Reflection taps. Each tap is a 5 px bar with gradient fill and a diamond marker at the peak; the ER envelope connects all tap peaks. |
| Late Zone | 200 ms - max | Orange | Theoretical exponential decay curve based on mid-band RT60, with a 2D gradient fill representing the Late Reverb energy envelope. |
| Boundary line | 200 ms | Gray | Vertical separator between ER and Late zones. |
> The visualizer updates at 15 Hz to keep CPU usage minimal. RT60 values shown are based on the 500 Hz mid-band (`cachedRT60Mid`).
---
## Acoustic Metrics
Four metrics, computed from the actual reverb output signal in real time, appear in the lower-right of the Decay Curve panel.
| Metric | Full Name | Formula | Interpretation |
| ------ | -------------------- | ------------------------------ | -------------- |
| D50 | Definition | E(0-50ms) / E(total) | Ratio of early to total energy. Values > 0.5 indicate high clarity. Low in large halls, high in small rooms. |
| C50 | Clarity (speech) | 10 log10[E(0-50ms) / E(50ms+)] | Positive values = more early energy. > 0 dB recommended for speech intelligibility. |
| C80 | Clarity (music) | 10 log10[E(0-80ms) / E(80ms+)] | Positive values favor direct sound. -2 to +4 dB is typical for music spaces. |
| EDT | Early Decay Time | RT60 estimated from first 10 dB | Perceptually dominant measure of reverb character; correlates with subjective "liveness". |
---
## Preset Management
2026-08-15 18:31:51 +02:00
The Preset Panel is always visible in the lower-right area of the parameter section, regardless of Normal/EQ Mode state.
2026-08-15 15:36:04 +02:00
### Preset UI Controls
| Control | Description |
| ------------------ | ----------- |
| `<` (PREV) | Load the previous preset in alphabetical order (wraps from first to last). |
| Preset Name (combo) | Drop-down of all available presets. Select to preview; click LOAD to apply. |
| `>` (NEXT) | Load the next preset in alphabetical order. |
| SAVE | Opens a dialog to name and save the current plugin state as a `.ambpreset` file. Existing names are overwritten. |
| LOAD | Loads the currently selected preset from the combo box. |
| DELETE | Deletes the currently selected preset after confirmation. Cannot be undone. |
### Preset File Location
All presets - factory and user-created - are stored as `.ambpreset` files in:
```
~/Documents/Ambivalence/Presets/
```
(`Documents` resolves to `C:\Users\<YourName>\Documents` on Windows.) The folder is created automatically on first use. Each `.ambpreset` file is a standard JUCE binary XML state file containing all plugin parameters.
### Sharing Presets
Send individual `.ambpreset` files directly; recipients place them in their own `Documents/Ambivalence/Presets/` folder and they appear in the browser on next plugin load. To share a complete library, ZIP the entire Presets folder.
> Preset files are version-forward compatible: unknown parameters from newer versions are silently ignored and fall back to defaults.
---
## Signal Flow
| Stage | Module | Description |
| ----- | ------------------- | ----------- |
| 1 | Input Split | Stereo L/R converted to Mid/Side. Mid feeds the FDN; Side injects stereo character. |
| 2 | Input Diffuser | 4-stage series Allpass filter (Hall, Goldfoil only). Diffusion gain = DIFFUSION x algorithm sensitivity (1.0 Hall, 0.5 Spring, etc.). |
| 3 | Early Reflections | ISM-based tapped delay line with algorithm-specific tap patterns. ER Level and Room Size control output. Bypassed for Plate, Spring, Goldfoil. |
| 4 | FDN (16 ch) | 16-channel Feedback Delay Network with FWHT feedback matrix and sign-flip decorrelation. |
| 4a | LFO Modulation | Per-channel BandlimitedNoise LFO modulates delay times (MOD AMT x rate multiplier). |
| 4b | Stage 2 Absorption | 10-band biquad GEQ cascade per channel, WLS-solved to match the target RT60 per band. |
| 4c | Micro-Saturation | Pade `x(27+x^2)/(27+9x^2)` limiter in the feedback loop. `kInScale=0.15`, nearly linear. |
| 4d | Nested Allpass | Per-channel Allpass filter for additional diffusion. Gain = `apfGain x (0.6 + diffusion x 0.4)`. |
| 5 | Mix | `ER x erLevel + Late x lateMakeupGain` blended to stereo. Ducking envelope applied. |
| 6 | ADAA Saturator | Anti-Derivative Anti-Aliasing saturation (Warm/Tape/Tube/Hard). Wet path only. |
| 7 | Output EQ | LO CUT HPF + HI CUT LPF, 12 dB/oct Linkwitz-Riley. Wet path only. |
| 8 | Output Limiter | Brick-wall limiter at -0.5 dBFS. Attack 0.5 ms, Release 50 ms. Wet path only. |
| 9 | Final Mix | `Wet x SmoothedWetGain + Dry x SmoothedDryGain`, sample-accurate smoothing. |
---
## DSP Technical Reference
### FDN Architecture
A 16-channel Feedback Delay Network whose feedback matrix is a normalized Fast Walsh-Hadamard Transform (FWHT) with sign flipping for energy preservation and modal density. Delay times use the Nearest-Prime logarithmic distribution: a target delay time is computed by logarithmically interpolating between the min and max delay (determined by Room Size), then the nearest unused prime is selected. This guarantees:
- All 16 delay lines are mutually coprime (no shared factors).
- Delay times are distributed logarithmically (perceptually uniform spacing).
- No comb-filter clustering at any Room Size setting.
### Stage 2 GEQ Absorption (SAPF)
Each of the 16 FDN channels has an independent 10-stage biquad cascade designed with the Valimaki-Liski Accurate Cascade Graphic Equalizer method. A Weighted Least Squares system is solved to find biquad coefficients approximating the target attenuation per band:
```
targetDb[b] = -60 x delaySamples / (fs x targetRT60[b])
```
HF Damping and LF Absorption modify the target RT60 before the WLS solve, creating perceptually natural roll-off at the spectral extremes.
### BandlimitedNoise LFO
Each FDN channel has an independent LFO driven by a white-noise source (XOR-shift PRNG) filtered by a 1st-order IIR low-pass. The IIR cutoff is MOD RATE x rateMultiplier per channel. Rate multipliers use the Golden Ratio Weyl sequence:
```
angle = channelIndex x 1.6180339887
rateMultiplier = 0.80 + frac(angle) x 0.40 // range 0.80 - 1.20
```
No two channels share an LFO rate, preventing audible beating from periodic modulation.
### ADAA Saturator
Anti-Derivative Anti-Aliasing prevents aliasing when the saturator introduces nonlinear distortion. ADAA computes the output as the finite difference of the antiderivative rather than evaluating the nonlinear function directly:
```
y[n] = (F(x[n]) - F(x[n-1])) / (x[n] - x[n-1])
```
A fallback to direct evaluation is used when `|x[n] - x[n-1]| < 1e-5` (near-constant input) or at zero crossings.
| Mode | Function f(x) | Antiderivative F(x) | Character |
| ----- | ---------------------------------------------- | --------------------------------- | --------- |
| Warm | `x / sqrt(1+x^2)` | `sqrt(1+x^2)` | Symmetric soft clip (Vicanek-style). Warm, rounded odd harmonics. |
| Tape | `x(27+x^2) / (27+9x^2)` | - (no ADAA; Pade is inherently smooth) | Pade rational approximation. Tape-like transient rounding. Lightest CPU. |
| Tube | pos: `x/sqrt(1+x^2)`, neg: `x/sqrt(1+(2x)^2)` | pos: `sqrt(1+x^2)`, neg: `(1/4)sqrt(1+4x^2)+0.75` | Asymmetric - even-order harmonics (2nd, 4th). Analog warmth. |
| Hard | `clip(x, -1, 1)` | `x^2/2 (|x|<=1)`, `x-0.5 (x>1)`, `-x-0.5 (x<-1)` | Hard clip with ADAA. Bright, aggressive. C1-continuous antiderivative. |
### Linkwitz-Riley Output EQ
Two cascaded 1st-order IIR filters with identical cutoff frequencies yield a 12 dB/oct roll-off with flat passband magnitude.
```
HPF: y[n] = R x (y[n-1] + x[n] - x[n-1]) where R = exp(-2*pi*fc/fs)
LPF: y[n] = (1-R) x x[n] + R x y[n-1]
```
L and R are processed independently through 2 cascaded stages each (4 filter states per filter type). At bypass frequencies (LO CUT <= 20 Hz, HI CUT >= 20 kHz) the filter computation is skipped entirely - zero CPU cost and zero phase shift.
---
## Real-Time Safety
The plugin is engineered for strict real-time audio operation, with hardening for DAW edge cases.
| Measure | Details |
| ------------------------------- | ------- |
| No heap allocation on audio thread | All buffers (FDN delays, wet buffer, absorption coefficients) are pre-allocated in `prepareToPlay()`. No `new`/`malloc`/`vector::resize()` in `processBlock()`. |
| Dirty-flag parameter dispatch | A `DSPParams` equality check prevents `setParams()` when nothing changed; the expensive Stage 2 WLS matrix solve (16ch x 10-band LDLT) is skipped when idle. |
| SmoothedValue gain changes | WET and DRY gain changes are interpolated at sample rate over 50 ms to eliminate zipper noise under automation. |
| ScopedNoDenormals | Applied at the start of every `processBlock()` to flush denormals to zero, preventing CPU spikes in feedback loops. |
| Sample-rate guard | A check at the start of `processBlock()` compares the current sample rate against the stored rate; mismatch triggers a safe internal reset. |
| Safe editor destruction | The editor destructor explicitly calls `stopTimer()`, `setLookAndFeel(nullptr)`, and resets all APVTS attachments before destruction. |
| VST3 parameter sync | Internal parameter changes use `setValueNotifyingHost()` to keep automation state synchronized and prevent value rollback during recording. |
---
## Tips & Workflow
### Send vs. Insert Usage
- **Insert (on a track):** keep DRY at 0 dB, adjust WET to taste.
- **Send/Return (on a bus):** set DRY to -60 dB and WET to 0 dB; control the reverb level from the send amount.
- **Parallel compression style:** use multiple instances with different algorithms at low WET levels, blended together.
### Using ER SOLO
Enable ER SOLO to hear only the Early Reflections:
- Fine-tune ROOM SIZE - listen for natural pre-echo spacing.
- Adjust ER LEVEL - hear how much definition the early reflections add.
- Verify the algorithm's ER pattern matches the intended space character.
### Reading the RT60 Graph
The gray and orange curves overlap when HF DAMP = 0 and LF ABSORB = 0 (the default after loading a preset). Divergence indicates active spectral shaping:
- Orange below gray at high frequencies = HF DAMP active.
- Orange below gray at low frequencies = LF ABSORB active.
2026-08-15 18:31:51 +02:00
- Orange above gray = a EQ Mode RT band multiplier > 1.0 for those bands.
2026-08-15 15:36:04 +02:00
### Plate Reverb Tips
PLATE has inverted RT60 behavior vs. room reverb - high frequencies decay longer (matching the EMT 140 metal plate). For best results:
- Use HI CUT to tame brightness if the plate sounds too metallic.
- Try Tape or Warm saturation for classic EMT 140 coloration.
- Lower DIFFUSION for a more ringy plate; raise for smoother tails.
### Spring Reverb Tips
SPRING uses a 0.5 diffusion sensitivity multiplier - the DIFFUSION knob has a softer effect than Hall/Room. For the characteristic spring "boing":
- Use Tube saturation (kNeg = 2.0 adds harmonic richness).
- Increase MOD AMT for the pitch instability of a physical spring.
- Try DECAY between 1.5-3.5 s for vintage amp spring tank simulation.
### Creating Large Ambient Pads
For infinite, evolving pads with GOLDFOIL:
- DECAY 8-12 s
- WIDTH 0.95, MOD AMT 0.45, MOD RATE 0.20 Hz
- DIFFUSION 0.90 for maximum diffusion
- LO CUT 60-80 Hz to remove sub-bass buildup
2026-08-15 18:31:51 +02:00
- In EQ Mode, reduce RT 8kHz and RT 16kHz to 0.6 for a warmer, less harsh tail
2026-08-15 15:36:04 +02:00
---
## Factory Presets
Ambivalence ships with 21 factory presets modeled after real-world acoustic spaces.
| Algorithm | Preset Name | Reference Space |
| --------- | -------------------- | --------------- |
| ROOM1 | Abbey Road Studio2 | Abbey Road Studio 2, London |
| ROOM1 | Drums in a Box | Small dead studio room |
| ROOM1 | Tracking Room | Medium tracking room |
| ROOM2 | Abbey Road Studio1 | Abbey Road Studio 1 (orchestral hall) |
| ROOM2 | Capitol Studio A | Capitol Studios Studio A, Los Angeles |
| ROOM2 | Skywalker Sound | Skywalker Sound, California |
| HALL1 | Carnegie Hall | Carnegie Hall, New York |
| HALL1 | Tokyo Opera City | Tokyo Opera City Concert Hall |
| HALL1 | Berlin Konzerthaus | Konzerthaus Berlin |
| HALL2 | Vienna Musikverein | Wiener Musikverein - Goldener Saal |
| HALL2 | Boston Symphony | Boston Symphony Hall |
| HALL2 | Concertgebouw | Amsterdam Concertgebouw |
| PLATE | EMT140 Vocal | EMT 140 plate - vocal setting |
| PLATE | EMT140 Snare | EMT 140 plate - snare setting |
| PLATE | Dark Plate | Dark plate, enhanced low end |
| SPRING | Surf Guitar | Guitar amp spring tank |
| SPRING | Vintage Studio | Fender-style spring tank |
| SPRING | Deep Tank | AKG BX-20 style deep spring |
| GOLDFOIL | Gothic Cathedral | Cologne Cathedral acoustic reference |
| GOLDFOIL | Stone Chamber | Stone underground chamber |
| GOLDFOIL | Infinite Space | Synthetic infinite ambient space |
Key parameter values for the ROOM presets:
| Preset | Decay | Size | Diff | Mod | Width | ER | Sat | Sat Type |
| ----------------- | ----- | ---- | ---- | --- | ----- | --- | ---- | -------- |
| Abbey Road Std2 | 0.45s | 0.75 | 0.55 | 0.15| 0.75 | 0.70| 0.08 | Warm |
| Drums in a Box | 0.30s | 0.55 | 0.40 | 0.10| 0.65 | 0.80| 0.05 | Warm |
| Tracking Room | 0.60s | 0.90 | 0.65 | 0.20| 0.80 | 0.65| 0.10 | Tape |
| Abbey Road Std1 | 1.80s | 1.60 | 0.70 | 0.25| 0.85 | 0.60| 0.08 | Warm |
| Capitol Studio A | 1.40s | 1.35 | 0.65 | 0.20| 0.80 | 0.65| 0.10 | Tape |
| Skywalker Sound | 2.00s | 1.70 | 0.75 | 0.30| 0.90 | 0.55| 0.06 | Warm |
HALL presets:
| Preset | Decay | Size | Diff | Mod | Width | ER | Sat | Sat Type |
| ---------------- | ----- | ---- | ---- | --- | ----- | --- | ---- | -------- |
| Carnegie Hall | 1.70s | 1.50 | 0.72 | 0.20| 0.88 | 0.55| 0.08 | Warm |
| Tokyo Opera City | 2.00s | 1.65 | 0.75 | 0.25| 0.88 | 0.50| 0.06 | Warm |
| Berlin Konzerthaus | 2.00s | 1.60 | 0.73 | 0.22| 0.87 | 0.52| 0.07 | Warm |
| Vienna Musikverein | 2.05s | 1.80 | 0.80 | 0.25| 0.90 | 0.50| 0.07 | Tube |
| Boston Symphony | 1.85s | 1.70 | 0.78 | 0.22| 0.88 | 0.52| 0.06 | Warm |
| Concertgebouw | 2.05s | 1.85 | 0.82 | 0.28| 0.92 | 0.48| 0.06 | Warm |
PLATE / SPRING / GOLDFOIL presets:
| Preset | Algorithm | Decay | Size | Diff | Width | Sat | Sat Type |
| --------------- | --------- | ----- | ---- | ---- | ----- | ---- | -------- |
| EMT140 Vocal | PLATE | 1.80s | 1.00 | 0.85 | 0.85 | 0.12 | Tape |
| EMT140 Snare | PLATE | 1.00s | 0.80 | 0.80 | 0.80 | 0.15 | Tape |
| Dark Plate | PLATE | 2.50s | 1.20 | 0.88 | 0.88 | 0.10 | Warm |
| Surf Guitar | SPRING | 1.50s | 0.70 | 0.45 | 0.70 | 0.20 | Tube |
| Vintage Studio | SPRING | 2.20s | 0.85 | 0.50 | 0.75 | 0.18 | Tube |
| Deep Tank | SPRING | 3.50s | 1.10 | 0.55 | 0.78 | 0.15 | Tube |
| Gothic Cathedral| GOLDFOIL | 8.00s | 2.00 | 0.90 | 0.92 | 0.05 | Warm |
| Stone Chamber | GOLDFOIL | 4.00s | 1.80 | 0.85 | 0.88 | 0.08 | Warm |
| Infinite Space | GOLDFOIL | 12.0s | 2.00 | 0.95 | 0.95 | 0.04 | Warm |
---
## Troubleshooting
| Problem | Likely Cause | Solution |
| ---------------------------------- | ----------------------------------------- | -------- |
| Plugin does not appear in DAW | VST3 not in the correct folder | Confirm the `.vst3` is in the VST3 directory for your OS and rescan. |
| No sound output | DRY and WET both at -60 dB, or routing | Check WET level; confirm the plugin is on an audio or return track with signal. |
| Reverb sounds metallic / ringy | DIFFUSION too low, or MOD AMT too low for PLATE/SPRING | Increase DIFFUSION. For PLATE, increase MOD AMT slightly (0.2-0.3). |
| Reverb too short despite high Decay | HF DAMP or LF ABSORB reducing some bands | Set both to 0.0; verify the orange curve on the RT60 graph. |
| Orange/gray RT60 curves misaligned at startup | HF DAMP / LF ABSORB not at 0 | Reset both to 0.0, or load a fresh preset. |
| Preset not appearing in browser | File in the wrong folder | Confirm the `.ambpreset` is in `Documents/Ambivalence/Presets/`, then restart. |
| Audio dropout / CPU spike | Block size too small, or too many instances | Increase the audio buffer size in your DAW. |
---
## Building from Source
### Prerequisites
- CMake 3.22+
- A JUCE 8.0.x checkout (`modules/juce_core` must exist)
- A C++20 compiler (Apple Clang, GCC 12+, or MSVC 2022)
### CMake
```sh
cmake -S . -B build -DJUCE_PATH=/path/to/JUCE
cmake --build build --config Release -j
```
JUCE is auto-detected from the project directory, `build/JUCE` (auto-fetched by `make`), `$HOME/JUCE`, `/opt/JUCE`, `/usr/local/JUCE`, and `/Applications/JUCE` if `-DJUCE_PATH` is not given. Build artifacts land in `build/Ambivalence_artefacts/` (VST3 + Standalone).
### Makefile
```sh
make -j # release build (uses nproc / sysctl, native arch)
make install # copies .vst3 + standalone into the per-OS plugin/application dirs
make clean
```
On the first build, JUCE 8 (`JUCE_VERSION`, default `8.0.15`) is shallow-cloned into `build/JUCE` so the build is self-contained. Use an existing checkout with `make JUCE_PATH=/path/to/JUCE`. On macOS, artifacts are installed to `~/Library/Audio/Plug-Ins/VST3/` and `~/Applications`; on Linux to `~/.local/lib/vst3/` and `~/.local/bin`.
`build/BuildInfo.h` is generated from `Source/BuildInfo.h.in` at configure time and embeds the Git branch, commit, and dirty state.
---
## Credits & License
**Original Ambience developer:** @kijyoumusic (OTODESK) - Electronic Music, Sound Design, DSP Engineering - [source repository](https://github.com/OTODESK4193/Ambience1.0.1)
**Framework:** JUCE 8.0.x - ROLI / Raw Material Software (https://juce.com)
**DSP References:**
- Valimaki, V. & Liski, J. (2017). *Accurate Cascade Graphic Equalizer*. IEEE Signal Processing Letters.
- Vicanek, M. (2016). *Matched Second Order Digital Filters*.
- Schlecht, S.J. & Habets, E.A.P. (2017). *On Lossless Feedback Delay Networks*. IEEE Transactions on Signal Processing.
- Parker, J. et al. (2019). *Modelling plate and spring reverberation using a DSP-informed deep neural network*. ICASSP.
- Moorer, J.A. (1979). *About this Reverberation Business*. Computer Music Journal.
**License:** GNU Affero General Public License v3.0 (AGPLv3) - see [LICENSE](LICENSE).
Copyright (C) 2026 OTODESK. All rights reserved.