]> git.donarmstrong.com Git - lilypond.git/blob - lily/note-performer.cc
1f88de4aadaf59dd8e42689887810ea079a37bab
[lilypond.git] / lily / note-performer.cc
1 /*
2   note-performer.cc -- implement Note_performer
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996,  1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
7  */
8
9 #include "note-performer.hh"
10 #include "musical-request.hh"
11 #include "audio-item.hh"
12 #include "audio-column.hh"
13 #include "global-translator.hh"
14 #include "debug.hh"
15
16
17 ADD_THIS_TRANSLATOR (Note_performer);
18
19 Note_performer::Note_performer ()
20 {
21 }
22
23 void 
24 Note_performer::do_print () const
25 {
26 #ifndef NPRINT
27   if (note_req_l_arr_.size()>0)
28     for(int i=0;i<note_req_l_arr_.size();i++)
29       note_req_l_arr_[i]->print ();
30 #endif
31 }
32
33 void 
34 Note_performer::do_process_requests () 
35 {
36   if (note_req_l_arr_.size ())
37     {
38       int transposing_i = 0;
39       //urg
40       Scalar prop = get_property ("transposing", 0);
41       if (!prop.empty_b () && prop.isnum_b ()) 
42         transposing_i = prop;
43
44       while (note_req_l_arr_.size ())
45         {
46           Note_req* n = note_req_l_arr_.pop ();
47           Audio_note* p = new Audio_note (n->pitch_, n->length_mom (), transposing_i);
48           Audio_element_info info (p, n);
49           announce_element (info);
50           note_p_arr_.push (p);
51         }
52     }
53 }
54
55 void
56 Note_performer::process_acknowledged ()
57 {
58 }
59
60 Global_translator*
61 Note_performer::global_translator_l ()
62 {
63   Translator *t = this;
64   Global_translator *global_l =0;
65   do
66     {
67       t = t->daddy_trans_l_ ;
68       global_l = dynamic_cast<Global_translator*> (t);
69     }
70   while (!global_l);
71
72   return global_l;
73 }
74
75
76 void
77 Note_performer::do_pre_move_processing ()
78 {
79
80   // why don't grace notes show up here?
81   // --> grace notes effectively do not get delayed
82   Global_translator* global_l = global_translator_l ();
83   for (int i=0; i < note_p_arr_.size (); i++)
84     {
85       Audio_note* n = note_p_arr_[i];
86       if (Moment m= n->delayed_until_mom_)
87         {
88           global_l->add_moment_to_process (m);
89           delayed_p_arr_.push (n);
90           note_p_arr_[i] = 0;
91           note_p_arr_.del (i);
92           i--;
93         }
94     }
95
96   Moment now = now_mom ();
97   for (int i=0; i < note_p_arr_.size (); i++)
98     {
99       play_element (note_p_arr_[i]);
100     }
101   note_p_arr_.clear ();
102   note_req_l_arr_.clear ();
103   for (int i=0; i < delayed_p_arr_.size (); i++)
104     {
105       Audio_note* n = delayed_p_arr_[i];
106       if (n->delayed_until_mom_ <= now)
107         {
108           play_element (n);
109           delayed_p_arr_[i] = 0;
110           delayed_p_arr_.del (i);
111           i--;
112         }
113     }
114 }
115  
116 bool
117 Note_performer::do_try_music (Music* req_l)
118 {
119   if (Note_req *nr = dynamic_cast <Note_req *> (req_l))
120     {
121       note_req_l_arr_.push (nr);
122       return true;
123     }
124   return false;
125 }