2
music-sequence.cc -- implement Music_sequence
2
music-sequence.cc -- implement Music_sequence
4
4
source file of the GNU LilyPond music typesetter
6
(c) 1998--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9
#include "music-list.hh"
6
(c) 1998--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
10
#include "program-option.hh"
11
11
#include "pitch.hh"
12
12
#include "input.hh"
15
Music_sequence::music_list ()const
17
return get_property ("elements");
21
Ugh this sucks. Linear. do not use.
24
Music_sequence::append_music (Music *m)
26
set_property ("elements",
27
gh_append2 (music_list (), gh_cons (m->self_scm (), SCM_EOL)));
28
scm_gc_unprotect_object (m->self_scm ());
31
Music_sequence::Music_sequence ( )
37
transpose_music_list (SCM l, Pitch rq)
39
for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
40
unsmob_music (ly_car (s))->transpose (rq);
13
#include "music-sequence.hh"
16
transpose_music_list (SCM lst, Pitch rq)
18
for (SCM s = lst; scm_is_pair (s); s = scm_cdr (s))
19
unsmob_music (scm_car (s))->transpose (rq);
44
Music_sequence::cumulative_length (SCM l)
23
Music_sequence::cumulative_length (SCM l)
49
for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
28
for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
51
Moment l = unsmob_music (ly_car (s))->get_length ();
30
Moment l = unsmob_music (scm_car (s))->get_length ();
52
31
if (last_len.grace_part_ && l.main_part_)
54
last_len.grace_part_ = Rational (0);
32
last_len.grace_part_ = Rational (0);
56
33
cumulative += last_len;
60
37
last_len.grace_part_ = Rational (0);
61
38
cumulative += last_len;
67
44
Music_sequence::maximum_length (SCM l)
70
for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
47
for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
72
Music * m = unsmob_music (ly_car (s));
73
Moment l = m->get_length ();
49
Music *m = unsmob_music (scm_car (s));
51
programming_error ("Music sequence should have music elements");
54
Moment l = m->get_length ();
62
MAKE_SCHEME_CALLBACK (Music_sequence, maximum_length_callback, 1);
64
Music_sequence::maximum_length_callback (SCM m)
66
Music *me = unsmob_music (m);
67
return maximum_length (me->get_property ("elements")).smobbed_copy ();
70
MAKE_SCHEME_CALLBACK (Music_sequence, cumulative_length_callback, 1);
72
Music_sequence::cumulative_length_callback (SCM m)
74
Music *me = unsmob_music (m);
75
return cumulative_length (me->get_property ("elements")).smobbed_copy ();
78
MAKE_SCHEME_CALLBACK (Music_sequence, minimum_start_callback, 1);
80
Music_sequence::minimum_start_callback (SCM m)
82
Music *me = unsmob_music (m);
83
return minimum_start (me->get_property ("elements")).smobbed_copy ();
86
MAKE_SCHEME_CALLBACK (Music_sequence, first_start_callback, 1);
88
Music_sequence::first_start_callback (SCM m)
90
Music *me = unsmob_music (m);
91
return first_start (me->get_property ("elements")).smobbed_copy ();
81
music_list_to_relative (SCM l,Pitch p, bool ret_first)
95
music_list_to_relative (SCM l, Pitch p, bool ret_first)
87
for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
101
for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
89
if (Music *m = unsmob_music (ly_car (s)))
103
if (Music *m = unsmob_music (scm_car (s)))
91
105
last = m->to_relative_octave (last);
97
return (ret_first)? first : last;
111
return (ret_first) ? first : last;
102
115
compress_music_list (SCM l, Moment m)
104
for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
105
unsmob_music (ly_car (s))->compress (m);
117
for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
118
unsmob_music (scm_car (s))->compress (m);
108
ADD_MUSIC (Music_sequence);
111
122
Music_sequence::minimum_start (SCM l)
115
for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
117
m = m <? unsmob_music (ly_car (s))->start_mom ();
126
for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
127
m = min (m, unsmob_music (scm_car (s))->start_mom ());
123
Music_sequence::first_start (SCM l)
132
Music_sequence::first_start (SCM l)
127
for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
136
for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
129
Music * mus = unsmob_music (ly_car (s));
138
Music *mus = unsmob_music (scm_car (s));
130
139
Moment l = mus->get_length ();
131
140
Moment s = mus->start_mom ();
132
141
if (l.to_bool () || s.to_bool ())
147
MAKE_SCHEME_CALLBACK (Music_sequence, simultaneous_relative_callback, 2);
149
Music_sequence::simultaneous_relative_callback (SCM music, SCM pitch)
151
Music *me = unsmob_music (music);
152
Pitch p = *unsmob_pitch (pitch);
154
SCM elts = me->get_property ("elements");
155
SCM copied = SCM_EOL;
156
if (lily_1_8_relative)
157
copied = ly_music_deep_copy (elts);
159
Pitch retval = music_list_to_relative (elts, p, false);
161
if (lily_1_8_relative)
164
Pitch retval_1_8 = music_list_to_relative (copied, p, true);
165
if (retval_1_8 != retval)
166
lily_1_8_compatibility_used = true;
171
return retval.smobbed_copy ();
174
MAKE_SCHEME_CALLBACK (Music_sequence, event_chord_relative_callback, 2);
176
Music_sequence::event_chord_relative_callback (SCM music, SCM pitch)
178
Music *me = unsmob_music (music);
179
Pitch p = *unsmob_pitch (pitch);
180
return music_list_to_relative (me->get_property ("elements"),
181
p, true).smobbed_copy ();