- Cache time arrays and exp_decay envelopes (avoid reallocation)
- Cache drum hit renders (same sound at same length = same output)
- Vectorize piano_wave harmonic synthesis: 30 sin() calls in a
Python loop → one 2D numpy.sin() operation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Acid bass (ensemble=3), 16-player strings, tabla with solo and tihai,
8-player snare line, 6-player lead synth. Showcases ensemble, ramp,
LFO, sidechain, articulations, and dynamic curves.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
16-beat chakradar: tihai of tihais with 3 escalating phrases
and crescendo triplet finale landing on sam.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Full arrangement with three-octave square wave lead, drums, bass,
supersaw pads, and a saw solo section. Melody transcribed from MIDI.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the numeral package with ~30 lines of int2roman()/roman2int()
in _statics.py. Reduces supply chain surface. Fixes#47.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Showcases ramp(), articulations, Part.hit(), filter automation,
and cross-genre fusion. 303 acid bass with tabla entering at the
peak and riding through the outro.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Smoothly sweep any parameter (lowpass, reverb, distortion, etc.)
from current value to target with linear, ease_in, ease_out, or
ease_in_out interpolation curves.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Part.crescendo(), Part.decrescendo(), Part.swell(), and Part.dynamics()
for velocity ramps and custom curves across note sequences.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add 6 new drum fills: cajon flam, cajon rumble, cajon breakdown,
metal triplet, metal blast, metal cascade. 27 fills total.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Duration enum now supports multiplication, division, and addition
so expressions like `Duration.WHOLE * 2` work instead of raising TypeError.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Harmonium: single free reed, nasal midrange, bellows swell.
The sound of kirtan and qawwali.
- Doumbek (darbuka): dum (center bass), tek (edge sharp), ka (muted).
4 patterns: maqsoum, baladi, saidi, ayoub.
2 fills: doumbek roll, doumbek accent.
- 42 synth waveforms total
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tihai (3x crescendo landing on sam), chakkardar (32nd triplet
cascade), tiri kita (rapid 16th dayan burst), bayan (bass bends),
tabla call (dayan/bayan call-and-response).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
No more timing gaps. The leading string is held at 15% velocity
at the same beat position as the full chord via hold(), adding
strum texture without stealing time.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
hold() adds a note without advancing the beat position, so the
next note starts at the same time. Enables: piano sustain (bass
rings while melody plays), drone notes under melody, held chords
with moving lines.
Two lines in the renderer: skip beat_pos advance when _hold is set.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Grace notes created audible gap before chord and sounded like
separate plucks. Pure chord hit sounds better.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
G-D-Em-C at 120 BPM. Picked intro, strummed verse, electric lead
melody, strings swell, rock drums. The most popular chord progression
in pop history.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Random key, tempo, reverb space, instruments, and melodies.
Melodies walk the scale stepwise (not random jumps), arpeggios
follow chord tones in order, piano walks up/down. Tabla solo
always closes with random strokes. No seed — truly unique each play.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Didgeridoo drone throughout, granular abyss, kalimba light,
cello surfacing, piano + quiet uke, pedal steel + theremin solo
(searching → building → soaring peak), strings/flute/harp/timpani
at the peak, 4-part tabla solo finale (whisper → ghosts → 9-tuplet
call-response → 32nd triplet cascade + grand tihai).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- humanize=0.2 added to all melodic parts (leads, basses, bells)
- Subtle reverb (0.1-0.2) on bass parts that had none
- Per-note velocity dynamics on all leads (was static)
- Blues lead changed from trumpet to saxophone (more fitting)
- Songs 17-18, 20-26 left untouched (already well-crafted)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
play(), play_score(), _play_for() now catch Ctrl-C and stop
cleanly instead of crashing with a traceback. CLI demo also
wrapped.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dreams, outback drone, highland, nashville tears, tabla fusion
All new synths represented in pytheory demo random rotation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Ukulele: nylon string KS with small body resonance (350/700/1200Hz),
faster decay than guitar, mid-heavy character
- Strum sweep: 2 quiet grace notes (25% vel) before the chord hit,
gives audible strum feel without choppiness
- Default strum_time 0.08 → 0.05 for tighter feel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Polyrhythm section uses musical phrases (ti-ra-ki-ta patterns)
in 5-groups, 7-groups, and 9-groups rather than mechanical grid
overlays. Reverb pulled back to 0.4 across the song.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Orchestral piece in 22-shruti JI with choir vowel pads, timpani
rolls, bansuri, cello, sitar, strings, harp, djembe→tabla→extended
tabla solo finale (whisper→ghosts→call/response→9-tuplets→32nd
triplet cascades→grand tihai→slam).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>