From 30dacc4fbfa74559e6c16dd326fcfc197294abd2 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Wed, 25 Mar 2026 21:36:22 -0400 Subject: [PATCH] Sync docs changelog with CHANGELOG.md (0.15.1 through 0.25.4) Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/changelog.rst | 172 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 167 insertions(+), 5 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 6fb1057..077d77b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -3,12 +3,160 @@ Changelog All notable changes to PyTheory are documented here. + + +0.25.4 +------ + +- Add master bus compressor/limiter — louder, punchier, more cohesive mixes +- Feed-forward compression with configurable threshold, ratio, attack, release +- Makeup gain restores loudness after compression +- Brick-wall limiter at 0.95 prevents clipping +- Replaces simple normalization in render_score() + +0.25.3 +------ + +- Add ``pytheory repl`` — interactive music theory scratchpad and composition tool +- Context-aware prompt shows key, bpm, drums, active part + effects +- Theory commands: key, chords, modes, scales, circle, interval, identify, system +- Composition: drums, part, add, rest, arp, prog, effects, automation, LFO +- Guitar: fingering, scale diagram +- 6 musical systems with correct default tonics +- REPL guide documentation + +0.25.1 +------ + +- Add ``pytheory demo`` CLI command — plays a randomly generated track, different every time +- Rewrite README to showcase the full feature set (composition, effects, drums, MIDI export) + +0.25.0 +------ + +- Add sidechain compression — kick ducks pad/bass for the classic EDM pump effect +- Add song structure: ``score.section("verse")``, ``score.section("chorus")``, ``score.repeat("verse")`` +- Punchier kick drum: 808-style with faster pitch sweep (200→45Hz), sub thump, and soft saturation +- Section repeat copies all part notes, drum hits, and automation with proper offset + +0.24.1 +------ + +- Add ``humanize`` parameter on Parts — random micro-timing and velocity variation +- Makes programmed parts feel like a real player (0.1 = subtle, 0.3 = natural, 0.5+ = loose) + +0.24.0 +------ + +- Add per-note velocity: ``lead.add("C5", Duration.QUARTER, velocity=90)`` — dynamics, accents, ghost notes +- Add swing/groove: ``Score("4/4", bpm=120, swing=0.5)`` — shuffles every other note for human feel +- Add tempo changes mid-song: ``score.set_tempo(140)`` — accelerando, ritardando, tempo drops +- Add ``Part.fade_in(bars)`` and ``Part.fade_out(bars)`` — volume envelopes over sections +- Arpeggiator supports velocity parameter +- Per-part swing override (set independently from score swing) +- Tempo map engine: beat-to-sample conversion handles variable BPM throughout a score + +0.23.0 +------ + +- Add convolution reverb with 7 synthetic impulse responses: Taj Mahal, cathedral, plate, spring, cave, parking garage, canyon +- Each IR models real acoustic properties: early reflections, frequency-dependent absorption, diffusion density, and modulation +- FFT-based convolution via ``scipy.signal.fftconvolve`` for fast processing even with long tails (12s Taj Mahal) +- Select via ``reverb_type`` parameter on ``Score.part()`` — drop-in alongside existing algorithmic reverb +- IR cache for zero-cost reuse across parts +- Automatable via ``Part.set(reverb_type="cathedral")`` mid-song + +0.22.0 +------ + +- Add ``Part.lfo()`` for automated parameter modulation (filter sweeps, tremolo, auto-wah) +- 4 LFO shapes: sine, triangle, saw, square +- Configurable rate (cycles per bar), min/max range, duration, and resolution +- Stack multiple LFOs on different parameters for complex modulation + +0.21.0 +------ + +- Add ``Part.set()`` for mid-song effect automation (filter sweeps, reverb swells, distortion kicks) +- Add chorus effect (LFO-modulated delay, Juno-style) +- Renderer segments audio at automation points for per-section effect processing +- Updated effect chain: distortion → chorus → lowpass → delay → reverb +- Document automation, chorus, and updated signal chain + +0.20.0 +------ + +- Add ``Part.arpeggio()`` — arpeggiator with up/down/updown/downup/random patterns, octave spanning +- Fix Roman numeral parser to handle flat/sharp degree prefixes (bVI, bVII, bIII, #IV) +- Add ``song_showoff.py`` — generative composition that's different every time, uses every feature +- 4 mood palettes (dark, bright, ethereal, aggressive) with matched keys, progressions, drums, and effects + +0.19.1 +------ + +- Add ``Part.arpeggio()`` — arpeggiator with up/down/updown/downup/random patterns, octave spanning, and division control +- Arpeggiator chains with legato + glide for classic acid/trance sequencer sound +- Rename rhythm docs to "Sequencing: Rhythm and Scores" +- Document arpeggiator, legato, and glide in rhythm guide + +0.19.0 +------ + +- Add legato mode for parts — continuous waveform without retriggering envelope per note +- Add glide/portamento — smooth pitch slides between consecutive notes (303-style) +- Legato renders entire phrase as one oscillator with phase-accumulating frequency changes +- Glide uses exponential interpolation for perceptually linear pitch slides + +0.18.1 +------ + +- Add distortion effect (tanh soft-clip waveshaping) with drive and mix controls +- 3 new example songs: Dub Delay Madness (separate delay snare), Liquid DnB (174bpm), Late Night Texts (Drake-style trap) +- 16 total songs in the song player + +0.18.0 +------ + +- Add per-part audio effects: reverb, delay, and lowpass filter +- Reverb: Schroeder algorithm with configurable mix and decay +- Delay: tempo-synced echoes with feedback control +- Lowpass: 12 dB/octave biquad filter with resonance (Q) control +- All effects set at part creation: ``score.part("lead", reverb=0.3, delay=0.25, lowpass=2000, lowpass_q=1.5)`` +- Effects applied per-part before mixing for independent processing + +0.17.0 +------ + +- Add 10 new groove presets: country, ska, dub, jungle, techno, gospel, swing, bolero, tango, flamenco (58 total) +- Add 10 new fill presets: reggae, afrobeat, bossa nova, house, trap, hip hop, disco, cumbia, highlife, second line (21 total) +- Every major genre family now has matching groove + fill presets + +0.16.0 +------ + +- Add drum fill system with 11 genre-specific presets: rock, rock crash, jazz, jazz brush, salsa, samba, funk, metal, blast, buildup, breakdown +- ``Pattern.fill("rock")`` returns a 1-bar fill pattern +- ``Score.fill("rock")`` inserts a fill at the current position +- ``Score.drums("rock", repeats=8, fill="rock", fill_every=4)`` auto-fills every Nth bar +- Without ``fill_every``, fill replaces only the last bar + +0.15.1 +------ + +- Add ``Synth.PWM_SLOW`` and ``Synth.PWM_FAST`` — pulse width modulation with LFO sweep (Juno-style pads) +- Add ``Score.drums()`` shorthand for ``score.add_pattern(Pattern.preset(...), repeats=...)`` +- Update all docs to use ``score.drums()`` syntax and document all 10 synth waveforms + 0.15.0 ------ - Add 5 new synth waveforms: ``Synth.SQUARE``, ``Synth.PULSE``, ``Synth.FM``, ``Synth.NOISE``, ``Synth.SUPERSAW`` -- Square wave (chiptune), pulse wave (NES), FM synthesis (DX7), white noise, supersaw (trance pads) -- All 8 synths available in API and Part strings +- Square wave: classic chiptune / 8-bit sound (odd harmonics at 1/n) +- Pulse wave: variable duty cycle for NES-style timbres (25%, 12.5%) +- FM synthesis: DX7-style frequency modulation (electric piano, bells, brass, metallic) +- Noise: white noise for percussion textures and effects +- Supersaw: 7 detuned saw oscillators for trance/EDM pads +- All 8 synths available in both the API (``Synth.FM``) and Part strings (``synth="fm"``) - CLI play command supports all 8 waveforms 0.14.0 @@ -21,6 +169,11 @@ All notable changes to PyTheory are documented here. - Parts accept raw float beat values alongside ``Duration`` enums - All 10 example songs rewritten with drums + chords + lead + bass parts +0.13.1 +------ + +- Fix drum pattern repeats: hits now correctly offset across cycles instead of piling up on the first bar + 0.13.0 ------ @@ -34,11 +187,20 @@ All notable changes to PyTheory are documented here. - Add rhythm module: ``Duration``, ``TimeSignature``, ``Note``, ``Rest``, ``Score`` - ``Duration`` enum with 8 note lengths (whole through sixteenth, dotted, triplet) -- ``TimeSignature`` with string parsing ("4/4", "3/4", "6/8", "12/8") and ``beats_per_measure`` +- ``TimeSignature`` with string parsing ("4/4", "3/4", "6/8", "12/8") and beats_per_measure - ``Score`` class with fluent ``.add()`` / ``.rest()`` chaining, measure counting, and ``save_midi()`` export - Measure-aware MIDI export with proper time signature and tempo meta events - Add ``DrumSound`` enum with 27 General MIDI percussion sounds -- Add ``Pattern`` class with 48 drum pattern presets (rock, jazz, bebop, salsa, bossa nova, samba, afrobeat, funk, reggae, house, trap, metal, and many more) +- Add ``Pattern`` class with 48 drum pattern presets covering: + - **Rock/Pop**: rock, half time, double time, disco, motown, train beat + - **Jazz**: jazz, bebop, shuffle, linear, paradiddle + - **Latin**: salsa, bossa nova, samba, cumbia, merengue, baiao, maracatu + - **Afro-Cuban**: son clave 3-2/2-3, rumba clave 3-2/2-3, cascara, guaguanco, mozambique, nanigo, bembe, 6/8 afro-cuban, tresillo, habanera + - **African**: afrobeat, highlife + - **Caribbean**: reggae, dancehall + - **Electronic**: house, trap, drum and bass, breakbeat + - **Metal/Punk**: metal, blast beat, punk + - **Other**: funk, hip hop, bo diddley, second line, new orleans, waltz, 12/8 blues - ``Pattern.to_score()`` renders drum patterns to Score for MIDI export 0.11.0 @@ -51,7 +213,7 @@ All notable changes to PyTheory are documented here. - Add ``Tone.solfege`` property for fixed-Do solfege syllables (Do, Re, Mi, Fi, etc.) - Add CLI ``identify`` command for full chord analysis from a symbol - Add CLI ``midi`` command for exporting progressions to Standard MIDI Files -- Expand documentation with all features from v0.9.0–v0.11.0 +- Expand documentation: solfege, Helmholtz, cents, slash chords, drop voicings, chord extensions, borrowed chord analysis, ADSR envelopes, MIDI export, new CLI commands 0.10.0 ------