Nicolas Sceaux <[EMAIL PROTECTED]> writes:

> Hello,
>
> Manipulating music expressions makes me impatient and lazy (don't know
> about hubris). Here is a little utility which can be used as a
> shortcut for ly:music-property : 
>

hm, this was not enough.

(define (read-dotted-expression chr port)
  (define (gen-music-prop-expr music prop . rest)
    (let ((result-expr (if (number? prop)
                           `(list-ref ,music ,prop)
                           `(ly:music-property ,music ',prop))))
      (if (null? rest)
          result-expr
          (apply gen-music-prop-expr result-expr rest))))
  (let ((tokens (map (lambda (token)
                       (or (string->number token) 
                           (string->symbol token)))
                     (string-split (symbol->string (read port)) #\.))))
    (apply gen-music-prop-expr tokens)))

(read-hash-extend #\@ read-dotted-expression)


guile> (define titi #{ \notes { c d e } #})
guile> (mus:display titi)
(make-music 'SequentialMusic
  'elements (
             (make-music 'SequentialMusic
               'elements (
                          (make-music 'EventChord
                            'elements (
                                       (make-music 'NoteEvent
                                         'duration (ly:make-duration 2 0 1 1)
                                         'pitch (ly:make-pitch -1 0 0))))
                          (make-music 'EventChord
                            'elements (
                                       (make-music 'NoteEvent
                                         'duration (ly:make-duration 2 0 1 1)
                                         'pitch (ly:make-pitch -1 1 0))))
                          (make-music 'EventChord
                            'elements (
                                       (make-music 'NoteEvent
                                         'duration (ly:make-duration 2 0 1 1)
                                         'pitch (ly:make-pitch -1 2 0))))))))
guile> (set! [EMAIL PROTECTED] (ly:make-pitch -1 4 0))
guile> (mus:display titi)
(make-music 'SequentialMusic
  'elements (
             (make-music 'SequentialMusic
               'elements (
                          (make-music 'EventChord
                            'elements (
                                       (make-music 'NoteEvent
                                         'duration (ly:make-duration 2 0 1 1)
                                         'pitch (ly:make-pitch -1 0 0))))
                          (make-music 'EventChord
                            'elements (
                                       (make-music 'NoteEvent
                                         'duration (ly:make-duration 2 0 1 1)
                                         'pitch (ly:make-pitch -1 1 0))))
                          (make-music 'EventChord
                            'elements (
                                       (make-music 'NoteEvent
                                         'duration (ly:make-duration 2 0 1 1)
                                         'pitch (ly:make-pitch -1 4 0))))))))



_______________________________________________
lilypond-devel mailing list
[EMAIL PROTECTED]
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to