Symbolic / PC set / notation
12-bit binary
A compact spelling of a pitch-class set. Twelve positions represent C through B; each 1 marks a pitch class that is present. The bits describe the set, not its order, register, root, or sound.
Try it
Edit the 12-bit set
Each position is one pitch class, C through B. A 1 includes that pitch class; a 0 leaves it out. The set does not specify octaves, order, or a chord root.
Current binary notation
100010010000
3 pitch classes selected
Read left to right: bit 0 is C, bit 4 is E, and bit 7 is G. The clock shows every selected position around the chromatic circle.
Same musical object
Convert the notation
Binary, numbers, letters, and the decimal value all encode this same unordered set. A chord name is an interpretation: several names may fit, and some sets have none.
Binary
100010010000Numbers
0-4-7Letters
C-E-GDecimal
2192Possible chord label: CM
Change the structure
Transpose, then choose a realization
Transposing the pitch-class set rotates its positions within twelve semitones. To retain a particular voicing, realize it as MIDI notes first and transpose those notes. The point set below is the relative shape of that chosen voicing.
Transposed PC set
100010010000
0-4-7 · C-E-G
One note-set realization
48 · 52 · 55
C3-E3-G3
Rootless point shape
0 · 4 · 7
Semitone offsets from the lowest voiced note
Equivalent pitches may be spelled with sharps in the PC-set view and flats in the note-set view. A note space is a different concept: it counts or weights concrete MIDI notes. This set cannot determine those weights until a voicing and counting rule are chosen.
For developers
The transformation in code
The current package exposes pure functions. The fluent form below is a design sketch for a possible future SDK; it is not an available API.
Current Symbolic API
Executable today in the JavaScript/TypeScript workspace package
import {
formatPcSet, noteSetFromMidiArray, pcSetFromBinary,
pointsOfNotes, transposeNoteSet, transposePcSet, voicePcSet,
} from "@codex-music/symbolic"
const set = pcSetFromBinary("100010010000")
const numbers = formatPcSet(set, "numbers")
const shifted = transposePcSet(set, 0)
const voiced = voicePcSet(set.pitchClasses, { rootOctave: 3 })
const moved = voiced.length
? transposeNoteSet(noteSetFromMidiArray(voiced), 0)
: null
const points = pointsOfNotes(moved?.notes.map(note => note.midi) ?? [])Proposed fluent API
Design sketch · names and signatures may change
// Design sketch — not an available import yet.
const set = symbolic.pcSet.from("100010010000", { notation: "binary" })
const numbers = set.format("numbers")
const shifted = set.transpose({ semitones: 0 })
const notes = set.voice({ register: 3, style: "close" })
.transpose({ semitones: 0 })
const shape = notes.toPointSet({ origin: "lowest" })In this design, format changes only the spelling, transpose keeps the current object type, and voice requires an explicit register before producing MIDI notes. A point shape comes from a voiced note set, since the unordered PC set alone cannot determine an inversion or octave spacing.