Commit Graph

100 Commits

Author SHA1 Message Date
kennethreitz fdb724f788 Fix RST inline markup: remove bold wrapping around links
RST cannot nest inline markup — **`link <url>`_** renders the raw
markup instead of a clickable link. Removed all 37 instances across
5 guide pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:39:58 -04:00
kennethreitz 245a8a1257 Add Wikipedia links throughout docs, showcase dissonance API, update copyright
- Link key music theory terms to Wikipedia across all guide pages
- Physics of Consonance section now demos .harmony, .dissonance,
  .tension, and .beat_frequencies with code examples
- Copyright updated to 2026

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:35:40 -04:00
kennethreitz 4ab8be49a5 Add Music Theory Fundamentals page and deepen theory throughout docs
New: Music Theory Fundamentals guide covering:
- Sound and pitch (frequency ranges, logarithmic perception)
- Why twelve notes (harmonic series, Pythagorean comma)
- Intervals as atoms of music (size, quality, perfect vs major/minor)
- Keys and key signatures (sharp/flat key tables, FCGDAEB mnemonic)
- Functional harmony (tonic/subdominant/dominant, T-S-D-T)
- The dominant seventh (leading tone, tritone resolution)
- Rhythm and meter (4/4, 3/4, 6/8, odd meters)
- Physics of consonance (waveform alignment, cultural context)

Enriched existing pages:
- Tones: overtone series table, enharmonic equivalents and spelling rules
- Scales: 12-bar blues, parallel major/minor, borrowed chords,
  more progression examples with song references
- Chords: inversions (root/1st/2nd/3rd), extended chords (9ths/11ths/13ths)

Also: add Gauges analytics tracking to all pages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:29:16 -04:00
kennethreitz 427a3fc3b1 Add Tone.circle_of_fifths() and Tone.circle_of_fourths()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:26:15 -04:00
kennethreitz c3f9e98332 Add chord identification, voice leading, harmonic analysis, tension, overtones
New features:
- Chord.identify(): name any chord (17 patterns — triads, 7ths, 9ths, sus, power)
- Chord.voice_leading(other): find smoothest voice motion between chords
- Chord.analyze(key): Roman numeral analysis (I, ii, V7, etc.)
- Chord.tension: score with tritone count, dominant function detection
- Tone.overtones(n): harmonic series frequencies

Also:
- Rewrite README with all current features and docs link
- Add all new features to chords guide with music theory context
- Remove logo from docs sidebar
- 296 tests passing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:25:31 -04:00
kennethreitz e1c2ef03d7 Comprehensive music theory documentation pass
Every guide page rewritten with deep music theory content:

- Tones: scientific pitch notation, frequency/pitch relationship,
  temperament history (equal/Pythagorean/meantone), interval table
  with song examples, circle of fifths
- Scales: interval pattern construction, major/minor/harmonic minor
  theory, all 7 modes with character descriptions and song references,
  scale degree names and functions, diatonic harmony and common
  chord progressions (I-IV-V, I-V-vi-IV, ii-V-I)
- Chords: triad and seventh chord construction tables, all 12 chord
  qualities with interval formulas, consonance/dissonance theory
  (Pythagoras to Plomp-Levelt), beat frequency perceptual ranges
- Fretboard: how frets work, string interval explanation, reading
  fingering notation, 8 alternate tunings with musical context,
  custom instrument examples (banjo, mandolin)
- Playback: waveform physics (harmonics, Fourier), temperament
  listening guide
- Quickstart: updated feature list (6 systems, 40+ scales, 144 chords)
- Fix duplicate logo/title in sidebar

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:20:01 -04:00
kennethreitz 21cd99425b Add Blues/Pentatonic and Javanese Gamelan systems
Blues: major/minor pentatonic, blues scale, major blues, dominant,
  minor (Dorian). The foundational scales of blues, rock, and jazz.

