CVSROOT:        /cvsroot/lilypond
Module name:    lilypond
Branch:         lilypond_2_6
Changes by:     Han-Wen Nienhuys <[EMAIL PROTECTED]>    05/08/04 11:11:31

Modified files:
        .              : ChangeLog THANKS VERSION 
        lily           : auto-beam-engraver.cc clef-engraver.cc 
                         hara-kiri-engraver.cc stanza-number-engraver.cc 
                         time-signature-engraver.cc volta-engraver.cc 

Log message:
        (derived_mark): new method. Yes. We
        have to protect even those unlikely-to-be-corrupted data members.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/ChangeLog.diff?only_with_tag=lilypond_2_6&tr1=1.3836.2.16&tr2=1.3836.2.17&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/THANKS.diff?only_with_tag=lilypond_2_6&tr1=1.128&tr2=1.128.2.1&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/VERSION.diff?only_with_tag=lilypond_2_6&tr1=1.645.2.2&tr2=1.645.2.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/auto-beam-engraver.cc.diff?only_with_tag=lilypond_2_6&tr1=1.145&tr2=1.145.2.1&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/clef-engraver.cc.diff?only_with_tag=lilypond_2_6&tr1=1.123&tr2=1.123.2.1&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/hara-kiri-engraver.cc.diff?only_with_tag=lilypond_2_6&tr1=1.11&tr2=1.11.2.1&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/stanza-number-engraver.cc.diff?only_with_tag=lilypond_2_6&tr1=1.38&tr2=1.38.2.1&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/time-signature-engraver.cc.diff?only_with_tag=lilypond_2_6&tr1=1.62&tr2=1.62.2.1&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/volta-engraver.cc.diff?only_with_tag=lilypond_2_6&tr1=1.60&tr2=1.60.2.1&r1=text&r2=text

