@end ignore
+@item
+It is now possible to add text to analysis brackets through the
+@code{HorizontalBracketText} object.
+@lilypond[quote,verbatim]
+\layout {
+ \context {
+ \Voice
+ \consists "Horizontal_bracket_engraver"
+ }
+}
+
+{
+ \once \override HorizontalBracketText.text = "a"
+ c''\startGroup d''\stopGroup
+ e''-\tweak text "a'" \startGroup d''\stopGroup
+}
+@end lilypond
+
@item
The ends of hairpins may now be fine-tuned using the @code{shorten-pair}
grob property, which previously only affected text-spanners like
}
@end lilypond
-@seealso
-Snippets:
-@rlsr{Editorial annotations}.
+@snippets
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
+{analysis-brackets-above-the-staff.ly}
+
+@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
+{analysis-brackets-with-labels.ly}
+
+@seealso
Internals Reference:
@rinternals{Horizontal_bracket_engraver},
@rinternals{HorizontalBracket},
@rinternals{horizontal-bracket-interface},
+@rinternals{HorizontalBracketText},
+@rinternals{horizontal-bracket-text-interface},
@rinternals{Staff}.
--- /dev/null
+% DO NOT EDIT this file manually; it is automatically
+% generated from Documentation/snippets/new
+% Make any changes in Documentation/snippets/new/
+% and then run scripts/auxiliar/makelsr.py
+%
+% This file is in the public domain.
+%% Note: this file works from version 2.19.55
+\version "2.19.55"
+
+\header {
+ lsrtags = "editorial-annotations, tweaks-and-overrides"
+
+ texidoc = "
+Text may be added to analysis brackets through the @code{text} property
+of the @code{HorizontalBracketText} grob. Adding different texts to
+brackets beginning at the same time requires the @code{\\tweak} command.
+Bracket text will be parenthesized after a line break.
+
+"
+ doctitle = "Analysis brackets with labels"
+} % begin verbatim
+
+
+\layout {
+ \context {
+ \Voice
+ \consists "Horizontal_bracket_engraver"
+ \override HorizontalBracket.direction = #UP
+ }
+}
+
+{
+ \once\override HorizontalBracketText.text = "a"
+ c''\startGroup d''\stopGroup
+ \once\override HorizontalBracketText.text = "a'"
+ e''\startGroup d''\stopGroup
+ c''
+ -\tweak text \markup \bold \huge "b" \startGroup
+ -\tweak text "a" \startGroup
+ d''\stopGroup
+ e''-\tweak text "a'" \startGroup
+ d''\stopGroup\stopGroup
+ c''-\tweak text foo \startGroup d'' e'' f''
+ \break
+ g'' a'' b'' c'''\stopGroup
+}
allowing-fingerings-to-be-printed-inside-the-staff.ly
alternative-bar-numbering.ly
analysis-brackets-above-the-staff.ly
+analysis-brackets-with-labels.ly
applying-note-head-styles-depending-on-the-step-of-the-scale.ly
avoiding-collisions-with-chord-fingerings.ly
blanking-staff-lines-using-the--whiteout-command.ly
--- /dev/null
+\version "2.19.55"
+
+\header {
+ lsrtags = "editorial-annotations, tweaks-and-overrides"
+
+ texidoc = "
+Text may be added to analysis brackets through the @code{text} property
+of the @code{HorizontalBracketText} grob. Adding different texts to
+brackets beginning at the same time requires the @code{\tweak} command.
+Bracket text will be parenthesized after a line break.
+
+"
+ doctitle = "Analysis brackets with labels"
+}
+
+\layout {
+ \context {
+ \Voice
+ \consists "Horizontal_bracket_engraver"
+ \override HorizontalBracket.direction = #UP
+ }
+}
+
+{
+ \once\override HorizontalBracketText.text = "a"
+ c''\startGroup d''\stopGroup
+ \once\override HorizontalBracketText.text = "a'"
+ e''\startGroup d''\stopGroup
+ c''
+ -\tweak text \markup \bold \huge "b" \startGroup
+ -\tweak text "a" \startGroup
+ d''\stopGroup
+ e''-\tweak text "a'" \startGroup
+ d''\stopGroup\stopGroup
+ c''-\tweak text foo \startGroup d'' e'' f''
+ \break
+ g'' a'' b'' c'''\stopGroup
+}
altering-the-length-of-beamed-stems.ly
alternative-bar-numbering.ly
analysis-brackets-above-the-staff.ly
+analysis-brackets-with-labels.ly
asymmetric-slurs.ly
avoiding-collisions-with-chord-fingerings.ly
caesura-railtracks-with-fermata.ly
--- /dev/null
+\version "2.19.55"
+
+\header {
+ texidoc = "Text is parenthesized when analysis brackets cross line
+breaks.
+"
+}
+
+\layout {
+ \context {
+ \Voice
+ \consists "Horizontal_bracket_engraver"
+ }
+}
+
+{
+ c''
+ -\tweak text \markup \draw-circle #1 #0.5 ##f \startGroup
+ -\tweak text "a" \startGroup
+ d'' e'' f''
+ g'' a'' b'' c'''\stopGroup
+ c'''-\tweak text "a'" \startGroup b'' a'' g''
+ \break
+ f'' e'' d'' c''\stopGroup\stopGroup
+}
--- /dev/null
+\version "2.19.55"
+
+\header {
+ texidoc = "Labels may be added to analysis brackets through the
+@code{text} property of the @code{HorizontalBracketText} object. Use of
+the @code{\tweak} command is necessary for assigning text uniquely to
+brackets beginning at the same moment. Text assignments reflect the
+usual nesting order of brackets.
+"
+}
+
+\layout {
+ \context {
+ \Voice
+ \consists "Horizontal_bracket_engraver"
+ \override HorizontalBracket.direction = #UP
+ }
+}
+
+\relative c'' {
+ \time 3/4
+ \key f \major
+ c4
+ -\tweak text "contrasting period" \startGroup
+ -\tweak text "a" \startGroup
+ a8( bes c f)
+ f4( e d)
+ c d8( c bes c)
+ \appoggiatura bes4 a2 g4\stopGroup
+ \once\override HorizontalBracketText.text = "b"
+ f'8 \startGroup
+ r a, r d r
+ c4( e, f)
+ g8( bes) a4 g8( f)
+ f2 \stopGroup \stopGroup r4
+}
public:
TRANSLATOR_DECLARATIONS (Horizontal_bracket_engraver);
vector<Spanner *> bracket_stack_;
+ vector<Spanner *> text_stack_;
vector<Stream_event *> events_;
vsize pop_count_;
vsize push_count_;
ly_symbol2scm ("columns"), gi.grob ());
add_bound_item (bracket_stack_[i],
gi.grob ());
+ add_bound_item (text_stack_[i],
+ gi.grob ());
}
}
{
Spanner *sp = make_spanner ("HorizontalBracket", events_[k]->self_scm ());
+ Spanner *hbt = make_spanner ("HorizontalBracketText", events_[k]->self_scm ());
+
+ sp->set_object ("bracket-text", hbt->self_scm ());
+
+ Side_position_interface::add_support (hbt, sp);
+
+ hbt->set_parent (sp, X_AXIS);
+ hbt->set_parent (sp, Y_AXIS);
+ hbt->set_object ("bracket", sp->self_scm ());
+
for (vsize i = 0; i < bracket_stack_.size (); i++)
/* sp is the smallest, it should be added to the bigger brackets. */
- Side_position_interface::add_support (bracket_stack_[i], sp);
+ {
+ Side_position_interface::add_support (bracket_stack_[i], sp);
+ Side_position_interface::add_support (bracket_stack_[i], hbt);
+ }
+
bracket_stack_.push_back (sp);
+ text_stack_.push_back (hbt);
}
}
Horizontal_bracket_engraver::stop_translation_timestep ()
{
for (vsize i = pop_count_; i--;)
- if (bracket_stack_.size ())
- bracket_stack_.pop_back ();
+ {
+ if (bracket_stack_.size ())
+ bracket_stack_.pop_back ();
+ if (text_stack_.size ())
+ text_stack_.pop_back ();
+ }
pop_count_ = 0;
push_count_ = 0;
events_.clear ();
" purposes.",
/* create */
- "HorizontalBracket ",
+ "HorizontalBracket "
+ "HorizontalBracketText ",
/* read */
"",
}
}
-/*
- TODO:
-
- Support texts on the brackets?
-*/
MAKE_SCHEME_CALLBACK (Horizontal_bracket, print, 1);
SCM
Horizontal_bracket::print (SCM smob)
/* properties */
"bracket-flare "
+ "bracket-text "
"columns "
"edge-height "
"shorten-pair "
for (; scm_is_pair(s); s = scm_cdr(s)) {
SCM predicate = scm_car(s);
- if (predicate == Lily::markup_list_p)
+ if (scm_is_eq (predicate, SCM (Lily::markup_list_p)))
push_extra_token (here_input (), EXPECT_MARKUP_LIST);
- else if (predicate == Lily::markup_p)
+ else if (scm_is_eq (predicate, SCM (Lily::markup_p)))
push_extra_token (here_input (), EXPECT_MARKUP);
else
push_extra_token (here_input (), EXPECT_SCM, predicate);
cs = SCM_CAR (cs);
}
- if (scm_is_eq (cs, Lily::ly_music_p))
+ if (scm_is_eq (cs, SCM (Lily::ly_music_p)))
funtype = MUSIC_FUNCTION;
- else if (scm_is_eq (cs, Lily::ly_event_p))
+ else if (scm_is_eq (cs, SCM (Lily::ly_event_p)))
funtype = EVENT_FUNCTION;
else if (ly_is_procedure (cs))
funtype = SCM_FUNCTION;
for (Variable_record *p = variables_; p; )
{
Variable_record *next = p->next_;
- if (SCM_UNBNDP (*p->var_))
+ if (SCM_UNBNDP (SCM (*p->var_)))
error (_f ("Uninitialized variable `%s' in module (%s)", p->name_, name_));
delete p;
p = next;
SCM val,
SCM /* result */)
{
- SCM module = (SCM) closure;
+ SCM module = *static_cast<SCM *> (closure);
if (to_boolean (scm_variable_bound_p (val)))
scm_module_define (module, key, scm_variable_ref (val));
return SCM_EOL;
#define FUNC_NAME __FUNCTION__
SCM_VALIDATE_MODULE (1, src);
scm_internal_hash_fold ((scm_t_hash_fold_fn) &module_define_closure_func,
- (void *) dest,
+ static_cast<void *> (&dest),
SCM_EOL, SCM_MODULE_OBARRAY (src));
return SCM_UNSPECIFIED;
}
{
SCM this_pos = scm_car (c);
line_posns.push_back (scm_to_double (this_pos));
- if (scm_gr_p (this_pos, lowest_line_pos))
+ if (scm_is_true (scm_gr_p (this_pos, lowest_line_pos)))
lowest_line_pos = this_pos;
}
'(columns
common-shortest-duration))
+(ly:add-interface
+ 'horizontal-bracket-text-interface
+ "Label for an analysis bracket."
+ '(bracket columns))
+
(ly:add-interface
'inline-accidental-interface
"An inlined accidental (i.e. normal accidentals, cautionary
column as start/@/begin point. Only columns that have grobs or act as
bounds are spaced.")
(bracket ,ly:grob? "The bracket for a number.")
+ (bracket-text ,ly:grob? "The text for an analysis bracket.")
(c0-position ,integer? "An integer indicating the position of
middle@tie{}C.")
side-position-interface
spanner-interface))))))
+ (HorizontalBracketText
+ . (
+ (direction . ,ly:horizontal-bracket-text::calc-direction)
+ (font-size . -1)
+ (padding . 0.5)
+ (parent-alignment-X . ,CENTER)
+ (self-alignment-X . ,CENTER)
+ (side-axis . ,Y)
+ (stencil . ,ly:horizontal-bracket-text::print)
+ (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent)
+ (Y-offset . ,side-position-interface::y-aligned-side)
+ (meta . ((class . Spanner)
+ (interfaces . (font-interface
+ horizontal-bracket-text-interface
+ outside-staff-interface
+ self-alignment-interface
+ side-position-interface
+ text-interface))))))
(InstrumentName
. (
X)))
num))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; HorizontalBracketText
+
+(define-public (ly:horizontal-bracket-text::print grob)
+ (let ((text (ly:grob-property grob 'text)))
+ (if (or (null? text)
+ (equal? text "")
+ (equal? text empty-markup))
+ (begin
+ (ly:grob-suicide! grob)
+ '())
+ (let* ((orig (ly:grob-original grob))
+ (siblings (ly:spanner-broken-into orig))
+ (text
+ (if (or (null? siblings)
+ (eq? grob (car siblings)))
+ text
+ (if (string? text)
+ (string-append "(" text ")")
+ (make-parenthesize-markup text)))))
+ (grob-interpret-markup grob text)))))
+
+(define-public (ly:horizontal-bracket-text::calc-direction grob)
+ (let* ((bracket (ly:grob-object grob 'bracket))
+ (bracket-dir (ly:grob-property bracket 'direction DOWN)))
+ bracket-dir))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; make-engraver helper macro