]> git.donarmstrong.com Git - lilypond.git/commitdiff
Implements rhythmic-music-iterator
authorMike Solomon <mike@apollinemike.com>
Wed, 18 Jan 2012 19:12:13 +0000 (20:12 +0100)
committerDavid Kastrup <dak@gnu.org>
Wed, 25 Jan 2012 13:52:42 +0000 (14:52 +0100)
lily/include/rhythmic-music-iterator.hh [new file with mode: 0644]
lily/rhythmic-music-iterator.cc [new file with mode: 0644]
scm/define-music-types.scm

diff --git a/lily/include/rhythmic-music-iterator.hh b/lily/include/rhythmic-music-iterator.hh
new file mode 100644 (file)
index 0000000..6c6b7c6
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+  This file is part of LilyPond, the GNU music typesetter.
+
+  Copyright (C) 2012 Mike Solomon <mike@apollinemike.com>
+
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef RHYTHMIC_MUSIC_ITERATOR_HH
+#define RHYTHMIC_MUSIC_ITERATOR_HH
+
+#include "simple-music-iterator.hh"
+
+/*
+  Iterator for atomic music objects: events are generated at the
+  beginning and at the end of the music.
+*/
+class Rhythmic_music_iterator : public Simple_music_iterator
+{
+protected:
+  DECLARE_CLASSNAME (Rhythmic_music_iterator);
+  //Moment last_processed_mom_;
+
+public:
+  DECLARE_SCHEME_CALLBACK (constructor, ());
+  Rhythmic_music_iterator ();
+  virtual void process (Moment);
+  //virtual bool ok ()const;
+  //virtual Moment pending_moment ()const;
+};
+
+#endif /* RHYTHMIC_MUSIC_ITERATOR_HH */
+
diff --git a/lily/rhythmic-music-iterator.cc b/lily/rhythmic-music-iterator.cc
new file mode 100644 (file)
index 0000000..b547653
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+  This file is part of LilyPond, the GNU music typesetter.
+
+  Copyright (C) 2012 Mike Solomon <mike@apollinemike.com>
+
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "rhythmic-music-iterator.hh"
+
+#include "context.hh"
+#include "dispatcher.hh"
+#include "duration.hh"
+#include "input.hh"
+#include "international.hh"
+#include "music.hh"
+#include "warn.hh"
+
+Rhythmic_music_iterator::Rhythmic_music_iterator ()
+  : Simple_music_iterator ()
+{
+  last_processed_mom_ = -1;
+}
+
+void
+Rhythmic_music_iterator::process (Moment m)
+{
+  if (last_processed_mom_ < Moment (0))
+    {
+
+      descend_to_bottom_context ();
+
+      Stream_event *ev = get_music ()->to_event ();
+      SCM arts = ev->get_property ("articulations");
+      Context *c = get_outlet ();
+      
+      if (scm_is_pair (arts))
+       {
+         ev->set_property ("articulations", SCM_EOL);
+         c->event_source ()->broadcast (ev);
+         for (; scm_is_pair (arts); arts = scm_cdr (arts))
+           c->event_source ()->broadcast (unsmob_stream_event (scm_car (arts)));
+       }
+      else
+       c->event_source ()->broadcast (ev);
+
+      ev->unprotect ();
+    }
+  Simple_music_iterator::process (m);
+}
+
+IMPLEMENT_CTOR_CALLBACK (Rhythmic_music_iterator);
index 0dc9c7ee71b3ae8a2bcd48d6c669215e18d1687d..fc8c0a857b2c720f45237d4b3bf82630453d7668 100644 (file)
@@ -331,6 +331,7 @@ Note the explicit font switch.")
 
     (NoteEvent
      . ((description . "A note.")
+       (iterator-ctor . ,ly:rhythmic-music-iterator::constructor)
        (types . (general-music event note-event rhythmic-event
                  melodic-event))
        ))
@@ -483,6 +484,7 @@ Syntax: @code{\\unset @var{context}.@var{prop}}")
      . ((description . "A Rest.
 
 Syntax: @code{r4} for a quarter rest.")
+       (iterator-ctor . ,ly:rhythmic-music-iterator::constructor)
        (types . (general-music event rhythmic-event rest-event))
        ))