Stan Sanderson wrote:
Certain marks are used to indicate emphasis (phrase breaking) and across-staff fingering.


I don't know about the phrase breaking, but you could try doing the across-staff fingering with my undocumented code, called thumbBracket.

Look at the Reger 17 and 60 examples in the demo.

The .ily file provides the \thumbBracket funtion which the demo file abbreviates to \thBr. You call this with a string parameter which starts with the letter R or L, for right or left. You can then append a digit to make the stem longer.

The attached files are updated versions which need 2.24 and should be ok with Guile3.


Cheers,
Robin





\version "2.24.0"

% compatibility changes: u15k0830 u23k0114

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +thumb bracket

#(define (make-thumb-bracket-props location spec-str settings-alist) 
  (define (inchar? index) (> (string-length spec-str) index))
  (define (inchar  index) (string-ref spec-str index))
  (define (char->dir ch) 
   (case (char-upcase ch) ((#\R) 1) ((#\L) -1) (else 0))) 
  (define (char->digit ch)
   (if (char-numeric? ch) (- (char->integer ch) (char->integer #\0)) 0))
  (define (inhit->1 key-str) (if (string-contains spec-str key-str) 1 0))
  (define (get key) (assq-ref settings-alist key))
  (define (warn p1 p2) (ly:input-warning location 
   (G_ " bad thumb-bracket:   ~a ~a~a~a") p1 "\"" p2 "\"")) ; cf 
  (let* ( ;% decode spec                                                                     
    (vdir            (if (inchar? 0) (char->dir   (inchar 0)) 0))
    (vbigger  (* 0.5 (if (inchar? 1) (char->digit (inchar 1)) 0)))
    (vfurther (* 0.5 (if (inchar? 2) (char->digit (inchar 2)) 0)))
    (hcloser  (* 0.5 (if (inchar? 3) (char->digit (inchar 3)) 0)))
    (hrear    (* 0.5 (if (inchar? 4) (char->digit (inchar 4)) 0)))
    (vbigger+ (* 5 (string-count spec-str #\|)))
    (posdir   ((if (string-contains spec-str "*") - +) vdir))
    (hcloser? (eq? (string-contains spec-str "!") #f))
    (vtip=?   (string-contains spec-str "="))
    (hdir-req (- (inhit->1 "]") (inhit->1 "[")))
    (closed? (char-lower-case? (inchar 0))))
   (if (zero? vdir) (begin (warn "first char in" spec-str) '())
   (let* ( ;% collect settings
    (hdir-init (get 'hdir-init))   (htip (get 'htip)) 
    (vtip (get (if vtip=? 'vtip= 'vtip)))  
    (vstem (get 'vstem))   (vmin (get 'vmin))   (hvernier (get 'hvernier))
    (vO 0) (hO 0) (hpad-base 0.5) ;% givens
    (hdir (if (zero? hdir-req) hdir-init hdir-req))
    (hflip? (positive? hdir))
    (h-interval 
     (if (positive? hdir) (cons hO (+ htip hrear)) (cons (- hrear) htip)))
    (vsize (+ vtip (if closed? vtip vstem) vbigger vbigger+))
    (vsize+ (if (and closed? (< vsize vmin)) (- vmin vsize) 0))
    (vshift (+ vfurther vtip (* 0.5 vsize+)))
    (bracket (lambda (grob) (let* ( ;% collect chord range from grob
      (vnote-lo-hi (ly:grob-property grob 'positions))
      (vnote ((if (eq? posdir 1) cdr car) vnote-lo-hi)))
     (grob-interpret-markup grob (markup #:translate (cons 
        ((if (positive? hdir) - +) hvernier) (- vnote (* vdir vshift)))
       #:combine #:draw-line (cons htip vO) #:combine 
        #:translate (cons hO (if closed? (* vdir (+ vsize vsize+)) vO))
         #:draw-line (cons htip vO)
        #:translate (cons (if (positive? hdir) htip hO) vO)
         #:draw-line (cons hO (* vdir (+ vsize vsize+)))))))))
    ;% alist of props for misusing Arpeggio as a thumb bracket
    `((stencil . ,bracket) 
      (X-extent . ,h-interval) 
      (padding . ,((if hcloser? - +) hpad-base hcloser)) 
      (direction . ,hdir) 
      (thickness . ,(get 'weight)))))))

thumbBracketEx = #(define-music-function 
  (spec settings) (string? list?)
 (let* (
   (props (make-thumb-bracket-props (*location*) spec settings)))
   (define (get key) (assq-ref props key))
  (if (null? props) #{ #} ;% abort without bracket
   #{
     \once \override Arpeggio.stencil   = #(get 'stencil)
     \once \override Arpeggio.X-extent  = #(get 'X-extent)
     \once \override Arpeggio.padding   = #(get 'padding)
     \once \override Arpeggio.direction = #(get 'direction) 
     \once \override Arpeggio.thickness = #(get 'thickness)
     $(make-music 'EventChord 'elements (list (make-music 'ArpeggioEvent)))
   #})))

thumbBracket = #(define-music-function (spec) (string?)
 (let ((settings thumbBracketSettings)) ;% as Defaults, or user defined
    #{ \thumbBracketEx $spec $settings #}))

thumbBracketDefaults = #(quasiquote( 
  (hdir-init . ,LEFT) ;% usual placement wrt note: on RIGHT or LEFT
  (weight    . 1.5  ) ;% line thickness
  (htip      . 0.8  ) ;% horizontal length of bracket tip
  (vtip      . 0.75 ) ;% usual vertical overlap beyond notehead centre 
  (vtip=     . 0.30 ) ;% alternative vertical overlap 
  (vstem     . 1.25 ) ;% length of an unextended open bracket (excl. tip)
  (vmin      . 0.6  ) ;% minimum length of a closed bracket
  (hvernier  . 0.2  ) ;% horizontal quasi-extra-offset
  ))

thumbBracketSettings =  \thumbBracketDefaults
             
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -thumb bracket

Attachment: thumbBracket_demo.pdf
Description: Adobe PDF document

\version "2.24.0"

\include "thumbBracket.ily"
#(define thBr thumbBracket) thbR = \thBr "R" thbL = \thBr "L"



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key f \major
  \time 4/4
  \override Staff.TimeSignature.stencil = ##f
}
rhhi = { c'''16--[ b''16-- d'''16--  f''16--] }
rhlo = { d''32[ \thBr "L9" f''32 ees''32 d''32 ~ d''16 c''32 b'32] }
lhhi = { g'32[ aes'32 g'32 f'32 g'32 f'32 ees'32 d'32] }
lhlo = { s4 }
\markup "Reger 14"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef treble \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key bes \major
  \time 4/4
  \override Staff.TimeSignature.stencil = ##f
}
rhhi = { <bes' bes''>4 <c''! a''>16[ <bes' g''>16 c''16 <ees''! g''>16] }
rhlo = { d''8[ ees''!8] \thBr "L" fis'16[ g'16 \thBr "R" a'16 <g' bes'>16] }
lhhi = { d'8[ ees'!8] c'16[ bes16 c'16 bes16] }
lhlo = { bes4 fis16[ g16 a16 bes16] }

\markup "Reger 17"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef treble \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key bes \major
  \time 4/4
  \mergeDifferentlyHeadedOn
  \mergeDifferentlyDottedOn
  \override Staff.TimeSignature.stencil = ##f
}
rhhi = { <ees' g' bes' ees''>2-> <c' f' a' c''>-> <f' f''>2.*2/3-> }
rhlo = { s1  <a' c''>8--[ <f' a'>8--] <f' ~ bes'>8--[ <f' c''>8--]  }
lhhi = { c8[ g16 a16] bes16[ g16 c'8]  
         \thBr "R" c'16[ d'16 ees'16 d'16] c'16[ d'16 ees'16 c'16] 
         \thBr "L4*" <a c'>8--[ <f a>8--] <f bes>8--[ c'8--] }
lhlo = { <c, c>4.-- c8-. <f, f>4.-- a,8-. d4-- d8--[ c8--] }

\markup "Reger 60"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef bass   \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key aes \major
  \time 9/8
  \mergeDifferentlyHeadedOn
  \mergeDifferentlyDottedOn
  \override Staff.TimeSignature.stencil = ##f
}
rhhi = { ees''4.-> ees''4.-> ~ ees''8[ d''8 ees''8] }
rhlo = { \thBr "L" <aes aes'>8.[ <aes aes'>16 <aes aes'>8] r8 
         \thBr "R*" <ees' g'>8-.[ <ees' g'>8-.] <ees' aes'>4. }
lhhi = { \oneVoice s4. r8 s4 s4. } 
lhlo = { \thBr "R" <c ees ees'>8.[ <c ees ees'>16 <c ees ees'>8] s8 
          <bes, ees des'>8^.[ <beses, ees des'>8^.] <aes, ees c'>4.^> }

\markup "Scriabin IMSLP #02002 II bar48"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef bass   \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key fis \major
  \time 12/8
  \mergeDifferentlyHeadedOn
  \mergeDifferentlyDottedOn
  \override Staff.TimeSignature.stencil = ##f
}
rhhi = { eis'2. ~ eis'4. eis'4. }
rhlo = { cis'2. ~ cis'4. cis'4. }
lhhi = { \thBr "r4*=" <eis gis>2. ~ gis4 cis8 gis!4 g8 } 
lhlo = { <cis, cis>2. <gisis,, gisis,>2. }

\markup "Scriabin IMSLP 10999 p5"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef bass   \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key bes \major
  \time 9/8
  \mergeDifferentlyHeadedOn
  \mergeDifferentlyDottedOn
  \override Staff.TimeSignature.stencil = ##f
}
rhhi = { \partial 4 <cis' cis''>8[\( <d' d''>8] <ees' ees''>4 
         <e' e''>8 <fis' fis''>4 <g' g''>8 <g' g''>4 <fis' fis''>8\) }
rhlo = { \partial 4 r8 r8 r8 bes'8[ bes'8] r8 e''8[ e''8] 
         <a' ees''>8[ <a' ees''>8 <c'' ees''>8] }
lhhi = { \partial 4 \oneVoice r8 r8 r8 s4 
         \once \override Rest.X-extent = #'(0 . 2.5) 
         r8 s4 s4.}
lhlo = { \partial 4 s4 s8 <cis, cis>8[ 
         \thBr "R" <g bes g'>8] s8 
         \thBr "R1=" <bes e' bes'>8[ <cis, cis>8] % cf u14d0520
         \stemUp <cis, cis>8[<c, c>8 <a, a>] }

\markup "Scriabin IMSLP 08382 p47"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef bass   \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key bes \major
  \time 4/4
  \mergeDifferentlyHeadedOn
  \mergeDifferentlyDottedOn
  \override Staff.TimeSignature.stencil = ##f
}
arpLengthenTo = #(define-music-function (bound) (integer?)
#{ \once \override Arpeggio.positions = #(lambda (grob)
   (interval-union (cons bound bound) (ly:arpeggio::calc-positions grob)))
#})

%%% saw what looked like tie pushing arpeggio vertically when doubled up alto
rhhiA = {
  \once \override Arpeggio.arpeggio-direction = #down 
  \once \override NoteColumn.force-hshift = #-0.2 
  <\tweak transparent ##t  d' ees'' g'' c'''>1\arpeggio ~ <ees'' g'' c'''>1 }
rhhiB = {
  \once \override Arpeggio.arpeggio-direction = #down 
  \arpLengthenTo #-4
  <ees'' g'' c'''>1\arpeggio  ~ <ees'' g'' c'''>1 }
rhhi = { \rhhiA \rhhiB }
rhlo = \repeat unfold 2 { \thBr "l22]" <f' bes'>1 ~ <f' bes'>1 }
lhhi = \repeat unfold 2 { \oneVoice r1 r1}
lhlo = \repeat unfold 2 { s1 s1 }

\markup "F9sus"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef bass   \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global = {
  \key f \major
  \time 3/4
  \mergeDifferentlyHeadedOn
  \mergeDifferentlyDottedOn
}
rhhi = { a'2. }
rhlo = { r4 
  \thumbBracketEx "L442" #(acons 'htip 2.5 thumbBracketSettings) 
  <a c'>8[ <bes d'>8] <c' e'>8[ <a c'>8] }
lhhi = { f,2.}
lhlo = { \hideNotes f,16 } % spacing hack

\markup "Possibility"
\score {
\new PianoStaff <<
  \new Staff = "rh" { \clef treble \global << \rhhi \\ \rhlo >>}
  \new Staff = "lh" { \clef bass   \global << \lhhi \\ \lhlo >>}
>>
\layout { indent = 0.0\cm }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Reply via email to