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: Wed, 21 Nov 2012 12:45:56 -0500

On Nov 18, 2012, at 7:26 AM, Thomas Morley <address@hidden> wrote:

> 2012/11/18 Paul Morris <address@hidden>:
> [...]
>> I do have some small changes I made to my local copy that I'd like to add.  
>> They are for the accidental signs in the text -- better spacing and putting 
>> them into a LilyPond variable for less repetition.  I won't be able to get 
>> to this until Wednesday at the earliest.
> 
> No problem. I'll wait.

Hi Harm,  I incorporated your 2.14 "downgrades" into my most current version, 
and uploaded it to the LSR:  http://lsr.dsi.unimi.it/LSR/Item?u=1&id=856

I kept the commented-out 2.16 version in the snippet, for easy future 
migration.  But I am fine with removing it if that's preferred for the LSR.  

The most current code for use in 2.16 is pasted below.  

Thanks again,
-Paul


% Begin snippet

\version "2.16.0"

% tonic-semi: semitone of the tonic note, 0-11, 0=C, 2=D, etc
% psn: vertical staff position of the last accidental sign in key signature
% accsign: the accidental sign type, 1/2=sharp, -1/2=flat
%   (These 3 things let us identify the key and if it is major or minor.)
% txt-size: size of key name text
% padd: padding between key signature and key name
% C Major, F Major, A Minor, and D Minor all get extra padding 
%   so the name is above the staff
% This snippet does not work with modal keys (dorian, lydian, etc.)
% Key cancellations usually get no name above them, 
%  unless they have the same tonic note, like G major to G minor.

#(define Custom_key_signature_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 #:null))
          (txt-size     .7)
          (padd .5)
          (sharptxt (markup #:translate (cons -0.3 0.8) #:magnify .9 #:sharp))
          (flattxt  (markup #:translate (cons -0.2 0.4) #:magnify .9 #:flat))
      )
      (cond 
      ((= accsign 0) (cond
        ((= tonic-semi 0) (set! key-name (markup "C Major" )) (set! padd 3.2))
        ((= tonic-semi 9) (set! key-name (markup "A Minor" )) (set! padd 3.2))
        (else (set! key-name (markup #:null)))
      ))
      ((= 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 #:null)))
        ))
        ((= 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 #:null)))
        ))
        ((= psn 4) (cond 
          ((= tonic-semi 9) (set! key-name (markup "A Major" )))
          ((= tonic-semi 6) (set! key-name (markup "F" sharptxt "Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 1) (cond 
          ((= tonic-semi 4) (set! key-name (markup "E Major" )))
          ((= tonic-semi 1) (set! key-name (markup "C" sharptxt "Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 5) (cond 
          ((= tonic-semi 11) (set! key-name (markup "B Major" )))
          ((= tonic-semi 8)  (set! key-name (markup "G" sharptxt "Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 2) (cond
          ((= tonic-semi 6) (set! key-name (markup "F" sharptxt "Major" )))
          ((= tonic-semi 3) (set! key-name (markup "D" sharptxt "Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 6) (cond
          ((= tonic-semi 1)  (set! key-name (markup "C" sharptxt "Major" )))
          ((= tonic-semi 10) (set! key-name (markup "A" sharptxt "Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        )
      )
      ((= accsign -1/2)
        (cond
        ((= psn 6) (cond
          ((= tonic-semi 5) (set! key-name (markup "F Major" )) (set! padd 1.4))
          ((= tonic-semi 2) (set! key-name (markup "D Minor" )) (set! padd 1.7))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 2) (cond
          ((= tonic-semi 10) (set! key-name (markup "B" flattxt "Major" )))
          ((= tonic-semi 7)  (set! key-name (markup "G Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 5) (cond
          ((= tonic-semi 3) (set! key-name (markup "E" flattxt "Major" )))
          ((= tonic-semi 0) (set! key-name (markup "C Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 1) (cond
          ((= tonic-semi 8) (set! key-name (markup "A" flattxt "Major" )))
          ((= tonic-semi 5) (set! key-name (markup "F Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 4) (cond
          ((= tonic-semi 1)  (set! key-name (markup "D" flattxt "Major" )))
          ((= tonic-semi 10) (set! key-name (markup "B" flattxt "Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 0) (cond
          ((= tonic-semi 6) (set! key-name (markup "G" flattxt "Major" )))
          ((= tonic-semi 3) (set! key-name (markup "E" flattxt "Minor" )))
          (else (set! key-name (markup #:null)))
        ))
        ((= psn 3) (cond
          ((= tonic-semi 11) (set! key-name (markup "C" flattxt "Major" )))
          ((= tonic-semi 8)  (set! key-name (markup "A" flattxt "Minor" )))   
          (else (set! key-name (markup #:null))) 
        ))
        )       
      )
      ) 
      (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) 
            txt-size txt-size) 
            padd )) 
)))))

\layout {
  \context {
    \Staff
    \consists \Custom_key_signature_engraver
  }
}

\new Staff \relative c {
  \clef bass
  \key c \major
  c1
  \key a \minor
  a1
  \key g \major 
  g1 
  \key e \minor
  e'1
  \key d \major 
  d1
  \key b \minor
  b1 
  \key a \major 
  a1 
  \key fis \minor
  fis'1
  \key e \major 
  e1
  \key cis \minor
  cis1
  \key b \major 
  b1 
  \key gis \minor
  gis1
  \key fis \major 
  fis'1 
  \key dis \minor
  dis1
  \key cis \major 
  cis1
  \key ais \minor
  ais1
  \key f \major 
  f'1
  \key d \minor
  d1
  \key bes \major 
  bes1
  \key g \minor
  g'1
  \key ees \major 
  ees1
  \key c \minor
  c1
  \key aes \major 
  aes1
  \key f \minor
  f'1
  \key des \major 
  des1
  \key bes \minor
  bes1
  \key ges \major 
  ges'1
  \key ees \minor
  ees1
  \key ces \major 
  ces1
  \key aes \minor
  aes1
}










reply via email to

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