Tanpura drone intro, quiet sitar Yaman phrases, tabla solo building
from gentle theka through ghost notes to blazing tiri kita with
bayan pitch bends, tihai, dramatic silence, slam finish. Taj Mahal
reverb throughout.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Drums and melodic notes now choke previous resonance with a quick
fade when a new hit/note starts. Prevents muddy buildup at fast
tempos. Added bayan pitch bend drum sound (TABLA_GE_BEND).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Render at base pitch using the actual synth, then variable-rate
resample to shift pitch over time. No more sine wave fallback or
retriggering artifacts. Three bend types: smooth (log), linear, late.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests for: all 14 dedicated synth waveforms, piano brightness scaling,
cabinet sim frequency reduction, analog drift rendering, strum with/
without fretboard, strum direction, all 6 tabla sounds, dhol/mridangam/
djembe/metal kit sounds, 20 world drum pattern presets, guitar preset
cabinet sim. 838 tests total.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All cut from 0.003-0.004 to 0.0015-0.002 — less wobbly in
ensemble context, more natural.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>