Gamelan: slendro (5-tone equidistant), pelog (7-tone with 3 pathet
  subsets: nem, barang, lima). 12-TET approximations of Javanese
  gamelan tuning with traditional tone names (ji, ro, lu, pat, mo,
  nem, pi/barang).

Total systems: 6 (western, indian, arabic, japanese, blues, gamelan)
277 tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:15:11 -04:00
kennethreitz 69ddb1eb64 Rewrite chord analysis with musically accurate models
intervals: now returns semitone counts (integers) instead of Hz
  differences — octave-invariant and musically meaningful

harmony: frequency ratio simplicity model — reduces each pairwise
  frequency ratio to simplest form and scores by 1/(num+denom).
  Simple ratios (octave 2:1, fifth 3:2) score highest.

dissonance: Plomp-Levelt roughness with Bark-scale critical bandwidth
  (Zwicker & Terhardt 1980). Models sensory roughness from interfering
  fundamentals — peaks when freq difference ≈ critical bandwidth.

beat_frequencies: new property returning all pairwise beat frequencies
  as sorted (tone, tone, hz) tuples

beat_pulse: returns smallest non-zero beat frequency (most perceptible)

All properties have detailed docstrings with psychoacoustic references,
perceptual ranges, and usage examples.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:13:05 -04:00
kennethreitz 23c17589eb Simplify installation instructions in docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:07:57 -04:00
kennethreitz e09dfe70b8 Remove redundant title below logo in docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:07:31 -04:00
kennethreitz cceac40a88 Add Arabic and Japanese systems, guitar tuning presets, logo, systems docs
New systems:
- Arabic (Maqam): 10 maqamat (ajam, hijaz, nahawand, nikriz, saba, etc.)
  with Arabic solfège tone names (Do, Re, Mi, Fa, Sol, La, Si)
- Japanese: 6 pentatonic scales (hirajoshi, in, yo, iwato, kumoi, insen)
  and 2 heptatonic scales (ritsu, ryo)

Fretboard improvements:
- Fretboard.guitar() now accepts tuning parameter
- Built-in tunings: standard, drop d, open g, open d, open e, open a,
  dadgad, half step down
- Custom tuning via tuple: Fretboard.guitar(("E4", "B3", ...))
- Fretboard.bass(five_string=True) for 5-string bass

Docs:
- Add Musical Systems guide page with all 4 systems
- Add logo to docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:06:17 -04:00
kennethreitz da08d30e8d Add Indian classical (Hindustani) music system with 10 thaats
- 12 swaras: Sa, komal Re, Re, komal Ga, Ga, Ma, tivra Ma, Pa, komal Dha, Dha, komal Ni, Ni
- 10 thaats (parent scales): Bilawal, Khamaj, Kafi, Asavari, Bhairavi,
  Kalyan, Bhairav, Poorvi, Marwa, Todi
- Extends generate_scale to accept direct interval patterns
- Sa maps to C's pitch position (Sa4 = 261.63 Hz)
- 17 new tests for Indian system

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:00:00 -04:00
kennethreitz e79b3ac15e Add CNAME for pytheory.kennethreitz.org
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:53:59 -04:00
kennethreitz cb3fd4526a Fix docs build: mock sounddevice for environments without PortAudio
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:52:50 -04:00
kennethreitz 7229399135 Add GitHub Pages deployment for Sphinx docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:51:55 -04:00
kennethreitz 0d740cd6fe Merge pull request #35 from kennethreitz/improvements
Fix music theory accuracy and core bugs
2026-03-22 05:49:33 -04:00
kennethreitz 3142872533 Add root Makefile with docs and test targets
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:48:54 -04:00
kennethreitz 4a77f9163e Add Sphinx documentation with alabaster theme
- User guide: quickstart, tones, scales, chords, fretboard, playback
- API reference: autodoc for all modules
- alabaster theme with Napoleon for Google/NumPy docstrings
- Update project description in pyproject.toml
- Add sphinx to docs dependency group

