+1.5.0.jcn1
+==========
+
+* Added feature to ly2dvi to find feta pfa font files used in a
+postscript file to make printing of direct postscript a bit easier:
+
+ lilypond -fps input/trip.ly
+ cat $(ly2dvi -f trip.ps) trip.ps | lpr
+
+* Reincluded 1.4.3.jcn2.
+
+* Website fixes.
+
+* Ly2dvi now leaves .tex and .latex output if latex fails, and cleans
+the temp dir if anything fails.
+
+* Fixes for windows scripts.
+
+1.5.0.uu1
+=========
+
+* Hara kiri and span-bar.
+
+* Junk old grace stuff.
+
+* Don't crash on grace notes in MIDI output.
+
+
+
1.5.0
=====
Audio_staff::output (Midi_stream& midi_stream_r, int track_i)
{
Midi_track midi_track;
- midi_track.number_i_ = track_i;
- midi_track.channel_i_ = channel_i_;
+ midi_track.number_i_ = track_i;
+ midi_track.channel_i_ = channel_i_;
for (Midi_walker i (this, &midi_track); i.ok (); i++)
i.process ();
midi_stream_r << midi_track;
junk_beam ();
}
-bool
-Auto_beam_engraver::same_grace_state_b (Grob* e)
-{
- bool gr = e->get_grob_property ("grace") == SCM_BOOL_T;
- SCM wg =get_property ("weAreGraceContext");
- return (to_boolean (wg)) == gr;
-}
void
Auto_beam_engraver::acknowledge_grob (Grob_info info)
{
- if (!same_grace_state_b (info.elem_l_))
- return;
-
if (stem_l_arr_p_)
{
if (Beam::has_interface (info.elem_l_))
}
- if (beam_p_ && !to_boolean (get_property ("weAreGraceContext")))
+ if (beam_p_)
{
Score_engraver * e = 0;
Translator * t = daddy_grav_l ();
if (Stem::beam_l (stem_l))
return;
- bool stem_grace = stem_l->get_grob_property ("grace") == SCM_BOOL_T;
-
- SCM wg =get_property ("weAreGraceContext");
- bool wgb= to_boolean (wg);
-
- if (wgb!= stem_grace)
- return;
-
Rhythmic_req *rhythmic_req = dynamic_cast <Rhythmic_req *> (info.req_l_);
if (!rhythmic_req)
{
/*
- grace-iterator.cc -- implement Grace_iterator
+ grace-music.cc -- implement Grace_music
source file of the GNU LilyPond music typesetter
*/
+#include "grace-music.hh"
#include "grace-iterator.hh"
+
+
#include "global-translator.hh"
#include "warn.hh"
+
Grace_iterator::~Grace_iterator ()
{
// child_iter_p_ = 0;
}
+
void
-Grace_iterator::construct_children ()
+Grace_iterator::process (Moment m )
{
- Translator_group * t = report_to_l ()->find_create_translator_l ("Grace", ""); // umgh.
-
- if (t)
- set_translator (t);
- Music_wrapper_iterator::construct_children ();
+ Moment main ;
+ main.main_part_ = m.grace_mom_;
+ Music_wrapper_iterator::process (main);
}
void
-Grace_iterator::process (Moment)
+Grace_iterator::construct_children ()
{
- Global_translator * t = dynamic_cast<Global_translator*> (report_to_l ());
- if (t)
- {
- t->start ();
- t->run_iterator_on_me (child_iter_p_);
- delete child_iter_p_;
- child_iter_p_ = 0;
- t->finish ();
- }
- else
- {
- warning (_ ("no Grace context available"));
- }
+ Music_wrapper_iterator::construct_children ();
}
+
+
Moment
Grace_iterator::pending_moment () const
{
- return 0;
+ Moment cp =Music_wrapper_iterator::pending_moment();
+
+ Moment pending;
+ pending.grace_mom_ = - music_length_.main_part_ + cp.main_part_;
+
+ return pending;
}
#include "grace-iterator.hh"
void
-Grace_music::compress (Moment)
+Grace_music::compress (Moment m)
{
-
+ Music_wrapper::compress (m);
}
Moment
Grace_music::length_mom () const
{
- return 0;
+ Moment l = Music_wrapper::length_mom ();
+ Moment gl;
+ gl.grace_mom_ = l.main_part_ + l.grace_mom_ ;
+ return gl;
+}
+
+
+Moment
+Grace_music::start_mom () const
+{
+ return Music::start_mom ();
}
Grace_music::Grace_music ()
*/
-#ifndef GRACE_ITERATOR_HH
-#define GRACE_ITERATOR_HH
+#ifndef NEWGRACE_ITERATOR_HH
+#define NEWGRACE_ITERATOR_HH
#include "music-wrapper-iterator.hh"
*/
-#ifndef GRACE_MUSIC_HH
-#define GRACE_MUSIC_HH
+#ifndef NGRACE_MUSIC_HH
+#define NGRACE_MUSIC_HH
#include "music-wrapper.hh"
protected:
virtual void compress (Moment);
virtual Moment length_mom () const;
-};
-
-class New_grace_music : public Music_wrapper
-{
-public:
- VIRTUAL_COPY_CONS (Music);
- New_grace_music (SCM);
- New_grace_music ();
-protected:
- virtual void compress (Moment);
- virtual Moment length_mom () const;
+ virtual Moment start_mom () const;
};
#endif /* GRACE_MUSIC_HH */
{
public:
int number_i_;
+
+ /*
+ Compensate for starting grace notes.
+ */
Cons_list<Midi_event> event_p_list_;
Midi_track ();
void process ();
void operator ++ (int);
bool ok () const;
+
private:
void do_start_note (Midi_note* note_p);
void do_stop_notes (Moment now_mom);
void output_event (Moment now_mom, Midi_item* l);
-
+
Midi_track* track_l_;
Audio_staff* staff_l_;
int index_;
void print () const;
void process ();
-
Link_array<Audio_staff> audio_staff_l_arr_;
Cons<Audio_element> *audio_elem_p_list_;
Midi_def * midi_l_;
#include "rhythmic-head.hh"
#include "timing-translator.hh"
#include "engraver-group-engraver.hh"
-#include "grace-align-item.hh"
+
#include "staff-symbol-referencer.hh"
#include "side-position-interface.hh"
#include "engraver.hh"
Link_array<Item> forced_l_arr_;
Link_array<Grob> tie_l_arr_;
Local_key_engraver ();
-
- Item * grace_align_l_;
};
Local_key_engraver::Local_key_engraver ()
{
key_item_p_ =0;
- grace_align_l_ =0;
+
last_keysig_ = SCM_EOL;
}
daddy_trans_l_->set_property ("localKeySignature", localsig);
}
- if (key_item_p_ && grace_align_l_)
- {
- Side_position_interface::add_support (grace_align_l_,key_item_p_);
- grace_align_l_ =0;
- }
if (key_item_p_)
{
void
Local_key_engraver::finalize ()
{
- // TODO: if grace ? signal accidentals to Local_key_engraver the
+
}
void
key_item_p_ =0;
}
- grace_align_l_ = 0;
+
mel_l_arr_.clear ();
arpeggios_.clear ();
tie_l_arr_.clear ();
void
Local_key_engraver::acknowledge_grob (Grob_info info)
{
- SCM wg= get_property ("weAreGraceContext");
-
- bool selfgr = gh_boolean_p (wg) &&gh_scm2bool (wg);
- bool he_gr = to_boolean (info.elem_l_->get_grob_property ("grace"));
-
- Item * item = dynamic_cast<Item*> (info.elem_l_);
- if (he_gr && !selfgr && item && Grace_align_item::has_interface (item))
- {
- grace_align_l_ = item;
- }
- if (he_gr != selfgr)
- return;
-
Note_req * note_l = dynamic_cast <Note_req *> (info.req_l_);
if (note_l && Rhythmic_head::has_interface (info.elem_l_))
if (Note_head::has_interface (h)) {
/* caught a note head ... do something with it */
- /* ... but not if it's a grace note ... */
- bool grace= to_boolean (i.elem_l_->get_grob_property ("grace"));
- SCM wg = get_property ("weAreGraceContext");
- bool wgb = to_boolean (wg);
- if (grace != wgb)
- return;
/* what's its Voice context name? */
String voice_context_id = get_context_id (i.origin_trans_l_->daddy_trans_l_, "Voice");
midi_p_ = midi_p;
}
+/*
+ ugh. midi output badly broken since grace note hackage.
+ */
String
Midi_event::str () const
{
- int delta_i = delta_mom_ * Moment (384 * 4); // ugh.
+ Rational rat_dt = (delta_mom_.main_part_ * Rational (384) +
+ delta_mom_.grace_mom_ * Rational (100))*Rational (4);
+ int delta_i = int (rat_dt);
String delta_str = Midi_item::i2varint_str (delta_i);
String midi_str = midi_p_->str ();
track_l_ = track_l;
index_= 0;
item_l_arr_l_ = &audio_staff_l->audio_item_l_arr_;
+
last_mom_ = 0;
}
Midi_walker::output_event (Moment now_mom, Midi_item* l)
{
Moment delta_t = now_mom - last_mom_ ;
- last_mom_ += delta_t;
+ last_mom_ = now_mom;
+
+ /*
+ this is not correct, but at least it doesn't crash when you
+ start with graces
+ */
+ if (delta_t < Moment(0))
+ {
+ delta_t = Moment (0);
+ }
+
+
track_l_->add (delta_t, l);
}
Audio_item* audio_p = (*item_l_arr_l_)[index_];
do_stop_notes (audio_p->audio_column_l_->at_mom ());
- /*
- THIS IS A MEMORY LEAK. FIXME.
- where's the leak? Everything goet to Midi_track, in a killing_cons.
- */
if (Midi_item* midi_p = Midi_item::midi_p (audio_p))
{
midi_p->channel_i_ = track_l_->channel_i_;
Music* seq = new Sequential_music (SCM_EOL);
seq->set_mus_property ("elements", ms);
- $$ = new New_grace_music (SCM_EOL);
+ $$ = new Grace_music (SCM_EOL);
$$->set_mus_property ("element", seq->self_scm ());
scm_unprotect_object (seq->self_scm ());
#else
- $$ = new New_grace_music (SCM_EOL);
+ $$ = new Grace_music (SCM_EOL);
$$->set_mus_property ("element", $2->self_scm ());
scm_unprotect_object ($2->self_scm ());
#endif
progress_indication ("[" + to_str (i)) ;
/*
- Aargh, let's hear it for the MIDI standard.
MIDI players tend to ignore instrument settings on
channel 10, the percussion channel by default.
*/
}
}
+
void
Performance::output_header_track (Midi_stream& midi_stream)
{
#endif
}
phrasing_slur_l_stack_.clear ();
- SCM wg = get_property ("weAreGraceContext");
- bool wgb = to_boolean (wg);
- if (!wgb)
+
for (int i=0; i < requests_arr_.size (); i++)
{
requests_arr_[i]->origin ()->warning (_ ("unterminated phrasing slur"));
class Rhythmic_column_engraver :public Engraver
{
Link_array<Grob> rhead_l_arr_;
- Link_array<Grob> grace_slur_endings_;
Grob * stem_l_;
Grob *ncol_p_;
Grob *dotcol_l_;
stem_l_ = 0;
}
- SCM wg = get_property ("weAreGraceContext");
- bool wegrace = to_boolean (wg);
-
- if (!wegrace)
- for (int i=0; i < grace_slur_endings_.size (); i++)
- Slur::add_column (grace_slur_endings_[i], ncol_p_);
- grace_slur_endings_.clear ();
}
}
void
Rhythmic_column_engraver::acknowledge_grob (Grob_info i)
{
- SCM wg = get_property ("weAreGraceContext");
- bool wegrace = to_boolean (wg);
- if (wegrace != to_boolean (i.elem_l_->get_grob_property ("grace"))
- && !Slur::has_interface (i.elem_l_))
- return ;
-
Item * item = dynamic_cast <Item *> (i.elem_l_);
if (item && Stem::has_interface (item))
{
{
dotcol_l_ = item;
}
- else if (Slur::has_interface (i.elem_l_))
- {
- /*
- end slurs starting on grace notes
- */
-
- if (to_boolean (i.elem_l_->get_grob_property ("grace")))
- grace_slur_endings_.push (i.elem_l_);
- }
}
void
void
Rhythmic_column_engraver::start_translation_timestep ()
{
- grace_slur_endings_.clear ();
dotcol_l_ =0;
stem_l_ =0;
}
void
Script_engraver::acknowledge_grob (Grob_info inf)
{
- bool them_grace = to_boolean (inf.elem_l_->get_grob_property ("grace"));
- bool us_grace = to_boolean (get_property ("weAreGraceContext"));
-
- if (us_grace != them_grace)
- return;
-
if (Stem::has_interface (inf.elem_l_))
{
for (int i=0; i < script_p_arr_.size (); i++)
(c) 1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-#include "grace-iterator.hh"
+
#include "translator-group.hh"
#include "debug.hh"
#include "sequential-music-iterator.hh"
Translator_group * child_report = child_report = iter_p_->report_to_l ();
Translator_group * me_report = report_to_l ();
- if (dynamic_cast<Grace_iterator*> (iter_p_))
- child_report = child_report->daddy_trans_l_;
-
Translator_group * c = child_report;
while (c && c != me_report)
{
#endif
}
slur_l_stack_.clear ();
- SCM wg = get_property ("weAreGraceContext");
- bool wgb = to_boolean (wg);
- if (!wgb)
- for (int i=0; i < requests_arr_.size (); i++)
+
+ for (int i=0; i < requests_arr_.size (); i++)
{
requests_arr_[i]->origin ()->warning (_ ("unterminated slur"));
}
void
Spacing_engraver::acknowledge_grob (Grob_info i)
{
- if (to_boolean (i.elem_l_->get_grob_property ("grace")))
- return;
-
if (to_boolean (i.elem_l_->get_grob_property ("non-rhythmic")))
return;
protected:
Link_array<Time_scaled_music> time_scaled_music_arr_;
/// when does the scaled music stop? Array order is synced with time_scaled_music_arr_
- Array<Moment> stop_moments_;
+ Array<Rational> stop_moments_;
/// when does the current spanner stop? Array order is synced with time_scaled_music_arr_
- Array<Moment> span_stop_moments_;
+ Array<Rational> span_stop_moments_;
/// The spanners. Array order is synced with time_scaled_music_arr_
Link_array<Spanner> started_span_p_arr_;
if (!dynamic_cast<Request_chord*> (el))
{
time_scaled_music_arr_.push (c);
- Moment m = now_mom () + c->length_mom ();
+ Rational m = now_mom ().main_part_ + c->length_mom ().main_part_;
stop_moments_.push (m);
SCM s = get_property ("tupletSpannerDuration");
if (unsmob_moment (s))
- m = m <? (now_mom () + *unsmob_moment (s));
+ m = m <? (now_mom () + *unsmob_moment (s)).main_part_;
span_stop_moments_.push (m);
}
void
Tuplet_engraver::acknowledge_grob (Grob_info i)
{
- bool grace= to_boolean (i.elem_l_->get_grob_property ("grace"));
- SCM wg = get_property ("weAreGraceContext");
- bool wgb = to_boolean (wg);
- if (grace != wgb)
- return;
-
if (Note_column::has_interface (i.elem_l_))
{
for (int j =0; j <started_span_p_arr_.size (); j++)
Moment tsd;
SCM s = get_property ("tupletSpannerDuration");
if (unsmob_moment (s))
- tsd = *unsmob_moment (s);
+ tsd = unsmob_moment (s)->main_part_;
for (int i= started_span_p_arr_.size (); i--;)
{
- if (now >= span_stop_moments_[i])
+ if (now.main_part_ >= span_stop_moments_[i])
{
if (started_span_p_arr_[i])
{
}
if (tsd)
- span_stop_moments_[i] += tsd;
+ span_stop_moments_[i] += tsd.main_part_;
}
- if (now >= stop_moments_[i])
+ if (now.main_part_ >= stop_moments_[i])
{
started_span_p_arr_.del (i);
stop_moments_.del (i);
\consists "Dynamic_performer"
\consists "Span_dynamic_performer"
\consists "Piano_pedal_performer"
- \consists "Grace_position_performer"
- \accepts Thread
- \accepts Grace
+ \consists "Note_performer"
+ \consists "Tie_performer"
}
\translator { \VoiceContext }
ThreadContext = \translator {
\type "Performer_group_performer"
\name Thread
- \consists "Note_performer"
- \consists "Tie_performer"
}
\translator { \ThreadContext }
\translator {
- \type "Grace_performer_group"
+ \type "Performer_group_performer"
\name Grace
- \consists "Note_performer"
- \consists "Tie_performer"
- \consists "Swallow_performer"
-
- weAreGraceContext = #t
}
\translator
(meta . ,(grob-description "Fingering" finger-interface font-interface text-script-interface text-interface side-position-interface))
))
- (GraceAlignment . (
- (axes . (0))
- (horizontal-space . 1.2)
- (padding . 1.0)
- (before-line-breaking-callback . ,Grace_align_item::before_line_breaking)
- (meta . ,(grob-description "GraceAlignment" axis-group-interface align-interface grace-alignment-interface))
- ))
(HaraKiriVerticalGroup . (
(Y-offset-callbacks . (,Hara_kiri_group_spanner::force_hara_kiri_callback))