Creating a Schenker Graph

The music theorist Heinrich Schenker created a method of analysing tonal music using, what are now known as Schenker graphs or diagrams. These use normal musical notation in non-standard ways.

Major problems creating a Schenker graph with lilypond are:

  1. Precise alignment of notes between staves needed,
  2. Note heads, stems, beams etc are used to notate musical structure not rhythm,
  3. A note head may have more than one stem or none,
  4. Slurs may be nested arbitrarily and can connect to both left and right of the same note head,
  5. Harmonic connection lines may be drawn between staves.


  1. By default all notes are eight notes and the (invisible) time signature is 1/8. A missing note head is implemented as a transparent note rather than a skip.
  2. Most grobs are, by default, invisible. Each staff is structured as a series of layers, implemented as voices, containing all the notes, NoteCollision #'merge-differently-headed is set to true. Note heads are only visible in the notes voice, note heads are determined by setting NoteHead #'duration-log.
  3. Harmonic connections are implemented by a note followers in separate layers.