]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' into lilypond/translation
authorJohn Mandereau <john.mandereau@gmail.com>
Fri, 22 Aug 2008 12:51:12 +0000 (14:51 +0200)
committerJohn Mandereau <john.mandereau@gmail.com>
Fri, 22 Aug 2008 12:51:12 +0000 (14:51 +0200)
* master:
  Partially update French docs
  Docs: Use @rlsrnamed for link to snippets Top
  Update for Staff
  MusicXML: Implement harp-pedals, now that it's available in lilypond
  GDP NR Appendices: Add descriptions of indices
  New markup commands: \left-column and \right-column.
  Harp pedals: Cleanup
  Spanish docs: Fix link to IR / BassFigure (no longer NewBassFigure)
  Markup command indexing: don't use internal function names.
  Bump version.
  Compile fix...
  New regression tests should have 2.11.57...
  Docs: Add fret and harp pedal diagrams to markup category instrument-specific-markup
  Add instrument-specific-markup-interface, assign to TextScript and add (fret-board|harp-pedal)-details to it
  Feature: Add Harp pedal diagrams, i.e. a \harp-pedal markup function
  Add a make-line-stencil function, which correctly sets stencil extents
  Fix dangling links (citeseer, personal homepages, email Adresses) in the docs

Conflicts:

Documentation/fr/user/introduction.itely

26 files changed:
Documentation/bibliography/computer-notation.bib
Documentation/de/user/introduction.itely
Documentation/es/user/chords.itely
Documentation/es/user/introduction.itely
Documentation/fr/user/fundamental.itely
Documentation/fr/user/introduction.itely
Documentation/fr/user/tutorial.itely
Documentation/topdocs/AUTHORS.texi
Documentation/topdocs/NEWS.tely
Documentation/user/lilypond.tely
Documentation/user/staff.itely
VERSION
input/regression/harp-pedals-sanity-checks.ly [new file with mode: 0644]
input/regression/harp-pedals-tweaking.ly [new file with mode: 0644]
input/regression/harp-pedals.ly [new file with mode: 0644]
input/regression/markup-column-align.ly [new file with mode: 0644]
scm/define-grob-interfaces.scm
scm/define-grob-properties.scm
scm/define-grobs.scm
scm/define-markup-commands.scm
scm/document-markup.scm
scm/fret-diagrams.scm
scm/harp-pedals.scm [new file with mode: 0644]
scm/lily.scm
scm/stencil.scm
scripts/musicxml2ly.py

index a501f0e26aeff9bdc0c6b4d56fd634a0e7955be1..2071e377ddcd7c546755c41db43775377d3bf273 100644 (file)
@@ -197,7 +197,7 @@ representation is rather vague. HWN}
   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},
@@ -597,7 +597,7 @@ note = {This dutch thesis describes a monophonic typesetting system,
   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},
 }
 
 
@@ -715,7 +715,7 @@ basically say: "You can embed a NIFF or MIDI file")}
   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
index cba6550400bc2f3ba2fc3d2c6f447f8c3697967c..dd45ee198305f980a56450f116db82b900222fe8 100644 (file)
@@ -924,14 +924,7 @@ großer Hilfe sein.
 @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
index 5140c8c4f0ee29105fad2ca1d59b88a349ea551e..ae09552f92c3816a816c4353b1e64a7c8c7deb7c 100644 (file)
@@ -798,7 +798,7 @@ Fragmentos de código:
 @rlsr{Chords}.
 
 Referencia de funcionamiento interno:
-@rinternals{NewBassFigure},
+@rinternals{BassFigure},
 @rinternals{BassFigureAlignment},
 @rinternals{BassFigureLine},
 @rinternals{BassFigureBracket},
@@ -928,7 +928,7 @@ instead of
 @rlsr{Figured Bass}.
 
 Referencia de funcionamiento interno:
-@rinternals{NewBassFigure},
+@rinternals{BassFigure},
 @rinternals{BassFigureAlignment},
 @rinternals{BassFigureLine},
 @rinternals{BassFigureBracket},
index 6c45a8763eb63f9896038405616f2335136b08f0..f514fc3820f99a3fc4c4dbe3ee4337f6ddcad31c 100644 (file)
@@ -962,7 +962,7 @@ convierten una amplia variedad de formatos de música al formato
 @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.
index 834bbd64250117e17c4ff9c3c440ace85dd71f1a..6dbe855075ea3a8ee0f215853509f5f83fece02a 100644 (file)
 
 
 @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
index bef04ffee7b6daee3ce8f16b421264334a6db02c..2c18b9980225264439fbe72408e12bf0c9d1863c 100644 (file)
@@ -1,7 +1,7 @@
 @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.
@@ -836,24 +836,30 @@ Cette partie présente les différents volumes de la documentation.
 @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
