73 Commits

Author SHA1 Message Date
kennethreitz fd6332f6d7 Update changelog with synth_bass/synth_lead loop fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:25:47 -04:00
kennethreitz 87787d6ab9 Fix looping on synth_bass and synth_lead
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>
2026-04-02 23:25:05 -04:00
kennethreitz ea40e16635 Update changelog with loop fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:22:06 -04:00
kennethreitz 018a1d125c Fix looping on pluck-envelope synths
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>
2026-04-02 23:21:53 -04:00
kennethreitz 42153bbd5a Add 14 new instruments — 83 total
New presets: analog_bass, analog_pad, drift_saw, drift_square,
mellotron, mellotron_choir, mellotron_flute, mellotron_strings,
ring_mod_bell, ring_mod_metallic, sync_lead, sync_lead_bright,
wavefold_gnarly, wavefold_warm.

Upgraded to PyTheory v0.40.9 (local editable via uv).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:18:32 -04:00
kennethreitz d1dc62f66e README: link to changelog
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:26:09 -04:00
kennethreitz 6a7264c044 Theremin octave +2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:21:51 -04:00
kennethreitz af5cc101cb Mandolin octave +1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:16:04 -04:00
kennethreitz e708975a3b French horn octave +1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:14:44 -04:00
kennethreitz a82aceec81 Flute octave +2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:14:09 -04:00
kennethreitz 229fec7e96 Crotales octave +2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:13:55 -04:00
kennethreitz c4bcc3a360 Update changelog
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:12:28 -04:00
kennethreitz c5ce816bc8 Octave adjustments: tingsha +3, vibraphone +2, viola -1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:10:42 -04:00
kennethreitz 51f15e124d Sitar and singing bowls back to poly, theremin +1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:09:27 -04:00
kennethreitz 1c68c02f4c Music box octave +1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:07:14 -04:00
kennethreitz 7fd36ea436 Clean up changelog — current state of all three days
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:04:59 -04:00
kennethreitz a70f16d13e Regen looped instruments: no reverb tail, tighter loop points
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>
2026-04-01 01:03:09 -04:00
kennethreitz 16f680385b Glockenspiel octave +1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:55:38 -04:00
kennethreitz 64e53fc37b All guitars octave -1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:54:38 -04:00
kennethreitz ac6c519dad Cello octave -1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:54:15 -04:00
kennethreitz 947ef19080 Octave adjustments: bari_sax -1, bass_guitar -2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:50:42 -04:00
kennethreitz e5e17d850e Regenerate saxophones on PyTheory 0.40.6
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:45:09 -04:00
kennethreitz b3718d65c1 Restore saxophones, upgrade to PyTheory 0.40.5
saxophone, alto_sax, tenor_sax, bari_sax back in (69 instruments).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:39:26 -04:00
kennethreitz 5f7ac98ec4 README: friendlier download steps, link to preset format notes
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>
2026-04-01 00:33:27 -04:00
kennethreitz ad87bd7d47 Update preset notes: looping works for gate behavior
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>
2026-04-01 00:32:23 -04:00
kennethreitz ba2f2b1790 Override 808_bass rendering: sustained sine instead of pluck
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>
2026-03-31 22:49:13 -04:00
kennethreitz ee0604635a Wider loop search: start at 150ms, end at 90%, prefer longer loops
Loop points now span more of the sustain body for smoother looping.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 22:47:01 -04:00
kennethreitz d4a516484f Update changelog with looping findings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 22:42:06 -04:00
kennethreitz 4024a5ffe4 RMS-matched looping for sustained instruments, loop.enabled=false for others
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>
2026-03-31 22:41:16 -04:00
kennethreitz 3a3b9bcb06 Bagpipe back to poly
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 09:09:25 -04:00
kennethreitz dd607e5cad Rewrite preset notes with correct multisampler behavior
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>
2026-03-31 09:08:14 -04:00
kennethreitz b3eaf56e4b Use PatchStudio default envelope for all multisampler presets
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>
2026-03-31 09:06:44 -04:00
kennethreitz c7feafa97c Accordion back to poly (needs chords)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:50:14 -04:00
kennethreitz 3fe60b4a9d Per-instrument amp envelopes for multisampler
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>
2026-03-31 08:45:55 -04:00
kennethreitz 16e284e440 Switch to multisampler type + add --patch flag
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>
2026-03-31 08:42:21 -04:00
kennethreitz 8abbe945bd Set default octave for low-register instruments
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>
2026-03-31 08:30:53 -04:00
kennethreitz dceb2c8079 Remove saxophones (4 instruments)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:29:50 -04:00
kennethreitz 0f47492ef4 README: green down arrow emoji
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:27:32 -04:00
kennethreitz cef3b1a877 README: add emoji to Getting the Presets
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:27:05 -04:00
kennethreitz 3926bd04f7 Update changelog to reflect current state
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:26:45 -04:00
kennethreitz 3ba0be1960 Flush print output so progress shows in real time
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:25:51 -04:00
kennethreitz 38622fcb3d All instruments: whole note at 100bpm + tail + silence trim
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>
2026-03-31 08:25:06 -04:00
kennethreitz f827948afb README: step-by-step install guide for non-GitHub users
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>
2026-03-31 08:18:14 -04:00
kennethreitz 25274136c1 Smart sample rendering: short hit + tail, silence trim, per-instrument release
- 8th note hit + 3 whole rests for natural decay capture
- Sustained instruments get whole note instead
- Trim trailing silence below -60dB, add 5% fade-out
- Per-instrument release: 12000 for resonant (piano, vibes, bells,
  plucked strings), 2000 for everything else
- More 8s samples: strings, winds, sitar, piano, mallet instruments
- CLI: python generate.py [instrument_name] for single regeneration
- No tambora in pytheory instrument library

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 08:16:04 -04:00
kennethreitz 3f261a60a6 Remove all looping — amp envelope only
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>
2026-03-31 07:37:07 -04:00
kennethreitz e9cd309dea Add OP-XY preset format notes with ASCII art
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>
2026-03-31 07:32:17 -04:00
kennethreitz 28d1bd42aa Zero-crossing loop points and faster release
- Loop start/end snap to nearest positive-going zero crossing
  for click-free looping
- Crossfade = 10% of loop length
- Amp release 7841 → 2000 for snappy key-up response
- Removed loop.enabled (factory presets don't use it)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 07:30:21 -04:00
kennethreitz 3c559b09fd Fix looping: remove loop.enabled, use loop.onrelease only
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>
2026-03-31 07:22:20 -04:00
kennethreitz ac4f515f69 Restore all 69 instruments, add CHANGELOG.md
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>
2026-03-31 07:11:12 -04:00
kennethreitz 391541a7b7 Remove excluded instruments — distortion fixed in pytheory 0.40.4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 07:08:35 -04:00