Both use pluck envelopes that decay to silence — removed from
LOOP_INSTRUMENTS. Audited all remaining loop instruments to confirm
only sustained envelopes (organ, pad, strings, bowed) are looped.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
analog_bass, sync_lead, sync_lead_bright have pluck envelopes that
decay to silence — removed from LOOP_INSTRUMENTS so they play through
naturally instead of trying to sustain a non-existent loop region.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Looped instruments now render just the whole note (2.4s) without
tail rests. Loop analysis constrained to signal body (>25% peak RMS)
so loop points land in the sustain, not the reverb tail.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Step-by-step for non-technical users. Added --patch flag to dev section.
Linked opxy-preset-notes.md from developer section.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Corrected the "no gate" section — loop.onrelease with RMS-matched
loop points does work for sustained instruments. Documented both
looped and non-looped region approaches with examples.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PyTheory's 808 preset uses pluck envelope (0.26s). Override with
sine + pad envelope + lowpass + sub_osc for proper sustained 808.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sustained instruments (30): loop.onrelease=true with RMS-matched
zero-crossing loop points and 33% crossfade. Amp envelope with
full sustain + release for gate behavior.
Non-looped instruments (35): loop.enabled=false explicitly set
to prevent OP-XY from looping the full sample.
Loop point analysis finds the pair of points in the sustain region
where energy levels match best, then snaps to zero crossings.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Key finding: multisampler does NOT gate on key release.
Documented the three sampler types from TE docs, corrected
loop.onrelease meaning (opposite of what we assumed),
added PatchStudio defaults as recommended envelope.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Multisampler doesn't gate on key release — amp decay shapes the note.
decay: 20295, sustain: 14989 (~46%), release: 16383.
Notes hit full volume then decay to a held level.
Removed per-instrument envelope logic (no longer needed).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sustained instruments (winds, strings, pads, organ): decay 20000,
sustain 22000 (~67%), release 8000 — notes fade naturally and
stop on key release instead of playing forever.
Plucked/resonant (piano, vibes, guitar): no decay, long release.
Short percussive: no decay, quick release.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OP-XY docs confirm "sampler" = single sample pitched across keyboard,
"multisampler" = multiple samples in zones. We were generating 6 WAVs
but only one was being used.
Now uses type: "multisampler" with lokey=0 stacking, loop.enabled=false,
loop.onrelease=false — matching factory multisampler format.
python generate.py --patch # update patch.json only (instant)
python generate.py --patch piano # single instrument patch update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
didgeridoo/808_bass: -2, bass/contrabass/tuba/timpani: -1
So they play in their natural range on the OP-XY keyboard.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Uniform rendering: whole note (2.4s) + 3 whole rests of tail (~9.6s
total), then auto-trimmed to last audible frame. Short percussive
sounds trim down naturally, sustained sounds keep their full decay.
Removed install.py. Removed LONG_SAMPLE_INSTRUMENTS distinction.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Explains how to download the ZIP, how to use Field Kit for OP-XY,
disk mode for OP-1, with numbered steps. Moved dev stuff to bottom.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
loop.onrelease was still causing infinite sustain on some instruments.
Stripped all loop fields from regions. Amp envelope handles sustain
(decay: 0, sustain: max) and release (2000 for quick cutoff).
Sustained instruments still get 8s samples.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Documents learnings from reverse-engineering factory presets:
loop behavior, region fields, engine settings, drum layout,
and the critical difference between sampler/multisampler types.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Factory sampler presets never use loop.enabled — just loop.onrelease.
loop.enabled was causing infinite looping that ignored key release.
Loop start moved to 40% (past attack) for sustained instruments.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Distortion guitars back thanks to PyTheory v0.40.4 fix.
README updated to reflect full instrument list.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>