]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/de/extending/scheme-tutorial.itely
Run scripts/auxiliar/update-with-convert-ly.sh
[lilypond.git] / Documentation / de / extending / scheme-tutorial.itely
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
2
3 @ignore
4     Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94
5
6     When revising a translation, copy the HEAD committish of the
7     version that you are working on.  For details, see the Contributors'
8     Guide, node Updating translation committishes..
9 @end ignore
10
11 @c \version "2.19.21"
12
13 @node Scheme-Übung
14 @chapter Scheme-Übung
15 @translationof Scheme tutorial
16
17
18 @cindex Scheme
19 @cindex GUILE
20 @cindex Scheme, in einer LilyPond-Datei
21 @cindex LISP
22 @cindex Auswertung von Scheme-Code
23
24 LilyPond verwendet die Scheme-Programmiersprache sowohl als Teil
25 der Eingabesyntax als auch als internen Mechanismus, um Programmmodule
26 zusammenzufügen.  Dieser Abschnitt ist ein sehr kurzer Überblick über
27 die Dateneingabe mit Scheme.  Wenn Sie mehr über Scheme wissen wollen,
28 gehen Sie zu @uref{http://@/www@/.schemers@/.org}.
29
30 LilyPond benutzt die GNU Guile-Implementation von Scheme, die auf dem
31 @qq{R5RS}-Standard von Scheme basiert.  Wenn Sie Scheme lernen wollen,
32 um es innerhalb von LilyPond zu benutzen, wird es nicht empfohlen,
33 mit einer anderen Implementation (die sich auf einen anderen
34 Standard bezieht) zu arbeiten.  Information zu Guile findet sich
35 unter @uref{http://www.gnu.org/software/guile/}.  Der
36 @qq{R5RS}-Standard von Scheme befindet sich unter der Adresse
37 @uref{http://www.schemers.org/Documents/Standards/R5RS/}.
38
39
40 @menu
41 * Einleitung in Scheme::
42 * Scheme in LilyPond::
43 * Komplizierte Funktionen erstellen::
44 @end menu
45
46 @node Einleitung in Scheme
47 @section Einleitung in Scheme
48 @translationof Introduction to Scheme
49
50 Wir wollen mit einer Einführung in Scheme beginnen.  Für diese kurze Einfürung
51 soll der GUILE-Interpreter genommen werden, um zu erforschen, wie die Sprache
52 funktioniert.  Nach besserer Bekanntschaft mit Scheme soll gezeigt werden, wie
53 die Sprache in LilyPond-Dateien eingefügt werden kann.
54
55 @menu
56 * Scheme-Sandkasten::
57 * Scheme-Variablen::
58 * Einfache Scheme-Datentypen::
59 * Zusammengesetzte Scheme-Datentypen::
60 * Berechnungen in Scheme::
61 * Scheme-Prozeduren::
62 * Scheme-Konditionale::
63 @end menu
64
65 @node Scheme-Sandkasten
66 @subsection Scheme-Sandkasten
67 @translationof Scheme sandbox
68
69 Die LilyPond-Installation enthält gleichzeitig auch die
70 Guile-Implementation von Scheme.  Auf den meisten Systemen kann
71 man in einer Scheme-sandbox experimentieren, indem man ein
72 Kommandozeilen-Fenster öffnet und @code{guile} aufruft.  Unter
73 einigen Systemen, insbesondere unter Windows, muss man evtl.
74 die Umgebungsvariable @code{GUILE_LOAD_PATH} auf das Verzeichnis
75 @code{../usr/share/guile/1.8} innerhalb des LilyPond-Installationsverzeichnisses
76 setzen (der vollständige Pfad ist erklärt in @rlearning{Mehr Information}).
77 Alternativ können Windows-Benutzer auch einfach @qq{Ausführen} im
78 Startmenü wählen und @code{guile} schreiben.
79
80 Es gibt auch eine direkte Scheme-Umgebung mit allen LilyPond-Voreinstellungen,
81 die man auf der Kommandozeile mit folgendem Befehl aufrufen kann:
82
83 @example
84 lilypond scheme-sandbox
85 @end example
86
87 @noindent
88 Wenn guile einmal läuft, erhält man die Eingabeaufforderung von guile:
89
90 @lisp
91 guile>
92 @end lisp
93
94 Man kann Scheme-Ausdrucke hier eingeben und mit Scheme experimentieren.
95 Siehe die Datei @file{ly/scheme-sandbox.ly} zu Information, wie man
96 die GNU readline-Bibliothek benutzen kann, um bessere Scheme-Formatierung
97 der Kommandozeile zu erhalten.  Wenn die readline-Bibliothek für interaktive
98 Guile-Sitzungen außerhalb von LilyPond schon aktiviert ist, sollte es auch
99 in der Sandbox funktionieren.
100
101
102 @node Scheme-Variablen
103 @subsection Scheme-Variablen
104 @translationof Scheme variables
105
106 Scheme-Variablen können jedlichen gültigen Scheme-Wert erhalten, auch
107 Scheme-Prozeduren.
108
109 Scheme-Variablen werden mit @code{define} definiert:
110
111 @lisp
112 guile> (define a 2)
113 guile>
114 @end lisp
115
116 Scheme-Variablen können an der Guile-Eingabeaufforderung ausgewertet werden,
117 indem man einfach die Variable eintippt.
118
119 @lisp
120 guile> a
121 2
122 guile>
123 @end lisp
124
125 Scheme-Variablen können auf dem Bildschirm ausgegeben werden, indem man
126 @code{display} zum Anzeigen benutzt:
127
128 @lisp
129 guile> (display a)
130 2guile>
131 @end lisp
132
133 Sowohl der Wert @code{2} als auch die Eingabeaufforderung @code{guile}
134 werden auf der gleichen Zeile ausgegeben.  Das kann man vermeiden, indem
135 man eine @code{newline}-Prozedur für eine Leerzeile aufruft oder das
136 Zeichen für eine neue Zeile anzeigen lässt:
137
138 @lisp
139 guile> (display a)(newline)
140 2
141 guile> (display a)(display "\n")
142 2
143 guile>
144 @end lisp
145
146 Wenn eine Variable einmal erstellt wurde, kann ihr Wert durch @code{set!}
147 verändert werden:
148
149 @lisp
150 guile> (set! a 12345)
151 guile> a
152 12345
153 guile>
154 @end lisp
155
156 @node Einfache Scheme-Datentypen
157 @subsection Einfache Scheme-Datentypen
158 @translationof Scheme simple data types
159
160 Das Grundlegendste an einer Sprache sind Daten: Zahlen, Zeichen,
161 Zeichenketten, Listen usw.  Hier ist eine Liste der Datentypen, die für
162 LilyPond-Eingabedateien relevant sind.
163
164 @table @asis
165 @item Boolesche Variablen
166 Werte einer Booleschen Variable sind Wahr oder Falsch. Die Scheme-Entsprechung
167 für Wahr ist @code{#t} und für Falsch @code{#f}.
168 @funindex ##t
169 @funindex ##f
170
171 @item Zahlen
172 Zahlen werden wie üblich eingegeben, @code{1} ist die (ganze)
173 Zahl Eins, während @w{@code{-1.5}} eine Gleitkommazahl (also
174 eine nicht-ganze) ist.
175
176 @item Zeichenketten
177 Zeichenketten werden in doppelte Anführungszeichen gesetzt:
178
179 @example
180 "Das ist eine Zeichenkette"
181 @end example
182
183 Zeichenketten können über mehrere Zeilen reichen:
184
185 @example
186 "Das
187 ist
188 eine Zeichenkette"
189 @end example
190
191 @noindent
192 und die Zeichen für eine neue Zeile am Ende jeder Zeile werden auch
193 in die Zeichenkette aufgenommen.
194
195 Zeichen für eine neue Zeile können auch hinzugefügt werden, indem man
196 @code{\n} in die Zeichenkette aufnimmt.
197
198 @example
199 "das\nist eine\nmehrzeilige Zeichenkette"
200 @end example
201
202 Anführungszeichen und neue Zeilen können auch mit sogenannten
203 Fluchtsequenzen eingefügt werden. Die Zeichenkette
204 @code{a sagt "b"} wird wie folgt eingegeben:
205
206 @example
207 "a sagt \"b\""
208 @end example
209
210 @end table
211
212 Weitere zusätzliche Scheme-Datentypen, die hier nicht besprochen wurden,
213 finden sich in einer vollständigen Liste der Scheme-Datentypen in der
214 Guile-Referenzanleitung:
215 @uref{http://www.gnu.org/software/guile/manual/html_node/Simple-Data-Types.html}.
216
217
218 @node Zusammengesetzte Scheme-Datentypen
219 @subsection Zusammengesetzte Scheme-Datentypen
220 @translationof Scheme compound data types
221
222 Es gibt auch zusammengesetzte Datentypen in Scheme.  Die Datentypen, die in
223 LilyPond häufig benutzt werden, beinhalten Paare, Listen, assoziative Listen
224 und Hash-Tabellen.
225
226 @subheading Paare (pair)
227
228 Der wichtigeste zusammengesetzte Datentyp in Scheme ist ein Paar (@code{pair}).
229 Wie aus dem Namen schon hervorgeht, besteht ein Paar aus zwei zusammengeschweißten
230 Werten.  Die Prozedur um ein Paar zu erstellen ist @code{cons}.
231
232 @lisp
233 guile> (cons 4 5)
234 (4 . 5)
235 guile>
236 @end lisp
237
238 Das Paar wird dargestellt als zwei Elemente, von Klammern umgeben
239 und durch Leerzeichen und einen Punkt (@code{.}) getrennt.  Der Punkt ist
240 @emph{kein} Dezimalpunkt, sondern markiert die Gruppe als Paar.
241
242 Paare können auch wörtlich eingegeben werden, indem man ihnen voraus ein
243 einfaches Anführungszeichen (@code{'} setzt.
244
245 @lisp
246 guile> '(4 . 5)
247 (4 . 5)
248 guile>
249 @end lisp
250
251 Beide Elemente eines Paares können beliebige gültige Scheme-Werte sein:
252
253 @lisp
254 guile> (cons #t #f)
255 (#t . #f)
256 guile> '("blah-blah" . 3.1415926535)
257 ("blah-blah" . 3.1415926535)
258 guile>
259 @end lisp
260
261 Das erste Element eines Paares kann mit der Prozedur @code{car},
262 das zweite mit der Prozedur @code{cdr} angesprochen werden.
263
264 @lisp
265 guile> (define mypair (cons 123 "hello there")
266 ... )
267 guile> (car mypair)
268 123
269 guile> (cdr mypair)
270 "hello there"
271 guile>
272 @end lisp
273
274 @noindent
275
276 Achtung:  @code{cdr} wird ausgeprochen wie "kudd-err", nach Sussman und
277 Abelson, siehe
278 @uref{http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#footnote_Temp_133}
279
280 @subheading Listen (list)
281
282 Ein sehr häufiger Datentyp in Scheme ist die Liste (@emph{list}).  Formal
283 gesehen wird eine Liste entweder als leere Liste definiert
284 (repräsentiert als @code{'()}), oder als ein Paar, dessen @code{cdr}
285 eine Liste ist.
286
287 Es gibt viele Arten, Listen zu erstellen.  Die vielleicht häufigste Methode
288 ist die @code{list}-Prozedur:
289
290 @lisp
291 guile> (list 1 2 3 "abc" 17.5)
292 (1 2 3 "abc" 17.5)
293 @end lisp
294
295 Wie man sehen kann, wird eine Liste dargestellt in Form der einzelnen
296 Elemente, getrennt durch ein Leerzeichen und als Gruppe in Klammern eingeschlossen.
297 Anders als bei einem Paar, befindet sich kein Punkt zwischen den Elementen.
298
299 Eine Liste kann auch als wörtliche Liste notiert werden, indem man die
300 enthaltenen Elemente in Klammern einschließt und ein einfaches Anführungszeichen
301 voranschreibt:
302
303 @lisp
304 guile> '(17 23 "foo" "bar" "bazzle")
305 (17 23 "foo" "bar" "bazzle")
306 @end lisp
307
308 Listen haben eine zentrale Stellung in Scheme.  Scheme wird als Dialekt
309 von Lisp angesehen, und das Wort @qq{lisp} steht für @qq{List Processing}.
310 Scheme-Ausdrücke sind immer Listen.
311
312 @subheading Assoziative Listen (alist)
313
314 Eine besonderer Listentyp ist die @emph{assoziative Liste} oder @emph{alist}.
315 Eine Alist wird benutzt, um Daten zum einfachen Abrufen zu speichern.
316
317 Alisten sind Listen, deren Elemente als Paare kommen.  Der @code{car}-Teil
318 jedes Elements wird als @emph{Schlüssel} (key) bezeichnet, der
319 @code{cdr}-Teil jedes Elements wird @emph{Wert} (value) genannt.
320 Die Scheme-Prozedur @code{assoc} wird benutzt, um einen Eintrag aus einer
321 Aliste aufzurufen, und mit @code{cdr} wird sein Wert abgefragt:
322
323 @lisp
324 guile> (define my-alist '((1  . "A") (2 . "B") (3 . "C")))
325 guile> my-alist
326 ((1 . "A") (2 . "B") (3 . "C"))
327 guile> (assoc 2 my-alist)
328 (2 . "B")
329 guile> (cdr (assoc 2 my-alist))
330 "B"
331 guile>
332 @end lisp
333
334 Alisten werden sehr viel in LilyPond genutzt, um Eigenschaften und
335 andere Daten zu speichern.
336
337 @subheading Hash-Tabellen (hash table)
338
339 Eine Datenstruktur, die ab und zu in LilyPond eingesetzt wird.
340 Eine Hash-Tabelle ähnelt einem Array, aber die Indexe des Arrays
341 können beliebige Scheme-Werte sein, nicht nur Integre.
342
343 Hash-Tabellen sind effizienter als Alisten, wenn man viele Daten
344 speichern will und die Daten sich oft ändern.
345
346 Die Syntax, mit der Hash-Tabellen erstellt werden, ist etwas komplex,
347 aber man kann Beispiele hierzu im LilyPond-Quellcode finden.
348
349 @lisp
350 guile> (define h (make-hash-table 10))
351 guile> h
352 #<hash-table 0/31>
353 guile> (hashq-set! h 'key1 "val1")
354 "val1"
355 guile> (hashq-set! h 'key2 "val2")
356 "val2"
357 guile> (hashq-set! h 3 "val3")
358 "val3"
359 @end lisp
360
361 Werte werden aus den Hash-Tabellen mit @code{hashq-ref} ausgelesen.
362
363 @lisp
364 guile> (hashq-ref h 3)
365 "val3"
366 guile> (hashq-ref h 'key2)
367 "val2"
368 guile>
369 @end lisp
370
371 Schlüssel und Werte werden als Paar mit @code{hashq-get-handle} ausgelesen.
372 Das ist die beste Art, weil hier @code{#f} ausgegeben wird, wenn ein
373 Schlüssel nicht gefunden werden kann.
374
375 @lisp
376 guile> (hashq-get-handle h 'key1)
377 (key1 . "val1")
378 guile> (hashq-get-handle h 'frob)
379 #f
380 guile>
381 @end lisp
382
383
384 @node Berechnungen in Scheme
385 @subsection Berechnungen in Scheme
386 @translationof Calculations in Scheme
387
388 @ignore
389 We have been using lists all along.  A calculation, like @code{(+ 1 2)}
390 is also a list (containing the symbol @code{+} and the numbers 1
391 and@tie{}2).  Normally lists are interpreted as calculations, and the
392 Scheme interpreter substitutes the outcome of the calculation.  To enter a
393 list, we stop the evaluation.  This is done by quoting the list with a
394 quote @code{'} symbol.  So, for calculations do not use a quote.
395
396 Inside a quoted list or pair, there is no need to quote anymore.  The
397 following is a pair of symbols, a list of symbols and a list of lists
398 respectively,
399
400 @example
401 #'(stem . head)
402 #'(staff clef key-signature)
403 #'((1) (2))
404 @end example
405 @end ignore
406
407 Scheme kann verwendet werden, um Berechnungen durchzuführen. Es
408 verwendet eine @emph{Präfix}-Syntax. Um 1 und@tie{}2 zu addieren, muss
409 man @code{(+ 1 2)} schreiben, und nicht @math{1+2}, wie in traditioneller
410 Mathematik.
411
412 @lisp
413 guile> (+ 1 2)
414 3
415 @end lisp
416
417 Berechnungen können geschachtelt werden und das Ergebnis einer Berechnung
418 kann für eine neue Berechnung eingesetzt werden.
419
420 @lisp
421 guile> (+ 1 (* 3 4))
422 13
423 @end lisp
424
425 Diese Berechnungen sind Beispiele von Auswertungen. Ein Ausdruck
426 wie @code{(* 3 4)} wird durch seinen Wert @code{12} ersetzt.
427
428 Scheme-Berechnungen können zwischen Integren und Nich-Integren
429 unterscheiden.  Integre Berechnungen sind exakt, während Nicht-Integre
430 nach den passenden Genauigkeitseinschränkungen berechnet werden:
431
432 @lisp
433 guile> (/ 7 3)
434 7/3
435 guile> (/ 7.0 3.0)
436 2.33333333333333
437 @end lisp
438
439 Wenn der Scheme-Berechner einen Ausdruck antrifft, der eine Liste darstellt,
440 wird das erste Element der Liste als Prozedur behandelt, die mit
441 Argumenten des Restes der Liste ausgewertet werden.  Darum sind alle
442 Operatoren in Scheme vorangestellt.
443
444 Wenn das erste Element eines Scheme-Ausdrucks, der eine Liste darstellt,
445 @emph{kein} Operator oder keine Prozedur ist, gibt es einen Fehler:
446
447 @lisp
448 guile> (1 2 3)
449
450 Backtrace:
451 In current input:
452   52: 0* [1 2 3]
453
454 <unnamed port>:52:1: In expression (1 2 3):
455 <unnamed port>:52:1: Wrong type to apply: 1
456 ABORT: (misc-error)
457 guile>
458 @end lisp
459
460 Hier kann man sehen, dass Scheme versucht hat, 1 als einen Operator oder
461 eine Prozedur zu behandeln, was aber nicht möglich war.  Darum der Fehler
462 "Wrong type to apply: 1".
463
464 Wenn man also eine Liste erstellen will, braucht man also einen Listen-Operator
465 oder man muss die Liste als wörtliches Zitat schreiben, sodass Scheme sie
466 nicht auszuwerten versucht.
467
468 @lisp
469 guile> (list 1 2 3)
470 (1 2 3)
471 guile> '(1 2 3)
472 (1 2 3)
473 guile>
474 @end lisp
475
476 Dieser Fehler kann durchaus vorkommen, wenn man Scheme unter LilyPond
477 einsetzt.
478
479 @ignore
480 The same assignment can be done in completely in Scheme as well,
481
482 @example
483 #(define twentyFour (* 2 twelve))
484 @end example
485
486 @c this next section is confusing -- need to rewrite
487
488 The @emph{name} of a variable is also an expression, similar to a
489 number or a string.  It is entered as
490
491 @example
492 #'twentyFour
493 @end example
494
495 @funindex #'symbol
496 @cindex quoting in Scheme
497
498 The quote mark @code{'} prevents the Scheme interpreter from substituting
499 @code{24} for the @code{twentyFour}.  Instead, we get the name
500 @code{twentyFour}.
501 @end ignore
502
503
504 @node Scheme-Prozeduren
505 @subsection Scheme-Prozeduren
506 @translationof Scheme procedures
507
508 Scheme-Prozeduren sind ausführbare Scheme-Ausdrücke, die einen
509 Wert ausgeben, der das Resultat ihrer Ausführung darstellt.  Sie können
510 auch Variablen verändern, die außerhalb dieser Prozedur definiert wurden.
511
512 @subheading Prozeduren definieren
513
514 Prozeduren werden in Scheme mit @code{define} definiert:
515
516 @example
517 (define (function-name arg1 arg2 ... argn)
518  scheme-expression-that-gives-a-return-value)
519 @end example
520
521 Beispielsweise könnte man eine Prozedur definieren, die den Durchschnitt
522 berechnet:
523
524 @lisp
525 guile> (define (average x y) (/ (+ x y) 2))
526 guile> average
527 #<procedure average (x y)>
528 @end lisp
529
530 Wenn die Prozedur einmal definiert ist, wird sie aufgerufen indem man
531 die Prozedur und die Argumente in eine Liste schreibt.  Man könnte also den
532 Durchschnitt von 3 und 12 berechnen:
533
534 @lisp
535 guile> (average 3 12)
536 15/2
537 @end lisp
538
539 @subheading Prädikate
540
541 Scheme-Prozeduren, die Boolsche Werte ausgeben, werden oft als Prädikate
542 (predicate) bezeichnet.  Es herrscht die Übereinkunft, Prädikat-Bezeichnungen
543 mit einem Fragezeichen abzuschließen:
544
545 @lisp
546 guile> (define (less-than-ten? x) (< x 10))
547 guile> (less-than-ten? 9)
548 #t
549 guile> (less-than-ten? 15)
550 #f
551 @end lisp
552
553 @subheading Wiedergabe-Werte
554
555 Scheme-Prozeduren geben immer einen Wiedergabe-Wert (return value) aus, welcher
556 der Wert des letzten Ausdrucks ist, der in der Prozedur ausgeführt wurde.  Der
557 Wiedergabewert kann ein beliebiger gültiger Scheme-Wert sein, auch eine
558 komplexe Datenstruktur oder eine Prozedur.
559
560 Manchmal würden Benutzer gerne mehrere Scheme-Ausdrucke in einer Prozedur haben.
561 Es gibt zwei Arten, wie merhere Ausdrücke kombiniert werden können.  Die erste
562 Art ist die @code{begin}-Prozedur, der es ermöglicht, dass mehrere Ausdrücke
563 ausgewertet werden und den Wert des letzten Ausdrucks wiedergibt.
564
565 @lisp
566 guile> (begin (+ 1 2) (- 5 8) (* 2 2))
567 4
568 @end lisp
569
570 Die andere Art, mehrere Ausdrücke zu kombinieren, ist eine @code{let}-Umgebung.
571 In dieser Umgebung wird eine Serie von Verbindungen erstellt, und dann wird eine
572 Sequenz von Ausdrücken ausgewertet, die diese Bindungen einschließen können.
573 Der Wiedergabewert der let-Umgebung ist der Wiedergabewert der letzten Aussage
574 in der let-Umgebung:
575
576 @lisp
577 guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4))
578 ... (+ (* x y) (/ z x)))
579 508
580 @end lisp
581
582
583 @node Scheme-Konditionale
584 @subsection Scheme-Konditionale
585 @translationof Scheme conditionals
586
587 @subheading if
588
589 Scheme hat eine @code{if}-Prozedur:
590
591 @example
592 (if test-expression true-expression false-expression)
593 @end example
594
595 @var{test-expression} ist ein Ausdruck, der einen Booleschen
596 Wert zurück gibt.  Wenn @var{test-expression} den Wert @code{#t}
597 ausgibt, gibt die if-Prozedur den Wert von @var{true-expression} aus,
598 in allen anderen Fällen den Wert von @var{false-expression}.
599
600 @lisp
601 guile> (define a 3)
602 guile> (define b 5)
603 guile> (if (> a b) "a is greater than b" "a is not greater than b")
604 "a is not greater than b"
605 @end lisp
606
607 @subheading cond
608
609 Eine andere konditionale Prozedur in Scheme ist
610 @code{cond}:
611
612 @example
613 (cond (test-expression-1 result-expression-sequence-1)
614       (test-expression-2 result-expression-sequence-2)
615       ...
616       (test-expression-n result-expression-sequence-n))
617 @end example
618
619 Beispielsweise:
620
621 @lisp
622 guile> (define a 6)
623 guile> (define b 8)
624 guile> (cond ((< a b) "a is less than b")
625 ...          ((= a b) "a equals b")
626 ...          ((> a b) "a is greater than b"))
627 "a is less than b"
628 @end lisp
629
630
631
632 @node Scheme in LilyPond
633 @section Scheme in LilyPond
634 @translationof Scheme in LilyPond
635
636 @menu
637 * LilyPond Scheme-Syntax::
638 * LilyPond-Variablen::
639 * Eingabe-Variablen und Scheme::
640 * Scheme in LilyPond importieren::
641 * Objekteigenschaften::
642 * Zusammengesetzte LilyPond-Variablen::
643 * Interne musikalische Repräsentation::
644 @end menu
645
646 @node LilyPond Scheme-Syntax
647 @subsection LilyPond Scheme-Syntax
648 @translationof LilyPond Scheme syntax
649
650 @funindex $
651 @funindex #
652
653 Der Guile-Auswerter ist ein Teil von LilyPond, sodass Scheme also auch in
654 normale LilyPond-Eingabedateien eingefügt werden kann.  Es gibt mehrere
655 Methoden, um Scheme in LilyPond zu integrieren.
656
657 Die einfachste Weise ist es, ein Rautenzeichen@tie{}@code{#} vor einem
658 Scheme-Ausdruck zu benutzen.
659
660 Die Eingabe von LilyPond ist in Zeichen und Ausdrücke gegliedert, so etwa
661 wie die menschliche Sprache sich in Wörter und Sätze gliedert.  LilyPond
662 hat einen Lexer, der Zeichen erkennt (Zahlen, Zeichenketten, Scheme-Elemente,
663 Tonhöhen usw.) und einen Parser, der die Syntax versteht,
664 @rcontribnamed{LilyPond grammar, LilyPond-Grammatik}.
665 Wenn dann eine bestimmte Syntaxregel als zuständig erkannt wurde, werden die
666 damit verknüpften Aktionen ausgeführt.
667
668 Die Rautenzeichenmethode (@code{#}), mit der Scheme eingebettet werden kann,
669 passt sehr gut in dieses System.  Wenn der Lexer ein Rautenzeichen sieht, ruft
670 er den Scheme-reader auf, um den ganzen Scheme-Ausdruck zu lesen (das kann eine
671 Variable, ein Ausdruck in Klammern oder verschiedene andere Sachen sein).  Nachdem
672 der Scheme-Ausdruck gelesen wurde, wird er als Wert eines @code{SCM_TOKEN} in der
673 Grammatik gespeichert.  Wenn der Parser weiß, wie er diesen Wert benutzen kann,
674 ruft er Guile auf, um den Scheme-Ausdruck auszuwerten.  Weil der Parser normalerweise
675 dem Lexer etwas voraus sein muss, ist die Trennung von Lesen und Auswerten zwischen
676 Lexer und Parser genau das richtige, um die Auswertung von LilyPond- und
677 Scheme-Ausdrücken synchron zu halten.  Aus diesem Grund sollte das Rautenzeichen
678 zum Einbinden von Scheme immer benutzt werden, wenn es möglich ist.
679
680 Eine andere Möglichkeit, Scheme aufzurufen, ist die Benutzung des Dollarzeichens
681 (@code{$}) anstelle der Raute.  In diesem Fall wertet LilyPond den Code sofort
682 aus, nachdem der Lexer ihn gelesen hat.  Dabei wird der resultierende
683 Scheme-Ausdruckstyp geprüft und eine Tokentyp dafür ausgesucht (einer von mehreren
684 @code{xxx_IDENTIFIER} in der Syntax).  Wenn der Wert des Ausdrucks gültig ist
685 (der Guilde-Wert für @code{*unspecified*}), dann wird nichts an den Parser
686 übergeben.
687
688 Das ist auch der gleiche Mechanismus, nach dem LilyPond funktioniert, wenn man eine Variable oder musikalische Funktion mit ihrer Bezeichnung ausruft, wie
689 in @code{\Bezeichnung}, mit dem einzigen Unterschied, dass ihre Bezeichnung durch den
690 LilyPond-Lexer bestimmt wird, ohne den Scheme-reader einzubeziehen, und also
691 nur Variablen akzeptiert werden, die im aktuellen LilyPond-Modus gültig sind.
692
693 Die direkte Auswirkung von @code{$} kann zu Überraschungen führen, siehe
694 @ref{Eingabe-Variablen und Scheme}.  Es bietet sich daher an, @code{#} immer
695 zu benützen, wenn der Parser es unterstützt.  Innerhalb von musikalischen
696 Ausdrücken werden Ausdrücke, die mit @code{#} erstellt werden, @emph{tatsächlich}
697 als Noten interpretiert.  Sie werden jedoch @emph{nicht} vor der Benutzung
698 kopiert.  Wenn Sie Teil einer Struktur sind, die noch einmal benutzt werden
699 soll, muss man eventuell @code{ly:music-deep-copy} explizit einsetzen.
700
701 @funindex $@@
702 @funindex #@@
703
704 Es gibt auch die Operatoren @code{$@@} und @code{#@@}, die eine @qq{listentrennende}
705 Funktion aufweisen, indem sie alle Elemente einer Liste in den umgebenden
706 Kontext einfügen.
707
708 Jetzt wollen wir uns tatsächlichen Scheme-Code anschauen.  Scheme-Prozeduren
709 können in LilyPond-Eingabedateien definiert werden:
710
711 @example
712 #(define (average a b c) (/ (+ a b c) 3))
713 @end example
714
715 LilyPond-Kommentare (@code{%} oder @code{%@{ %@}}) können innerhalb
716 von Scheme-Code nicht benutzt werden, nicht einmal in einer LilyPond-Eingabedatei,
717 weil der Guile-Interpreter und nicht der LilyPond-Parser den Scheme-Ausdruck
718 liest.  Kommentare in Guile Scheme werden wie folgt notiert:
719
720 @example
721 ; Einzeiliges Kommentar
722
723 #!
724   Guile-Stil Blockkommentar (nicht schachtelbar)
725   Diese Kommentare werden von Scheme-Programmierern
726   selten benutzt und nie im Quellcode
727   von LilyPond
728 !#
729 @end example
730
731 Für den Rest dieses Abschnitts soll angenommen werden, dass die Daten in
732 einer LilyPond-Eingabedatei notiert werden sollen, sodass immer@tie{}@code{#}
733 vor die Scheme-Ausdrücke gestellt wird.
734
735 Alle Scheme-Ausdrücke auf oberster Ebene in einer LilyPond-Eingabedatei
736 können in einen einzigen Scheme-Ausdruck zusammengefasst werden mit
737 @code{begin}:
738
739 @example
740 #(begin
741   (define foo 0)
742   (define bar 1))
743 @end example
744
745
746 @node LilyPond-Variablen
747 @subsection LilyPond-Variablen
748 @translationof LilyPond variables
749
750 LilyPond-Variablen werden intern als Scheme-Variablen gespeichert. Darum
751 ist
752
753 @example
754 Zwoelf = 12
755 @end example
756
757 @noindent
758 das Gleiche wie
759
760 @example
761 #(define Zwoelf 12)
762 @end example
763
764 Das bedeutet, dass Scheme-Ausdrücke auf LilyPond-Variablen zugreifen können.
765 Man könnte also schreiben:
766
767 @example
768 Vierundzwanzig = #(* 2 Zwoelf)
769 @end example
770
771 @noindent
772 was zur Folge hätte, dass die Zahl 24 in der LilyPond (und Scheme-)Variablen
773 @code{Vierundzwanzig} gespeichert wird.
774
775 Üblicherweise greift man auf LilyPond-Variablen zu, indem man ihnen einen
776 Backslash voranstellt. Siehe auch @ref{LilyPond Scheme-Syntax}, also etwa
777 @code{\Vierundzwanzig}.  Weil dadurch eine Kopie des Wertes für die meisten
778 von LilyPonds internen Typen erstellt wird (insbesondere musikalische Funktionen),
779 erstellen musikalische Funktionen normalerweise Kopien von Material, das sie
780 verändern.  Aus diesem Grund sollten musikalische Funktionen, die mit @code{#}
781 aufgerufen werden, kein Material enthalten, dass entweder von Grund auf neu
782 erstellt wird oder explizit kopiert wird, sondern besser direkt auf das relevante
783 Material verweisen.
784
785
786 @node Eingabe-Variablen und Scheme
787 @subsection Eingabe-Variablen und Scheme
788 @translationof Input variables and Scheme
789
790 Das Eingabeformat unterstützt die Notation von Variablen: Im folgenden
791 Beispiel wird ein musikalischer Ausdruck einer Variablen mit der
792 Bezeichnung @code{traLaLa} zugewiesen:
793
794 @example
795 traLaLa = @{ c'4 d'4 @}
796 @end example
797
798 Variablen haben beschränkte Geltungsbereiche: im unten stehenden Beispiel
799 enthält auch die @code{\layout}-Umgebung eine @code{traLaLa}-Variable,
800 die sich aber von der @code{traLaLa}-Variable auf oberster Ebene unterscheidet:
801
802 @example
803 traLaLa = @{ c'4 d'4 @}
804 \layout @{ traLaLa = 1.0 @}
805 @end example
806
807 Jede Eingabedatei ist solch ein Gültigkeitsbereich, und alle
808 @code{\header}-, @code{\midi}- und @code{\layout}-Umgebungen
809 sind Gültigkeitsbereiche, die in diesen obersten Gültigkeitsbereich
810 eingebettet sind.
811
812 Sowohl Variablen als auch Gültigkeitsbereiche sind im Guile Modulsystem
813 eingebaut.  Ein anonymes Scheme-Modul wird jedem Gültigkeitsbereich
814 angehängt.  Eine Zuweisen in der Form von
815
816 @example
817 traLaLa = @{ c'4 d'4 @}
818 @end example
819
820 @noindent
821 wird intern in die Scheme-Definition
822
823 @example
824 (define traLaLa @var{Scheme-Wert von `@code{... }'})
825 @end example
826
827 @noindent
828 konvertiert.
829
830 Das bedeutet, dass LilyPond-Variablen und Scheme-Variablen frei gemischt
831 werden können.  Im folgenden Beispiel wird ein Notenfragment in der
832 Variable @code{traLaLa} gespeichert und mit Scheme dupliziert.  Das
833 Resultat wird in eine @code{\score}-Umgebung mit einer weiteren
834 Variable @code{twice} importiert:
835
836 @lilypond[verbatim]
837 traLaLa = { c'4 d'4 }
838
839 #(define newLa (map ly:music-deep-copy
840   (list traLaLa traLaLa)))
841 #(define twice
842   (make-sequential-music newLa))
843
844 \twice
845 @end lilypond
846
847 Das ist ein interessantes Beispiel.  Die Zuweisung findet erst statt,
848 nachdem der Parser sichergestellt hat, dass nichts folgt, das Ähnlichkeit
849 mit @code{\addlyrics} hat, sodass er prüfen muss, was als nächstes kommt.
850 Er liest @code{#} und den darauf folgenden Scheme-Ausdruck, @emph{ohne} ihn
851 auszuwerten, so dass er weiterlesen und erst @emph{danach}
852 wird der Scheme-Code ohne Probleme ausführen kann.
853
854
855 @node Scheme in LilyPond importieren
856 @subsection Scheme in LilyPond importieren
857 @translationof Importing Scheme in LilyPond
858
859 @funindex $
860 @funindex #
861
862 Das Beispiel zeigt, wie man musikalische Ausdrücke aus der Eingabe in den
863 Scheme-Auswerter @qq{exportieren} kann.  Es geht auch andersherum.  Indem
864 man Scheme-Werte nach @code{$} schreibt, wird ein
865 Scheme-Wert interpretiert, als ob er in LilyPond-Syntax eingeben wäre.
866 Anstatt @code{\twice} zu definieren, könne man also auch schreiben:
867
868 @example
869 ...
870 $(make-sequential-music newLa)
871 @end example
872
873 Mann kann @code{$} zusammen mit einem Scheme-Ausdruck überall benutzen,
874 wo auch @code{\@var{Bezeichnung}} gültig wäre, nachdem der Scheme-Ausdruck
875 einmal einer Variable @var{Bezeichnung} zugewiesen worden ist.  Der Austausch
876 geschieht im Lexer, sodass LilyPond den Unterschied gar nicht merkt.
877
878 Ein negativer Effekt ist aber das Timing.  Wenn man @code{$} anstelle von
879 @code{#} für die Definition von @code{newLa} im obigen Beispiel eingesetzt
880 hätte, würde der folgende Scheme-Ausdruck fehlschlagen, weil @code{traLaLa}
881 noch nicht definiert worden wäre.  Zu einer Erklärung dieses Timingproblems
882 siehe @ref{LilyPond Scheme-Syntax}.
883
884 @funindex $@@
885 @funindex #@@
886
887 Eine weitere Bequemlichkeit können die @qq{listentrennenden} Operatoren
888 @code{$@@} und @code{#@@} bieten, indem sie die Elemente einer Liste
889 in den umgebenden Kontext einfügen.  Wenn man sie einsetzt, hätte der
890 letzte Teil des Beispiels auch so geschrieben werden können:
891
892 @example
893 ...
894 @{ #@@newLa @}
895 @end example
896
897 Hier wird jedes Element der Liste, welche in @code{newLa} gespeichert ist,
898 der Reihenfolge nach genommen und in die Liste eingefügt, als ob man
899 geschrieben hätte:
900
901 @example
902 @{ #(first newLa) #(second newLa) @}
903 @end example
904
905 In allen diesen Formen findet die Auswertung des Scheme-Codes statt,
906 während die Eingabe noch gelesen wird, entweder im Lexer oder im Parser.
907 Wenn man es später ausgeführt haben möchte, muss man 
908 @ref{Leere Scheme-Funktionen} benutzen oder es in einem Makro speichern:
909
910 @example
911 #(define (nopc)
912   (ly:set-option 'point-and-click #f))
913
914 ...
915 #(nopc)
916 @{ c'4 @}
917 @end example
918
919 @knownissues
920
921 Scheme- und LilyPond-Variablen können nicht gemischt werden, wenn man die
922 @option{--safe}-Option benutzt.
923
924
925 @node Objekteigenschaften
926 @subsection Objekteigenschaften
927 @translationof Object properties
928
929 Objekteigenschaften werden in LilyPond in Form von Alisten-Ketten
930 gespeichert, also als Listen von Alisten.  Eigenschaften werden
931 geändert, indem man Werte an den Anfang der Eigenschaftsliste
932 hinzufügt.  Eigenschaften werden gelesen, indem Werte aus der
933 Aliste gelesen werden.
934
935 Ein neuer Wert für eine Eigenschaft kann gesetzt werden, indem man
936 der Alist einen Wert mit Schlüssel und dem Wert zuweist.  Die
937 LilyPond-Syntax hierfür ist:
938
939 @example
940 \override Stem.thickness = #2.6
941 @end example
942
943 Diese Anweisung verändert die Erscheinung der Notenhälse. Der Alist-Eintrag
944 @code{'(thickness . 2.6)} wird zu der Eigenschaftsliste eines
945 @code{Stem}-(Hals-)Objektes hinzugefügt.
946 @code{thickness} wird relativ zu den Notenlinien errechnet, in diesem
947 Fall sind die Hälse also 2,6 mal so dick wie die Notenlinien.  Dadurch
948 werden Hälse fast zweimal so dick dargestellt, wie sie normalerweise sind.
949 Um zwischen Variablen zu unterscheiden, die in den Quelldateien direkt
950 definiert werden (wie @code{Vierundzwanzig} weiter oben), und zwischen denen,
951 die für interne Objekte zuständig sind, werden hier die ersteren
952 @qq{Variablen} genannt, die letzteren dagegen @qq{Eigenschaften}.
953 Das Hals-Objekt hat also eine @code{thickness}-Eigenschaft, während
954 @code{Vierundzwanzig} eine Variable ist.
955
956 @cindex Eigenschaften versus Bezeichner
957 @cindex Bezeichner versus Eigenschaften
958
959
960 @node Zusammengesetzte LilyPond-Variablen
961 @subsection Zusammengesetzte LilyPond-Variablen
962 @translationof LilyPond compound variables
963
964 @subheading Abstände (offset)
965
966 Zweidimensionale Abstände (X- und Y-Koordinaten) werden
967 als @emph{pairs} (Paare) gespeichert. Der @code{car}-Wert des
968 Abstands ist die X-Koordinate und der @code{cdr}-Wert die
969 Y-Koordinate.
970
971 @example
972 \override TextScript.extra-offset = #'(1 . 2)
973 @end example
974
975 Hierdurch wird das Paar @code{(1 . 2)} mit der Eigenschaft @code{extra-offset}
976 des TextScript-Objektes verknüpft. Diese Zahlen werden in
977 Systembreiten  gemessen, so dass der Befehl das Objekt eine Systembreite
978 nach rechts verschiebt und zwei Breiten nach oben.
979
980 Prozeduren, um mit Abständen zu arbeiten, finden sich in @file{scm/lily-library.scm}.
981
982 @subheading Brüche (fractions)
983
984 Brüche, wie sie LilyPond benutzt, werden wiederum als Paare gespeichert,
985 dieses Mal als unbezeichnete ganze Zahlen.  Während Scheme rationale Zahlen
986 als einen negativen Typ darstellen kann, sind musikalische gesehen
987 @samp{2/4} und @samp{1/2} nicht das selbe, sodass man zwischen beiden unterscheiden
988 können muss.  Ähnlich gibt es auch keine negativen Brüche in LilyPonds Sinn.
989 Somit bedeutet @code{2/4} in LilyPond  @code{(2 . 4)} in Scheme, und @code{#2/4} in
990 LilyPond bedeutet @code{1/2} in Scheme.
991
992 @subheading Bereiche (extend)
993
994 Paare werden auch benutzt, um Intervalle zu speichern, die einen Zahlenbereich
995 vom Minimum (dem @code{car}) bis zum Maximum (dem @code{cdr}) darstellen.
996 Intervalle werden benutzt, um die X- und Y-Ausdehnung von druckbaren
997 Objekten zu speichern.  Bei X-Ausdehnungen ist @code{car} die linke
998 X-Koordinate und @code{cdr} die rechte X-Koordinate.  Für Y-Ausdehnungen
999 ist @code{car} die untere Koordinate und @code{cdr} die obere Koordinate.
1000
1001 Prozeduren, um mit Intervallen zu arbeiten, finden sich in
1002 @file{scm/lily-library.scm}.  Diese Prozeduren sollten benutzt, wenn es möglich
1003 ist, um den Code konsistent zu halten.
1004
1005 @subheading Eigenschafts-Alisten (property alist)
1006
1007 Eine Eigenschafts-Aliste ist eine LilyPond-Datenstruktur, die eine Aliste
1008 darstellt, deren Schlüssel Eigenschaften sind und deren Werte
1009 Scheme-Ausdrücke sind, die den erwünschen Wert der Eigenschaft ausgeben.
1010
1011 LilyPond-Eigenschaften sind Scheme-Symbole, wie etwa @code{'thickness}
1012 (Dicke).
1013
1014 @subheading Alisten-Ketten (alist chains)
1015
1016 Eine Alisten-Kette ist eine Liste, die Eigenschafts-Alisten enthält.
1017
1018 Die Menge aller Eigenschaften, die sich auf einen Grob auswirken, wird
1019 typischerweise in einer Alisten-Kette gespeichert.  Um den Wert einer
1020 bestimmten Eigenschaft zu finden, die ein Grob haben soll, wird jede
1021 Liste in der Kette nach einander durchsucht, wobei nach einem Eintrag
1022 geschaut wird, der den Eigenschaftsschlüssel enthält.  Der erste
1023 gefundene Alisten-Eintrag wird benutzt und dessen Wert ist der
1024 Wert der Eigenschaft.
1025
1026 Die Scheme-Prozedur @code{chain-assoc-get} wird normalerweise benutzt,
1027 um Grob-Eigenschaftenwerte zu erhalten.
1028
1029
1030 @node Interne musikalische Repräsentation
1031 @subsection Interne musikalische Repräsentation
1032 @translationof Internal music representation
1033
1034 Intern werden Noten als Scheme-Liste dargestellt.  Die Liste enthält
1035 verschiedene Elemente, die die Druckausgabe beeinflussen.  Parsen
1036 nennt man den Prozess, der die Noten aus der LilyPond-Repräsentation
1037 in die interne Scheme-Repräsentation überführt.
1038
1039 Wenn ein musikalischer Ausdruck geparst wird, wird er in eine Gruppe
1040 von Scheme-Musikobjekten konvertiert.  Die definierende Eigenschaft
1041 eines Musikobjektes ist, dass es Zeit einnimmt.  Die Zeit, die
1042 ein Objekt braucht, wird Dauer (engl. @emph{duration}) genannt.
1043 Dauern werden in rationalen Zahlen ausgedrückt, die die Länge des
1044 Musikobjekts in Ganzen Noten angeben.
1045
1046 Ein Musikobjekt hat drei Typen:
1047
1048 @itemize
1049 @item
1050 Musikbezeichnung (music name): Jeder Musikausdruck hat eine Bezeichnung.  Eine
1051 Note beispielsweise erzeugt ein @rinternals{NoteEvent} und @code{\simultaneous}
1052 produziert @rinternals{SimultaneousMusic}.  Eine Liste aller möglichen
1053 Ausdrücke findet sich in der Referenz der Interna, unter
1054 @rinternals{Music expressions}.
1055
1056 @item
1057 Typ (type) oder Schnittstelle (interface): Jede Musikbezeichnung hat mehrere
1058 Typen oder Schnittstellen, beispielsweise eine Note ist ein Ereignis (@code{event}),
1059 aber auch ein Notenereignis (@code{note-event}), ein rhythmisches Ereignis
1060 (@code{rhythmic-event}) und ein Melodieereignis (@code{melodic-event}).
1061 Alle Musikklassen sind in der Referenz der Interna aufgelistet, unter
1062 @rinternals{Music classes}.
1063
1064 @item
1065 C++-Objekt: Jedes Musikobjekt ist durch ein Objekt der C++-Klasse @code{Music}
1066 repräsentiert.
1067 @end itemize
1068
1069 Die eigentliche Information eines musikalischen Ausdrucks wird in Eigenschaften
1070 gespeichert.  Ein @rinternals{NoteEvent} beispielsweise hat die Eigenschaften
1071 Tonhöhe (@code{pitch}) und Dauer (@code{duration}), die die Dauer und die
1072 Tonhöhe der Note speichern.  Eine Liste aller möglichen Eigenschaften findet
1073 sich in der Referenz der Interna, unter
1074 @rinternals{Music properties}.
1075
1076 Ein zusammengesetzter musikalischer Ausdruck ist ein Musikobjekt, das andere
1077 Musikobjekte als Eigenschaften enthält.  Eine Liste an Objekten kann in der
1078 @code{elements}-Eigenschaft eines Musikobjekts bzw. ein einziges
1079 Ableger-Musikelement in der @code{element}-Eigenschaft gespeichert werden.
1080 @rinternals{SequentialMusic} beispielsweise hat sein einziges Argument in
1081 @code{element}.  Der Körper einer Wiederholung wird in der @code{element}-Eigenschaft
1082 von @rinternals{RepeatedMusic} gespeichert, und die alternativen Endungen
1083 in @code{elements}.
1084
1085
1086 @node Komplizierte Funktionen erstellen
1087 @section Komplizierte Funktionen erstellen
1088 @translationof Building complicated functions
1089
1090 Dieser Abschnitt zeigt, wie man Information zusammensucht,
1091 um komplizierte musikalische Funktionen  zu erstellen.
1092
1093 @menu
1094 * Musikalische Funktionen darstellen::
1095 * Eigenschaften von Musikobjekten::
1096 * Verdoppelung einer Note mit Bindebögen (Beispiel)::
1097 * Artikulationszeichen zu Noten hinzufügen (Beispiel)::
1098 @end menu
1099
1100
1101 @node Musikalische Funktionen darstellen
1102 @subsection Musikalische Funktionen darstellen
1103 @translationof Displaying music expressions
1104
1105 @cindex interne Speicherung
1106 @cindex Musikausdrücke anzeigen
1107 @cindex Anzeigen von Musikausdrücken
1108
1109 @funindex displayMusic
1110 @funindex \displayMusic
1111
1112 Wenn man eine musikalische Funktion erstellt, ist es oft
1113 hilfreich sich anzuschauen, wie musikalische Funktionen
1114 intern gespeichert werden.  Das kann mit der Funktion
1115 @code{\displayMusic} erreicht werden:
1116
1117 @example
1118 @{
1119   \displayMusic @{ c'4\f @}
1120 @}
1121 @end example
1122
1123 @noindent
1124 zeigt:
1125
1126 @example
1127 (make-music
1128   'SequentialMusic
1129   'elements
1130   (list (make-music
1131           'NoteEvent
1132           'articulations
1133           (list (make-music
1134                   'AbsoluteDynamicEvent
1135                   'text
1136                   "f"))
1137           'duration
1138           (ly:make-duration 2 0 1/1)
1139           'pitch
1140           (ly:make-pitch 0 0 0))))
1141 @end example
1142
1143 Normalerweise gibt LilyPond diese Ausgabe auf der Konsole mit
1144 allen anderen Nachrichten aus.  Um die wichtigen Nachrichten
1145 in einer Datei zu speichern, kann die Ausgabe in eine Datei
1146 umgeleitet werden:
1147
1148 @example
1149 lilypond file.ly >display.txt
1150 @end example
1151
1152 Mit LilyPond- und Scheme-Magie kann man LilyPond anweisen, genau
1153 diese Ausgabe an eine eigene Datei zu senden:
1154
1155 @example
1156 @{
1157   #(with-output-to-file "display.txt"
1158       (lambda () #@{ \displayMusic @{ c'4\f @} #@}))
1159 @}
1160 @end example
1161
1162 Mit etwas Umformatierung ist die gleiche Information sehr viel
1163 einfacher zu lesen:
1164
1165 @example
1166 (make-music 'SequentialMusic
1167   'elements (list
1168              (make-music 'NoteEvent
1169                'articulations (list
1170                                (make-music 'AbsoluteDynamicEvent
1171                                  'text
1172                                  "f"))
1173                'duration (ly:make-duration 2 0 1/1)
1174                'pitch    (ly:make-pitch 0 0 0))))
1175 @end example
1176
1177 Eine musikalische @code{@{ ... @}}-Sequenz hat die Bezeichnung
1178 @code{SequentialMusic} und ihre inneren Ausdrücke werden als
1179 Liste in seiner @code{'elements}-Eigenschaft gespeichert.  Eine
1180 Note ist als als ein @code{EventChord}-Objekt dargestellt (welches Dauer und
1181 Tonhöhe speichert) und zusätzliche Information enthält (in
1182 diesem Fall ein @code{AbsoluteDynamicEvent} mit einer
1183 @code{"f"}-Text-Eigenschaft).
1184
1185 @funindex \void
1186
1187 @code{\displayMusic} gibt die Noten aus, die dargestellt werden, sodass
1188 sie sowohl angezeigt als auch ausgewertet werden.  Um die Auswertung zu
1189 vermeiden, kann @code{\void} vor @code{\displayMusic} geschrieben werden.
1190
1191
1192 @node Eigenschaften von Musikobjekten
1193 @subsection Eigenschaften von Musikobjekten
1194 @translationof Music properties
1195
1196 TODO -- make sure we delineate between @emph{music} properties,
1197 @emph{context} properties, and @emph{layout} properties.  These
1198 are potentially confusing.
1199
1200 Schauen wir uns ein Beispiel an:
1201
1202 @example
1203 someNote = c'
1204 \displayMusic \someNote
1205 ===>
1206 (make-music
1207   'NoteEvent
1208   'duration
1209   (ly:make-duration 2 0 1/1)
1210   'pitch
1211   (ly:make-pitch 0 0 0))
1212 @end example
1213
1214 Das @code{NoteEvent}-Objekt ist die Repräsentation von @code{someNote}.
1215 Einfach.  Wie fügt man denn ein c' in einen Akkorde ein?
1216
1217 @example
1218 someNote = <c'>
1219 \displayMusic \someNote
1220 ===>
1221 (make-music
1222   'EventChord
1223   'elements
1224   (list (make-music
1225           'NoteEvent
1226           'duration
1227           (ly:make-duration 2 0 1/1)
1228           'pitch
1229           (ly:make-pitch 0 0 0))))
1230 @end example
1231
1232 Jetzt ist das @code{NoteEvent}-Objekt das erste Objekt der
1233 @code{'elements}-Eigenschaft von @code{someNote}.
1234
1235 Die @code{display-scheme-music}-Funktion ist die Funktion, die von
1236 @code{\displayMusic} eingesetzt wird, um die Scheme-Repräsentation
1237 eines musikalischen Ausdrucks anzuzeigen.
1238
1239 @example
1240 #(display-scheme-music (first (ly:music-property someNote 'elements)))
1241 ===>
1242 (make-music
1243   'NoteEvent
1244   'duration
1245   (ly:make-duration 2 0 1/1)
1246   'pitch
1247   (ly:make-pitch 0 0 0))
1248 @end example
1249
1250 Danach wird die Tonhöhe der Note von der @code{'pitch}-Eigenschaft
1251 des @code{NoteEvent}-Objektes gelesen:
1252
1253 @example
1254 #(display-scheme-music
1255    (ly:music-property (first (ly:music-property someNote 'elements))
1256                       'pitch))
1257 ===>
1258 (ly:make-pitch 0 0 0)
1259 @end example
1260
1261 Die Tonhöhe einer Note kann geändert werden, indem man diese
1262 @code{'pitch}-Eigenschaft umdefiniert:
1263
1264 @funindex \displayLilyMusic
1265 @funindex displayLilyMusic
1266
1267 @example
1268 #(set! (ly:music-property (first (ly:music-property someNote 'elements))
1269                           'pitch)
1270        (ly:make-pitch 0 1 0)) ;; Die Tonhöhen auf d' verändern.
1271 \displayLilyMusic \someNote
1272 ===>
1273 d'
1274 @end example
1275
1276
1277 @node Verdoppelung einer Note mit Bindebögen (Beispiel)
1278 @subsection Verdoppelung einer Note mit Bindebögen (Beispiel)
1279 @translationof Doubling a note with slurs (example)
1280
1281 In diesem Abschnitt soll gezeigt, werden, wie man eine
1282 Funktion erstellt, die eine Eingabe wie @code{a}
1283 nach @code{@{ a( a) @}} umdefiniert.  Dazu wird zuerst die
1284 interne Repräsentation der Musik betrachtet, die
1285 das Endergebnis darstellt:
1286
1287 @example
1288 \displayMusic@{ a'( a') @}
1289 ===>
1290 (make-music
1291   'SequentialMusic
1292   'elements
1293   (list (make-music
1294           'NoteEvent
1295           'articulations
1296           (list (make-music
1297                   'SlurEvent
1298                   'span-direction
1299                   -1))
1300           'duration
1301           (ly:make-duration 2 0 1/1)
1302           'pitch
1303           (ly:make-pitch 0 5 0))
1304         (make-music
1305           'NoteEvent
1306           'articulations
1307           (list (make-music
1308                   'SlurEvent
1309                   'span-direction
1310                   1))
1311           'duration
1312           (ly:make-duration 2 0 1/1)
1313           'pitch
1314           (ly:make-pitch 0 5 0))))
1315 @end example
1316
1317 Eine schlechte Nachricht ist, dass die
1318 @code{SlurEvent}-Ausdrücke @qq{innerhalb}
1319 der Noten (in ihrer @code{articulations}-Eigenschaft) hinzugefügt werden müssen.
1320
1321 Jetzt folgt eine Betrachtung der Eingabe:
1322
1323 @example
1324 \displayMusic a'
1325 ===>
1326 (make-music
1327   'NoteEvent
1328   'duration
1329   (ly:make-duration 2 0 1/1)
1330   'pitch
1331   (ly:make-pitch 0 5 0))))
1332 @end example
1333
1334 In der gewünschten Funktion muss also dieser Ausdruck
1335 kopiert werden (sodass zwei Noten vorhanden sind, die
1336 eine Sequenz bilden), dann müssen @code{SlurEvent}
1337 zu der @code{'articulations}-Eigenschaft jeder Noten hinzugefügt
1338 werden, und schließlich muss eine @code{SequentialMusic}
1339 mit den beiden @code{EventChords} erstellt werden.  Um zu
1340 einer Eigenschaft etwas hinzuzufügen, ist es nützlich zu wissen, dass
1341 eine nicht gesetzte Eigenschaft als @code{'()} gelesen wird, sodass
1342 keine speziellen Überprüfungen nötig sind, bevor ein anderes
1343 Element vor die @code{articulations}-Eigenschaft gesetzt wird.
1344
1345 @example
1346 doubleSlur = #(define-music-function (parser location note) (ly:music?)
1347          "Return: @{ note ( note ) @}.
1348          `note' is supposed to be a single note."
1349          (let ((note2 (ly:music-deep-copy note)))
1350            (set! (ly:music-property note 'articulations)
1351                  (cons (make-music 'SlurEvent 'span-direction -1)
1352                        (ly:music-property note 'articulations)))
1353            (set! (ly:music-property note2 'articulations)
1354                  (cons (make-music 'SlurEvent 'span-direction 1)
1355                        (ly:music-property note2 'articulations)))
1356            (make-music 'SequentialMusic 'elements (list note note2))))
1357 @end example
1358
1359
1360 @node Artikulationszeichen zu Noten hinzufügen (Beispiel)
1361 @subsection Artikulationszeichen zu Noten hinzufügen (Beispiel)
1362 @translationof Adding articulation to notes (example)
1363
1364 Am einfachsten können Artikulationszeichen zu Noten
1365 hinzugefügt werden, indem man zwei musikalische Funktionen
1366 in einen Kontext einfügt, wie erklärt in
1367 @ruser{Kontexte erstellen}.  Hier soll jetzt eine musikalische
1368 Funktion entwickelt werden, die das vornimmt.  Daraus ergibt sich
1369 der zusätzliche Vorteil, dass diese musikalische Funktion eingesetzt
1370 werden kann, um eine Artikulation (wie etwa eine Fingersatzanweisung)
1371 einer einzigen Note innerhalb eines Akkordes hinzugefügt werden
1372 kann, was nicht möglich ist, wenn einfach unabhängige Noten ein einem
1373 Kontext miteinander verschmolzen werden.
1374
1375 Eine @code{$variable} innerhalb von @code{#@{...#@}} ist das
1376 gleiche wie die normale Befehlsform @code{\variable} in
1377 üblicher LilyPond-Notation.  Es ist bekannt dass
1378
1379 @example
1380 @{ \music -. -> @}
1381 @end example
1382
1383 @noindent
1384 in LilyPond nicht funktioniert.  Das Problem könnte vermieden
1385 werden, indem das Artikulationszeichen an einen leeren Akkord
1386 gehängt wird:
1387
1388 @example
1389 @{ << \music <> -. -> >> @}
1390 @end example
1391
1392 @noindent
1393 aber in diesem Beispiel soll gezeigt werden, wie man das in
1394 Scheme vornimmt.  Zunächst wird die Eingabe und die gewünschte
1395 Ausgabe examiniert:
1396
1397 @example
1398 %  Eingabe
1399 \displayMusic c4
1400 ===>
1401 (make-music
1402   'NoteEvent
1403   'duration
1404   (ly:make-duration 2 0 1/1)
1405   'pitch
1406   (ly:make-pitch -1 0 0))))
1407 =====
1408 %  gewünschte Ausgabe
1409 \displayMusic c4->
1410 ===>
1411 (make-music
1412   'NoteEvent
1413   'articulations
1414   (list (make-music
1415           'ArticulationEvent
1416           'articulation-type
1417           "accent"))
1418   'duration
1419   (ly:make-duration 2 0 1/1)
1420   'pitch
1421   (ly:make-pitch -1 0 0))
1422 \displayMusic c4
1423 ===>
1424 (make-music
1425   'EventChord
1426   'elements
1427   (list (make-music
1428           'NoteEvent
1429           'duration
1430           (ly:make-duration 2 0 1/1)
1431           'pitch
1432           (ly:make-pitch -1 0 0))))
1433 @end example
1434
1435 Dabei ist zu sehen, dass eine Note (@code{c4}) als @code{NoteEvent}-Ausdruck
1436 repräsentiert ist.  Um eine Akzent-Artikulation hinzuzufügen, muss
1437 ein @code{ArticulationEvent}-Ausdruck zu der Elementeigenschaft @code{articulations}
1438 des @code{NoteEvent}-Ausdrucks hinzugefügt werden.
1439
1440 Um diese Funktion zu bauen, wird folgendermaßen begonnen:
1441
1442 @example
1443 (define (add-accent note-event)
1444   "Add an accent ArticulationEvent to the articulations of `note-event',
1445   which is supposed to be a NoteEvent expression."
1446   (set! (ly:music-property note-event 'articulations)
1447         (cons (make-music 'ArticulationEvent
1448                 'articulation-type "accent")
1449               (ly:music-property note-event 'articulations)))
1450   note-event)
1451 @end example
1452
1453 Die erste Zeile definiert eine Funktion in Scheme: Die Bezeichnung
1454 der Funktion ist @code{add-accent} und sie hat eine Variable
1455 mit der Bezeichnung @code{note-event}.  In Scheme geht der Typ
1456 einer Variable oft direkt aus der Bezeichnung hervor (das ist auch
1457 eine gute Methode für andere Programmiersprachen).
1458
1459 @example
1460 "Add an accent..."
1461 @end example
1462
1463 @noindent
1464 ist eine (englische) Beschreibung, was diese Funktion tut.  Sie ist
1465 nicht unbedingt notwendig, aber genauso wie klare Variablen-Bezeichnungen
1466 ist auch das eine gute Methode.
1467
1468 Es kann seltsam scheinen, warum das Notenereignis direkt verändert wird,
1469 anstatt mit einer Kopie zu arbeiten (@code{ly:music-deep-copy} kann dafür
1470 benützt werden).  Der Grund ist eine stille Übereinkunft: musikalische
1471 Funktionen dürfen ihre Argumente verändern: sie werden entweder von
1472 Grund auf erstellt (wie Eingabe des Benutzers) oder sind schon kopiert
1473 (etwa Verweis auf eine Variable mit  @samp{\Bezeichnung} oder Noten aus
1474 einem Scheme-Ausdruck @samp{$(@dots{})} sind Kopien).  Weil es uneffizient
1475 wäre, unnötige Kopien zu erstellen, wird der Wiedergabewert einer musikalischen
1476 Funktion @emph{nicht} kopiert.  Um sich also an die Übereinkunft zu halten,
1477 dürfen Argumente nicht mehr als einmal benützt werden, und sie wiederzugeben
1478 zählt als eine Benutzung.
1479
1480 In einem früheren Beispiel wurden Noten konstruiert, indem ein musikalisches
1481 Argument wiederholt wurde.  In diesem Fall muss wenigstens eine Wiederholung
1482 eine Kopie ihres Arguments sein.  Wenn es keine Kopie ist, können seltsame
1483 Dinge passieren.  Wenn man beispielsweise @code{\relative} oder @code{\transpose}
1484 auf die resultierenden Noten anwendet, die die gleichen Elemente mehrmals
1485 enthalten, werden die Elemente mehrmals der @code{\relative}-Veränderung
1486 oder Transposition unterworfen.  Wenn man sie einer musikalischen Variable
1487 zuweist, wird dieser Fluch aufgehoben, denn der Verweis auf @samp{\Bezeichnung}
1488 erstellt wiederum eine Kopie, die nicht die Identität der wiederholten
1489 Elemente überträgt.
1490
1491 Während die Funktion oben keine musikalische Funktion ist, wird sie
1492 normalerweise inmitten musikalischer Funktionen eingesetzt.  Darum
1493 ist es sinnvoll, der gleichen Übereinkunft zu folgen, die für musikalische
1494 Funktionen gelten:  Die Eingabe kann verändert worden sein, um die
1495 Ausgabe zu produzieren, und der den Aufruf erstellt, ist verantwortlich
1496 für die Erstellung von Kopien, wenn er immernoch die unveränderten
1497 Argumente benötigt.  Wenn man sich LilyPonds eigene Funktionen wie etwa
1498 @code{music-map} anschaut, sieht man, dass sie denselben Prinzipien folgen.
1499
1500 Aber wo waren wir?  Jetzt gibt es ein @code{note-event}, das verändert
1501 werden kann, nicht unter Einsatz von @code{ly:music-deep-copy} sondern
1502 aufgrund einer langen Erklärung.  Der Akzent wird zu seiner
1503 @code{'articulations}-Liste hinzugefügt:
1504
1505 @example
1506 (set! place neuer-Wert)
1507 @end example
1508
1509 Was in diesem Fall @qq{gesetzt} werden soll (@qq{place}) ist die
1510 @q{'articulations}-Eigenschaft des @code{note-event}-Ausdrucks.
1511
1512 @example
1513 (ly:music-property note-event 'articulations)
1514 @end example
1515
1516 @code{ly:music-property} ist die Funktion, mit der musikalische
1517 Eigenschaften erreicht werden können (die @code{'articulations},
1518 @code{'duration}, @code{'pitch} usw., die in der Ausgabe von
1519 @code{\displayMusic} weiter oben angezeigt werden).  Der neue
1520 Wert ist, was ehemals die @code{'articulations}-Eigenschaft war, mit einem
1521 zusätzlichen Element: dem @code{ArticulationEvent}-Ausdruck,
1522 der aus der Ausgabe von @code{\displayMusic} kopiert werden kann:
1523
1524 @example
1525 (cons (make-music 'ArticulationEvent
1526         'articulation-type "accent")
1527       (ly:music-property result-event-chord 'articulations))
1528 @end example
1529
1530 @code{cons} wird benutzt, um ein Element vorne an eine Liste hinzuzufügen,
1531 ohne dass die originale Liste verändert wird.  Das ist es, was die
1532 Funktion tun soll:  die gleiche Liste wie vorher, aber mit dem neuen
1533 @code{ArticulationEvent}-Ausdruck.  Die Reihenfolge innerhalb
1534 der Elementeeigenschaft ist hier nicht relevant.
1535
1536 Wenn schließlich die Akzent-Artikulation zu der entsprechenden
1537 @code{elements}-Eigenschaft hinzugefügt ist, kann
1538 @code{note-event} ausgegeben werden, darum die letzte Zeile
1539 der Funktion.
1540
1541 Jetzt wird die @code{add-accent}-Funktion in eine musikalische
1542 Funktion umgewandelt (hierzu gehört etwas syntaktischer Zuckerguß und
1543 eine Deklaration des Typs ihres einzigen @qq{wirklichen} Arguments:
1544
1545 @example
1546 addAccent = #(define-music-function (parser location note-event)
1547                                      (ly:music?)
1548   "Add an accent ArticulationEvent to the articulations of `note-event',
1549   which is supposed to be a NoteEvent expression."
1550   (set! (ly:music-property note-event 'articulations)
1551         (cons (make-music 'ArticulationEvent
1552                 'articulation-type "accent")
1553               (ly:music-property note-event 'articulations)))
1554   note-event)
1555 @end example
1556
1557 Eine Überprüfung, dass die Funktion richtig arbeitet, geschieht
1558 folgendermaßen:
1559
1560 @example
1561 \displayMusic \addAccent c4
1562 @end example
1563
1564
1565 @ignore
1566
1567 @menu
1568 * Optimierungen mit Scheme::
1569 @end menu
1570
1571 @c node Optimierungen mit Scheme
1572 @c appendixsec Optimierungen mit Scheme
1573 @c translationof Tweaking with Scheme
1574
1575 Wir haben gesehen wie LilyPond-Eingabe massiv beeinflusst
1576 werden kann, indem Befehle wie etwa
1577 @code{\override TextScript.extra-offset = ( 1 . -1)}
1578 benutzt werden.  Aber es wurde gezeigt, dass Scheme noch
1579 mächtiger ist.  Eine bessere Erklärung findet sich in der@ref{Scheme-Übung} und in
1580 @ruser{Schnittstellen für Programmierer}.
1581
1582 Scheme kann auch in einfachen @code{\override}-Befehlen
1583 benutzt werden:
1584
1585 TODO Find a simple example
1586 @c This isn't a valid example with skylining
1587 @c It works fine without padText  -td
1588
1589
1590 @lilypond[quote,verbatim,ragged-right]
1591 padText = #(define-music-function (parser location padding) (number?)
1592 #{
1593   \once \override TextScript.padding = #padding
1594 #})
1595
1596 \relative {
1597   c'''4^"piu mosso" b a b
1598   \padText #1.8
1599   c4^"piu mosso" d e f
1600   \padText #2.6
1601   c4^"piu mosso" fis a g
1602 }
1603 @end lilypond
1604
1605
1606 Es kann auch benutzt werden, um Befehle zu erstellen:
1607
1608 @c Check this is a valid example with skylining
1609 @c It is - 'padding still works
1610
1611 @lilypond[quote,verbatim,ragged-right]
1612 tempoPadded = #(define-music-function (parser location padding tempotext)
1613   (number? markup?)
1614 #{
1615   \once \override Score.MetronomeMark.padding = #padding
1616   \tempo \markup { \bold #tempotext }
1617 #})
1618
1619 \relative c'' {
1620   \tempo \markup { "Low tempo" }
1621   c4 d e f g1
1622   \tempoPadded #4.0 "High tempo"
1623   g4 f e d c1
1624 }
1625 @end lilypond
1626
1627 Sogar ganze Musikausdrücke können eingefügt werden:
1628
1629 @lilypond[quote,verbatim,ragged-right]
1630 pattern = #(define-music-function (parser location x y) (ly:music? ly:music?)
1631 #{
1632   #x e8 a b $y b a e
1633 #})
1634
1635 \relative c''{
1636   \pattern c8 c8\f
1637   \pattern {d16 dis} { ais16-> b\p }
1638 }
1639 @end lilypond
1640 @end ignore
1641