Tool for helping you compose some jazz stuff.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


A program for helping you figure out scales and chords.

Web App

There is a web app built in, though this is more geared towards creating a library for this stuff. I have it hosted on Heroku here:


Play with it at the REPL. I use a jazz notation for scale tones, which consists of:

1  tonic
b2 minor 2nd
2  major 2nd
s2 sharp 2nd
b3 minor 3rd
3  major 3rd
4  perfect 4th
s4 augmented 4th
b5 diminished 5th
5  perfect 5th
b6 minor 6th
6  major 6th
b7 diminished 7th
7  minor 7th
M7 major 7th

Form chords using vectors of these. For example, a major 7th chord built on the tonic looks like: '[1 3 5 M7]

All of the scales I know are enumerated in composition-assistant.scales. This allows you to do things like:

user> (triad aeolian 3)
[b3 5 7]

user> (seventh ionian 5)
[5 M7 2 4]

Scales are also functions that return different things depending on how many args you pass.

user> (aeolian)
[1 2 b3 4 5 b6 7]
user> (aeolian 'C)
(C D Eb F G Ab Bb)

Or you can get a bit fancier and find, for example, all 7th chords in the major scale.

user> (map #(seventh ionian %) (range 1 8))
([1 3 5 M7] [2 4 6 1] [3 5 M7 2] [4 6 1 3] [5 M7 2 4] [6 1 3 5] [M7 2 4 6])

There are also ways of finding intervals:

user> (interval 1 'b3)
user> (interval 2 7)
user> (interval 'M7 4)

Note that the interval function should correctly take into account scale distance (it probably doesn't handle all cases right now, but I'll add them as they come up).

user> (interval 1 's4)
user> (interval 1 'b5)

Converting a vector of scale tones into chords:

user> (seventh melodic-minor 1)
[1 b3 5 M7]
user> (notes-to-chord (seventh melodic-minor 1))

user> (seventh ionian 5)
[5 M7 2 4]
user> (notes-to-chord (seventh ionian 5))

user> (map #(notes-to-chord (seventh dorian %)) (range 1 8))
(minor-7th minor-7th major-7th dominant-7th minor-7th minor-7th-b5 major-7th)

The coolest part of this is in the composition-assistant.pitch package. (It's also terribly written as of right now.) Given pitch-agnostic vectors of notes and a key, you can convert them. This will do all the correct theory stuff.

user> (notes-to-pitches ionian 'C)
(C D E F G A B)
user> (notes-to-pitches mixo 'G)
(G A B C D E F)
user> (notes-to-pitches mixo-b2-b6 'C#)
(C# D E# F# G# A B)
user> (notes-to-pitches aeolian 'Bb)
(Bb C Db Eb F Gb Ab)

Or, if you just want to skip all this and get pitches in a scale + the corresponding 7ths:

user> (roots-and-chords lydian 'C)
([C major-7th (C E G B)] [D dominant-7th (D F# A C)] [E minor-7th (E G B D)]
 [F# minor-7th-b5 (F# A C E)] [G major-7th (G B D F#)] [A minor-7th (A C E G)] [B minor-7th (B D F# A)])
user> (roots-and-chords mixo-b2-b6 'B)
([B dominant-7th (B D# F# A)] [C major-7th (C E G B)] [D# diminished-7th (D# F# A C)]
 [E minor-major-7th (E G B D#)] [F# minor-7th-b5 (F# A C E)] [G augmented-7th (G B D# F#)] [A minor-7th (A C E G)])

The testing is nonexistent (so I wouldn't use it for your homework), but I haven't seen any problems so far.


Copyright (C) 2012 Derek Mansen

Distributed under the Eclipse Public License, the same as Clojure.