1.3.4 Artikulationszeichen zu Noten hinzufügen (Beispiel)
Am einfachsten können Artikulationszeichen zu Noten hinzugefügt werden, indem man zwei musikalische Funktionen in einen Kontext einfügt, wie erklärt in Kontexte erstellen. Hier soll jetzt eine musikalische Funktion entwickelt werden, die das vornimmt.
Eine $variable
innerhalb von #{...#}
ist das
gleiche wie die normale Befehlsform \variable
in
üblicher LilyPond-Notation. Es ist bekannt dass
{ \music -. -> }
in LilyPond nicht funktioniert. Das Problem könnte vermieden werden, indem das Artikulationszeichen an eine Pseudonote gehängt wird:
{ << \music s1*0-.-> }
aber in diesem Beispiel soll gezeigt werden, wie man das in Scheme vornimmt. Zunächst wird die Eingabe und die gewünschte Ausgabe examiniert:
% Eingabe \displayMusic c4 ===> (make-music 'EventChord 'elements (list (make-music 'NoteEvent 'duration (ly:make-duration 2 0 1 1) 'pitch (ly:make-pitch -1 0 0)))) ===== % gewünschte Ausgabe \displayMusic c4-> ===> (make-music 'EventChord 'elements (list (make-music 'NoteEvent 'duration (ly:make-duration 2 0 1 1) 'pitch (ly:make-pitch -1 0 0)) (make-music 'ArticulationEvent 'articulation-type "marcato")))
Dabei ist zu sehen, dass eine Note (c4
) als EventChord
repräsentiert ist, mit einem NoteEvent
-Ausdruck in ihrer
Elementenliste. Um eine Marcato-Artikulation hinzuzufügen, muss
ein ArticulationEvent
-Ausdruck zu der Elementeigenschaft
des EventChord
-Ausdrucks hinzugefügt werden.
Um diese Funktion zu bauen, wird folgendermaßen begonnen:
(define (add-marcato event-chord) "Add a marcato ArticulationEvent to the elements of `event-chord', which is supposed to be an EventChord expression." (let ((result-event-chord (ly:music-deep-copy event-chord))) (set! (ly:music-property result-event-chord 'elements) (cons (make-music 'ArticulationEvent 'articulation-type "marcato") (ly:music-property result-event-chord 'elements))) result-event-chord))
Die erste Zeile definiert eine Funktion in Scheme: Die Bezeichnung
der Funktion ist add-marcato
und sie hat eine Variable
mit der Bezeichnung event-chord
. In Scheme geht der Typ
einer Variable oft direkt aus der Bezeichnung hervor (das ist auch
eine gute Methode für andere Programmiersprachen).
"Add a marcato..."
ist eine (englische) Beschreibung, was diese Funktion tut. Sie ist nicht unbedingt notwendig, aber genauso wie klare Variablen-Bezeichnungen ist auch das eine gute Methode.
(let ((result-event-chord (ly:music-deep-copy event-chord)))
let
wird benutzt, um die lokalen Variablen zu definieren. Hier
wird eine lokale Variable benutzt: result-event-chord
. Sie erhält
den Wert (ly:music-deep-copy event-chord)
. ly:music-deep-copy
ist eine LilyPond-spezifische Funktion, die wie alle Funktionen mit dem
Präfix ly:
versehen ist. Sie wird benutzt, um eine Kopie eines
musikalischen Ausdrucks anzufertigen. Hier wird event-chord
(der Parameter der Funktion) kopiert. Die Funktion soll ja nur ein
Artikulationszeichen an einen EventChord
gehängt werden, deshalb ist es besser,
den EventChord
, der als Argument gegeben wurde, nicht zu
verändern, weil er woanders benutzt werden könnte.
Jetzt gibt es result-event-chord
, wobei es sich um einen
NoteEventChord
-Ausdruck handelt, welcher gleichzeitig eine Kopie
von event-chord
ist. Das Makro wird seiner Eigenschaftsliste
hinzugefügt:
(set! place new-value)
Was in diesem Fall „gesetzt“ werden soll („place“) ist die
‚elements‘-Eigenschaft des result-event-chord
-Ausdrucks.
(ly:music-property result-event-chord 'elements)
ly:music-property
ist die Funktion, mit der musikalische
Eigenschaften erreicht werden können (die 'elements
,
'duration
, 'pitch
usw., die in der Ausgabe von
\displayMusic
weiter oben angezeigt werden). Der neue
Wert ist, was ehemals die Elementeigenschaft war, mit einem
zusätzlichen Element: dem ArticulationEvent
-Ausdruck,
der aus der Ausgabe von
\displayMusic
kopiert werden kann:
(cons (make-music 'ArticulationEvent 'articulation-type "marcato") (ly:music-property result-event-chord 'elements))
cons
wird benutzt, um ein Element zu einer Liste hinzuzufügen,
ohne dass die originale Liste verändert wird. Das ist es, was die
Funktion tun soll: die gleiche Liste, aber mit dem neuen
ArticulationEvent
-Ausdruck. Die Reihenfolge innerhalb
der Elementeeigenschaft ist hier nicht relevant.
Wenn schließlich die Marcato-Artikulation zu der entsprechenden
elements
-Eigenschaft hinzugefügt ist, kann
result-event-chord
ausgegeben werden, darum die letzte Zeile
der Funktion.
Jetzt wird die add-marcato
-Funktion in eine musikalische
Funktion umgewandelt:
addMarcato = #(define-music-function (parser location event-chord) (ly:music?) "Add a marcato ArticulationEvent to the elements of `event-chord', which is supposed to be an EventChord expression." (let ((result-event-chord (ly:music-deep-copy event-chord))) (set! (ly:music-property result-event-chord 'elements) (cons (make-music 'ArticulationEvent 'articulation-type "marcato") (ly:music-property result-event-chord 'elements))) result-event-chord))
Eine Überprüfung, dass die Funktion richtig arbeitet, geschieht folgendermaßen:
\displayMusic \addMarcato c4
Andere Sprachen: English.