# Sympiano

**Sympathetic string resonance reverb** — the inside of a piano as an effect.

Sympiano models all 230 strings of a grand (or upright) piano as physical
waveguide resonators. Incoming audio is injected through the soundboard bridge,
every undamped string rings sympathetically, and per-string piezo pickups
capture the wash. Hold the sustain pedal of a real piano and sing into it —
that sound, as a plugin.

- 88 notes / 230 strings, real inharmonicity (Fletcher), unison detune with
  Weinreich two-stage decay, stretch tuning, temperaments
- **MIDI dampers**: play chords into Sympiano and only those strings resonate;
  CC64 works with continuous half-pedalling. With no MIDI it defaults to
  pedal-down (all strings open) and behaves as a normal audio insert.
- Piezo pickup position (physical comb filtering), pickup drive, soundboard blend
- Freeze, felt mute, una corda, bridge coupling, grand/upright models

Formats: **AU (MusicEffect) + VST3 + Standalone**, macOS (arm64 + x86_64).

---

## Using Sympiano in your DAW

### Ableton Live (VST3)
1. Drop Sympiano on any **audio track** — done. Default mode is pedal-down.
2. For MIDI damper control: create a MIDI track, set its **MIDI To** to the
   track holding Sympiano, choose the Sympiano device as the destination,
   and arm the MIDI track. Held notes + sustain pedal now control the dampers.

### Logic Pro (AU)
Sympiano's AU is a *MIDI-controlled effect* (so Logic will send it MIDI):
1. Create a **Software Instrument** track.
2. As the instrument, choose **MIDI-controlled Effects → Sympiano**.
3. In Sympiano's plugin header, set the **Side Chain** source to the audio
   track you want to process.
4. Play/record MIDI on the instrument track to control the dampers; the
   sidechained audio feeds the strings.

### Standalone
Open Sympiano.app, choose an input/output device (it will ask for microphone
access), and optionally a MIDI keyboard. Sing, play, or route audio in and
hold keys to choose the resonating strings.

## Tips
- **Mix** is your reverb amount; **Send** drives the strings harder.
- **Decay** scales string ring-out (0.25×–4×); **Tone** ages the strings darker.
- **Pickup Pos** at 0.5 hollows the sound (even partials null); near the bridge
  (0.03) it gets thin and glassy.
- **Freeze** locks the current resonance forever; "Frz Input" lets new audio
  keep feeding the frozen wash.
- **Detune** 0–1 cent = concert fresh; 8–12 = saloon.

## Building from source
```
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j 8
bash scripts/validate.sh   # unit tests + auval + pluginval
```
Requires macOS + Xcode. JUCE 8.0.15 is fetched automatically (or use
`-DSYMPIANO_USE_LOCAL_JUCE=ON` with a JUCE checkout at /Applications/JUCE).
