Skip to main content

Music theory implemented in Python. Notes, intervals, scales and chords.

Project description


Music theory implemented in Python. Notes, scales and chords.

It is still in development so feel free to read the code, fork and make pull requests! They are very welcome!


To install:

$ pip install musthe

Development install

To install as development:

(Optional) Create a virtualenv:

$ python -m venv env
$ source env/bin/activate

Then install:

$ pip install -e .

How to use

It is very simple, everything is coded in a object-oriented style, for example:

$ python
>>> from musthe import *
>>> a = Note('A')  #Default A4
>>> a
>>> str(a)

Suppose you want to create tension, so you want the perfect fifth or the minor seventh of that A, so you do:

>>> fifth = Interval('P5')
>>> seventh = Interval('m7')
>>> a+fifth
>>> str(a+fifth)
>>> str(a+seventh)

Though it is important to see that the octaves of those notes are different:

>>> a.octave
>>> (a+seventh).octave

Now let's see basic chord usage:

>>> Chord(Note('A'), 'M')
Chord(Note('A'), 'M')
>>> Chord(Note('A'), 'M').notes
[Note("A4"), Note("C#5"), Note("E5")]
>>> Chord(Note('Bb'), 'dim').notes
[Note("Bb4"), Note("Db5"), Note("Fb5")]

You can use a string to construct a chord:

>>> Chord('C#aug7') == Chord(Note('C#'), 'aug7')

Default chord type is 'M' (Major).

Now lets try scales:

>>> s = Scale(Note('B'), 'major')
>>> [s[i] for i in range(len(s))]
[Note('B4'), Note('C#5'), Note('D#5'), Note('E5'), Note('F#5'), Note('G#5'), Note('A#5')]
>>> s[0]
>>> s[-11]

It return a list of Note instances, so if you want a cleaner result should do something like:

>>> s = Scale(Note('B'), 'major')
>>> [str(s[i]) for i in range(len(s))]
['B', 'C#', 'D#', 'E', 'F#', 'G#', 'A#']

To check if notes and chords are contained in a given scale:

>>> Note('D#3') in s
>>> Note('F3') in s
>>> Chord('C#m') in s
>>> Chord('CM') in s

Now let's try some advanced stuff: given a list of chords, find all scales that contain those:

>>> chords = [Chord('Cm'), Chord('Fm7'), Chord('Gm')]
>>> for scale in Scale.all():
...     if chords in scale:
...         print(scale)
C natural_minor
Eb major

If you have lilypond installed, you can make little melodies using this program, an example is given in ''


In alphabetical order


See license file.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for musthe, version 1.0.0
Filename, size File type Python version Upload date Hashes
Filename, size musthe-1.0.0-py2.py3-none-any.whl (6.8 kB) File type Wheel Python version py2.py3 Upload date Hashes View
Filename, size musthe-1.0.0.tar.gz (8.0 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page