~ubuntu-branches/ubuntu/precise/lilypond/precise

« back to all changes in this revision

Viewing changes to lily/music-sequence.cc

  • Committer: Bazaar Package Importer
  • Author(s): Thomas Bushnell, BSG
  • Date: 2006-12-19 10:18:12 UTC
  • mfrom: (3.1.4 feisty)
  • Revision ID: james.westby@ubuntu.com-20061219101812-7awtjkp0i393wxty
Tags: 2.8.7-3
scripts/midi2ly.py: When setting DATADIR, find Lilypond python files
in the @TOPLEVEL_VERSION@ directory, not 'current'.  Patch thanks to
Chris Lamb (chris@chris-lamb.co.uk).  (Closes: #400550)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*   
2
 
  music-sequence.cc --  implement Music_sequence
3
 
  
 
1
/*
 
2
  music-sequence.cc -- implement Music_sequence
 
3
 
4
4
  source file of the GNU LilyPond music typesetter
5
 
  
6
 
  (c) 1998--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7
 
  
8
 
 */
9
 
#include "music-list.hh"
 
5
 
 
6
  (c) 1998--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
7
*/
 
8
 
10
9
#include "warn.hh"
 
10
#include "program-option.hh"
11
11
#include "pitch.hh"
12
12
#include "input.hh"
13
 
 
14
 
SCM
15
 
Music_sequence::music_list ()const
16
 
{
17
 
  return get_property ("elements");
18
 
}
19
 
 
20
 
/*
21
 
  Ugh this sucks. Linear. do not use.
22
 
 */
23
 
void
24
 
Music_sequence::append_music (Music *m)
25
 
{
26
 
  set_property ("elements",
27
 
                    gh_append2 (music_list (), gh_cons (m->self_scm (), SCM_EOL)));
28
 
  scm_gc_unprotect_object (m->self_scm ());
29
 
}
30
 
 
31
 
Music_sequence::Music_sequence ( )
32
 
  : Music ()
33
 
{
34
 
}
35
 
 
36
 
void
37
 
transpose_music_list (SCM l,  Pitch rq)
38
 
{
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"
 
14
 
 
15
void
 
16
transpose_music_list (SCM lst, Pitch rq)
 
17
{
 
18
  for (SCM s = lst; scm_is_pair (s); s = scm_cdr (s))
 
19
    unsmob_music (scm_car (s))->transpose (rq);
41
20
}
42
21
 
43
22
Moment
44
 
Music_sequence::cumulative_length (SCM l) 
 
23
Music_sequence::cumulative_length (SCM l)
45
24
{
46
25
  Moment cumulative;
47
 
  Moment last_len; 
 
26
  Moment last_len;
48
27
 
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))
50
29
    {
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_)
53
 
        {
54
 
          last_len.grace_part_ = Rational (0);
55
 
        }
 
32
        last_len.grace_part_ = Rational (0);
56
33
      cumulative += last_len;
57
34
      last_len = l;
58
35
    }
60
37
  last_len.grace_part_ = Rational (0);
61
38
  cumulative += last_len;
62
39
 
63
 
  return  cumulative;
 
40
  return cumulative;
64
41
}
65
42
 
66
43
Moment
67
44
Music_sequence::maximum_length (SCM l)
68
45
{
69
46
  Moment dur = 0;
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))
71
48
    {
72
 
      Music * m = unsmob_music (ly_car (s));
73
 
      Moment l = m->get_length ();
74
 
      dur = dur >? l;
 
49
      Music *m = unsmob_music (scm_car (s));
 
50
      if (!m)
 
51
        programming_error ("Music sequence should have music elements");
 
52
      else
 
53
        {
 
54
          Moment l = m->get_length ();
 
55
          dur = max (dur, l);
 
56
        }
75
57
    }
76
58
 
77
59
  return dur;
78
60
}
79
61
 
 
62
MAKE_SCHEME_CALLBACK (Music_sequence, maximum_length_callback, 1);
 
63
SCM
 
64
Music_sequence::maximum_length_callback (SCM m)
 
65
{
 
66
  Music *me = unsmob_music (m);
 
67
  return maximum_length (me->get_property ("elements")).smobbed_copy ();
 
68
}
 
