]> git.donarmstrong.com Git - lilypond.git/commitdiff
Docs: Snippets: Rename new snippets so titles match file names.
authorNeil Puttock <n.puttock@gmail.com>
Sun, 4 Jul 2010 17:06:47 +0000 (18:06 +0100)
committerNeil Puttock <n.puttock@gmail.com>
Sun, 4 Jul 2010 17:06:47 +0000 (18:06 +0100)
Doctitles and file names for new snippets must match, since they'll eventually
be migrated to LSR following a version bump.  This will prevent docs compile
breakage for new selected snippets.

23 files changed:
Documentation/es/notation/rhythms.itely
Documentation/es/texidocs/defining-an-engraver-in-scheme-ambitus-engraver.texidoc [new file with mode: 0644]
Documentation/es/texidocs/scheme-engraver-ambitus.texidoc [deleted file]
Documentation/notation/pitches.itely
Documentation/notation/rhythms.itely
Documentation/snippets/accidental-tie-overridden.ly [deleted file]
Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly [new file with mode: 0644]
Documentation/snippets/contexts-and-engravers.snippet-list
Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly [new file with mode: 0644]
Documentation/snippets/dot-count-override.ly [deleted file]
Documentation/snippets/expressive-marks.snippet-list
Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly [new file with mode: 0644]
Documentation/snippets/new/accidental-tie-overridden.ly [deleted file]
Documentation/snippets/new/changing-the-number-of-augmentation-dots-per-note.ly [new file with mode: 0644]
Documentation/snippets/new/defining-an-engraver-in-scheme-ambitus-engraver.ly [new file with mode: 0644]
Documentation/snippets/new/dot-count-override.ly [deleted file]
Documentation/snippets/new/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly [new file with mode: 0644]
Documentation/snippets/new/scheme-engraver-ambitus.ly [deleted file]
Documentation/snippets/new/vocal-ensemble-template-with-verse-and-refrain.ly
Documentation/snippets/pitches.snippet-list
Documentation/snippets/rhythms.snippet-list
Documentation/snippets/scheme-engraver-ambitus.ly [deleted file]
Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly

index 3743751905744f455fd99c61fa4b56da724c298b..04c4252414fa6b98df847e3d0a4ab7665268ef39 100644 (file)
@@ -154,7 +154,7 @@ pauta; véase @ref{Dirección y posición}.
 @snippets
 
 @lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
-{dot-count-override.ly}
+{changing-the-number-of-augmentation-dots-per-note.ly}
 
 
 @seealso
diff --git a/Documentation/es/texidocs/defining-an-engraver-in-scheme-ambitus-engraver.texidoc b/Documentation/es/texidocs/defining-an-engraver-in-scheme-ambitus-engraver.texidoc
new file mode 100644 (file)
index 0000000..dee6801
--- /dev/null
@@ -0,0 +1,12 @@
+%% Translation of GIT committish: 0b55335aeca1de539bf1125b717e0c21bb6fa31b
+
+  texidoces = "
+Este ejemplo demuestra cómo se puede definir el grabador de ámbito en
+el espacio del usuario, con un grabador de Scheme.
+
+Esto es básicamente una reescritura en Scheme del código de
+@file{lily/ambitus-engraver.cc}.
+
+"
+
+  doctitlees = "Definir un grabador en Scheme: grabador de ámbito"
diff --git a/Documentation/es/texidocs/scheme-engraver-ambitus.texidoc b/Documentation/es/texidocs/scheme-engraver-ambitus.texidoc
deleted file mode 100644 (file)
index dee6801..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-%% Translation of GIT committish: 0b55335aeca1de539bf1125b717e0c21bb6fa31b
-
-  texidoces = "
-Este ejemplo demuestra cómo se puede definir el grabador de ámbito en
-el espacio del usuario, con un grabador de Scheme.
-
-Esto es básicamente una reescritura en Scheme del código de
-@file{lily/ambitus-engraver.cc}.
-
-"
-
-  doctitlees = "Definir un grabador en Scheme: grabador de ámbito"
index 25beca3993b8fd7878c5f2e48b0987ea3280fce8..7fb1f89e48bd4b5fdc50df31a3c99f71050a1732 100644 (file)
@@ -388,7 +388,7 @@ cis
 @snippets
 
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle,ragged-right]
-{accidental-tie-overridden.ly}
+{hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly}
 
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
 {preventing-extra-naturals-from-being-automatically-added.ly}
index 6798e11e85dd6c4a03cfdc23d9ee04e761aece90..ba49de100344c998ab5a6e06c731aca4ac238023 100644 (file)
@@ -143,7 +143,7 @@ the staff; see @ref{Direction and placement}.
 @snippets
 
 @lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
-{dot-count-override.ly}
+{changing-the-number-of-augmentation-dots-per-note.ly}
 
 
 @seealso
diff --git a/Documentation/snippets/accidental-tie-overridden.ly b/Documentation/snippets/accidental-tie-overridden.ly
deleted file mode 100644 (file)
index d16f42c..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-% Do not edit this file; it is automatically
-% generated from Documentation/snippets/new
-% This file is in the public domain.
-%% Note: this file works from version 2.13.26
-\version "2.13.26"
-\header {
-  lsrtags = "pitches"
-  texidoc = "This shows how to hide accidentals on tied notes at the beginning of a
-new system."
-  doctitle = "Hiding accidentals on tied notes at the beginning of a new system."
-} % begin verbatim
-
-
-\relative c'' {
-  \override Accidental #'hide-tied-accidental-after-break = ##t
-  cis1~ cis~
-  \break
-  cis
-}
-
diff --git a/Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly b/Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly
new file mode 100644 (file)
index 0000000..7d4e7dd
--- /dev/null
@@ -0,0 +1,22 @@
+% Do not edit this file; it is automatically
+% generated from Documentation/snippets/new
+% This file is in the public domain.
+%% Note: this file works from version 2.13.26
+\version "2.13.26"
+\header {
+  lsrtags = "rhythms,expressive-marks"
+  texidoc = "This code demonstrates how to change the number of
+augmentation dots on a single note."
+  doctitle = "Changing the number of augmentation dots per note"
+} % begin verbatim
+
+
+\relative c' {
+  c4.. a16 r2 |
+  \override Dots #'dot-count = #4
+  c4.. a16 r2 |
+  \override Dots #'dot-count = #0
+  c4.. a16 r2 |
+  \revert Dots #'dot-count
+  c4.. a16 r2 |
+}
index 14f42453134c2d58f4c4e14a3b2a0f7256433a3c..4d435cd5028b1453d0d81636899a4f3026bd41b7 100644 (file)
@@ -5,11 +5,11 @@ changing-midi-output-to-one-channel-per-voice.ly
 changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly
 chant-or-psalms-notation.ly
 creating-blank-staves.ly
+defining-an-engraver-in-scheme-ambitus-engraver.ly
 engravers-one-by-one.ly
 mensurstriche-layout-bar-lines-between-the-staves.ly
 nesting-staves.ly
 removing-bar-numbers-from-a-score.ly
-scheme-engraver-ambitus.ly
 use-square-bracket-at-the-start-of-a-staff-group.ly
 vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly
 vocal-ensemble-template-with-verse-and-refrain.ly
