]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/articulations.cc
resolve merge
[lilypond.git] / lily / articulations.cc
diff --git a/lily/articulations.cc b/lily/articulations.cc
new file mode 100644 (file)
index 0000000..9301865
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+  This file is part of LilyPond, the GNU music typesetter.
+
+  Copyright (C) 2010--2011 Carl Sorensen <c_sorensen@byu.edu>
+
+  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 "engraver.hh"
+
+#include "articulations.hh"
+#include "stream-event.hh"
+#include "warn.hh"
+#include "context.hh"
+
+/*
+  Return an articulation list given a note_events vector and an
+  articulation_events vector.
+
+  This is necessary, because the articulations come as events if
+  they are entered outside of a chord structure, and as articulations
+  if they are inside the chord structure.  So potentially we need to
+  combine the two types.
+*/
+
+SCM
+articulation_list (vector<Stream_event *> note_events,
+                  vector<Stream_event *> articulation_events,
+                  char const *articulation_name)
+{
+  vector<Stream_event *> string_events;
+  SCM articulations = SCM_EOL;
+  vsize j = 0;
+
+  for (vsize i = 0; i < note_events.size (); i++)
+    {
+
+      Stream_event *event = note_events[i];
+
+      Stream_event *articulation_event = 0;
+
+      /*
+       For notes inside a chord construct, string indications are
+       stored as articulations on the note, so we check through
+       the notes
+      */
+      for (SCM s = event->get_property ("articulations");
+          !articulation_event && scm_is_pair (s); s = scm_cdr (s))
+       {
+         Stream_event *art = unsmob_stream_event (scm_car (s));
+
+         if (art->in_event_class (articulation_name))
+           articulation_event = art;
+       }
+
+      /*
+       For string indications listed outside a chord construct,
+       a string_number_event is generated, so if there was no string
+       in the articulations, we check for string events outside
+       the chord construct
+      */
+      if (!articulation_event && j < articulation_events.size ())
+       {
+         articulation_event = articulation_events[j];
+         if (j + 1 < articulation_events.size ())
+           j++;
+       }
+      articulations = scm_cons ((articulation_event
+                                ? articulation_event->self_scm ()
+                                : SCM_EOL),
+                               articulations);
+    }
+
+  return (scm_reverse (articulations));
+}