Chord Scales

1. Consist entirely of only half steps and whole steps.
2. "Wrap" back to the starting note after exactly one octave.
3. Contain no two consecutive half-steps, even when "wrapping" to the octave above or below.

These rules generate exactly 17 Chord Scales starting on any given note (click here to view source code for a C++ computer program that demonstrates this). They are all conventionally used in jazz harmony. There are 7 modes each of the major and melodic minor scale (7 notes), two diminished scales (8 notes), and one whole tone scale (6 notes):

The "code" in the table represents the lowest numeric occurrence occurrence (unneccessary LSBs discarded) when the scale's construction is considered an 8-bit binary value with H=0 and W=1.

#codeconstructionnamemajor
mode #
mel. min.
mode #
185H W H W H W H Wauxiliary diminished
294H W H W W W W"altered," diminished whole tone7
3110H W W H W W WLocrian, half-diminished7
4118H W W W H W WPhrygian3
5122H W W W W H WPhrygian +6, Dorian -22
6170W H W H W H W Hdiminished
7174W H W H W W WLocrian #26
8182W H W W H W WAeolian, pure minor6
9186W H W W W H WDorian2
10188W H W W W W Hmelodic minor1
11214W W H W H W WMixolydian -6, "Hindu"5
12218W W H W W H WMixolydian5
13220W W H W W W HIonian, major1
14234W W W H W H WLydian dominant, Mixolydian +44
15236W W W H W W HLydian4
16244W W W W H W HLydian +53
17252W W W W W Wwhole tone

//
// Lists all possible "Chord Scales," where a chord scale is defined as:
//
// 1. Consisting entirely of only half steps and whole steps.
// 2. "Wraping" back to the starting note after exactly one octave.
// 3. Containing no two consecutive half-steps, even when "wrapping" to the octave above or below.
//

#include "stdio.h"

int main()
{
	int i,j;
	int t,ii;
	int c;
	int prevhalf;

	for (i=0; i<0x0100; i++)
	{
		printf("%.3d: ",i);
		t = i;
		c = 0;

		prevhalf = 0;

		for (j=0; j<8; j++)
		{
			if (t & 0x80)
			{
				printf("W ");
					c+=2;
				prevhalf = 0;
			}
			else
			{
				printf("H ");

				if (prevhalf)
				{
					if (j<=4)
						printf("\t");

					printf("\tconsecutive half steps");
					goto skip;
				}
				c++;
				prevhalf = 1;
			}

			if (c==12)    // got a scale that wraps exactly to one ocatve
			{
				if (!((i|t)&0x80))
				{
					printf("\tfirst/last half step");
					goto skip;
				}

				i += (1 << (7-j)) - 1;

				printf("\n");
				break;
			}
			else if (c>12)
			{
				printf("\tdoes not hit octave");
				skip:
				ii = (1 << (7-j)) - 1;  // skip identical entries

				if (ii)
				{
					if (ii==1)
						printf(" (skip %d)",i+1);
					else
						printf(" (skip %d-%d)",i+1,i+ii);
					i += ii;
				}

				printf("\n");
				break;
			}

			t <<= 1;
		}
	}
	return 0;
}