Pitch Class Sets
January 03, 2021
Let's explore the world of pitch class sets. Note: This post is not optimized for dark mode.
Harmonic & Chromatic Circles
There are (at least) two ways we can represent 12 notes in a circle:
Circle of Fifths
Chromatic Circle
Chroma: 101011010101 = 2773
The blue line connects all pitches that are part of the selected scale. Using those representations, we can build a geometric intuition for musical phenomena. In a nutshell, the circle of fifth helps to understand harmonic relationships, while the chromatic circle works better for melodic content.
Chromas & Set Numbers
In the circles above, a so called chroma is displayed for each scale. A chroma is a format to represent a set of notes.
For example, the chroma of a C major scale is 101011010101
.
The idea: each digit stands for 1 of 12 possible pitches, where the first digit is C, then going chromatically up. A 1 means that the pitch that is represented by the digit is in the set, a 0 means it is not.
A set number is just the decimal representation of a chroma:
C D EF G A B = setNum
101011010101 = 2773
^
To find more about scale representations, be sure to check out The Exciting Universe of Music Theory. Unfortunately, the chromas and set numbers are reversed, which does not seem right to me. Read these comments to find out more.
Chroma from Scale
To get the chroma for a given scale, we can do this:
PcSet.get(Scale.get('D dorian')).chroma; // 101011010101
Why not Scale.get().chroma ?
Because it is always relative to C, ignoring the root of the scale:
const scaleProps = Scale.get('G major');
scaleProps.chroma;
// '101011010101' => ingores G
PcSet.get(scaleProps.notes).chroma;
// '101011010101' => relative to G => correct
Scale from Chroma
As the opposite of the above, we might also want the scale for a given chroma:
const chromaScale = (chroma, tonic, scaleTypes = Scale.names()) => {
const type = scaleTypes.find((type) => scaleChroma(`${tonic} ${type}`) === chroma);
if (type) {
return `${tonic} ${type}`;
}
return '';
};
expect(chromaScale('101011010101', 'C')).toBe('C major');
expect(chromaScale('101011010101', 'D')).toBe('D dorian');
expect(chromaScale('101011010101', 'E')).toBe('E phrygian');
expect(chromaScale('101011010101', 'Eb')).toBe('');
Chroma from Chord
Of course, we can also represent a chord as a chroma:
C D EF G A B = setNum
100010010000 = 2192
^
Set Concepts
Let's look at different concepts around pitch class sets.
Modes
These are the 7 modes of C major:
- All of the above resemble the same set (same pitches)
- Each set can be started at any contained pitch, which gives n modes for n pitch sets.
Transpositions / Rotations
Transposing a set leads to rotation. These are the 12 major scales:
For some scales, there are less than 12 unique rotations, for example:
- The above example shows that there are just 2 whole tone scales
- After 2 rotations, we end up with D whole tone, which is a mode of C whole tone => same notes
- All symmetric scales will have less than 12 unique rotations
Complements
A complement can be obtained by using the gaps of another set:
- Each set has exactly one complement
Reflections
The reflection of a set can be generated by flipping it around:
Flipping around the 1 / b5 will drop a major third down:
Flipping around the 5th / b2 gives us whole tone steps down:
Flipping around at the 2nd / b13 degree returns the same set:
Flipping around at the 6th / b3:
Flipping around at the 3rd / b7:
Flipping around at 4th / 7:
Negative Harmony Reflections
If we move the axis between the notes, we can get the "negative harmony":
Here, the C major scale is flipped around the axis between Eb/E and A/Bb.
Conclusion
This was just a broad overview of some things that can be done with pitch class sets. I will write about more concepts and some of the above in greater detail in future posts. Be sure to check out the links below: