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