mirror of
https://github.com/kennethreitz/pytheory.git
synced 2026-06-05 23:00:20 +00:00
4f3b706336
- Square wave: chiptune / 8-bit (odd harmonics at 1/n) - Pulse wave: variable duty cycle NES-style timbres - FM synthesis: DX7-style carrier/modulator for bells, e-piano, brass - Noise: white noise for percussion and texture - Supersaw: 7 detuned saws for trance/EDM pads - Refactor Synth enum to string-valued with callable dispatch - All 8 waveforms available via API, Part strings, and CLI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
191 lines
7.7 KiB
ReStructuredText
191 lines
7.7 KiB
ReStructuredText
Changelog
|
||
=========
|
||
|
||
All notable changes to PyTheory are documented here.
|
||
|
||
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
|
||
- CLI play command supports all 8 waveforms
|
||
|
||
0.14.0
|
||
------
|
||
|
||
- Add ``Part`` class for multi-voice Score arrangements (lead, bass, pads, etc.)
|
||
- ``Score.part()`` creates named parts with independent synth, envelope, and volume
|
||
- ``Score.add_pattern()`` for attaching drum patterns
|
||
- ``render_score()`` exported for headless buffer rendering
|
||
- Parts accept raw float beat values alongside ``Duration`` enums
|
||
- All 10 example songs rewritten with drums + chords + lead + bass parts
|
||
|
||
0.13.0
|
||
------
|
||
|
||
- Add drum synthesizer with 27 individual instrument voices (kick, snare, hat, conga, timbale, etc.)
|
||
- Add ``play_pattern()`` for playing drum patterns through the speakers
|
||
- Add ``play_score()`` for playing mixed drum patterns + chord progressions together
|
||
- Every ``DrumSound`` has a dedicated synthesis algorithm (pitch sweeps, noise bursts, membrane resonance, metallic rings)
|
||
|
||
0.12.0
|
||
------
|
||
|
||
- 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``
|
||
- ``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)
|
||
- ``Pattern.to_score()`` renders drum patterns to Score for MIDI export
|
||
|
||
0.11.0
|
||
------
|
||
|
||
- Add drop voicings: ``Chord.close_voicing()``, ``Chord.open_voicing()``, ``Chord.drop2()``, ``Chord.drop3()``
|
||
- Add ``Key.modulation_path(target)`` for chord-by-chord modulation suggestions via pivot chords
|
||
- Add ``Scale.degree_name(n)`` returning traditional names (tonic, dominant, leading tone, etc.)
|
||
- Add ``Chord.extensions()`` to suggest available 9th/11th/13th extensions
|
||
- 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
|
||
|
||
0.10.0
|
||
------
|
||
|
||
- Add ``Scale.fitness()`` to score how well a set of notes fits a scale (0.0–1.0)
|
||
- Add ``Key.suggest_next(chord)`` for chord progression suggestions based on functional harmony
|
||
- Add ``Tone.helmholtz`` and ``Tone.scientific`` properties for alternate pitch notation
|
||
- Add ``Chord.slash(bass)`` and ``Chord.slash_name`` for slash chord notation (C/G, Am/E)
|
||
- Add ``save_midi()`` for exporting tones, chords, and progressions as Standard MIDI Files
|
||
- Add chord tone highlighting in ``Fretboard.scale_diagram()`` — chord tones uppercase, passing tones lowercase
|
||
- Extend ``Chord.analyze()`` to recognize borrowed chords (bVI, bVII, bIII, etc.)
|
||
|
||
0.9.0
|
||
-----
|
||
|
||
- Add ADSR envelope system with 8 presets: ``Envelope.PIANO``, ``ORGAN``, ``PLUCK``, ``PAD``, ``STRINGS``, ``BELL``, ``STACCATO``, ``NONE``
|
||
- Add ``Chord.from_symbol()`` parser — handles any standard chord symbol (e.g. "F#m7b5", "Bbmaj9", "Gsus4") without lookup tables
|
||
- Add ``Key.pivot_chords(target)`` for finding modulation pivot chords between two keys
|
||
- Add ``Scale.parallel_modes()`` to show all modes sharing the same notes (C major → D dorian, E phrygian, etc.)
|
||
- Add ``Tone.cents_difference(other)`` for measuring fine pitch differences in cents
|
||
- Add ``--envelope`` flag to CLI play command
|
||
- CLI play command now uses ``Chord.from_symbol()`` for broader chord parsing
|
||
- Replace hardcoded ``c_index = 3`` with named ``C_INDEX`` constant throughout
|
||
|
||
0.8.3
|
||
-----
|
||
|
||
- Add ``Chord.symbol`` property for standard shorthand notation (Cmaj7, Dm, G7, m7b5, etc.)
|
||
- Add ``Key.common_progressions()`` to realize all named progressions in a key
|
||
- Add CLI commands: ``modes``, ``circle``, ``progressions``
|
||
|
||
0.8.2
|
||
-----
|
||
|
||
- Use flat spellings in CHARTS ``acceptable_tone_names`` (e.g. Bbm now shows Bb/Db/F instead of A#/C#/F)
|
||
|
||
0.8.1
|
||
-----
|
||
|
||
- Use musically correct flat spellings in flat keys (F major gives Bb, not A#)
|
||
|
||
0.8.0
|
||
-----
|
||
|
||
- Add ``Fretboard.scale_diagram()`` for visual scale layouts on any instrument
|
||
- Add ``play_progression()`` for sequential chord playback with gaps
|
||
- Add cookbook documentation page with practical recipes
|
||
- Curated guitar fingering overrides for common open chords
|
||
- Fingering memoization with bounded cache, barre detection, 4-fret span constraint
|
||
- API ergonomics: ``Fretboard.chord()``, convenience constructors, slow test markers
|
||
|
||
0.7.0
|
||
-----
|
||
|
||
- Add ``Fretboard.chord()`` method for named chord lookups
|
||
- Improve fingering algorithm with better voicing selection
|
||
- Rewrite all documentation in REPL style with verified output
|
||
|
||
0.6.1
|
||
-----
|
||
|
||
- Fix sawtooth and triangle wave generation
|
||
- Add WAV export via ``save()``
|
||
- Add CLI tests and play module tests
|
||
- Skip play module tests when PortAudio is not available
|
||
|
||
0.6.0
|
||
-----
|
||
|
||
- Support flat note names (Db, Bb, Eb, etc.) throughout the system
|
||
- Add ``Fingering`` class for labeled chord fingerings
|
||
- Add ``pytheory play`` CLI command for playing notes and chords
|
||
- Add 12 example scripts showcasing pytheory features
|
||
- Expand documentation with undocumented features and CLI guide
|
||
|
||
0.4.1
|
||
-----
|
||
|
||
- Add ``--temperament`` flag to CLI tone command
|
||
- Add Symbolic Pitch section to tones docs
|
||
|
||
0.4.0
|
||
-----
|
||
|
||
- Add key signatures, scale diagrams, chord building, and progression analysis
|
||
- Add CLI tool (``pytheory tone``, ``pytheory chord``, ``pytheory key``, etc.)
|
||
- Add Jupyter notebook tutorial
|
||
- Improve test coverage from 93% to 97% (476 tests)
|
||
- Add type hints, docstrings, and property caching throughout
|
||
|
||
0.3.2
|
||
-----
|
||
|
||
- Add type hints and docstrings throughout the library
|
||
|
||
0.3.1
|
||
-----
|
||
|
||
- Add capo support, chord merging (``+``), tritone substitution
|
||
- Add secondary dominants, Nashville number system
|
||
- Add more common progressions (blues, jazz, flamenco, modal)
|
||
|
||
0.3.0
|
||
-----
|
||
|
||
- Add interval naming (``Tone.interval_to()``)
|
||
- Add MIDI conversion (``Tone.midi``, ``Tone.from_midi()``)
|
||
- Add ``Tone.from_frequency()``, ``Tone.transpose()``
|
||
- Add ``Chord.root``, ``Chord.quality`` properties
|
||
- Add ``Chord.from_name()``, ``Chord.from_intervals()``, ``Chord.from_midi_message()``
|
||
- Add ``Interval`` constants (MINOR_THIRD, PERFECT_FIFTH, etc.)
|
||
- Add ``PROGRESSIONS`` dict with common named progressions
|
||
- Add ``Tone.enharmonic`` property
|
||
- Add inversions, harmonize, and Roman numeral progressions
|
||
- Add ``Key`` class with detection, signatures, relative/parallel keys
|
||
- Add ``Scale.detect()`` and ``Chord.from_tones()`` convenience constructors
|
||
- Add 25 instrument presets (mandolin family, violin family, banjo, harp, world instruments, keyboard)
|
||
- Add ``Tone.circle_of_fifths()`` and ``Tone.circle_of_fourths()``
|
||
- Add chord identification (17 types), voice leading, tension scoring
|
||
- Add beat frequencies, Plomp-Levelt dissonance model, harmony scoring
|
||
|
||
0.2.0
|
||
-----
|
||
|
||
- Add ``Fretboard`` class for guitar fretboards
|
||
- Add ``play()`` function with sine, sawtooth, and triangle wave synthesis
|
||
- Add chord harmony and dissonance calculations
|
||
- Modernize project structure (pyproject.toml, sounddevice)
|
||
|
||
0.1.0
|
||
-----
|
||
|
||
- Initial release
|
||
- Western 12-tone system with tones, scales, and basic chord support
|
||
- Temperament support (equal, Pythagorean, meantone)
|
||
- Indian (Hindustani), Arabic, Japanese, Blues, and Gamelan systems
|