From 8b61bfdfc19e3d7b141c3114628892760e3d445a Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 11 Jan 2007 15:44:59 +0100 Subject: [PATCH] Performance::remap_grace_durations(): robust way of handling grace notes. Conflicts: lily/midi-walker.cc --- lily/include/audio-column.hh | 5 +---- lily/include/audio-element.hh | 3 +-- lily/include/performance.hh | 9 +++++---- lily/midi-item.cc | 10 ++++------ lily/performance.cc | 22 ++++++++++++++++++++-- lily/score-performer.cc | 1 + 6 files changed, 32 insertions(+), 18 deletions(-) diff --git a/lily/include/audio-column.hh b/lily/include/audio-column.hh index 1d0fb5ca18..239f3f941a 100644 --- a/lily/include/audio-column.hh +++ b/lily/include/audio-column.hh @@ -25,15 +25,12 @@ public: Moment when () const; vector audio_items_; + Moment when_; protected: void offset_when (Moment m); friend class Score_performer; -private: - Audio_column (Audio_column const &); - - Moment when_; }; #endif // AUDIO_COLUMN_HH diff --git a/lily/include/audio-element.hh b/lily/include/audio-element.hh index 2941c7d105..75fabc5d72 100644 --- a/lily/include/audio-element.hh +++ b/lily/include/audio-element.hh @@ -17,9 +17,8 @@ public: Audio_element (); virtual ~Audio_element (); - VIRTUAL_COPY_CONSTRUCTOR(Audio_element, Audio_element); + DECLARE_CLASSNAME(Audio_element); virtual char const *name () const; -protected: }; #endif // AUDIO_ELEMENT_HH diff --git a/lily/include/performance.hh b/lily/include/performance.hh index 90a825bb1d..9250ee8198 100644 --- a/lily/include/performance.hh +++ b/lily/include/performance.hh @@ -19,12 +19,13 @@ public: DECLARE_CLASSNAME(Performance); void add_element (Audio_element *p); - - void output (Midi_stream &midi_stream_r); - void output_header_track (Midi_stream &midi_stream_r); + virtual void process (); + void remap_grace_durations (); + void output (Midi_stream &midi_stream) const; + void output_header_track (Midi_stream &midi_stream) const; void print () const; - void write_output (string filename); + void write_output (string filename) const; vector audio_staffs_; vector audio_elements_; diff --git a/lily/midi-item.cc b/lily/midi-item.cc index 88d303b4e7..2f1aa5bce6 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -96,14 +96,12 @@ Midi_event::Midi_event (Moment delta_mom, Midi_item *midi) midi_ = midi; } -/* - ugh. midi output badly broken since grace note hackage. -*/ string Midi_event::to_string () const { - Rational rat_dt = (delta_mom_.main_part_ * Rational (384) - + delta_mom_.grace_part_ * Rational (100)) * Rational (4); + assert (delta_mom_.grace_part_ == Rational (0)); + + Rational rat_dt = delta_mom_.main_part_ * Rational (384) * Rational (4); int delta = rat_dt.to_int (); string delta_string = Midi_item::i2varint_string (delta); @@ -251,7 +249,7 @@ Midi_note::Midi_note (Audio_note *a) Moment Midi_note::get_length () const { - Moment m = audio_->length_mom_; + Moment m = audio_->end_column_->when () - audio_->audio_column_->when (); return m; } diff --git a/lily/performance.cc b/lily/performance.cc index 59cc64a2e2..73a61767ce 100644 --- a/lily/performance.cc +++ b/lily/performance.cc @@ -34,7 +34,7 @@ Performance::~Performance () } void -Performance::output (Midi_stream &midi_stream) +Performance::output (Midi_stream &midi_stream) const { int tracks_ = audio_staffs_.size (); @@ -89,7 +89,7 @@ Performance::add_element (Audio_element *p) } void -Performance::write_output (string out) +Performance::write_output (string out) const { if (out == "-") out = "lelie.midi"; @@ -107,3 +107,21 @@ Performance::write_output (string out) } +void +Performance::remap_grace_durations () +{ + for (vsize i = 0; i < audio_elements_.size (); i++) + { + if (Audio_column * col = dynamic_cast (audio_elements_[i])) + { + col->when_.main_part_ = col->when_.main_part_ + Rational (1,4) * col->when_.grace_part_; + col->when_.grace_part_ = Rational (0); + } + } +} + +void +Performance::process () +{ + remap_grace_durations (); +} diff --git a/lily/score-performer.cc b/lily/score-performer.cc index 399298706e..4361183aff 100644 --- a/lily/score-performer.cc +++ b/lily/score-performer.cc @@ -94,6 +94,7 @@ Score_performer::prepare (SCM sev) SCM sm = ev->get_property ("moment"); Moment *m = unsmob_moment (sm); audio_column_ = new Audio_column (*m); + announce_element (Audio_element_info (audio_column_, 0)); precomputed_recurse_over_translators (context (), START_TRANSLATION_TIMESTEP, UP); } -- 2.39.5