From 0fd5890a32e9cb298853b6b8187a51d6ef7bfbc4 Mon Sep 17 00:00:00 2001 From: David Nalesnik
Date: Sat, 4 Feb 2017 19:13:31 -0600 Subject: [PATCH] Let analysis brackets support text Ability to add labels to brackets is essential for musical analysis. This patch introduces a new grob, "HorizontalBracketText," a spanner created along with "HorizontalBracket" by Horizontal_bracket_engraver. Repeated text of broken brackets is parenthesized. --- Documentation/changes.tely | 18 ++++++++++ Documentation/notation/editorial.itely | 13 ++++++-- .../snippets/new/analysis-brackets-with-labels.ly | 38 ++++++++++++++++++++++ .../regression/horizontal-bracket-broken-texted.ly | 25 ++++++++++++++ input/regression/horizontal-bracket-texted.ly | 36 ++++++++++++++++++++ lily/horizontal-bracket-engraver.cc | 31 +++++++++++++++--- lily/horizontal-bracket.cc | 6 +--- scm/define-grob-interfaces.scm | 5 +++ scm/define-grob-properties.scm | 1 + scm/define-grobs.scm | 18 ++++++++++ scm/output-lib.scm | 27 +++++++++++++++ 11 files changed, 206 insertions(+), 12 deletions(-) create mode 100644 Documentation/snippets/new/analysis-brackets-with-labels.ly create mode 100644 input/regression/horizontal-bracket-broken-texted.ly create mode 100644 input/regression/horizontal-bracket-texted.ly diff --git a/Documentation/changes.tely b/Documentation/changes.tely index 2a64778..f205d00 100644 --- a/Documentation/changes.tely +++ b/Documentation/changes.tely @@ -62,6 +62,24 @@ which scares away people. @end ignore @item +It is now possible to add text to analysis brackets through the address@hidden object. address@hidden,verbatim] +\layout { + \context { + \Voice + \consists "Horizontal_bracket_engraver" + } +} + +{ + \once \override HorizontalBracketText.text = "a" + c''\startGroup d''\stopGroup + e''-\tweak text "a'" \startGroup d''\stopGroup +} address@hidden lilypond + address@hidden The ends of hairpins may now be fine-tuned using the @code{shorten-pair} grob property, which previously only affected text-spanners like @code{TupletBracket} and @code{OttavaBracket}. Positive values offset diff --git a/Documentation/notation/editorial.itely b/Documentation/notation/editorial.itely index 458fce1..8dc3ac9 100644 --- a/Documentation/notation/editorial.itely +++ b/Documentation/notation/editorial.itely @@ -879,12 +879,19 @@ Analysis brackets may be nested. } @end lilypond address@hidden -Snippets: address@hidden annotations}. address@hidden address@hidden,quote,ragged-right,texidoc,doctitle] +{analysis-brackets-above-the-staff.ly} + address@hidden,quote,ragged-right,texidoc,doctitle] +{analysis-brackets-with-labels.ly} + address@hidden Internals Reference: @rinternals{Horizontal_bracket_engraver}, @rinternals{HorizontalBracket}, @rinternals{horizontal-bracket-interface}, address@hidden, address@hidden, @rinternals{Staff}. diff --git a/Documentation/snippets/new/analysis-brackets-with-labels.ly b/Documentation/snippets/new/analysis-brackets-with-labels.ly new file mode 100644 index 0000000..30ae349 --- /dev/null +++ b/Documentation/snippets/new/analysis-brackets-with-labels.ly @@ -0,0 +1,38 @@ +\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 +} diff --git a/input/regression/horizontal-bracket-broken-texted.ly b/input/regression/horizontal-bracket-broken-texted.ly new file mode 100644 index 0000000..1f84552 --- /dev/null +++ b/input/regression/horizontal-bracket-broken-texted.ly @@ -0,0 +1,25 @@ +\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 +} diff --git a/input/regression/horizontal-bracket-texted.ly b/input/regression/horizontal-bracket-texted.ly new file mode 100644 index 0000000..dc1a673 --- /dev/null +++ b/input/regression/horizontal-bracket-texted.ly @@ -0,0 +1,36 @@ +\version "2.19.55" + +\header { + texidoc = "Labels may be added to analysis brackets through the address@hidden 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 +} diff --git a/lily/horizontal-bracket-engraver.cc b/lily/horizontal-bracket-engraver.cc index 6dd34c1..1f176a3 100644 --- a/lily/horizontal-bracket-engraver.cc +++ b/lily/horizontal-bracket-engraver.cc @@ -33,6 +33,7 @@ class Horizontal_bracket_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Horizontal_bracket_engraver); vector