]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/quote-iterator.cc
Doc-es: various updates.
[lilypond.git] / lily / quote-iterator.cc
index 69c580f5d5484fc4e0c8717144e90ffce55a95f8..885e1bd3b658ef593f0418a19b66449a881a0e77 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2004--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 2004--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -71,7 +71,7 @@ Quote_iterator::accept_music_type (Stream_event *ev, bool is_cue) const
   // for cue notes if quotedCueEventTypes is not set) use quotedEventTypes
   if (is_cue)
     accept = get_outlet ()->get_property ("quotedCueEventTypes");
-  if (accept == SCM_EOL)
+  if (scm_is_null (accept))
     accept = get_outlet ()->get_property ("quotedEventTypes");
 
   for (; scm_is_pair (accept); accept = scm_cdr (accept))
@@ -128,15 +128,16 @@ Quote_iterator::construct_children ()
   SCM name = get_music ()->get_property ("quoted-context-type");
   SCM id = get_music ()->get_property ("quoted-context-id");
 
-  if (scm_is_string (id)
-      && scm_is_symbol (name))
+  if (scm_is_symbol (name))
     {
-      Context *cue_context = get_outlet ()->find_create_context (name,
-                                                                 ly_scm2string (id), SCM_EOL);
+      Context *cue_context =
+        get_outlet ()->find_create_context (name,
+                                            robust_scm2string (id, ""),
+                                            SCM_EOL);
       quote_outlet_.set_context (cue_context);
     }
   else
-    quote_outlet_.set_context (get_outlet ());
+    quote_outlet_.set_context (get_outlet ()->get_default_interpreter ());
 
   event_vector_ = get_music ()->get_property ("quoted-events");
 
@@ -193,7 +194,7 @@ Moment
 Quote_iterator::vector_moment (int idx) const
 {
   SCM entry = scm_c_vector_ref (event_vector_, idx);
-  return *unsmob_moment (scm_caar (entry));
+  return *unsmob<Moment> (scm_caar (entry));
 }
 
 void
@@ -234,14 +235,24 @@ Quote_iterator::process (Moment m)
   if (quote_ok ())
     {
       SCM entry = scm_c_vector_ref (event_vector_, event_idx_);
-      Pitch *quote_pitch = unsmob_pitch (scm_cdar (entry));
+      Pitch *quote_pitch = unsmob<Pitch> (scm_cdar (entry));
 
       /*
-        The pitch that sounds like central C
+        The pitch that sounds when written central C is played.
       */
-      Pitch *me_pitch = unsmob_pitch (get_music ()->get_property ("quoted-transposition"));
+      Pitch temp_pitch;
+      Pitch *me_pitch = unsmob<Pitch> (get_music ()->get_property ("quoted-transposition"));
       if (!me_pitch)
-        me_pitch = unsmob_pitch (get_outlet ()->get_property ("instrumentTransposition"));
+        me_pitch = unsmob<Pitch> (get_outlet ()->get_property ("instrumentTransposition"));
+      else
+        {
+          // We are not going to win a beauty contest with this one,
+          // but it is slated for replacement and touches little code.
+          // quoted-transposition currently has a different sign
+          // convention than instrumentTransposition
+          temp_pitch = me_pitch->negated ();
+          me_pitch = &temp_pitch;
+        }
       SCM cid = get_music ()->get_property ("quoted-context-id");
       bool is_cue = scm_is_string (cid) && (ly_scm2string (cid) == "cue");
 
@@ -249,7 +260,7 @@ Quote_iterator::process (Moment m)
         {
           SCM ev_acc = scm_car (s);
 
-          Stream_event *ev = unsmob_stream_event (scm_car (ev_acc));
+          Stream_event *ev = unsmob<Stream_event> (scm_car (ev_acc));
           if (!ev)
             programming_error ("no music found in quote");
           else if (accept_music_type (ev, is_cue))
@@ -263,11 +274,10 @@ Quote_iterator::process (Moment m)
                   if (me_pitch)
                     mp = *me_pitch;
 
-                  Pitch diff = pitch_interval (qp, mp);
+                  Pitch diff = pitch_interval (mp, qp);
                   ev = ev->clone ();
                   ev->make_transposable ();
-
-                  transpose_mutable (ev->get_property_alist (true), diff);
+                  ev->transpose (diff);
                   transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_);
                 }
               quote_outlet_.get_context ()->event_source ()->broadcast (ev);