# 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: