%% Generated by lilypond-book
%% Options: [exampleindent=10.16\mm,indent=0\mm,line-width=160\mm,paper-height=845.047\pt,paper-width=597.508\pt,papersize='(cons (* 597.508 pt) (* 845.047 pt))]
\include "lilypond-book-preamble.ly"


% ****************************************************************
% Start cut-&-pastable-section
% ****************************************************************

#(ly:set-option 'eps-box-padding 3.000000)



\paper {
  #(set-paper-size '(cons (* 597.508 pt) (* 845.047 pt)))
  indent = 0\mm
  line-width = 160\mm
  % offset the left padding, also add 1mm as lilypond creates cropped
  % images with a little space on the right
  line-width = #(- line-width (* mm  3.000000) (* mm 1))
}

\layout {
  
}




% ****************************************************************
% ly snippet:
% ****************************************************************
\sourcefilename "snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly"
\sourcefileline 0
%% DO NOT EDIT this file manually; it was automatically
%% generated from the LilyPond Wiki
%% (https://wiki.lilypond.community).
%%
%% Make any changes in the Wiki itself, or in
%% `Documentation/snippets/new/`, then run
%% `scripts/auxiliar/makelsr.pl`.
%%
%% This file is in the public domain.

\version "2.24.0"

\header {
%% Translation of GIT committish: 0cc270b871321ae5aa8622cea8d8262aafd16641
  texidocja = "
LilyPond の楽譜は、内部的には単なる Scheme 式であり、LilyPond のパーサを通して@c
生成されます。Scheme を用いて、入力ファイルなしに楽譜を自動的に生成することが@c
できます。Scheme での音楽表記が用意されていれば、楽譜は
(scorify-music music) を呼び出すことで生成できます。
これは Score オブジェクトを作り出し、@c
それに対してカスタム layout ブロックを使用するには@c
以下の構文を使用します:
(let* ((layout
(ly:output-def-clone $defaultlayout)))
   ; modify the layout here, then assign it:
   (ly:score-add-output-def! score layout)
  )

最後に行うことは、これを LilyPond に渡して組版させることです。このスニペットは@c
@code{(add-score score)}, @code{(add-text text)}, @code{(add-music music)}
関数を定義しており、これを用いて楽譜全体、マークアップ、音楽を@c
生成することができます。

このスニペットはトップ レベルに加えて、@code{\\book @{...@}} ブロックの内部に@c
対しても動作します。そのために、それぞれの Score を
toplevel-scores リストに追加するようにし、@c
toplevel-book-handler (@code{\\book @{...@}} ブロックが閉じられた際に@c
一度だけ呼ばれる Scheme 関数) を変更して、これまでにリストに追加された Score
をブックに挿入するようにしています。
"
  doctitleja = "楽譜全体 (やブック パート) をパーサを使用せずに Scheme で生成する"

%% Translation of GIT committish: c043783aac6c35926d633aa2daf60ed4f2e7ca7a
  texidocfr = "
Une partition LilyPond, de manière interne, n'est rien d'autre qu'une
expression Scheme générée par l'analyseur syntaxique de LilyPond. Il est
donc possible, à l'aide de Scheme, de générer automatiquement une
partition sans fichier source. Une expression musicale en Scheme sera
transformée en partition par un appel à

@example
(scorify-music music)
@end example

Ceci aura pour effet de générer un objet @code{score} auquel sera
appliqué un bloc @code{layout} comportant la fonction

@example
(let* ((layout (ly:output-def-clone $defaultlayout)))
   ; modification de la mise en forme, puis assignation :
   (ly:score-add-output-def! score layout))
@end example

Il suffit alors de transmettre ce @code{score} à LilyPond pour qu'il le
grave. Les trois fonctions -- @code{(add-score score)},
@code{(add-text text)} et @code{(add-music music)} -- définies dans le
code ci-dessous permettent de transmettre à LilyPond, aux fins de les
graver, une partition complète, un @emph{markup} ou simplement de la
musique.

Cet exemple permet aussi de graver les pièces contenues dans un bloc
@code{\\book @{ @dots{} @}} ainsi que des partitions de niveau
supérieur. Chaque partition destinée à être gravée est alors ajoutée à
la liste des partitions de niveau supérieur ; le
@code{toplevel-book-handler} -- fonction Scheme appelée pour traiter un
@emph{book} dès que le bloc @code{\\book @{ @dots{} @}} est clôturé --
s'adapte pour prendre en charge tous les éléments @code{score} jusque là
collectés dans l'ouvrage.

Attention : Pour des raisons techniques, seul le premier @code{\\book}
sera rendu puisque les autres commandes @code{\\book} génèrent des
fichiers additionnels.
"

  doctitlefr = "Génération en Scheme de partitions complètes (y compris des parties d'ouvrage) sans utiliser l'analyseur"

%% Translation of GIT committish: af28c5f89c915fdf795739a1e2dd437c726d7f61
  texidoces = "
Internamente, una partitura de LilyPond no es más que una
expresión de Scheme, generada por el analizador sintáctico de
LilyPond.  Usando Scheme, también podemos generar automáticamente
una partitura sin ningún archivo de entrada.  Si tenemos la
expresión musical en Scheme, se puede generar la partitura
simplemente llamando a

@example
(scorify-music music)
@end example

sobre la música.  Así se genera un objeto partitura, para el que
podemos entonces fijar un bloque layout personalizado con

@example
(let* ((layout (ly:output-def-clone $defaultlayout)))
   ; modificamos el layout aquí, y después lo asignamos:
   (ly:score-add-output-def! score layout))
@end example

Finalmente, todo lo que tenemos que hacer es pasar esta partitura
a lilypond para que realice la composición tipográfica.  Este
fragmento de código define las funciones @code{(add-score score)},
@code{(add-text text)} y @code{(add-music music)} para pasar una
partitura completa, elementos de marcado o algo de música a
LilyPond para su composición tipográfica.

Este fragmento de código también funciona para la tipografía de
partituras dentro de un bloque @code{\\book @{...@}}, así como
partituras normales del nivel superior jerárquico.  Para
conseguirlo, cada una de las partituras destinadas a su
tipografiado se añaden al final de una lista de partituras del
nivel superior jerárquico y se modifica el toplevel-book-handler
(que es una función de Scheme que se llama para procesar un libro
una vez que se ha cerrado el bloque @code{\\book@{..@}}) para
insertar todas las partituras así coleccionadas al libro.

Nota: por razones técnicas, solo se muestra el primer
@code{\\book}, debido a que las otras instrucciones @code{\\book}
crean archivos de salida adicionales.

"
  doctitlees = "Generación de partituras completas y partes de libro en Scheme sin usar el analizador sintáctico"

%% Translation of GIT committish: 7f48cb638958a728209577caa41bbaca8a2e4ef2
  texidocca = "
Internament, una partitura del LilyPond no és més que una expressió de
l'Scheme, generada per l'analitzador sintàctic del LilyPond.  Usant
l'Scheme, també podem generar automàticament una partitura sense cap
fitxer d'entrada.  Si tenim l'expressió musical en l'Scheme, es pot
generar la partitura simplement cridant a (scorify-music music parser)
sobre la música.  Així es genera un objecte partitura, per al que
podem aleshores fixar un bloc layout personalitzat amb
(let* ((layout (ly:output-def-clone $defaultlayout))) ; modificam el
layout aquí, i després l'assignem: (ly:score-add-output-def! score
layout) )

Finalment, tot el que hem de fer és passar aquesta partitur al
LilyPond perquè realitzi la composició tipogràfic.  Aquest fragment de
codi defineix les funcions @code{(add-score parser score)},
@code{(add-text parser text)} i @code{(add-music parser music)} per
passar una partitura completa, elements de marcatge o quelcom de
música al LilyPond per a la seva composició tipogràfic.

Aquest fragment de codi també funciona per a la tipografia de
partitures dins d'un bloc @code{\\book @{...@}}, així com partitures
normals del nivell superior jeràrquic.  Per aconseguir-lo, cada una de
les partitures destinades al seu gravat s'afegeixen al final d'una
llista de partitures del nivell superior jeràrquic i es modifica el
toplevel-book-handler (que és una funció de l'Scheme que es crida per
processar un llibre un cop que s'ha tancat el bloc
@code{\\book@{..@}}) per inserir totes les partitures així
coleccionades al llibre.

"
  doctitleca = "Generació de partitures completes i parts del libre a l'Scheme sense usar l'analitzador sintàctic"

  categories = "Automatic notation, Really cool, Scheme"

  texidoc = "
A LilyPond score internally is just a Scheme expression, generated by
the LilyPond parser. Using Scheme, one can also automatically generate
a score without an input file. If you have the music expression in
Scheme, a score can be generated by simply calling

@example
(scorify-music music)
@end example

on your music. This generates a score object, for which you can then
set a custom layout block with

@example
(let* ((layout (ly:output-def-clone $defaultlayout)))
   ; modify the layout here, then assign it:
   (ly:score-add-output-def! score layout))
@end example

Finally, all you have to do it to pass this score to LilyPond for
typesetting. This snippet defines functions @code{(add-score score)},
@code{(add-text text)}, and @code{(add-music music)} to pass a complete
score, some markup, or some music to LilyPond for typesetting.

This snippet also works for typesetting scores inside a
@code{\\book @{...@}} block as well as top-level scores. To achieve
this, each score scheduled for typesetting is appended to the list of
top-level scores, and the top-level book handler (which is a Scheme
function called to process a book once a @code{\\book@{...@}} block is
closed) is modified to insert all collected scores so far to the book.

Note: For technical reasons, only the first @code{\\book} is shown, as
the other @code{\\book} commands create additional output files.
"

  doctitle = "Generating whole scores (also book parts) in Scheme without using the parser"
} % begin verbatim



#(define-public (add-score score)
   (ly:parser-define! 'toplevel-scores
                      (cons score (ly:parser-lookup 'toplevel-scores))))

#(define-public (add-text text)
   (add-score (list text)))

#(define-public (add-music music)
   (collect-music-aux (lambda (score)
                        (add-score score))
                      music))

#(define-public (toplevel-book-handler book)
   (map (lambda (score)
          (ly:book-add-score! book score))
        (reverse! (ly:parser-lookup 'toplevel-scores)))
   (ly:parser-define! 'toplevel-scores (list))
   (print-book-with-defaults book))

#(define-public (book-score-handler book score)
   (add-score score))

#(define-public (book-text-handler book text)
   (add-text text))

#(define-public (book-music-handler book music)
   (add-music music))


% Some example code to show how to use these functions.  Each call to
% `\oneNoteScore` constructs a global markup followed by a single
% staff with a single quarter note.  The pitch of this note is taken
% from the variable `pitch`; the start value 0 corresponds to pitch C.
% After emitting the score, variable `pitch` gets increased by 1.
%
% `\oneNoteScore` calls Scheme function `add-one-note-score` to do all
% the work.

#(define add-one-note-score #f)
#(let ((pitch 0))
   (set! add-one-note-score
         (lambda ()
           (let* ((music
                   (make-music
                    'EventChord
                    'elements (list (make-music
                                     'NoteEvent
                                     'duration (ly:make-duration 2 0 1/1)
                                     'pitch (ly:make-pitch 0 pitch 0)))))
                  (score (scorify-music music))
                  (layout (ly:output-def-clone $defaultlayout))
                  (note-name (case pitch
                               ((0) "do")
                               ((1) "ré")
                               ((2) "mi")
                               ((3) "fa")
                               ((4) "sol")
                               ((5) "la")
                               ((6) "si")
                               (else "huh")))
                  (title (markup #:large #:line
                                 ("Score with a" note-name))))
             (ly:score-add-output-def! score layout)
             (add-text title)
             (add-score score))
           (set! pitch (modulo (1+ pitch) 7)))))

oneNoteScore =
#(define-void-function () ()
   (add-one-note-score))

\book {
  \oneNoteScore

  \paper { tagline = ##f }
}


\book {
  \oneNoteScore
  \oneNoteScore

  \paper { tagline = ##f }
}

% Top-level scores are also handled correctly.
\oneNoteScore
\oneNoteScore

\paper { tagline = ##f }



% ****************************************************************
% end ly snippet
% ****************************************************************
