Music-Funktion vereinfachen

Begonnen von Manuela, Sonntag, 26. Juli 2020, 17:20

« vorheriges - nächstes »

Manuela

Hi,
ich habe eine Funktion geschrieben, die ein Thema von Moll nach Dur "transponiert", indem ich die Erniedrigung der Stufen 3, 6 und 7 entferne (Brachialmethode).
Wie lässt sich die Funktion vereinfachen, sodass der Umweg über die music-function naturalizeMusic überflüssig wird?

\version "2.20.0"
\language "deutsch"

#(define (naturalize-pitch p)
   (let ((o (ly:pitch-octave p))
         (a (* 4 (ly:pitch-alteration p)))
         ;; alteration, a, in quarter tone steps,
         ;; for historical reasons
         (n (ly:pitch-notename p)))
     (if (= n 5) (set! a 0))
     (if (= n 2) (set! a 0))
     (if (= n 6) (set! a 0))
     (ly:make-pitch o n (/ a 4))))

#(define (naturalize music)
   (let ((es (ly:music-property music 'elements))
         (e (ly:music-property music 'element))
         (p (ly:music-property music 'pitch)))
     (if (pair? es)
         (ly:music-set-property!
          music 'elements
          (map naturalize es)))
     (if (ly:music? e)
         (ly:music-set-property!
          music 'element
          (naturalize e)))
     (if (ly:pitch? p)
         (begin
          (set! p (naturalize-pitch p))
          (ly:music-set-property! music 'pitch p)))
     music))

naturalizeMusic =
#(define-music-function (m)
   (ly:music?)
   (naturalize m))

music = \relative c' { h4 cis d e fis g ais h }

MollDur =
#(define-music-function (m p q)
   (ly:music? ly:pitch? ly:pitch?)
   #{
     \key $p \major \transpose c $p \naturalizeMusic \transpose $q c { $m }
   #}
   )

\markup "Thema in H-Moll"
\music
\markup "Thema in F-Dur"
\MollDur \music f h,

Danke für eure Hilfe
viele Grüße
-- Manuela

Arnold

Hallo Manuela,

wenn Du \musicMap verwendest, sparst Du Dir (nur) die rekursiven Aufrufe in #naturalize.
Da deren selbstdefinierte Wandler-Funktion die ly:music?-Elemente »von unten nach oben« abarbeitet, bleibt die Aufgabe zu suchen, wo die Tonhöhen definiert sind, erhalten.
Typischerweise benutzt man \musicMap, wenn man nur einige wenige Event-Typen bearbeiten will.

Ansonsten habe ich auch keine Vorschläge zu bieten.

Arnold

Manuela

Hallo Arnold,
danke für deine Antwort.

Die Funktion #naturalize habe ich aus der Dokumentation kopiert (daher der Name) und die Funktionalität abgeändert. Die Funktion habe ich inzwischen geändert auf
#(define (naturalize-pitch p)
   (let ((o (ly:pitch-octave p))
         (a (* 4 (ly:pitch-alteration p)))
         ;; alteration, a, in quarter tone steps,
         ;; for historical reasons
         (n (ly:pitch-notename p)))
     (if (= n 5) (set! a (+ a 2)))
     (if (= n 2) (set! a (+ a 2)))
     (ly:make-pitch o n (/ a 4))))


Was man mit evtl. Vorzeichenänderungen macht, hängt natürlich vom Stück ab.
Danke für eure Hilfe
viele Grüße
-- Manuela