Skip to content
Python music library
Pull request Compare This branch is 8 commits ahead, 104 commits behind jdan:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Melopy (melo-pee)

A python library for playing with sound.

by Jordan Scales ( and friends

on Github:

For an example: check out

$ python examples/

To install:

$ git clone git://
$ cd Melopy
$ sudo python install

To run the tests: (we've got some errors to work out)

$ python test


$ pip install -r requirements.txt
$ nosetests

Library methods

>>> # Returns the frequency of the note (key) keys from A0
>>> melopy.frequency_from_key(49)

>>> # Returns the frequency of a note represented by a string
>>> melopy.frequency_from_note('A4')

>>> # Returns the key number (keys from A0) from a note represented by a string
>>> melopy.key_from_note('A4')

>>> # Returns a string representing a note which is (key) keys from A0
>>> melopy.note_from_key(49)

>>> # Calls iterate() with the starting note and the pattern [2,2,1,2,2,2]
>>> melopy.generate_major_scale('D4')

>>> # Calls iterate with the starting note and the pattern [2,1,2,2,1,2]
>>> melopy.generate_minor_scale('C4')

>>> # Calls iterate with the starting note and the pattern [4, 3]
>>> melopy.generate_major_triad('A4')
['A4', 'C#5', 'E5']

>>> # Calls iterate with the starting note and the pattern [3, 4]
>>> melopy.generate_minor_triad('C5')
['C5', 'D#5', 'G5']

All of the above methods (except for from_note variations) allow for choosing your return type. The default is a list, however you can get a string, dictionary, or tuple by the following method:

>>> generate_minor_scale("A4","tuple")
('A4', 'B4', 'C5', 'D5', 'E5', 'F5', 'G5')
>>> generate_minor_scale("A4","dict")
{0: 'A4', 1: 'B4', 2: 'C5', 3: 'D5', 4: 'E5', 5: 'F5', 6: 'G5'}

Melopy Class

class melopy.Melopy

    melopy_writer # bitwise writer for creating the .wav file
    rate          # sample rate (usually 44100)
    volume        # volume of wav track (from 0 to 32767)
    data          # array containing bytes to write to the wav file
    octave        # default octave if one is not specified in a melody
    tempo         # self explanitory
    wave_type     # sine, triangle, sawtooth, or square. the wave_type you will be adding when methods are called. Default is sine.

    __init__(self, title, volume=50)

    # Destructor that calls render()

    # Adds a wave with a given frequency, length (in seconds) at a given location (in seconds)
    add_wave(self, wave_type, frequency, length, location='END')

    # Same as add_wave, but instead of frequency, the user provides a string representing a note (ie 'C5')
    #     If the octave is ignored, it is defaulted to 4. This can be changed by edited `self.octave`
    # Also try add_quarter_note, add_half_note, add_whole_note, add_eighth_note, add_sixteenth_note instead of specifying a length
    add_note(self, note, length, wave_type='square', location='END')
    # You can also replace `note` with an array of notes, i.e. (['C', 'E', 'G'] or ['A4', 'C#5', 'E5']) to add chords.

    # Generates an array of notes given a starting note and a pattern of gaps between notes. This is better explained below
    iterate(self, start, pattern)

    # Adds given notes in a melody to the wave data, each having the given length
    add_melody(self, melody, length, wave_from [DEFAULT 'square'])

    # Adds a rest (nothing) for a given time (in seconds)
    # Also add_whole_rest, add_quarter_rest, etc. (instead of specifying a length)
    add_rest(self, length)

    # Renders the wave form to a wav file


  • Implement custom wave-types
  • Create project page
  • Add music reader
  • Add types of scales?
  • Fix scales to work properly (d731ad5)
  • Write to wav file bitwise? Rather than having an overhead
  • Add option to listen to files before rendering out (Render into RAM, play and then dump?)
Something went wrong with that request. Please try again.