Improved Schenker diagram

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Improved Schenker diagram

Werner LEMBERG

I've invested some time to revise the Schenker diagram, which
deteriorated over time.

Here is the original version

  https://www.linuxjournal.com/article/8364

Here is what we currently have (not the bad spacing and bad vertical
alignment).

  http://lilypond.org/doc/v2.19/Documentation/ly-examples/bach-schenker.png

And attached you can find my new version.

Please comment so that I can add this to the git repository.


    Werner

% -*-coding: utf-8 -*-

\version "2.19.21"


\header{
  composer = "J.S. Bach"
  title = "Wenn wir in höchsten Nöten sein (BWV 641)"
  subtitle = "Analysis from Gene Biringer's Schenker Text, Ex. 5-27"
  enteredby = "Kris Shaffer, Werner Lemberg"
}


setup = { \oneVoice
          \override NoteColumn.ignore-collision = ##t }


% Some remarks.
%
% - Number `i' in the comments below gives the `i'th column in the graph.
%   Rhythmically, every column is (arbitrarily) represented as an eighth.
%   In total, the graph has 15 columns.
%
% - Using `\stemUp' and `\stemDown' influences the positioning of slurs even
%   if `\omit Stem' disables printing of stems.
%
% - Since each layer of the Schenker graph uses `\\' to create a new voice
%   it is not necessary to undo `\omit' or `\hide' commands.  The same holds
%   for overridden properties.
%
%   The `price' for using `\\' is to call the above-defined macro `\setup'
%   at the beginning of each voice to undo horizontal voice shifts and to
%   make LilyPond ignore collisions.
%
% - Trailing (musical) skips in voices are omitted.


rightHand = {
  \clef treble
  \key g \major

  <<
    {
      \setup
      % This produces half notes as note heads of eighths.
      \override NoteHead.duration-log = #1

  % 1
      s2
  % 5
      b'8\tweak positions #'(8 . 8) ^[
        ^\markup { \override #'(baseline-skip . 0.8)
                   \column { \with-color #red \small { ^ 3 } } }
      s4.
  % 9
      s4 a'8
        ^\markup { \override #'(baseline-skip . 0.8)
                   \column { \with-color #red \small { ^ 2 } } }
      s8
  % 13
      s4 g'8]
        ^\markup { \override #'(baseline-skip . 0.8)
                   \column { \with-color #red \small { ^ 1 } } }
    }
  \\
    {
      \setup
      \override Slur.color = #(x11-color "purple")
      \stemUp
      \omit Stem
      \hide NoteHead
      \slurDashed

  % 1
      s2
  % 5
      b'2\tweak height-limit #6 _(
  % 9
      b'4)
      a'4\tweak height-limit #3.25 _(
  % 13
      s8
      a'4)
    }
  \\
    {
      \setup

  % 1
      \stemUp
      g'8\tweak positions #'(4.5 . -3.25) -[ s4.
  % 5
      \stemDown
      \once \hide NoteHead
      b'8]
      \stemUp
      a'8\tweak positions #'(3 . -3) -[ s
      \stemDown
      c''8]
    }
  \\
    {
      \setup
      \override Slur.color = #(x11-color "violet")

  % 1
      \stemDown
      \omit Stem
      \omit Flag
      s8 fis'^(_\markup { \with-color #blue \tiny N } g')
      a'8^(^\markup { \with-color #blue \tiny P }
  % 5
      \hideNotes
      b'4)
      \unHideNotes
      \once \override TextScript.outside-staff-priority = ##f
      b'8^(^\markup { \with-color #blue \tiny P }
      \undo \omit Stem
      \undo \omit Flag
      \stemUp
      \override Stem.length = #10
      c''8)^(
  % 9
      \override Stem.length = #14
      b'4) s8
      \stemDown
      \omit Stem
      \omit Flag
      c''8^(
  % 13
      b'8_\markup { \with-color #blue \tiny P } a')
    }
  \\
    {
      \setup
      \override Slur.color = #(x11-color "violet")

  % 1
      \stemUp
      \omit Stem
      \omit Flag
      g'8_( fis' g'4)
  % 5
      s2
  % 9
      s2
  % 13
      b'8_( a')
    }
  \\
    {
      \setup
      \omit Stem
      \hide NoteHead

  % 1
      s2
  % 5
      s8 d'4
      \change Staff = "LH"
      b4
    }
  \\
    {
      \setup
      \omit Stem
      \hide NoteHead

  % 1
      s2
  % 5
      s2
  % 9
      s4
      d'4
      \change Staff = "LH"
  % 13
      b4
    }
  >>

  \bar "|."
}


leftHand = {
  \clef bass
  \key g \major

  <<
    {
      \setup
      % This produces half notes as note heads of eighths.
      \override NoteHead.duration-log = #1

  % 1
      g8\tweak positions #'(-8 . -8) _[
        _\markup { \with-color #(x11-color 'LawnGreen) \bold I }
      s4.
  % 5
      s2
  % 9
      s2
  % 13
      d8_\markup { \with-color #(x11-color 'LawnGreen) \bold V }
      s8
      g,8]_\markup { \with-color #(x11-color 'LawnGreen) \bold I }
    }
  \\
    {
      \setup
      \override Slur.color = #(x11-color "violet")
      \stemUp
      \hide Stem
      \hide Flag

  % 1
      s8
      \once \override TextScript.outside-staff-priority = ##f
      \once \override TextScript.padding = #1
      a8_(^\markup { \with-color #blue \tiny P } b)
      \stemDown
      fis8^(^\markup { \with-color #blue \tiny P }
  % 5
      e8)
      c8\tweak height-limit #1.5 ^(
      d8)^\markup { \with-color #blue \tiny N }
      \stemUp
      fis,8_(
  % 9
      \undo \hide Stem
      \undo \hide Flag
      \override Stem.length = #10
      \stemDown
      g,4)
      c8_(
      \hide Stem
      \hide Flag
      a,8)
  % 13
      \once \hide NoteHead
      d8^( d,)
    }
  \\
    {
      \setup
      \override Slur.color = #(x11-color "violet")

  % 1
      \hide Stem
      \hide Flag
      \hide NoteHead
      g4\tweak height-limit #4 ^( b8) s8
  % 5
      s8
      \undo \hide Stem
      \undo \hide NoteHead
      \override Beam.positions = #'(-4 . 1)
      \stemDown
      c8[ s
      \stemUp
      fis,8]
  % 9
      \override Beam.positions = #'(1 . -4)
      g,8[
      \stemDown
      b,8]
      \hide Stem
      \hide NoteHead
      c8^( s
  % 13
      d4)
    }
  \\
    {
      \setup
      \override Slur.color = #(x11-color "violet")
      \hide Stem
      \hide NoteHead

  % 1
      g2\tweak height-limit #3 _(
  % 5
      e4)
    }
  \\
    {
      \setup
      \override Slur.color = #(x11-color "purple")
      \hide Stem
      \hide NoteHead
      \slurDashed

  % 1
      g2\tweak height-limit #8 _(
  % 5
      s2
  % 9
      g,4)
    }
  >>

  \bar "|."
}


\score {
  \new PianoStaff
  <<
    \new Staff = "RH" \rightHand
    \new Staff = "LH" \leftHand
  >>

  \layout {
    \context {
      \Score
      timing = ##f
      \override StaffGrouper.staff-staff-spacing.basic-distance = #13 }

    \context {
      \Staff
      \remove "Time_signature_engraver" }

    \context {
      \PianoStaff
      followVoice = ##t }

    \context {
      \Voice
      % We use `VoiceFollower' lines to indicate related columns
      % instead of related voices; we thus avoid vertical offsets.
      \override VoiceFollower.bound-details.left.padding = #0
      \override VoiceFollower.bound-details.right.padding = #0 }
  }
}


\paper {
  indent = 0.0
  ragged-right = ##f
  tagline = ##f
  paper-height = 95\mm
}

_______________________________________________
lilypond-devel mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/lilypond-devel

bach-schenker.png (68K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Improved Schenker diagram

Kieren MacMillan
Hi Werner,

> I've invested some time to revise the Schenker diagram, which
> deteriorated over time.

Thanks for doing that!

Related: For the last couple of years, I’ve been [slowly] putting together a SchenkerLily framework, which makes so much of this a lot easier to code. I’m hoping to release it to OpenLilyLib soon.

Best,
Kieren.
________________________________

Kieren MacMillan, composer (he/him/his)
‣ website: www.kierenmacmillan.info
‣ email: [hidden email]


_______________________________________________
lilypond-devel mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/lilypond-devel
Reply | Threaded
Open this post in threaded view
|

Re: Improved Schenker diagram

Urs Liska-3
In reply to this post by Werner LEMBERG
Hi Werner,

thank you for that!

I can't comment on it because I don't know much about Schenker graphs. But I could right away use it ;-)
https://github.com/frescobaldi/frescobaldi/pull/1173#issuecomment-531884243 (actually this was something I had been hoping for).

Best
Urs

16. September 2019 14:55, "Werner LEMBERG" <[hidden email]> schrieb:

> I've invested some time to revise the Schenker diagram, which
> deteriorated over time.
>
> Here is the original version
>
> https://www.linuxjournal.com/article/8364
>
> Here is what we currently have (not the bad spacing and bad vertical
> alignment).
>
> http://lilypond.org/doc/v2.19/Documentation/ly-examples/bach-schenker.png
>
> And attached you can find my new version.
>
> Please comment so that I can add this to the git repository.
>
> Werner
>
> % -*-coding: utf-8 -*-
>
> \version "2.19.21"
>
> \header{
> composer = "J.S. Bach"
> title = "Wenn wir in höchsten Nöten sein (BWV 641)"
> subtitle = "Analysis from Gene Biringer's Schenker Text, Ex. 5-27"
> enteredby = "Kris Shaffer, Werner Lemberg"
> }
>
> setup = { \oneVoice
> \override NoteColumn.ignore-collision = ##t }
>
> % Some remarks.
> %
> % - Number `i' in the comments below gives the `i'th column in the graph.
> % Rhythmically, every column is (arbitrarily) represented as an eighth.
> % In total, the graph has 15 columns.
> %
> % - Using `\stemUp' and `\stemDown' influences the positioning of slurs even
> % if `\omit Stem' disables printing of stems.
> %
> % - Since each layer of the Schenker graph uses `\\' to create a new voice
> % it is not necessary to undo `\omit' or `\hide' commands. The same holds
> % for overridden properties.
> %
> % The `price' for using `\\' is to call the above-defined macro `\setup'
> % at the beginning of each voice to undo horizontal voice shifts and to
> % make LilyPond ignore collisions.
> %
> % - Trailing (musical) skips in voices are omitted.
>
> rightHand = {
> \clef treble
> \key g \major
>
> <<
> {
> \setup
> % This produces half notes as note heads of eighths.
> \override NoteHead.duration-log = #1
>
> % 1
> s2
> % 5
> b'8\tweak positions #'(8 . 8) ^[
> ^\markup { \override #'(baseline-skip . 0.8)
> \column { \with-color #red \small { ^ 3 } } }
> s4.
> % 9
> s4 a'8
> ^\markup { \override #'(baseline-skip . 0.8)
> \column { \with-color #red \small { ^ 2 } } }
> s8
> % 13
> s4 g'8]
> ^\markup { \override #'(baseline-skip . 0.8)
> \column { \with-color #red \small { ^ 1 } } }
> }
> \\
> {
> \setup
> \override Slur.color = #(x11-color "purple")
> \stemUp
> \omit Stem
> \hide NoteHead
> \slurDashed
>
> % 1
> s2
> % 5
> b'2\tweak height-limit #6 _(
> % 9
> b'4)
> a'4\tweak height-limit #3.25 _(
> % 13
> s8
> a'4)
> }
> \\
> {
> \setup
>
> % 1
> \stemUp
> g'8\tweak positions #'(4.5 . -3.25) -[ s4.
> % 5
> \stemDown
> \once \hide NoteHead
> b'8]
> \stemUp
> a'8\tweak positions #'(3 . -3) -[ s
> \stemDown
> c''8]
> }
> \\
> {
> \setup
> \override Slur.color = #(x11-color "violet")
>
> % 1
> \stemDown
> \omit Stem
> \omit Flag
> s8 fis'^(_\markup { \with-color #blue \tiny N } g')
> a'8^(^\markup { \with-color #blue \tiny P }
> % 5
> \hideNotes
> b'4)
> \unHideNotes
> \once \override TextScript.outside-staff-priority = ##f
> b'8^(^\markup { \with-color #blue \tiny P }
> \undo \omit Stem
> \undo \omit Flag
> \stemUp
> \override Stem.length = #10
> c''8)^(
> % 9
> \override Stem.length = #14
> b'4) s8
> \stemDown
> \omit Stem
> \omit Flag
> c''8^(
> % 13
> b'8_\markup { \with-color #blue \tiny P } a')
> }
> \\
> {
> \setup
> \override Slur.color = #(x11-color "violet")
>
> % 1
> \stemUp
> \omit Stem
> \omit Flag
> g'8_( fis' g'4)
> % 5
> s2
> % 9
> s2
> % 13
> b'8_( a')
> }
> \\
> {
> \setup
> \omit Stem
> \hide NoteHead
>
> % 1
> s2
> % 5
> s8 d'4
> \change Staff = "LH"
> b4
> }
> \\
> {
> \setup
> \omit Stem
> \hide NoteHead
>
> % 1
> s2
> % 5
> s2
> % 9
> s4
> d'4
> \change Staff = "LH"
> % 13
> b4
> }
>>>
>
> \bar "|."
> }
>
> leftHand = {
> \clef bass
> \key g \major
>
> <<
> {
> \setup
> % This produces half notes as note heads of eighths.
> \override NoteHead.duration-log = #1
>
> % 1
> g8\tweak positions #'(-8 . -8) _[
> _\markup { \with-color #(x11-color 'LawnGreen) \bold I }
> s4.
> % 5
> s2
> % 9
> s2
> % 13
> d8_\markup { \with-color #(x11-color 'LawnGreen) \bold V }
> s8
> g,8]_\markup { \with-color #(x11-color 'LawnGreen) \bold I }
> }
> \\
> {
> \setup
> \override Slur.color = #(x11-color "violet")
> \stemUp
> \hide Stem
> \hide Flag
>
> % 1
> s8
> \once \override TextScript.outside-staff-priority = ##f
> \once \override TextScript.padding = #1
> a8_(^\markup { \with-color #blue \tiny P } b)
> \stemDown
> fis8^(^\markup { \with-color #blue \tiny P }
> % 5
> e8)
> c8\tweak height-limit #1.5 ^(
> d8)^\markup { \with-color #blue \tiny N }
> \stemUp
> fis,8_(
> % 9
> \undo \hide Stem
> \undo \hide Flag
> \override Stem.length = #10
> \stemDown
> g,4)
> c8_(
> \hide Stem
> \hide Flag
> a,8)
> % 13
> \once \hide NoteHead
> d8^( d,)
> }
> \\
> {
> \setup
> \override Slur.color = #(x11-color "violet")
>
> % 1
> \hide Stem
> \hide Flag
> \hide NoteHead
> g4\tweak height-limit #4 ^( b8) s8
> % 5
> s8
> \undo \hide Stem
> \undo \hide NoteHead
> \override Beam.positions = #'(-4 . 1)
> \stemDown
> c8[ s
> \stemUp
> fis,8]
> % 9
> \override Beam.positions = #'(1 . -4)
> g,8[
> \stemDown
> b,8]
> \hide Stem
> \hide NoteHead
> c8^( s
> % 13
> d4)
> }
> \\
> {
> \setup
> \override Slur.color = #(x11-color "violet")
> \hide Stem
> \hide NoteHead
>
> % 1
> g2\tweak height-limit #3 _(
> % 5
> e4)
> }
> \\
> {
> \setup
> \override Slur.color = #(x11-color "purple")
> \hide Stem
> \hide NoteHead
> \slurDashed
>
> % 1
> g2\tweak height-limit #8 _(
> % 5
> s2
> % 9
> g,4)
> }
>>>
>
> \bar "|."
> }
>
> \score {
> \new PianoStaff
> <<
> \new Staff = "RH" \rightHand
> \new Staff = "LH" \leftHand
>>>
>
> \layout {
> \context {
> \Score
> timing = ##f
> \override StaffGrouper.staff-staff-spacing.basic-distance = #13 }
>
> \context {
> \Staff
> \remove "Time_signature_engraver" }
>
> \context {
> \PianoStaff
> followVoice = ##t }
>
> \context {
> \Voice
> % We use `VoiceFollower' lines to indicate related columns
> % instead of related voices; we thus avoid vertical offsets.
> \override VoiceFollower.bound-details.left.padding = #0
> \override VoiceFollower.bound-details.right.padding = #0 }
> }
> }
>
> \paper {
> indent = 0.0
> ragged-right = ##f
> tagline = ##f
> paper-height = 95\mm
> }
>
> _______________________________________________
> lilypond-devel mailing list
> [hidden email]
> https://lists.gnu.org/mailman/listinfo/lilypond-devel

_______________________________________________
lilypond-devel mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/lilypond-devel
Reply | Threaded
Open this post in threaded view
|

Re: Improved Schenker diagram

Werner LEMBERG

> I can't comment on it because I don't know much about Schenker
> graphs.  But I could right away use it ;-)
> https://github.com/frescobaldi/frescobaldi/pull/1173#issuecomment-531884243
> (actually this was something I had been hoping for).

:-)


    Werner

_______________________________________________
lilypond-devel mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/lilypond-devel
Reply | Threaded
Open this post in threaded view
|

Re: Improved Schenker diagram

Christopher Heckman
In reply to this post by Werner LEMBERG
On Mon, Sep 16, 2019 at 9:39 AM <[hidden email]> wrote:

>
> Hi Werner,
>
> > I've invested some time to revise the Schenker diagram, which
> > deteriorated over time.
>
> Thanks for doing that!
>
> Related: For the last couple of years, I’ve been [slowly] putting together a SchenkerLily framework, which makes so much of this a lot easier to code. I’m hoping to release it to OpenLilyLib soon.
>
> Best,
> Kieren.

A few months ago, I also worked on setting up some notation to
describe Schenker diagrams, and did some coding as well. I don't have
it with me -- I'm at work right now -- but later I'll post what I came
up with.

--- Christopher Heckman

_______________________________________________
lilypond-devel mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/lilypond-devel
Reply | Threaded
Open this post in threaded view
|

Re: Improved Schenker diagram

Werner LEMBERG
In reply to this post by Kieren MacMillan

>> I've invested some time to revise the Schenker diagram, which
>> deteriorated over time.
>
> Related: For the last couple of years, I’ve been [slowly] putting
> together a SchenkerLily framework, which makes so much of this a lot
> easier to code. I’m hoping to release it to OpenLilyLib soon.

Sounds interesting – this could be a topic for our conference in
January.


    Werner
_______________________________________________
lilypond-devel mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/lilypond-devel