]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge commit 'origin/lilypond/translation'
authorReinhold Kainhofer <reinhold@kainhofer.com>
Thu, 21 Aug 2008 14:47:18 +0000 (16:47 +0200)
committerReinhold Kainhofer <reinhold@kainhofer.com>
Thu, 21 Aug 2008 14:47:18 +0000 (16:47 +0200)
23 files changed:
Documentation/bibliography/computer-notation.bib
Documentation/de/user/introduction.itely
Documentation/es/user/chords.itely
Documentation/es/user/introduction.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 7353cbb37f89c29058e49a2a968544fc670a7a4c..6f23f06eb14227d21e57a527b17d710ca3017008 100644 (file)
@@ -968,7 +968,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 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,