year = 1993,
volume = 17,
number = 3,
- url = {http://citeseer.nj.nec.com/52890.html},
+ url = {http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.44.6067},
note = {This article points to some problems and solutions with music
representation. HWN},
journal= {Electronic Publishing},
volume={6},
number={4}, pages = {507--518},
- url={http://citeseer.nj.nec.com/512957.html},
+ url={http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.1480},
}
author = {Michael Droettboom},
title = {Study of music Notation Description Languages},
year = 2000,
- url= {http://gigue.peabody.jhu.edu/~mdboom/format.pdf},
+ url= {http://www.music.mcgill.ca/~ich/research/omr/levy/format.pdf},
note ={GUIDO and lilypond compared. LilyPond wins on practical
issues as usability and availability of tools, GUIDO wins on
@cindex Schnipsel
@cindex LSR
@item
-Die
-@ifhtml
-@uref{source/input/lsr/collated-files.html,Schnipsel}
-@end ifhtml
-@ifnothtml
-Schnipsel
-@end ifnothtml
-sind eine ausführliche Sammlung kurzer Beispiele, anhand derer Tricks,
+Die @rlsrnamed{Top,Schnipsel} sind eine ausführliche Sammlung kurzer Beispiele, anhand derer Tricks,
Tipps und Spezialfunktionen von LilyPond demonstriert werden. Die meisten
dieser Schnipsel können auch im
@uref{http://lsr.dsi.unimi.it/,LilyPond Schnipsel
@rlsr{Chords}.
Referencia de funcionamiento interno:
-@rinternals{NewBassFigure},
+@rinternals{BassFigure},
@rinternals{BassFigureAlignment},
@rinternals{BassFigureLine},
@rinternals{BassFigureBracket},
@rlsr{Figured Bass}.
Referencia de funcionamiento interno:
-@rinternals{NewBassFigure},
+@rinternals{BassFigure},
@rinternals{BassFigureAlignment},
@rinternals{BassFigureLine},
@rinternals{BassFigureBracket},
@cindex LSR
@c FIXME: check on kainhofer.
-@ref{Top,LilyPond Snippet List,,lilypond-snippets}:
+@rlsrnamed{Top,LilyPond Snippet List}:
presenta un conjunto seleccionado de pfragmentos de código de LilyPond
procedentes del @uref{http://lsr@/.dsi@/.unimi@/.it,Repositorio de
Fragmentos de Código} (LSR). Se encuentra en el dominio público.
@menu
-* How LilyPond files work::
+* How LilyPond input files work::
* Voices contain music::
* Contexts and engravers::
* Extending the templates::
@end menu
-@node How LilyPond files work
-@section How LilyPond files work
+@node How LilyPond input files work
+@section How LilyPond input files work
La mise en forme des fichiers d'entrée de LilyPond est vraiment
peu astreignante, afin d'offrir assez de souplesse aux utilisateurs
@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
@c This file is part of lilypond-kearning.tely
@ignore
- Translation of GIT committish: c272bbe8cd02f6a2887a7e2e8ca39ce86546307f
+ Translation of GIT committish: 1e3ef555477a299a695c35ccc0aaabe855bdd541
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
@c leave these lines wrapping around. It's some texinfo 4.12 thing. -gp
@c This is actually a limitation of texi2html. -jm
@menu
-* About the Learning Manual:: introduction à LilyPond, ce manuel explique aux débutants la création de partitions.
-* About the Music Glossary:: ce document explique de nombreux termes musicaux et en donne la traduction dans d'autres langues.
+* About the Learning Manual:: introduction à LilyPond, ce manuel explique aux débutants la création de partitions.
+* About the Music Glossary:: ce document explique de nombreux termes musicaux et en donne la traduction dans d'autres langues.
* About the Notation Reference:: ce manuel représente la partie la plus volumineuse de la documentation. Il fournit tous les détails sur la création de notation musicale. La lecture de cet ouvrage requiert une bonne compréhension des concepts exposés dans le manuel d'initiation.
-* About the Application Usage:: ce manuel aborde l'exécution des programmes LilyPond et les particularités dépendant du système d'exploitation.
-* About the Snippet List:: ce document rassemble une collection d'extraits de code LilyPond.
-* About the Internals Reference:: ce manuel constitue une source d'information sur le fonctionnement interne de LilyPond. C'est une référence complète pour l'élaboration de retouches.
-* Other documentation:: d'autres sources de documentation sont disponibles, telles que les notes de nouveautés et les archives des listes de diffusion.
-
+* About the Application Usage:: ce manuel aborde l'exécution des programmes LilyPond et les particularités dépendant du système d'exploitation.
+* About the Snippet List:: ce document rassemble une collection d'extraits de code LilyPond.
+* About the Internals Reference:: ce manuel constitue une source d'information sur le fonctionnement interne de LilyPond. C'est une référence complète pour l'élaboration de retouches.
+* Other documentation:: d'autres sources de documentation sont disponibles, telles que les notes de nouveautés et les archives des listes de diffusion.
@end menu
@node About the Learning Manual
@unnumberedsubsec About the Learning Manual
-Ce volume explique comment débuter avec LilyPond, et expose de manière
+Ce manuel explique comment débuter avec LilyPond, et expose de manière
simple quelques concepts clés. Il est conseillé de lire ces chapitres
de manière linéaire.
+Dans ce manuel se trouve à chaque section un paragraphe @strong{Voir
+aussi} contenant des références vers d'autres sections : il est
+conseillé de ne pas les suivre en première lecture ; lorsque vous
+aurez lu l'ensemble du manuel d'initiation, vous pourrez en relisant
+certaines sections suivre ces références pour approfondir certains
+aspects.
+
@itemize
@item
@cindex langue
@cindex langage
-@ref{Top,Music Glossary,,music-glossary,Glossaire musical} :
-explication des termes musicaux et traduction dans diverses langues.
+@rglosnamed{Top,Glossaire musical} : ce document explique en anglais
+des termes musicaux, et donne leur traduction dans diverses langues.
Si vous n'êtes pas familier avec la notation et la terminologie
musicales, il est conseillé de consulter le glossaire, notamment pour
les parties non encore traduites de la documentation.
@node About the Notation Reference
@unnumberedsubsec About the Notation Reference
-Ce volume détaille toutes les commandes LilyPond produisant une notation
+Ce manuel détaille toutes les commandes LilyPond produisant une notation
musicale. La lecture de cet ouvrage requiert une bonne compréhension des
concepts exposés dans le manuel d'initiation.
@cindex snippets
@cindex LSR
-@ref{Top,LilyPond Snippet List,,lilypond-snippets,Exemples de code} :
+@rlsrnamed{Top,Exemples de code} :
il s'agit d'une sélection de petits exemples montrant des trucs,
astuces et fonctionnalités particulières de LilyPond, issus de
@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}
@cindex étendre lilypond
@cindex index
-@ref{Top,Internals Reference,,lilypond-internals,Référence des
-propriétés internes} : c'est un ensemble de pages HTML étroitement
-liées entre elles, qui documente les moindres petits détails de chaque
-classe, objet et fonction de LilyPond. Cette documentation est
-produite directement à partir des définitions de formatage utilisées.
+@rinternalsnamed{Top,Référence des propriétés internes} : c'est un
+ensemble de pages HTML étroitement liées entre elles, qui documente
+les moindres petits détails de chaque classe, objet et fonction de
+LilyPond. Cette documentation est produite directement à partir des
+définitions de formatage utilisées.
Presque toutes les fonctions de formatage utilisées en interne sont
directement disponibles pour l'utilisateur. Par exemple, toutes les
@itemize
-@item Nouveautés : ce document résume les changements importants et
-les nouvelles fonctionalités de LilyPond depuis la dernière version
-stable.
+@item
+@ifhtml
+@ifset bigpage
+@uref{../topdocs/NEWS.html,Nouveautés} :
+@end ifset
+@ifclear bigpage
+@uref{../../topdocs/NEWS.html,Nouveautés} :
+@end ifclear
+@end ifhtml
+@ifnothtml
+Nouveautés :
+@end ifnothtml
+ce document résume les changements importants et les nouvelles
+fonctionalités de LilyPond depuis la dernière version stable.
@item @uref{http://lists.gnu.org/archive/html/lilypond-user/, Les
archives de la liste lilypond-user} : c'est un dépôt archivant les
pour produire l'image est accessible par un clic sur l'image.
@item L'emplacement des fichiers de documentation mentionnés ici peut varier
-d'un système à l'autre. De temps en temps, ce manuel fait référence aux
-fichiers d'exemple et d'initialisation. Tout au long de ce manuel, nous
-donnons les emplacements des fichiers d'entrée relativement au
-répértoire racine de l'archive source. Par exemple,
+d'un système à l'autre. De temps en temps, ce manuel fait référence
+aux fichiers d'exemple et d'initialisation. Tout au long de ce
+manuel, nous donnons les emplacements des fichiers d'entrée
+relativement au répértoire racine de l'archive source. Par exemple,
@file{input/@/test/@/bla@/.ly} peut référer au fichier
@file{lilypond@/2.x.y/@/input/@/test/@/bla@/.ly}. Dans les paquets
-binaires pour les plateformes Unix, la documentation et les exemples se
-trouvent généralement sous @file{/usr/@/share/@/doc/@/lilypond/}. Les
-fichiers d'initialisation, par exemple @file{scm/@/lily@/.scm}, ou
+binaires pour les plateformes Unix, la documentation et les exemples
+se trouvent généralement sous @file{/usr/@/share/@/doc/@/lilypond/}.
+Les fichiers d'initialisation, par exemple @file{scm/@/lily@/.scm}, ou
@file{ly/@/engraver@/-init@/.ly}, se trouvent généralement dans le
-répértoire @file{/usr/@/share/@/lilypond/}.
+répertoire @file{/usr/@/share/@/lilypond/}. @c pas encore en français -jm.
+@c Pour plus de détails, consultez @ref{Other sources of information}.
@end itemize
@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
@c This file is part of lilypond.tely
@ignore
- Translation of GIT committish: 0b3b41414fa52672d7d9416c265cd8d0568eef13
+ Translation of GIT committish: d7a9cbdc480e5b327ec53f287f22995e7a9c1a0f
When revising a translation, copy the HEAD committish of the
version that you are working on. See TRANSLATION for details.
@menu
* Compiling a file::
* Simple notation::
-* Working on text files::
+* Working on input files::
* How to read the manual::
@end menu
@ruser{Time signature}, @ruser{Clef}.
-@node Working on text files
-@subsection Working on text files
+@node Working on input files
+@subsection Working on input files
Le traitement des fichiers source de LilyPond est semblable à celui du
code de nombreux langages de programmation. La casse est prise
@node How to read the manual
@subsection How to read the manual
-Comme nous l'avons vu dans @ref{Working on text files}, un code
+Comme nous l'avons vu dans @ref{Working on input files}, un code
LilyPond doit être encadré par des accolades @{ @} ou bien par
@code{\relative c'' @{ ... @}}. Cependant, dans la suite de ce
manuel, la plupart des exemples ne feront pas apparaître ces signes.
chapitres 3 à 5, et y revenir plus tard après avoir acquis de
l'expérience.
+Dans ce tutoriel comme dans le reste de ce manuel, se trouve à chaque
+section un paragraphe @strong{Voir aussi} contenant des références
+vers d'autres sections : il est conseillé de ne pas les suivre en
+première lecture ; lorsque vous aurez lu l'ensemble du manuel
+d'initiation, vous pourrez en relisant certaines sections suivre ces
+références pour approfondir certains aspects.
+
Si vous ne l'avez pas encore fait, lisez @ref{About the
documentation}. Les sources de documentation et d'information sur
LilyPond sont vastes, il est normal pour un débutant de ne pas savoir
Type42 code.
@item @email{david.feuer@@gmail.com, David Feuer},
PS output code refactoring.
-@item @email{bernard@@fong-hurley.org.uk, Bernard Hurley},
- X11 color.
+@item Bernard Hurley, X11 color.
@item @email{chris@@fluffhouse.org.uk, Chris Jackson},
Piano pedals, directed arpeggios.
@item @email{heikki.junes@@hut.fi, Heikki Junes},
Fine tuning for quarter tones in midi output.
@item @email{reinhold@@kainhofer.com, Reinhold Kainhofer},
@uref{http://reinhold.kainhofer.com},
- Musicxml2ly development
+ Musicxml2ly development, various features and fixes.
@item @email{m.krause@@tu-harburg.de, Michael Krause},
Breathing signs.
@item @email{jiba@@tuxfamily.org, Jean-Baptiste Lamy},
Tablature support.
@item @email{wl@@gnu.org, Werner Lemberg},
@TeX{} glue code.
-@item @email{joe@@neeman.com, Joe Neeman},
+@item @email{joeneeman@@gmail.com, Joe Neeman},
Constrained line breaking.
@item @email{hanwen@@xs4all.nl, Han-Wen Nienhuys},
@uref{http://www.xs4all.nl/~hanwen/},
@item @email{janneke@@gnu.org, Jan Nieuwenhuizen},
@uref{http://www.xs4all.nl/~jantien/},
Main author.
-@item @uref{http://www.ipd.uka.de/~reuter, Jürgen Reuter},
+@item @uref{http://www.juergen-reuter.de/, Jürgen Reuter},
Ancient notation support (mensural notation,
Gregorian chant notation), ambitus, clusters.
@item @email{nicolas.sceaux@@free.fr, Nicolas Sceaux},
@itemize @bullet
-@item @uref{http://www.ipd.uka.de/~reuter, Jürgen Reuter},
+@item @uref{http://www.juergen-reuter.de/, Jürgen Reuter},
Ancient notation font
@item Werner Lemberg,
Exact Type1 font outlines for feta, feta-alphabet.
\new FiguredBass \figuremode { < 6\\ 5\\ > < 6/ > }
@end lilypond
+@item Harp pedalling diagrams were added:
+
+@lilypond
+\markup \harp-pedal #"^v-|vv-o^"
+@end lilypond
+
@end itemize
@node LilyPond command index
@appendix LilyPond command index
-This index does blah blah blah.
+This index lists all the LilyPond commands and keywords with links
+to those sections of the manual which describe or discuss their
+use. Each link is in two parts. The first part points to the
+exact location in the manual where the command or keyword appears;
+the second part points to the start of the section of the manual
+in which the command or keyword appears.
@printindex ky
@node LilyPond index
@appendix LilyPond index
-In contrast, this index does blaz blaz blaz.
+In addition to all the LilyPond commands and keywords, this index
+lists musical terms and words which relate to each of them, with
+links to those sections of the manual which describe or discuss
+that topic. Each link is in two parts. The first part points to
+the exact location in the manual where the topic appears; the
+second part points to the start of the section of the manual where
+that topic is discussed.
@printindex cp
@seealso
-Snippets:
-@rlsr{Staff notation}.
-
Notation Reference:
@ref{Grouping staves},
@ref{Instrument names}.
+Snippets:
+@rlsr{Staff notation}.
+
Internals Reference:
@rinternals{InnerStaffGroup},
@rinternals{StaffGroup},
Notation Reference:
@ref{Displaying pitches}.
+Snippets:
+@rlsr{Staff notation}.
+
Internals Reference:
@rinternals{StaffSymbol},
@rinternals{staff-symbol-interface}.
@cindex staff, resizing of
@cindex resizing of staves
-Tweaking the staff object allows to resize the staff:
+@notation{Ossia} staves can be set by creating a new simultaneous
+staff in the appropriate location:
@lilypond[verbatim,quote]
-\new Staff \with {
- fontSize = #-3
- \override StaffSymbol #'staff-space = #(magstep -3)
- \override StaffSymbol #'thickness = #(magstep -3)
-}
-\relative c {
- \clef bass
- c8 c c c c c c c
+\new Staff \relative c'' {
+ c4 b d c
+ <<
+ { c4 b d c }
+ \new Staff { e4 d f e }
+ >>
+ c4 b c2
}
@end lilypond
-This involves shrinking the staff spaces, the staff lines and the
-font size by the factor 3. You find a more precise explanation in
-@ref{Setting the staff size}.
+However, the above example is usually not the desired result. To
+create ossia staves that are above the original staff, have no
+time signature or clef, and have a smaller font size, tweaks must
+be used. The Learning Manual describes a specific technique to
+achieve this goal, beginning with
+@rlearning{Nesting music expressions}.
-The @emph{ossia} section in the next example are just put parallel
-to the main staff with @code{<<} and @code{>>} brackets. The
-@emph{ossia} staff is stopped and started explicitely and white
-space is inserted with the @code{\skip} command.
+The following example uses the @code{alignAboveContext} property
+to align the ossia staff. This method is most appropriate when
+only a few ossia staves are needed.
@lilypond[verbatim,quote]
+\new Staff = main \relative c'' {
+ c4 b d c
+ <<
+ { c4 b d c }
+
+ \new Staff \with {
+ \remove "Time_signature_engraver"
+ alignAboveContext = #"main"
+ fontSize = #-3
+ \override StaffSymbol #'staff-space = #(magstep -3)
+ \override StaffSymbol #'thickness = #(magstep -3)
+ firstClef = ##f
+ }
+ { e4 d f e }
+ >>
+ c4 b c2
+}
+@end lilypond
+
+If many isolated ossia staves are needed, creating an empty
+@code{Staff} context with a specific @emph{context id} may be more
+appropriate; the ossia staves may then be created by
+@emph{calling} this context and using @code{\startStaff} and
+@code{\stopStaff} at the desired locations. The benefits of this
+method are more apparent if the piece is longer than the following
+example.
+
+@lilypond[verbatim,quote,ragged-right]
+<<
+ \new Staff = ossia \with {
+ \remove "Time_signature_engraver"
+ \remove "Clef_engraver"
+ fontSize = #-3
+ \override StaffSymbol #'staff-space = #(magstep -3)
+ \override StaffSymbol #'thickness = #(magstep -3)
+ }
+ { \stopStaff s1*6 }
+
+ \new Staff \relative c' {
+ c4 b c2
+ <<
+ { e4 f e2 }
+ \context Staff = ossia {
+ \startStaff e4 g8 f e2 \stopStaff
+ }
+ >>
+ g4 a g2 \break
+ c4 b c2
+ <<
+ { g4 a g2 }
+ \context Staff = ossia {
+ \startStaff g4 e8 f g2 \stopStaff
+ }
+ >>
+ e4 d c2
+ }
+>>
+@end lilypond
+
+@c The following is the legacy "ossia.ly" example
+@c
+@c I don't think this method is very efficient.
+@c I'm commenting it out for now. -pm
+
+@ignore
+
+@ lilypond[verbatim,quote]
<<
\new Staff \with
{
c4 c g' g a a g2
}
>>
+@ end lilypond
+
+@end ignore
+
+Using the @code{\RemoveEmptyStaffContext} command to create ossia
+staves may be used as an alternative. This method is most
+convenient when ossia staves occur immediately following a line
+break. In this case, spacer rests do not need to be used at all;
+only @code{\startStaff} and @code{\stopStaff} are necessary. For
+more information about @code{\RemoveEmptyStaffContext}, see
+@ref{Hiding staves}.
+
+@lilypond[verbatim,quote,ragged-right]
+<<
+ \new Staff = ossia \with {
+ \remove "Time_signature_engraver"
+ \remove "Clef_engraver"
+ fontSize = #-3
+ \override StaffSymbol #'staff-space = #(magstep -3)
+ \override StaffSymbol #'thickness = #(magstep -3)
+ }
+ \new Staff \relative c' {
+ c4 b c2
+ e4 f e2
+ g4 a g2 \break
+ <<
+ { c4 b c2 }
+ \context Staff = ossia {
+ c4 e8 d c2 \stopStaff
+ }
+ >>
+ g4 a g2
+ e4 d c2
+ }
+>>
+
+\layout {
+ \context {
+ \RemoveEmptyStaffContext
+ \override VerticalAxisGroup #'remove-first = ##t
+ }
+}
@end lilypond
@cindex Frenched staves
In orchestral scores, staff lines that only have rests are usually
-removed; this saves some space. This style is called @q{French
-Score}. For the @code{Lyrics}, @code{ChordNames}, and
-@code{FiguredBass} contexts, this is switched on by default. When
-the lines of these contexts turn out empty after the line-breaking
-process, they are removed.
+removed in order to save some space. This style is called
+@q{French Score}. For the @code{Lyrics}, @code{ChordNames}, and
+@code{FiguredBass} contexts, this is switched on by default.
-For normal staves this behaviour is called with the
+For other staff contexts, this behavior is set with the
@code{\RemoveEmptyStaffContext} command. It is set in the
-@code{\layout} block. As a result staves containing nothing or
-whole mesure rests are removed after a line break.
+@code{\layout} block. As a result, empty staves or staves
+containing multi-measure rests are removed after a line break.
-@lilypond[verbatim,quote]
+@lilypond[verbatim,quote,ragged-right]
\layout {
\context {
\RemoveEmptyStaffContext
@cindex ossia
-@c FIXME Really? I need to see about this. -pm
-
-Another application of the @code{\RemoveEmptyStaffContext} is to
-make ossia sections, i.e., alternative melodies on a separate
-piece of staff, with help of a Frenched staff. See
+Another application of @code{\RemoveEmptyStaffContext} is to make
+ossia sections, i.e., alternative melodies on a separate piece of
+staff, with help of a Frenched staff. For details, see
@ref{Ossia staves}.
-@c FIXME Is this in the right section?
-@c maybe move to Staff symbol -pm
-
-You can make the staff lines invisible by removing the
-@code{Staff_symbol_engraver} from the @code{Staff} context.
+Staff lines can be made invisible by removing the
+@code{Staff_symbol_engraver} from the @code{Staff} context:
@lilypond[verbatim,quote]
-\score {
- \new Staff \relative c'' { c8 c c16 c c c }
- \layout{
- \context {
- \Staff
- \remove Staff_symbol_engraver
- }
- }
+\new Staff \with {
+ \remove "Staff_symbol_engraver"
}
+\relative c'' { c8 c c16 c c c c2 }
@end lilypond
@snippets
-The first empty staff can also be removed from the score with a
-setting in the @code{VerticalAxisGroup} property. This can be
-done globally inside the @code{\layout} block, or locally inside
-the specific staff that should be removed. In the latter case, you
-have to specify the context (@code{Staff} applies only to the
-current staff) in front of the property.
-
-The lower staff of the second staff group is not removed, because
-the setting applies only to the specific staff inside of which it
-is written.
-
-@lilypond[verbatim,quote]
-\layout {
- \context {
- \RemoveEmptyStaffContext
- %To use the setting globally, uncomment the following line:
- %\override VerticalAxisGroup #'remove-first = ##t
- }
-}
-\new StaffGroup
- \relative c'' <<
- \new Staff {
- e4 f g a \break c1 }
- \new Staff {
- %To use the setting globally, comment this line, uncomment the line above
- \override Staff.VerticalAxisGroup #'remove-first = ##t
- R1 \break R1 }
- >>
-\new StaffGroup
- <<
- \new Staff { e4 f g a \break c1 }
- \new Staff { R \break R1 }
- >>
-@end lilypond
-
@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
{removing-the-first-empty-line.ly}
@node Writing parts
@subsection Writing parts
+This section explains how to insert tempo indications and
+instrument names into a score. Methods to quote other voices and
+format cue notes are also described.
+
@menu
* Metronome marks::
* Instrument names::
@cindex tempo
@cindex beats per minute
@cindex metronome marking
+@cindex metronome marking with text
+@funindex \tempo
-Metronome settings can be entered as follows
+Basic metronome markings can be entered as follows:
-@example
-\tempo @var{duration} = @var{per-minute}
-@end example
+@lilypond[verbatim,quote,relative=2]
+\tempo 2 = 120
+c1
+@end lilypond
-In the MIDI output, they are interpreted as a tempo change. In
-the layout output, a metronome marking is printed
+Textual tempo indications can be used instead:
-@funindex \tempo
+@lilypond[verbatim,quote,relative=2]
+\tempo "Allegretto"
+d2 c
+@end lilypond
+
+The combination of a metronome marking and textual description
+will automatically place the metronome marking within parentheses:
@lilypond[verbatim,quote,relative=2]
-\tempo 8. = 120
-c1
+\tempo "Allegro" 4 = 160
+g4 c d e
+@end lilypond
+
+To write a metronome marking in parentheses without the text,
+include an empty string in the input:
+
+@lilypond[verbatim,quote,relative=2]
+\tempo "" 8 = 96
+d4 g e c
@end lilypond
@snippets
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{printing-metronome-and-rehearsal-marks-below-the-staff.ly}
+
+@c perhaps also an example of how to move it horizontally?
+
+@c TODO add snippet to LSR -pm
To change the tempo in the MIDI output without printing anything,
-make the metronome marking invisible @example \once \override
-Score.MetronomeMark #'transparent = ##t @end example
+make the metronome marking invisible
+
+@example
+\once \override Score.MetronomeMark #'transparent = ##t
+@end example
+@c TODO add snippet to LSR -pm
To print other metronome markings, use these markup commands
+
@lilypond[verbatim,quote,relative=1]
c4^\markup {
(
@rinternals{MetronomeMark}.
-@knownissues
-
-Collisions are not checked. If you have notes above the top line
-of the staff (or notes with articulations, slurs, text, etc), then
-the metronome marking may be printed on top of musical symbols.
-If this occurs, increase the padding of the metronome mark to
-place it further away from the staff.
-
-@example
-\override Score.MetronomeMark #'padding = #2.5
-@end example
-
-@c perhaps also an example of how to move it horizontally?
-
-
@node Instrument names
@unnumberedsubsubsec Instrument names
@cindex instrument names
@cindex instrument names, short
-In an orchestral score, instrument names are printed at the left
-side of the staves.
-
-This can be achieved by setting @code{Staff}.@code{instrumentName}
-and @code{Staff}.@code{shortInstrumentName}, or
-@code{PianoStaff}.@code{instrumentName} and
-@code{PianoStaff}.@code{shortInstrumentName}. This will print
-text before the start of the staff. For the first staff,
-@code{instrumentName} is used. If set, @code{shortInstrumentName}
-is used for the following staves.
+Instrument names can be printed on the left side of staves for the
+@code{Staff} and @code{PianoStaff} contexts. The value of
+@code{instrumentName} is used for the first staff, and the value
+of @code{shortInstrumentName} is used for all succeeding staves.
-@lilypond[verbatim,quote,relative=1]
-\set Staff.instrumentName = "Ploink "
-\set Staff.shortInstrumentName = "Plk "
+@lilypond[verbatim,quote,ragged-right,relative=1]
+\set Staff.instrumentName = "Violin "
+\set Staff.shortInstrumentName = "Vln "
c1
\break
c''1
@cindex instrument names, centering
-As instrument names are centered by default, multi line names are
-better entered using @code{\center-align}:
+When two or more staff contexts are grouped together, the
+instrument names and short instrument names are centered by
+default. To center multi-line instrument names,
+@code{\center-align} must be used:
@lilypond[verbatim,quote,relative=2]
<<
>>
@end lilypond
-For longer instrument names, it may be useful to increase the
-@code{indent} setting in the @code{\layout} block.
+@cindex indent
+@cindex short-indent
-Short instrument names, printed before the systems following the
-first one, are also centered by default, in a space which width is
-given by the @code{short-indent} variable of the @code{\layout}
-block.
+The @code{indent} and @code{short-indent} settings specify the
+level of indentation for the first system and all succeeding
+systems, respectively. They can be modified in the @code{\layout}
+block. For longer instrument names or short instrument names, it
+may be useful to increase the @code{indent} and
+@code{short-indent} settings:
-To add instrument names to other contexts (such as
-@code{GrandStaff}, @code{ChoirStaff}, or @code{StaffGroup}), the
-engraver must be added to that context.
+@lilypond[verbatim,quote]
+\relative c' <<
+ \new Staff \with {
+ instrumentName = "Oboe"
+ }
+ { c2 d }
+ \new Staff \with {
+ instrumentName = "Glockenspiel"
+ }
+ { c'2 d }
+>>
-@example
-\layout@{
- \context @{\GrandStaff \consists "Instrument_name_engraver"@}
-@}
-@end example
+\layout {
+ indent = 2.5\cm
+}
+@end lilypond
-@noindent
-More information about adding and removing engravers can be found
-in @ref{Modifying context plug-ins}.
+To add instrument names to other contexts (such as
+@code{GrandStaff}, @code{ChoirStaff}, or @code{StaffGroup}),
+@code{Instrument_name_engraver} must be added to that context.
+For details, see @ref{Modifying context plug-ins}.
@cindex instrument names, changing
Instrument names may be changed in the middle of a piece:
-@lilypond[verbatim,quote,relative=1]
+@lilypond[verbatim,quote,ragged-right,relative=1]
\set Staff.instrumentName = "First"
\set Staff.shortInstrumentName = "one"
c1 c c c \break
@end lilypond
+@snippets
+
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{aligning-and-centering-instrument-names.ly}
+
+
@seealso
Notation Reference:
@cindex fragments
@cindex cue notes
-With quotations, fragments of other parts can be inserted into a
-part directly. Before a part can be quoted, it must be marked
-especially as quotable. This is done with the @code{\addQuote}
-command.
-
-@example
-\addQuote @var{name} @var{music}
-@end example
-
-@noindent
-Here, @var{name} is an identifying string. The @var{music} is any
-kind of music. Here is an example of @code{\addQuote}
+Quotations allow fragments of other parts to be inserted directly
+into a music expression. Before a part can be quoted, the
+@code{\addQuote} command must be used to initialize the quoted
+fragment. This command must be used in the toplevel scope. The
+first argument is an identifying string, and the second is a music
+expression:
@example
-\addQuote clarinet \relative c' @{
+flute = \relative c' @{
f4 fis g gis
@}
+\addQuote "flute" @{ \flute @}
@end example
-This command must be entered at toplevel, i.e., outside any music
-blocks. Typically, one would use an already defined music event
-as the @var{music}:
+The @code{\quoteDuring} command may then be used to indicate when
+the quotation should take place. The corresponding measures from
+the quotation are inserted into the music expression. The syntax
+is similar to @code{\addQuote}:
-@example
-clarinet = \relative c' @{
+@lilypond[verbatim,quote]
+flute = \relative c' {
f4 fis g gis
-@}
-\addQuote clarinet @{ \clarinet @}
-@end example
-
-After calling @code{\addQuote}, the quotation may then be done
-with @code{\quoteDuring} or @code{\cueDuring},
-
-@example
-\quoteDuring #@var{name} @var{music}
-@end example
-
-During a part, a piece of music can be quoted with the
-@code{\quoteDuring} command.
+}
+\addQuote "flute" { \flute }
-@example
-\quoteDuring #"clarinet" @{ s2. @}
-@end example
+\relative c' {
+ c4 cis \quoteDuring #"flute" { s2 }
+}
+@end lilypond
-This would cite three quarter notes (the duration of @code{s2.})
-of the previously added @code{clarinet} voice.
+If the music expression used for @code{\quoteDuring} contains
+anything but a spacer rest or multi-measure rest, a polyphonic
+situation is created, which is often not desirable:
-More precisely, it takes the current time-step of the part being
-printed, and extracts the notes at the corresponding point of the
-@code{\addQuote}d voice. Therefore, the argument to
-@code{\addQuote} should be the entire part of the voice to be
-quoted, including any rests at the beginning.
+@lilypond[verbatim,quote]
+flute = \relative c' {
+ f4 fis g gis
+}
+\addQuote "flute" { \flute }
-It is possible to use another music expression instead of
-@code{s}, thus creating a polyphonic section, but this may not
-always give the desired result.
+\relative c' {
+ c4 cis \quoteDuring #"flute" { c4 b }
+}
+@end lilypond
-Quotations take into account the transposition of both source and
-target instruments, if they are specified using the
-@code{\transposition} command.
+Quotations recognize instrument transposition settings for both
+the source and target instruments if they are specified using the
+@code{\transposition} command:
-@lilypond[verbatim,quote,relative=1]
-\addQuote clarinet
-{
+@lilypond[verbatim,quote]
+clarinet = \relative c' {
\transposition bes
f4 fis g gis
}
+\addQuote "clarinet" { \clarinet }
-{
- e8 f8 \quoteDuring #"clarinet" { s2 }
+\relative c' {
+ c4 cis \quoteDuring #"clarinet" { s2 }
}
@end lilypond
-The type of events that are present in the quoted music can be
-trimmed with the @code{quotedEventTypes} property. The default
-value is @code{(note-event rest-event)}, which means that only
-notes and rests of the quoted voice end up in the
-@code{\quoteDuring}. Setting
+@c add to snippets, possibly. It might already be there. -pm
+@c
+@c The type of events that are present in the quoted music can be
+@c trimmed with the @code{quotedEventTypes} property. The default
+@c value is @code{(note-event rest-event)}, which means that only
+@c notes and rests of the quoted voice end up in the
+@c @code{\quoteDuring}. Setting
+@c
+@c @example
+@c \set Staff.quotedEventTypes =
+@c #'(note-event articulation-event dynamic-event)
+@c @end example
+@c
+@c @noindent
+@c will quote notes (but no rests), together with scripts and
+@c dynamics.
-@example
-\set Staff.quotedEventTypes =
- #'(note-event articulation-event dynamic-event)
-@end example
-@noindent
-will quote notes (but no rests), together with scripts and
-dynamics.
+@snippets
+
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{quoting-another-voice-with-transposition.ly}
+
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{quoting-another-voice.ly}
@seealso
Only the contents of the first @code{Voice} occurring in an
@code{\addQuote} command will be considered for quotation, so
-@var{music} can not contain @code{\new} and @code{\context Voice}
+@var{music} cannot contain @code{\new} and @code{\context Voice}
statements that would switch to a different Voice.
Quoting grace notes is broken and can even cause LilyPond to
@cindex quoting other voices
@cindex cues, formatting
-The previous section deals with inserting notes from another
-voice. There is a more advanced music function called
-@code{\cueDuring}, which makes formatting cue notes easier.
-
-The syntax is
+The previous section explains how to quote other voices. The
+@code{\cueDuring} command is a more specialized form of
+@code{\quoteDuring}, being particularly useful for inserting cue
+notes into a part. The syntax is as follows:
@example
- \cueDuring #@var{name} #@var{updown} @var{music}
+ \cueDuring #@var{partname} #@var{voice} @var{music}
@end example
-This will insert notes from the part @var{name} into a
-@code{Voice} called @code{cue}. This happens simultaneously with
-@var{music}, which usually is a rest. When the cue notes start,
-the staff in effect becomes polyphonic for a moment. The argument
-@var{updown} determines whether the cue notes should be notated as
-a first or second voice.
-
-@lilypond[verbatim]
-smaller = {
- \set fontSize = #-2
- \override Stem #'length-fraction = #0.8
- \override Beam #'thickness = #0.384
- \override Beam #'length-fraction = #0.8
-}
+This command copies the corresponding measures from @var{partname}
+into a @code{CueVoice} context. The @code{CueVoice} is created
+implicitly, and occurs simultaneously with @var{music}, which
+creates a polyphonic situation. The @var{voice} argument
+determines whether the cue notes should be notated as a first or
+second voice; @code{DOWN} corresponds to the first voice, and
+@code{UP} corresponds to the second.
-\addQuote clarinet
-\relative c' {
- R1*20
- r2 r8 c' f f
+@lilypond[verbatim,quote]
+oboe = \relative c'' {
+ r2 r8 d16 f e g f a
+ g8 g16 g g2.
}
+\addQuote "oboe" { \oboe }
-\new Staff \relative c' <<
-
- % setup a context for cue notes.
- \new Voice = "cue" { \smaller \skip 1*21 }
+\new Voice \relative c'' {
+ \cueDuring #"oboe" #UP { R1 }
+ g2 c,
+}
+@end lilypond
- \set Score.skipBars = ##t
+In the above example, the @code{Voice} context had to be
+explicitly declared, or else the entire music expression would
+belong to the @code{CueVoice} context.
- \new Voice {
- R1*20
- \cueDuring #"clarinet" #UP {
- R1
- }
- g4 g2.
- }
->>
-@end lilypond
+@c TODO document \killCues
+@c TODO document instrumentCueName context property
-Here are a couple of hints for successful cue notes:
+When typesetting cue notes, some guidelines should be followed:
@itemize
@item
-Cue notes have smaller font sizes.
-
-@item
-The cued part is marked with the instrument playing the cue.
+The instrument playing the cue should be clearly marked on the
+score.
@item
-When the original part takes over again, this should be marked
-with the name of the original instrument.
+When the cue notes end, the name of the original instrument should
+be indicated.
@item
Any other changes introduced by the cued part should also be
@end itemize
-The macro @code{\transposedCueDuring} is useful to add cues to
-instruments which use a completely different octave range (for
-example, having a cue of a piccolo flute within a contra bassoon
-part).
+The @code{\transposedCueDuring} command is useful to add cues for
+instruments in a completely different register. Having piccolo
+cues within a contrabassoon part is a good example.
@lilypond[verbatim,quote]
-picc = \relative c''' {
+piccolo = \relative c''' {
\clef "treble^8"
- R1 |
- c8 c c e g2 |
- a4 g g2 |
+ R1
+ c8 c c e g2
+ a4 g g2
}
-\addQuote "picc" { \picc }
+\addQuote "piccolo" { \piccolo }
-cbsn = \relative c, {
+cbassoon = \relative c, {
\clef "bass_8"
c4 r g r
- \transposedCueDuring #"picc" #UP c,, { R1 } |
- c4 r g r |
+ \transposedCueDuring #"piccolo" #UP c,, { R1 }
+ c4 r g r
}
<<
- \new Staff = "picc" \picc
- \new Staff = "cbsn" \cbsn
+ \new Staff = "piccolo" \piccolo
+ \new Staff = "cbassoon" \cbassoon
>>
@end lilypond
Internals Reference:
@rinternals{Voice}.
+
+@knownissues
+
+Collisions are not checked between @code{Voice} and
+@code{CueVoice} contexts.
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=11
-PATCH_LEVEL=56
+PATCH_LEVEL=57
MY_PATCH_LEVEL=
--- /dev/null
+\version "2.11.57"
+
+\header {
+ texidoc = "The harp-pedal markup function does some sanity checks. All
+the diagrams here violate the standard (7 pedals with divider after third), so
+a warning is printed out, but they should still look okay."
+}
+
+\relative c'' {
+ % Sanity checks: #pedals != 7:
+ c1^\markup \harp-pedal #"^-v|--"
+ % Sanity checks: no divider, multiple dividers, divider on wrong position:
+ c1^\markup \harp-pedal #"^-v--v^"
+ c1^\markup \harp-pedal #"^|-v|--|v^"
+ c1^\markup \harp-pedal #"^-v-|-v^"
+}
--- /dev/null
+\version "2.11.57"
+
+\header {
+ texidoc = "Harp pedals can be tweaked through the size, thickness and
+harp-pedal-details properties of TextScript."
+}
+
+\relative c'' {
+ \override Voice.TextScript #'harp-pedal-details #'box-width = #1
+ \once \override Voice.TextScript #'size = #1.5
+ \once \override Voice.TextScript #'thickness = #7
+ c1^\markup \harp-pedal #"o^ovo-|vovo-o^"
+ c1^\markup \override #'(harp-pedal-details . (
+ (box-width . 0.6)
+ (box-height . 0.3)
+ (box-offset . 0.5)
+ (space-before-divider . 0.1)
+ (space-after-divider . 1.2))) {
+ \harp-pedal #"o^ovo-|vovo-o^"}
+}
--- /dev/null
+\version "2.11.57"
+
+\header {
+ texidoc = "Basic harp diagram functionality, including circled pedal boxes.
+The third diagram uses an empty string, the third contains invalid characters.
+Both cases will create warnings, but should still not fail with an error."
+}
+
+\relative c'' {
+ c1^\markup \harp-pedal #"^v-|vv-^"
+ % circled boxes:
+ c1^\markup \harp-pedal #"o^ovo-|vovo-o^"
+ % invalid pedal specifications, which still should be handled gracefully:
+ c1^\markup \harp-pedal #""
+ c1^\markup \harp-pedal #"asfdvx" %\break
+}
--- /dev/null
+\version "2.11.57"
+\header {
+
+texidoc = "Fixed horizontal alignment of columns of text can be set using
+\left-column, \center-align and \right-column.
+"
+
+}
+
+\markup {
+ \line {
+ \left-column {
+ one
+ two
+ three
+ }
+ \hspace #4
+ \center-align {
+ one
+ \left-align
+ two
+ three
+ }
+ \hspace #6
+ \right-column {
+ one
+ two
+ three
+ }
+ }
+}
"Keep track of durations in a run of grace notes."
'(columns common-shortest-duration))
+(ly:add-interface
+ 'instrument-specific-markup-interface
+ "Instrument-specific markup (like fret boards or harp pedal diagrams)."
+ '(fret-diagram-details harp-pedal-details size thickness))
+
(ly:add-interface
'key-cancellation-interface
"A key cancellation."
(hair-thickness ,number? "Thickness of the thin line in a bar
line.")
+ (harp-pedal-details ,list? "An alist of detailed grob properties
+for harp pedal diagrams. Each alist entry consists of a
+(@code{property} . @code{value}) pair.
+The properties which can be included in harp-pedal-details
+include the following:
+@itemize @bullet
+@item
+@code{box-offset} -- Vertical shift of the center of flat / sharp pedal
+boxes above / below the horizontal line. Default value 0.8.
+@item
+@code{box-width} -- Width of each pedal box. Default value 0.4.
+@item
+@code{box-height} -- Height of each pedal box. Default value 1.0.
+@item
+@code{space-before-divider} -- Space between boxes before the first divider
+(so that the diagram can be made symmetric). Default value 0.8.
+@item
+@code{space-after-divider} -- Space between boxes after the first divider.
+Default value 0.8.
+@end itemize")
+
(head-direction ,ly:dir? "Are the note heads left or right in a
semitie?")
(height ,ly:dimension? "Height of an object in
(meta . ((class . Item)
(interfaces . (text-script-interface
text-interface
+ instrument-specific-markup-interface
side-position-interface
font-interface))))))
thickness))
(x (car dest))
(y (cdr dest)))
- (ly:make-stencil
- `(draw-line
- ,th
- 0 0
- ,x ,y)
- (cons (min x 0) (max x 0))
- (cons (min y 0) (max y 0)))))
+ (make-line-stencil th 0 0 x y)))
(define-builtin-markup-command (draw-circle layout props radius thickness fill)
(number? number? boolean?)
(x1 (car (ly:stencil-extent markup X)))
(x2 (cdr (ly:stencil-extent markup X)))
(y (* thick -2))
- (line (ly:make-stencil
- `(draw-line ,thick ,x1 ,y ,x2 ,y)
- (cons (min x1 0) (max x2 0))
- (cons thick thick))))
+ (line (make-line-stencil thick x1 y x2 y)))
(ly:stencil-add markup line)))
(define-builtin-markup-command (box layout props arg)
baseline-skip
(interpret-markup-list layout props args)))
+(define (general-column align-dir baseline mols)
+ "Stack @var{mols} vertically, aligned to @var{align-dir} horizontally."
+
+ (let* ((aligned-mols (map (lambda (x) (ly:stencil-aligned-to x X align-dir)) mols)))
+ (stack-lines -1 0.0 baseline aligned-mols)))
+
(define-builtin-markup-command (center-align layout props args)
(markup-list?)
align
}
}
@end lilypond"
- (let* ((mols (interpret-markup-list layout props args))
- (cmols (map (lambda (x) (ly:stencil-aligned-to x X CENTER)) mols)))
- (stack-lines -1 0.0 baseline-skip cmols)))
+ (general-column CENTER baseline-skip (interpret-markup-list layout props args)))
+
+(define-builtin-markup-command (left-column layout props args)
+ (markup-list?)
+ align
+ ((baseline-skip))
+ "
+@cindex text columns, left-aligned
+
+Put @code{args} in a left-aligned column.
+
+@lilypond[verbatim,quote]
+\\markup {
+ \\left-column {
+ one
+ two
+ three
+ }
+}
+@end lilypond"
+ (general-column LEFT baseline-skip (interpret-markup-list layout props args)))
+
+(define-builtin-markup-command (right-column layout props args)
+ (markup-list?)
+ align
+ ((baseline-skip))
+ "
+@cindex text columns, right-aligned
+
+Put @code{args} in a right-aligned column.
+
+@lilypond[verbatim,quote]
+\\markup {
+ \\right-column {
+ one
+ two
+ three
+ }
+}
+@end lilypond"
+ (general-column RIGHT baseline-skip (interpret-markup-list layout props args)))
(define-builtin-markup-command (vcenter layout props arg)
(markup?)
(num-y (interval-widen (cons center center) (abs dy)))
(is-sane (and (interval-sane? num-x) (interval-sane? num-y)))
(slash-stencil (if is-sane
- (ly:make-stencil
- `(draw-line ,thickness
- ,(car num-x) ,(- (interval-center num-y) dy)
- ,(cdr num-x) ,(+ (interval-center num-y) dy))
- num-x num-y)
+ (make-line-stencil thickness
+ (car num-x) (- (interval-center num-y) dy)
+ (cdr num-x) (+ (interval-center num-y) dy))
#f)))
(if (ly:stencil? slash-stencil)
(begin
(string-append
"\n\n@item @code{\\" c-name "} " signature-str
- "\n@findex \\" f-name "\n"
-
+ "\n@funindex \\" c-name "\n"
+ "\n@cindex \\" c-name "\n"
(if (string? doc-str)
doc-str
"")
(define (markup-category-doc-node category)
(let* ((category-string (symbol->string category))
- (match (string-match "-" category-string))
- (category-name (string-capitalize
- (if match
- (regexp-substitute #f match 'pre " " 'post)
- category-string)))
+ (category-name (string-capitalize (regexp-substitute/global #f
+ "-" category-string 'pre " " 'post)))
(markup-functions (hashq-ref markup-functions-by-category
category)))
(make <texi-node>
#:desc ""
#:text "The following commands can all be used inside @code{\\markup @{ @}}."
#:children (let* (;; when a new category is defined, update `ordered-categories'
- (ordered-categories '(font align graphic music fret-diagram other))
+ (ordered-categories '(font align graphic music instrument-specific-markup other))
(raw-categories (hash-fold (lambda (category functions categories)
(cons category categories))
(list)
(let* ((fret-count (+ (- (cadr fret-range) (car fret-range)) 1))
(sl (* (+ fret-count 1) size))
(sth (* size th))
- (half-thickness (* sth 0.5))
(gap (- size sth))
(string-stencil
(if (eq? orientation 'normal)
- (ly:make-stencil
- (list 'draw-line sth 0 0 0 sl)
- (cons (- half-thickness) half-thickness)
- (cons (- half-thickness) (+ sl half-thickness)))
- (ly:make-stencil
- (list 'draw-line sth 0 0 sl 0)
- (cons (- half-thickness) (+ sl half-thickness))
- (cons (- half-thickness) half-thickness)))))
+ (make-line-stencil sth 0 0 0 sl)
+ (make-line-stencil sth 0 0 sl 0))))
(if (= string-count 1)
string-stencil
(if (eq? orientation 'normal)
(sth (* size th))
(half-thickness (* sth 0.5)))
(if (eq? orientation 'normal)
- (ly:make-stencil
- (list 'draw-line sth half-thickness size
+ (make-line-stencil sth half-thickness size
(- fret-length half-thickness) size)
- (cons 0 fret-length)
- (cons (- half-thickness) half-thickness))
- (ly:make-stencil
- (list 'draw-line sth 0 half-thickness
- 0 (- fret-length half-thickness))
- (cons (- half-thickness) half-thickness)
- (cons 0 fret-length)))))
+ (make-line-stencil sth 0 half-thickness
+ 0 (- fret-length half-thickness)))))
(define (draw-thick-zero-fret details string-count th size orientation)
"Draw a thick zeroth fret for a fret diagram whose base fret is not 1."
(barre-stencil
(if (eq? barre-type 'straight)
(if (eq? orientation 'normal)
- (ly:make-stencil
- (list
- 'draw-line (* size dot-radius) left dot-center-y
- right dot-center-y)
- (cons left right)
- (cons (- dot-center-y scale-dot-radius)
- (+ dot-center-y scale-dot-radius)))
- (ly:make-stencil
- (list 'draw-line (* size dot-radius)
+ (make-line-stencil scale-dot-radius left dot-center-y
+ right dot-center-y)
+ (make-line-stencil scale-dot-radius
(* size barre-fret-coordinate)
(* size barre-start-string-coordinate)
(* size barre-fret-coordinate)
- (* size barre-end-string-coordinate))
- (cons (- (* size barre-fret-coordinate)
- scale-dot-radius)
- (+ (* size barre-fret-coordinate)
- scale-dot-radius))
- (cons (* size barre-start-string-coordinate)
- (* size barre-end-string-coordinate))))
+ (* size barre-end-string-coordinate)))
(if (eq? orientation 'normal)
(ly:make-stencil
(list 'bezier-sandwich
(define-builtin-markup-command (fret-diagram-verbose layout props marking-list)
(list?) ; argument type
- fret-diagram ; markup type
+ instrument-specific-markup ; markup type
((align-dir -0.4) ; properties and defaults
(size 1.0)
(fret-diagram-details)
(define-builtin-markup-command (fret-diagram layout props definition-string)
(string?) ; argument type
- fret-diagram ; markup category
+ instrument-specific-markup ; markup category
(fret-diagram-verbose-markup) ; properties and defaults
"Make a (guitar) fret diagram. For example, say
(define-builtin-markup-command
(fret-diagram-terse layout props definition-string)
(string?) ; argument type
- fret-diagram ; markup category
+ instrument-specific-markup ; markup category
(fret-diagram-verbose-markup) ; properties
"Make a fret diagram markup using terse string-based syntax.
--- /dev/null
+;;;; harp-pedals.scm --
+;;;;
+;;;; source file of the GNU LilyPond music typesetter
+;;;;
+;;;; (c) 2008 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+
+
+(define-builtin-markup-command (harp-pedal layout props definition-string) (string?)
+ instrument-specific-markup ; markup type for the documentation!
+ ((size 1.0)
+ (harp-pedal-details)
+ (thickness 0.5))
+ "Make a harp pedal diagram.
+
+Possible elements in @var{definition-string}:
+
+@table @code
+@item ^
+pedal is up
+@item -
+pedal is neutral
+@item v
+pedal is down
+@item |
+vertical divider line
+@item o
+the following pedal should be circled (indicating a change)
+@end table
+
+The function also checks if the string has the typical form of three
+pedals, then the divider and then the remaining four pedals. If not it
+prints out a warning. However, in any case, it will also print each symbol
+in the order as given. This means you can place the divider (even multiple
+dividers) anywhere you want, but you'll have to live with the warnings.
+
+The appearance of the diagram can be tweaked inter alia using the size property
+of the TextScript grob (@code{\\override Voice.TextScript #'size = #0.3}) for
+the overall, the thickness property
+(@code{\\override Voice.TextScript #'thickness = #3}) for the line thickness of
+the horizontal line and the divider. The remaining configuration (box sizes,
+offsets and spaces) is done by the harp-pedal-details list of properties
+(@code{\\override Voice.TextScript #'harp-pedal-details #'box-width = #1}).
+It contains the following settings: @code{box-offset} (vertical shift of the
+box center for up/down pedals), @code{box-width}, @code{box-height},
+@code{space-before-divider} (the spacing between two boxes before the
+divider) and @code{space-after-divider} (box spacing after the divider).
+
+@lilypond[verbatim,quote]
+\\markup \\harp-pedal #\"^-v|--ov^\"
+@end lilypond
+"
+ (make-harp-pedal layout props (harp-pedals-parse-string definition-string)))
+
+
+;; There is also a \harp-pedal-verbose version, which takes a list of -1/0/1
+;; directions, o and a possible |. It's commented out, because it has some
+;; issues (see below) and does not add any new functionality over \harp-pedal
+;; The caveats:
+;; 1) the | cannot be given as a string "|" but as a character #\| and
+;; the "o" has to be given as #\o.
+;; 2) if one wants to use directions like UP, CENTER or DOWN, one cannot use
+;; '(UP DOWN CENTER #\| ....), because the contents of that list are
+;; never evaluated to -1/0/1. Instead one has to explicitly create a
+;; list like (list UP DOWN CENTER #\| ....)
+;;
+;; (define-builtin-markup-command (harp-pedal-verbose layout props pedal-list) (list?)
+;; instrument-specific-markup ; markup type
+;; ((size 1.0)
+;; (harp-pedal-details)
+;; (thickness 0.5))
+;; "Make a harp pedal diagram containing the directions indicated in @var{pedal-list}."
+;; (make-harp-pedal layout props pedal-list))
+
+
+
+;; Parse the harp pedal definition string into list of directions (-1/0/1), #\o and #\|
+(define (harp-pedals-parse-string definition-string)
+ "Parse a harp pedals diagram string and return a list containing 1, 0, -1, #\\o or #\\|"
+ (map (lambda (c)
+ (case c
+ ((#\^) 1)
+ ((#\v) -1)
+ ((#\-) 0)
+ ((#\| #\o) c)
+ (else c)))
+ (string->list definition-string)))
+
+
+;; Analyze the pedal-list: Return (pedalcount . (divider positions))
+(define (harp-pedal-info pedal-list)
+ (let check ((pedals pedal-list)
+ (pedalcount 0)
+ (dividerpositions '()))
+ (if (null? pedals)
+ (cons pedalcount (reverse dividerpositions))
+
+ (case (car pedals)
+ ((-1 0 1) (check (cdr pedals) (+ pedalcount 1) dividerpositions))
+ ((#\|) (check (cdr pedals) pedalcount (cons pedalcount dividerpositions)))
+ (else (check (cdr pedals) pedalcount dividerpositions))))))
+
+
+;; Sanity checks, spit out warning if pedal-list violates the conventions
+(define (harp-pedal-check pedal-list)
+ "Perform some sanity checks for harp pedals (7 pedals, divider after third)"
+ (let ((info (harp-pedal-info pedal-list)))
+ ; 7 pedals:
+ (if (not (equal? (car info) 7))
+ (ly:warning "Harp pedal diagram contains ~a pedals rather than the usual 7." (car info)))
+ ; One divider after third pedal:
+ (if (null? (cdr info))
+ (ly:warning "Harp pedal diagram does not contain a divider (usually after third pedal).")
+ (if (not (equal? (cdr info) '(3)))
+ (ly:warning "Harp pedal diagram contains dividers at positions ~a. Normally, there is only one divider after the third pedal." (cdr info))))))
+
+
+(define (make-harp-pedal layout props pedal-list)
+ "Make a harp pedals diagram markup"
+
+ (harp-pedal-check pedal-list)
+
+ (let* ((size (chain-assoc-get 'size props 1.2))
+ (details (chain-assoc-get 'harp-pedal-details props '()))
+ (dy (* size (assoc-get 'box-offset details 0.8))) ; offset of the box center from the line
+ (line-width (* (ly:output-def-lookup layout 'line-thickness)
+ (chain-assoc-get 'thickness props 0.5)))
+ (box-width (* size (assoc-get 'box-width details 0.4)))
+ (box-hheight (* size (/ (assoc-get 'box-height details 1.0) 2))) ; half the box-height, saves some divisions by 2
+ (spacebeforedivider (* size (assoc-get 'space-before-divider details 0.8))) ; full space between boxes before the first divider
+ (spaceafterdivider (* size (assoc-get 'space-after-divider details 0.8))) ; full space between boxes
+ ;(spacebeforedivider (/ (+ box-width (* 8 spaceafterdivider)) 8))
+ (box-x-dimensions (lambda (prev-x p space) (cons (+ prev-x space)
+ (+ prev-x space box-width))))
+ (box-y-dimensions (lambda (prev-x p space) (cons (- (* p dy) box-hheight)
+ (+ (* p dy) box-hheight))))
+ (divider-stencil (lambda (xpos) (make-line-stencil line-width xpos (- 0 dy box-hheight) xpos (+ dy box-hheight))))
+ (result (let process-pedal ((remaining pedal-list)
+ (prev-x 0)
+ (stencils '())
+ (circled #f)
+ (space spacebeforedivider))
+ ; Terminal condition of the recursion, return (final-x . stencil-list)
+ (if (null? remaining)
+ (cons (+ prev-x space) (reverse stencils))
+
+ (case (car remaining)
+ ((1 0 -1) ; Pedal up/neutral/down
+ (let* ((p (car remaining))
+ (stencil (make-filled-box-stencil
+ (box-x-dimensions prev-x p space)
+ (box-y-dimensions prev-x p space)))
+ ;(circle-stencil (if circled (rounded-box-stencil stencil 0.05 0.3 0.1 ) stencil))
+ (circle-stencil (if circled (circle-stencil stencil 0.05 0.2 ) stencil))
+ (new-prev-x (+ prev-x space box-width)))
+ (process-pedal (cdr remaining) new-prev-x (cons circle-stencil stencils) #f space)))
+ ((#\|) ; Divider line
+ (let* ((xpos (+ prev-x space))
+ (stencil (divider-stencil xpos))
+ (new-prev-x (+ prev-x space)))
+ (process-pedal (cdr remaining) new-prev-x (cons stencil stencils) circled spaceafterdivider)))
+ ((#\o) ; Next pedal should be circled
+ (process-pedal (cdr remaining) prev-x stencils #t space))
+ (else
+ (ly:warning "Unhandled entry in harp-pedal: ~a" (car remaining))
+ (process-pedal (cdr remaining) prev-x stencils circled space))))))
+ (final-x (car result))
+ (stencils (cdr result)))
+ ; Add the horizontal line and combine all stencils:
+ (apply ly:stencil-add
+ (cons
+ (make-line-stencil line-width 0 0 final-x 0)
+ stencils))))
+
"encoding.scm"
"fret-diagrams.scm"
+ "harp-pedals.scm"
"predefined-fretboards.scm"
"define-markup-commands.scm"
"define-grob-properties.scm"
(ly:stencil-combine-at-edge stil (other-axis axis) -1 rb padding))
stil))
+(define-public (make-line-stencil width startx starty endx endy)
+ "Make a line stencil of given linewidth and set its extents accordingly"
+ (let ((xext (cons (min startx endx) (max startx endx)))
+ (yext (cons (min starty endy) (max starty endy))))
+ (ly:make-stencil
+ (list 'draw-line width startx starty endx endy)
+ ; Since the line has rounded edges, we have to / can safely add half the
+ ; width to all coordinates!
+ (interval-widen xext (/ width 2))
+ (interval-widen yext (/ width 2)))))
+
(define-public (make-filled-box-stencil xext yext)
"Make a filled box."
ev = musicexp.MarkEvent ("\\markup { %s }" % text)
return ev
+def musicxml_harp_pedals_to_ly (mxl_event):
+ count = 0
+ result = "\\harp-pedal #\""
+ for t in mxl_event.get_named_children ('pedal-tuning'):
+ alter = t.get_named_child ('pedal-alter')
+ if alter:
+ val = int (alter.get_text ().strip ())
+ result += {1: "v", 0: "-", -1: "^"}.get (val, "")
+ count += 1
+ if count == 3:
+ result += "|"
+ ev = musicexp.MarkupEvent ()
+ ev.contents = result + "\""
+ return ev
+
def musicxml_eyeglasses_to_ly (mxl_event):
needed_additional_definitions.append ("eyeglasses")
return musicexp.MarkEvent ("\\eyeglasses")
# 'damp' : ???
# 'damp-all' : ???
'eyeglasses': musicxml_eyeglasses_to_ly,
-# 'harp-pedals' : ???
+ 'harp-pedals' : musicxml_harp_pedals_to_ly,
# 'image' : ???
'metronome' : musicxml_metronome_to_ly,
'rehearsal' : musicxml_rehearsal_to_ly_mark,