Hi, I more or less finished my music function. The result is added.I didn't really solved the issues I addressed to the list but avoided them. Now I store the default format for the rehearsal mark in my own function "format-mark-default" so that I can use it in my music function RehearsalMarkWithText and can change back to the default after printing with RehearsalMark.
I still think that it should be possible to use the calculated value for the alignment directly so help on that point is appreciated.
Greetings, Ed Op 01-04-11 13:57, Ed Gordijn schreef:
Hi, I'am working on a music function that creates a rehearsal mark with extra text added. It would be nice if the end result would be something that would work as: \mark \default "text". These are my first steps into the world of scheme, so I suppose that some of my questions are rather basic. The code below more or less works and shows what I am trying to achieve but is not perfect at all! So, I need some help to solve the drawbacks. Here are the issues that need attention: 1 - I would like to use the current format for the rehearsal mark. Is it possible to call/use the current Score.markFormatter and store the mark in a markup-variable? 2 - Now I redefine the Score.markFormater with "/once /set" but "/once" generates warnings. What is wrong? 3 - Is it possible to avoid the /set Score.markFormatter and use the /mark /markup /center-at-mark directly? I could use [1] to retrieve the current mark and should increment the counter: Score.rehearsalMark = Score.rehearsalMark + 1 4 - Allignment is ok but the extend is not correct, see the allignment of the first rehearsal mark that moves up because of the second mark.
\version "2.13.39" % #(ly:set-option 'debug-skylines) #(define (format-mark-default mark context) " Set the format for the RehearsalMark. From the manual: The file scm/translation-functions.scm contains the definitions of format-mark-numbers " ; Uncomment one of these options ; (format-mark-alphabet mark context) ; (format-mark-box-alphabet mark context) ; (format-mark-circle-alphabet mark context) ; (format-mark-letters mark context) ; (format-mark-box-letters mark context) ; (format-mark-circle-letters mark context) ; (format-mark-numbers mark context) (format-mark-box-numbers mark context) ; (format-mark-circle-numbers mark context) ; (format-mark-barnumbers mark context) ; (format-mark-box-barnumbers mark context) ; (format-mark-circle-barnumbers mark context) ) #(define-markup-command (center-at-mark layout props mark text x-align) (markup? string? number?) " Markup command used in RehearsalMarkWithText Check the value of x-align and print the correct value when neccessary " (let* ( (txt (markup #:normal-text #:bold #:normalsize #:concat (" " text))) (txt-stencil (interpret-markup layout props txt)) (txt-x-ext (ly:stencil-extent txt-stencil X)) (txt-width (- (cdr txt-x-ext)(car txt-x-ext))) (mrk-stencil (interpret-markup layout props mark)) (mrk-x-ext (ly:stencil-extent mrk-stencil X)) (mrk-width (- (cdr mrk-x-ext)(car mrk-x-ext))) (x-align-new (- (/ mrk-width (+ txt-width mrk-width)) 1 )) (x-dif (abs (- x-align-new x-align))) (x-dif-markup (markup #:small (format "Change x-align to: ~5,2F" x-align-new))) ) (interpret-markup layout props (if (< x-dif 0.02) (markup #:concat (mark txt)) ;else (markup #:with-color blue #:box (#:column (x-dif-markup #:with-color black #:concat (mark txt)))) ) ) )) RehearsalMarkWithText = #(define-music-function (parser location text x-align) (string? number?) " Calculate the value for x-align inside a markup script and hint the user for the correct value. This a a manual solution that (in my opinion) shouldn't be neccessary. The format for the RehearsalMark is defined in the procedure: format-mark-default text this is a string that is addded with a dividing space to the RehearsalMark x-align this defines the alignment: -1 is left and +1 is right. Use -1 for your first call and the correct value will be printed near the RehearsalMark. " #{ % Redefine the Rehearsal mark % \once does work but generates multiple warning. \set Score.markFormatter = #(lambda (mark context) (markup #:center-at-mark (format-mark-default mark context)$text $x-align)) \once \override Score.RehearsalMark #'self-alignment-X = #$x-align \mark \default % Revert to the original format: This doesn't work in here! % Thats why I defined \RehearsalMark which is used instead of \mark \default %\set Score.markFormatter = #format-mark-box-numbers %\unset Score.markFormatter #}) % Use this function instead of \mark \default RehearsalMark = { \set Score.markFormatter = #format-mark-default \mark \default } \score { \relative c'' { \clef "G" \key c \major \time 4/4 % Setting the startingpoint can be omitted as you would normaly start at #1 \set Score.rehearsalMark = #10 \RehearsalMarkWithText #"Theme from 007" #-1 % This means left aligned which is a good start c1 e( f) \bar "||" \RehearsalMarkWithText #"Theme from 007" #-0.83 % The calculated value for x-align is applied g( e) \break \RehearsalMark % Revert to \mark \default c1 e( f) \bar "||" \RehearsalMark g( e) } } \layout{ indent = 0 ragged-right = ##t \context { \Staff \remove "Time_signature_engraver" } } %%% end of example
<<attachment: CenterMark.png>>
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-user