From: Neil Puttock Date: Sun, 4 Jul 2010 17:06:47 +0000 (+0100) Subject: Docs: Snippets: Rename new snippets so titles match file names. X-Git-Tag: release/2.13.27-1~10 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f47aeae9323112cb359dcb0a08fed8d43c4c26a4;p=lilypond.git Docs: Snippets: Rename new snippets so titles match file names. 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. --- diff --git a/Documentation/es/notation/rhythms.itely b/Documentation/es/notation/rhythms.itely index 3743751905..04c4252414 100644 --- a/Documentation/es/notation/rhythms.itely +++ b/Documentation/es/notation/rhythms.itely @@ -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 index 0000000000..dee68017e3 --- /dev/null +++ b/Documentation/es/texidocs/defining-an-engraver-in-scheme-ambitus-engraver.texidoc @@ -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 index dee68017e3..0000000000 --- a/Documentation/es/texidocs/scheme-engraver-ambitus.texidoc +++ /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" diff --git a/Documentation/notation/pitches.itely b/Documentation/notation/pitches.itely index 25beca3993..7fb1f89e48 100644 --- a/Documentation/notation/pitches.itely +++ b/Documentation/notation/pitches.itely @@ -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} diff --git a/Documentation/notation/rhythms.itely b/Documentation/notation/rhythms.itely index 6798e11e85..ba49de1003 100644 --- a/Documentation/notation/rhythms.itely +++ b/Documentation/notation/rhythms.itely @@ -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 index d16f42cfc6..0000000000 --- a/Documentation/snippets/accidental-tie-overridden.ly +++ /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 index 0000000000..7d4e7dd538 --- /dev/null +++ b/Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly @@ -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 | +} diff --git a/Documentation/snippets/contexts-and-engravers.snippet-list b/Documentation/snippets/contexts-and-engravers.snippet-list index 14f4245313..4d435cd502 100644 --- a/Documentation/snippets/contexts-and-engravers.snippet-list +++ b/Documentation/snippets/contexts-and-engravers.snippet-list @@ -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 index 0000000000..ae677a0515 --- /dev/null +++ b/Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly @@ -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 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 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-group #:accessor ambitus-group) + (ambitus-line #:accessor ambitus-line) + (ambitus-up-note #:getter ambitus-up-note + #:init-form (make )) + (ambitus-down-note #:getter ambitus-down-note + #:init-form (make )) + (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 ) 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 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 () + (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 ))) + ;; 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 ) 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 ) 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) 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 index 7d4e7dd538..0000000000 --- a/Documentation/snippets/dot-count-override.ly +++ /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 | -} diff --git a/Documentation/snippets/expressive-marks.snippet-list b/Documentation/snippets/expressive-marks.snippet-list index 0add2c3e35..cebfd7777b 100644 --- a/Documentation/snippets/expressive-marks.snippet-list +++ b/Documentation/snippets/expressive-marks.snippet-list @@ -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 index 0000000000..ab7ddfd59b --- /dev/null +++ b/Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly @@ -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 index f510df4570..0000000000 --- a/Documentation/snippets/new/accidental-tie-overridden.ly +++ /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 index 0000000000..8e183fd986 --- /dev/null +++ b/Documentation/snippets/new/changing-the-number-of-augmentation-dots-per-note.ly @@ -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 index 0000000000..be832c901e --- /dev/null +++ b/Documentation/snippets/new/defining-an-engraver-in-scheme-ambitus-engraver.ly @@ -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 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 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-group #:accessor ambitus-group) + (ambitus-line #:accessor ambitus-line) + (ambitus-up-note #:getter ambitus-up-note + #:init-form (make )) + (ambitus-down-note #:getter ambitus-down-note + #:init-form (make )) + (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 ) 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 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 () + (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 ))) + ;; 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 ) 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 ) 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) 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 index 8e183fd986..0000000000 --- a/Documentation/snippets/new/dot-count-override.ly +++ /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 index 0000000000..2d353006ef --- /dev/null +++ b/Documentation/snippets/new/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly @@ -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 index be832c901e..0000000000 --- a/Documentation/snippets/new/scheme-engraver-ambitus.ly +++ /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 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 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-group #:accessor ambitus-group) - (ambitus-line #:accessor ambitus-line) - (ambitus-up-note #:getter ambitus-up-note - #:init-form (make )) - (ambitus-down-note #:getter ambitus-down-note - #:init-form (make )) - (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 ) 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 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 () - (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 ))) - ;; 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 ) 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 ) 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) 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/vocal-ensemble-template-with-verse-and-refrain.ly b/Documentation/snippets/new/vocal-ensemble-template-with-verse-and-refrain.ly index 82f01ee581..2f458f2cfd 100644 --- a/Documentation/snippets/new/vocal-ensemble-template-with-verse-and-refrain.ly +++ b/Documentation/snippets/new/vocal-ensemble-template-with-verse-and-refrain.ly @@ -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 = { diff --git a/Documentation/snippets/pitches.snippet-list b/Documentation/snippets/pitches.snippet-list index 0bc43dffad..9e0bb55025 100644 --- a/Documentation/snippets/pitches.snippet-list +++ b/Documentation/snippets/pitches.snippet-list @@ -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 diff --git a/Documentation/snippets/rhythms.snippet-list b/Documentation/snippets/rhythms.snippet-list index a194c129f5..0f9e943738 100644 --- a/Documentation/snippets/rhythms.snippet-list +++ b/Documentation/snippets/rhythms.snippet-list @@ -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 index ae677a0515..0000000000 --- a/Documentation/snippets/scheme-engraver-ambitus.ly +++ /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 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 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-group #:accessor ambitus-group) - (ambitus-line #:accessor ambitus-line) - (ambitus-up-note #:getter ambitus-up-note - #:init-form (make )) - (ambitus-down-note #:getter ambitus-down-note - #:init-form (make )) - (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 ) 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 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 () - (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 ))) - ;; 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 ) 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 ) 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) 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/vocal-ensemble-template-with-verse-and-refrain.ly b/Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly index 97e700e114..6110610be0 100644 --- a/Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly +++ b/Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly @@ -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