+ for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
+ unsmob_music (scm_car (s))->compress (m);
+}
+
+Moment
+Music_sequence::minimum_start (SCM l)
+{
+ Moment m;
+
+ for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
+ m = min (m, unsmob_music (scm_car (s))->start_mom ());
+ return m;
+}
+
+Moment
+Music_sequence::first_start (SCM l)
+{
+ Moment m;
+
+ for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
+ {
+ Music *mus = unsmob_music (scm_car (s));
+ Moment l = mus->get_length ();
+ Moment s = mus->start_mom ();
+ if (l.to_bool () || s.to_bool ())
+ return s;
+ }
+ return m;
+}
+
+MAKE_SCHEME_CALLBACK (Music_sequence, simultaneous_relative_callback, 2);
+SCM
+Music_sequence::simultaneous_relative_callback (SCM music, SCM pitch)
+{
+ Music *me = unsmob_music (music);
+ Pitch p = *unsmob_pitch (pitch);
+
+ SCM elts = me->get_property ("elements");
+ SCM copied = SCM_EOL;
+ if (lily_1_8_relative)
+ copied = ly_music_deep_copy (elts);
+
+ Pitch retval = music_list_to_relative (elts, p, false);
+
+ if (lily_1_8_relative)
+ {
+
+ Pitch retval_1_8 = music_list_to_relative (copied, p, true);
+ if (retval_1_8 != retval)
+ lily_1_8_compatibility_used = true;
+
+ retval = retval_1_8;
+ }
+
+ return retval.smobbed_copy ();
+}
+
+MAKE_SCHEME_CALLBACK (Music_sequence, event_chord_relative_callback, 2);
+SCM
+Music_sequence::event_chord_relative_callback (SCM music, SCM pitch)
+{
+ Music *me = unsmob_music (music);
+ Pitch p = *unsmob_pitch (pitch);
+ return music_list_to_relative (me->get_property ("elements"),
+ p, true).smobbed_copy ();
+}
+
+MAKE_SCHEME_CALLBACK (Music_sequence, repeated_chord_relative_callback, 2);
+SCM
+Music_sequence::repeated_chord_relative_callback (SCM music, SCM pitch)
+{
+ Music *me = unsmob_music (music);
+ Music *repeated_chord = unsmob_music (me->get_property ("element"));
+ Music *original_chord = unsmob_music (me->get_property ("original-chord"));
+
+ /* A repeated chord octave is not computed from the previous pitch,
+ * (this function `pitch' argument), but from the original chord, so
+ * that repeated chords have the same octave have the original chord,
+ * even though other simple notes have been entered meanwhile.
+ */
+ assert (repeated_chord);
+ Pitch *p = 0;
+ /* Get the original chord first pitch */
+ if (original_chord)
+ {
+ for (SCM s = original_chord->get_property ("elements"); scm_is_pair (s); s = scm_cdr (s))
+ {
+ if (Music *m = unsmob_music (scm_car (s)))
+ {
+ p = unsmob_pitch (m->get_property ("pitch"));
+ if (p)
+ break;
+ }
+ }
+ }
+ /* Use the `pitch' argument if no pitch found in original chord. */
+ if (! p)
+ p = unsmob_pitch (pitch);
+
+ /* Change the first note pitch to -1, to avoid octaviation. Indeed,
+ * the first pitch should be the same as the original chord first
+ * pitch. */
+ for (SCM s = repeated_chord->get_property ("elements"); scm_is_pair (s); s = scm_cdr (s))
+ {
+ if (Music *m = unsmob_music (scm_car (s)))
+ {
+ Pitch *first_pitch = unsmob_pitch (m->get_property ("pitch"));
+ if (first_pitch)
+ {
+ Pitch new_pitch = Pitch (-1,
+ first_pitch->get_notename (),
+ first_pitch->get_alteration ());
+ m->set_property ("pitch", new_pitch.smobbed_copy ());
+ break;
+ }
+ }
+ }
+ music_list_to_relative (repeated_chord->get_property ("elements"), *p, true).smobbed_copy ();
+ /* Return `pitch' instead of the repeated chord first pitch,
+ * because `pitch' is the last explicitly entered pitch */
+ return pitch;