Hi, Paul:
I try to use custon-key-signature in my lilypond score and I did not get the alternative key printed above the traditional key signature. What is missing in the code below? I have "\Staff \consists \Custom_key_sig_engraver" in \layout as seen in your sample.
Sample code:
\version "2.16.0"
\language "english"
%\include "include_custom-key-signature_v2.ly"
% 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
%\include "include_numbrUP.ly"
numbr = #(make-engraver (acknowledgers
((note-head-interface engraver grob source)
(let* (
(context (ly:translator-context engraver))
(tonic-pitch (ly:context-property context 'tonic))
(tonic-index (ly:pitch-notename tonic-pitch))
(event (ly:grob-property grob 'cause))
(grob-pitch (ly:event-property event 'pitch))
(grob-index (ly:pitch-notename grob-pitch))
(delta (modulo (- grob-index tonic-index) 7))
(name (list-ref '("1" "2" "3" "4" "5" "6" "7") delta))
(newgrob (ly:engraver-make-grob engraver 'TextScript event)))
(set! (ly:grob-property newgrob 'text) name)))))
%%%%%%%%%%%%%%%
global = {
\key ef \major
\time 4/4
}
sopranoVoiceI = \relative c'' {
\global
\dynamicUp
\override Score.BarNumber #'stencil = #(make-stencil-circler 0.1 0.25 ly:text-interface::print)
% Music follows here.
%{01-02%} r1 r1 |\break
%{03-04%} bf8. af16 g8 f8 ef8 f8 g8 ef8 | f16 g16 af16 f16 g8. f16 ef8 d8 ef8 r8 |\break
%{05-06%} \key f \major bf'8. af16 g8 f8 ef8 f8 g8 ef8 | f16 g16 af16 f16 g8. f16 ef8 d8 ef8 r8 |\break
}
verseSopranoVoiceI = \lyricmode {
% Lyrics follow here.
Deck the halls with boughs of ho -- ly, Fa la la la la, la la la la.
}
right = \relative c'' {
\global
%{01%} bf8. af16 g8 f8 ef8 f8 g8 ef8 |
%{02%} <ef af c>16 q16 q16 q16 <ef g bf>8. <bf f' af>16 <bf ef g>8 <bf d f>8 <g bf ef>4 |\break
%{03%} <bf ef g>4. <bf d f>8 <g c ef>8 <bf d f>8 <bf ef g>4 |
%{04%} <d f>16 <ef g>16 <f af>16 <d f>16 <ef g>8. <af, c f>16 <g bf ef>8 <f bf d>8 <g bf ef>4 |\break
%{05%} \key f \major <bf ef g>4. <f' bf d>8 <g c ef>8 <bf d f>8 <bf ef g>4 |
%{06%} <d f>16 <ef g>16 <f af>16 <d f>16 <ef g>8. <af, c f>16 <g bf ef>8 <f bf d>8 <g bf ef>4 |\break
}
left = \relative c' {
\global
%{01%} bf,8. af16 g8 f8 ef8 f8 g8 ef8 |
%{02%} af4 bf4~bf8 bf8 ef,4 |
%{03%} ef4. bf'8 c8 bf8 ef,4 |
%{04%} bf'4 ef,8. af16 bf8 bf8 ef,4 |
%{05%} \key f \major ef4. bf'8 c8 bf8 ef,4 |
%{06%} bf'4 ef,8. af16 bf8 bf8 ef,4 |
}
sopranoVoicePart = \new Staff \with { \consists #numbr
instrumentName = "Soprano"
%midiInstrument = "choir aahs"
} { \sopranoVoiceI }
\addlyrics { \verseSopranoVoiceI }
pianoPart = \new PianoStaff \with {
instrumentName = "Piano"
} <<
\new Staff = "right" \with {
midiInstrument = "acoustic grand"
} \right
\new Staff = "left" \with {
midiInstrument = "acoustic grand"
} { \clef bass \left }
>>
\score {
<<
\sopranoVoicePart
\pianoPart
>>
\layout {
\context {
\Staff
\consists \Custom_key_sig_engraver
}
\context {
\RemoveEmptyStaffContext
\override VerticalAxisGroup #'remove-first = ##t
}
}
}
Blessing in+,
From: Paul Morris <address@hidden>
To: MING TSANG <address@hidden>
Cc: lilypond-usermailinglist <address@hidden>
Sent: Monday,
November 12, 2012 11:44:24 AM
Subject: Re: Custom key signature stencils, differentiating major and minor keys
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
}