Based on smart-transpose, here's music-shift. It will just shift notes
by one delta degrees in the current key. It's very usefull for
typesetting scale execises.

#(define  (shift-pitch p delta)
   (make-pitch 
    (pitch-octave p) 
    (+ (pitch-notename p) delta)
    (pitch-alteration p)))

#(define (shift-music music delta)
  (let* ((es (ly-get-mus-property music 'elements))
         (e (ly-get-mus-property music 'element))
         (p (ly-get-mus-property music 'pitch))
         (body (ly-get-mus-property music 'body))
         (alts (ly-get-mus-property music 'alternatives)))

    (if (pair? es)
        (ly-set-mus-property
         music 'elements
         (map (lambda (x) (shift-music x delta)) es)))

    (if (music? alts)
        (ly-set-mus-property
         music 'alternatives
         (shift-music alts delta)))

    (if (music? body)
        (ly-set-mus-property
         music 'body
         (shift-music body delta)))

    (if (music? e)
        (ly-set-mus-property
         music 'element
         (shift-music e delta)))

    (if (pitch? p)
        (begin
          (set! p (shift-pitch p delta))
          (ly-set-mus-property music 'pitch p)))

    music))

pattern = \notes \relative c' { c8 d16 e f g a b | c4 r | }

\score {
  \context Staff {
    \notes \relative c' {
      \time 2/4;
      \pattern
      \apply #(lambda (x) (shift-music x 1))
          \pattern
      \apply #(lambda (x) (shift-music x 2))
          \pattern
    } 
  }
}

-- 
Laurent Martelli
[EMAIL PROTECTED]              http://www.linuxfan.com/~laurent


_______________________________________________
Gnu-music-discuss mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/gnu-music-discuss

Reply via email to