@end ignore
+@item
+Several articulations can be put into a single variable or
+returned from an event function:
+
+@lilypond[verbatim,quote]
+sempreStacc = -. ^\markup \italic sempre
+\relative { c''4\sempreStacc c c c }
+@end lilypond
+
+@item
+The baseline of score markups is now taken from the reference
+point (usually the middle of the staff) of the first bottom system
+rather than the top of the bounding rectangle. The following
+@lilypond[verbatim,quote]
+\markup {
+ violin: \score { \new Staff { <g d' a' e''>1 }
+ \layout { indent=0 } } ,
+ cello: \score { \new Staff { \clef "bass" <c, g, d a> }
+ \layout { indent=0 } }
+}
+@end lilypond
+previously looked like
+@lilypond[quote]
+\markup {
+ violin: \general-align #Y #UP
+ \score { \new Staff { <g d' a' e''>1 }
+ \layout { indent=0 } } ,
+ cello: \general-align #Y #UP
+ \score { \new Staff { \clef "bass" <c, g, d a> }
+ \layout { indent=0 } }
+}
+@end lilypond
+without a reliable way to get both scores to line up.
+
@item
LilyPond no longer automatically infers a @samp{\defaultchild}
context in a context definition with @samp{\accepts} clauses. Any
@c used for news about the upcoming release; see CG 10.2
@newsItem
-@subsubheading LilyPond 2.17.29 released! @emph{October 20, 2013}
-
-We are happy to announce the release of LilyPond 2.17.29. This
-release contains the usual number of bugfixes and enhancements, and contains
-some work in progress. You will have access to the very latest features, but
-some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+@subsubheading LilyPond 2.17.95 released! @emph{November 3, 2013}
+
+We are excited to announce the release of LilyPond@tie{}2.17.95 as
+beta release for the upcoming stable release@tie{}2.18. The
+developers are still busy finding solutions for some last-minute
+problems, but the release is supposed to be feature-complete, the
+documentation to be accurate, and no important issues to be
+overlooked. For upgrading the syntax of your input files to the
+latest version, see @rprogram{Updating files with convert-ly}.
+Please test this release and report back any problems, see
+@rweb{Bug reports}.
@newsEnd
* don't duplicate entries from news-front.itexi
@end ignore
+@newsItem
+@subsubheading LilyPond 2.17.29 released! @emph{October 20, 2013}
+
+We are happy to announce the release of LilyPond 2.17.29. This
+release contains the usual number of bugfixes and enhancements, and contains
+some work in progress. You will have access to the very latest features, but
+some may be incomplete, and you may encounter bugs and crashes. If you require
+a stable version of Lilypond, we recommend using the 2.16 version.
+
+@newsEnd
+
@newsItem
@subsubheading LilyPond 2.17.28 released! @emph{October 6, 2013}
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=17
-PATCH_LEVEL=30
+PATCH_LEVEL=96
MY_PATCH_LEVEL=
VERSION_STABLE=2.16.2
-VERSION_DEVEL=2.17.29
+VERSION_DEVEL=2.17.95
--- /dev/null
+\version "2.17.30"
+
+\header {
+ texidoc = "Bends should not be effected by the full width of a
+@code{NonMusicalPaperColumn}. The bends should have identical X
+spans in the two examples.
+"
+}
+
+music = \repeat unfold 16 { c''4\bendAfter #-4 }
+sixteens = \repeat unfold 64 { c'16 }
+
+\new Score {
+ << \music \sixteens >>
+}
+
+\new Score \with {
+ currentBarNumber = #200
+ barNumberVisibility = #(every-nth-bar-number-visible 1)
+ \override BarNumber.break-visibility = #end-of-line-invisible
+} {
+ << \music \sixteens >>
+}
--- /dev/null
+\version "2.17.30"
+
+\header {
+
+ texidoc = "A grace note after @code{\\cadenzaOff} does not keep
+ autobeaming from resuming properly."
+
+}
+
+\layout { ragged-right = ##t }
+
+\relative c' {
+ e8 e e e e e e e
+ \cadenzaOn <>^\markup \typewriter "\\cadenzaOn"
+ e e e e e e e e
+ \cadenzaOff
+ \bar "|"
+ <>^\markup \typewriter "\\cadenzaOff"
+ \grace f8
+ e e e e e e e e
+}
--- /dev/null
+\version "2.17.27"
+
+\header {
+ texidoc = "@code{metronomeMarkFormatter} supports
+all note head styles and flags styles. Setting @code{font-name} for
+@code{MetronomeMark} does not disturb the glyphs for note-head and flag.
+"
+}
+
+\paper {
+ ragged-right = ##f
+ indent = 30
+}
+
+mus =
+\relative c'' {
+ \tempo "Allegro" 8=120-140
+ a8 b c d a b c d
+ \override Score.MetronomeMark.font-name = "Times New Roman"
+ \tempo "Allegro" 8=140
+ a b c d a b c d
+}
+
+%% Some Examples:
+\score {
+ \new Staff
+ \with {
+ instrumentName = "default"
+ }
+ \mus
+ \layout {}
+}
+
+\score {
+ \new Staff
+ \with {
+ instrumentName =
+ \markup \column { "default-note-head" "old-straight-flag" }
+ }
+ \mus
+ \layout {
+ \context {
+ \Score
+ \override MetronomeMark.flag-style = #'old-straight-flag
+ }
+ }
+}
+
+\score {
+ \new Staff
+ \with {
+ instrumentName =
+ \markup \column { "default-note-head" "modern-straight-flag" }
+ }
+ \mus
+ \layout {
+ \context {
+ \Score
+ \override MetronomeMark.flag-style = #'modern-straight-flag
+ }
+ }
+}
+
+\score {
+ \new Staff
+ \with {
+ instrumentName =
+ \markup \column { "default-note-head" "flat-flag" }
+ }
+ \mus
+ \layout {
+ \context {
+ \Score
+ \override MetronomeMark.flag-style = #'flat-flag
+ }
+ }
+}
+
+\score {
+ \new Staff
+ \with {
+ instrumentName =
+ \markup \column { "diamond-note-head" "modern-straight-flag" }
+ }
+ \mus
+ \layout {
+ \context {
+ \Score
+ \override MetronomeMark.style = #'diamond
+ \override MetronomeMark.flag-style = #'modern-straight-flag
+ }
+ }
+}
+
+\score {
+ \new MensuralStaff
+ \with {
+ instrumentName =
+ \markup \column { "mensural-note-head" "mensural-flag" }
+ }
+ \mus
+ \layout {
+ \context {
+ \Score
+ \override MetronomeMark.style = #'mensural
+ }
+ }
+}
-\version "2.17.28"
+\version "2.17.29"
\header {
texidoc = "The @code{\\offset} command may be used to displace various properties
%% ARPEGGIO %%
% default
<c e g b>1\arpeggio
- <c e g b>1-\offset #'positions #'(-1 . 1) \arpeggio
+ <c e g b>1-\offset positions #'(-1 . 1) \arpeggio
\bar "||"
%% BREATHING SIGN %%
% default
c1 \breathe
c1
- \once \offset #'Y-offset #1 BreathingSign
+ \once \offset Y-offset 1 BreathingSign
\breathe
\bar "||"
%% DYNAMICS %%
% default
c1\f
- \once \offset #'X-offset #-1 DynamicText
+ \once \offset X-offset #-1 DynamicText
c1\f
% DynamicLineSpanner
- c1-\offset #'padding #1 \f
+ \once \offset padding 1 DynamicLineSpanner
+ c1\f
\bar "||"
%% BEAMS %%
% default
c'8 d e f
- \once \offset #'positions #'(-1 . -1) Voice.Beam
+ \once \offset positions #'(-1 . -1) Voice.Beam
c8 d e f
% same effect as an offset of '(-2 . -2)
- \once \offset #'positions #-2 Beam
+ \once \offset positions #-2 Beam
c8 d e f
\override Beam.breakable = ##t
- c8-\offset #'positions #'((-1 . -3) (-3 . -1)) [ d e f
+ c8-\offset positions #'((-1 . -3) (-3 . -1)) [ d e f
\break
- g8 f e d] c-\offset #'beam-thickness #0.48 [ d e f]
+ g8 f e d] c-\offset beam-thickness 0.48 [ d e f]
\bar "||"
%% TEXT SPANNERS %%
c4\startTextSpan d e f\stopTextSpan
- \once \offset #'dash-fraction #'(0.1 0.3) TextSpanner
- \once \offset #'staff-padding #'(1.0 2.0) TextSpanner
+ \once \offset dash-fraction #'(0.1 0.3) TextSpanner
+ \once \offset staff-padding #'(1.0 2.0) TextSpanner
c4\startTextSpan d e f
\break
c4 d e f\stopTextSpan
%% SLURS %%
% this duplicates the effect of the \shape command
- \offset #'control-points #'(
+ \offset control-points #'(
((0 . 0) (0 . 1) (0 . 2) (0 . 1))
((1 . 0) (0 . 4) (0 . 4) (0 . 0))
) Slur
- c4-\offset #'line-thickness #'(0 10) ( d e f
+ c4-\offset line-thickness #'(0 10) ( d e f
\break
c4 d e f)
+ \bar "||"
+
+ %% ACCIDENTAL, STEM %%
+ % this illustrates use of \offset as a directed tweak
+ cis2
+ \offset AccidentalPlacement.right-padding 0.5
+ \offset Stem.thickness 4.0
+ cis!2
}
\new Lyrics \lyricsto "asdf" \lyricmode { a b c d }
>>
}
- \markup "blah blah blah"
+ \markup "next song"
+ \score {
+ <<
+ \new Lyrics \lyricmode {la1 la }
+ \new Staff \new Voice { a'1 a'1 }
+ >>
+ }
}
class Axis_group_engraver : public Engraver
{
protected:
+ bool active_;
Spanner *staffline_;
SCM interesting_;
vector<Grob *> elts_;
void process_music ();
+ virtual void initialize ();
virtual void finalize ();
DECLARE_ACKNOWLEDGER (grob);
void process_acknowledged ();
{
staffline_ = 0;
interesting_ = SCM_EOL;
+ active_ = false;
+}
+
+void
+Axis_group_engraver::initialize ()
+{
+ active_ = !to_boolean (get_property ("hasAxisGroup"));
+ if (active_)
+ context ()->set_property ("hasAxisGroup", SCM_BOOL_T);
}
void
void
Axis_group_engraver::process_music ()
{
- if (!staffline_)
+ if (!staffline_ && active_)
{
staffline_ = get_spanner ();
Grob *it = unsmob_grob (get_property ("currentCommandColumn"));
void
Axis_group_engraver::acknowledge_grob (Grob_info i)
{
- if (!staffline_)
- return;
- if (i.grob ()->name () == "VerticalAxisGroup") {
- i.grob ()->programming_error ("duplicate axis group");
- if (staffline_->is_live ())
- staffline_->suicide ();
- staffline_ = 0;
- elts_.clear ();
- return;
- }
- elts_.push_back (i.grob ());
+ if (staffline_)
+ elts_.push_back (i.grob ());
if (staffline_ && to_boolean(staffline_->get_property("remove-empty")))
{
/* read */
"currentCommandColumn "
- "keepAliveInterfaces ",
-
+ "keepAliveInterfaces "
+ "hasAxisGroup ",
+
/* write */
- ""
+ "hasAxisGroup "
);
return ly_interval2scm (ext);
}
+LY_DEFINE (ly_generic_bound_extent, "ly:generic-bound-extent",
+ 2, 0, 0, (SCM grob, SCM common),
+ "Determine the extent of @var{grob} relative to @var{common} along"
+ " the X axis, finding its extent as a bound when it a has"
+ " @code{bound-alignment-interfaces} property list set and"
+ " otherwise the full extent.")
+{
+ LY_ASSERT_SMOB (Grob, grob, 1);
+ LY_ASSERT_SMOB (Grob, common, 2);
+
+ Interval ext = Axis_group_interface::generic_bound_extent (unsmob_grob (grob), unsmob_grob (common), X_AXIS);
+ return ly_interval2scm (ext);
+}
+
LY_DEFINE (ly_axis_group_interface__add_element, "ly:axis-group-interface::add-element",
2, 0, 0, (SCM grob, SCM grob_element),
"Set @var{grob} the parent of @var{grob-element} on all axes of"
for (vsize i = 0; i < elts.size (); i++)
{
if (elts[i] && elts[i]->is_live ())
+ relevant_grobs.push_back (elts[i]);
+ /*
+ TODO (mikesol): it is probably bad that we're reading prebroken
+ pieces from potentially suicided elements. This behavior
+ has been in current master since at least 2.16.
+
+ We need to fully suicide all Items, meaning that their
+ prebroken pieces should not be accessible, which means that
+ Item::handle_prebroken_dependencies should only be called
+ AFTER this list is composed. The list composition function
+ should probably not check for suicided items or NULL pointers
+ but leave that to the various methods that use it.
+ */
+ if (Item *it = dynamic_cast<Item *> (elts[i]))
{
- relevant_grobs.push_back (elts[i]);
- if (Item *it = dynamic_cast<Item *> (elts[i]))
+ for (LEFT_and_RIGHT (d))
{
- for (LEFT_and_RIGHT (d))
- {
- Item *piece = it->find_prebroken_piece (d);
- if (piece && piece->is_live ())
- relevant_grobs.push_back (piece);
- }
+ Item *piece = it->find_prebroken_piece (d);
+ if (piece && piece->is_live ())
+ relevant_grobs.push_back (piece);
}
}
}
"defaultBarType "
"measureLength "
"whichBar "
- "measurePosition ",
+ "measurePosition "
+ "timing ",
/* write */
- "automaticBars "
+ ""
);
Default_bar_line_engraver::Default_bar_line_engraver ()
Moment mp = measure_position (context ());
bool start_of_measure = (last_moment_.main_part_ != now.main_part_
- && !mp.main_part_);
+ && !mp.main_part_
+ && to_boolean (get_property ("timing")));
if (!scm_is_string (which) && to_boolean (automatic_bars))
{
: 0;
// Corner case: there was only one staff, and it wasn't spaceable.
- // Mark it spaceable, because we do not allow non-spaceable staves
- // to be at the top or bottom of a system.
if (!found_spaceable_staff && elts.size ())
mark_as_spaceable (elts[0]);
}
if (sky)
{
- minimum_distance = (*sky)[UP].distance (bottom_skyline_);
+ minimum_distance = max ((*sky)[UP].distance (bottom_skyline_),
+ bottom_loose_baseline_);
bottom_skyline_ = (*sky)[DOWN];
}
else if (Stencil *sten = unsmob_stencil (prob->get_property ("stencil")))
bottom_skyline_.clear ();
bottom_skyline_.set_minimum_height (iv[DOWN]);
}
+ bottom_loose_baseline_ = 0.0;
Spring spring_copy = spring;
if (tight_spacing)
of the parse stack onto the heap. */
%left PREC_BOT
-%nonassoc REPEAT
+%nonassoc REPEAT REPEAT_IDENTIFIER
%nonassoc ALTERNATIVE
/* The above precedences tackle the shift/reduce problem
%nonassoc COMPOSITE
%left ADDLYRICS
-%right ':' UNSIGNED REAL
+%right ':' UNSIGNED REAL E_UNSIGNED EVENT_IDENTIFIER EVENT_FUNCTION '^' '_'
+ HYPHEN EXTENDER DURATION_IDENTIFIER
- /* The above are needed for collecting tremoli greedily, and together
- with the next rule for putting together numbers and units
+ /* The above are needed for collecting tremoli and other items (that
+ could otherwise be interpreted as belonging to the next function
+ argument) greedily, and together with the next rule will serve to
+ join numbers and units greedily instead of allowing them into
+ separate function arguments
*/
%nonassoc NUMBER_IDENTIFIER
%token EMBEDDED_LILY "#{"
%token BOOK_IDENTIFIER
+%token CHORD_BODY_IDENTIFIER
%token CHORD_MODIFIER
%token CHORD_REPETITION
%token CONTEXT_DEF_IDENTIFIER
%token NUMBER_IDENTIFIER
%token OUTPUT_DEF_IDENTIFIER
%token REAL
+%token REPEAT_IDENTIFIER
%token RESTNAME
%token SCM_ARG
%token SCM_FUNCTION
TEMPO steno_duration '=' tempo_range {
$$ = MAKE_SYNTAX ("tempo", @$, SCM_EOL, $2, $4);
}
- | TEMPO scalar_closed steno_duration '=' tempo_range {
+ | TEMPO scalar steno_duration '=' tempo_range {
$$ = MAKE_SYNTAX ("tempo", @$, $2, $3, $5);
}
| TEMPO scalar {
$$ = MAKE_SYNTAX ("tempo", @$, $2);
- }
+ } %prec ':'
;
/*
{
$$ = MAKE_SYNTAX ("repeat", @$, $2, $3, $4, SCM_EOL);
}
+ | REPEAT_IDENTIFIER music
+ {
+ $$ = MAKE_SYNTAX ("repeat", @$, scm_car ($1), scm_cdr ($1),
+ $2, SCM_EOL);
+ }
| REPEAT simple_string unsigned_number music ALTERNATIVE braced_music_list
{
$$ = MAKE_SYNTAX ("repeat", @$, $2, $3, $4, $6);
}
+ | REPEAT_IDENTIFIER music ALTERNATIVE braced_music_list
+ {
+ $$ = MAKE_SYNTAX ("repeat", @$, scm_car ($1), scm_cdr ($1),
+ $2, $4);
+ }
;
sequential_music:
{
$$ = check_scheme_arg (parser, @4, $4, $3, $2);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup post_event_nofinger
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup post_event_nofinger
{
$$ = check_scheme_arg (parser, @4, $4, $3, $2);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup '-' UNSIGNED
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' UNSIGNED
{
SCM n = scm_difference ($5, SCM_UNDEFINED);
if (scm_is_true (scm_call_1 ($2, n)))
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup '-' REAL
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' REAL
{
$$ = check_scheme_arg (parser, @4,
scm_difference ($5, SCM_UNDEFINED),
$3, $2);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup '-' NUMBER_IDENTIFIER
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' NUMBER_IDENTIFIER
{
$$ = check_scheme_arg (parser, @4,
scm_difference ($5, SCM_UNDEFINED),
{
$$ = check_scheme_arg (parser, @4, $4, $3, $2);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup bare_number_closed
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup bare_number_closed
{
$$ = check_scheme_arg (parser, @4, $4, $3, $2);
}
(parser, @4, $4),
$3, $2);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup bare_number_common
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup bare_number_common
{
$$ = check_scheme_arg (parser, @4, $4, $3, $2);
}
else
MYREPARSE (@4, $2, SCM_ARG, $4);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup UNSIGNED
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup UNSIGNED
{
$$ = $3;
if (scm_is_true (scm_call_1 ($2, $4)))
MYREPARSE (@4, $2, DURATION_IDENTIFIER, d);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_nonbackup DURATION_IDENTIFIER {
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup DURATION_IDENTIFIER {
$$ = $3;
MYREPARSE (@4, $2, DURATION_IDENTIFIER, $4);
}
| function_arglist_common
;
-function_arglist_closed_backup:
- function_arglist_backup_common
- | function_arglist_closed_common
- ;
-
function_arglist_backup_common:
EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup embedded_scm_arg_closed
{
MYBACKUP (SCM_ARG, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup post_event_nofinger
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup REPEAT simple_string unsigned_number
+ {
+ $4 = MAKE_SYNTAX ("repeat", @4, $5, $6,
+ MY_MAKE_MUSIC ("Music", @4)->unprotect (),
+ SCM_EOL);
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = $3;
+ MYREPARSE (@4, $2, REPEAT_IDENTIFIER, scm_cons ($5, $6));
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (REPEAT_IDENTIFIER, scm_cons ($5, $6), @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup chord_body
+ {
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = $3;
+ MYREPARSE (@4, $2, CHORD_BODY_IDENTIFIER, $4);
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (CHORD_BODY_IDENTIFIER, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup post_event_nofinger
{
if (scm_is_true (scm_call_1 ($2, $4)))
{
MYBACKUP (LYRIC_ELEMENT, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup UNSIGNED
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup UNSIGNED
{
if (scm_is_true (scm_call_1 ($2, $4)))
{
}
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup REAL
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup REAL
{
if (scm_is_true (scm_call_1 ($2, $4)))
{
MYBACKUP (REAL, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup NUMBER_IDENTIFIER
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup NUMBER_IDENTIFIER
{
if (scm_is_true (scm_call_1 ($2, $4)))
{
MYBACKUP (FRACTION, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup '-' UNSIGNED
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup '-' UNSIGNED
{
SCM n = scm_difference ($5, SCM_UNDEFINED);
if (scm_is_true (scm_call_1 ($2, n))) {
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup '-' REAL
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup '-' REAL
{
SCM n = scm_difference ($5, SCM_UNDEFINED);
if (scm_is_true (scm_call_1 ($2, n))) {
MYBACKUP (REAL, n, @5);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup '-' NUMBER_IDENTIFIER
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup '-' NUMBER_IDENTIFIER
{
SCM n = scm_difference ($5, SCM_UNDEFINED);
if (scm_is_true (scm_call_1 ($2, n))) {
MYBACKUP (TONICNAME_PITCH, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_backup DURATION_IDENTIFIER
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup DURATION_IDENTIFIER
{
if (scm_is_true (scm_call_1 ($2, $4)))
{
MYBACKUP (STRING, $4, @4);
}
}
+ | function_arglist_backup REPARSE music_assign
+ {
+ if (scm_is_true (scm_call_1 ($2, $3)))
+ $$ = scm_cons ($3, $1);
+ else
+ $$ = check_scheme_arg (parser, @3,
+ make_music_from_simple
+ (parser, @3, $3),
+ $1, $2);
+ }
| function_arglist_backup REPARSE bare_number_common
{
$$ = check_scheme_arg (parser, @3,
{
$$ = check_scheme_arg (parser, @3, $3, $1, $2);
}
- | function_arglist_backup REPARSE pitch_also_in_chords
- {
- $$ = check_scheme_arg (parser, @3, $3, $1, $2);
- }
;
function_arglist:
(parser, @3, $3),
$2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional bare_number_common
+ | EXPECT_SCM function_arglist_optional bare_number_common
{
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional post_event_nofinger
+ | EXPECT_SCM function_arglist_optional post_event_nofinger
{
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional '-' NUMBER_IDENTIFIER
+ | EXPECT_SCM function_arglist_optional '-' NUMBER_IDENTIFIER
{
SCM n = scm_difference ($4, SCM_UNDEFINED);
$$ = check_scheme_arg (parser, @4, n, $2, $1);
// know the predicate to be false.
MYREPARSE (@3, $1, SCM_ARG, $3);
}
- | EXPECT_SCM function_arglist_closed_optional UNSIGNED
+ | EXPECT_SCM function_arglist_optional UNSIGNED
{
$$ = $2;
if (scm_is_true (scm_call_1 ($1, $3)))
MYREPARSE (@3, $1, DURATION_IDENTIFIER, d);
}
}
- | EXPECT_SCM function_arglist_closed_optional DURATION_IDENTIFIER
+ | EXPECT_SCM function_arglist_optional DURATION_IDENTIFIER
{
$$ = $2;
MYREPARSE (@3, $1, DURATION_IDENTIFIER, $3);
}
- | EXPECT_SCM function_arglist_closed_optional '-' UNSIGNED
+ | EXPECT_SCM function_arglist_optional '-' UNSIGNED
{
$$ = $2;
SCM n = scm_difference ($4, SCM_UNDEFINED);
}
}
- | EXPECT_SCM function_arglist_closed_optional '-' REAL
+ | EXPECT_SCM function_arglist_optional '-' REAL
{
$$ = $2;
SCM n = scm_difference ($4, SCM_UNDEFINED);
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional bare_number_common_closed
+ | EXPECT_SCM function_arglist_optional bare_number_common_closed
{
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional '-' NUMBER_IDENTIFIER
+ | EXPECT_SCM function_arglist_optional '-' NUMBER_IDENTIFIER
{
$$ = check_scheme_arg (parser, @3,
scm_difference ($4, SCM_UNDEFINED),
$2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional post_event_nofinger
+ | EXPECT_SCM function_arglist_optional post_event_nofinger
{
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
}
;
-function_arglist_closed_optional:
- function_arglist_closed_backup
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_backup DEFAULT
- {
- $$ = scm_cons (loc_on_music (@4, $1), $3);
- }
- | function_arglist_skip_backup BACKUP
- ;
-
embedded_scm_closed:
embedded_scm_bare
| scm_function_call_closed
| full_markup
;
-scalar_closed:
- embedded_scm_arg_closed
- | SCM_IDENTIFIER
- // for scalar_closed to be an actually closed (no lookahead)
- // expression, we'd need to use bare_number_closed here. It
- // turns out that the only use of scalar_closed in TEMPO is
- // not of the kind requiring the full closedness criterion.
- | bare_number
- | '-' bare_number
- {
- $$ = scm_difference ($2, SCM_UNDEFINED);
- }
- | FRACTION
- | STRING
- | full_markup
- ;
-
-
event_chord:
simple_element post_events {
// Let the rhythmic music iterator sort this mess out.
$$ = MAKE_SYNTAX ("void-music", @1);
}
}
- }
+ } %prec ':'
| simple_chord_elements post_events {
SCM elts = ly_append2 ($1, scm_reverse_x ($2, SCM_EOL));
* i = @$; */
i.set_location (@1, @2);
$$ = MAKE_SYNTAX ("event-chord", i, elts);
- }
+ } %prec ':'
| CHORD_REPETITION optional_notemode_duration post_events {
Input i;
i.set_location (@1, @3);
$$ = MAKE_SYNTAX ("repetition-chord", i,
$2, scm_reverse_x ($3, SCM_EOL));
- }
+ } %prec ':'
| MULTI_MEASURE_REST optional_notemode_duration post_events {
Input i;
i.set_location (@1, @3);
$$ = MAKE_SYNTAX ("multi-measure-rest", i, $2,
scm_reverse_x ($3, SCM_EOL));
- }
+ } %prec ':'
| command_element
| note_chord_element
;
m-> set_property ("elements", es);
m->set_spot (@$);
$$ = m->self_scm ();
- }
+ } %prec ':'
;
chord_body:
{
$$ = MAKE_SYNTAX ("event-chord", @$, scm_reverse_x ($2, SCM_EOL));
}
+ | CHORD_BODY_IDENTIFIER
;
chord_body_elements:
| PITCH_IDENTIFIER
;
-pitch_also_in_chords:
- pitch
- | steno_tonic_pitch
- ;
-
gen_text_def:
full_markup {
Music *t = MY_MAKE_MUSIC ("TextScriptEvent", @$);
maybe_notemode_duration:
{
$$ = SCM_UNDEFINED;
- }
+ } %prec ':'
| multiplied_duration {
$$ = $1;
parser->default_duration_ = *unsmob_duration ($$);
if (scm_is_pair ($3))
unsmob_music ($$)->set_property
("articulations", scm_reverse_x ($3, SCM_EOL));
- }
+ } %prec ':'
;
new_chord:
| steno_tonic_pitch optional_notemode_duration chord_separator chord_items {
SCM its = scm_reverse_x ($4, SCM_EOL);
$$ = make_chord_elements (@$, $1, $2, scm_cons ($3, its));
- }
+ } %prec ':'
;
chord_items:
"text "
"word-space "
"text-direction "
+ "flag-style "
);
else
{
measposp = now;
- context ()->set_property ("measurePosition",
- measposp.smobbed_copy ());
}
- measposp += dt;
-
int current_barnumber = robust_scm2int (get_property ("currentBarNumber"), 0);
int internal_barnumber = robust_scm2int (get_property ("internalBarNumber"), 0);
SCM cad = get_property ("timing");
bool c = to_boolean (cad);
- Rational len = measure_length ();
- while (c && measposp.main_part_ >= len)
+ if (c)
{
- measposp.main_part_ -= len;
- current_barnumber++;
- internal_barnumber++;
+ Rational len = measure_length ();
+
+ measposp += dt;
+
+ while (measposp.main_part_ >= len)
+ {
+ measposp.main_part_ -= len;
+ current_barnumber++;
+ internal_barnumber++;
+ }
}
+
+ // Because "timing" can be switched on and off asynchronously with
+ // graces, measurePosition might get into strange settings of
+ // grace_part_. It does not actually make sense to have it diverge
+ // from the main timing. Updating the grace part outside of the
+ // actual check for "timing" looks strange and will lead to changes
+ // of grace_part_ even when timing is off. However, when timing is
+ // switched back on again, this will generally happen in an override
+ // that does _not_ in itself advance current_moment. So the whole
+ // timing advance logic will only get triggered while "timing" is
+ // still of. Maybe we should keep measurePosition.grace_part_
+ // constantly at zero anyway?
+
+ measposp.grace_part_ = now.grace_part_;
+
+
context ()->set_property ("currentBarNumber", scm_from_int (current_barnumber));
context ()->set_property ("internalBarNumber", scm_from_int (internal_barnumber));
context ()->set_property ("measurePosition", measposp.smobbed_copy ());
#include "align-interface.hh"
#include "axis-group-interface.hh"
#include "engraver.hh"
+#include "international.hh"
#include "spanner.hh"
#include "pointer-group-interface.hh"
#include "grob-array.hh"
/* read */
"alignAboveContext "
- "alignBelowContext ",
+ "alignBelowContext "
+ "hasAxisGroup ",
/* write */
""
void
Vertical_align_engraver::process_music ()
{
- if (!valign_)
+ if (!valign_ && !scm_is_null (id_to_group_hashtab_))
{
+ if (to_boolean (get_property ("hasAxisGroup")))
+ {
+ warning (_ ("Ignoring Vertical_align_engraver in VerticalAxisGroup"));
+ id_to_group_hashtab_ = SCM_EOL;
+ return;
+ }
+
top_level_ = to_boolean (get_property ("topLevelAlignment"));
valign_ = make_spanner (top_level_ ? "VerticalAlignment" : "StaffGrouper", SCM_EOL);
void
Vertical_align_engraver::acknowledge_axis_group (Grob_info i)
{
+ if (scm_is_null (id_to_group_hashtab_))
+ return;
+
if (top_level_ && qualifies (i))
{
string id = i.context ()->id_string ();
a music expression, the result is the same music expression with an
appropriate tweak applied.")
(if (ly:music? item)
- #{ \tweak #property #(offsetter property offsets) #item #}
- (if (check-grob-path item parser location
- #:default 'Bottom
- #:min 2
- #:max 2)
- #{
- \override #item . #property =
- #(offsetter property offsets)
- #}
- (make-music 'Music))))
-
+ ; In case of a tweak, grob property path is Grob.property
+ (let ((prop-path (check-grob-path
+ (if (symbol? property)
+ (list property)
+ property)
+ parser location
+ #:start 1 #:default #t #:min 2 #:max 2)))
+ (if prop-path
+ ; If the head of the grob property path is a symbol--i.e.,
+ ; a grob name, produce a directed tweak. Otherwise, create
+ ; an ordinary tweak.
+ (if (symbol? (car prop-path))
+ #{
+ \tweak #prop-path #(offsetter (second prop-path) offsets) #item
+ #}
+ #{
+ \tweak #(second prop-path) #(offsetter (second prop-path) offsets) #item
+ #})
+ item))
+ ; In case of an override, grob property path is Context.Grob.property.
+ (let ((prop-path (check-grob-path
+ (append item
+ (if (symbol? property)
+ (list property)
+ property))
+ parser location
+ #:default 'Bottom #:min 3 #:max 3)))
+ (if prop-path
+ #{
+ \override #prop-path = #(offsetter (third prop-path) offsets)
+ #}
+ (make-music 'Music)))))
+
omit =
#(define-music-function (parser location item) (symbol-list-or-music?)
(_i "Set @var{item}'s @samp{stencil} property to @code{#f},
%% cadenzas
-cadenzaOn = {
- \set Timing.timing = ##f
- \set Timing.autoBeaming = ##f
-}
-
-cadenzaOff = {
- \set Timing.timing = ##t
- \set Timing.measurePosition = #ZERO-MOMENT
- \set Timing.autoBeaming = ##t
-}
+cadenzaOn = \set Timing.timing = ##f
+cadenzaOff = \set Timing.timing = ##t
%% chord names
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: lilypond 2.17.29\n"
+"Project-Id-Version: lilypond 2.17.95\n"
"Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu."
"lilypond.bugs\n"
-"POT-Creation-Date: 2013-10-20 10:42+0100\n"
+"POT-Creation-Date: 2013-11-04 10:26+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "create PDF files for use with PDFTeX"
msgstr ""
-#: lilypond-book.py:460
+#: lilypond-book.py:463
msgid "Writing snippets..."
msgstr ""
-#: lilypond-book.py:465
+#: lilypond-book.py:468
msgid "Processing..."
msgstr ""
-#: lilypond-book.py:470
+#: lilypond-book.py:473
msgid "All snippets are up to date..."
msgstr ""
-#: lilypond-book.py:472
+#: lilypond-book.py:475
msgid "Linking files..."
msgstr ""
-#: lilypond-book.py:492
+#: lilypond-book.py:495
#, python-format
msgid "cannot determine format for: %s"
msgstr ""
-#: lilypond-book.py:501
+#: lilypond-book.py:504
#, python-format
msgid "%s is up to date."
msgstr ""
-#: lilypond-book.py:514
+#: lilypond-book.py:517
#, python-format
msgid "Writing `%s'..."
msgstr ""
-#: lilypond-book.py:577
+#: lilypond-book.py:580
msgid "Output would overwrite input file; use --output."
msgstr ""
-#: lilypond-book.py:581
+#: lilypond-book.py:584
#, python-format
msgid "Reading %s..."
msgstr ""
-#: lilypond-book.py:588
+#: lilypond-book.py:591
msgid "Dissecting..."
msgstr ""
-#: lilypond-book.py:599
+#: lilypond-book.py:602
#, python-format
msgid "Compiling %s..."
msgstr ""
-#: lilypond-book.py:607
+#: lilypond-book.py:610
#, python-format
msgid "Processing include: %s"
msgstr ""
-#: lilypond-book.py:618
+#: lilypond-book.py:621
#, python-format
msgid "Removing `%s'"
msgstr ""
-#: lilypond-book.py:711
+#: lilypond-book.py:714
#, python-format
msgid "Setting LilyPond's loglevel to %s"
msgstr ""
-#: lilypond-book.py:715
+#: lilypond-book.py:718
#, python-format
msgid ""
"Setting LilyPond's loglevel to %s (from environment variable "
"LILYPOND_LOGLEVEL)"
msgstr ""
-#: lilypond-book.py:718
+#: lilypond-book.py:721
msgid ""
"Setting LilyPond's output to --verbose, implied by lilypond-book's setting"
msgstr ""
msgid "cannot change, already in translator: %s"
msgstr ""
-#: axis-group-engraver.cc:147
+#: axis-group-engraver.cc:149
msgid "Axis_group_engraver: vertical group already has a parent"
msgstr ""
-#: axis-group-engraver.cc:148
+#: axis-group-engraver.cc:150
msgid "are there two Axis_group_engravers?"
msgstr ""
-#: axis-group-engraver.cc:149
+#: axis-group-engraver.cc:151
msgid "removing this vertical group"
msgstr ""
-#: axis-group-interface.cc:704
+#: axis-group-interface.cc:714
#, c-format
msgid "\"%s\" is not a valid outside-staff-placement-directive"
msgstr ""
-#: axis-group-interface.cc:776
+#: axis-group-interface.cc:786
msgid "an outside-staff object should have a direction, defaulting to up"
msgstr ""
msgid "ignoring out-of-range value change for MIDI property `%s'"
msgstr ""
-#: midi-item.cc:92
+#: midi-item.cc:93
#, c-format
msgid "no such MIDI instrument: `%s'"
msgstr ""
-#: midi-item.cc:178
+#: midi-item.cc:179
msgid "Time signature with more than 255 beats. Truncating"
msgstr ""
msgid "ascending vaticana style flexa"
msgstr ""
+#: vertical-align-engraver.cc:95
+msgid "Ignoring Vertical_align_engraver in VerticalAxisGroup"
+msgstr ""
+
#. fixme: be more verbose.
#: volta-engraver.cc:110
msgid "cannot end volta spanner"
msgid "giving up"
msgstr ""
-#: parser.yy:154 parser.yy:168
+#: parser.yy:158 parser.yy:172
msgid "Too much lookahead"
msgstr ""
-#: parser.yy:434 parser.yy:744 parser.yy:810
+#: parser.yy:440 parser.yy:750 parser.yy:816
msgid "bad expression type"
msgstr ""
-#: parser.yy:642 parser.yy:1138
+#: parser.yy:648 parser.yy:1157
msgid "not a context mod"
msgstr ""
-#: parser.yy:845
+#: parser.yy:851
msgid "score expected"
msgstr ""
-#: parser.yy:861
+#: parser.yy:867
msgid "\\paper cannot be used in \\score, use \\layout instead"
msgstr ""
-#: parser.yy:885
+#: parser.yy:891
msgid "need \\paper for paper block"
msgstr ""
-#: parser.yy:1025 parser.yy:1047
+#: parser.yy:1031 parser.yy:1053
msgid "unexpected post-event"
msgstr ""
-#: parser.yy:1055
+#: parser.yy:1061
msgid "Ignoring non-music expression"
msgstr ""
-#: parser.yy:1066 parser.yy:2475
+#: parser.yy:1073 parser.yy:2494
msgid "music expected"
msgstr ""
-#: parser.yy:1353
+#: parser.yy:1372
msgid "not a symbol"
msgstr ""
-#: parser.yy:2146 parser.yy:2260 parser.yy:2273 parser.yy:2282
+#: parser.yy:2182 parser.yy:2296 parser.yy:2309 parser.yy:2318
msgid "bad grob property path"
msgstr ""
-#: parser.yy:2240
+#: parser.yy:2276
msgid "only \\consists and \\remove take non-string argument."
msgstr ""
-#: parser.yy:2301
+#: parser.yy:2337
msgid "bad context property path"
msgstr ""
-#: parser.yy:2402
+#: parser.yy:2438
msgid "simple string expected"
msgstr ""
-#: parser.yy:2420
+#: parser.yy:2456
msgid "symbol expected"
msgstr ""
-#: parser.yy:2584
+#: parser.yy:2606
msgid "not a rhythmic event"
msgstr ""
-#: parser.yy:2658
+#: parser.yy:2680
msgid "post-event expected"
msgstr ""
-#: parser.yy:2667 parser.yy:2672
+#: parser.yy:2689 parser.yy:2694
msgid "have to be in Lyric mode for lyrics"
msgstr ""
-#: parser.yy:2740
+#: parser.yy:2762
msgid "expecting string as script definition"
msgstr ""
-#: parser.yy:2835
+#: parser.yy:2852
msgid "not an articulation"
msgstr ""
-#: parser.yy:2907 parser.yy:2950
+#: parser.yy:2924 parser.yy:2967
msgid "not a duration"
msgstr ""
-#: parser.yy:2967
+#: parser.yy:2984
msgid "bass number expected"
msgstr ""
-#: parser.yy:3066
+#: parser.yy:3083
msgid "have to be in Note mode for notes"
msgstr ""
-#: parser.yy:3125
+#: parser.yy:3142
msgid "have to be in Chord mode for chords"
msgstr ""
-#: parser.yy:3140
+#: parser.yy:3157
msgid "markup outside of text script or \\lyricmode"
msgstr ""
-#: parser.yy:3145
+#: parser.yy:3162
msgid "unrecognized string, not in text script or \\lyricmode"
msgstr ""
-#: parser.yy:3362
+#: parser.yy:3379
msgid "not a markup"
msgstr ""
msgid "assertion failed: ~S"
msgstr ""
-#: translation-functions.scm:368
+#: translation-functions.scm:388
#, scheme-format
msgid "Negative fret for pitch ~a on string ~a"
msgstr ""
-#: translation-functions.scm:371
+#: translation-functions.scm:391
#, scheme-format
msgid "Missing fret for pitch ~a on string ~a"
msgstr ""
-#: translation-functions.scm:414
+#: translation-functions.scm:434
#, scheme-format
msgid "No open string for pitch ~a"
msgstr ""
-#: translation-functions.scm:429 translation-functions.scm:441
+#: translation-functions.scm:449 translation-functions.scm:461
#, scheme-format
msgid "Requested string for pitch requires negative fret: string ~a pitch ~a"
msgstr ""
-#: translation-functions.scm:432
+#: translation-functions.scm:452
msgid "Ignoring string request and recalculating."
msgstr ""
-#: translation-functions.scm:444
+#: translation-functions.scm:464
msgid "Ignoring note in tablature."
msgstr ""
-#: translation-functions.scm:469
+#: translation-functions.scm:489
#, scheme-format
msgid "No string for pitch ~a (given frets ~a)"
msgstr ""
-#: translation-functions.scm:574
+#: translation-functions.scm:594
#, scheme-format
msgid ""
"No label for fret ~a (on string ~a);\n"
def conv(str):
str = re.sub (r"\\stringTuning\s*\\notemode(\s*)@?\{\s*(.*?)\s*@?}",
r"\\stringTuning\1\2", str)
- if re.search (r'\bstaff-padding\b', str):
+ if re.search (r'[^-\w]staff-padding[^-\w]', str):
stderr_write (NOT_SMART % "staff-padding")
stderr_write (_ ("Staff-padding now controls the distance to the baseline, not the nearest point."))
return str
(graceSettings ,list? "Overrides for grace notes. This property
should be manipulated through the @code{add-grace-property} function.")
+
+ (hasAxisGroup ,boolean? "True if the current context is contained
+in an axis group.")
(hasStaffSpacing ,boolean? "True if the current
@code{CommandColumn} contains items that will affect spacing.")
;;; f
;;;
(flag-count ,number? "The number of tremolo beams.")
+ (flag-style ,symbol? "The style of the flag to be used with
+@code{MetronomeMark}. Available are @code{'modern-straight-flag},
+@code{'old-straight-flag}, @code{flat-flag}, @code{mensural} and
+@code{'default}")
(flat-positions ,list? "Flats in key signatures are placed
within the specified ranges of staff-positions. The general form
is a list of pairs, with one pair for each type of clef, in order
(break-visibility . ,end-of-line-invisible)
(direction . ,UP)
(extra-spacing-width . (+inf.0 . -inf.0))
+ (flag-style . default)
(outside-staff-horizontal-padding . 0.2)
(outside-staff-priority . 1000)
(padding . 0.8)
;; The following are used by the \offset function
(define (find-value-to-offset prop self alist)
- "Return the first value of the property @var{prop} in the property alist
-@var{alist} @em{after} having found @var{self}."
+ "Return the first value of the property @var{prop} in the property
+alist @var{alist} -- after having found @var{self}. If @var{self} is
+not found, return the first value of @var{prop}."
(let ((segment (member (cons prop self) alist)))
(if (not segment)
(assoc-get prop alist)
(left-x (+ padding
(max
- (interval-end (ly:grob-robust-relative-extent
- left-span common X))
+ (interval-end (ly:generic-bound-extent
+ left-span common))
(if
(and dots
(close
(ly:grob-robust-relative-extent dots common X))
(- INFINITY-INT)))))
(right-x (max (- (interval-start
- (ly:grob-robust-relative-extent right-span common X))
+ (ly:generic-bound-extent right-span common))
padding)
(+ left-x minimum-length)))
(self-x (ly:grob-relative-coordinate spanner common X))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; metronome marks
-(define-public (format-metronome-markup event context)
- (let ((hide-note (ly:context-property context 'tempoHideNote #f))
- (text (ly:event-property event 'text))
- (dur (ly:event-property event 'tempo-unit))
- (count (ly:event-property event 'metronome-count)))
-
- (metronome-markup text dur count hide-note)))
-
-(define-public (metronome-markup text dur count hide-note)
- (let* ((note-mark (if (and (not hide-note) (ly:duration? dur))
- (make-smaller-markup
- (make-note-by-number-markup (ly:duration-log dur)
- (ly:duration-dot-count dur)
- 1))
- #f))
+;; We give 'styled-metronome-markup' an optional argument, 'glyph-font', to
+;; prepare using other fonts than 'fetaMusic.
+;; Currently it ensures that the default-fonts are used by the
+;; markup-command 'note-by-number' in 'metronome-markup' (see below).
+(define*-public
+ ((styled-metronome-markup #:optional (glyph-font 'default))
+ event context)
+ (let ((hide-note (ly:context-property context 'tempoHideNote #f))
+ (text (ly:event-property event 'text))
+ (dur (ly:event-property event 'tempo-unit))
+ (count (ly:event-property event 'metronome-count)))
+
+ (metronome-markup glyph-font text dur count hide-note)))
+
+(define-public format-metronome-markup
+ (styled-metronome-markup))
+
+(define (metronome-markup glyph-font text dur count hide-note)
+ (let* ((note-mark
+ (if (and (not hide-note) (ly:duration? dur))
+ (make-smaller-markup
+ ;; We insert the (default)-font for flag-glyphs and
+ ;; note-head-glyphs to prepare the possibility to use
+ ;; other fonts and to make possible using
+ ;; \override MetronomeMark #'font-name = #<font-name>
+ ;; without affecting the note/flag-glyphs.
+ (make-override-markup (cons 'font-name glyph-font)
+ (make-note-by-number-markup
+ (ly:duration-log dur)
+ (ly:duration-dot-count dur)
+ UP)))
+ #f))
(count-markup (cond ((number? count)
(if (> count 0)
- (make-simple-markup (number->string count))
+ (make-simple-markup
+ (number->string count))
#f))
((pair? count)
(make-concat-markup
(list
- (make-simple-markup (number->string (car count)))
+ (make-simple-markup
+ (number->string (car count)))
(make-simple-markup " ")
(make-simple-markup "–")
(make-simple-markup " ")
- (make-simple-markup (number->string (cdr count))))))
+ (make-simple-markup
+ (number->string (cdr count))))))
(else #f)))
(note-markup (if (and (not hide-note) count-markup)
(make-concat-markup
xgettext $(XGETTEXT_OPTIONS) --output-dir=$(po-outdir) \
--keyword=_ --keyword=_f --keyword=_i \
$(XGETTEXT_FLAGS) $(ALL_PO_SOURCES)
-endif
endif
sed -i '1,2d' $(po-outdir)/$(package).po
sed -i -e 's/^\# This file is distributed.*/$(sed-header)/' $(po-outdir)/$(package).po
sed -i -e 's/^\"Content-Type: text\/plain.*/$(sed-content)/' $(po-outdir)/$(package).po
+endif
po-update: po