\version "2.12.1" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +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:warning (_ " ~a bad thumb-bracket ~a ~a~a~a") location p1 "" p2 "")) (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 (parser location spec settings) (string? list?) (let* ( (props (make-thumb-bracket-props location spec settings))) (define (get key) (assq-ref props key)) (if (null? props) (make-music 'SequentialMusic 'void #t) #{ \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 (parser location spec) (string?) (let ((settings thumbBracketSettings)) ;% as Defaults, or user defined ((ly:music-function-extract thumbBracketEx) parser location 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 #(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 = { 4 16[ 16 c''16 16] } rhlo = { d''8[ ees''!8] \thBr "L" fis'16[ g'16 \thBr "R" a'16 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 = { 2-> -> 2.*2/3-> } rhlo = { s1 8--[ 8--] 8--[ 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*" 8--[ 8--] 8--[ c'8--] } lhlo = { 4.-- c8-. 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" 8.[ 16 8] r8 \thBr "R*" 8-.[ 8-.] 4. } lhhi = { \oneVoice s4. r8 s4 s4. } lhlo = { \thBr "R" 8.[ 16 8] s8 8^.[ 8^.] 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*=" 2. ~ gis4 cis8 gis!4 g8 } lhlo = { 2. 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 8[\( 8] 4 8 4 8 4 8\) } rhlo = { \partial 4 r8 r8 r8 bes'8[ bes'8] r8 e''8[ e''8] 8[ 8 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 8[ \thBr "R" 8] s8 \thBr "R102=" 8[ 8] \stemUp 8[8 ] } \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 (parser location 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 ~ 1 } rhhiB = { \once \override Arpeggio #'arpeggio-direction = #down \arpLengthenTo #-4 1\arpeggio ~ 1 } rhhi = { \rhhiA \rhhiB } rhlo = \repeat unfold 2 { \thBr "l22]" 1 ~ 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) 8[ 8] 8[ 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 } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%