69
 
 
70
MAKE_SCHEME_CALLBACK (Music_sequence, cumulative_length_callback, 1);
 
71
SCM
 
72
Music_sequence::cumulative_length_callback (SCM m)
 
73
{
 
74
  Music *me = unsmob_music (m);
 
75
  return cumulative_length (me->get_property ("elements")).smobbed_copy ();
 
76
}
 
77
 
 
78
MAKE_SCHEME_CALLBACK (Music_sequence, minimum_start_callback, 1);
 
79
SCM
 
80
Music_sequence::minimum_start_callback (SCM m)
 
81
{
 
82
  Music *me = unsmob_music (m);
 
83
  return minimum_start (me->get_property ("elements")).smobbed_copy ();
 
84
}
 
85
 
 
86
MAKE_SCHEME_CALLBACK (Music_sequence, first_start_callback, 1);
 
87
SCM
 
88
Music_sequence::first_start_callback (SCM m)
 
89
{
 
90
  Music *me = unsmob_music (m);
 
91
  return first_start (me->get_property ("elements")).smobbed_copy ();
 
92
}
 
93
 
80
94
Pitch
81
 
music_list_to_relative (SCM l,Pitch p, bool ret_first)
 
95
music_list_to_relative (SCM l, Pitch p, bool ret_first)
82
96
{
83
97
  Pitch first = p;
84
 
  int count=0;
 
98
  int count = 0;
85
99
 
86
100
  Pitch last = p;
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))
88
102
    {
89
 
      if (Music *m = unsmob_music (ly_car (s)))
 
103
      if (Music *m = unsmob_music (scm_car (s)))
90
104
        {
91
105
          last = m->to_relative_octave (last);
92
 
          if (!count ++)
 
106
          if (!count++)
93
107
            first = last;
94
108
        }
95
109
    }
96
110
 
97
 
  return  (ret_first)?  first : last;
 
111
  return (ret_first) ? first : last;
98
112
}
99
113
 
100
 
 
101
114
void
102
115
compress_music_list (SCM l, Moment m)
103
116
{
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);
106
119
}
107
120
 
108
 
ADD_MUSIC (Music_sequence);
109
 
 
110
121
Moment
111
122
Music_sequence::minimum_start (SCM l)
112
123
{
113
124
  Moment m;
114
 
  
115
 
  for (SCM s = l; gh_pair_p (s);  s = ly_cdr (s))
116
 
    {
117
 
      m = m <? unsmob_music (ly_car (s))->start_mom ();
118
 
    }
 
125
 
 
126
  for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
 
127
    m = min (m, unsmob_music (scm_car (s))->start_mom ());
119
128
  return m;
120
129
}
121
130
 
122
131
Moment
123
 
Music_sequence::first_start (SCM l) 
 
132
Music_sequence::first_start (SCM l)
124
133
{
125
134
  Moment m;
126
 
  
127
 
  for (SCM s = l; gh_pair_p (s);  s = ly_cdr (s))
 
135
 
 
136
  for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
128
137
    {
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 ())
135
144
  return m;
136
145
}
137
146
 
 
147
MAKE_SCHEME_CALLBACK (Music_sequence, simultaneous_relative_callback, 2);
 
148
SCM
 
149
Music_sequence::simultaneous_relative_callback (SCM music, SCM pitch)
 
150
{
 
151
  Music *me = unsmob_music (music);
 
152
  Pitch p = *unsmob_pitch (pitch);
 
153
 
 
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);
 
158
 
 
159
  Pitch retval = music_list_to_relative (elts, p, false);
 
160
 
 
161
  if (lily_1_8_relative)
 
162
    {
 
163
 
 
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;
 
167
 
 
168
      retval = retval_1_8;
 
169
    }
 
170
 
 
171
  return retval.smobbed_copy ();
 
172
}
 
173
 
 
174
MAKE_SCHEME_CALLBACK (Music_sequence, event_chord_relative_callback, 2);
 
175
SCM
 
176
Music_sequence::event_chord_relative_callback (SCM music, SCM pitch)
 
177
{
 
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 ();
 
182
}
 
183