Mark Polesky wrote:
Does anyone have a suggestion?
Some time back I chose this missing bracket as a theme for a Scheme exercise. Nothing revolutionary, just to get some practice in Scheme. It has the limitations arising from misusing Arpeggio. I found it needed a lot of different tweaks to get it to fit each situation, so it ended up with the tweak options packed into a single string parameter. My Scheme stuff is ready for beta testing, but that would need an instruction manual explaining the tweaks. I had to interrupt this documentation work a few months back, and could probably resume fairly soon. It would be nice if something like this could have its own engraver and so avoid the Arpeggio-sharing limitations.
Using my thumbBracket code in the demo file, Oscar's first bar would read something like
\new Staff = "down" { \clef bass \set tieWaitForNote = ##t \times 2/3 { cis,8~ d~ \thBr "R4001" a~ } <cis, d a>4 \times 2/3 { d,8~ fis~ \thBr "R" d'~ } <d, fis d'>4 \bar "||" } Cheers, Robin
\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 = { <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 "R102=" <bes e' bes'>8[ <cis, cis>8] \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 (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 ~ <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 } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<<attachment: with_thumbBracket.png>>
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-user