Build with: uv run --group docs sphinx-build -b html docs docs/_build/html

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:47:20 -04:00
kennethreitz 3d58f837a2 Fix CI: gracefully handle missing PortAudio, skip play tests
- Make play module import optional in __init__.py (PortAudio may not
  be installed in CI environments)
- Skip wave generation and synth tests when PortAudio unavailable

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:43:29 -04:00
kennethreitz cd8ace3020 Add Pythonic API improvements across the library
Tone:
- Add + operator for semitone addition (C4 + 7 → G4)
- Add - operator for subtraction and interval measurement (G4 - C4 → 7)
- Add <, <=, >, >= comparison by pitch frequency
- Add str() support (str(tone) → "C4")
- Add .frequency property as shorthand for .pitch()
- Tones are now sortable: sorted([G4, C4, E4]) works

Scale:
- Add iteration: for tone in scale
- Add len(): len(scale) → 8
- Add "in" operator: "C" in scale, tone in scale
- Add .note_names property
- Add .chord(*degrees) to build chords from scale degrees
- Add .triad(root) to build triads with octave wrapping

Chord:
- Add iteration: for tone in chord
- Add len(): len(chord) → 3
- Add "in" operator: "C" in chord

Fretboard:
- Add .guitar() classmethod for standard tuning
- Add .bass() classmethod for standard bass tuning
- Add .ukulele() classmethod for standard ukulele tuning
- Add iteration and len()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:42:29 -04:00
kennethreitz fde1011194 Expand test suite to 178 tests and fix additional bugs
- Add pytest as dev dependency in pyproject.toml
- Fix sawtooth_wave: numpy.linspace requires int for num parameter
- Fix Scale.degree() lookup by name ("tonic", "dominant") was broken
- Add tests for: Tone.from_tuple, from_index, _index, error paths,
  multi-octave arithmetic, descending chromatic walk, all pitch frequencies,
  Pythagorean temperament, all scale degrees by Roman numeral and name,
  Scale repr/slice/degrees mismatch, TonedScale repr/get/with-Tone-object,
  D/F/A/E/B major/minor scales, D Dorian, G Mixolydian, octave boundary
  crossing, all mode intervals including Phrygian/Aeolian/Locrian/Ionian,
  chord intervals/beat_pulse/empty chord, Chord/Fretboard fingering errors,
  all NamedChord qualities (m6/m9/maj9/9), fix_fingering, flat-to-sharp
  conversion, charts total count, charts_for_fretboard, all wave generators,
  wave output types, Synth with real pitches, circle of fifths/fourths,
  relative minor equivalence, enharmonic equivalence in scales, I-IV-V
  progression integration test

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:39:12 -04:00
kennethreitz bc8dede856 Add CI workflow with pytest across Python 3.10-3.13
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:35:12 -04:00
kennethreitz dff12678ba Fix music theory accuracy and core bugs across the library
- Fix Tone.__init__ overwriting explicit octave kwarg when parsing name
- Fix Tone.__eq__ calling names as attribute instead of method, add __hash__
- Fix octave arithmetic to use C-based boundaries (scientific pitch notation)
- Fix pitch() to account for octave (was ignoring it entirely)
- Fix modal scale generation: modes were overwritten due to DEGREES loop bug
- Fix modal offset rotation off-by-one in generate_scale
- Fix scales._scales property being called as function
- Fix chord intervals: major/minor thirds were swapped, added missing chord tones
- Remove broken duplicate NamedChord class in chords.py
- Expand test suite from 11 to 83 tests covering tones, scales, modes, chords,
  pitches, fingerings, and intervals

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 05:34:11 -04:00
kennethreitz 43f7271394 Create FUNDING.yml 2024-11-17 06:28:04 -05:00
kennethreitz f93a6127ba Delete .github/FUNDING.yml 2024-11-05 11:21:15 -05:00
kennethreitz 98ea64640d Refactor hello.py to rename it to examples/chord_charts.py and improve chord chart display and playback 2024-11-05 11:20:43 -05:00
kennethreitz 1e31196e19 Bump version to 0.2.0 in pyproject.toml 2024-11-05 10:54:11 -05:00
kennethreitz 399c517226 Refactor hello.py to display standard guitar chord charts and add C minor chord playback 2024-11-05 10:52:48 -05:00
kennethreitz 08d14b0802 Refactor hello.py to display standard guitar chord charts 2024-11-05 10:38:41 -05:00
kennethreitz 3ca8f541c8 Refactor imports to optimize module usage 2024-11-05 10:29:33 -05:00
kennethreitz 44c1ea8ec6 Refactor hello.py to add C minor chord playback 2024-11-05 10:29:28 -05:00
kennethreitz 658659ca7b Refactor play.py to add play function for playing tones or chords 2024-11-05 10:22:51 -05:00
kennethreitz ad390467b9 Refactor play.py to add triangle_wave function for triangle wave synthesis 2024-11-05 10:22:34 -05:00
kennethreitz e902228912 Refactor Chord class to add fingering method for custom chord positions 2024-11-05 10:16:31 -05:00
kennethreitz 71e78934ee Refactor Chord class to calculate beat pulse between tones 2024-11-05 10:02:54 -05:00
kennethreitz 76f16938d6 Refactor chord and tone classes for improved readability and maintainability 2024-11-05 09:59:00 -05:00
kennethreitz 91b25e22d1 Update project dependencies: Replace pygame with sounddevice 2024-11-05 09:50:23 -05:00
kennethreitz b1edecc291 refactor: Update .gitignore to ignore pytheory.egg-info 2024-11-05 09:48:49 -05:00
kennethreitz 27a46fa9be refactor: Update project dependencies and package structure 2024-11-05 09:48:35 -05:00
kennethreitz cb6ec2e6d1 Remove Makefile 2024-11-05 09:47:15 -05:00
kennethreitz 442ff56df4 refactor: Ignore Python cache files in .gitignore 2024-11-05 09:46:29 -05:00
kennethreitz c200101a5f refactor: Update project dependencies
- Remove Pipfile and add pyproject.toml
- Update project dependencies in pyproject.toml
2024-11-05 09:46:09 -05:00
kennethreitz af1a9b2f74 chore: Add Fretboard class for creating guitar fretboards 2024-07-28 23:59:06 -04:00
kennethreitz c3e085e441 feat: Add dissonance calculation to Chord class 2024-07-25 19:32:41 -04:00
kennethreitz bfef3f5b2c refactor: add harmony calculation to Chord class 2024-07-25 19:27:01 -04:00
kennethreitz 99d5a57f77 Update FUNDING.yml 2024-02-08 17:54:27 -05:00
kennethreitz 3135c09708 pipfile, pipfile.lock 2023-12-13 09:16:56 -05:00
kennethreitz 97243de7b8 Merge pull request #33 from kennethreitz/dependabot/pip/mpmath-1.3.0
Bump mpmath from 1.2.1 to 1.3.0
2023-12-13 09:14:08 -05:00
dependabot[bot] 035cb0837a Bump mpmath from 1.2.1 to 1.3.0
Bumps [mpmath](https://github.com/fredrik-johansson/mpmath) from 1.2.1 to 1.3.0.
- [Release notes](https://github.com/fredrik-johansson/mpmath/releases)
- [Changelog](https://github.com/mpmath/mpmath/blob/master/CHANGES)
- [Commits](https://github.com/fredrik-johansson/mpmath/compare/1.2.1...1.3.0)

---
updated-dependencies:
- dependency-name: mpmath
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-22 16:26:17 +00:00
kennethreitz 39aa185f19 Merge pull request #27 from monovon/patch-1
Fix: minor language mistake
2022-07-10 09:39:19 -04:00