diff --git a/Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly b/Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly
new file mode 100644 (file)
index 0000000..ae677a0
--- /dev/null
@@ -0,0 +1,341 @@
+% Do not edit this file; it is automatically
+% generated from Documentation/snippets/new
+% This file is in the public domain.
+%% Note: this file works from version 2.13.15
+\version "2.13.20"
+
+\header {
+%% Translation of GIT committish: 0b55335aeca1de539bf1125b717e0c21bb6fa31b
+
+  texidoces = "
+Este ejemplo demuestra cómo se puede definir el grabador de ámbito en
+el espacio del usuario, con un grabador de Scheme.
+
+Esto es básicamente una reescritura en Scheme del código de
+@file{lily/ambitus-engraver.cc}.
+
+"
+
+  doctitlees = "Definir un grabador en Scheme: grabador de ámbito"
+
+
+  lsrtags = "contexts-and-engravers"
+
+
+  texidoc = "This example demonstrates how the ambitus engraver may be
+  defined on the user side, with a Scheme engraver.
+
+  This is basically a rewrite in Scheme of the code from
+  @file{lily/ambitus-engraver.cc}.
+"
+
+  doctitle = "Defining an engraver in Scheme: ambitus engraver"
+} % begin verbatim
+
+
+#(use-modules (oop goops))
+
+%%%
+%%% Grob utilities
+%%%
+%%% These are literal rewrites of some C++ methods used by the ambitus engraver.
+#(define (ly:event::in-event-class event class-name)
+   "Check if @var{event} the given class.
+Rewrite of @code{Stream_event::internal_in_event_class} from @file{lily/stream-event.cc}."
+   (memq class-name (ly:make-event-class (ly:event-property event 'class))))
+
+#(define (ly:separation-item::add-conditional-item grob grob-item)
+   "Add @var{grob-item} to the array of conditional elements of @var{grob}.
+Rewrite of @code{Separation_item::add_conditional_item} from @file{lily/separation-item.cc}."
+   (ly:pointer-group-interface::add-grob grob 'conditional-elements grob-item))
+
+#(define (ly:accidental-placement::accidental-pitch accidental-grob)
+   "Get the pitch from the grob cause of @var{accidental-grob}.
+Rewrite of @code{accidental_pitch} from @file{lily/accidental-placement.cc}."
+   (ly:event-property (ly:grob-property (ly:grob-parent accidental-grob Y) 'cause)
+                      'pitch))
+
+#(define (ly:accidental-placement::add-accidental grob accidental-grob)
+   "Add @var{accidental-grob}, an @code{Accidental} grob, to the
+list of the accidental grobs of @var{grob}, an @code{AccidentalPlacement}
+grob.
+Rewrite of @code{Accidental_placement::add_accidental} from @file{lily/accidental-placement.cc}."
+   (let ((pitch (ly:accidental-placement::accidental-pitch accidental-grob)))
+     (set! (ly:grob-parent accidental-grob X) grob)
+     (set! (ly:grob-property accidental-grob 'X-offset)
+           ly:grob::x-parent-positioning)
+     (let* ((accidentals (ly:grob-object grob 'accidental-grobs))
+            (handle (assq (ly:pitch-notename pitch) accidentals))
+            (entry (if handle (cdr handle) '())))
+       (set! (ly:grob-object grob 'accidental-grobs)
+             (assq-set! accidentals
+                        (ly:pitch-notename pitch)
+                        (cons accidental-grob entry))))))
+
+%%%
+%%% Ambitus data structure
+%%%
+
+%%% The <ambitus> class holds the various grobs that are created
+%%% to print an ambitus:
+%%% - ambitus-group: the grob that groups all the components of an ambitus
+%%% (Ambitus grob);
+%%% - ambitus-line: the vertical line between the upper and lower ambitus
+%%% notes (AmbitusLine grob);
+%%% - ambitus-up-note and ambitus-down-note: the note head and accidental
+%%% for the lower and upper note of the ambitus (see <ambitus-note> class
+%%% below).
+%%% The other slots define the key and clef context of the engraver:
+%%% - start-c0: position of middle c at the beginning of the piece.  It
+%%% is used to place the ambitus notes according to their pitch;
+%%% - start-key-sig: the key signature at the beginning of the piece.  It
+%%% is used to determine if accidentals shall be printed next to ambitus
+%%% notes.
+
+#(define-class <ambitus> ()
+   (ambitus-group #:accessor ambitus-group)
+   (ambitus-line #:accessor ambitus-line)
+   (ambitus-up-note #:getter ambitus-up-note
+                    #:init-form (make <ambitus-note>))
+   (ambitus-down-note #:getter ambitus-down-note
+                      #:init-form (make <ambitus-note>))
+   (start-c0 #:accessor ambitus-start-c0
+             #:init-value #f)
+   (start-key-sig #:accessor ambitus-start-key-sig
+                  #:init-value '()))
+
+%%% Accessor for the lower and upper note data of an ambitus
+#(define-method (ambitus-note (ambitus <ambitus>) direction)
+   "If @var{direction} is @code{UP}, then return the upper ambitus note
+of @var{ambitus}, otherwise return the lower ambitus note."
+   (if (= direction UP)
+       (ambitus-up-note ambitus)
+       (ambitus-down-note ambitus)))
+
+%%% The <ambitus-note> class holds the grobs that are specific to ambitus
+%%% (lower and upper) notes:
+%%% - head: an AmbitusNoteHead grob;
+%%% - accidental: an AmbitusAccidental grob, to be possibly printed next
+%%% to the ambitus note head.
+%%% Moreover:
+%%% - pitch is the absolute pitch of the note
+%%% - cause is the note event that causes this ambitus note, i.e. the lower
+%%% or upper note of the considered music sequence.
+
+#(define-class <ambitus-note> ()
+   (head #:accessor ambitus-note-head
+         #:init-value #f)
+   (accidental #:accessor ambitus-note-accidental
+               #:init-value #f)
+   (cause #:accessor ambitus-note-cause
+          #:init-value #f)
+   (pitch #:accessor ambitus-note-pitch
+          #:init-value #f))
+
+%%%
+%%% Ambitus engraving logics
+%%%
+%%% Rewrite of the code from @file{lily/ambitus-engraver.cc}.
+
+#(define (make-ambitus translator)
+   "Build an ambitus object: initialize all the grobs and their relations.
+
+The Ambitus grob contain all other grobs:
+ Ambitus
+  |- AmbitusLine
+  |- AmbitusNoteHead   for upper note
+  |- AmbitusAccidental for upper note
+  |- AmbitusNoteHead   for lower note
+  |- AmbitusAccidental for lower note
+
+The parent of an accidental is the corresponding note head,
+and the accidental is set as the 'accidental-grob of the note head
+so that is printed by the function that prints notes."
+   ;; make the ambitus object
+   (let ((ambitus (make <ambitus>)))
+     ;; build the Ambitus grob, which will contain all other grobs
+     (set! (ambitus-group ambitus) (ly:engraver-make-grob translator 'Ambitus '()))
+     ;; build the AmbitusLine grob (line between lower and upper note)
+     (set! (ambitus-line ambitus) (ly:engraver-make-grob translator 'AmbitusLine '()))
+     ;; build the upper and lower AmbitusNoteHead and AmbitusAccidental
+     (for-each (lambda (direction)
+                 (let ((head (ly:engraver-make-grob translator 'AmbitusNoteHead '()))
+                       (accidental (ly:engraver-make-grob translator 'AmbitusAccidental '()))
+                       (group (ambitus-group ambitus)))
+                   ;; The parent of the AmbitusAccidental grob is the
+                   ;; AmbitusNoteHead grob
+                   (set! (ly:grob-parent accidental Y) head)
+                   ;; The AmbitusAccidental grob is set as the accidental-grob
+                   ;; object of the AmbitusNoteHead.  This is later used by the
+                   ;; function that prints notes.
+                   (set! (ly:grob-object head 'accidental-grob) accidental)
+                   ;; both the note head and the accidental grobs are added
+                   ;; to the main ambitus grob.
+                   (ly:axis-group-interface::add-element group head)
+                   (ly:axis-group-interface::add-element group accidental)
+                   ;; the note head and the accidental grobs are added to the
+                   ;; ambitus object
+                   (set! (ambitus-note-head (ambitus-note ambitus direction))
+                         head)
+                   (set! (ambitus-note-accidental (ambitus-note ambitus direction))
+                         accidental)))
+               (list DOWN UP))
+     ;; The parent of the ambitus line is the lower ambitus note head
+     (set! (ly:grob-parent (ambitus-line ambitus) X)
+           (ambitus-note-head (ambitus-note ambitus DOWN)))
+     ;; the ambitus line is added to the ambitus main grob
+     (ly:axis-group-interface::add-element (ambitus-group ambitus) (ambitus-line ambitus))
+     ambitus))
+
+#(define-method (initialize-ambitus-state (ambitus <ambitus>) translator)
+   "Initialize the state of @var{ambitus}, by getting the starting
+position of middle C and key signature from @var{translator}'s context."
+   (if (not (ambitus-start-c0 ambitus))
+       (begin
+         (set! (ambitus-start-c0 ambitus)
+               (ly:context-property (ly:translator-context translator)
+                                    'middleCPosition
+                                    0))
+         (set! (ambitus-start-key-sig ambitus)
+               (ly:context-property (ly:translator-context translator)
+                                    'keySignature)))))
+
+#(define-method (update-ambitus-notes (ambitus <ambitus>) note-grob)
+   "Update the upper and lower ambitus pithes of @var{ambitus}, using
+@var{note-grob}."
+   ;; Get the event that caused the note-grob creation
+   ;; and check that it is a note-event.
+   (let ((note-event (ly:grob-property note-grob 'cause)))
+     (if (ly:event::in-event-class note-event 'note-event)
+         ;; get the pitch from the note event
+         (let ((pitch (ly:event-property note-event 'pitch)))
+           ;; if this pitch is lower than the current ambitus lower
+           ;; note pitch (or it has not been initialized yet),
+           ;; then this pitch is the new ambitus lower pitch,
+           ;; and conversely for upper pitch.
+           (for-each (lambda (direction pitch-compare)
+                       (if (or (not (ambitus-note-pitch (ambitus-note ambitus direction)))
+                               (pitch-compare pitch
+                                              (ambitus-note-pitch (ambitus-note ambitus direction))))
+                           (begin
+                             (set! (ambitus-note-pitch (ambitus-note ambitus direction))
+                                   pitch)
+                             (set! (ambitus-note-cause (ambitus-note ambitus direction))
+                                   note-event))))
+                     (list DOWN UP)
+                     (list ly:pitch<? (lambda (p1 p2)
+                                        (ly:pitch<? p2 p1))))))))
+
+#(define-method (typeset-ambitus (ambitus <ambitus>) translator)
+   "Typeset the ambitus:
+- place the lower and upper ambitus notes according to their pitch and
+  the position of the middle C;
+- typeset or delete the note accidentals, according to the key signature.
+  An accidental, if it is to be printed, is added to an AccidentalPlacement
+  grob (a grob dedicated to the placement of accidentals near a chord);
+- both note heads are added to the ambitus line grob, so that a line should
+  be printed between them."
+   ;; check if there are lower and upper pitches
+   (if (and (ambitus-note-pitch (ambitus-note ambitus UP))
+            (ambitus-note-pitch (ambitus-note ambitus DOWN)))
+       ;; make an AccidentalPlacement grob, for placement of note accidentals
+       (let ((accidental-placement (ly:engraver-make-grob
+                                    translator
+                                    'AccidentalPlacement
+                                    (ambitus-note-accidental (ambitus-note ambitus DOWN)))))
+         ;; For lower and upper ambitus notes:
+         (for-each (lambda (direction)
+                     (let ((pitch (ambitus-note-pitch (ambitus-note ambitus direction))))
+                       ;; set the cause and the staff position of the ambitus note
+                       ;; according to the associated pitch
+                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
+                                               'cause)
+                             (ambitus-note-cause (ambitus-note ambitus direction)))
+                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
+                                               'staff-position)
+                             (+ (ambitus-start-c0 ambitus)
+                                (ly:pitch-steps pitch)))
+                       ;; determine if an accidental shall be printed for this note,
+                       ;; according to the key signature
+                       (let* ((handle (or (assoc (cons (ly:pitch-octave pitch)
+                                                       (ly:pitch-notename pitch))
+                                                 (ambitus-start-key-sig ambitus))
+                                          (assoc (ly:pitch-notename pitch)
+                                                 (ambitus-start-key-sig ambitus))))
+                              (sig-alter (if handle (cdr handle) 0)))
+                         (cond ((= (ly:pitch-alteration pitch) sig-alter)
+                                ;; the note alteration is in the key signature
+                                ;; => it does not have to be printed
+                                (ly:grob-suicide!
+                                 (ambitus-note-accidental (ambitus-note ambitus direction)))
+                                (set! (ly:grob-object (ambitus-note-head (ambitus-note ambitus direction))
+                                                      'accidental-grob)
+                                      '()))
+                               (else
+                                ;; otherwise, the accidental shall be printed
+                                (set! (ly:grob-property (ambitus-note-accidental
+                                                         (ambitus-note ambitus direction))
+                                                        'alteration)
+                                      (ly:pitch-alteration pitch)))))
+                       ;; add the AccidentalPlacement grob to the
+                       ;; conditional items of the AmbitusNoteHead
+                       (ly:separation-item::add-conditional-item
+                        (ambitus-note-head (ambitus-note ambitus direction))
+                        accidental-placement)
+                       ;; add the AmbitusAccidental to the list of the
+                       ;; AccidentalPlacement grob accidentals
+                       (ly:accidental-placement::add-accidental
+                        accidental-placement
+                        (ambitus-note-accidental (ambitus-note ambitus direction)))
+                       ;; add the AmbitusNoteHead grob to the AmbitusLine grob
+                       (ly:pointer-group-interface::add-grob
+                        (ambitus-line ambitus)
+                        'note-heads
+                        (ambitus-note-head (ambitus-note ambitus direction)))))
+                   (list DOWN UP))
+         ;; add the AccidentalPlacement grob to the main Ambitus grob
+         (ly:axis-group-interface::add-element (ambitus-group ambitus) accidental-placement))
+       ;; no notes ==> suicide the grobs
+       (begin
+         (for-each (lambda (direction)
+                     (ly:grob-suicide! (ambitus-note-accidental (ambitus-note ambitus direction)))
+                     (ly:grob-suicide! (ambitus-note-head (ambitus-note ambitus direction))))
+                   (list DOWN UP))
+         (ly:grob-suicide! ambitus-line))))
+
+%%%
+%%% Ambitus engraver definition
+%%%
+#(define ambitus-engraver
+   (lambda (context)
+     (let ((ambitus #f))
+       ;; when music is processed: make the ambitus object, if not already built
+       `((process-music . ,(lambda (translator)
+                             (if (not ambitus)
+                                 (set! ambitus (make-ambitus translator)))))
+         ;; set the ambitus clef and key signature state
+         (stop-translation-timestep . ,(lambda (translator)
+                                         (if ambitus
+                                             (initialize-ambitus-state ambitus translator))))
+         ;; when a note-head grob is built, update the ambitus notes
+         (acknowledgers
+          (note-head-interface . ,(lambda (engraver grob source-engraver)
+                                    (if ambitus
+                                        (update-ambitus-notes ambitus grob)))))
+         ;; finally, typeset the ambitus according to its upper and lower notes
+         ;; (if any).
+         (finalize . ,(lambda (translator)
+                        (if ambitus
+                            (typeset-ambitus ambitus translator))))))))
+
+%%%
+%%% Example
+%%%
+
+\score {
+  \new StaffGroup <<
+    \new Staff { c'4 des' e' fis' gis' }
+    \new Staff { \clef "bass" c4 des ~ des ees b, }
+  >>
+  \layout { \context { \Staff \consists #ambitus-engraver } }
+}
diff --git a/Documentation/snippets/dot-count-override.ly b/Documentation/snippets/dot-count-override.ly
deleted file mode 100644 (file)
index 7d4e7dd..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-% Do not edit this file; it is automatically
-% generated from Documentation/snippets/new
-% This file is in the public domain.
-%% Note: this file works from version 2.13.26
-\version "2.13.26"
-\header {
-  lsrtags = "rhythms,expressive-marks"
-  texidoc = "This code demonstrates how to change the number of
-augmentation dots on a single note."
-  doctitle = "Changing the number of augmentation dots per note"
-} % begin verbatim
-
-
-\relative c' {
-  c4.. a16 r2 |
-  \override Dots #'dot-count = #4
-  c4.. a16 r2 |
-  \override Dots #'dot-count = #0
-  c4.. a16 r2 |
-  \revert Dots #'dot-count
-  c4.. a16 r2 |
-}
index 0add2c3e35aa79246ba20c4734784ba7fab116fa..cebfd7777b47d8f9634f4d03e065b0073e33da67 100644 (file)
@@ -11,6 +11,7 @@ changing--flageolet-mark-size.ly
 changing-text-and-spanner-styles-for-text-dynamics.ly
 changing-the-appearance-of-a-slur-from-solid-to-dotted-or-dashed.ly
 changing-the-breath-mark-symbol.ly
+changing-the-number-of-augmentation-dots-per-note.ly
 combining-dynamics-with-markup-texts.ly
 contemporary-glissando.ly
 controlling-spanner-visibility-after-a-line-break.ly
@@ -23,7 +24,6 @@ creating-real-parenthesized-dynamics.ly
 creating-simultaneous-rehearsal-marks.ly
 creating-slurs-across-voices.ly
 creating-text-spanners.ly
-dot-count-override.ly
 double-glissando.ly
 dynamics-custom-text-spanner-postfix.ly
 dynamics-text-spanner-postfix.ly
diff --git a/Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly b/Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly
new file mode 100644 (file)
index 0000000..ab7ddfd
--- /dev/null
@@ -0,0 +1,20 @@
+% Do not edit this file; it is automatically
+% generated from Documentation/snippets/new
+% This file is in the public domain.
+%% Note: this file works from version 2.13.26
+\version "2.13.26"
+\header {
+  lsrtags = "pitches"
+  texidoc = "This shows how to hide accidentals on tied notes at the beginning of a
+new system."
+  doctitle = "Hiding accidentals on tied notes at the beginning of a new system"
+} % begin verbatim
+
+
+\relative c'' {
+  \override Accidental #'hide-tied-accidental-after-break = ##t
+  cis1~ cis~
+  \break
+  cis
+}
+
diff --git a/Documentation/snippets/new/accidental-tie-overridden.ly b/Documentation/snippets/new/accidental-tie-overridden.ly
deleted file mode 100644 (file)
index f510df4..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-\version "2.13.26"
-\header {
-  lsrtags = "pitches"
-  texidoc = "This shows how to hide accidentals on tied notes at the beginning of a
-new system."
-  doctitle = "Hiding accidentals on tied notes at the beginning of a new system."
-}
-
-\relative c'' {
-  \override Accidental #'hide-tied-accidental-after-break = ##t
-  cis1~ cis~
-  \break
-  cis
-}
-
diff --git a/Documentation/snippets/new/changing-the-number-of-augmentation-dots-per-note.ly b/Documentation/snippets/new/changing-the-number-of-augmentation-dots-per-note.ly
new file mode 100644 (file)
index 0000000..8e183fd
--- /dev/null
@@ -0,0 +1,17 @@
+\version "2.13.26"
+\header {
+  lsrtags = "rhythms,expressive-marks"
+  texidoc = "This code demonstrates how to change the number of
+augmentation dots on a single note."
+  doctitle = "Changing the number of augmentation dots per note"
+}
+
+\relative c' {
+  c4.. a16 r2 |
+  \override Dots #'dot-count = #4
+  c4.. a16 r2 |
+  \override Dots #'dot-count = #0
+  c4.. a16 r2 |
+  \revert Dots #'dot-count
+  c4.. a16 r2 |
+}
diff --git a/Documentation/snippets/new/defining-an-engraver-in-scheme-ambitus-engraver.ly b/Documentation/snippets/new/defining-an-engraver-in-scheme-ambitus-engraver.ly
new file mode 100644 (file)
index 0000000..be832c9
--- /dev/null
@@ -0,0 +1,323 @@
+\version "2.13.15"
+
+\header {
+
+  lsrtags = "contexts-and-engravers"
+
+
+  texidoc = "This example demonstrates how the ambitus engraver may be
+  defined on the user side, with a Scheme engraver.
+
+  This is basically a rewrite in Scheme of the code from
+  @file{lily/ambitus-engraver.cc}.
+"
+
+  doctitle = "Defining an engraver in Scheme: ambitus engraver"
+}
+
+#(use-modules (oop goops))
+
+%%%
+%%% Grob utilities
+%%%
+%%% These are literal rewrites of some C++ methods used by the ambitus engraver.
+#(define (ly:event::in-event-class event class-name)
+   "Check if @var{event} the given class.
+Rewrite of @code{Stream_event::internal_in_event_class} from @file{lily/stream-event.cc}."
+   (memq class-name (ly:make-event-class (ly:event-property event 'class))))
+
+#(define (ly:separation-item::add-conditional-item grob grob-item)
+   "Add @var{grob-item} to the array of conditional elements of @var{grob}.
+Rewrite of @code{Separation_item::add_conditional_item} from @file{lily/separation-item.cc}."
+   (ly:pointer-group-interface::add-grob grob 'conditional-elements grob-item))
+
+#(define (ly:accidental-placement::accidental-pitch accidental-grob)
+   "Get the pitch from the grob cause of @var{accidental-grob}.
+Rewrite of @code{accidental_pitch} from @file{lily/accidental-placement.cc}."
+   (ly:event-property (ly:grob-property (ly:grob-parent accidental-grob Y) 'cause)
+                      'pitch))
+
+#(define (ly:accidental-placement::add-accidental grob accidental-grob)
+   "Add @var{accidental-grob}, an @code{Accidental} grob, to the
+list of the accidental grobs of @var{grob}, an @code{AccidentalPlacement}
+grob.
+Rewrite of @code{Accidental_placement::add_accidental} from @file{lily/accidental-placement.cc}."
+   (let ((pitch (ly:accidental-placement::accidental-pitch accidental-grob)))
+     (set! (ly:grob-parent accidental-grob X) grob)
+     (set! (ly:grob-property accidental-grob 'X-offset)
+           ly:grob::x-parent-positioning)
+     (let* ((accidentals (ly:grob-object grob 'accidental-grobs))
+            (handle (assq (ly:pitch-notename pitch) accidentals))
+            (entry (if handle (cdr handle) '())))
+       (set! (ly:grob-object grob 'accidental-grobs)
+             (assq-set! accidentals
+                        (ly:pitch-notename pitch)
+                        (cons accidental-grob entry))))))
+
+%%%
+%%% Ambitus data structure
+%%%
+
+%%% The <ambitus> class holds the various grobs that are created
+%%% to print an ambitus:
+%%% - ambitus-group: the grob that groups all the components of an ambitus
+%%% (Ambitus grob);
+%%% - ambitus-line: the vertical line between the upper and lower ambitus
+%%% notes (AmbitusLine grob);
+%%% - ambitus-up-note and ambitus-down-note: the note head and accidental
+%%% for the lower and upper note of the ambitus (see <ambitus-note> class
+%%% below).
+%%% The other slots define the key and clef context of the engraver:
+%%% - start-c0: position of middle c at the beginning of the piece.  It
+%%% is used to place the ambitus notes according to their pitch;
+%%% - start-key-sig: the key signature at the beginning of the piece.  It
+%%% is used to determine if accidentals shall be printed next to ambitus
+%%% notes.
+
+#(define-class <ambitus> ()
+   (ambitus-group #:accessor ambitus-group)
+   (ambitus-line #:accessor ambitus-line)
+   (ambitus-up-note #:getter ambitus-up-note
+                    #:init-form (make <ambitus-note>))
+   (ambitus-down-note #:getter ambitus-down-note
+                      #:init-form (make <ambitus-note>))
+   (start-c0 #:accessor ambitus-start-c0
+             #:init-value #f)
+   (start-key-sig #:accessor ambitus-start-key-sig
+                  #:init-value '()))
+
+%%% Accessor for the lower and upper note data of an ambitus
+#(define-method (ambitus-note (ambitus <ambitus>) direction)
+   "If @var{direction} is @code{UP}, then return the upper ambitus note
+of @var{ambitus}, otherwise return the lower ambitus note."
+   (if (= direction UP)
+       (ambitus-up-note ambitus)
+       (ambitus-down-note ambitus)))
+
+%%% The <ambitus-note> class holds the grobs that are specific to ambitus
+%%% (lower and upper) notes:
+%%% - head: an AmbitusNoteHead grob;
+%%% - accidental: an AmbitusAccidental grob, to be possibly printed next
+%%% to the ambitus note head.
+%%% Moreover:
+%%% - pitch is the absolute pitch of the note
+%%% - cause is the note event that causes this ambitus note, i.e. the lower
+%%% or upper note of the considered music sequence.
+
+#(define-class <ambitus-note> ()
+   (head #:accessor ambitus-note-head
+         #:init-value #f)
+   (accidental #:accessor ambitus-note-accidental
+               #:init-value #f)
+   (cause #:accessor ambitus-note-cause
+          #:init-value #f)
+   (pitch #:accessor ambitus-note-pitch
+          #:init-value #f))
+
+%%%
+%%% Ambitus engraving logics
+%%%
+%%% Rewrite of the code from @file{lily/ambitus-engraver.cc}.
+
+#(define (make-ambitus translator)
+   "Build an ambitus object: initialize all the grobs and their relations.
+
+The Ambitus grob contain all other grobs:
+ Ambitus
+  |- AmbitusLine
+  |- AmbitusNoteHead   for upper note
+  |- AmbitusAccidental for upper note
+  |- AmbitusNoteHead   for lower note
+  |- AmbitusAccidental for lower note
+
+The parent of an accidental is the corresponding note head,
+and the accidental is set as the 'accidental-grob of the note head
+so that is printed by the function that prints notes."
+   ;; make the ambitus object
+   (let ((ambitus (make <ambitus>)))
+     ;; build the Ambitus grob, which will contain all other grobs
+     (set! (ambitus-group ambitus) (ly:engraver-make-grob translator 'Ambitus '()))
+     ;; build the AmbitusLine grob (line between lower and upper note)
+     (set! (ambitus-line ambitus) (ly:engraver-make-grob translator 'AmbitusLine '()))
+     ;; build the upper and lower AmbitusNoteHead and AmbitusAccidental
+     (for-each (lambda (direction)
+                 (let ((head (ly:engraver-make-grob translator 'AmbitusNoteHead '()))
+                       (accidental (ly:engraver-make-grob translator 'AmbitusAccidental '()))
+                       (group (ambitus-group ambitus)))
+                   ;; The parent of the AmbitusAccidental grob is the
+                   ;; AmbitusNoteHead grob
+                   (set! (ly:grob-parent accidental Y) head)
+                   ;; The AmbitusAccidental grob is set as the accidental-grob
+                   ;; object of the AmbitusNoteHead.  This is later used by the
+                   ;; function that prints notes.
+                   (set! (ly:grob-object head 'accidental-grob) accidental)
+                   ;; both the note head and the accidental grobs are added
+                   ;; to the main ambitus grob.
+                   (ly:axis-group-interface::add-element group head)
+                   (ly:axis-group-interface::add-element group accidental)
+                   ;; the note head and the accidental grobs are added to the
+                   ;; ambitus object
+                   (set! (ambitus-note-head (ambitus-note ambitus direction))
+                         head)
+                   (set! (ambitus-note-accidental (ambitus-note ambitus direction))
+                         accidental)))
+               (list DOWN UP))
+     ;; The parent of the ambitus line is the lower ambitus note head
+     (set! (ly:grob-parent (ambitus-line ambitus) X)
+           (ambitus-note-head (ambitus-note ambitus DOWN)))
+     ;; the ambitus line is added to the ambitus main grob
+     (ly:axis-group-interface::add-element (ambitus-group ambitus) (ambitus-line ambitus))
+     ambitus))
+
+#(define-method (initialize-ambitus-state (ambitus <ambitus>) translator)
+   "Initialize the state of @var{ambitus}, by getting the starting
+position of middle C and key signature from @var{translator}'s context."
+   (if (not (ambitus-start-c0 ambitus))
+       (begin
+         (set! (ambitus-start-c0 ambitus)
+               (ly:context-property (ly:translator-context translator)
+                                    'middleCPosition
+                                    0))
+         (set! (ambitus-start-key-sig ambitus)
+               (ly:context-property (ly:translator-context translator)
+                                    'keySignature)))))
+
+#(define-method (update-ambitus-notes (ambitus <ambitus>) note-grob)
+   "Update the upper and lower ambitus pithes of @var{ambitus}, using
+@var{note-grob}."
+   ;; Get the event that caused the note-grob creation
+   ;; and check that it is a note-event.
+   (let ((note-event (ly:grob-property note-grob 'cause)))
+     (if (ly:event::in-event-class note-event 'note-event)
+         ;; get the pitch from the note event
+         (let ((pitch (ly:event-property note-event 'pitch)))
+           ;; if this pitch is lower than the current ambitus lower
+           ;; note pitch (or it has not been initialized yet),
+           ;; then this pitch is the new ambitus lower pitch,
+           ;; and conversely for upper pitch.
+           (for-each (lambda (direction pitch-compare)
+                       (if (or (not (ambitus-note-pitch (ambitus-note ambitus direction)))
+                               (pitch-compare pitch
+                                              (ambitus-note-pitch (ambitus-note ambitus direction))))
+                           (begin
+                             (set! (ambitus-note-pitch (ambitus-note ambitus direction))
+                                   pitch)
+                             (set! (ambitus-note-cause (ambitus-note ambitus direction))
+                                   note-event))))
+                     (list DOWN UP)
+                     (list ly:pitch<? (lambda (p1 p2)
+                                        (ly:pitch<? p2 p1))))))))
+
+#(define-method (typeset-ambitus (ambitus <ambitus>) translator)
+   "Typeset the ambitus:
+- place the lower and upper ambitus notes according to their pitch and
+  the position of the middle C;
+- typeset or delete the note accidentals, according to the key signature.
+  An accidental, if it is to be printed, is added to an AccidentalPlacement
+  grob (a grob dedicated to the placement of accidentals near a chord);
+- both note heads are added to the ambitus line grob, so that a line should
+  be printed between them."
+   ;; check if there are lower and upper pitches
+   (if (and (ambitus-note-pitch (ambitus-note ambitus UP))
+            (ambitus-note-pitch (ambitus-note ambitus DOWN)))
+       ;; make an AccidentalPlacement grob, for placement of note accidentals
+       (let ((accidental-placement (ly:engraver-make-grob
+                                    translator
+                                    'AccidentalPlacement
+                                    (ambitus-note-accidental (ambitus-note ambitus DOWN)))))
+         ;; For lower and upper ambitus notes:
+         (for-each (lambda (direction)
+                     (let ((pitch (ambitus-note-pitch (ambitus-note ambitus direction))))
+                       ;; set the cause and the staff position of the ambitus note
+                       ;; according to the associated pitch
+                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
+                                               'cause)
+                             (ambitus-note-cause (ambitus-note ambitus direction)))
+                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
+                                               'staff-position)
+                             (+ (ambitus-start-c0 ambitus)
+                                (ly:pitch-steps pitch)))
+                       ;; determine if an accidental shall be printed for this note,
+                       ;; according to the key signature
+                       (let* ((handle (or (assoc (cons (ly:pitch-octave pitch)
+                                                       (ly:pitch-notename pitch))
+                                                 (ambitus-start-key-sig ambitus))
+                                          (assoc (ly:pitch-notename pitch)
+                                                 (ambitus-start-key-sig ambitus))))
+                              (sig-alter (if handle (cdr handle) 0)))
+                         (cond ((= (ly:pitch-alteration pitch) sig-alter)
+                                ;; the note alteration is in the key signature
+                                ;; => it does not have to be printed
+                                (ly:grob-suicide!
+                                 (ambitus-note-accidental (ambitus-note ambitus direction)))
+                                (set! (ly:grob-object (ambitus-note-head (ambitus-note ambitus direction))
+                                                      'accidental-grob)
+                                      '()))
+                               (else
+                                ;; otherwise, the accidental shall be printed
+                                (set! (ly:grob-property (ambitus-note-accidental
+                                                         (ambitus-note ambitus direction))
+                                                        'alteration)
+                                      (ly:pitch-alteration pitch)))))
+                       ;; add the AccidentalPlacement grob to the
+                       ;; conditional items of the AmbitusNoteHead
+                       (ly:separation-item::add-conditional-item
+                        (ambitus-note-head (ambitus-note ambitus direction))
+                        accidental-placement)
+                       ;; add the AmbitusAccidental to the list of the
+                       ;; AccidentalPlacement grob accidentals
+                       (ly:accidental-placement::add-accidental
+                        accidental-placement
+                        (ambitus-note-accidental (ambitus-note ambitus direction)))
+                       ;; add the AmbitusNoteHead grob to the AmbitusLine grob
+                       (ly:pointer-group-interface::add-grob
+                        (ambitus-line ambitus)
+                        'note-heads
+                        (ambitus-note-head (ambitus-note ambitus direction)))))
+                   (list DOWN UP))
+         ;; add the AccidentalPlacement grob to the main Ambitus grob
+         (ly:axis-group-interface::add-element (ambitus-group ambitus) accidental-placement))
+       ;; no notes ==> suicide the grobs
+       (begin
+         (for-each (lambda (direction)
+                     (ly:grob-suicide! (ambitus-note-accidental (ambitus-note ambitus direction)))
+                     (ly:grob-suicide! (ambitus-note-head (ambitus-note ambitus direction))))
+                   (list DOWN UP))
+         (ly:grob-suicide! ambitus-line))))
+
+%%%
+%%% Ambitus engraver definition
+%%%
+#(define ambitus-engraver
+   (lambda (context)
+     (let ((ambitus #f))
+       ;; when music is processed: make the ambitus object, if not already built
+       `((process-music . ,(lambda (translator)
+                             (if (not ambitus)
+                                 (set! ambitus (make-ambitus translator)))))
+         ;; set the ambitus clef and key signature state
+         (stop-translation-timestep . ,(lambda (translator)
+                                         (if ambitus
+                                             (initialize-ambitus-state ambitus translator))))
+         ;; when a note-head grob is built, update the ambitus notes
+         (acknowledgers
+          (note-head-interface . ,(lambda (engraver grob source-engraver)
+                                    (if ambitus
+                                        (update-ambitus-notes ambitus grob)))))
+         ;; finally, typeset the ambitus according to its upper and lower notes
+         ;; (if any).
+         (finalize . ,(lambda (translator)
+                        (if ambitus
+                            (typeset-ambitus ambitus translator))))))))
+
+%%%
+%%% Example
+%%%
+
+\score {
+  \new StaffGroup <<
+    \new Staff { c'4 des' e' fis' gis' }
+    \new Staff { \clef "bass" c4 des ~ des ees b, }
+  >>
+  \layout { \context { \Staff \consists #ambitus-engraver } }
+}
diff --git a/Documentation/snippets/new/dot-count-override.ly b/Documentation/snippets/new/dot-count-override.ly
deleted file mode 100644 (file)
index 8e183fd..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-\version "2.13.26"
-\header {
-  lsrtags = "rhythms,expressive-marks"
-  texidoc = "This code demonstrates how to change the number of
-augmentation dots on a single note."
-  doctitle = "Changing the number of augmentation dots per note"
-}
-
-\relative c' {
-  c4.. a16 r2 |
-  \override Dots #'dot-count = #4
-  c4.. a16 r2 |
-  \override Dots #'dot-count = #0
-  c4.. a16 r2 |
-  \revert Dots #'dot-count
-  c4.. a16 r2 |
-}
diff --git a/Documentation/snippets/new/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly b/Documentation/snippets/new/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly
new file mode 100644 (file)
index 0000000..2d35300
--- /dev/null
@@ -0,0 +1,15 @@
+\version "2.13.26"
+\header {
+  lsrtags = "pitches"
+  texidoc = "This shows how to hide accidentals on tied notes at the beginning of a
+new system."
+  doctitle = "Hiding accidentals on tied notes at the beginning of a new system"
+}
+
+\relative c'' {
+  \override Accidental #'hide-tied-accidental-after-break = ##t
+  cis1~ cis~
+  \break
+  cis
+}
+
diff --git a/Documentation/snippets/new/scheme-engraver-ambitus.ly b/Documentation/snippets/new/scheme-engraver-ambitus.ly
deleted file mode 100644 (file)
index be832c9..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-\version "2.13.15"
-
-\header {
-
-  lsrtags = "contexts-and-engravers"
-
-
-  texidoc = "This example demonstrates how the ambitus engraver may be
-  defined on the user side, with a Scheme engraver.
-
-  This is basically a rewrite in Scheme of the code from
-  @file{lily/ambitus-engraver.cc}.
-"
-
-  doctitle = "Defining an engraver in Scheme: ambitus engraver"
-}
-
-#(use-modules (oop goops))
-
-%%%
-%%% Grob utilities
-%%%
-%%% These are literal rewrites of some C++ methods used by the ambitus engraver.
-#(define (ly:event::in-event-class event class-name)
-   "Check if @var{event} the given class.
-Rewrite of @code{Stream_event::internal_in_event_class} from @file{lily/stream-event.cc}."
-   (memq class-name (ly:make-event-class (ly:event-property event 'class))))
-
-#(define (ly:separation-item::add-conditional-item grob grob-item)
-   "Add @var{grob-item} to the array of conditional elements of @var{grob}.
-Rewrite of @code{Separation_item::add_conditional_item} from @file{lily/separation-item.cc}."
-   (ly:pointer-group-interface::add-grob grob 'conditional-elements grob-item))
-
-#(define (ly:accidental-placement::accidental-pitch accidental-grob)
-   "Get the pitch from the grob cause of @var{accidental-grob}.
-Rewrite of @code{accidental_pitch} from @file{lily/accidental-placement.cc}."
-   (ly:event-property (ly:grob-property (ly:grob-parent accidental-grob Y) 'cause)
-                      'pitch))
-
-#(define (ly:accidental-placement::add-accidental grob accidental-grob)
-   "Add @var{accidental-grob}, an @code{Accidental} grob, to the
-list of the accidental grobs of @var{grob}, an @code{AccidentalPlacement}
-grob.
-Rewrite of @code{Accidental_placement::add_accidental} from @file{lily/accidental-placement.cc}."
-   (let ((pitch (ly:accidental-placement::accidental-pitch accidental-grob)))
-     (set! (ly:grob-parent accidental-grob X) grob)
-     (set! (ly:grob-property accidental-grob 'X-offset)
-           ly:grob::x-parent-positioning)
-     (let* ((accidentals (ly:grob-object grob 'accidental-grobs))
-            (handle (assq (ly:pitch-notename pitch) accidentals))
-            (entry (if handle (cdr handle) '())))
-       (set! (ly:grob-object grob 'accidental-grobs)
-             (assq-set! accidentals
-                        (ly:pitch-notename pitch)
-                        (cons accidental-grob entry))))))
-
-%%%
-%%% Ambitus data structure
-%%%
-
-%%% The <ambitus> class holds the various grobs that are created
-%%% to print an ambitus:
-%%% - ambitus-group: the grob that groups all the components of an ambitus
-%%% (Ambitus grob);
-%%% - ambitus-line: the vertical line between the upper and lower ambitus
-%%% notes (AmbitusLine grob);
-%%% - ambitus-up-note and ambitus-down-note: the note head and accidental
-%%% for the lower and upper note of the ambitus (see <ambitus-note> class
-%%% below).
-%%% The other slots define the key and clef context of the engraver:
-%%% - start-c0: position of middle c at the beginning of the piece.  It
-%%% is used to place the ambitus notes according to their pitch;
-%%% - start-key-sig: the key signature at the beginning of the piece.  It
-%%% is used to determine if accidentals shall be printed next to ambitus
-%%% notes.
-
-#(define-class <ambitus> ()
-   (ambitus-group #:accessor ambitus-group)
-   (ambitus-line #:accessor ambitus-line)
-   (ambitus-up-note #:getter ambitus-up-note
-                    #:init-form (make <ambitus-note>))
-   (ambitus-down-note #:getter ambitus-down-note
-                      #:init-form (make <ambitus-note>))
-   (start-c0 #:accessor ambitus-start-c0
-             #:init-value #f)
-   (start-key-sig #:accessor ambitus-start-key-sig
-                  #:init-value '()))
-
-%%% Accessor for the lower and upper note data of an ambitus
-#(define-method (ambitus-note (ambitus <ambitus>) direction)
-   "If @var{direction} is @code{UP}, then return the upper ambitus note
-of @var{ambitus}, otherwise return the lower ambitus note."
-   (if (= direction UP)
-       (ambitus-up-note ambitus)
-       (ambitus-down-note ambitus)))
-
-%%% The <ambitus-note> class holds the grobs that are specific to ambitus
-%%% (lower and upper) notes:
-%%% - head: an AmbitusNoteHead grob;
-%%% - accidental: an AmbitusAccidental grob, to be possibly printed next
-%%% to the ambitus note head.
-%%% Moreover:
-%%% - pitch is the absolute pitch of the note
-%%% - cause is the note event that causes this ambitus note, i.e. the lower
-%%% or upper note of the considered music sequence.
-
-#(define-class <ambitus-note> ()
-   (head #:accessor ambitus-note-head
-         #:init-value #f)
-   (accidental #:accessor ambitus-note-accidental
-               #:init-value #f)
-   (cause #:accessor ambitus-note-cause
-          #:init-value #f)
-   (pitch #:accessor ambitus-note-pitch
-          #:init-value #f))
-
-%%%
-%%% Ambitus engraving logics
-%%%
-%%% Rewrite of the code from @file{lily/ambitus-engraver.cc}.
-
-#(define (make-ambitus translator)
-   "Build an ambitus object: initialize all the grobs and their relations.
-
-The Ambitus grob contain all other grobs:
- Ambitus
-  |- AmbitusLine
-  |- AmbitusNoteHead   for upper note
-  |- AmbitusAccidental for upper note
-  |- AmbitusNoteHead   for lower note
-  |- AmbitusAccidental for lower note
-
-The parent of an accidental is the corresponding note head,
-and the accidental is set as the 'accidental-grob of the note head
-so that is printed by the function that prints notes."
-   ;; make the ambitus object
-   (let ((ambitus (make <ambitus>)))
-     ;; build the Ambitus grob, which will contain all other grobs
-     (set! (ambitus-group ambitus) (ly:engraver-make-grob translator 'Ambitus '()))
-     ;; build the AmbitusLine grob (line between lower and upper note)
-     (set! (ambitus-line ambitus) (ly:engraver-make-grob translator 'AmbitusLine '()))
-     ;; build the upper and lower AmbitusNoteHead and AmbitusAccidental
-     (for-each (lambda (direction)
-                 (let ((head (ly:engraver-make-grob translator 'AmbitusNoteHead '()))
-                       (accidental (ly:engraver-make-grob translator 'AmbitusAccidental '()))
-                       (group (ambitus-group ambitus)))
-                   ;; The parent of the AmbitusAccidental grob is the
-                   ;; AmbitusNoteHead grob
-                   (set! (ly:grob-parent accidental Y) head)
-                   ;; The AmbitusAccidental grob is set as the accidental-grob
-                   ;; object of the AmbitusNoteHead.  This is later used by the
-                   ;; function that prints notes.
-                   (set! (ly:grob-object head 'accidental-grob) accidental)
-                   ;; both the note head and the accidental grobs are added
-                   ;; to the main ambitus grob.
-                   (ly:axis-group-interface::add-element group head)
-                   (ly:axis-group-interface::add-element group accidental)
-                   ;; the note head and the accidental grobs are added to the
-                   ;; ambitus object
-                   (set! (ambitus-note-head (ambitus-note ambitus direction))
-                         head)
-                   (set! (ambitus-note-accidental (ambitus-note ambitus direction))
-                         accidental)))
-               (list DOWN UP))
-     ;; The parent of the ambitus line is the lower ambitus note head
-     (set! (ly:grob-parent (ambitus-line ambitus) X)
-           (ambitus-note-head (ambitus-note ambitus DOWN)))
-     ;; the ambitus line is added to the ambitus main grob
-     (ly:axis-group-interface::add-element (ambitus-group ambitus) (ambitus-line ambitus))
-     ambitus))
-
-#(define-method (initialize-ambitus-state (ambitus <ambitus>) translator)
-   "Initialize the state of @var{ambitus}, by getting the starting
-position of middle C and key signature from @var{translator}'s context."
-   (if (not (ambitus-start-c0 ambitus))
-       (begin
-         (set! (ambitus-start-c0 ambitus)
-               (ly:context-property (ly:translator-context translator)
-                                    'middleCPosition
-                                    0))
-         (set! (ambitus-start-key-sig ambitus)
-               (ly:context-property (ly:translator-context translator)
-                                    'keySignature)))))
-
-#(define-method (update-ambitus-notes (ambitus <ambitus>) note-grob)
-   "Update the upper and lower ambitus pithes of @var{ambitus}, using
-@var{note-grob}."
-   ;; Get the event that caused the note-grob creation
-   ;; and check that it is a note-event.
-   (let ((note-event (ly:grob-property note-grob 'cause)))
-     (if (ly:event::in-event-class note-event 'note-event)
-         ;; get the pitch from the note event
-         (let ((pitch (ly:event-property note-event 'pitch)))
-           ;; if this pitch is lower than the current ambitus lower
-           ;; note pitch (or it has not been initialized yet),
-           ;; then this pitch is the new ambitus lower pitch,
-           ;; and conversely for upper pitch.
-           (for-each (lambda (direction pitch-compare)
-                       (if (or (not (ambitus-note-pitch (ambitus-note ambitus direction)))
-                               (pitch-compare pitch
-                                              (ambitus-note-pitch (ambitus-note ambitus direction))))
-                           (begin
-                             (set! (ambitus-note-pitch (ambitus-note ambitus direction))
-                                   pitch)
-                             (set! (ambitus-note-cause (ambitus-note ambitus direction))
-                                   note-event))))
-                     (list DOWN UP)
-                     (list ly:pitch<? (lambda (p1 p2)
-                                        (ly:pitch<? p2 p1))))))))
-
-#(define-method (typeset-ambitus (ambitus <ambitus>) translator)
-   "Typeset the ambitus:
-- place the lower and upper ambitus notes according to their pitch and
-  the position of the middle C;
-- typeset or delete the note accidentals, according to the key signature.
-  An accidental, if it is to be printed, is added to an AccidentalPlacement
-  grob (a grob dedicated to the placement of accidentals near a chord);
-- both note heads are added to the ambitus line grob, so that a line should
-  be printed between them."
-   ;; check if there are lower and upper pitches
-   (if (and (ambitus-note-pitch (ambitus-note ambitus UP))
-            (ambitus-note-pitch (ambitus-note ambitus DOWN)))
-       ;; make an AccidentalPlacement grob, for placement of note accidentals
-       (let ((accidental-placement (ly:engraver-make-grob
-                                    translator
-                                    'AccidentalPlacement
-                                    (ambitus-note-accidental (ambitus-note ambitus DOWN)))))
-         ;; For lower and upper ambitus notes:
-         (for-each (lambda (direction)
-                     (let ((pitch (ambitus-note-pitch (ambitus-note ambitus direction))))
-                       ;; set the cause and the staff position of the ambitus note
-                       ;; according to the associated pitch
-                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
-                                               'cause)
-                             (ambitus-note-cause (ambitus-note ambitus direction)))
-                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
-                                               'staff-position)
-                             (+ (ambitus-start-c0 ambitus)
-                                (ly:pitch-steps pitch)))
-                       ;; determine if an accidental shall be printed for this note,
-                       ;; according to the key signature
-                       (let* ((handle (or (assoc (cons (ly:pitch-octave pitch)
-                                                       (ly:pitch-notename pitch))
-                                                 (ambitus-start-key-sig ambitus))
-                                          (assoc (ly:pitch-notename pitch)
-                                                 (ambitus-start-key-sig ambitus))))
-                              (sig-alter (if handle (cdr handle) 0)))
-                         (cond ((= (ly:pitch-alteration pitch) sig-alter)
-                                ;; the note alteration is in the key signature
-                                ;; => it does not have to be printed
-                                (ly:grob-suicide!
-                                 (ambitus-note-accidental (ambitus-note ambitus direction)))
-                                (set! (ly:grob-object (ambitus-note-head (ambitus-note ambitus direction))
-                                                      'accidental-grob)
-                                      '()))
-                               (else
-                                ;; otherwise, the accidental shall be printed
-                                (set! (ly:grob-property (ambitus-note-accidental
-                                                         (ambitus-note ambitus direction))
-                                                        'alteration)
-                                      (ly:pitch-alteration pitch)))))
-                       ;; add the AccidentalPlacement grob to the
-                       ;; conditional items of the AmbitusNoteHead
-                       (ly:separation-item::add-conditional-item
-                        (ambitus-note-head (ambitus-note ambitus direction))
-                        accidental-placement)
-                       ;; add the AmbitusAccidental to the list of the
-                       ;; AccidentalPlacement grob accidentals
-                       (ly:accidental-placement::add-accidental
-                        accidental-placement
-                        (ambitus-note-accidental (ambitus-note ambitus direction)))
-                       ;; add the AmbitusNoteHead grob to the AmbitusLine grob
-                       (ly:pointer-group-interface::add-grob
-                        (ambitus-line ambitus)
-                        'note-heads
-                        (ambitus-note-head (ambitus-note ambitus direction)))))
-                   (list DOWN UP))
-         ;; add the AccidentalPlacement grob to the main Ambitus grob
-         (ly:axis-group-interface::add-element (ambitus-group ambitus) accidental-placement))
-       ;; no notes ==> suicide the grobs
-       (begin
-         (for-each (lambda (direction)
-                     (ly:grob-suicide! (ambitus-note-accidental (ambitus-note ambitus direction)))
-                     (ly:grob-suicide! (ambitus-note-head (ambitus-note ambitus direction))))
-                   (list DOWN UP))
-         (ly:grob-suicide! ambitus-line))))
-
-%%%
-%%% Ambitus engraver definition
-%%%
-#(define ambitus-engraver
-   (lambda (context)
-     (let ((ambitus #f))
-       ;; when music is processed: make the ambitus object, if not already built
-       `((process-music . ,(lambda (translator)
-                             (if (not ambitus)
-                                 (set! ambitus (make-ambitus translator)))))
-         ;; set the ambitus clef and key signature state
-         (stop-translation-timestep . ,(lambda (translator)
-                                         (if ambitus
-                                             (initialize-ambitus-state ambitus translator))))
-         ;; when a note-head grob is built, update the ambitus notes
-         (acknowledgers
-          (note-head-interface . ,(lambda (engraver grob source-engraver)
-                                    (if ambitus
-                                        (update-ambitus-notes ambitus grob)))))
-         ;; finally, typeset the ambitus according to its upper and lower notes
-         ;; (if any).
-         (finalize . ,(lambda (translator)
-                        (if ambitus
-                            (typeset-ambitus ambitus translator))))))))
-
-%%%
-%%% Example
-%%%
-
-\score {
-  \new StaffGroup <<
-    \new Staff { c'4 des' e' fis' gis' }
-    \new Staff { \clef "bass" c4 des ~ des ees b, }
-  >>
-  \layout { \context { \Staff \consists #ambitus-engraver } }
-}
index 82f01ee581cd33a0ae7d3eb4deab0a51e2c2ff9c..2f458f2cfda56d5d0fbb6f1d53ee07239205ad3f 100644 (file)
@@ -9,7 +9,7 @@ use of spacer rests within the @code{\global} variable to define
 meter changes (and other elements common to all parts) throughout
 the entire score.
 "
-  doctitle = "Solo verse and two-part refrain"
+  doctitle = "Vocal ensemble template with verse and refrain"
 }
 
 global = {
index 0bc43dffad3adaf4c56ff0612f5f40a76d1ae52e..9e0bb550258223434d3874f055a810ebdf753893 100644 (file)
@@ -1,4 +1,3 @@
-accidental-tie-overridden.ly
 adding-ambitus-per-voice.ly
 altering-the-length-of-beamed-stems.ly
 ambitus-with-multiple-voices.ly
@@ -8,6 +7,7 @@ coloring-notes-depending-on-their-pitch.ly
 creating-a-sequence-of-notes-on-various-pitches.ly
 dodecaphonic-style-accidentals-for-each-note-including-naturals.ly
 generating-random-notes.ly
+hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly
 keep-change-clefs-full-sized.ly
 makam-example.ly
 non-traditional-key-signatures.ly
index a194c129f5d46ac09fc228cd0ee0f0204ea49041..0f9e9437387423f6179853ded3f2ca55e0426c53 100644 (file)
@@ -1,4 +1,3 @@
-accidental-tie-overridden.ly
 adding-beams,-slurs,-ties-etc.-when-using-tuplet-and-non-tuplet-rhythms.ly
 adding-drum-parts.ly
 adjusting-grace-note-spacing.ly
@@ -10,6 +9,7 @@ beam-grouping-in-7-8-time.ly
 beams-across-line-breaks.ly
 changing-beam-knee-gap.ly
 changing-form-of-multi-measure-rests.ly
+changing-the-number-of-augmentation-dots-per-note.ly
 changing-the-time-signature-without-affecting-the-beaming.ly
 changing-the-tuplet-number.ly
 changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly
@@ -17,7 +17,6 @@ chant-or-psalms-notation.ly
 compound-time-signatures.ly
 conducting-signs,-measure-grouping-signs.ly
 controlling-tuplet-bracket-visibility.ly
-dot-count-override.ly
 engraving-ties-manually.ly
 engraving-tremolos-with-floating-beams.ly
 entering-several-tuplets-using-only-one--times-command.ly
diff --git a/Documentation/snippets/scheme-engraver-ambitus.ly b/Documentation/snippets/scheme-engraver-ambitus.ly
deleted file mode 100644 (file)
index ae677a0..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-% Do not edit this file; it is automatically
-% generated from Documentation/snippets/new
-% This file is in the public domain.
-%% Note: this file works from version 2.13.15
-\version "2.13.20"
-
-\header {
-%% Translation of GIT committish: 0b55335aeca1de539bf1125b717e0c21bb6fa31b
-
-  texidoces = "
-Este ejemplo demuestra cómo se puede definir el grabador de ámbito en
-el espacio del usuario, con un grabador de Scheme.
-
-Esto es básicamente una reescritura en Scheme del código de
-@file{lily/ambitus-engraver.cc}.
-
-"
-
-  doctitlees = "Definir un grabador en Scheme: grabador de ámbito"
-
-
-  lsrtags = "contexts-and-engravers"
-
-
-  texidoc = "This example demonstrates how the ambitus engraver may be
-  defined on the user side, with a Scheme engraver.
-
-  This is basically a rewrite in Scheme of the code from
-  @file{lily/ambitus-engraver.cc}.
-"
-
-  doctitle = "Defining an engraver in Scheme: ambitus engraver"
-} % begin verbatim
-
-
-#(use-modules (oop goops))
-
-%%%
-%%% Grob utilities
-%%%
-%%% These are literal rewrites of some C++ methods used by the ambitus engraver.
-#(define (ly:event::in-event-class event class-name)
-   "Check if @var{event} the given class.
-Rewrite of @code{Stream_event::internal_in_event_class} from @file{lily/stream-event.cc}."
-   (memq class-name (ly:make-event-class (ly:event-property event 'class))))
-
-#(define (ly:separation-item::add-conditional-item grob grob-item)
-   "Add @var{grob-item} to the array of conditional elements of @var{grob}.
-Rewrite of @code{Separation_item::add_conditional_item} from @file{lily/separation-item.cc}."
-   (ly:pointer-group-interface::add-grob grob 'conditional-elements grob-item))
-
-#(define (ly:accidental-placement::accidental-pitch accidental-grob)
-   "Get the pitch from the grob cause of @var{accidental-grob}.
-Rewrite of @code{accidental_pitch} from @file{lily/accidental-placement.cc}."
-   (ly:event-property (ly:grob-property (ly:grob-parent accidental-grob Y) 'cause)
-                      'pitch))
-
-#(define (ly:accidental-placement::add-accidental grob accidental-grob)
-   "Add @var{accidental-grob}, an @code{Accidental} grob, to the
-list of the accidental grobs of @var{grob}, an @code{AccidentalPlacement}
-grob.
-Rewrite of @code{Accidental_placement::add_accidental} from @file{lily/accidental-placement.cc}."
-   (let ((pitch (ly:accidental-placement::accidental-pitch accidental-grob)))
-     (set! (ly:grob-parent accidental-grob X) grob)
-     (set! (ly:grob-property accidental-grob 'X-offset)
-           ly:grob::x-parent-positioning)
-     (let* ((accidentals (ly:grob-object grob 'accidental-grobs))
-            (handle (assq (ly:pitch-notename pitch) accidentals))
-            (entry (if handle (cdr handle) '())))
-       (set! (ly:grob-object grob 'accidental-grobs)
-             (assq-set! accidentals
-                        (ly:pitch-notename pitch)
-                        (cons accidental-grob entry))))))
-
-%%%
-%%% Ambitus data structure
-%%%
-
-%%% The <ambitus> class holds the various grobs that are created
-%%% to print an ambitus:
-%%% - ambitus-group: the grob that groups all the components of an ambitus
-%%% (Ambitus grob);
-%%% - ambitus-line: the vertical line between the upper and lower ambitus
-%%% notes (AmbitusLine grob);
-%%% - ambitus-up-note and ambitus-down-note: the note head and accidental
-%%% for the lower and upper note of the ambitus (see <ambitus-note> class
-%%% below).
-%%% The other slots define the key and clef context of the engraver:
-%%% - start-c0: position of middle c at the beginning of the piece.  It
-%%% is used to place the ambitus notes according to their pitch;
-%%% - start-key-sig: the key signature at the beginning of the piece.  It
-%%% is used to determine if accidentals shall be printed next to ambitus
-%%% notes.
-
-#(define-class <ambitus> ()
-   (ambitus-group #:accessor ambitus-group)
-   (ambitus-line #:accessor ambitus-line)
-   (ambitus-up-note #:getter ambitus-up-note
-                    #:init-form (make <ambitus-note>))
-   (ambitus-down-note #:getter ambitus-down-note
-                      #:init-form (make <ambitus-note>))
-   (start-c0 #:accessor ambitus-start-c0
-             #:init-value #f)
-   (start-key-sig #:accessor ambitus-start-key-sig
-                  #:init-value '()))
-
-%%% Accessor for the lower and upper note data of an ambitus
-#(define-method (ambitus-note (ambitus <ambitus>) direction)
-   "If @var{direction} is @code{UP}, then return the upper ambitus note
-of @var{ambitus}, otherwise return the lower ambitus note."
-   (if (= direction UP)
-       (ambitus-up-note ambitus)
-       (ambitus-down-note ambitus)))
-
-%%% The <ambitus-note> class holds the grobs that are specific to ambitus
-%%% (lower and upper) notes:
-%%% - head: an AmbitusNoteHead grob;
-%%% - accidental: an AmbitusAccidental grob, to be possibly printed next
-%%% to the ambitus note head.
-%%% Moreover:
-%%% - pitch is the absolute pitch of the note
-%%% - cause is the note event that causes this ambitus note, i.e. the lower
-%%% or upper note of the considered music sequence.
-
-#(define-class <ambitus-note> ()
-   (head #:accessor ambitus-note-head
-         #:init-value #f)
-   (accidental #:accessor ambitus-note-accidental
-               #:init-value #f)
-   (cause #:accessor ambitus-note-cause
-          #:init-value #f)
-   (pitch #:accessor ambitus-note-pitch
-          #:init-value #f))
-
-%%%
-%%% Ambitus engraving logics
-%%%
-%%% Rewrite of the code from @file{lily/ambitus-engraver.cc}.
-
-#(define (make-ambitus translator)
-   "Build an ambitus object: initialize all the grobs and their relations.
-
-The Ambitus grob contain all other grobs:
- Ambitus
-  |- AmbitusLine
-  |- AmbitusNoteHead   for upper note
-  |- AmbitusAccidental for upper note
-  |- AmbitusNoteHead   for lower note
-  |- AmbitusAccidental for lower note
-
-The parent of an accidental is the corresponding note head,
-and the accidental is set as the 'accidental-grob of the note head
-so that is printed by the function that prints notes."
-   ;; make the ambitus object
-   (let ((ambitus (make <ambitus>)))
-     ;; build the Ambitus grob, which will contain all other grobs
-     (set! (ambitus-group ambitus) (ly:engraver-make-grob translator 'Ambitus '()))
-     ;; build the AmbitusLine grob (line between lower and upper note)
-     (set! (ambitus-line ambitus) (ly:engraver-make-grob translator 'AmbitusLine '()))
-     ;; build the upper and lower AmbitusNoteHead and AmbitusAccidental
-     (for-each (lambda (direction)
-                 (let ((head (ly:engraver-make-grob translator 'AmbitusNoteHead '()))
-                       (accidental (ly:engraver-make-grob translator 'AmbitusAccidental '()))
-                       (group (ambitus-group ambitus)))
-                   ;; The parent of the AmbitusAccidental grob is the
-                   ;; AmbitusNoteHead grob
-                   (set! (ly:grob-parent accidental Y) head)
-                   ;; The AmbitusAccidental grob is set as the accidental-grob
-                   ;; object of the AmbitusNoteHead.  This is later used by the
-                   ;; function that prints notes.
-                   (set! (ly:grob-object head 'accidental-grob) accidental)
-                   ;; both the note head and the accidental grobs are added
-                   ;; to the main ambitus grob.
-                   (ly:axis-group-interface::add-element group head)
-                   (ly:axis-group-interface::add-element group accidental)
-                   ;; the note head and the accidental grobs are added to the
-                   ;; ambitus object
-                   (set! (ambitus-note-head (ambitus-note ambitus direction))
-                         head)
-                   (set! (ambitus-note-accidental (ambitus-note ambitus direction))
-                         accidental)))
-               (list DOWN UP))
-     ;; The parent of the ambitus line is the lower ambitus note head
-     (set! (ly:grob-parent (ambitus-line ambitus) X)
-           (ambitus-note-head (ambitus-note ambitus DOWN)))
-     ;; the ambitus line is added to the ambitus main grob
-     (ly:axis-group-interface::add-element (ambitus-group ambitus) (ambitus-line ambitus))
-     ambitus))
-
-#(define-method (initialize-ambitus-state (ambitus <ambitus>) translator)
-   "Initialize the state of @var{ambitus}, by getting the starting
-position of middle C and key signature from @var{translator}'s context."
-   (if (not (ambitus-start-c0 ambitus))
-       (begin
-         (set! (ambitus-start-c0 ambitus)
-               (ly:context-property (ly:translator-context translator)
-                                    'middleCPosition
-                                    0))
-         (set! (ambitus-start-key-sig ambitus)
-               (ly:context-property (ly:translator-context translator)
-                                    'keySignature)))))
-
-#(define-method (update-ambitus-notes (ambitus <ambitus>) note-grob)
-   "Update the upper and lower ambitus pithes of @var{ambitus}, using
-@var{note-grob}."
-   ;; Get the event that caused the note-grob creation
-   ;; and check that it is a note-event.
-   (let ((note-event (ly:grob-property note-grob 'cause)))
-     (if (ly:event::in-event-class note-event 'note-event)
-         ;; get the pitch from the note event
-         (let ((pitch (ly:event-property note-event 'pitch)))
-           ;; if this pitch is lower than the current ambitus lower
-           ;; note pitch (or it has not been initialized yet),
-           ;; then this pitch is the new ambitus lower pitch,
-           ;; and conversely for upper pitch.
-           (for-each (lambda (direction pitch-compare)
-                       (if (or (not (ambitus-note-pitch (ambitus-note ambitus direction)))
-                               (pitch-compare pitch
-                                              (ambitus-note-pitch (ambitus-note ambitus direction))))
-                           (begin
-                             (set! (ambitus-note-pitch (ambitus-note ambitus direction))
-                                   pitch)
-                             (set! (ambitus-note-cause (ambitus-note ambitus direction))
-                                   note-event))))
-                     (list DOWN UP)
-                     (list ly:pitch<? (lambda (p1 p2)
-                                        (ly:pitch<? p2 p1))))))))
-
-#(define-method (typeset-ambitus (ambitus <ambitus>) translator)
-   "Typeset the ambitus:
-- place the lower and upper ambitus notes according to their pitch and
-  the position of the middle C;
-- typeset or delete the note accidentals, according to the key signature.
-  An accidental, if it is to be printed, is added to an AccidentalPlacement
-  grob (a grob dedicated to the placement of accidentals near a chord);
-- both note heads are added to the ambitus line grob, so that a line should
-  be printed between them."
-   ;; check if there are lower and upper pitches
-   (if (and (ambitus-note-pitch (ambitus-note ambitus UP))
-            (ambitus-note-pitch (ambitus-note ambitus DOWN)))
-       ;; make an AccidentalPlacement grob, for placement of note accidentals
-       (let ((accidental-placement (ly:engraver-make-grob
-                                    translator
-                                    'AccidentalPlacement
-                                    (ambitus-note-accidental (ambitus-note ambitus DOWN)))))
-         ;; For lower and upper ambitus notes:
-         (for-each (lambda (direction)
-                     (let ((pitch (ambitus-note-pitch (ambitus-note ambitus direction))))
-                       ;; set the cause and the staff position of the ambitus note
-                       ;; according to the associated pitch
-                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
-                                               'cause)
-                             (ambitus-note-cause (ambitus-note ambitus direction)))
-                       (set! (ly:grob-property (ambitus-note-head (ambitus-note ambitus direction))
-                                               'staff-position)
-                             (+ (ambitus-start-c0 ambitus)
-                                (ly:pitch-steps pitch)))
-                       ;; determine if an accidental shall be printed for this note,
-                       ;; according to the key signature
-                       (let* ((handle (or (assoc (cons (ly:pitch-octave pitch)
-                                                       (ly:pitch-notename pitch))
-                                                 (ambitus-start-key-sig ambitus))
-                                          (assoc (ly:pitch-notename pitch)
-                                                 (ambitus-start-key-sig ambitus))))
-                              (sig-alter (if handle (cdr handle) 0)))
-                         (cond ((= (ly:pitch-alteration pitch) sig-alter)
-                                ;; the note alteration is in the key signature
-                                ;; => it does not have to be printed
-                                (ly:grob-suicide!
-                                 (ambitus-note-accidental (ambitus-note ambitus direction)))
-                                (set! (ly:grob-object (ambitus-note-head (ambitus-note ambitus direction))
-                                                      'accidental-grob)
-                                      '()))
-                               (else
-                                ;; otherwise, the accidental shall be printed
-                                (set! (ly:grob-property (ambitus-note-accidental
-                                                         (ambitus-note ambitus direction))
-                                                        'alteration)
-                                      (ly:pitch-alteration pitch)))))
-                       ;; add the AccidentalPlacement grob to the
-                       ;; conditional items of the AmbitusNoteHead
-                       (ly:separation-item::add-conditional-item
-                        (ambitus-note-head (ambitus-note ambitus direction))
-                        accidental-placement)
-                       ;; add the AmbitusAccidental to the list of the
-                       ;; AccidentalPlacement grob accidentals
-                       (ly:accidental-placement::add-accidental
-                        accidental-placement
-                        (ambitus-note-accidental (ambitus-note ambitus direction)))
-                       ;; add the AmbitusNoteHead grob to the AmbitusLine grob
-                       (ly:pointer-group-interface::add-grob
-                        (ambitus-line ambitus)
-                        'note-heads
-                        (ambitus-note-head (ambitus-note ambitus direction)))))
-                   (list DOWN UP))
-         ;; add the AccidentalPlacement grob to the main Ambitus grob
-         (ly:axis-group-interface::add-element (ambitus-group ambitus) accidental-placement))
-       ;; no notes ==> suicide the grobs
-       (begin
-         (for-each (lambda (direction)
-                     (ly:grob-suicide! (ambitus-note-accidental (ambitus-note ambitus direction)))
-                     (ly:grob-suicide! (ambitus-note-head (ambitus-note ambitus direction))))
-                   (list DOWN UP))
-         (ly:grob-suicide! ambitus-line))))
-
-%%%
-%%% Ambitus engraver definition
-%%%
-#(define ambitus-engraver
-   (lambda (context)
-     (let ((ambitus #f))
-       ;; when music is processed: make the ambitus object, if not already built
-       `((process-music . ,(lambda (translator)
-                             (if (not ambitus)
-                                 (set! ambitus (make-ambitus translator)))))
-         ;; set the ambitus clef and key signature state
-         (stop-translation-timestep . ,(lambda (translator)
-                                         (if ambitus
-                                             (initialize-ambitus-state ambitus translator))))
-         ;; when a note-head grob is built, update the ambitus notes
-         (acknowledgers
-          (note-head-interface . ,(lambda (engraver grob source-engraver)
-                                    (if ambitus
-                                        (update-ambitus-notes ambitus grob)))))
-         ;; finally, typeset the ambitus according to its upper and lower notes
-         ;; (if any).
-         (finalize . ,(lambda (translator)
-                        (if ambitus
-                            (typeset-ambitus ambitus translator))))))))
-
-%%%
-%%% Example
-%%%
-
-\score {
-  \new StaffGroup <<
-    \new Staff { c'4 des' e' fis' gis' }
-    \new Staff { \clef "bass" c4 des ~ des ees b, }
-  >>
-  \layout { \context { \Staff \consists #ambitus-engraver } }
-}
index 97e700e114c19bfcfd7e2aa794a2c34deb5b329d..6110610be020271d87891adf58638310369e5ed0 100644 (file)
@@ -26,7 +26,7 @@ use of spacer rests within the @code{\global} variable to define
 meter changes (and other elements common to all parts) throughout
 the entire score.
 "
-  doctitle = "Solo verse and two-part refrain"
+  doctitle = "Vocal ensemble template with verse and refrain"
 } % begin verbatim