1.3.136.jcn2
============
* Bugfix and small addition to convert-ly.
* Bugfix: ly2dvi: create --outdir before copying there.
* Bugfix: mutopia letter target.
* Some bugfixes and checks for killed spanners, reducing warnings in
Coriolan from 1143 to 283. Part combiner still gives rise to many
foreseeable warnings.
24 files changed:
+1.3.136.jcn2
+============
+
+* Bugfix and small addition to convert-ly.
+
+* Bugfix: ly2dvi: create --outdir before copying there.
+
+* Bugfix: mutopia letter target.
+
+* Some bugfixes and checks for killed spanners, reducing warnings in
+Coriolan from 1143 to 283. Part combiner still gives rise to many
+foreseeable warnings.
+
1.3.136.jcn1
============
1.3.136.jcn1
============
MAJOR_VERSION=1
MINOR_VERSION=3
PATCH_LEVEL=136
MAJOR_VERSION=1
MINOR_VERSION=3
PATCH_LEVEL=136
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
--- /dev/null
+%
+% mmrests of second voice should not disappear
+%
+% the problem is more complex: the mmrest-engraver lives at staff level,
+% but it seems that we need one per voice.
+%
+\score {
+ \notes <
+ \context Staff = Viole <
+ \context Voice=one \partcombine Voice
+ \context Thread=one \relative c''{ R1 d4 d d d }
+ \context Thread=two { R1*2 }
+ >
+ >
+ \paper {
+% {
+ \translator {
+ \StaffContext
+ \remove Multi_measure_rest_engraver;
+ \remove Bar_engraver;
+ }
+ \translator {
+ \VoiceContext
+ \consists Multi_measure_rest_engraver;
+ \consists Bar_engraver;
+ }
+% }
+ }
+}
\ No newline at end of file
Dynamic_engraver::finalize ()
{
typeset_all ();
Dynamic_engraver::finalize ()
{
typeset_all ();
+
+ if (line_spanner_
+ && line_spanner_->immutable_property_alist_ == SCM_EOL)
+ line_spanner_ = 0;
if (line_spanner_)
{
finished_line_spanner_ = line_spanner_;
typeset_all ();
}
if (line_spanner_)
{
finished_line_spanner_ = line_spanner_;
typeset_all ();
}
+ if (cresc_p_
+ && cresc_p_->immutable_property_alist_ == SCM_EOL)
+ cresc_p_ = 0;
if (cresc_p_)
{
current_cresc_req_->origin ()->warning (_ ("unterminated (de)crescendo"));
if (cresc_p_)
{
current_cresc_req_->origin ()->warning (_ ("unterminated (de)crescendo"));
void
Dynamic_engraver::typeset_all ()
{
void
Dynamic_engraver::typeset_all ()
{
+ /*
+ remove suicided spanners,
+ ugh: we'll need this for every spanner, beam, slur
+ Hmm, how to do this, cleanly?
+ Maybe just check at typeset_grob ()?
+ */
+ if (finished_cresc_p_
+ && finished_cresc_p_->immutable_property_alist_ == SCM_EOL)
+ finished_cresc_p_ = 0;
+ if (finished_line_spanner_
+ && finished_line_spanner_->immutable_property_alist_ == SCM_EOL)
+ finished_line_spanner_ = 0;
+
if (finished_cresc_p_)
{
if (!finished_cresc_p_->get_bound (RIGHT))
if (finished_cresc_p_)
{
if (!finished_cresc_p_->get_bound (RIGHT))
}
if (finished_line_spanner_)
{
}
if (finished_line_spanner_)
{
- /*
- To make sure that this works
- */
+ /* To make sure that this works */
Side_position_interface::add_staff_support (finished_line_spanner_);
Side_position_interface::add_staff_support (finished_line_spanner_);
- if (!finished_line_spanner_->get_bound (RIGHT))
+ if (!finished_line_spanner_->get_bound (RIGHT)
+ && finished_line_spanner_->get_bound (LEFT))
finished_line_spanner_->set_bound (RIGHT, finished_line_spanner_->get_bound (LEFT));
typeset_grob (finished_line_spanner_);
finished_line_spanner_->set_bound (RIGHT, finished_line_spanner_->get_bound (LEFT));
typeset_grob (finished_line_spanner_);
{
if (Note_column::has_interface (i.elem_l_))
{
{
if (Note_column::has_interface (i.elem_l_))
{
+ if (line_spanner_
+ /* Don't refill killed spanner */
+ && line_spanner_->immutable_property_alist_ != SCM_EOL)
{
Side_position_interface::add_support (line_spanner_,i.elem_l_);
add_bound_item (line_spanner_,dynamic_cast<Item*>(i.elem_l_));
{
Side_position_interface::add_support (line_spanner_,i.elem_l_);
add_bound_item (line_spanner_,dynamic_cast<Item*>(i.elem_l_));
return RESTNAME;
}
<chords,notes>R {
return RESTNAME;
}
<chords,notes>R {
+ return MULTI_MEASURE_REST;
}
<INITIAL,chords,lyrics,notes>\\\${BLACK}*{WHITE} {
String s=YYText () + 2;
}
<INITIAL,chords,lyrics,notes>\\\${BLACK}*{WHITE} {
String s=YYText () + 2;
void
Multi_measure_rest_engraver::process_music ()
{
void
Multi_measure_rest_engraver::process_music ()
{
- if (new_req_l_ && stop_req_l_)
+ if (new_req_l_ && stop_req_l_)
stop_req_l_ = 0;
if (new_req_l_)
stop_req_l_ = 0;
if (new_req_l_)
Multi_measure_rest::brew_molecule (SCM smob)
{
Grob *me = unsmob_grob (smob);
Multi_measure_rest::brew_molecule (SCM smob)
{
Grob *me = unsmob_grob (smob);
+ if (to_boolean (me->get_grob_property ("skip-timestep")))
+ {
+ me->set_grob_property ("skip-timestep", SCM_EOL);
+ return SCM_EOL;
+ }
+
Spanner * sp = dynamic_cast<Spanner*> (me);
SCM alist_chain = Font_interface::font_alist_chain (me);
Spanner * sp = dynamic_cast<Spanner*> (me);
SCM alist_chain = Font_interface::font_alist_chain (me);
%token KEY
%token LYRICS
%token MARK
%token KEY
%token LYRICS
%token MARK
+%token MULTI_MEASURE_REST
%token MIDI
%token MM_T
%token PITCH
%token MIDI
%token MM_T
%token PITCH
- | MEASURES optional_notemode_duration {
+ | MULTI_MEASURE_REST optional_notemode_duration {
Skip_req * sk = new Skip_req;
sk->set_mus_property ("duration", $2);
Span_req *sp1 = new Span_req;
Skip_req * sk = new Skip_req;
sk->set_mus_property ("duration", $2);
Span_req *sp1 = new Span_req;
- p->add_offset_callback (Rest_collision::force_shift_callback_proc, Y_AXIS);
- p->set_grob_property ("rest-collision", me->self_scm ());
+ p->add_offset_callback (Rest_collision::force_shift_callback_proc, Y_AXIS);
+ p->set_grob_property ("rest-collision", me->self_scm ());
if (!s->get_bound (d))
{
s->set_bound(d, command_column_l_);
if (!s->get_bound (d))
{
s->set_bound(d, command_column_l_);
- ::warning (_f ("unbound spanner `%s'", s->name().ch_C()));
+ /* don't warn for empty/suicided spanners,
+ it makes real warningsinvisible.
+ maybe should be junked earlier? */
+ if (elem_p->immutable_property_alist_ == SCM_EOL)
+ ; // gdb hook
+ else
+ ::warning (_f ("unbound spanner `%s'", s->name ().ch_C ()));
- } while (flip(&d) != LEFT);
+ } while (flip (&d) != LEFT);
if (slur_req_l->get_span_dir() == STOP)
{
if (slur_l_stack_.empty ())
if (slur_req_l->get_span_dir() == STOP)
{
if (slur_l_stack_.empty ())
+ /* How to shut up this warning, when Voice_devnull_engraver has
+ eaten start request? */
slur_req_l->origin ()->warning (_f ("can't find start of slur"));
else
{
slur_req_l->origin ()->warning (_f ("can't find start of slur"));
else
{
{
SCM s = get_property ("devNullThread");
#if 0
{
SCM s = get_property ("devNullThread");
#if 0
+ /* No need, next if will never be true */
if (s == ly_symbol2scm ("never"))
return;
#endif
if (s == ly_symbol2scm ("never"))
return;
#endif
&& (to_boolean (get_property ("unison"))
|| to_boolean (get_property ("unisilence")))
&& to_boolean (get_property ("soloADue"))))
&& (to_boolean (get_property ("unison"))
|| to_boolean (get_property ("unisilence")))
&& to_boolean (get_property ("soloADue"))))
+ {
+ /* Ugh, we can suicide them, but they remain living */
+ i.elem_l_->suicide ();
+ }
if (req_l_ && !tie_p_arr_.size ())
{
if (req_l_ && !tie_p_arr_.size ())
{
+ /* How to shut up this warning, when no notes appeared because
+ they were suicided by Thread_devnull_engraver? */
req_l_->origin ()->warning (_ ("No ties were created!"));
}
req_l_->origin ()->warning (_ ("No ties were created!"));
}
ADD_THIS_TRANSLATOR (Voice_devnull_engraver);
static char const *eat_spanners[] = {
ADD_THIS_TRANSLATOR (Voice_devnull_engraver);
static char const *eat_spanners[] = {
+ "beam",
+ "crescendo",
+ "decrescendo",
- "tie",
- "dynamic-interface",
- "crescendo-interface",
&& (to_boolean (get_property ("unison"))
|| to_boolean (get_property ("unisilence")))))
{
&& (to_boolean (get_property ("unison"))
|| to_boolean (get_property ("unisilence")))))
{
- for (char const **p = eat_spanners; *p; p++)
+ if (Span_req *s = dynamic_cast <Span_req *> (m))
- if (Span_req *s = dynamic_cast <Span_req *> (m))
+ SCM t = s->get_mus_property ("span-type");
+
+ for (char const **p = eat_spanners; *p; p++)
- if (scm_equal_p (s->get_mus_property ("span-type"),
- ly_str02scm ( *p)) == SCM_BOOL_T)
- {
- return true;
- }
+ if (t == ly_str02scm (*p))
+ return true;
+ /* Ugh. Should eat other requests, script etc. too. */
+ else if (Tie_req *t = dynamic_cast<Tie_req*> (m))
+ return true;
}
return false;
}
static char const *junk_interfaces[] = {
}
return false;
}
static char const *junk_interfaces[] = {
+ "dynamic-interface",
+ "hairpin-interface",
+ "multi-measure-rest-interface",
"script-interface",
"slur-interface",
"script-interface",
"slur-interface",
"text-interface",
"text-item-interface",
"text-script-interface",
"text-interface",
"text-item-interface",
"text-script-interface",
- "dynamic-interface",
- "hairpin-interface",
"text-spanner-interface",
"text-spanner-interface",
{
SCM s = get_property ("devNullVoice");
#if 0
{
SCM s = get_property ("devNullVoice");
#if 0
+ /* No need, next if will never be true */
if (s == ly_symbol2scm ("never"))
return;
#endif
if (s == ly_symbol2scm ("never"))
return;
#endif
for (char const **p = junk_interfaces; *p; p++)
if (i.elem_l_->has_interface (ly_symbol2scm (*p)))
{
for (char const **p = junk_interfaces; *p; p++)
if (i.elem_l_->has_interface (ly_symbol2scm (*p)))
{
+#if 0
+ /* Ugh: virtual mmrest::suicide () ? */
+ if (i.elem_l_->has_interface (ly_symbol2scm ("multi-measure-rest-interface")))
+ i.elem_l_->set_grob_property ("skip-timestep", SCM_BOOL_T);
+ else
+ ;
+#endif
+ /* Ugh, we can suicide them, but they remain living */
i.elem_l_->suicide ();
return;
}
i.elem_l_->suicide ();
return;
}
\name Voice;
Generic_property_list = #generic-voice-properties
\name Voice;
Generic_property_list = #generic-voice-properties
+
+ % must come before all
+ \consists "Voice_devnull_engraver";
\consists "Output_property_engraver";
\consists "Arpeggio_engraver";
\consists "Output_property_engraver";
\consists "Arpeggio_engraver";
\consists "Tuplet_engraver";
\consists "Grace_position_engraver";
\consists "A2_engraver";
\consists "Tuplet_engraver";
\consists "Grace_position_engraver";
\consists "A2_engraver";
- \consists "Voice_devnull_engraver";
\consists "Skip_req_swallow_translator";
\accepts Thread; % bug if you leave out this!
\consists "Skip_req_swallow_translator";
\accepts Thread; % bug if you leave out this!
$(PYTHON) $(LY2DVI) --outdir=$(outdir) --dependencies $<
$(outdir)-$(PAPERSIZE)/%.dvi: %.ly
$(PYTHON) $(LY2DVI) --outdir=$(outdir) --dependencies $<
$(outdir)-$(PAPERSIZE)/%.dvi: %.ly
- $(PYTHON) $(LY2DVI) --outdir=$(outdir)-$(PAPERSIZE) --dependencies --papersize=$(PAPERSIZE) $<
+ $(PYTHON) $(LY2DVI) --outdir=$(outdir)-$(PAPERSIZE) --dependencies --set=papersize=$(PAPERSIZE) $<
%% devNullThread = #'never
\consists "Thread_devnull_engraver";
%% devNullThread = #'never
\consists "Thread_devnull_engraver";
- %\remove "Dynamic_engraver";
- %\remove "Text_engraver";
+ % While adds brings back rests of second voice,
+ % it prints some on the bar lines and it is messy
+ % because collisions don't work. Also, it increases
+ % memory usage from 91M RSS, to 116M.
+ %\consists "Multi_measure_rest_engraver";
+ %\consists "Bar_engraver";
}
\translator {
\HaraKiriStaffContext
}
\translator {
\HaraKiriStaffContext
-
- %\consists "Dynamic_engraver";
- %\consists "Text_engraver";
\consists "Mark_engraver";
MultiMeasureRest \override #'minimum-width = #6
\consists "Mark_engraver";
MultiMeasureRest \override #'minimum-width = #6
+ %\remove "Multi_measure_rest_engraver";
+ %\remove "Bar_engraver";
}
\translator {
\OrchestralScoreContext
}
\translator {
\OrchestralScoreContext
%% devNullThread = #'never
\consists "Thread_devnull_engraver";
%% devNullThread = #'never
\consists "Thread_devnull_engraver";
- %\remove "Dynamic_engraver";
- %\remove "Text_engraver";
+ %\consists "Multi_measure_rest_engraver";
+ %\consists "Bar_engraver";
}
% We need the HaraKiri staff for Staff Combining,
% but we better remove the Instrument_name_engraver.
\translator {
\HaraKiriStaffContext
}
% We need the HaraKiri staff for Staff Combining,
% but we better remove the Instrument_name_engraver.
\translator {
\HaraKiriStaffContext
- %\consists "Dynamic_engraver";
- %\consists "Text_engraver";
-
\consists "Mark_engraver";
\remove "Instrument_name_engraver";
\consists "Mark_engraver";
\remove "Instrument_name_engraver";
+
+ %\remove "Multi_measure_rest_engraver";
+ %\remove "Bar_engraver";
}
\translator {
\OrchestralScoreContext
}
\translator {
\OrchestralScoreContext
- bes2 r\ff|
- bes2 r\sf|
+ bes2\ff r|
+ bes2\sf r|
R1*2|
r2 r4 bes\ff(|
)as2. bes4\sf(|
R1*2|
r2 r4 bes\ff(|
)as2. bes4\sf(|
R1|
c4-. g-. r2|
as4-. e-. r2|
R1|
c4-. g-. r2|
as4-. e-. r2|
+ \property Voice.decrescendoText = #"dim."
+ \property Voice.decrescendoSpanner = #'dashed-line
+ f4\> r f r|
(minimum-width . 12.5) ; staffspace
(font-family . number)
(font-relative-size . 1)
(minimum-width . 12.5) ; staffspace
(font-family . number)
(font-relative-size . 1)
- (meta . ,(grob-description "MultiMeasureRest" multi-measure-rest-interface font-interface ))
+ (meta . ,(grob-description "MultiMeasureRest" multi-measure-rest-interface rest-interface font-interface ))
))
(NoteCollision . (
(axes 0 1)
))
(NoteCollision . (
(axes 0 1)
(set! instrument-equaliser-alist
(append
'(
(set! instrument-equaliser-alist
(append
'(
("oboe" . (0 . 0.7))
("clarinet" . (0 . 0.7))
("bassoon" . (0 . 0.6))
("oboe" . (0 . 0.7))
("clarinet" . (0 . 0.7))
("bassoon" . (0 . 0.6))
-lilypond_version_re_str = '\\\\version *\"(.*)\"'
-lilypond_version_re = re.compile(lilypond_version_re_str)
+# Did we ever have \mudela-version? I doubt it.
+# lilypond_version_re_str = '\\\\version *\"(.*)\"'
+lilypond_version_re_str = '\\\\(mudela-)?version *\"(.*)\"'
+lilypond_version_re = re.compile (lilypond_version_re_str)
def program_id ():
return '%s (GNU LilyPond) %s' %(program_name, version);
def program_id ():
return '%s (GNU LilyPond) %s' %(program_name, version);
return t1[x] - t2[x]
return 0
return t1[x] - t2[x]
return 0
-def guess_lilypond_version(filename):
+def guess_lilypond_version (filename):
s = gulp_file (filename)
m = lilypond_version_re.search (s)
if m:
s = gulp_file (filename)
m = lilypond_version_re.search (s)
if m:
if 1:
def conv(str):
str = re.sub ('\\\\melodic', '\\\\notes',str)
if 1:
def conv(str):
str = re.sub ('\\\\melodic', '\\\\notes',str)
+ if re.search ('\\\\header', str):
+ sys.stderr.write ('\nNot smart enough to convert \\multi constructs')
if 1:
def conv(str):
str = re.sub ('default_paper *=', '',str)
if 1:
def conv(str):
str = re.sub ('default_paper *=', '',str)
- str = re.sub ('default_midi *=', '',x)
-
+ str = re.sub ('default_midi *=', '',str)
return str
conversions.append (((1,0,4), conv, 'default_{paper,midi}'))
return str
conversions.append (((1,0,4), conv, 'default_{paper,midi}'))
str = re.sub ('\\\\property *"?([^.]+)"? *[.] *"?timeSignatureStyle"? *= *"([^"]*)"', '\\\\property \\1.TimeSignature \\\\override #\'style = #\'\\2', str)
str = re.sub ('\\\\property *"?([^.]+)"? *[.] *"?timeSignatureStyle"? *= *"([^"]*)"', '\\\\property \\1.TimeSignature \\\\override #\'style = #\'\\2', str)
- str = re.sub ('"?timeSignatureStyle"? *= *#?""', 'TimeSignature \\\\override #\'style = ##f, str)
+ str = re.sub ('"?timeSignatureStyle"? *= *#?""', 'TimeSignature \\\\override #\'style = ##f', str)
str = re.sub ('"?timeSignatureStyle"? *= *#?"([^"]*)"', 'TimeSignature \\\\override #\'style = #\'\\1', str)
str = re.sub ('"?timeSignatureStyle"? *= *#?"([^"]*)"', 'TimeSignature \\\\override #\'style = #\'\\1', str)
try:
do_one_file (f)
except UnknownVersion:
try:
do_one_file (f)
except UnknownVersion:
+ sys.stderr.write ('\n')
+ sys.stderr.write ("%s: can't determine version for %s" % (program_name, f))
+ sys.stderr.write ('\n')
+ sys.stderr.write ("%s: skipping" % program_name)
type = 'DVI'
dest = os.path.join (outdir, dest)
type = 'DVI'
dest = os.path.join (outdir, dest)
+ if outdir != '.':
+ system ('mkdir -p %s' % outdir)
system ('cp \"%s\" \"%s\"' % (srcname, dest ))
system ('cp *.midi %s' % outdir, ignore_error = 1)
system ('cp \"%s\" \"%s\"' % (srcname, dest ))
system ('cp *.midi %s' % outdir, ignore_error = 1)