Skip to main content

Music Theory for Humans

Project description

PyTheory: Music Theory for Humans

This library makes exploring music theory approachable and fun, treating Python as a musical instrument.

Installation

$ pip install pytheory

Tones

>>> from pytheory import Tone

>>> c4 = Tone.from_string("C4", system="western")
>>> c4.frequency
261.63

>>> c4 + 7                # perfect fifth
<Tone G4>

>>> c4.interval_to(c4 + 7)
'perfect 5th'

>>> c4.midi
60

>>> Tone.from_frequency(440)
<Tone A4>

>>> Tone.from_midi(69)
<Tone A4>

Scales and Modes

>>> from pytheory import TonedScale

>>> c_major = TonedScale(tonic="C4")["major"]
>>> c_major.note_names
['C', 'D', 'E', 'F', 'G', 'A', 'B', 'C']

>>> TonedScale(tonic="C4")["dorian"].note_names
['C', 'D', 'D#', 'F', 'G', 'A', 'A#', 'C']

Diatonic Harmony

>>> c_major.triad(0).identify()
'C major'

>>> c_major.seventh(4).identify()
'G dominant 7th'

>>> [c.identify() for c in c_major.harmonize()]
['C major', 'D minor', 'E minor', 'F major', 'G major', 'A minor', 'B diminished']

>>> [c.identify() for c in c_major.progression("I", "V", "vi", "IV")]
['C major', 'G major', 'A minor', 'F major']

Chord Analysis

>>> from pytheory import Chord, Tone

>>> C4 = Tone.from_string("C4", system="western")
>>> G4 = Tone.from_string("G4", system="western")

>>> g7 = Chord([G4, G4+4, G4+7, G4+10])
>>> g7.identify()
'G dominant 7th'

>>> g7.analyze("C")
'V7'

>>> g7.tension
{'score': 0.6, 'tritones': 1, 'minor_seconds': 0, 'has_dominant_function': True}

>>> g7.transpose(-7).identify()
'C dominant 7th'

Six Musical Systems

>>> from pytheory import TonedScale

>>> TonedScale(tonic="Sa4", system="indian")["bhairav"].note_names
['Sa', 'komal Re', 'Ga', 'Ma', 'Pa', 'komal Dha', 'Ni', 'Sa']

>>> TonedScale(tonic="Do4", system="arabic")["hijaz"].note_names
['Do', 'Reb', 'Mi', 'Fa', 'Sol', 'Solb', 'Sib', 'Do']

>>> TonedScale(tonic="C4", system="japanese")["hirajoshi"].note_names
['C', 'D', 'D#', 'G', 'G#', 'C']

>>> TonedScale(tonic="C4", system="blues")["blues"].note_names
['C', 'D#', 'F', 'F#', 'G', 'A#', 'C']

25 Instrument Presets

>>> from pytheory import Fretboard, CHARTS

>>> Fretboard.guitar()                # standard tuning
>>> Fretboard.guitar("drop d")        # 8 alternate tunings
>>> Fretboard.mandolin()              # + mandola, octave mandolin, mandocello
>>> Fretboard.violin()                # + viola, cello, double bass
>>> Fretboard.ukulele()               # + banjo, harp, charango, erhu...
>>> Fretboard.keyboard()              # 88-key piano
>>> Fretboard.keyboard(25, "C3")      # 25-key MIDI controller

>>> CHARTS['western']['Am'].fingering(fretboard=Fretboard.guitar())
(0, 1, 2, 2, 0, 0)

Audio Playback

>>> from pytheory import play, Synth, Tone

>>> tone = Tone.from_string("A4", system="western")
>>> play(tone, t=1_000)                   # sine wave, 1 second
>>> play(tone, synth=Synth.SAW, t=1_000)  # sawtooth wave

Features

  • 6 musical systems: Western, Indian (Hindustani), Arabic (Maqam), Japanese, Blues/Pentatonic, Javanese Gamelan
  • 40+ scales: major, minor, harmonic minor, 7 modes, 10 thaats, 10 maqamat, pentatonic, blues, hirajoshi, pelog, slendro, and more
  • Chord analysis: identification (17 types), Roman numeral analysis, tension scoring, voice leading, Plomp-Levelt dissonance, beat frequencies
  • Diatonic harmony: triads, seventh chords, harmonize entire scales, build progressions from Roman numerals
  • 25 instrument presets: guitar (8 tunings), 12-string, bass, mandolin family, violin family, banjo, harp, oud, sitar, shamisen, erhu, charango, pipa, balalaika, lute, pedal steel, keyboard
  • Pitch tools: frequency ↔ tone conversion, MIDI ↔ tone, interval naming, circle of fifths, overtone series, transposition
  • 3 temperaments: equal, Pythagorean, quarter-comma meantone
  • Audio synthesis: sine, sawtooth, and triangle wave playback

Documentation

Full documentation with music theory guides: pytheory.kennethreitz.org

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

pytheory-0.5.1.tar.gz (36.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytheory-0.5.1-py3-none-any.whl (38.1 kB view details)

Uploaded Python 3

File details

Details for the file pytheory-0.5.1.tar.gz.

File metadata

  • Download URL: pytheory-0.5.1.tar.gz
  • Upload date:
  • Size: 36.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pytheory-0.5.1.tar.gz
Algorithm Hash digest
SHA256 19590b8cb0cd524afd0c8839cad5cbb42ac709f19e0c9cc3b98fa8efc66fba7f
MD5 0ed05b4093433762a9bf8eb630b3b42b
BLAKE2b-256 72b4935b81581b516d7241d39ac941f4be2b27076e3424865eba37d013a19be5

See more details on using hashes here.

File details

Details for the file pytheory-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: pytheory-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 38.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pytheory-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f09e66865ee9ef576f3a9cded4a336ba5fb854d71d5759abb4aea316975fa11e
MD5 c74811309f8e2b8e4ca84c41e71c031f
BLAKE2b-256 4e94f048ffb0337515ef20d6c52855dd95dabd3eb0f65c4166d092a63f67d3a2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page