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: MING TSANG
Subject: Re: Custom key signature stencils, differentiating major and minor keys
Date: Mon, 12 Nov 2012 11:42:24 -0800 (PST)

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
}


reply via email to

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