Strings, cello, trumpet, clarinet, oboe all cut to 0.001 depth.
Much subtler in ensemble context.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- roll(tone, duration, velocity_start, velocity_end, speed) — rapid
repeated notes with velocity ramp. Works on any instrument.
- Saxophone reed noise boosted and bandpass filtered for more bite
- Timpani preset: cathedral reverb at 0.4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace pytuning with 30-line native implementations of EDO,
Pythagorean, and quarter-comma meantone scale generators
- Lazy-load scipy.signal (337ms) — only imported when audio rendering
is actually used, not on theory-only imports
- Removes pytuning and sympy from dependencies entirely
Import time: 0.479s → 0.056s (8.5x faster)
Closes#44
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
B#4 now correctly resolves to C5 (523.25 Hz), not C4 (261.63 Hz).
Cb4 now correctly resolves to B3 (246.94 Hz), not B4 (493.88 Hz).
When an accidental crosses the B/C octave boundary, the octave is
adjusted: sharps crossing B→C increment, flats crossing C→B decrement.
Also handles double sharps (B##→C#5) and double flats (Cbb→Bb3).
Closes#45
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Maqam system now uses just intonation ratios instead of 24-TET:
- Quarter-tone positions use Zalzalian (11-limit) ratios
- Mi↓ (the defining Rast note) is exactly 27/22 from Do
- Standard JI intervals for chromatic positions
- Septimal ratios (7-limit) for other quarter-tone positions
Research confirmed: Turkish 53-TET and Thai 7-TET are already
correct as equal temperaments. Gamelan has no universal ratios
(each ensemble is unique), so TET remains the best default.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Tone(0, system=edo22) works alongside Tone("0", ...)
- Tone(22, system=edo22) wraps to tone 0, octave+1
- Tone(-1) wraps to last tone, octave-1
- System.tone(name, octave) convenience method
- Shruti system now uses 5-limit just intonation ratios instead
of 22-TET approximation. Based on Pythagorean/harmonic ratios
from traditional Indian musicology. Pa is a pure 3/2, Ga is a
pure 5/4.
- System.ratios attribute overrides equal temperament when set
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Calculated edm_start from actual section lengths so pad/sub/sitar2
don't bleed into the tabla solo.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Solo now has 4 distinct parts:
1. Whisper — single hits with space, breath
2. Ghosts emerge — 16th note ghost fills between accents
3. Call and response — dayan vs bayan, 9-tuplet break
4. Blazing — 32nd triplet cascades, rapid alternating hands,
9-against-4 polyrhythm, grand tihai (3x, each louder), slam
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tabla solo with ghost notes, 32nd triplet cascade, tihai, then
slams into house beat. Sitar volume 0.22 → 0.4 in EDM section.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Single score, one reverb space (Taj Mahal), tanpura drone throughout.
Piano arpeggios alone → cello joins → harp/oboe/flute with djembe →
sitar over tabla → EDM section with sitar, synth pad, 808 sub, house
drums. 28 bars, 5 movements.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>