1 %% DO NOT EDIT this file manually; it is automatically
2 %% generated from LSR http://lsr.di.unimi.it
3 %% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
4 %% and then run scripts/auxiliar/makelsr.py
6 %% This file is in the public domain.
10 lsrtags = "automatic-notation, really-cool, scheme-language"
13 A lilypond score internally is just a Scheme expression, generated by
14 the lilypond parser. Using scheme, one can also automatically generate
15 a score without an input file. If you have the music expression in
16 scheme, a score can be generated by simply calling (scorify-music music
17 parser) on your music. This will generate a score object, for which you
18 can then set a custom layout block with (let* ((layout
19 (ly:output-def-clone $defaultlayout)))
20 ; modify the layout here, then assign it:
21 (ly:score-add-output-def! score layout)
25 Finally, all you have to do it to pass this score to lilypond for
26 typesetting. This snippet defines functions @code{(add-score parser
27 score)}, @code{(add-text parser text)} and @code{(add-music parser
28 music)} to pass a complete score, some markup or some music to lilypond
31 This snippet also works for typesetting scores inside a @code{\\book
32 @{...@}} block, as well as top-level scores. To achieve this, each
33 score schedulled for typesetting is appended to the list of toplevel
34 scores and the toplevel-book-handler (which is a scheme function called
35 to process a book once a @code{\\book@{..@}} block is closed) is
36 modified to inser all collected scores so far to the book.
39 doctitle = "Generating whole scores (also book parts) in scheme without using the parser"
43 #(define-public (add-score parser score)
44 (ly:parser-define! parser 'toplevel-scores
45 (cons score (ly:parser-lookup parser 'toplevel-scores))))
47 #(define-public (add-text parser text)
48 (add-score parser (list text)))
50 #(define-public (add-music parser music)
51 (collect-music-aux (lambda (score)
52 (add-score parser score))
56 #(define-public (toplevel-book-handler parser book)
58 (ly:book-add-score! book score))
59 (reverse! (ly:parser-lookup parser 'toplevel-scores)))
60 (ly:parser-define! parser 'toplevel-scores (list))
61 (print-book-with-defaults parser book))
63 #(define-public (book-score-handler book score)
64 (add-score parser score))
66 #(define-public (book-text-handler book text)
67 (add-text parser text))
69 #(define-public (book-music-handler parser book music)
70 (add-music parser music))
75 %% Just some example score to show how to use these functions:
76 #(define add-one-note-score #f)
78 (set! add-one-note-score
80 (let* ((music (make-music 'EventChord
81 'elements (list (make-music 'NoteEvent
82 'duration (ly:make-duration 2 0 1/1)
83 'pitch (ly:make-pitch 0 pitch 0)))))
84 (score (scorify-music music parser))
85 (layout (ly:output-def-clone $defaultlayout))
86 (note-name (case pitch
95 (title (markup #:large #:line ("Score with a" note-name))))
96 (ly:score-add-output-def! score layout)
97 (add-text parser title)
98 (add-score parser score))
99 (set! pitch (modulo (1+ pitch) 7)))))
102 #(define-music-function (parser location) ()
103 (add-one-note-score parser)
104 (make-music 'Music 'void #t))
118 % Top-level scores are also handled correctly