horizont/README.md

122 lines
5.4 KiB
Markdown
Raw Permalink Normal View History

2026-08-10 02:16:47 +02:00
# Horizont
A stereo algorithmic reverb audio plugin (VST3 / AU) for macOS, built with
JUCE and C++17.
2026-08-10 15:37:10 +02:00
It pairs a Schroeder/Moorer-style reverb core - a diffusion allpass section and
a bank of parallel damped combs whose gains are derived from an RT60 time - with
2026-08-10 02:16:47 +02:00
a **feedback pitch-shifting loop**: each pass through the reverb is recirculated
through a granular crossfade pitch shifter, so the tail climbs or descends in
pitch on every echo. The UI is a dark teal hardware-rack style skin with
skeuomorphic rotary knobs and a live wet-spectrum analyser.
2026-08-10 15:39:27 +02:00
## Screenshot
![Horizont](horizontshot.png)
2026-08-10 02:16:47 +02:00
## Features
- 9 fully automatable, host-saveable parameters in an `AudioProcessorValueTreeState`
- Stable, self-scaling reverb: comb gains are computed from RT60 so the loop
never diverges, and every delay length / filter / window scales with sample rate
2026-08-10 15:37:10 +02:00
- Per-sample parameter smoothing (`juce::SmoothedValue`) - no clicks, no allocation
2026-08-10 02:16:47 +02:00
in the audio callback
- Granular pitch shifter with seamless crossfade; bypasses transparently at 0 semitones
- Feedback loop routing the wet signal back through the pitch shifter and diffusers
- Dark themed GUI: skeuomorphic knobs, glass panel highlights, animated spectrum display
- Factory presets exposed through the host's program mechanism
- VST3 and Audio Unit formats; plain `make` build + install on macOS
## Controls
| Control | Range | Default | Notes |
|------------|-----------------|---------|--------------------------------------------|
| Low Cut | 20 500 Hz | 40 Hz | Input high-pass filter |
| High Cut | 800 Hz 20 kHz | 14 kHz | Input low-pass filter |
| Decay | 0.2 10 s | 3.5 s | RT60 of the comb bank |
| Size | 0.4 2.0 | 1.0 | Room size scaling of comb delays |
| Diffusion | 0 1 | 0.6 | Input allpass diffusion depth |
| Brightness | 0 1 | 0.75 | High-frequency damping of the tail |
| Feedback | 0 1 | 0.6 | Recirculation through the pitch shifter |
| Pitch | -12 +12 st | 0 st | Pitch shift applied per feedback pass |
| Dry/Wet | 0 1 | 0.35 | Dry / wet mix |
## DSP architecture
```
input -> [low-cut HP] -> [high-cut LP] -----> feedback node
| ^
(pitch shifter) |
| wet tail
[2 cascaded allpass diffusers]
|
8 parallel combs (damping + RT60 gain)
|
wet sum -> dry/wet mix -> output
```
- **Diffusers** shape the early reflections before the diffuse tail.
- **Combs** each use a different prime-based delay length; their loop gains are
`10^(-3 * delaySeconds / decaySeconds)` so the composite RT60 tracks *Decay*.
- **Pitch shifter** runs on the wet feedback path. Grains are windowed and
crossfaded; the read point moves at a rate proportional to the shift, with
sample-rate-scaled window lengths and a 32-sample crossfade.
- The wet output passes through a DC blocker, and the whole engine is
sample-rate independent.
## Requirements
- macOS with Xcode Command Line Tools (`xcode-select --install`)
- CMake >= 3.22
- `git`, `make`, `codesign` (all ship with the command line tools)
## Build & install
From the repository root:
```
make # fetches JUCE 8.0.15 into ./JUCE, configures and builds
make install # installs into ~/Library/Audio/Plug-Ins/VST3 and .../Components
```
`make` is fully self-contained: if `./JUCE` is missing it clones a pinned,
stable JUCE release into the current directory, then builds the plugin. The
resulting bundles land in `build/Horizont_artefacts/Release/`.
Other targets:
```
make uninstall # remove installed copies
make clean # delete the build directory
make help # list targets
```
If you prefer to manage JUCE yourself, either check it out as `./JUCE` next to
this repo, or point CMake at it with `-DJUCE_ROOT=/path/to/JUCE`.
> **Note:** JUCE 9 / `master` refactored the LookAndFeel API and is not yet
2026-08-10 15:37:10 +02:00
> supported - a JUCE 8.0.x release tag is required.
2026-08-10 02:16:47 +02:00
After installing, ask your DAW / Audio Unit host to rescan plug-ins (or run
`auval` to validate the component). Installed bundles are ad-hoc code-signed.
## Project layout
```
CMakeLists.txt build configuration
Makefile one-command build/install on macOS
Source/
PluginProcessor.* processor, APVTS, state save/load, program (preset) handling
PluginEditor.* layout, panels, preset combo box
HorizontEngine.* the reverb DSP core
PitchShifter.* granular crossfade pitch shifter
HorizontLookAndFeel.* dark teal theme, skeuomorphic rotary knobs
Knob.* knob component (slider + caption + value readout)
SpectrumDisplay.* animated wet-spectrum analyser
Presets.h factory presets
```
## License
2026-08-10 15:37:10 +02:00
This project is released under the GPL v3 - the standard license for JUCE
2026-08-10 02:16:47 +02:00
projects that use the open-source JUCE distribution. You may additionally use
it under the terms of a JUCE commercial license if you hold one.