lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Custom key signature stencils, differentiating major and minor keys


From: Paul Morris
Subject: Re: Custom key signature stencils, differentiating major and minor keys
Date: Sun, 11 Nov 2012 00:28:48 -0500

Ok, I figured out a way to differentiate between major and minor keys.  I 
followed the example of this snippet which shows how to access the tonic note 
of the current key:
http://lsr.dsi.unimi.it/LSR/Item?id=818

By combining the tonic note with the type and position of the right-most 
accidental sign in the key signature, I could determine both the current key 
and whether it was major or minor.  (I guess I should allow for other modes as 
well, hmmm...)

See the code below which also now handles C Major / A Minor, and (for now) 
replaces the key signature stencil with the name of the key, as described here:
http://lilypond.org/doc/v2.16/Documentation/notation/modifying-stencils

A variation on this could come in handy if you wanted to automatically print 
the textual name of the key above the key signature.

Any advice or comments welcome.  There are probably ways to improve this or do 
it better.

Cheers,
-Paul


%%% Begin snippet 

\version "2.16.0"

#(define Custom_key_sig_engraver
   (make-engraver
    (acknowledgers
     ((key-signature-interface engraver grob source-engraver)
      (let* (
                  (context (ly:translator-context engraver))
                  (tonic-pitch (ly:context-property context 'tonic))
                  (tonic-semi (modulo (ly:pitch-semitones tonic-pitch) 12))
                  (acclist  (ly:grob-property grob 'alteration-alist))
                  (accsign  (if (null? acclist) 0 (cdr (list-ref acclist 0))))
                  (psn          (if (null? acclist) 0 (car (list-ref acclist 
0))))
                )
                        (cond 
                        ((= accsign 0) 
                                (if (= tonic-semi 0) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {C Major} #}) ;; C Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {A Minor} #}) ;; A Minor
                                ))
                        ((= accsign 1/2)        ;; SHARP KEYS
                          (cond 
                                ((= psn 3) 
                                        (if (= tonic-semi 7) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {G Major} #}) ;; G Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {E Minor} #}) ;; E Minor
                                ))
                                ((= psn 0) 
                                        (if (= tonic-semi 2) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {D Major} #}) ;; D Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {B Minor} #}) ;; B Minor
                                ))
                                ((= psn 4) 
                                        (if (= tonic-semi 9) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {A Major} #}) ;; A Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Fis Minor} #}) ;; Fis Minor
                                ))
                                ((= psn 1) 
                                        (if (= tonic-semi 4) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {E Major} #}) ;; E Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Cis Minor} #}) ;; Cis Minor
                                ))
                                ((= psn 5) 
                                        (if (= tonic-semi 11) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {B Major} #}) ;; B Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Gis Minor} #}) ;; Gis Minor
                                ))
                                ((= psn 2) 
                                        (if (= tonic-semi 6) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Fis Major} #}) ;; Fis Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Dis Minor} #}) ;; Dis Minor
                                ))
                                ((= psn 6) 
                                        (if (= tonic-semi 1) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Cis Major} #}) ;; Cis Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Ais Minor} #}) ;; Ais Minor
                                ))
                          )
                        )
                        ((= accsign -1/2)       ;; FLAT KEYS
                          (cond
                                ((= psn 6) 
                                        (if (= tonic-semi 5) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {F Major} #}) ;; F Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {D Minor} #}) ;; D Minor
                                ))
                                ((= psn 2) 
                                        (if (= tonic-semi 10) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Bes Major} #}) ;; Bes Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {G Minor} #}) ;; G Minor
                                ))
                                ((= psn 5) 
                                        (if (= tonic-semi 3) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Ees Major} #}) ;; Ees Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {C Minor} #}) ;; C Minor
                                ))
                                ((= psn 1) 
                                        (if (= tonic-semi 8) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Aes Major} #}) ;; Aes Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {F Minor} #}) ;; F Minor
                                ))
                                ((= psn 4) 
                                        (if (= tonic-semi 1) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Des Major} #}) ;; Des Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Bes Minor} #}) ;; Bes Minor
                                ))
                                ((= psn 0) 
                                        (if (= tonic-semi 6) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Ges Major} #}) ;; Ges Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Ees Minor} #}) ;; Ees Minor
                                ))
                                ((= psn 3) 
                                        (if (= tonic-semi 11) 
                                                (ly:grob-set-property! grob 
'text #{ \markup {Ces Major} #}) ;; Ces Major
                                                (ly:grob-set-property! grob 
'text #{ \markup {Aes Minor} #}) ;; Aes Minor
                                ))
                          )     
                        )
                )
)))))

\layout {
  \context {
    \Staff
    \consists \Custom_key_sig_engraver
        \override KeySignature #'stencil = #ly:text-interface::print
  }
}

\new Staff {
  \key c \major
  c'1
  \key a \minor
  a'1
}

<<
\new Staff 
{ 
  \key g \major 
  g'1 
  \key e \minor
  e'1
}
\new Staff 
{ 
  \key d \major 
  d'1
  \key b \minor
  b'1 
}
\new Staff 
{ 
  \key a \major 
  a'1 
  \key fis \minor
  fis'1
}
\new Staff 
{ 
  \key e \major 
  e'1
  \key cis \minor
  cis'1
}
\new Staff 
{ 
  \key b \major 
  b'1 
  \key gis \minor
  gis'1
}
\new Staff 
{ 
  \key fis \major 
  fis'1 
  \key dis \minor
  dis'1
}
\new Staff 
{ 
  \key cis \major 
  cis'1
  \key ais \minor
  ais'1
}
>>

<<
\new Staff { 
  \key f \major 
  f'1
  \key d \minor
  d'1
}
\new Staff 
{ 
  \key bes \major 
  bes'1
  \key g \minor
  g'1
}
\new Staff 
{ 
  \key ees \major 
  ees'1
  \key c \minor
  c'1
}
\new Staff 
{ 
  \key aes \major 
  aes'1
  \key f \minor
  f'1
}
\new Staff 
{ 
  \key des \major 
  des'1
  \key bes \minor
  bes'1
}
\new Staff 
{ 
  \key ges \major 
  ges'1
  \key ees \minor
  ees'1
}
\new Staff 
{ 
  \key ces \major 
  ces'1
  \key aes \minor
  aes'1
}
>>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]