Hi Jay,

nice example! But I think it would be even better if I could write
\brokenoctaves #1 { c4 d e f g8 a b c } meaning that the function also
recognizes the durations of the notes.
Maybe you could be so kind to explain how your functions work. Then we
could also learn from it and possibly improve it. Is that possible?

Dominic

2008/7/26 Jay Anderson <[EMAIL PROTECTED]>:
> Stefan Thomas <kontrapunktstefan <at> googlemail.com> writes:
>>
>> Dear Lilypond-users, I have in mind an input like:\relative { \brokenoctaves
> {c d e f g }}and the desired output is:\relative { c c' d d' e e' f f' g g' 
> }Can
> this be done automatically?
>>
>
> Play with this see if it does what you want.
>
> -----Jay
>
> \version "2.11.52"
>
> #(define (get-pitches mus)
>  (map
>    (lambda (x)
>      (ly:music-property (car (ly:music-property x 'elements)) 'pitch))
>    (ly:music-property mus 'elements)))
>
> #(define (make-sequential-music elements)
>  (make-music
>    'SequentialMusic
>    'elements
>    elements))
>
> #(define (interleave-lists l1 l2)
>  (cond ((null? l1) l2)
>        ((null? l2) l1)
>        ((and (null? l1) (null? l2)) '())
>        (else (cons (car l1) (cons (car l2) (interleave-lists (cdr l1) (cdr
> l2)))))))
>
> #(define (interleave-music m1 m2)
>  (make-sequential-music
>    (interleave-lists (ly:music-property m1 'elements) (ly:music-property m2
> 'elements))))
>
> #(define (create-music-list pitches duration)
>  (make-sequential-music
>    (map
>      (lambda (p)
>        (make-music
>          'EventChord
>          'elements
>          (list (make-music
>                  'NoteEvent
>                  'duration duration
>                  'pitch p))))
>      pitches)))
>
> #(define (transpose-all-but-first pitches amt)
>  (cons (car pitches) (map
>    (lambda (pitch)
>      (ly:make-pitch
>        (+ amt (ly:pitch-octave pitch))
>        (ly:pitch-notename pitch)
>        (ly:pitch-alteration pitch)))
>    (cdr pitches))))
>
> #(define (set-octave pitches octave)
>  (map
>    (lambda (pitch) (ly:make-pitch octave (ly:pitch-notename pitch)
> (ly:pitch-alteration pitch)))
>    pitches))
>
> brokenoctaves = #(define-music-function (parser location dur arg mus) 
> (integer?
> integer? ly:music?)
>  (let* ((pitches (get-pitches mus))
>         (duration (ly:make-duration dur 0 1 1)))
>    (interleave-music
>      (create-music-list (transpose-all-but-first pitches (- arg)) duration)
>      (create-music-list (set-octave pitches (1- arg)) duration))))
>
> \score
> {
>  \new Staff \relative c'
>  {
>    %First argument is the duration (3 - eight, 4 - sixteenth, etc.).
>    %Second argument is 1 for up and -1 for down.
>    %Third argument is the music
>    %
>    %Shortcomings:
>    % - Next note after \brokenoctave section is in the wrong octave
>    %   compared with what one would expect in relative mode.
>    \brokenoctaves #3 #1 { c d e f g c, c' c,}
>    \brokenoctaves #3 #-1 { c, d e f g c, c' c,}
>  }
> }
>
>
>
>
> _______________________________________________
> lilypond-user mailing list
> lilypond-user@gnu.org
> http://lists.gnu.org/mailman/listinfo/lilypond-user
>


_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to