Here is an improved version. It works the same as the last,
but with much more streamlined and concise code.
-Paul
\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)) ;;
semitone of tonic note, 0-11
(acclist (ly:grob-property grob 'alteration-alist))
(accsign (if (null? acclist) 0 (cdr (list-ref acclist 0))))
;; accidental sign type, 1/2=sharp, -1/2=flat
(psn (if (null? acclist) 0 (car (list-ref acclist
0)))) ;; vertical position of last accidental sign
(key-name #{ \markup {} #})
)
(cond
((= accsign 0)
(if (= tonic-semi 0)
(set! key-name #{ \markup \raise #3.4 {C Major} #})
(set! key-name #{ \markup \raise #3.4 {A Minor} #})
))
((= accsign 1/2) ;; SHARP KEYS
(cond
((= psn 3)
(if (= tonic-semi 7)
(set! key-name #{ \markup {G Major} #})
(set! key-name #{ \markup {E Minor} #})
))
((= psn 0)
(if (= tonic-semi 2)
(set! key-name #{ \markup {D Major} #})
(set! key-name #{ \markup {B Minor} #})
))
((= psn 4)
(if (= tonic-semi 9)
(set! key-name #{ \markup {A Major} #})
(set! key-name #{ \markup {F\raise #.6 {\sharp}
Minor} #})
))
((= psn 1)
(if (= tonic-semi 4)
(set! key-name #{ \markup {E Major} #})
(set! key-name #{ \markup {C\raise #.6 {\sharp}
Minor} #})
))
((= psn 5)
(if (= tonic-semi 11)
(set! key-name #{ \markup {B Major} #})
(set! key-name #{ \markup {G\raise #.6 {\sharp}
Minor} #})
))
((= psn 2)
(if (= tonic-semi 6)
(set! key-name #{ \markup {F\raise #.6 {\sharp}
Major} #})
(set! key-name #{ \markup {D\raise #.6 {\sharp}
Minor} #})
))
((= psn 6)
(if (= tonic-semi 1)
(set! key-name #{ \markup {C\raise #.6 {\sharp}
Major} #})
(set! key-name #{ \markup {A\raise #.6 {\sharp}
Minor} #})
))
)
)
((= accsign -1/2) ;; FLAT KEYS
(cond
((= psn 6)
(if (= tonic-semi 5)
(set! key-name #{ \markup {F Major} #})
(set! key-name #{ \markup {D Minor} #})
))
((= psn 2)
(if (= tonic-semi 10)
(set! key-name #{ \markup {B\raise #.4 {\flat}
Major} #})
(set! key-name #{ \markup {G Minor} #})
))
((= psn 5)
(if (= tonic-semi 3)
(set! key-name #{ \markup {E\raise #.4 {\flat}
Major} #})
(set! key-name #{ \markup {C Minor} #})
))
((= psn 1)
(if (= tonic-semi 8)
(set! key-name #{ \markup {A\raise #.4 {\flat}
Major} #})
(set! key-name #{ \markup {F Minor} #})
))
((= psn 4)
(if (= tonic-semi 1)
(set! key-name #{ \markup {D\raise #.4 {\flat}
Major} #})
(set! key-name #{ \markup {B\raise #.4 {\flat}
Minor} #})
))
((= psn 0)
(if (= tonic-semi 6)
(set! key-name #{ \markup {G\raise #.4 {\flat}
Major} #})
(set! key-name #{ \markup {E\raise #.4 {\flat}
Minor} #})
))
((= psn 3)
(if (= tonic-semi 11)
(set! key-name #{ \markup {C\raise #.4 {\flat}
Major} #})
(set! key-name #{ \markup {A\raise #.4 {\flat}
Minor} #})
))
)
)
)
(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) ;; RESIZE TEXT
.5 )) ;; PADDING
)))))
\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
}
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user