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,
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
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.