Music Theory for Humans
Project description
Explore music theory, compose multi-part arrangements, and hear them instantly — all in Python.
▶ Try it in your browser — a live demo of what PyTheory can do, nothing to install.
Documentation · PyPI · Changelog · Claude Skill
$ pip install pytheory
$ pytheory demo # hear a generated track right now
Sketch Ideas Fast
from pytheory import Score, Chord, Duration
from pytheory.play import play_score
score = Score("4/4", bpm=140)
score.drums("bossa nova", repeats=4)
chords = score.part("chords", synth="fm", envelope="pad", reverb=0.4)
lead = score.part("lead", synth="saw", envelope="pluck", delay=0.3, lowpass=3000)
bass = score.part("bass", synth="sine", lowpass=500)
for sym in ["Am", "Dm", "E7", "Am"]:
chords.add(Chord.from_symbol(sym), Duration.WHOLE)
chords.add(Chord.from_symbol(sym), Duration.WHOLE)
lead.arpeggio("Am", bars=2, pattern="updown", octaves=2)
lead.arpeggio("Dm", bars=2, pattern="updown", octaves=2)
lead.set(lowpass=5000, reverb=0.4)
lead.arpeggio("E7", bars=2, pattern="up", octaves=2)
lead.arpeggio("Am", bars=2, pattern="updown", octaves=2)
for n in ["A2", "E2", "A2", "C3"] * 4:
bass.add(n, Duration.QUARTER)
play_score(score) # hear it now
score.save_midi("sketch.mid") # open in your DAW
Music Theory
>>> from pytheory import Key, Chord, Tone
>>> Key("C", "major").chords
['C major', 'D minor', 'E minor', 'F major', 'G major', 'A minor', 'B diminished']
>>> [c.symbol for c in Key("G", "major").progression("I", "V", "vi", "IV")]
['G', 'D', 'Em', 'C']
>>> Chord.from_symbol("F#m7b5").identify()
'F# half-diminished 7th'
>>> Tone.from_string("C4").interval_to(Tone.from_string("G4"))
'perfect 5th'
>>> Key("C", "major").pivot_chords(Key("G", "major"))
['A minor', 'B minor', 'C major', 'D major', 'E minor', 'G major']
>>> from pytheory.scales import Scale
>>> Scale.recommend("C", "Eb", "F", "Gb", "G", "Bb", top=3)
[('C', 'blues', 1.0), ...]
Guitar
Chord fingerings, tabs, and scale diagrams for guitar and 24 other stringed instruments:
>>> from pytheory import Fretboard
>>> print(Fretboard.guitar().tab("Am"))
A minor
E|--x--
A|--0--
D|--2--
G|--2--
B|--1--
e|--0--
>>> Fretboard.guitar().chord("G")
Fingering(E=3, A=2, D=0, G=0, B=0, e=3)
Melodies and basslines render to ASCII tablature with part.to_tab(),
and chord charts work in Nashville numbers too.
Composition
Song structure with sections, repeats, and parameter automation:
score = Score("4/4", bpm=124)
score.drums("house", repeats=16, fill="house", fill_every=8)
pad = score.part("pad", synth="supersaw", envelope="pad",
reverb=0.5, chorus=0.3, sidechain=0.85)
lead = score.part("lead", synth="saw", envelope="pluck",
legato=True, glide=0.03, humanize=0.3)
bass = score.part("bass", synth="sine", lowpass=300, sidechain=0.7)
score.section("verse")
# ... add notes ...
score.section("chorus")
lead.set(lowpass=5000, reverb=0.3)
# ... add notes ...
score.end_section()
score.repeat("verse")
score.repeat("chorus", times=2)
Batteries Included
- 56 synth waveforms — the 10 classics (sine, saw, triangle, square, pulse, FM, noise, supersaw, PWM) plus 46 modeled instruments: Rhodes, Wurlitzer, pipe organ, vibraphone, choir, sitar, theremin, and more.
- 100 drum patterns — rock, jazz, bebop, bossa nova, salsa, samba, afrobeat, funk, reggae, house, trap, metal, drum and bass, and 87 more. 37 fill presets, 74 synthesized percussion sounds, stereo panned like a real kit.
- 6 effects with automation — distortion, chorus, lowpass, delay, reverb, and LFO modulation on any parameter. Sidechain compression, master bus compressor/limiter, stereo output.
- Convolution reverb — 7 impulse responses: Taj Mahal (12s), cathedral, plate, spring, cave, parking garage, canyon.
- 6 musical systems — Western, Indian (Hindustani), Arabic (Maqam), Japanese, Blues/Pentatonic, Javanese Gamelan. 40+ scales.
- 83 instrument presets — guitar (8 tunings), bass, ukulele, mandolin family, violin family, banjo, harp, oud, sitar, erhu, and more.
lead = score.part("lead", synth="saw",
distortion=0.7, lowpass=1000, lowpass_q=5.0,
delay=0.3, reverb=0.4, reverb_type="plate")
lead.set(lowpass=4000, distortion=0.9) # automate mid-song
lead.lfo("lowpass", rate=0.5, min=400, max=3000, bars=8) # LFO modulation
Command Line
$ pytheory repl # interactive scratchpad
$ pytheory demo # hear a generated track
$ pytheory key G major # explore a key
$ pytheory identify Cmaj7 # analyze a chord symbol
$ pytheory progression C major I V vi IV # build a progression
$ pytheory midi C major I V vi IV -o out.mid
$ pytheory play Am7 --synth saw --envelope pluck
$ pytheory modes C # show all modes
$ pytheory circle C # circle of fifths
$ pytheory tune --instrument guitar # strobe tuner, string-locked
$ pytheory studio # browser: recording → sheet music
$ pytheory live --link # MIDI synth rig, Ableton Link sync
Live MIDI input and Ableton Link sync are optional extras:
$ pip install "pytheory[live]" # MIDI input (python-rtmidi)
$ pip install "pytheory[link]" # Ableton Link sync
Why Python?
A DAW is great for tweaking sounds. But when you're thinking about music — code is faster than clicking. Sketch ideas, hear them instantly, export MIDI, finish in your DAW.
Tools like Claude Code can use PyTheory to prototype musical ideas from natural language — "write a bossa nova in A minor with a saw lead and reverb" becomes real, playable music.
Talk to it with Claude
PyTheory ships an official Claude Code plugin — six skills that let Claude compose, analyze, and notate music for you. In Claude Code:
/plugin marketplace add kennethreitz/pytheory-skill
/plugin install composing-with-pytheory@pytheory
Then just ask — "write me a bossa nova in G minor", "what's the fingering for F#m7b5?", "turn this hum into a lead sheet". See the guide. For a real album made entirely in PyTheory, hear Interpretations.
Learn More
- playground.pytheory.org — try PyTheory in your browser, nothing to install.
- pytheory.org — guides, API reference, and audio examples.
- pytheory-skill — the official Claude Code plugin (six skills) to make music by talking to Claude.
- ableton-pytheory — drive Ableton Live from PyTheory, for those interested.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytheory-0.53.1.tar.gz.
File metadata
- Download URL: pytheory-0.53.1.tar.gz
- Upload date:
- Size: 307.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52b8ecdd852134f3919d377bcb38aea0f6fb43c3a682b2ee8296d99221e6ccd9
|
|
| MD5 |
7b9ce4e5e51f9ad9f1d6c88519959a22
|
|
| BLAKE2b-256 |
016aef4378cdb85899d29ac5dbaf2bd0391f6df38ec9b6bc143d40de4a2950b9
|
File details
Details for the file pytheory-0.53.1-py3-none-any.whl.
File metadata
- Download URL: pytheory-0.53.1-py3-none-any.whl
- Upload date:
- Size: 258.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ade5785e35e8d84036e153a641cc15893da86a5ce70d158a425bbef27584ac5
|
|
| MD5 |
92113496146dff5b2f9f12ada19580df
|
|
| BLAKE2b-256 |
259ebdd4ac7dd526d4945a43e075961f50a063baa6c7b377f11e16fdfa2d72e2
|