]> 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 12:51:35 +0000 (13:51 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 11 Jan 2007 12:51:35 +0000 (13:51 +0100)
notes.

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

index d71e9f53257defe6b8b3207069e00db432c2b76e..cefa44f5a87da7ffe6a513c5a942ab0f7de19207 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 0e430aea2b0d187b79f6b1ab6a5c07f10003abbd..dac7bddd549513ee2b5c13a0842083d141aea767 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 582ec4dbfc6d80bbced7f1d9470e086ebcf3e7c2..7aa90ca511ae02727df7b08b642e0991c081b438 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 1f4b233406a9cbc9a099e2a76c7469216d508be5..ebbb20aeecafc3e3ef8ae11aea12cf30e41d0805 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);
@@ -248,7 +246,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 2a37d3d0bd769bab917147ae24b32b87e6e954c1..3bdc426be042bb8d83c3423924d79a125f82c289 100644 (file)
@@ -63,7 +63,8 @@ Midi_walker::do_start_note (Midi_note *note)
   for (vsize i = 0; i < stop_note_queue.size (); i++)
     {
       /* if this pith already in queue */
-      if (stop_note_queue[i].val->get_semitone_pitch () == note->get_semitone_pitch ())
+      if (stop_note_queue[i].val->get_semitone_pitch ()
+         == note->get_semitone_pitch ())
        {
          if (stop_note_queue[i].key < stop_mom)
            {
index 6a03b02ea4a27a4d6d7d8381ae369e36d294753d..78070a064a39f8b57c640faca06fc8b0234c7a00 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 635f82bc56d9e090e8d5f13d80bbdf2cab5ec69f..99d2f84967ee74f366ab5e0db653b199415bc99d 100644 (file)
@@ -92,6 +92,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);
 }