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: Mon, 12 Nov 2012 11:44:24 -0500

Here is another revision (hopefully the last?!).  The previous version would 
include the key name over a key cancellation[1], but it would often be an 
incorrect/unrelated key name (!).  

This version does not include the name of the key above a key-cancellation, 
unless the tonic note is the same in both keys, like a switch from G major to G 
minor.  (This is a glitch I haven't been able to work around.  It always gives 
the correct key name now at least.  I tried checking for natural signs as the 
type of accidental used in key cancellations, but this does not work.)

Cheers,
-Paul 

[1] http://www.lilypond.org/doc/v2.16/Documentation/internals/keycancellation



\version "2.16.0"

% tonic-semi: semitone of tonic note, 0-11 
% psn: vertical staff position of the last accidental sign in key signature
% accsign: the accidental sign type, 1/2=sharp, -1/2=flat
% Knowing these 3 things is enough to identify the key and whether it is 
major/minor

#(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)))) 
                (key-name   #{ \markup {} #})
          )
          (cond 
          ((= accsign 0) (cond
                        ((= tonic-semi 0) (set! key-name #{ \markup \raise #3.4 
{C Major} #}))
                        ((= tonic-semi 9) (set! key-name #{ \markup \raise #3.4 
{A Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
          ((= accsign 1/2)
                (cond 
                ((= psn 3) (cond 
                        ((= tonic-semi 7) (set! key-name #{ \markup {G Major} 
#}))
                        ((= tonic-semi 4) (set! key-name #{ \markup {E Minor} 
#}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 0) (cond
                        ((= tonic-semi 2)   (set! key-name #{ \markup {D Major} 
#}))
                        ((= tonic-semi 11) (set! key-name #{ \markup {B Minor} 
#}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 4) (cond 
                        ((= tonic-semi 9) (set! key-name #{ \markup {A Major} 
#}))
                        ((= tonic-semi 6) (set! key-name #{ \markup {F\raise 
#.6 {\sharp} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 1) (cond 
                        ((= tonic-semi 4) (set! key-name #{ \markup {E Major} 
#}))
                        ((= tonic-semi 1) (set! key-name #{ \markup {C\raise 
#.6 {\sharp} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 5) (cond 
                        ((= tonic-semi 11) (set! key-name #{ \markup {B Major} 
#}))
                        ((= tonic-semi 8)   (set! key-name #{ \markup {G\raise 
#.6 {\sharp} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 2) (cond
                        ((= tonic-semi 6) (set! key-name #{ \markup {F\raise 
#.6 {\sharp} Major} #}))
                        ((= tonic-semi 3) (set! key-name #{ \markup {D\raise 
#.6 {\sharp} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 6) (cond
                        ((= tonic-semi 1)   (set! key-name #{ \markup {C\raise 
#.6 {\sharp} Major} #}))
                        ((= tonic-semi 10) (set! key-name #{ \markup {A\raise 
#.6 {\sharp} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                )
          )
          ((= accsign -1/2)
                (cond
                ((= psn 6) (cond
                        ((= tonic-semi 5) (set! key-name #{ \markup {F Major} 
#}))
                        ((= tonic-semi 2) (set! key-name #{ \markup {D Minor} 
#}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 2) (cond
                        ((= tonic-semi 10) (set! key-name #{ \markup {B\raise 
#.4 {\flat} Major} #}))
                        ((= tonic-semi 7)   (set! key-name #{ \markup {G Minor} 
#}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 5) (cond
                        ((= tonic-semi 3) (set! key-name #{ \markup {E\raise 
#.4 {\flat} Major} #}))
                        ((= tonic-semi 0) (set! key-name #{ \markup {C Minor} 
#}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 1) (cond
                        ((= tonic-semi 8) (set! key-name #{ \markup {A\raise 
#.4 {\flat} Major} #}))
                        ((= tonic-semi 5) (set! key-name #{ \markup {F Minor} 
#}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 4) (cond
                        ((= tonic-semi 1)   (set! key-name #{ \markup {D\raise 
#.4 {\flat} Major} #}))
                        ((= tonic-semi 10) (set! key-name #{ \markup {B\raise 
#.4 {\flat} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 0) (cond
                        ((= tonic-semi 6) (set! key-name #{ \markup {G\raise 
#.4 {\flat} Major} #}))
                        ((= tonic-semi 3) (set! key-name #{ \markup {E\raise 
#.4 {\flat} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                ((= psn 3) (cond
                        ((= tonic-semi 11) (set! key-name #{ \markup {C\raise 
#.4 {\flat} Major} #}))
                        ((= tonic-semi 8)   (set! key-name #{ \markup {A\raise 
#.4 {\flat} Minor} #}))
                        (else (set! key-name #{\markup{}#}))
                ))
                )       
          )
          )     
          (ly:grob-set-property! grob 'stencil 
                (ly:stencil-combine-at-edge (ly:key-signature-interface::print 
grob) 1 1 
                        (ly:stencil-scale (grob-interpret-markup grob key-name) 
.7 .7) 
                        .5 )) 
)))))

% Resize text by changing the .7 .7 above in "(grob-interpret-markup grob 
key-name) .7 .7)" 
% Adjust padding by changing the .5 on the following line


\layout {
  \context {
    \Staff
    \consists \Custom_key_sig_engraver
  }
}

\new Staff {
  \key c \major
  c'1
  \key a \minor
  a'1
  \key g \major 
  g'1 
  \key e \minor
  e'1
  \key d \major 
  d'1
  \key b \minor
  b'1 
  \key a \major 
  a'1 
  \key fis \minor
  fis'1
  \key e \major 
  e'1
  \key cis \minor
  cis'1
  \key b \major 
  b'1 
  \key gis \minor
  gis'1
  \key fis \major 
  fis'1 
  \key dis \minor
  dis'1
  \key cis \major 
  cis'1
  \key ais \minor
  ais'1
  \key f \major 
  f'1
  \key d \minor
  d'1
  \key bes \major 
  bes'1
  \key g \minor
  g'1
  \key ees \major 
  ees'1
  \key c \minor
  c'1
  \key aes \major 
  aes'1
  \key f \minor
  f'1
  \key des \major 
  des'1
  \key bes \minor
  bes'1
  \key ges \major 
  ges'1
  \key ees \minor
  ees'1
  \key ces \major 
  ces'1
  \key aes \minor
  aes'1
}


reply via email to

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