@@ -906,8 +912,8 @@ d'utilisateurs n'ont jamais touché à Scheme.
 @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.
@@ -916,7 +922,7 @@ 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.
 
@@ -1025,7 +1031,7 @@ et convertissent divers formats de musique vers le format @code{.ly}.
 @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}
@@ -1055,11 +1061,11 @@ manuel de notation est accessible par des liens dans le paragraphe
 @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
@@ -1079,9 +1085,20 @@ Pour finir, présentons d'autres précieuses sources de documentation.
 
 @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
@@ -1108,16 +1125,17 @@ HTML qui incluent des fragments musicaux, le code LilyPond utilisé
 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
index de949423e6115c2855f4aa43d7edf1303e8f5c5c..f49bb017bfa4fab7c85b92c6117db28f441b56e6 100644 (file)
@@ -1,7 +1,7 @@
 @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.
@@ -58,7 +58,7 @@ LilyPond.
 @menu
 * Compiling a file::
 * Simple notation::
-* Working on text files::
+* Working on input files::
 * How to read the manual::
 @end menu
 
@@ -437,8 +437,8 @@ Manuel de notation : @ruser{Writing pitches},
 @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
@@ -542,7 +542,7 @@ quelques usages possibles des commentaires :
 @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.
@@ -1824,6 +1824,13 @@ syntaxe de base de LilyPond.  Vous pouvez toujours survoler ces
 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
index 421600532668b45ec56b2b269b900d93c2999274..b77d180be4e93752f4a9d7b0b2f8b773331906fc 100644 (file)
@@ -33,22 +33,21 @@ al-niente hairpins.
     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/},
@@ -57,7 +56,7 @@ al-niente hairpins.
 @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},
@@ -73,7 +72,7 @@ Font
 
 @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.
index cafa877cf104867ced2ad2109b5bf5a053bb2605..a4c3c6169489256f2acea2462fde9915fa38f9f1 100644 (file)
@@ -328,6 +328,12 @@ indicate a raised 6th step.
 \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
 
 
index 0d116b6fd3b4ad97a2d5cd3c947774b05bdae105..5b16a3b6a4a94b57b7f4bc9ff5e40aff90aa1eb3 100644 (file)
@@ -191,14 +191,25 @@ Appendices
 @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
 
index 3c4be6a41d7f45b8a37c48d1ef47bfb1860e1f9e..3f61028eda1fb3eb73dedc024536586046a6b2f3 100644 (file)
@@ -316,13 +316,13 @@ Bar lines are @emph{not} connected between staves of an
 
 @seealso
 
-Snippets:
-@rlsr{Staff notation}.
-
 Notation Reference:
 @ref{Grouping staves},
 @ref{Instrument names}.
 
+Snippets:
+@rlsr{Staff notation}.
+
 Internals Reference:
 @rinternals{InnerStaffGroup},
 @rinternals{StaffGroup},
@@ -485,6 +485,9 @@ Music Glossary:
 Notation Reference:
 @ref{Displaying pitches}.
 
+Snippets:
+@rlsr{Staff notation}.
+
 Internals Reference:
 @rinternals{StaffSymbol},
 @rinternals{staff-symbol-interface}.
@@ -506,30 +509,99 @@ lines in either direction must be equal.
 @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
   {
@@ -559,6 +631,48 @@ space is inserted with the @code{\skip} command.
     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
 
 
@@ -601,18 +715,16 @@ Internals Reference:
 @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
@@ -632,69 +744,24 @@ To remove other types of contexts, use
 
 @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}
 
@@ -729,6 +796,10 @@ Internals Reference:
 @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::
