+pl5.jcn2
+ - extender-*, see input/test/extender.ly
+ - bf: half-beam length (urg)
+ - fixes: standchen, star
+
pl5.jcn1
- tex/lily-ps-defs.tex fixes
- lily.ps
* latex bla.tex broken (titles / \lilyfooter stuff?)
- * acc placement: \score { \notes \key G; \transpose\notes { a b c } }
-
* --safe: disallow backslashes, disallow \include.
* msgfmt -o check?
* zip target for binary windows dist (JBR)
- * text continuations
-
* revise documentation
* abbrev -> tremolo
MAJOR_VERSION=1
MINOR_VERSION=1
PATCH_LEVEL=5
-MY_PATCH_LEVEL=jcn1
+MY_PATCH_LEVEL=jcn2
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
\name LyricVoice ;
\consists "Separating_line_group_engraver";
\consists "Lyric_engraver";
+ \consists "Extender_engraver";
\consists "Beam_req_swallow_translator";
\consists "Plet_swallow_engraver";
}
\accepts "Voice";
};
+% huh, Score should do HaraKiri, not Part yes?
OrchestralPartStaffContext = \translator {
\HaraKiriStaffContext
barColumnPriority = "0";
(define
(experimental-on-tex) "\\turnOnExperimentalFeatures")
+(define
+ (extender o h)
+ ((invoke-output o "invoke-dim1") "extender" h))
+
(define
(fatdoublebar o h)
((invoke-output o "invoke-dim1") "fatdoublebar" h))
"param" = \table {
"brace" "pianobrace" 1 0.0\pt 0.0\pt 32.0\pt 80.0\pt
"bracket" "staffbracket" 1 0.0\pt 4.0\pt 16.0\pt 128.0\pt
+ "extender" "extender" 1 0.0\pt 0.0\pt 1.0\pt 160.0\pt
"time_signature" "generalmeter" 2 0.0\pt 10.0\pt -8.0\pt 8.0\pt
"rule" "rulesym" 2
"stem" "stem" 2
% dims ignored for this table
"param" = \table {
"bracket" "staffbracket" 1 0.0\pt 0.0\pt 20.0\pt 160.0\pt
+ "extender" "extender" 1 0.0\pt 0.0\pt 1.0\pt 160.0\pt
"rule" "rulesym" 2
"brace" "pianobrace" 1 0.0\pt 0.0\pt 40.0\pt 100.0\pt
"time_signature" "generalmeter" 2 0.0\pt 10.0\pt -5.0\pt 5.0\pt
--- /dev/null
+\score{
+ <
+ \type Staff \notes { c () c () c c }
+ \type Lyrics \lyrics { bla __ alb xxx __ yyy }
+ >
+}
>
>
\paper{
+ \translator { \HaraKiriStaffContext }
+%uh?
+% \translator { \OrchestralScoreContext }
+% \translator { \OrchestralPartStaffContext }
+ }
linewidth = 40.0\mm;
}
}
}
$staff1_voice_1 = \notes {
- [a8.()fis16] d4 fis4 a4 d'2 [fis'8. e'16] d'4 fis4 gis4 a2 [a8 a8] fis'4. e'8
- d'4 cis'2 [b8. cis'16] d'4 d'4 a4 fis4 d4 [a8. fis16] fis4 d4 [fis'8.
- fis'16] fis'4 g'4 a'4 a'2 [g'8 fis'8] e'4 fis'4 g'4 g'2 g'4 fis'4. e'8 d'4
- cis'2 [b8. cis'16] d'4 fis4 gis4 a2 a4 d'4 d'4 [d'8()cis'8] b4 b4 b4 e'4 [g'8
-()fis'8] [e'8()d'8] d'4~cis'4 [a8. a16] d'4.~e'8 [fis'8 g'8] a'2 [d'8 e'8]
- fis'4. g'8 e'4 d'2 s4 }
+ [a8.()fis16] d4 fis4 a4 d'2 [fis'8. e'16] d'4 fis4 gis4 a2 [a8 a8]
+ fis'4. e'8 d'4 cis'2 [b8. cis'16] d'4 d'4 a4 fis4 d4 [a8. fis16]
+ fis4 d4 [fis'8. fis'16] fis'4 g'4 a'4 a'2 [g'8 fis'8] e'4 fis'4
+ g'4 g'2 g'4 fis'4. e'8 d'4 cis'2 [b8. cis'16] d'4 fis4 gis4 a2 a4
+ d'4 d'4 [d'8()cis'8] b4 b4 b4 e'4 [g'8 ()fis'8] [e'8()d'8]
+ d'4~cis'4 [a8. a16] d'4.~e'8 [fis'8 g'8] a'2 [d'8 e'8] fis'4. g'8
+ e'4 d'2 s4
+}
$staff1_voice_2 = \notes {
- [a8.()fis16] a,4 d4 e4 d4~fis4 [fis8. fis16] fis4 d4 d4 cis2 [e8 e8] a4. a8
- a4 a2 [a8. a16] a4 a4 a4 fis4 d4 [a8. fis16] fis4 d4 r4 a4 a4 d'4 d'2
- [a8 a8] cis'4 cis'4 cis'4 cis'2 a4 a4. a8 a4 a2 [a8. a16] d4 d4 d4
- cis2 e4 fis4 e4 d4 d4 d4 dis4 g4 [g8()dis8] e4 e2 [e8. e16] d4.~a8 [a8 a8]
- a2 [g8 g8] a4. a8 g4 fis2 s4 }
+ [a8.()fis16] a,4 d4 e4 d4~fis4 [fis8. fis16] fis4 d4 d4 cis2 [e8
+ e8] a4. a8 a4 a2 [a8. a16] a4 a4 a4 fis4 d4 [a8. fis16] fis4 d4 r4
+ a4 a4 d'4 d'2 [a8 a8] cis'4 cis'4 cis'4 cis'2 a4 a4. a8 a4 a2 [a8.
+ a16] d4 d4 d4 cis2 e4 fis4 e4 d4 d4 d4 dis4 g4 [g8()dis8] e4 e2
+ [e8. e16] d4.~a8 [a8 a8] a2 [g8 g8] a4. a8 g4 fis2 s4
+}
$staff2_voice_1 = \notes {
- r4 fis4 a4 a4 b2 [cis'8. cis'16] b4 b4 b4 a2 [cis'8 cis'8] d'4. cis'8
- d'4 e'2 [e'8. e'16] d'4 d'4 a4 fis4 d4 r4 fis4 d4 r4 d4 e4 fis4 fis'2
- [e'8 d'8] e'4 e'4 e'4 e'2 cis'4 d'4. cis'8 d'4 e'2 [e'8. e'16] a4 a4
- e4 e2 cis'4 a4 a4 a4 g4 g4 b4 b4 b4 b4 a2 [cis'8. cis'16] a4.~cis'8
- [d'8 d'8] d'2 [d'8 d'8] d'4. d'8 cis'4 a2 s4 }
+ r4 fis4 a4 a4 b2 [cis'8. cis'16] b4 b4 b4 a2 [cis'8 cis'8] d'4.
+ cis'8 d'4 e'2 [e'8. e'16] d'4 d'4 a4 fis4 d4 r4 fis4 d4 r4 d4 e4
+ fis4 fis'2 [e'8 d'8] e'4 e'4 e'4 e'2 cis'4 d'4. cis'8 d'4 e'2
+ [e'8. e'16] a4 a4 e4 e2 cis'4 a4 a4 a4 g4 g4 b4 b4 b4 b4 a2
+ [cis'8. cis'16] a4.~cis'8 [d'8 d'8] d'2 [d'8 d'8] d'4. d'8 cis'4
+ a2 s4
+}
$staff2_voice_2 = \notes {
- r4 d4 d4 cis4 b,2 [ais,8. ais,16] b,4 b,4 e4 a,2 [a8 a8] d4. e8 [fis8 g8]
- a2 [g8. g16] fis4 fis4 a4 fis4 d4 r4 fis4 d4 r4 d4 d4 d4 d2 [d8 d8] a4
- a4 a4 a2 a,4 d4. e8 [fis8 g8] a2 [g8. g16] fis4 d4 e4 a,2 a4 d4 e4 fis4
- g4 g4 fis4 e4 [e8()fis8] [g8()gis8] a2 [g8. g16] fis4.~a,8 [d8 e8] fis2 [b8 b8]
- a4. a8 a,4 d2 s4 }
+ r4 d4 d4 cis4 b,2 [ais,8. ais,16] b,4 b,4 e4 a,2 [a8 a8] d4. e8
+ [fis8 g8] a2 [g8. g16] fis4 fis4 a4 fis4 d4 r4 fis4 d4 r4 d4 d4 d4
+ d2 [d8 d8] a4 a4 a4 a2 a,4 d4. e8 [fis8 g8] a2 [g8. g16] fis4 d4
+ e4 a,2 a4 d4 e4 fis4 g4 g4 fis4 e4 [e8()fis8] [g8()gis8] a2 [g8.
+ g16] fis4.~a,8 [d8 e8] fis2 [b8 b8] a4. a8 a,4 d2 s4
+}
$text1 = \lyrics{
- Oh4 say. can you see,2 by8. the16 dawn's4 ear- ly light2 What8 so8 proud-4. ly8 we4 hailed,2
- At8. the16 twi-4 light's last gleam- ing. Whose8. broad16
+ Oh4 __ say. can you see,2 by8. the16 dawn's4 ear- ly light2 What8
+ so8 proud-4. ly8 we4 hailed,2 At8. the16 twi-4 light's last gleam-
+ ing. Whose8. broad16
}
$text2 = \lyrics{
- _4 stripes and bright stars,2 through8 the8 per-4 il- ous fight,2 O'er8 the8 ram-4. parts8
- we4 watched,2 were8. so16 gal-4 lant- ly _ _ _
+ _4 stripes and bright stars,2 through8 the8 per-4 il- ous fight,2
+ O'er8 the8 ram-4. parts8 we4 watched,2 were8. so16 gal-4 lant- ly
+ _ _ _
}
$text3 = \lyrics{
- stream-4 ing. And8. the16 rock-4 ets' red glare,2 the8 bombs8 burst-4 ing in air,2 gave4
- proof4. through8 the4 night2 that8. our16 flag4 was still there,2 Oh4 say, does that
- star- span- gled ban- ner yet wave,2 O'er8. the16 land2 of8 the8 free2 and8 the8
- home4. of8 the4 brave.2
+ stream-4 ing. And8. the16 rock-4 ets' red glare,2 the8 bombs8
+ burst-4 ing in air,2 gave4 proof4. through8 the4 night2 that8.
+ our16 flag4 was still there,2 Oh4 say, does that star- span-
+ gled ban- ner yet wave,2 __ O'er8. the16 land2 __ of8 the8 free2
+ and8 the8 home4. of8 the4 brave.2
}
global = \notes {
\score{
\type GrandStaff <
\type Staff=staffA <
- % urg, ugly bug
- %\global
- \notes \transpose c'' \global
+ \global
\notes \transpose c'' {\voiceone \$staff1_voice_1 }
\notes \transpose c'' {\voicetwo \$staff1_voice_2 }
>
Molecule leftbeams;
Molecule rightbeams;
+ // UGH
+ Real nw_f = paper ()->note_width () * 0.8;
+
/* half beams extending to the left. */
if (prev)
{
but let's make sure two half-beams never touch
*/
Real w = here->hpos_f () - prev->hpos_f ();
- w = w/2 <? paper ()->note_width ();
+ w = w/2 <? nw_f;
Atom a;
if (lhalfs) // generates warnings if not
a = lookup_l ()->beam (sl, w, beam_f);
rightbeams.add_atom (b);
}
// TODO: notehead widths differ for different types
- gap_f = paper ()->note_width () / 2;
+ gap_f = nw_f / 2;
w -= 2 * gap_f;
a = lookup_l ()->beam (sl, w + stemdx, beam_f);
}
rightbeams.add_atom (b);
}
- w = w/2 <? paper ()->note_width ();
+ w = w/2 <? nw_f;
if (rhalfs)
a = lookup_l ()->beam (sl, w, beam_f);
--- /dev/null
+/*
+ extender-engraver.cc -- implement Extender_engraver
+
+ (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include "proto.hh"
+#include "musical-request.hh"
+#include "extender-engraver.hh"
+#include "extender-spanner.hh"
+#include "text-def.hh"
+#include "score-column.hh"
+#include "text-item.hh"
+
+IMPLEMENT_IS_TYPE_B1 (Extender_engraver,Engraver);
+ADD_THIS_TRANSLATOR (Extender_engraver);
+
+Extender_engraver::Extender_engraver ()
+{
+ extender_spanner_p_ = 0;
+ span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
+}
+
+void
+Extender_engraver::acknowledge_element (Score_element_info i)
+{
+ Text_item* t = (dynamic_cast<Text_item*> (i.elem_l_));
+ if (!t)
+ return;
+ if (!extender_spanner_p_)
+ return;
+ if (!span_reqs_drul_[LEFT])
+ return;
+
+ if (!extender_spanner_p_->textitem_l_drul_[LEFT])
+ extender_spanner_p_->set_textitem (LEFT, t);
+ else
+ if (span_reqs_drul_[RIGHT] && !extender_spanner_p_->textitem_l_drul_[RIGHT])
+ extender_spanner_p_->set_textitem (RIGHT, t);
+}
+
+bool
+Extender_engraver::do_try_request (Request* req_l)
+{
+ Extender_req* p = dynamic_cast <Extender_req *> (req_l);
+ if (!p)
+ return false;
+
+ if (bool (extender_spanner_p_) == bool (p->spantype == Span_req::START))
+ return false;
+
+ Direction d = (!extender_spanner_p_) ? LEFT : RIGHT;
+ if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (req_l))
+ return false;
+
+ span_reqs_drul_[d] = p;
+ span_mom_drul_[d] = get_staff_info ().musical_l ()->when ();
+ return true;
+}
+
+void
+Extender_engraver::do_removal_processing ()
+{
+ if (extender_spanner_p_)
+ {
+ span_reqs_drul_[LEFT]->warning (_ ("unterminated extender"));
+ extender_spanner_p_->unlink ();
+ delete extender_spanner_p_;
+ extender_spanner_p_ = 0;
+ span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
+ }
+}
+
+void
+Extender_engraver::do_process_requests ()
+{
+ if (extender_spanner_p_ || !span_reqs_drul_[LEFT])
+ return;
+
+ extender_spanner_p_ = new Extender_spanner;
+
+ announce_element (Score_element_info (extender_spanner_p_, span_reqs_drul_[LEFT]));
+}
+
+void
+Extender_engraver::do_pre_move_processing ()
+{
+ if (!extender_spanner_p_ || !span_reqs_drul_[RIGHT])
+ return;
+
+ typeset_element (extender_spanner_p_);
+
+ extender_spanner_p_ = 0;
+ span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
+}
+
--- /dev/null
+/*
+ extender-spanner.cc -- implement Extender_spanner
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include "atom.hh"
+#include "box.hh"
+#include "debug.hh"
+#include "lookup.hh"
+#include "molecule.hh"
+#include "p-col.hh"
+#include "paper-def.hh"
+#include "extender-spanner.hh"
+#include "text-item.hh"
+#include "text-def.hh"
+
+IMPLEMENT_IS_TYPE_B1 (Extender_spanner, Directional_spanner);
+
+Extender_spanner::Extender_spanner ()
+ : Directional_spanner ()
+{
+ textitem_l_drul_[LEFT] = textitem_l_drul_[RIGHT] = 0;
+ dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
+ dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
+}
+
+Extender_spanner::Extender_spanner (Extender_spanner const& c)
+ : Directional_spanner (c)
+{
+ textitem_l_drul_ = c.textitem_l_drul_;
+ dy_f_drul_ = c.dy_f_drul_;
+ dx_f_drul_ = c.dx_f_drul_;
+}
+
+Extender_spanner::~Extender_spanner ()
+{
+}
+
+Offset
+Extender_spanner::center () const
+{
+ Real dx = width ().length ();
+
+ return Offset (dx / 2, 0);
+}
+
+Molecule*
+Extender_spanner::brew_molecule_p () const
+{
+ Molecule* mol_p = new Molecule;
+
+ Real w = width ().length ();
+
+ w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+
+ Atom a = lookup_l ()->extender (w);
+
+ a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
+
+ mol_p->add_atom (a);
+
+ return mol_p;
+}
+
+void
+Extender_spanner::do_add_processing ()
+{
+ Direction d = LEFT;
+ Drul_array<Text_item *> new_textitem_drul = textitem_l_drul_;
+ do {
+ if (!textitem_l_drul_[d])
+ new_textitem_drul[d] = textitem_l_drul_[(Direction)-d];
+ } while (flip(&d) != LEFT);
+ textitem_l_drul_ = new_textitem_drul;
+}
+
+Interval
+Extender_spanner::do_height () const
+{
+ return Interval (0,0);
+}
+
+void
+Extender_spanner::do_post_processing ()
+{
+ assert (textitem_l_drul_[LEFT] || textitem_l_drul_[RIGHT]);
+
+ // UGH
+ Real nw_f = paper ()->note_width () * 0.8;
+
+ Direction d = LEFT;
+ do
+ {
+ Text_item* t = textitem_l_drul_[d] ? textitem_l_drul_[d] : textitem_l_drul_[(Direction)-d];
+
+ dy_f_drul_[d] += t->height ().length () / 2;
+ if (d == LEFT)
+ dx_f_drul_[d] += t->width ().length ();
+ else
+ dx_f_drul_[d] -= d * nw_f / 2;
+
+// dx_f_drul_[d] -= d * nw_f / 4;
+ }
+ while (flip(&d) != LEFT);
+}
+
+void
+Extender_spanner::do_substitute_dependency (Score_element* o, Score_element* n)
+{
+ Text_item* new_l = n ? dynamic_cast<Text_item *> (n) : 0;
+ if (dynamic_cast <Item *> (o) == textitem_l_drul_[LEFT])
+ textitem_l_drul_[LEFT] = new_l;
+ else if (dynamic_cast <Item *> (o) == textitem_l_drul_[RIGHT])
+ textitem_l_drul_[RIGHT] = new_l;
+}
+
+void
+Extender_spanner::set_textitem (Direction d, Text_item* textitem_l)
+{
+ assert (!textitem_l_drul_[d]);
+ textitem_l_drul_[d] = textitem_l;
+ set_bounds (d, textitem_l);
+
+ add_dependency (textitem_l);
+}
+
--- /dev/null
+/*
+ extender-engraver.hh -- declare Extender_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#ifndef EXTENDER_ENGRAVER_HH
+#define EXTENDER_ENGRAVER_HH
+
+#include "engraver.hh"
+#include "drul-array.hh"
+#include "extender-spanner.hh"
+
+/**
+ Generate an extender.
+ Should make an Extender_spanner that typesets a nice extender line.
+ */
+class Extender_engraver : public Engraver
+{
+public:
+ TRANSLATOR_CLONE(Extender_engraver);
+ DECLARE_MY_RUNTIME_TYPEINFO;
+ Extender_engraver ();
+
+protected:
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_removal_processing();
+ virtual void do_process_requests();
+ virtual bool do_try_request (Request*);
+ virtual void do_pre_move_processing();
+
+private:
+ Drul_array<Extender_req*> span_reqs_drul_;
+ Drul_array<Moment> span_mom_drul_;
+ Extender_spanner* extender_spanner_p_;
+};
+
+#endif // EXTENDER_ENGRAVER_HH
--- /dev/null
+/*
+ extender-spanner.hh -- part of GNU LilyPond
+
+ (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#ifndef EXTENDER_SPANNER_HH
+#define EXTENDER_SPANNER_HH
+
+#include "directional-spanner.hh"
+
+/**
+ simple extender line
+
+ The extender is a simple line at the baseline of the lyric
+ that helps show the length of a melissima (tied/slurred note).
+
+ Extenders must be entered manually for now.
+
+ Although it would be possible for Lily to determine where to
+ put extender lines, it's quite a tricky thing to do. Also,
+ this would demand quite strict lyrics entries.
+
+ Note: the extender is only used for one-syllable words, or
+ for on a word's last syllable. The extender should be aligned
+ with the left side of the last note of the melissima, and not
+ extend beond, lasting the whole duration of the melissima
+ (as in MUP, urg).
+ */
+
+class Extender_spanner : public Directional_spanner
+{
+public:
+ Extender_spanner ();
+ virtual ~Extender_spanner ();
+
+ Offset center () const;
+ void set_textitem (Direction, Text_item*);
+
+ Drul_array<Text_item *> textitem_l_drul_;
+
+protected:
+ virtual Molecule* brew_molecule_p () const;
+ void do_add_processing ();
+ Interval do_height () const;
+ void do_substitute_dependency (Score_element* o, Score_element* n);
+ void do_post_processing ();
+
+ DECLARE_MY_RUNTIME_TYPEINFO;
+ SCORE_ELEMENT_CLONE(Extender_spanner);
+
+ Extender_spanner (Extender_spanner const&);
+
+ Drul_array<Real> dy_f_drul_;
+ Drul_array<Real> dx_f_drul_;
+};
+
+#endif // EXTENDER_SPANNER_HH
+
struct Element_group;
struct Element_group_item;
struct Engraver_group_engraver;
+struct Extender;
+struct Extender_req;
struct General_script_def;
struct Graphical_element;
Atom dashed_slur (Array<Offset> controls, Real thick, Real dash) const;
Atom dots () const;
Atom dynamic (String) const;
+ Atom extender (Real) const;
Atom fill (Box b) const;
Atom flag (int, Direction) const;
Atom hairpin (Real width, bool decresc, bool continued) const;
};
-/// a plet (bracket with) number
+/// a tuplet (bracket with) number
class Plet_req : public Musical_span_req {
public:
int plet_i_;
Plet_req ();
};
+/// an extender line
+class Extender_req : public Musical_span_req {
+public:
+ REQUESTMETHODS(Extender_req);
+ Extender_req ();
+};
+
class Musical_script_req : public Musical_req, public Script_req {
public:
REQUESTMETHODS(Musical_script_req);
int abbrev_beam_type_i_;
int default_abbrev_i_;
Duration default_duration_;
+ Extender_req* extender_req;
Plet plet_;
Scope *default_header_p_;
ESCAPED [nt\\'"]
PLET \\\[
TELP \\\]
+EXTENDER [_][_]
%%
{LYRICS} {
/* ugr. This sux. */
String s (YYText ());
+ if (s == "__")
+ return yylval.i = EXTENDER;
int i = 0;
while ((i=s.index_i ("_")) != -1) // change word binding "_" to " "
*(s.ch_l () + i) = ' ';
yyterminate (); // can't move this, since it actually rets a YY_NULL
}
}
+
+
{WORD} {
return scan_bare_word (YYText ());
}
return (*symtables_p_) ("dynamics")->lookup (st);
}
+Atom
+Lookup::extender (Real width) const
+{
+ Atom a = (*symtables_p_) ("param")->lookup ("extender");
+ Array<Real> arr;
+ arr.push (width);
+ a.lambda_ = (lambda_scm (a.str_, arr));
+ a.str_ = "extender";
+ a.font_ = font_;
+ return a;
+}
+
Atom
Lookup::fill (Box b) const
{
{
}
+IMPLEMENT_IS_TYPE_B1 (Extender_req,Span_req);
+
+Extender_req::Extender_req ()
+{
+}
+
+void
+Extender_req::do_print () const
+{
+}
+
bool
Span_req::do_equal_b (Request*r) const
{"cm", CM_T},
{"consists", CONSISTS},
{"duration", DURATION},
+// {"_", EXTENDER},
{"font", FONT},
{"grouping", GROUPING},
{"header", HEADER},
default_duration_.durlog_i_ = 2;
default_abbrev_i_ = 0;
error_level_i_ = 0;
+ extender_req = 0;
fatal_error_i_ = 0;
default_header_p_ =0;
}
// mmm
Mudela_version oldest_version ("1.0.7");
-Mudela_version version ("1.0.8");
+Mudela_version version ("1.0.9");
// needed for bison.simple's malloc() and free()
%token CONSISTS
%token DURATION
%token END
+%token EXTENDER
%token FONT
%token GROUPING
%token HEADER
%type <request> post_request structured_post_request
%type <pair> plet_fraction
%type <request> command_req verbose_command_req
-%type <request> script_req dynamic_req
+%type <request> script_req dynamic_req extender_req
%type <string> string
%type <score> score_block score_body
%type <intarr> shape_array
a->type_i_ = $1;
$$ = a;
}
+ | extender_req {
+ $$ = $1;
+ }
;
optional_modality:
}
;
+extender_req:
+ EXTENDER {
+ if (!THIS->lexer_p_->lyric_state_b ())
+ THIS->parser_error (_ ("have to be in Lyric mode for lyrics"));
+ Extender_req * e_p = new Extender_req;
+ e_p->spantype = Span_req::START;
+ $$ = e_p;
+ THIS->extender_req = e_p;
+ };
+
dynamic_req:
ABSDYNAMIC '{' unsigned '}' {
Absolute_dynamic_req *ad_p = new Absolute_dynamic_req;
pre_requests:
{
+ if (THIS->extender_req)
+ {
+ Extender_req * e_p = new Extender_req;
+ e_p->spantype = Span_req::STOP;
+ THIS->pre_reqs.push (e_p);
+ THIS->extender_req = 0;
+ }
+
}
| pre_requests open_request_parens {
+
Array<Request*>& r = *THIS->get_parens_request ($2);
for (int i = 0; i < r.size (); i++ )
r[i]->set_spot (THIS->here_input ());
\[/3 Mit4 der8 \] T\"o-4. ne8
\[/3 s\"u-4 "\ss{}en"8 \] Kla-4. gen8
Fleh-4. en8 \[/3 sie4 f\"ur8 \]
- mich.2 _4
+ mich2 _4
_4_ _
_4_ _
\[/3 Komm4 be-8 \] gl\"u4. cke8 |
mich!2. |
\[/3 Komm4 be-8 \] gl\"u4. cke8 |
- mich!2. |
+ mich,2. __ |
_2 be-4 |
gl\"u-2. |
cke2. |
% To get original, \transpose d'
% \transpose a gives a' to d'' (for basses, who sing an octave down)
<
- { \notes \transpose a { \$vocal_staff } }
+% kjoet, but i like the original better -- jcn
+% { \notes \transpose a { \$vocal_staff } }
+% \$lyric_staff
+% { \notes \transpose a { \$grand_staff } }
+ { \notes { \$vocal_staff } }
\$lyric_staff
- { \notes \transpose a { \$grand_staff } }
+ { \notes { \$grand_staff } }
>
- \paper { \translator { \OrchestralScoreContext }}
+ \paper {
+% \translator { \OrchestralScoreContext }
+% \translator { \OrchestralPartStaffContext }
+ \translator { \HaraKiriStaffContext }
+ }
\midi{
\tempo 4 = 54;
}
/xoffset 30 def
/yoffset 700 def
-/staffrulethickness 1 def
+/stafflinethickness 1 def
/staffheight 20 def
/placebox
grestore
} bind def
+/extender % width
+{
+ gsave
+ 0 0 moveto
+ stafflinethickness 0.8 mul setlinewidth
+ 0 lineto stroke
+ grestore
+} bind def
+
/widthbar % height width
{
gsave
\def\filedef#1#2{%#1=command name, #2=file name
\openin\defin=#2\relax\def#1{}
\ifeof\defin
- \message{***************** CAN NOT OPEN #2 ********************}
+ \message{***************************************}
+ \message{lily-ps-defs.tex: can't open `#2'}
+ \message{***************************************}
\end
\fi
\loop\ifnot{\ifeof\defin}\read\defin to\tempfiledef
\def\finishbar#1{\rightalign{\thinbar{#1}\kern\smallspace\thickbar{#1}}}
\def\fatdoublebar#1{\hbox{\phantom{\repeatcolon\kern2\smallspace}\thickbar{#1}\kern\smallspace\thickbar{#1}}}
-
+\def\extender#1{\vrule width#1 height .8\stafflinethickness}
% ugh
% see e.g. input/test/beam-pos.ly