]> git.donarmstrong.com Git - lilypond.git/commitdiff
Performance::remap_grace_durations(): robust way of handling grace
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 11 Jan 2007 14:44:59 +0000 (15:44 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 11 Jan 2007 14:44:59 +0000 (15:44 +0100)
notes.

Conflicts:

lily/midi-walker.cc

lily/include/audio-column.hh
lily/include/audio-element.hh
lily/include/performance.hh
lily/midi-item.cc
lily/performance.cc
lily/score-performer.cc

index 1d0fb5ca18d6fb3e64268225393488682de0d569..239f3f941a1c46e5aa77e82a82ec0960e6836d1a 100644 (file)
@@ -25,15 +25,12 @@ public:
   Moment when () const;
 
   vector<Audio_item*> 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
index 2941c7d10530950ebdfe78009d48ff97fdbd4e40..75fabc5d7283cfec2b51e2284f5b74a6905f9d3e 100644 (file)
@@ -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
index 90a825bb1d3ce3cb165a8217eba6ac7e7c01f3b4..9250ee8198cf17ac464c4004b8090ca3b82ea8db 100644 (file)
@@ -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_staff*> audio_staffs_;
   vector<Audio_element*> audio_elements_;
index 88d303b4e7d80f7952ee4690cf18c245489ab6f7..2f1aa5bce605182ee0b32e8f51ad640c51fcd51b 100644 (file)
@@ -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;
 }
 
index 59cc64a2e25c31de2d6036670de92b1c0cce71ba..73a61767ceb0c4e95e8ffd1e2410731f86b3da40 100644 (file)
@@ -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_column*> (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 ();
+}
index 399298706ec0d860580c3e2300acb61a98697a8c..4361183aff55fe538ce1beb9d3045033fd1bfa07 100644 (file)
@@ -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);
 }