]> git.donarmstrong.com Git - lilypond.git/blob - lily/score.cc
release: 0.1.41
[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_->clone();
35   for (int i=0; i < s.def_p_arr_.size (); i++)
36     def_p_arr_.push(s.def_p_arr_[i]->clone());
37   header_p_ = new Header (*s.header_p_);
38 }
39
40 Score::~Score()
41 {
42   delete header_p_;
43   for (int i=0; i < def_p_arr_.size (); i++)
44     delete def_p_arr_[i];
45   delete music_p_;
46 }
47
48 void
49 Score::run_translator (Music_output_def *odef_l)
50 {
51   Cpu_timer timer;
52   Global_translator * trans_p = odef_l->get_global_translator_p();
53   if (!trans_p)
54     return ;
55
56   *mlog << _("\nInterpreting music ...");
57   trans_p->last_mom_ = music_p_->time_int().max ();
58
59   Music_iterator * iter = Music_iterator::static_get_iterator_p (music_p_,
60                                                                  trans_p);
61   iter->construct_children();
62
63   if (! iter->ok())
64     {
65       delete iter;
66       warning (_("Need music in a score"));
67       errorlevel_i_ =1;
68       return ;
69     }
70
71   trans_p->start();
72
73   while (iter->ok() || trans_p->moments_left_i ())
74     {
75       Moment w = infinity_mom;
76       if (iter->ok())
77         {
78           w = iter->next_moment();
79           DOUT << "proccing: " << w <<"\n";
80           if (!monitor->silent_b ("walking"))
81             iter->print();
82         }
83       
84       trans_p->modify_next (w);
85       trans_p->prepare (w);
86       if (!monitor->silent_b ("walking"))
87         trans_p->print();
88
89       iter->process_and_next (w);
90       trans_p->process();
91     }
92   delete iter;
93   trans_p->finish();
94
95
96   if (errorlevel_i_)
97     {
98       // should we? hampers debugging.
99       warning (_("Errors found, /*not processing score*/"));
100     }
101
102   Music_output * output = trans_p->get_output_p();
103   delete trans_p;
104   *mlog << _(" (time: ") << String(timer.read (), "%.2f") << _(" seconds)");
105
106
107   output->header_l_ = header_p_;
108   output->origin_str_ =  location_str();
109
110   *mlog << endl;
111   output->process();
112   delete output ;
113 }
114
115 void
116 Score::process()
117 {
118   if (!music_p_)
119     return;
120
121   print();
122   for (int i=0; i < def_p_arr_.size (); i++)
123     {
124       if (no_paper_global_b 
125           && def_p_arr_[i]->is_type_b (Paper_def::static_name ()))
126         continue;
127       run_translator (def_p_arr_[i]);
128     }
129 }
130
131
132
133 void
134 Score::print() const
135 {
136 #ifndef NPRINT
137   DOUT << "score {\n";
138   music_p_ -> print ();
139   for (int i=0; i < def_p_arr_.size (); i++)
140     def_p_arr_[i]->print();
141   DOUT << "}\n";
142 #endif
143 }
144
145 void
146 Score::add (Music_output_def *pap_p)
147 {
148   def_p_arr_.push(pap_p);
149 }