@@ -743,31 +814,58 @@ Internals Reference:
 @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 {
   (
@@ -799,41 +897,20 @@ Internals Reference:
 @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
@@ -851,8 +928,10 @@ c1
 
 @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]
 <<
@@ -870,33 +949,43 @@ better entered using @code{\center-align}:
 >>
 @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
@@ -908,6 +997,12 @@ c1 c c c \break
 @end lilypond
 
 
+@snippets
+
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{aligning-and-centering-instrument-names.ly}
+
+
 @seealso
 
 Notation Reference:
@@ -930,93 +1025,92 @@ Internals 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
@@ -1036,7 +1130,7 @@ Internals Reference:
 
 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
@@ -1058,66 +1152,53 @@ written entirely in lower-case letters: @code{\addquote}.
 @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
@@ -1126,30 +1207,29 @@ clef, the original clef should be stated once again.
 
 @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
 
@@ -1162,3 +1242,8 @@ Snippets:
 Internals Reference:
 @rinternals{Voice}.
 
+
+@knownissues
+
+Collisions are not checked between @code{Voice} and
+@code{CueVoice} contexts.
diff --git a/VERSION b/VERSION
index 581effe7462d24bd0168f3227be43b00a4e49d40..b4c13ebe19df11094998283371cbc7d3d1249191 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,6 +1,6 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=11
-PATCH_LEVEL=56
+PATCH_LEVEL=57
 MY_PATCH_LEVEL=
 
diff --git a/input/regression/harp-pedals-sanity-checks.ly b/input/regression/harp-pedals-sanity-checks.ly
new file mode 100644 (file)
index 0000000..f395f0d
--- /dev/null
@@ -0,0 +1,16 @@
+\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^"
+}
diff --git a/input/regression/harp-pedals-tweaking.ly b/input/regression/harp-pedals-tweaking.ly
new file mode 100644 (file)
index 0000000..ed081b3
--- /dev/null
@@ -0,0 +1,20 @@
+\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^"}
+}
diff --git a/input/regression/harp-pedals.ly b/input/regression/harp-pedals.ly
new file mode 100644 (file)
index 0000000..04af5a5
--- /dev/null
@@ -0,0 +1,16 @@
+\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
+}
diff --git a/input/regression/markup-column-align.ly b/input/regression/markup-column-align.ly
new file mode 100644 (file)
index 0000000..d45f466
--- /dev/null
@@ -0,0 +1,31 @@
+\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
+    }
+  }
+}
index 8b0dde24f84f86b642aa3c9a4c178ff5c2908289..b5ffda6574faa9f1fc4ed998284a1b62448b7e08 100644 (file)
@@ -61,6 +61,11 @@ note)."
  "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."
index 9015764dc1f028f8df0fb5f6bfdb5d53a074ae67..49916fa24ee62543ad408489d2db41e59cfd67ed 100644 (file)
@@ -320,6 +320,27 @@ property.")
 
      (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
index 555403033926f26f479ca674858921480344e0fe..d43ce82efcd375617de9047cdba399b048df210d 100644 (file)
        (meta . ((class . Item)
                 (interfaces . (text-script-interface
                                text-interface
+                               instrument-specific-markup-interface
                                side-position-interface
                                font-interface))))))
 
index 18112b874c1336b0130133c184da85e904ccddac..68acb63ef6037302530b919ea872f6ea97d815aa 100644 (file)
@@ -42,13 +42,7 @@ A simple line.
                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?)
@@ -206,10 +200,7 @@ thickness and y offset.
          (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)
@@ -1196,6 +1187,12 @@ of the @code{#'direction} layout property.
                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
@@ -1214,9 +1211,47 @@ Put @code{args} in a centered column.
   }
 }
 @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?)
@@ -2530,11 +2565,9 @@ and continue with double letters.
          (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
index 77ee9b97dce4fee30b81c818af65d53c310b1f56..91ec7b882d669315ead572564ab01aa059961c3e 100644 (file)
@@ -49,8 +49,8 @@
     
     (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>
@@ -97,7 +94,7 @@
     #: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)
index fb986f91b990f3589d48d05f883017aa2a559220..d0c48821044d5e12791b3a451fc265f2c2cd676a 100644 (file)
@@ -70,18 +70,11 @@ Line thickness is given by @var{th}, fret & string spacing by
   (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)
@@ -125,16 +118,10 @@ fret & string spacing by @var{size}. Orientation is given by @var{orientation}"
          (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."
@@ -381,25 +368,13 @@ Line thickness is given by @var{th}, fret & string spacing by
              (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
@@ -452,7 +427,7 @@ Line thickness is given by @var{th}, fret & string spacing by
 
 (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)
@@ -610,7 +585,7 @@ indications per string.
 
 (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
 
@@ -776,7 +751,7 @@ Note: There is no limit to the number of fret indications per string.
 (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.
 
diff --git a/scm/harp-pedals.scm b/scm/harp-pedals.scm
new file mode 100644 (file)
index 0000000..8f7756a
--- /dev/null
@@ -0,0 +1,174 @@
+;;;; 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))))
+
index 51038bcd29e02dd630da3e4221c4e561a5d7fccd..e518ce298345fc9a0dd7c1316dedb108dfd72c2e 100644 (file)
@@ -338,6 +338,7 @@ The syntax is the same as `define*-public'."
            "encoding.scm"
            
            "fret-diagrams.scm"
+           "harp-pedals.scm"
            "predefined-fretboards.scm"
             "define-markup-commands.scm"
            "define-grob-properties.scm"
index 6a4b88d7b2c24a3f0d22e351cb277f2c68d4f2ec..19303ae691bc85d1499de93ae24b19dc01161244 100644 (file)
          (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."
   
index 886479a8936cfaaaa08f2117e2e6c177fcb7e037..e835d68753e86a47d15da433b7a3bc0a0f359582 100644 (file)
@@ -1157,6 +1157,21 @@ def musicxml_rehearsal_to_ly_mark (mxl_event):
     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")
@@ -1222,7 +1237,7 @@ directions_dict = {
 #     '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,