Sequentielle Musik shiften

Zur Navigation springen Zur Suche springen

Für die Erzeugung der Umkehrungen von leiterereigenen Mehrklängen benötige ich die Tonleitern mit einem anderen Beginn als den Grundton. Der Code auf dieser Seite erzeugt eine Art Umkehrung der sequentiellen Musik, die Anzahl der Töne, um die verschoben werden soll, wird als Parameter übergeben.

Die nach hinten verschobenen Töne werden um eine Oktave erhöht. Es wird keine Rücksicht darauf genommen, ob der 2. Parameter größer ist als die Anzahl der Noten in Music.

Anwendung

Lily-Code

shiftSeqMus =
#(define-music-function ( music n)
   (ly:music? integer?)
   #{ \musicMap #(shift n) $music #})

mus = \relative c' { c d e f g a h c }
#'()
\mus
\shiftSeqMus \mus 3
#(display-lily-music mus)
#(display-lily-music (shiftSeqMus mus 3))

Lily Music

{
  c'4 d'4 e'4 f'4 g'4 a'4 h'4 c''4
}
{
  f'4 g'4 a'4 h'4 c''4 c''4 d''4 e''4
}

Graphische Ausgabe

Shiftmus.png

Scheme-Code

Einfügen: {{:Sequentielle Musik shiften/code}}

#(define (split xs n)
   (let loop ((i n) (first '()) (second xs))
     (if (or (zero? i) (null? second))
         (list (reverse first) second)
         (loop (- i 1) (cons (car second) first) (cdr second)))))

#(define (rotate xs n)
   (if (< n 0)
       (reverse (rotate (reverse xs) (- n)))
       (let ((parts (split xs n)))
         (append (cadr parts) (car parts)))))

#(define (shift n)
   (lambda (music)
     (let* ((elts (ly:music-property music 'elements))
            (l (length elts))
            (eventtype (ly:music-property music 'name))
            (pitches (map (lambda (x) (ly:music-property x 'pitch))
                       (filter
                        (lambda (y)
                          (music-is-of-type? y 'note-event))
                        elts)))
            ;; … and put them in order.
            (rotated (rotate pitches n)))
       (if (and (eq? eventtype 'SequentialMusic)
                (>= l n))
           (begin
            (map
             (lambda (e p)
               (ly:music-set-property! e 'pitch p))
             elts rotated)
            ;; first apply the rotated pitches
            ;; to the actual notes.
            (map (lambda (x)
                   (list-set! elts (- (- l x) 1)
                     (ly:music-transpose
                      (list-ref elts (- (- l x) 1))
                      (ly:make-pitch 1 0))))
              (iota n))
            ))
       music)))