]> git.donarmstrong.com Git - lilypond.git/blob - lily/score.cc
b62844147539607001d06401a6d49fc8c7650c5a
[lilypond.git] / lily / score.cc
1 /*
2   score.cc -- implement Score
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "score.hh"
10 #include "debug.hh"
11 #include "music-output-def.hh"
12 #include "music-output.hh"
13 #include "source.hh"
14 #include "source-file.hh"
15 #include "music-iterator.hh"
16 #include "music.hh"
17 #include "global-translator.hh"
18 #include "header.hh"
19 #include "cpu-timer.hh"
20 #include "main.hh"
21 #include "paper-def.hh"
22
23
24 Score::Score()
25     : Input()
26 {
27   header_p_ = 0;
28   music_p_ = 0;
29   errorlevel_i_ = 0;
30 }
31
32 Score::Score (Score const &s)
33 {
34   music_p_ = (s.music_p_) ? s.music_p_->clone() : 0;
35   for (int i=0; i < s.def_p_arr_.size (); i++)
36     def_p_arr_.push(s.def_p_arr_[i]->clone());
37
38   header_p_ =  (s.header_p_) ? new Header (*s.header_p_): 0;
39 }
40
41 Score::~Score()
42 {
43   delete header_p_;
44   for (int i=0; i < def_p_arr_.size (); i++)
45     delete def_p_arr_[i];
46   delete music_p_;
47 }
48
49 void
50 Score::run_translator (Music_output_def *odef_l)
51 {
52   Cpu_timer timer;
53   Global_translator * trans_p = odef_l->get_global_translator_p();
54   if (!trans_p)
55     return ;
56
57   *mlog << _("\nInterpreting music ...");
58   trans_p->last_mom_ = music_p_->time_int().max ();
59
60   Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_,
61                                                                  trans_p);
62   iter->construct_children();
63
64   if (! iter->ok())
65     {
66       delete iter;
67       warning (_("Need music in a score"));
68       errorlevel_i_ =1;
69       return ;
70     }
71
72   trans_p->start();
73
74   while (iter->ok() || trans_p->moments_left_i ())
75     {
76       Moment w = infinity_mom;
77       if (iter->ok())
78         {
79           w = iter->next_moment();
80           DOUT << "proccing: " << w <<"\n";
81           if (!monitor->silent_b ("walking"))
82             iter->print();
83         }
84       
85       trans_p->modify_next (w);
86       trans_p->prepare (w);
87       if (!monitor->silent_b ("walking"))
88         trans_p->print();
89
90       iter->process_and_next (w);
91       trans_p->process();
92     }
93   delete iter;
94   trans_p->finish();
95
96
97   if (errorlevel_i_)
98     {
99       // should we? hampers debugging.
100       warning (_("Errors found, /*not processing score*/"));
101     }
102
103   Music_output * output = trans_p->get_output_p();
104   delete trans_p;
105   *mlog << _(" (time: ") << String(timer.read (), "%.2f") << _(" seconds)");
106
107
108   output->header_l_ = header_p_;
109   output->origin_str_ =  location_str();
110
111   *mlog << endl;
112   output->process();
113   delete output ;
114 }
115
116 void
117 Score::process()
118 {
119   if (!music_p_)
120     return;
121
122   print();
123   for (int i=0; i < def_p_arr_.size (); i++)
124     {
125       if (no_paper_global_b 
126           && def_p_arr_[i]->is_type_b (Paper_def::static_name ()))
127         continue;
128       run_translator (def_p_arr_[i]);
129     }
130 }
131
132
133
134 void
135 Score::print() const
136 {
137 #ifndef NPRINT
138   DOUT << "score {\n";
139   music_p_ -> print ();
140   for (int i=0; i < def_p_arr_.size (); i++)
141     def_p_arr_[i]->print();
142   DOUT << "}\n";
143 #endif
144 }
145
146 void
147 Score::add (Music_output_def *pap_p)
148 {
149   def_p_arr_.push(pap_p);
150 }