A program for helping you figure out scales and chords.
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: http://evening-leaf-4768.herokuapp.com/
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) minor-3 user> (interval 2 7) minor-6 user> (interval 'M7 4) diminished-5
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) augmented-4 user> (interval 1 'b5) diminished-5
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)) minor-major-7th user> (seventh ionian 5) [5 M7 2 4] user> (notes-to-chord (seventh ionian 5)) dominant-7th 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.