There is also some code in the list archives: https://lists.gnu.org/archive/html/lilypond-user/2018-05/msg00167.html
> 1 feb. 2024 kl. 00:49 skrev Robin Bannister <r...@dabble.ch>: > > 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
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 } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>