A pitch also includes the octave or register (C4, F6, G2, etc)
So, up until now we've been working with 12-element vectors, where each position stands for a pitch class. A triad would be something like this:
The 1's indicate the presence of a note at that semitone. There are 12 semitones, and three of them are played.
But this doesn't tell you which octave the pitches are in.
With a small change, this information can be recorded in the vector.
Here, the first note of the triad (at semitone position 0) is in the first octave. The second note of the triad (at semitone position 4) is in the second octave. The third note of the triad (at semitone position 7) is in the third octave.
Now, when handling this vector, I can make a list of which octaves the pitches are in. When I rearrange or invert the chord, I can make sure that the octave information survives.
Some transformations we don't yet have a method for preserving the information. For example, when getting the prime form of a chord, we are really calculating what class the chord falls into. The registration of the notes in the chords doesn't matter because prime form encompasses many variations of registration. Going from prime form to vectors means that when you generate the vectors, you are generating lists of pitch-class representations (the vector has all 1's), but not pitch representations (the vector has many numbers).
Something that occurred to us is that using 1's for generic presence of a pitch class gets confusing if you also take 1 to mean that it's from the lowest octave. This will be fixed, but we're not yet sure what the very best and most clever way forward is!