Hallo Manuela,
zunächst die Frage nach dem Ziel der potenziellen Funktion.
Soll die finale Ausgabe äquivalent
mus = \relative c' { c4 d e2 }
\new Staff
{
\transpose c cis \mus
\transpose c d \mus
\transpose c dis \mus
}
sein oder eher
mus = \relative c' { c4 d e2 }
\new Staff \transpose c cis \mus
\new Staff \transpose c d \mus
\new Staff \transpose c dis \mus
?
Zu `for-each' hier ein paar kommentierte Beispiele:
%% Zu jeden Element der Liste ls wird 1 addiert
%% _und_ neue Liste wird ausgegeben.
#(display
(let ((ls '(1 2 3)))
(map 1+ ls)))
%% Zu jeden Element der Liste ls wird 1 addiert
%% Sonst passiert nichts
%% Die Ausgabe ist #<unspecified>
#(display
(let ((ls '(1 2 3)))
(for-each 1+ ls)))
%% (1) `mus' wird lokal definiert indem die Noten c, e und g aus einem
%% Akkord ausgelesen werden
%% (2) Dann läuft eine procedure ab, die in das 'tweak-property eine Frabe
%% setzt.
%% Allerdings wird in der procedure `ly:music-set-property!' verwendet,
%% es setzt das property aber dessen Ausgabe ist #<unspecified>
%% Insoweit ist die Gesamtausgabe:
%% (list #<unspecified>
%% #<unspecified>
%% #<unspecified>)
%% Hier sollte man `for-each' verwenden nicht `map'
#(display-scheme-music
(let ((mus (event-chord-notes #{ <c e g> #})))
(map
(lambda (m col)
(ly:music-set-property! m 'tweaks (list (cons 'color col))))
mus
(list red green cyan))))
%% Selbst wenn man `mus' nachher ausgibt, so hat man doch erst eine Liste
%% erstellt und diese dann weggeworfen.
%% Schlechter Programmierstil!!
%% Besser:
#(display-scheme-music
(let ((mus (event-chord-notes #{ <c e g> #})))
(for-each
(lambda (m col)
(ly:music-set-property! m 'tweaks (list (cons 'color col))))
mus
(list red green cyan))
mus))
%% Um das Ergebnis auch gedruckt zu sehen, muß man es in sequentielle Musik
%% überführen:
$(make-sequential-music
(let ((mus (event-chord-notes #{ <c e g> #})))
(for-each
(lambda (m col)
(ly:music-set-property! m 'tweaks (list (cons 'color col))))
mus
(list red green cyan))
mus))
Zu Deinem Code:
(1)
Es ist nicht nötig alles in einen Ausdruck (begin ...) zu packen.
(2)
Insbesondere music-functions kann man auf toplevel-niveau definieren, d.h.
myFunction = #(define-music-function ...)
(3)
(lambda Musik Pitch ...)
ist tatsächlich "Blödsinn"
entweder
(lambda (Musik Pitch) ...) als eine procedure mit zwei Argumenten
oder
(lambda Musik ...) als `named-let', also eine rekursive Geschichte. Ich glaube aber nicht, daß Du das willst ...
(4)
(define PitchListe
(list
(ly:make-pitch 0 0 NATURAL)
(ly:make-pitch 0 1 NATURAL)
(ly:make-pitch 0 2 NATURAL)
)
)
läßt sich einfacher definieren mit der LilyPond-eigenen procedure `event-chord-pitches'
(define PitchListe (event-chord-pitches #{ <c' d' e'> #}))
Soviel fürs erste.
Ich denke es ist Dir nicht geholfen, wenn ich eine Lösung für das Problem poste.
Insoweit wie weit soll ich gehen mit Verbesserungsvorschlägen?
Viel Erfolg,
Harm