16 dedicated instrument synths, speaker cab sim, analog drift,
strumming with fretboard lookup, dhol/dholak/mridangam/djembe/
metal kit with 22 patterns, 5 new demo moods.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New acoustic_guitar_synth: Karplus-Strong with wooden body
resonance (3 formant peaks at 110/250/500 Hz), warmer initial
noise, gentle rolloff. Sounds woody, not harsh.
- Strum renders as a single chord hit — no more exposed grace
notes that sounded digital. Clean, full chord sound.
- 16 synth waveforms total
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Per-note random pitch wobble (gaussian, ±cents scaled by analog param)
simulates analog oscillator instability. Applied to synth_lead (0.3),
synth_pad (0.4), synth_bass (0.2), acid_bass (0.3), electric_piano
(0.2), organ (0.15). Subtle enough to add life without sounding
out of tune.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Score(reference_pitch=415.0, temperament="meantone") renders an
entire piece at Baroque pitch with historical tuning. Flows through
to all .pitch() calls in both normal and legato renderers.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Bohlen-Pierce (13-TET tritave): period=3.0 support in pitch(),
System, and TET factory. 13 equal divisions of the 3:1 ratio.
- Just intonation temperament: 5-limit JI ratios (pure 3/2 fifths,
5/4 thirds). Use temperament="just" anywhere.
- Score(temperament="just") flows through to playback — all .pitch()
calls in the render pipeline use the Score's temperament.
- Carnatic 72-TET system with 10 melakartas.
- Fix c_index for Indian, Arabic, and Gamelan 12-TET systems.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Carnatic (72-TET): 10 melakartas including shankarabharanam,
kalyani, mayamalavagowla, kharaharapriya, etc.
- Score(system=) param passes tuning system to all parts, so
Part.add("Sa") resolves through the correct system
- 22 new tests covering all microtonal systems: TET factory,
19/31-TET, shruti, maqam, slendro, pelog, thai, makam,
carnatic, circle of fifths, from_frequency, Score integration
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- "shruti" system: 22 named shrutis with proper microtonal intervals
for all 10 thaats (bilawal, bhairav, todi, etc.) and pentatonic
scales (bhupali, malkauns, durga). Captures the 2-shruti vs 3-shruti
distinctions that 12-TET approximations lose.
- "maqam" system: 24-TET with quarter-tone positions (↑/↓ notation).
True maqam Rast with quarter-flat E and B. Bayati, Saba, Sikah,
Hijaz, and 6 more maqamat with exact quarter-tone intervals.
- 12-TET "indian" and "arabic" systems preserved for backwards compat.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tone("X") now raises ValueError immediately instead of silently
storing an invalid name and only failing on .frequency access.
Closes#39
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rewrite strings_wave with additive synthesis: natural 1/n harmonic
rolloff shaped by body resonance curve, per-harmonic phase
randomization, delayed vibrato onset, bow pressure variation
- Add highpass filter (12dB/oct biquad) to signal chain and Part API
- Add BOWED envelope (40ms attack with bite) for string instruments
- Update string presets to use strings_synth + bowed envelope
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Solo violin/viola/cello/contrabass now use triangle + strings envelope
(clean, clear). String ensemble keeps strings_synth + detune for
thick ensemble textures. Solo instruments need clarity, not width.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Drums are real Parts with full effects pipeline
- split=True creates kick/snare/hats/toms/cymbals/percussion Parts
- Sidechain triggers on kick only
- Score.from_midi() imports Standard MIDI Files
- Document split drums workflow
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
score.drums("rock", split=True) creates independent Parts per group.
Each gets its own effects chain. set_drum_effects() applies to all.
Sidechain triggers on kick only. Render loop handles multiple drum Parts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Hi-hats and snares no longer duck the pad — only the kick does.
This is how sidechain compression works in real mixes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
_drum_hits and _drum_pattern_beats proxy through score.parts['drums'].
Drum Part goes through _apply_part_effects like any other Part.
set_drum_effects() is now sugar over the Part's attributes.
All 789 tests pass with no API changes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
score.set_drum_effects(reverb=0.2, reverb_type="plate", lowpass=8000)
Uses _apply_effects_with_params on each stereo channel.
Supports all effects: reverb, delay, lowpass, distortion, chorus.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Every song now has: stereo panning, convolution reverb (plate/cathedral),
humanize (0.2), detune (8-12) on pads, sidechain on electronic tracks,
lowpass on bass, delay on leads. No melodies changed — just better sound.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Load any Standard MIDI File into a Score. Zero-dependency parser
handles Type 0 and Type 1 files. Each channel becomes a Part,
channel 10 becomes drum hits. Roundtrip with save_midi works.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Drums now have micro-timing and velocity imperfections like a real
drummer. Default 0.3 (subtle). Control via Score(drum_humanize=0.5).
Kick stays tightest, hats and ghost notes drift naturally.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>