Patches:
Index: lilypond/ChangeLog
diff -u lilypond/ChangeLog:1.3836.2.16 lilypond/ChangeLog:1.3836.2.17
--- lilypond/ChangeLog:1.3836.2.16      Wed Aug  3 14:28:03 2005
+++ lilypond/ChangeLog  Thu Aug  4 11:11:29 2005
@@ -1,3 +1,8 @@
+2005-08-04  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
+ 
+       * lily/auto-beam-engraver.cc (derived_mark): new method. Yes. We
+       have to protect even those unlikely-to-be-corrupted data members.  
+  
 2005-08-03  Mats Bengtsson  <[EMAIL PROTECTED]>
 
        * Documentation/user/lilypond-book.itely (An example of a
Index: lilypond/THANKS
diff -u /dev/null lilypond/THANKS:1.128.2.1
--- /dev/null   Thu Aug  4 11:11:31 2005
+++ lilypond/THANKS     Thu Aug  4 11:11:30 2005
@@ -0,0 +1,318 @@
+Release 2.6
+***********
+
+DEVELOPMENT TEAM
+
+Han-Wen Nienhuys  - Core development
+Jan Nieuwenhuizen - Core development
+Erik Sandberg     - Bug Meister
+Pedro Kroger      - Build Meister
+Graham Percival   - Documentation Editor
+
+CONTRIBUTORS
+
+Andreas Scherer
+Arno Waschk
+Bertalan Fodor
+Carl Sorensen
+Christian Hitz
+David Jedlinsky
+Erlend Aasland
+Heikki Junes
+John Williams
+Jonatan Liljedahl
+Jürgen Reuter
+Mats Bengtsson
+Matthias Neeracher
+Mathieu Giraud
+Nicolas Sceaux
+Pal Benko
+Sebastiano Vigna
+Tatsuya Ono
+Vicente Solsona Della
+Werner Lemberg
+Yuval Harel
+
+TRANSLATORS
+
+Abel Cheung
+John Mandereau
+Olcay Yıldırım
+Roland Stigge
+Steven Michael Murphy
+
+
+WEBSITE TRANSLATORS
+
+Gauvain Pocentek
+Jean-Charles Malahieude
+John Mandereau
+Tineke de Munnik
+
+
+SPONSORS
+
+Bertalan Fodor
+Chris Sawer
+Gunther Strube
+Hans Forbrich
+Jonathan Walther
+Marcus Macauley
+Steve Doonan
+
+BUG HUNTERS/SUGGESTIONS
+
+Alexandre Beneteau
+Andreas Scherer
+Anthony W. Youngman
+Antti Kaihola
+Arjan Bos
+David Bobroff
+Bernard Hurley
+Bruce Fairchild
+Bruce McIntyre
+Bruce Fairchild
+Daniel Johnson
+David Rogers
+Donald Axel
+Dylan Nicholson
+Ed Jackson
+Erik Ronström
+Fernando Pablo Lopez-Lezcano
+Gilles Sadowski
+Jack O'Quin
+Jeff Smith
+Johannes Schindelin
+John Mandereau
+Jose Miguel Pasini
+Josiah Boothby
+Juergen Reuter
+Karl Hammar
+Laura Conrad
+Olivier Guéry
+Paul Scott
+Richard Schoeller
+Rob Platt
+Roman Stöckl-Schmidt
+Russ Jorgensen
+Simon Bailey
+Stephen McCarthy
+Sven Axelsson
+Tapio Tuovila
+Tom Cato Amundsen
+Will Oram
+Wolfgang Hoffmann
+
+
+Release 2.4
+***********
+
+DEVELOPMENT TEAM
+
+Han-Wen Nienhuys  - Core development
+Jan Nieuwenhuizen - Core development
+Erik Sandberg     - Bug Meister
+Pedro Kroger      - Build Meister
+Graham Percival   - Documentation Editor
+
+
+CONTRIBUTORS
+
+Carl Sorensen
+David Svoboda
+Guy Gascoigne-Piggford
+Heikki Junes
+Hendrik Maryns
+Kristof Bastiaensen
+Lisa Opus Goldstein
+Mats Bengtsson
+Michael Welsh Duggan
+Peter Lutek
+Werner Lemberg
+
+BUG HUNTERS/SUGGESTIONS
+
+
+Antti Kaihola
+Bertalan Fodor
+Brian Clements
+Christian Hitz
+Christoph Ludwig
+Christophe Papazian
+Daniel Berjón Díez
+Dave Phillips
+David Bobroff
+David Brandon
+Doug Asherman
+Ed Jackson
+Fernando Pablo Lopez-Lezcano
+Heinz Stolba
+Jack O'Quin
+Jefferson dos Santos Felix
+Karl Hammar
+Marco Gusy
+Martin Norbäck
+Matthias Neeracher
+Maurizio Tomasi
+Michael Kiermaier
+Pascal Legris
+Peter Rosenbeck
+Russ Ross
+Stephen Pollei
+Thomas Scharlowski
+Will Oram
+Yuval Harel
+
+
+Release 2.2
+***********
+
+HEAD HACKERS
+
+Han-Wen Nienhuys
+Jan Nieuwenhuizen
+
+CONTRIBUTORS
+
+David Bobroff
+Edward Sanford Sutton
+Heikki Junes
+Nicolas Sceaux
+
+BUG HUNTERS/SUGGESTIONS
+
+Alexandre Beneteau
+Andrew McNabb
+Atte Andre Jensen 
+Bertalan Fodor
+Bruce McIntyre
+Dave Symonds
+David Bobroff
+Darius
+Delma Avers
+Doug Linhardt
+Eric Wurbel
+Erik Sandberg
+Ferenc Wagner
+Hans Forbrich
+John Williams
+José Luis Cruz
+Jürgen Reuter
+Kieren Richard MacMillan
+Laurent Martelli
+Mats Bengtsson
+Matthias Kilian
+Nancho Alvarez
+Nick Busigin
+Nicolas Sceaux 
+Olivier Guéry
+Patrick Atamaniuk
+Paul Scott
+Pawel D
+Pedro Kroger
+Ray McKinney
+Reuben Thomas
+Rob V
+Stef Epardaud
+Thomas Willhalm
+Thomas Scharkowski
+Tom Bäckström
+Werner Lemberg
+Will Oram
+
+
+Release 2.0
+***********
+
+HEAD HACKERS
+
+Han-Wen Nienhuys
+Jan Nieuwenhuizen
+
+CONTRIBUTORS
+
+Mats Bengtsson
+Heikki Junes
+Jürgen Reuter
+
+BUG HUNTERS/SUGGESTIONS
+
+Antonio Palama
+Benjamin Milde
+Daniel Berjon Diez
+David Bobroff
+David Rayleigh Arnold
+Erik Ronstroem
+Fabio dos Santos
+Fodor Bertalan 
+Frederic Bron
+Graham Percival
+Ian Bailey-Mortimer
+John Williams
+Josza Marton
+Marco Caliari
+Matthieu Amiguet
+Michael Welsh Duggan
+Patrick Atamaniuk
+Paul Scott
+Pedro Kroeger
+Peter Lutek
+Richard Schoeller
+Thorkil Wolvendans
+Werner Trobin 
+
+
+Release 1.8
+***********
+
+HEAD HACKERS
+
+Han-Wen Nienhuys
+Jan Nieuwenhuizen
+
+CONTRIBUTORS
+
+Graham Percival
+Heikki Junes
+Jügen Reuter
+Kim Shrier
+Rune Zedeler
+Werner Lemberg
+
+
+BUG HUNTERS
+
+Amelie Zapf
+Andrew Schaaf
+Atte Andre Jensen
+Bob Harrington
+Chris Jackson
+Chris Sawer
+David Bobroff
+Erik Sandberg
+Fernando Pablo Lopez-Lezcano
+Hans Kieserman
+Jeremie Lumbroso
+John Potelle
+John Williams
+Karl Berry
+Karl-Johan Karlsson 
+Klaus Zimmermann
+Koblinger Egmont
+Paul Scott
+Pedro Kroger
+Richard Shann
+Roland Stigge
+Ryan O'Neil
+Simon Bailey
+Simon Weatherill
+Stanislav Brabec
+Thomas Rijniers
+Werner Lemberg
+Yotam Medini
+
+
+#Local variables:
+#coding: utf-8
+#End:
+
Index: lilypond/VERSION
diff -u lilypond/VERSION:1.645.2.2 lilypond/VERSION:1.645.2.3
--- lilypond/VERSION:1.645.2.2  Thu Jul 28 12:07:31 2005
+++ lilypond/VERSION    Thu Aug  4 11:11:30 2005
@@ -1,6 +1,6 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=6
-PATCH_LEVEL=2
+PATCH_LEVEL=3
 MY_PATCH_LEVEL=
 
Index: lilypond/lily/auto-beam-engraver.cc
diff -u /dev/null lilypond/lily/auto-beam-engraver.cc:1.145.2.1
--- /dev/null   Thu Aug  4 11:11:32 2005
+++ lilypond/lily/auto-beam-engraver.cc Thu Aug  4 11:11:30 2005
@@ -0,0 +1,422 @@
+/*
+  auto-beam-engraver.cc -- implement Auto_beam_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1999--2005 Jan Nieuwenhuizen <[EMAIL PROTECTED]>
+*/
+
+#include "engraver.hh"
+#include "beaming.hh"
+#include "beam.hh"
+#include "stem.hh"
+#include "warn.hh"
+#include "bar-line.hh"
+#include "rest.hh"
+#include "item.hh"
+#include "spanner.hh"
+#include "context.hh"
+
+class Auto_beam_engraver : public Engraver
+{
+  TRANSLATOR_DECLARATIONS (Auto_beam_engraver);
+
+protected:
+  virtual void stop_translation_timestep ();
+  virtual void start_translation_timestep ();
+  virtual void process_music ();
+  virtual bool try_music (Music *);
+  virtual void finalize ();
+  virtual void acknowledge_grob (Grob_info);
+  virtual void process_acknowledged_grobs ();
+  virtual void derived_mark () const;
+
+private:
+  bool test_moment (Direction, Moment);
+  void consider_begin (Moment);
+  void consider_end (Moment);
+  Spanner *create_beam ();
+  void begin_beam ();
+  void end_beam ();
+  void junk_beam ();
+  bool is_same_grace_state (Grob *e);
+  void typeset_beam ();
+
+  Music *forbid_;
+  /*
+    shortest_mom is the shortest note in the beam.
+  */
+  Moment shortest_mom_;
+  Spanner *finished_beam_;
+  Link_array<Item> *stems_;
+
+  int process_acknowledged_count_;
+  Moment last_add_mom_;
+  /*
+    Projected ending of the  beam we're working on.
+  */
+  Moment extend_mom_;
+  Moment beam_start_moment_;
+  Moment beam_start_location_;
+
+  bool subdivide_beams_;
+  Moment beat_length_;
+
+  // We act as if beam were created, and start a grouping anyway.
+  Beaming_info_list *grouping_;
+  SCM beam_settings_;
+
+  Beaming_info_list *finished_grouping_;
+};
+
+void
+Auto_beam_engraver::derived_mark () const
+{
+  scm_gc_mark (beam_settings_);
+}
+
+
+void
+Auto_beam_engraver::process_music ()
+{
+  if (scm_is_string (get_property ("whichBar")))
+    {
+      consider_end (shortest_mom_);
+      junk_beam ();
+    }
+
+  if (forbid_)
+    {
+      consider_end (shortest_mom_);
+      junk_beam ();
+    }
+}
+
+Auto_beam_engraver::Auto_beam_engraver ()
+{
+  forbid_ = 0;
+process_acknowledged_count_ = 0;
+  stems_ = 0;
+  shortest_mom_ = Moment (Rational (1, 8));
+  finished_beam_ = 0;
+  finished_grouping_ = 0;
+  grouping_ = 0;
+  beam_settings_ = SCM_EOL;
+}
+
+bool
+Auto_beam_engraver::try_music (Music *m)
+{
+  if (m->is_mus_type ("beam-forbid-event"))
+    {
+      forbid_ = m;
+      return true;
+    }
+
+  return false;
+}
+
+bool
+Auto_beam_engraver::test_moment (Direction dir, Moment test)
+{
+  return scm_call_3 (get_property ("autoBeamCheck"),
+                    context ()->self_scm (),
+                    scm_from_int (dir),
+                    test.smobbed_copy ())
+    != SCM_BOOL_F;
+}
+    
+void
+Auto_beam_engraver::consider_begin (Moment test_mom)
+{
+  bool on = to_boolean (get_property ("autoBeaming"));
+  if (!stems_ && on
+      && !forbid_)
+    {
+      bool b = test_moment (START, test_mom);
+      if (b)
+       begin_beam ();
+    }
+}
+
+void
+Auto_beam_engraver::consider_end (Moment test_mom)
+{
+  if (stems_)
+    {
+      /* Allow already started autobeam to end:
+        don't check for autoBeaming */
+      bool b = test_moment (STOP, test_mom);
+      if (b)
+       end_beam ();
+    }
+}
+
+Spanner *
+Auto_beam_engraver::create_beam ()
+{
+  if (to_boolean (get_property ("skipTypesetting")))
+    return 0;
+
+  /*
+    Can't use make_spanner_from_properties() because we have to use
+    beam_settings_.
+   */
+  Spanner *beam = new Spanner (beam_settings_,
+                              context ()->get_grob_key ("Beam"));
+
+  for (int i = 0; i < stems_->size (); i++)
+    {
+      /*
+       watch out for stem tremolos and abbreviation beams
+      */
+      if (Stem::get_beam ((*stems_)[i]))
+       {
+         scm_gc_unprotect_object (beam->self_scm ());
+         return 0;
+       }
+      Beam::add_stem (beam, (*stems_)[i]);
+    }
+
+  announce_grob (beam, (*stems_)[0]->self_scm ());
+
+  return beam;
+}
+
+void
+Auto_beam_engraver::begin_beam ()
+{
+  if (stems_ || grouping_)
+    {
+      programming_error ("already have autobeam");
+      return;
+    }
+
+  stems_ = new Link_array<Item>;
+  grouping_ = new Beaming_info_list;
+  beam_settings_ = updated_grob_properties (context (), ly_symbol2scm 
("Beam"));
+
+  beam_start_moment_ = now_mom ();
+  beam_start_location_
+    = robust_scm2moment (get_property ("measurePosition"), Moment (0));
+  subdivide_beams_ = ly_scm2bool (get_property ("subdivideBeams"));
+  beat_length_ = robust_scm2moment (get_property ("beatLength"), Moment (1, 
4));
+}
+
+void
+Auto_beam_engraver::junk_beam ()
+{
+  if (!stems_)
+    return;
+
+  delete stems_;
+  stems_ = 0;
+  delete grouping_;
+  grouping_ = 0;
+  beam_settings_ = SCM_EOL;
+
+  shortest_mom_ = Moment (Rational (1, 8));
+}
+
+void
+Auto_beam_engraver::end_beam ()
+{
+  if (stems_->size () < 2)
+    {
+      junk_beam ();
+    }
+  else
+    {
+      finished_beam_ = create_beam ();
+      if (finished_beam_)
+       finished_grouping_ = grouping_;
+      delete stems_;
+      stems_ = 0;
+      grouping_ = 0;
+      beam_settings_ = SCM_EOL;
+    }
+
+  shortest_mom_ = Moment (Rational (1, 8));
+}
+
+void
+Auto_beam_engraver::typeset_beam ()
+{
+  if (finished_beam_)
+    {
+      finished_grouping_->beamify (beat_length_, subdivide_beams_);
+      Beam::set_beaming (finished_beam_, finished_grouping_);
+      finished_beam_ = 0;
+
+      delete finished_grouping_;
+      finished_grouping_ = 0;
+    }
+}
+
+void
+Auto_beam_engraver::start_translation_timestep ()
+{
+  process_acknowledged_count_ = 0;
+  /*
+    don't beam over skips
+  */
+  if (stems_)
+    {
+      Moment now = now_mom ();
+      if (extend_mom_ < now)
+       {
+         end_beam ();
+       }
+    }
+  forbid_ = 0;
+}
+
+void
+Auto_beam_engraver::stop_translation_timestep ()
+{
+  typeset_beam ();
+}
+
+void
+Auto_beam_engraver::finalize ()
+{
+  /* finished beams may be typeset */
+  typeset_beam ();
+  /* but unfinished may need another announce/acknowledge pass */
+  if (stems_)
+    junk_beam ();
+}
+
+void
+Auto_beam_engraver::acknowledge_grob (Grob_info info)
+{
+  /* Duplicated from process_music (), since
+     Repeat_acknowledge_engraver::process_music () may also set whichBar.  */
+
+  Moment now = now_mom ();
+  if (scm_is_string (get_property ("whichBar"))
+      && beam_start_moment_ < now)
+    {
+      consider_end (shortest_mom_);
+      junk_beam ();
+    }
+
+  if (stems_)
+    {
+      if (Beam::has_interface (info.grob ()))
+       {
+         end_beam ();
+       }
+      else if (Bar_line::has_interface (info.grob ()))
+       {
+         end_beam ();
+       }
+      else if (Rest::has_interface (info.grob ()))
+       {
+         end_beam ();
+       }
+    }
+
+  if (Stem::has_interface (info.grob ()))
+    {
+      Item *stem = dynamic_cast<Item *> (info.grob ());
+      Music *m = info.music_cause ();
+      if (!m->is_mus_type ("rhythmic-event"))
+       {
+         programming_error ("stem must have rhythmic structure");
+         return;
+       }
+
+      /*
+       Don't (start) auto-beam over empty stems; skips or rests
+      */
+      if (!Stem::head_count (stem))
+       {
+         if (stems_)
+           end_beam ();
+         return;
+       }
+
+      if (Stem::get_beam (stem))
+       {
+         if (stems_)
+           junk_beam ();
+         return;
+       }
+
+      int durlog = unsmob_duration (m->get_property 
("duration"))->duration_log ();
+
+      if (durlog <= 2)
+       {
+         if (stems_)
+           end_beam ();
+         return;
+       }
+
+      /*
+       ignore grace notes.
+      */
+      if (bool (beam_start_location_.grace_part_) != bool (now.grace_part_))
+       return;
+
+      Moment dur = unsmob_duration (m->get_property ("duration"))->get_length 
();
+
+      consider_end (dur);
+      consider_begin (dur);
+
+      if (dur < shortest_mom_)
+       shortest_mom_ = dur;
+
+      if (!stems_)
+       return;
+
+      grouping_->add_stem (now - beam_start_moment_ + beam_start_location_,
+                          durlog - 2);
+      stems_->push (stem);
+      last_add_mom_ = now;
+      extend_mom_ = max (extend_mom_, now) + m->get_length ();
+    }
+}
+
+void
+Auto_beam_engraver::process_acknowledged_grobs ()
+{
+  if (extend_mom_ > now_mom ())
+    return ; 
+
+  if (!process_acknowledged_count_)
+    {
+      consider_end (shortest_mom_);
+      consider_begin (shortest_mom_);
+    }
+  else if (process_acknowledged_count_ > 1)
+    {
+      if (stems_)
+       {
+         Moment now = now_mom ();
+         if ((extend_mom_ < now)
+             || ((extend_mom_ == now) && (last_add_mom_ != now)))
+           {
+             end_beam ();
+           }
+         else if (!stems_->size ())
+           {
+             junk_beam ();
+           }
+       }
+    }
+
+  process_acknowledged_count_++;
+}
+
+ADD_TRANSLATOR (Auto_beam_engraver,
+               /* descr */ "Generate beams based on measure characteristics 
and observed "
+               "Stems.  Uses beatLength, measureLength and measurePosition to 
decide "
+               "when to start and stop a beam.  Overriding beaming is done 
through "
+               "@ref{Stem_engraver} properties @code{stemLeftBeamCount} and "
+               "@code{stemRightBeamCount}. ",
+               /* creats*/ "Beam",
+               /* accepts */ "beam-forbid-event",
+               /* acks  */ "stem-interface rest-interface beam-interface 
bar-line-interface",
+               /* reads */ "autoBeaming autoBeamSettings beatLength 
subdivideBeams",
+               /* write */ "");
Index: lilypond/lily/clef-engraver.cc
diff -u /dev/null lilypond/lily/clef-engraver.cc:1.123.2.1
--- /dev/null   Thu Aug  4 11:11:32 2005
+++ lilypond/lily/clef-engraver.cc      Thu Aug  4 11:11:31 2005
@@ -0,0 +1,201 @@
+/*
+  clef-engraver.cc -- implement Clef_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997--2005 Han-Wen Nienhuys <[EMAIL PROTECTED]>,
+
+  Mats Bengtsson <[EMAIL PROTECTED]>
+*/
+
+#include <cctype>
+
+#include "context.hh"
+#include "bar-line.hh"
+#include "staff-symbol-referencer.hh"
+#include "engraver.hh"
+#include "direction.hh"
+#include "side-position-interface.hh"
+
+class Clef_engraver : public Engraver
+{
+public:
+  TRANSLATOR_DECLARATIONS (Clef_engraver);
+
+  Direction octave_dir_;
+
+protected:
+
+  virtual void derived_mark () const;
+  virtual void stop_translation_timestep ();
+  virtual void process_music ();
+  virtual void acknowledge_grob (Grob_info);
+private:
+  Item *clef_;
+  Item *octavate_;
+
+  SCM prev_glyph_;
+  SCM prev_cpos_;
+  SCM prev_octavation_;
+  void create_clef ();
+  void set_glyph ();
+  void inspect_clef_properties ();
+};
+
+void
+Clef_engraver::derived_mark () const
+{
+  scm_gc_mark (prev_octavation_);
+  scm_gc_mark (prev_cpos_);
+  scm_gc_mark (prev_glyph_);
+}
+
+Clef_engraver::Clef_engraver ()
+{
+  clef_ = 0;
+  octave_dir_ = CENTER;
+  octavate_ = 0;
+
+  /*
+    will trigger a clef at the start since #f != ' ()
+  */
+  prev_octavation_ = prev_cpos_ = prev_glyph_ = SCM_BOOL_F;
+}
+
+void
+Clef_engraver::set_glyph ()
+{
+  SCM glyph_sym = ly_symbol2scm ("glyph-name");
+  SCM glyph = get_property ("clefGlyph");
+
+  SCM basic = ly_symbol2scm ("Clef");
+
+  execute_pushpop_property (context (), basic, glyph_sym, SCM_UNDEFINED);
+  execute_pushpop_property (context (), basic, glyph_sym, glyph);
+}
+
+/**
+   Generate a clef at the start of a measure. (when you see a Bar,
+   ie. a breakpoint)
+*/
+void
+Clef_engraver::acknowledge_grob (Grob_info info)
+{
+  Item *item = dynamic_cast<Item *> (info.grob ());
+  if (item)
+    {
+      if (Bar_line::has_interface (info.grob ())
+         && scm_is_string (get_property ("clefGlyph")))
+       create_clef ();
+    }
+}
+
+void
+Clef_engraver::create_clef ()
+{
+  if (!clef_)
+    {
+      Item *c = make_item ("Clef", SCM_EOL);
+
+      clef_ = c;
+      SCM cpos = get_property ("clefPosition");
+
+      if (scm_is_number (cpos))
+       clef_->set_property ("staff-position", cpos);
+
+      SCM oct = get_property ("clefOctavation");
+      if (scm_is_number (oct) && scm_to_int (oct))
+       {
+         Item *g = make_item ("OctavateEight", SCM_EOL);
+
+         int abs_oct = scm_to_int (oct);
+         int dir = sign (abs_oct);
+         abs_oct = abs (abs_oct) + 1;
+
+         SCM txt = scm_number_to_string (scm_int2num (abs_oct),
+                                         scm_from_int (10));
+
+         g->set_property ("text",
+                          scm_list_n (ly_lily_module_constant 
("vcenter-markup"),
+                                      txt, SCM_UNDEFINED));
+         Side_position_interface::add_support (g, clef_);
+
+         g->set_parent (clef_, Y_AXIS);
+         g->set_parent (clef_, X_AXIS);
+         g->set_property ("direction", scm_int2num (dir));
+         octavate_ = g;
+       }
+    }
+}
+void
+Clef_engraver::process_music ()
+{
+  inspect_clef_properties ();
+}
+
+void
+Clef_engraver::inspect_clef_properties ()
+{
+  SCM glyph = get_property ("clefGlyph");
+  SCM clefpos = get_property ("clefPosition");
+  SCM octavation = get_property ("clefOctavation");
+  SCM force_clef = get_property ("forceClef");
+
+  if (clefpos == SCM_EOL 
+       || scm_equal_p (glyph, prev_glyph_) == SCM_BOOL_F
+       || scm_equal_p (clefpos, prev_cpos_) == SCM_BOOL_F
+       || scm_equal_p (octavation, prev_octavation_) == SCM_BOOL_F
+       || to_boolean (force_clef))
+    {
+      set_glyph ();
+      if (prev_cpos_ != SCM_BOOL_F || to_boolean (get_property ("firstClef")))
+       create_clef ();
+
+      if (clef_)
+       clef_->set_property ("non-default", SCM_BOOL_T);
+
+      prev_cpos_ = clefpos;
+      prev_glyph_ = glyph;
+      prev_octavation_ = octavation;
+    }
+
+  if (to_boolean (force_clef))
+    {
+      Context *w = context ()->where_defined (ly_symbol2scm ("forceClef"));
+      w->set_property ("forceClef", SCM_EOL);
+    }
+}
+
+void
+Clef_engraver::stop_translation_timestep ()
+{
+  if (clef_)
+    {
+      SCM vis = 0;
+      if (to_boolean (clef_->get_property ("non-default")))
+       {
+         vis = get_property ("explicitClefVisibility");
+       }
+
+      if (vis)
+       {
+         clef_->set_property ("break-visibility", vis);
+         if (octavate_)
+           {
+             octavate_->set_property ("break-visibility", vis);
+           }
+       }
+
+      clef_ = 0;
+
+      octavate_ = 0;
+    }
+}
+
+ADD_TRANSLATOR (Clef_engraver,
+               /* descr */ "Determine and set reference point for pitches",
+               /* creats*/ "Clef OctavateEight",
+               /* accepts */ "",
+               /* acks  */ "bar-line-interface",
+               /* reads */ "clefPosition clefGlyph middleCPosition 
clefOctavation explicitClefVisibility forceClef",
+               /* write */ "");
Index: lilypond/lily/hara-kiri-engraver.cc
diff -u /dev/null lilypond/lily/hara-kiri-engraver.cc:1.11.2.1
--- /dev/null   Thu Aug  4 11:11:32 2005
+++ lilypond/lily/hara-kiri-engraver.cc Thu Aug  4 11:11:31 2005
@@ -0,0 +1,85 @@
+/*
+  hara-kiri-engraver.cc --  implement Hara_kiri_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 2005 Han-Wen Nienhuys <[EMAIL PROTECTED]>
+
+*/
+
+#include "axis-group-engraver.hh"
+#include "hara-kiri-group-spanner.hh"
+#include "rhythmic-head.hh"
+#include "spanner.hh"
+
+class Hara_kiri_engraver : public Axis_group_engraver
+{
+protected:
+  virtual Spanner *get_spanner ();
+  virtual void acknowledge_grob (Grob_info);
+  virtual void add_element (Grob *e);
+  virtual void start_translation_timestep ();
+
+  virtual void derived_mark () const;
+  
+  SCM interesting_;
+public:
+  TRANSLATOR_DECLARATIONS (Hara_kiri_engraver);
+};
+void
+Hara_kiri_engraver::derived_mark () const
+{
+  scm_gc_mark (interesting_);
+}
+  
+
+void
+Hara_kiri_engraver::start_translation_timestep ()
+{
+  Axis_group_engraver::start_translation_timestep ();
+  interesting_ = get_property ("keepAliveInterfaces");
+}
+
+
+void
+Hara_kiri_engraver::add_element (Grob *e)
+{
+  Hara_kiri_group_spanner::add_element (staffline_, e);
+}
+
+Spanner *
+Hara_kiri_engraver::get_spanner ()
+{
+  Spanner *sp = make_spanner ("RemoveEmptyVerticalGroup", SCM_EOL);
+
+  return sp;
+}
+
+void
+Hara_kiri_engraver::acknowledge_grob (Grob_info i)
+{
+  Axis_group_engraver::acknowledge_grob (i);
+  if (staffline_)
+    {
+      for (SCM s = interesting_; scm_is_pair (s); s = scm_cdr (s))
+       {
+         if (i.grob ()->internal_has_interface (scm_car (s)))
+           Hara_kiri_group_spanner::add_interesting_item (staffline_, i.grob 
());
+       }
+    }
+}
+
+Hara_kiri_engraver::Hara_kiri_engraver ()
+{
+  interesting_ = SCM_EOL;
+}
+
+ADD_TRANSLATOR (Hara_kiri_engraver,
+               /* descr */ "Like Axis_group_engraver, but make a hara-kiri 
spanner, and add "
+               "interesting items (ie. note heads, lyric syllables and normal 
rests) ",
+               /* creats*/ "RemoveEmptyVerticalGroup",
+               /* accepts */ "",
+               /* acks  */ "grob-interface",
+               /* reads */ "keepAliveInterfaces",
+               /* write */ "");
+
Index: lilypond/lily/stanza-number-engraver.cc
diff -u /dev/null lilypond/lily/stanza-number-engraver.cc:1.38.2.1
--- /dev/null   Thu Aug  4 11:11:32 2005
+++ lilypond/lily/stanza-number-engraver.cc     Thu Aug  4 11:11:31 2005
@@ -0,0 +1,84 @@
+/*
+  lyric-number-engraver.cc -- implement Stanza_number_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 2000--2005 Han-Wen Nienhuys <[EMAIL PROTECTED]>, Glen Prideaux <[EMAIL 
PROTECTED]>
+*/
+
+#include "engraver.hh"
+#include "side-position-interface.hh"
+
+class Stanza_number_engraver : public Engraver
+{
+  Item *text_;
+
+  /*
+    This is naughty, since last_stanza_ may be GCd from under us.  But
+    since we don't look at the contents, we are/should be (knock on
+    wood) OK.
+  */
+  SCM last_stanza_;
+public:
+  TRANSLATOR_DECLARATIONS (Stanza_number_engraver);
+  virtual void process_music ();
+  virtual void stop_translation_timestep ();
+  virtual void acknowledge_grob (Grob_info);
+};
+
+void
+Stanza_number_engraver::derived_mark () const
+{
+  scm_gc_mark (last_stanza_);
+}
+
+/*
+  TODO: should make engraver that collects all the stanzas on a higher
+  level, and then groups them to the side. Stanza numbers should be
+  all aligned.
+*/
+
+Stanza_number_engraver::Stanza_number_engraver ()
+{
+  last_stanza_ = SCM_EOL;
+  
+  text_ = 0;
+}
+
+void
+Stanza_number_engraver::process_music ()
+{
+  SCM stanza = get_property ("stanza");
+
+  if (scm_is_string (stanza) && stanza != last_stanza_)
+    {
+      last_stanza_ = stanza;
+
+      text_ = make_item ("StanzaNumber", SCM_EOL);
+      text_->set_property ("text", stanza);
+    }
+}
+
+void
+Stanza_number_engraver::acknowledge_grob (Grob_info inf)
+{
+  if (text_
+      && inf.grob ()->internal_has_interface (ly_symbol2scm 
("lyric-syllable-interface")))
+    {
+      Side_position_interface::add_support (text_, inf.grob ());
+    }
+}
+
+void
+Stanza_number_engraver::stop_translation_timestep ()
+{
+  text_ = 0;
+}
+
+ADD_TRANSLATOR (Stanza_number_engraver,
+               /* descr */ "",
+               /* creats*/ "StanzaNumber",
+               /* accepts */ "",
+               /* acks  */ "lyric-syllable-interface",
+               /* reads */ "stanza",
+               /* write */ "");
Index: lilypond/lily/time-signature-engraver.cc
diff -u /dev/null lilypond/lily/time-signature-engraver.cc:1.62.2.1
--- /dev/null   Thu Aug  4 11:11:32 2005
+++ lilypond/lily/time-signature-engraver.cc    Thu Aug  4 11:11:31 2005
@@ -0,0 +1,85 @@
+/*
+  time-signature-engraver.cc -- implement Time_signature_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997--2005 Han-Wen Nienhuys <[EMAIL PROTECTED]>
+*/
+
+#include "time-signature.hh"
+#include "warn.hh"
+#include "engraver-group-engraver.hh"
+#include "misc.hh"
+
+/**
+   generate time_signatures.
+*/
+class Time_signature_engraver : public Engraver
+{
+  Item *time_signature_;
+  SCM last_time_fraction_;
+
+protected:
+  virtual void derived_mark () const;
+  virtual void stop_translation_timestep ();
+  virtual void process_music ();
+public:
+  TRANSLATOR_DECLARATIONS (Time_signature_engraver);
+};
+
+void
+Time_signature_engraver::derived_mark () const
+{
+  scm_gc_mark (last_time_fraction_);
+}
+
+  
+Time_signature_engraver::Time_signature_engraver ()
+{
+  time_signature_ = 0;
+  last_time_fraction_ = SCM_BOOL_F;
+}
+
+void
+Time_signature_engraver::process_music ()
+{
+  /*
+    not rigorously safe, since the value might get GC'd and
+    reallocated in the same spot */
+  SCM fr = get_property ("timeSignatureFraction");
+  if (!time_signature_
+      && last_time_fraction_ != fr
+      && scm_is_pair (fr))
+    {
+      int den = scm_to_int (scm_cdr (fr));
+      if (den != (1 << intlog2 (den)))
+       {
+         /*
+           Todo: should make typecheck?
+
+           OTOH, Tristan Keuris writes 8/20 in his Intermezzi.
+         */
+         warning (_f ("strange time signature found: %d/%d",
+                      den,
+                      scm_to_int (scm_car (fr))));
+       }
+
+      last_time_fraction_ = fr;
+      time_signature_ = make_item ("TimeSignature", SCM_EOL);
+      time_signature_->set_property ("fraction", fr);
+    }
+}
+
+void
+Time_signature_engraver::stop_translation_timestep ()
+{
+  time_signature_ = 0;
+}
+
+ADD_TRANSLATOR (Time_signature_engraver,
+               /* descr */ "Create a TimeSignature whenever 
@code{timeSignatureFraction} changes",
+               /* creats*/ "TimeSignature",
+               /* accepts */ "",
+               /* acks  */ "",
+               /* reads */ "",
+               /* write */ "");
Index: lilypond/lily/volta-engraver.cc
diff -u /dev/null lilypond/lily/volta-engraver.cc:1.60.2.1
--- /dev/null   Thu Aug  4 11:11:32 2005
+++ lilypond/lily/volta-engraver.cc     Thu Aug  4 11:11:31 2005
@@ -0,0 +1,249 @@
+/*
+  volta-engraver.cc -- implement Volta_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 2000--2005 Han-Wen Nienhuys <[EMAIL PROTECTED]>
+*/
+
+#include "engraver.hh"
+#include "context.hh"
+#include "volta-bracket.hh"
+#include "note-column.hh"
+#include "bar-line.hh"
+#include "side-position-interface.hh"
+#include "warn.hh"
+#include "staff-symbol.hh"
+
+/*
+  Create Volta spanners, by reading repeatCommands  property, usually
+  set by Unfolded_repeat_iterator.
+*/
+class Volta_engraver : public Engraver
+{
+public:
+  TRANSLATOR_DECLARATIONS (Volta_engraver);
+protected:
+
+  virtual void acknowledge_grob (Grob_info);
+  virtual void finalize ();
+  virtual void stop_translation_timestep ();
+  virtual void process_music ();
+
+  virtual void derived_mark () const;
+  Moment started_mom_;
+  Spanner *volta_span_;
+  Spanner *end_volta_span_;
+  SCM staff_;
+  SCM start_string_;
+
+  bool staff_eligible ();
+};
+
+void
+Volta_engraver::derived_mark () const
+{
+  scm_gc_mark (staff_);
+  scm_gc_mark (start_string_);
+}
+
+Volta_engraver::Volta_engraver ()
+{
+  start_string_ = SCM_EOL;
+  staff_ = SCM_EOL;
+  volta_span_ = 0;
+  end_volta_span_ = 0;
+}
+
+/*
+  TODO: this logic should be rewritten, it is buggy.
+
+  One of the problems is that we can't determine wether or not to
+  print the volta bracket during the first step, since that requires
+  acknowledging the staff.
+*/
+bool
+Volta_engraver::staff_eligible ()
+{
+  SCM doit = get_property ("voltaOnThisStaff");
+  if (scm_is_bool (doit))
+    {
+      return to_boolean (doit);
+    }
+
+  if (!unsmob_grob (staff_))
+    return false;
+
+  /*
+    TODO: this does weird things when you open a piece with a
+    volta spanner.
+  */
+  SCM staffs = get_property ("stavesFound");
+
+  /* Only put a volta on the top staff.
+     Maybe this is a bit convoluted, and we should have a single
+     volta engraver in score context or somesuch. */
+  if (!scm_is_pair (staffs))
+    {
+      programming_error ("volta engraver can't find staffs");
+      return false;
+    }
+  else if (scm_car (scm_last_pair (staffs)) != staff_)
+    return false;
+  return true;
+}
+
+void
+Volta_engraver::process_music ()
+{
+  SCM cs = get_property ("repeatCommands");
+
+  if (!staff_eligible ())
+    return;
+
+  bool end = false;
+  start_string_ = SCM_EOL;
+  while (scm_is_pair (cs))
+    {
+      SCM c = scm_car (cs);
+
+      if (scm_is_pair (c)
+         && scm_car (c) == ly_symbol2scm ("volta")
+         && scm_is_pair (scm_cdr (c)))
+       {
+         if (scm_cadr (c) == SCM_BOOL_F)
+           end = true;
+         else
+           start_string_ = scm_cadr (c);
+       }
+
+      cs = scm_cdr (cs);
+    }
+
+  if (volta_span_)
+    {
+      SCM l (get_property ("voltaSpannerDuration"));
+      Moment now = now_mom ();
+
+      bool early_stop = unsmob_moment (l)
+       && *unsmob_moment (l) <= now - started_mom_;
+
+      end = end || early_stop;
+    }
+
+  if (end && !volta_span_)
+    /* fixme: be more verbose.  */
+    warning (_ ("can't end volta spanner"));
+  else if (end)
+    {
+      end_volta_span_ = volta_span_;
+      volta_span_ = 0;
+    }
+
+  if (volta_span_
+      && (scm_is_string (start_string_) || scm_is_pair (start_string_)))
+    {
+      warning (_ ("already have a volta spanner, ending that one 
prematurely"));
+
+      if (end_volta_span_)
+       {
+         warning (_ ("also already have an ended spanner"));
+         warning (_ ("giving up"));
+         return;
+       }
+
+      end_volta_span_ = volta_span_;
+      volta_span_ = 0;
+    }
+
+  if (!volta_span_
+      && (scm_is_string (start_string_) || scm_is_pair (start_string_)))
+    {
+      started_mom_ = now_mom ();
+
+      volta_span_ = make_spanner ("VoltaBracket", SCM_EOL);
+
+      volta_span_->set_property ("text", start_string_);
+    }
+}
+
+void
+Volta_engraver::acknowledge_grob (Grob_info i)
+{
+  if (Item *item = dynamic_cast<Item *> (i.grob ()))
+    {
+      if (Note_column::has_interface (item))
+       {
+         if (volta_span_)
+           Volta_bracket_interface::add_column (volta_span_, item);
+       }
+      if (Bar_line::has_interface (item))
+       {
+         if (volta_span_)
+           Volta_bracket_interface::add_bar (volta_span_, item);
+         if (end_volta_span_)
+           Volta_bracket_interface::add_bar (end_volta_span_, item);
+       }
+    }
+  else if (Staff_symbol::has_interface (i.grob ()))
+    {
+      /*
+       We only want to know about a single staff: then we add to the
+       support.  */
+      if (staff_ != SCM_EOL)
+       staff_ = SCM_UNDEFINED;
+
+      if (staff_ != SCM_UNDEFINED)
+       staff_ = i.grob ()->self_scm ();
+    }
+}
+
+void
+Volta_engraver::finalize ()
+{
+}
+
+void
+Volta_engraver::stop_translation_timestep ()
+{
+  if (volta_span_ && !staff_eligible ())
+    {
+      /*
+       THIS IS A KLUDGE.
+
+       we need to do this here, because STAFF_ is not initialized yet
+       in the 1st call of process_music ()
+      */
+
+      volta_span_->suicide ();
+      volta_span_ = 0;
+    }
+
+  if (end_volta_span_ && !end_volta_span_->get_bound (RIGHT))
+    {
+      Grob *cc = unsmob_grob (get_property ("currentCommandColumn"));
+      Item *ci = dynamic_cast<Item *> (cc);
+      end_volta_span_->set_bound (RIGHT, ci);
+    }
+
+  end_volta_span_ = 0;
+
+  if (volta_span_ && !volta_span_->get_bound (LEFT))
+    {
+      Grob *cc = unsmob_grob (get_property ("currentCommandColumn"));
+      Item *ci = dynamic_cast<Item *> (cc);
+      volta_span_->set_bound (LEFT, ci);
+    }
+}
+
+/*
+  TODO: should attach volta to paper-column if no bar is found.
+*/
+
+ADD_TRANSLATOR (Volta_engraver,
+               /* descr */ "Make volta brackets.",
+               /* creats*/ "VoltaBracket",
+               /* accepts */ "",
+               /* acks  */ "bar-line-interface staff-symbol-interface 
note-column-interface",
+               /* reads */ "repeatCommands voltaSpannerDuration stavesFound",
+               /* write */ "");


_______________________________________________
Lilypond-cvs mailing list
Lilypond-cvs@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-cvs

Reply via email to