Sun, 30 Nov 2003 11:24:53 -0700, Paul a dit : 

 > Guy Shaviv wrote:
 >> That's correct, I'm interested in how you can set up a command that takes a
 >> parameter. I actually even need two parameters as a partial barre has two
 >> parameters, on what fret and on how many strings. While for the full barre I
 >> can setup 12 commands (e.g. \barreI \barreII ...), its impractical to setup
 >> all the permutations for the partial barre, that would take 60 commands).
 >> 
 > I am trying to solve the same problem.  I have gotten this far:

 > #(define textPad( lambda( pad ) \property Score.TextScript \override
 > #'padding = pad ))

 > with several guessed variations of

 > (textPad 3)

 > Can someone help me finish the syntax?

In the following snippet, functions nthcdr and group are general
utilities. Macros mus:make-music and mus:context-override are
part of a LilyPond-specific toolkit. Function text-pad finally does
what you may want: it takes the padding value as a mandatory argument,
and a second optional argument which, if true, means that the property
override will happen only once. An example shows some variations of
its use.

---------------- toto.ly ------------------------
#(use-modules (ice-9 optargs))

#(define-public (nthcdr n source)
  (do ((rest source (if (pair? rest) (cdr rest)))
       (i 0 (1+ i)))
      ((= i n) rest)))

#(define-public (group source n)
  (if (zero? n) (error "zero length"))
  (letrec ((rec (lambda (source acc)
                  (let ((rest (nthcdr n source)))
                    (if (pair? rest)
                        (rec rest (cons (list-head source n) acc))
                        (reverse! (cons source acc)))))))
    (if (null? source) '() (rec source '()))))

#(defmacro*-public mus:make-music (name #:rest props)
  "Make a music expression, of type `name' (a non quoted symbol).
`props' describe the music expression properties. For isntance:
  (mus:make-music PropertySet 
                  symbol 'autoBeaming
                  value #f)"
  (let ((prop-clauses (group props 2))
        (gmus (gensym)))
    `(let ((,gmus (make-music-by-name ',name)))
       ,@(map (lambda (clause)
                     `(ly:set-mus-property! ,gmus ',(car clause) 
                                            ,(cadr clause)))
                   prop-clauses)
       ,gmus)))

#(defmacro*-public mus:context-override (context property setting
                                         value #:key (once #f))
  "Make a ContextSpeccedMusic with OverrideProperty element, similar
  to:
  [\\once] \\property context.property \override #'setting = #value"
  `(context-spec-music  
    (mus:make-music OverrideProperty 
                    once ,once
                    symbol ',property
                    grob-property ',setting
                    grob-value ,value)
    ',context))

#(define*-public (text-pad pad #:optional once)
  (ly:export (mus:context-override Voice TextScript padding pad 
                                   #:once once)))

\score { \notes { c'^"salut" c' #(text-pad 3.0 #t) c'^"salut"
  c'^"salut" c' #(text-pad 3.0) c'^"salut" c'^"salut" }}
---------------- toto.ly ------------------------

You might take a look at 
http://nicolas.sceaux.free.fr/schemingly/scheme-hacks.html
where you will find few other utilities of that kind, that may help
you build other functions for LilyPond. Lily 2.0 is required.

Best regards,
Nicolas




_______________________________________________
Lilypond-user mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/lilypond-user

Reply via email to