lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: O Canada with Ukrainian lyrics


From: Peter A. Buhr
Subject: Re: O Canada with Ukrainian lyrics
Date: Tue, 27 Jun 2023 09:29:29 -0400

    The included file guitar.ly is missing. It might not be strictly required 
but I thought I’d mention it.

Right, guitar.ly is slightly scary (see below) and might not be used. Again it
may not build with newer lilypond.

Basically, I got pulled away from my guitars about 5+ years ago by life. I can't
even remember which end to blow into. 8-(

I attached a PDF of O Canada.

Oh, and I attached something I was working on and never finished. Some of it is
rubbish and needs people with more knowledge than me to get right. I may have
posted it to lilypond in the past, so sorry if this is a repeat.

=====================================================

\version "2.16.0"

% postscript slash for half barres
#(define slash "0.18 setlinewidth 0.76 1.53 moveto 0 -1.62 rlineto stroke")

% variable definitions
date = #(strftime "%d/%m/%Y" (localtime (current-time)))
copywrite = #(strftime "Copyright © %Y" (localtime (current-time)))

lu = \once \override LaissezVibrerTie #'direction = #UP
ld = \once \override LaissezVibrerTie #'direction = #DOWN

fl = \set fingeringOrientations = #'(left)
fr = \set fingeringOrientations = #'(right)
flr = \set fingeringOrientations = #'(left right)
fu = \set fingeringOrientations = #'(up)
fd = \set fingeringOrientations = #'(down)
fud = \set fingeringOrientations = #'(up down)
fdu = \set fingeringOrientations = #'(down up)
furd = \set fingeringOrientations = #'(up right down)
fuld = \set fingeringOrientations = #'(up left down)
frlr = \set fingeringOrientations = #'(right left right)
frl = \set fingeringOrientations = #'(right left)

fp = \override Fingering #'script-priority = #-100 
faa = \once \override Fingering #'script-priority = #101
fsp = \once \override Fingering #'script-priority = #451
graceFinger = \once \override Fingering #'font-size = #-8
fis = \override Fingering #'avoid-slur = #'inside
fos = \override Fingering #'avoid-slur = #'outside

sfl = \set strokeFingerOrientations = #'(left)
sfr = \set strokeFingerOrientations = #'(right)
sfu = \set strokeFingerOrientations = #'(up)
sfd = \set strokeFingerOrientations = #'(down)
sfud = \set strokeFingerOrientations = #'(up down)
sfsst = \override StrokeFinger #'add-stem-support = ##t
sfssf = \override StrokeFinger #'add-stem-support = ##f

snsst = \override StringNumber #'add-stem-support = ##t
snssf = \override StringNumber #'add-stem-support = ##f
snl = \set stringNumberOrientations = #'(left)
snr = \set stringNumberOrientations = #'(right)
snu = \set stringNumberOrientations = #'(up)
snd = \set stringNumberOrientations = #'(down)
snrd = \set stringNumberOrientations = #'(right down)
snru = \set stringNumberOrientations = #'(right up)
snud = \set stringNumberOrientations = #'(up down)
snar = \once \override StringNumber #'self-alignment-X = #RIGHT
snal = \once \override StringNumber #'self-alignment-X = #LEFT

igncf = \once \override NoteColumn #'ignore-collision = ##f
ignct = \once \override NoteColumn #'ignore-collision = ##t

su = \stemUp
sn = \stemNeutral
sd = \stemDown
onceStemDown = \once \override Stem #'direction = #DOWN
onceStemUp = \once \override Stem #'direction = #UP
onceSlurDown = \once \override Slur #'direction = #DOWN

onceSlurUp = \once \override Slur #'direction = #UP
harmMixed = \override NoteHead #'style = #'harmonic-mixed
harmOff = \revert NoteHead #'style
onceHarmMixed = \once \override NoteHead #'style = #'harmonic-mixed
hSeven = \markup \teeny \italic { "harm.7" }
hTwelve = \markup \teeny \italic { "harm.12" }
hNineteen = \markup \teeny \italic { "harm.19" }
seven = \markup \teeny { 7 }
eight = \markup \teeny { 8 }
twelve = \markup \teeny { 12 }
ospe = \once \override TextScript #'outside-staff-priority = #-101

sfis = \override StrokeFinger #'avoid-slur = #'inside
sfos = \override StrokeFinger #'avoid-slur = #'outside

stemkkkki = \once \override Stem #'length-fraction = #(magstep -4.5)
stemkkkk = \once \override Stem #'length-fraction = #(magstep -4)
stemkkki = \once \override Stem #'length-fraction = #(magstep -3.5)
stemkkk = \once \override Stem #'length-fraction = #(magstep -3)
stemkki = \once \override Stem #'length-fraction = #(magstep -2.5)
stemkk = \once \override Stem #'length-fraction = #(magstep -2)
stemki = \once \override Stem #'length-fraction = #(magstep -1.5)
stemk = \once \override Stem #'length-fraction = #(magstep -1)
stem = \once \override Stem #'length-fraction = #(magstep 0)
stemi = \once \override Stem #'length-fraction = #(magstep 1.5)
steml = \once \override Stem #'length-fraction = #(magstep 2)
stemli = \once \override Stem #'length-fraction = #(magstep 2.5)
stemll = \once \override Stem #'length-fraction = #(magstep 3)
stemlli = \once \override Stem #'length-fraction = #(magstep 3.5)
stemlll = \once \override Stem #'length-fraction = #(magstep 4)
stemllli = \once \override Stem #'length-fraction = #(magstep 4.5)
stemllll = \once \override Stem #'length-fraction = #(magstep 5)
stemlllli = \once \override Stem #'length-fraction = #(magstep 5.5)

% vibrato symbol
vibrato = \markup { \override #'(font-name . "Tempera") \fontsize #6 "z" }

% better alignment of stroke fingering in a succession of fingering indications
#(define (my-stroke-finger::calc-text grob)
        (let* ((digit (ly:event-property (event-cause grob) 'digit))
                (text (ly:event-property (event-cause grob) 'text))
                (finger (vector-ref (ly:grob-property grob 'digit-names)
                (1- (max (min 5 digit) 1))))
                (direction (ly:grob-property grob 'direction)))

        (if (string? text)
                text
                (if (= direction 0)
                        finger
                                (make-combine-markup (cond
                                        ((= direction UP) 
(make-transparent-markup "p"))
                                        ((= direction DOWN) 
(make-transparent-markup "i")))
                                        finger)))))

fingering = {
        \override Fingering #'staff-padding = #'()
        \override StringNumber #'staff-padding = #'()
        \override StrokeFinger #'staff-padding = #'()
        \override Fingering #'add-stem-support = ##f
        \override StringNumber #'add-stem-support = ##t
        \override StrokeFinger #'add-stem-support = ##t
        \set fingeringOrientations = #'(left)
        \set strokeFingerOrientations = #'(down)
        \set stringNumberOrientations = #'(right)
        \override Fingering #'avoid-slur = #'inside
        \override StrokeFinger #'avoid-slur = #'outside
        \override StringNumber #'avoid-slur = #'outside
        \override StrokeFinger #'text = #my-stroke-finger::calc-text
        \override Fingering #'outside-staff-priority = ##f
        \override StrokeFinger #'outside-staff-priority = ##f
        \override StringNumber #'outside-staff-priority = ##f
        \override Fingering #'script-priority = #-101
        \override Fingering #'padding = #0.3
        \override StringNumber #'padding = #0.3
        \override StrokeFinger #'padding = #0.3
        \override Stem #'length-fraction = #(magstep 1)
        \override Staff.AccidentalPlacement #'left-padding = #0
}

% shortcuts for stroke finger indications
% can't use a or p, so use upper case for all
P = #(define-music-function (parser location) ()
        (apply make-music
                (append
                        (list
                                'StrokeFingerEvent
                                'origin location)
                        (list 'digit 1))))

I = #(define-music-function (parser location) ()
        (apply make-music
                (append
                        (list
                                'StrokeFingerEvent
                                'origin location)
                        (list 'digit 2))))

M = #(define-music-function (parser location) ()
        (apply make-music
                (append
                        (list
                                'StrokeFingerEvent
                                'origin location)
                        (list 'digit 3))))

A = #(define-music-function (parser location) ()
        (apply make-music
                (append
                        (list
                                'StrokeFingerEvent
                                'origin location)
                        (list 'digit 4))))


% Basic spanner with alterations
% Parameters
%       #osp                    % outside-staff-priority - normally set to #0 
unless barre is colliding with other elements
%       #dirn                   % set to #UP for above the staff, #DOWN for 
below
%       #'(lpad . rpad) % left and right padding to apply to TextSpanner 
(shorten)
%       #adjBreak               % when barre wraps to following stave, set 
value to prevent TextSpanner on following stave starting above the clef symbol
%       #adjend                 % when barre wraps to following stave, set 
value to prevent TextSpanner going to the very end of the stave
%       #align                  % vertical alignment of bar with respect to 
text (e.g., #UP #CENTER, #DOWN, #number)
%       #lineStyle              % style to format spanner line (e.g., 
#solid-line, #dashed-line)
%       #fontShape              % font shape for text (e.g., #upright, #italic, 
#caps)
%
% Example:
%       \spanner "5" #0 #UP #'(-0.5 . -1) #8 #1 #CENTER
%       <g-2>\startTextSpan <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3>\stopTextSpan
%
spanner = #(define-music-function (parser location osp dirn shorten adjBreak 
adjEnd align lineStyle fontShape)
                                                                                
                 (number? number? pair? number? number? number? symbol? symbol?)
#{
        % set osp to 999 if spanner is colliding with another element this will 
position the spanner outside all other
        % elements can be normally be set to zero
        \once \override TextSpanner #'outside-staff-priority = #osp
        \once \override TextSpanner #'style = #lineStyle
        \once \override TextSpanner #'font-shape = #fontShape
        \once \override TextSpanner #'direction = #dirn
        %draw a bracket edge on RHS
        \once \override TextSpanner #'bound-details #'right #'text = \markup { 
\draw-line #(cons 0 (/ dirn -1)) }
        % set alignment of line with reference to left text
        \once \override TextSpanner #'bound-details #'left 
#'stencil-align-dir-y = $align
        % change X pos of LH and RH end as desired
        \once \override TextSpanner #'bound-details #'left #'padding = #(car 
shorten)
        \once \override TextSpanner #'bound-details #'right #'padding = #(cdr 
shorten)
        % allow adjustment of line end when it wraps to following stave
        \once \override TextSpanner #'bound-details #'right-broken #'padding = 
#adjEnd
        % adjust LH end of line when it wraps to following stave so that it 
doesn't
        % extend to the left of the notes on the stave
        \once \override TextSpanner #'bound-details #'left-broken #'X = 
#adjBreak
        % optional override to remove text and bracket edge at line breaks
        \once \override TextSpanner #'bound-details #'left-broken #'text = ##f
        \once \override TextSpanner #'bound-details #'right-broken #'text = ##f
#})

barreStart = \startTextSpan
barreStop = \stopTextSpan

% Full barre with alterations
% Parameters
%       "<fretnum>"             % fret number (e.g., "5") for full barre
%       same as spanner
%
% Example:
%       \barre "5" #0 #UP #'(-0.5 . -1) #8 #1
%       <g-2> \barreStart <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> \barreStop
%
barre = #(define-music-function (parser location fretnum osp dirn shorten 
adjBreak adjEnd) (string? number? number? pair? number? number?)
#{
        \spanner #osp #dirn #shorten #adjBreak #adjEnd #CENTER #'solid-line 
#'upright
        \once \override TextSpanner #'bound-details #'left #'text = \markup { 
\concat { "C" $fretnum " " } }
#})

% Half barre with alterations
% Parameters
%       "<fretnum>"             % fret number (e.g., "5") for half barre
%       "<partial>"             % number of strings to cover - subscripted to 
the fret number
%       same as spanner
%
% Example:
%       \hbarre "5" "3" #0 #UP #'(-0.5 . -1) #8 #1
%       <g-2> \barreStart <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> \barreStop
%
hbarre = #(define-music-function (parser location fretnum partial osp dirn 
shorten adjBreak adjEnd) (string? string? number? number? pair? number? number?)
#{
        \spanner #osp #dirn #shorten #adjBreak #adjEnd #0.35 #'solid-line 
#'upright
        \once \override TextSpanner #'bound-details #'left #'text =
%               \markup { \concat { "C" $fretnum \raise #0.8 \sub $partial " " 
} }
                \markup { \small { \concat { \postscript #slash "C" $fretnum 
\raise #0.8 \sub $partial " " } } }
#})

% RCM full barre with alterations
% Parameters
%       same as barre
%
% Example:
%       \fbarre "III" #0 #UP #'(-0.5 . -1) #8 #1
%       <g-2> \barreStart <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> \barreStop
%
fbarre = #(define-music-function (parser location fretnum osp dirn shorten 
adjBreak adjEnd) (string? number? number? pair? number? number?)
#{
        \pbarre $fretnum #"6" #"6" #osp #dirn #shorten #adjBreak #adjEnd
#})

% RCM partial barre with alterations
% Parameters
%       "<fretnum>"             % fret number (e.g., "5") for half barre
%       "<lowest>"              % lowest string stopped by barre
%       "<partial>"             % number of strings (including the lowest) to 
cover
%       same as spanner
%
% Example:
%       \pbarre "III" "5" "4" #0 #UP #'(-0.5 . -1) #8 #1
%       <g-2> \barreStart <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> \barreStop
%
pbarre = #(define-music-function (parser location fretnum low num osp dirn 
shorten adjBreak adjEnd) (string? string? string? number? number? pair? number? 
number?)
#{
        \spanner #osp #dirn #shorten #adjBreak #adjEnd #CENTER #'solid-line 
#'upright
        \once \override TextSpanner #'bound-details #'left #'text = \markup{ 
\line { \sans \fontsize #-2 \fraction $low $num $fretnum } }
#})


ritStart = \startTextSpan
ritStop = \stopTextSpan

% Ritardando with alterations
% Parameters
%       same as spanner
%
% Example:
%       \rit #0 #DOWN #'(-0.5 . -1) #8 #1
%       <g-2> \ritStart <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> \ritStop
%
rit = #(define-music-function (parser location osp dirn shorten adjBreak 
adjEnd) (number? number? pair? number? number?)
#{
        \spanner #osp #dirn #shorten #adjBreak #adjEnd #CENTER #'solid-line 
#'upright
        \once \override TextSpanner #'bound-details #'left #'text = \markup { 
\italic "rit." }
#})


% usage e.g.:
%       \harmonics "harm. 8va " #0 #'(0 . -0.5) #5 #1
%       <g,-2>\startTextSpan <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> g c bf'-> 
ef, af-> c,\stopTextSpan
harmonics = #(define-music-function (parser location text osp shorten adjBreak 
adjEnd) (string? number? pair? number? number?)
#{
        \spanner #osp #UP #shorten #adjBreak #adjEnd #CENTER #'dashed-line 
#'italic
        \once \override TextSpanner #'bound-details #'left #'text = \markup { 
\teeny $text }
        % setup dashed line and draw a bracket edge on RHS
        \once \override TextSpanner #'dash-period = #1.5
        \once \override TextSpanner #'dash-fraction = #0.6
        \once \override TextSpanner #'thickness = #0.8
        \once \override TextSpanner #'bound-details #'right #'text = \markup { 
\draw-line #'(0 . -0.5) }
#})

% % usage e.g.:
% %     \string "2" #0 #UP #'(0 . -0.5) #5 #1
% %     <g,-2>\startTextSpan <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> g c bf'-> 
ef, af-> c,\stopTextSpan
% string = #(define-music-function (parser location stringnum osp dirn shorten 
adjBreak adjEnd)
%       (string? number? number? pair? number? number?)
% #{
%       % set osp to 999 if spanner is colliding with another element
%       % this will position the spanner outside all other elements
%       % can be normally be set to zero
%       \once \override TextSpanner #'bound-details #'left #'text = \markup 
\bold { \teeny \concat { \circle { \finger $stringnum } " " } }
%       \once \override TextSpanner #'outside-staff-priority = #osp
%       \once \override TextSpanner #'font-shape = #'upright
%       \once \override TextSpanner #'direction = #dirn
%       % setup dashed line and draw a bracket edge on RHS
%       \once \override TextSpanner #'dash-period = #0.8
%       \once \override TextSpanner #'dash-fraction = #0.6
%       \once \override TextSpanner #'thickness = #0.8
%       \once \override TextSpanner #'bound-details #'right #'text = \markup { 
\draw-line #(cons 0 (/ dirn -2)) }
%       % set alignment of line with reference to left text
%       \once \override TextSpanner #'bound-details #'left 
#'stencil-align-dir-y = #CENTER
%       \once \override TextSpanner #'bound-details #'left #'padding = #(car 
shorten)
%       \once \override TextSpanner #'bound-details #'right #'padding = #(cdr 
shorten)
%       % allow adjustment of line end when it wraps to following stave
%       \once \override TextSpanner #'bound-details #'right-broken #'padding = 
#adjEnd
%       % adjust LH end of line when it wraps to following stave so that it 
doesn't
%       % extend to the left of the notes on the stave
%       \once \override TextSpanner #'bound-details #'left-broken #'X = 
#adjBreak
%       % optional override to remove text and bracket edge at line breaks
%       \once \override TextSpanner #'bound-details #'left-broken #'text = 
\markup \bold { \teeny \concat { \circle { \finger $stringnum } " " } }
%       \once \override TextSpanner #'bound-details #'right-broken #'text = ##f
% #})

% usage e.g.:
%       \tspan "cresc. poco a poco" #0 #DOWN #'(0 . -0.5) #5 #1
%       <g,-2>\startTextSpan <c-3> <bf'-4>-> <ef,-1> <af-1>-> <c,-3> g c bf'-> 
ef, af-> c,\stopTextSpan
tspan = #(define-music-function (parser location text osp dirn shorten adjBreak 
adjEnd) (string? number? number? pair? number? number?) #{
        % set osp to 999 if spanner is colliding with another element
        % this will position the spanner outside all other elements
        % can be normally be set to zero
        \once \override TextSpanner #'outside-staff-priority = #osp
        \once \override TextSpanner #'bound-details #'left #'text = 
\markup\italic\small\bold { \concat { { $text } " " } }
        \once \override TextSpanner #'font-shape = #'upright
        \once \override TextSpanner #'direction = #dirn
        % setup dashed line and draw a bracket edge on RHS
        \once \override TextSpanner #'dash-period = #1.5
        \once \override TextSpanner #'dash-fraction = #0.3
        \once \override TextSpanner #'thickness = #0.8
        \once \override TextSpanner #'bound-details #'right #'text = \markup { 
\draw-line #(cons 0 (/ dirn -1)) }
        % set alignment of line with reference to left text
        \once \override TextSpanner #'bound-details #'left 
#'stencil-align-dir-y = #CENTER
        \once \override TextSpanner #'bound-details #'left #'padding = #(car 
shorten)
        \once \override TextSpanner #'bound-details #'right #'padding = #(cdr 
shorten)
        % allow adjustment of line end when it wraps to following stave
        \once \override TextSpanner #'bound-details #'right-broken #'padding = 
#adjEnd
        % adjust LH end of line when it wraps to following stave so that it 
doesn't
        % extend to the left of the notes on the stave
        \once \override TextSpanner #'bound-details #'left-broken #'X = 
#adjBreak
        % optional override to remove text and bracket edge at line breaks
        \once \override TextSpanner #'bound-details #'left-broken #'text = ##f
        \once \override TextSpanner #'bound-details #'right-broken #'text = ##f
#})

% rotated text spanner
rtspan = #(define-music-function (parser location text rightY offset shorten)
        (string? number? pair? pair?)
#{
        \once \override TextSpanner #'bound-details #'left #'text =
                \markup \italic \small \concat { { $text } " " }
        \once \override TextSpanner #'direction = #DOWN
        \once \override TextSpanner #'(bound-details right Y) = #rightY
        \once \override TextSpanner #'extra-offset = #offset
        \once \override TextSpanner #'dash-period = #1.5
        \once \override TextSpanner #'dash-fraction = #0.3
        \once \override TextSpanner #'thickness = #0.8
        \once \override TextSpanner #'bound-details #'right #'text =
                \markup { \draw-line #'(0 . 2) }
        \once \override TextSpanner #'bound-details #'left 
#'stencil-align-dir-y = #DOWN
        \once \override TextSpanner #'bound-details #'left #'padding = #(car 
shorten)
        \once \override TextSpanner #'bound-details #'right #'padding = #(cdr 
shorten)
#})

% usage e.g.:
%       \strfngr "p" #0 #DOWN #'(0 . -0.5) #5 #1
strfngr = #(define-music-function (parser location finger osp dirn shorten 
adjBreak adjEnd)
        (string? number? number? pair? number? number?)
#{
        % set osp to 999 if spanner is colliding with another element
        % this will position the spanner outside all other elements
        % can be normally be set to zero
        \once \override TextSpanner #'outside-staff-priority = #osp
        \once \override TextSpanner #'direction = #DOWN
        \once \override TextSpanner #'font-size = #-4
        \once \override TextSpanner #'bound-details #'left #'text = \markup 
\concat { { $finger } " " }
%       \once \override TextSpanner #'font-shape = #'upright
        \once \override TextSpanner #'direction = #dirn
        % setup dashed line and draw a bracket edge on RHS
        \once \override TextSpanner #'dash-period = #0.8
        \once \override TextSpanner #'dash-fraction = #0.6
        \once \override TextSpanner #'thickness = #0.8
        \once \override TextSpanner #'bound-details #'right #'text = \markup { 
\draw-line #(cons 0 (/ dirn -2)) }
        % set alignment of line with reference to left text
        \once \override TextSpanner #'bound-details #'left 
#'stencil-align-dir-y = #CENTER
        \once \override TextSpanner #'bound-details #'left #'padding = #(car 
shorten)
        \once \override TextSpanner #'bound-details #'right #'padding = #(cdr 
shorten)
        % allow adjustment of line end when it wraps to following stave
        \once \override TextSpanner #'bound-details #'right-broken #'padding = 
#adjEnd
        % adjust LH end of line when it wraps to following stave so that it 
doesn't
        % extend to the left of the notes on the stave
        \once \override TextSpanner #'bound-details #'left-broken #'X = 
#adjBreak
        % optional override to remove text and bracket edge at line breaks
        \once \override TextSpanner #'bound-details #'left-broken #'text = ##f
        \once \override TextSpanner #'bound-details #'right-broken #'text = ##f
#})

% left-hand finger guide before note
#(define (guide-finger slope len fingering)
  ;; Purpose
  ;;   add ornamentation line before fingering symbol to indicate figner 
movement along a
  ;;   string without making a sound (i.e., not a glissando)
  ;; Parameters
  ;;   slope : angle of rotation around right centre
  ;;   len : length of line prefacing fingering
  ;;   fingering : fingering designation for note
  (let ((music (make-music 'FingeringEvent)))
   (set! (ly:music-property music 'tweaks)
        (acons 'stencil
         (lambda (grob)
          (let* (
                ;; assign to finger the "digit" property from parameter 
"fingering"
                (finger (ly:music-property fingering 'digit))
                ;; DOES NEXT LINE GENERATE A STENCIL FROM THE STRING FOR A 
FINGER NUMBER???
                ;; IS THERE A WAY TO GENERATE A FINGER STENCIL THAT IS A FINGER 
NUMBER RATHER THAN A MARKUP?
                (finger-stil (grob-interpret-markup grob (number->string 
finger)))
                ;; assign to finger-stil-X the width of finger-stil
                (finger-stil-X (ly:stencil-extent finger-stil X))
                ;; assign to finger-stil-Y the height slightly below the middle 
of finger number
                (finger-stil-Y (* 0.4 (interval-length (ly:stencil-extent 
finger-stil Y))))

                ;; assign to guide-line a horizontal line-stencil with thickness
                ;;   and length "len" up "finger-stil-Y" vertically on 
fingering number
                (guide-line (make-line-stencil 0.13 0 finger-stil-Y len 
finger-stil-Y))
                ;; rotate guide-line "slope" degrees around right centre
                (guide-line (ly:stencil-rotate guide-line slope 1 0))
                ;; center line vertically on fingering number
                (guide-line-X (ly:stencil-extent guide-line X))

                ;; assign to stil the concatenation of stencil line and finger 
number along X-axis on right
                ;;   add padding 0.2 to move guide slightly left from finger 
number
                (stil (ly:stencil-combine-at-edge guide-line X 1 finger-stil 
0.2))
                ;; assign to stil-ext-X the width of stil
                (stil-ext-X (ly:stencil-extent stil X))
          ) ;; end declarations
           ;; fingering oriented on left/right side ?
           (if (= 0 (ly:grob-property grob 'side-axis))
                ;; return finger guide as is
                stil
                ;; otherwise, create and return new finger guide with X-extents 
positioned with the number
                ;; centered over the note
                (ly:make-stencil
                 ;; copy expr from stil
                 (ly:stencil-expr stil)
                 (coord-translate stil-ext-X (* 0.5 (- (interval-length 
stil-ext-X) (interval-length finger-stil-X))))
                 
;;#########################################################################
                 ;; widen the stencil by doubling its width minus one 
finger-number width,
                 ;;   which should have a center point under the remaining 
finger number
                 
;;#########################################################################
;;               (cons 0 (- (* 2 (interval-length stil-ext-X)) (interval-length 
finger-stil-X)))
;;               (cons 0 (+ (interval-length stil-ext-X) (* 1.6 (- 
(interval-length stil-ext-X) (interval-length finger-stil-X)))))
                 (ly:stencil-extent finger-stil Y)
           ) ;; end make-stencil
          ) ;; end if
         ) ;; end let
        ) ;; end lambda
         (ly:music-property music 'tweaks)
   ) ;; end acons
  ) ;; end set
   music
 ) ;; end let
)

% % left-hand finger guide finger between notes
% #(define (gx slope character fingering)
%   ;; Purpose
%   ;;   add ornamentation character before fingering symbol
%   ;; Parameters
%   ;;   slope : angle of rotation around right centre
%   ;;   character : ornamentation character for fingering
%   ;;   fingering : fingering designation for note
%   ;; Examples
%   ;;   (gx 0 #x2013 fingering)
%   ;;       unicode #x2011 <-> #x2015 are different length "-" punctuation
%   (let ((music (make-music 'FingeringEvent))
%               (finger (ly:music-property fingering 'digit))
%               (guide-char character))
%       (set! (ly:music-property music 'tweaks)
%         (acons 'stencil
%                (lambda (grob)
%                 (ly:stencil-aligned-to
%                  (ly:stencil-combine-at-edge
%                    (ly:stencil-rotate (grob-interpret-markup grob (markup 
#:char guide-char))
%                         slope 1 0)            ;; rotate "slope" around right 
centre
%                    X 1                                ;; combine stencils 
along X-axis on right
%                    (grob-interpret-markup grob (number->string finger))
%                    0.2)
%                  0 1)
%                )                              ;; add padding to move guide 
slightly left from finger number
%                (ly:music-property music 'tweaks)))
%       music))

% guide-neutral
%   <c-\gn-1>4  c4^\gn^2  c4-\gn-3  c4_\gn_4
gn = #(define-music-function (parser location fingering) (ly:music?)
           (guide-finger 0 0.7 fingering)) % line-slope line-length
% guide-down
%   <c-\gd-1>4  c4^\gd^2  c4-\gd-3  c4_\gd_4
gd = #(define-music-function (parser location fingering) (ly:music?)
           (guide-finger 20 0.7 fingering))
% guide-up
%   <c-\gu-1>4  c4^\gu^2  c4-\gu-3  c4_\gu_4
gu = #(define-music-function (parser location fingering) (ly:music?)
           (guide-finger -20 0.7 fingering))
% guide slope
%   <c-\gsl #-15 -1>4  c4^\gsl #45 ^2  c4-\gsl #-15 -3  c4_\gsl# -14 _4
gsl = #(define-music-function (parser location slope fingering) (number? 
ly:music?)
           (guide-finger slope 0.7 fingering))
% guide slope length
%   <c-\gsl #-15 #1 -1>4  c4^\gsl #45 #1 ^2  c4-\gsl #-15 #1 -3  c4_\gsl 1 #2 _4
gsn = #(define-music-function (parser location slope len fingering) (number? 
number? ly:music?)
                (guide-finger slope len fingering))

% function to slope beams. Often needed when fingering is colliding with the 
beam
% the two parameters are the position of the left- and right-hand ends of the 
beam
% eg. \slope #6 #7
slope = #(define-music-function (parser location move) (pair?) #{
        \once \override Beam #'positions = #move
#})

% shortcut for once-off moving of fingering, string number indications, etc
% eg. \offset "StringNumber" #'(0.5 . 0)
%     \offset "Fingering" #'(0.7 . 0)
%     \offset "TextScript" #'(0 . -4)
offset = #(define-music-function (parser location type move) (string? pair?) #{
        \once \override $type #'extra-offset = #move
#})

% shortcut for moving notecolumn left or right
% eg. \ncShift #0.7
% to move 0.7 staff units to the right
ncShift = #(define-music-function (parser location move) (number?) #{
        \once \override NoteColumn #'force-hshift = #move
#})

% shortcut for moving rest left or right
% eg. \rShift #0.7
% to move 0.7 staff units to the right
rShift = #(define-music-function (parser location move) (number?) #{
        \once \override Voice.Rest #'X-offset = #move
#})

#(define (colour-alteration? note symbol)
(let ((p (ly:music-property note 'pitch)))
(and (ly:pitch? p)
(equal? (ly:pitch-alteration p) symbol))))

colouration = #(define-music-function (parser location music) (ly:music?)
(music-map
        (lambda (event)
                (if (eq? 'EventChord (ly:music-property event 'name))
                        (map (lambda (note)
                                (if (colour-alteration? note SHARP)
                                (ly:music-set-property! note 'tweaks (list 
(cons 'color red))) note)
                                (if (colour-alteration? note FLAT)
                                (ly:music-set-property! note 'tweaks (list 
(cons 'color blue))) note))
                        (ly:music-property event 'elements))) event) music))

stemLen = #(define-music-function (parser location stemlength) (number?) #{
        \once \override Stem #'length = #stemlength
#})

% extend laissez-vibrer tie
extendLV = #(define-music-function (parser location further) (number?) #{
        \once \override LaissezVibrerTie #'X-extent = #'(0 . 0)
        \once \override LaissezVibrerTie #'details #'note-head-gap = #(/ 
further -2)
        \once \override LaissezVibrerTie #'extra-offset = #(cons (/ further 2) 
0)
#})

% lilypond doesn't correctly handle accidental rules on volta alternatives
% e.g. \repeat { c } \alternative { { cis } { \forget c } }
forget = #(define-music-function (parser location music) (ly:music?) #{
        \accidentalStyle "forget"
        $music
        \accidentalStyle "modern"
#})

% shortcut for setting arpeggio padding
arppad = #(define-music-function (parser location pad) (number?) #{
        \once \override Arpeggio #'padding = #pad
#})

arpspace = #(define-music-function (parser location extent) (pair?) #{
        \once \override Staff.Arpeggio #'X-extent = #extent
#})

barspace = #(define-music-function (parser location extent) (pair?) #{
        \once \override Staff.BarLine #'extra-spacing-width = #extent
#})

clefspace = #(define-music-function (parser location extent) (pair?) #{
        \once \override Staff.Clef #'extra-spacing-width = #extent
#})

stemspace = #(define-music-function (parser location extent) (pair?) #{
        \once \override Staff.Stem #'X-extent = #extent
#})

restspace = #(define-music-function (parser location extent) (pair?) #{
        \once \override Staff.Rest #'X-extent = #extent
#})

arpfinger = #(define-music-function (parser location pad) (number?) #{
        \once \override Staff.Arpeggio #'direction = #RIGHT
        \once \override Staff.Arpeggio #'padding = #pad
#})

accspace = #(define-music-function (parser location extent) (pair?) #{
    \once \override Staff.Accidental #'X-extent = #extent
#})

% e.g. c-\underlineFinger #4
underlineFinger = #(define-music-function (parser location finger) (integer?)
        (let ((music (make-music 'FingeringEvent)))
                (set! (ly:music-property music 'digit) finger)
                (set! (ly:music-property music 'tweaks)
                        (acons 'stencil (lambda (grob)
                                (grob-interpret-markup
                                grob
                                (markup #:underline (number->string finger))))
                        (ly:music-property music 'tweaks)))
                music))

#(define ((grob2-extra-offset offset) grob)
        (let* (
                (orig (ly:grob-original grob))
                (siblings (if (ly:grob? orig)
                        (ly:spanner-broken-into orig)
                        '())))
        (if (and (>= (length siblings) 2)
                (eq? (car (last-pair siblings)) grob))
        (ly:grob-set-property! grob 'extra-offset offset))))

albOffset = #(define-music-function (parser location type move) (string? pair?) 
#{
        \once \override $type #'after-line-breaking = #(grob2-extra-offset move)
#})

#(define-public EasyHeadsSize 1.0)

#(define-public (note-head::Brew-ez-stencil grob)
  (let* ((log (ly:grob-property grob 'duration-log))
         (pitch (ly:event-property (event-cause grob) 'pitch))
         (pitch-index (ly:pitch-notename pitch))
         (note-names (ly:grob-property grob 'note-names))
         (pitch-string (if (and (vector? note-names)
                                (> (vector-length note-names) pitch-index))
                           (vector-ref note-names pitch-index)
                           (string
                            (integer->char
                             (+ (modulo (+ pitch-index 2) 7)
                                (char->integer #\A))))))
         (staff-space (ly:staff-symbol-staff-space grob))
         (line-thickness (ly:staff-symbol-line-thickness grob))
         (stem (ly:grob-object grob 'stem))
         (stem-thickness (* (if (ly:grob? stem)
                                (ly:grob-property stem 'thickness)
                                1.3)
                            line-thickness))
         (radius (/ (+ staff-space line-thickness) EasyHeadsSize))
         (letter (markup #:center-align #:vcenter pitch-string))
         (filled-circle (markup #:draw-circle radius 0 #t)))

    (ly:stencil-translate-axis
     (grob-interpret-markup
      grob
      (if (>= log 2)
          (make-combine-markup
           filled-circle
           (make-with-color-markup white letter))
          (make-combine-markup
           (make-combine-markup
            filled-circle
            (make-with-color-markup white (make-draw-circle-markup
                                           (- radius stem-thickness) 0 #t)))
           letter)))
     radius X)))

EasyHeadsOn = {
        \override NoteHead #'stencil = #note-head::Brew-ez-stencil
%       \override NoteHead #'font-size = #-8
        \override NoteHead #'font-size = #-1
        \override NoteHead #'font-family = #'sans
        \override NoteHead #'font-series = #'bold
}

EasyHeadsOff = {
        \revert NoteHead #'stencil
        \revert NoteHead #'font-size
        \revert NoteHead #'font-family
        \revert NoteHead #'font-series
}

\layout {
        \pointAndClickOff
        \override Score.ClefModifier #'font-shape = #'upright
        \override Score.ClefModifier #'font-name = #"times"
        \override Score.ClefModifier #'font-size = #-2
        \override Score.LyricText #'font-size = #3
        \override Score.Fingering #'font-name = #"sans-serif"
        \override Score.Fingering #'font-size = #-2
        \override Score.StrokeFinger #'font-name = #"sans-serif"
        \override Score.StrokeFinger #'font-size = #-1
        indent = 0
} % layout


% Local Variables: %
% tab-width: 4 %
% End: %

=================================================

Attachment: OCanada.pdf
Description: Adobe PDF document

Attachment: lessons.pdf
Description: Adobe PDF document


reply via email to

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