]> git.donarmstrong.com Git - lilypond.git/blob - lily/drum-note-performer.cc
* input/no-notation/midi-lyric-barcheck.ly: new file.
[lilypond.git] / lily / drum-note-performer.cc
1 /*
2   note-performer.cc -- implement Drum_note_performer
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996--2004 Jan Nieuwenhuizen <janneke@gnu.org>
7  */
8
9 #include "performer.hh"
10 #include "event.hh"
11 #include "audio-item.hh"
12 #include "audio-column.hh"
13 #include "global-translator.hh"
14 #include "warn.hh"
15
16 class Drum_note_performer : public Performer {
17 public:
18   TRANSLATOR_DECLARATIONS(Drum_note_performer);
19   
20 protected:
21   virtual bool try_music (Music *ev) ;
22   virtual void stop_translation_timestep ();
23   virtual void create_audio_elements ();
24
25   Global_translator* get_global_translator ();
26 private:
27   Link_array<Music> note_evs_;
28   Link_array<Audio_note> notes_;
29   Link_array<Audio_note> delayeds_;
30 };
31
32 void 
33 Drum_note_performer::create_audio_elements ()
34 {
35   SCM tab =0;
36   if (!tab) tab = get_property ("drumPitchTable");
37   
38   while (note_evs_.size ())
39     {
40       Music* n = note_evs_.pop ();
41       SCM sym = n->get_mus_property ("drum-type");
42       SCM defn = SCM_EOL;
43
44       if (gh_symbol_p (sym)
45           &&  (scm_hash_table_p (tab) == SCM_BOOL_T))
46         defn = scm_hashq_ref (tab, sym, SCM_EOL);
47       
48       if (Pitch * pit = unsmob_pitch (defn))
49         {
50           Audio_note* p = new Audio_note (*pit,  n->get_length (), 0);
51           Audio_element_info info (p, n);
52           announce_element (info);
53           notes_.push (p);
54         }
55     }
56   
57   note_evs_.clear ();
58 }
59
60 Global_translator*
61 Drum_note_performer::get_global_translator ()
62 {
63   Translator *t = this;
64   Global_translator *global =0;
65   do
66     {
67       t = t->daddy_trans_ ;
68       global = dynamic_cast<Global_translator*> (t);
69     }
70   while (!global);
71
72   return global;
73 }
74
75
76 void
77 Drum_note_performer::stop_translation_timestep ()
78 {
79   // why don't grace notes show up here?
80   // --> grace notes effectively do not get delayed
81   Global_translator* global = get_global_translator ();
82   for (int i=0; i < notes_.size (); i++)
83     {
84       Audio_note* n = notes_[i];
85       Moment m= n->delayed_until_mom_;
86       if (m.to_bool ())
87         {
88           global->add_moment_to_process (m);
89           delayeds_.push (n);
90           notes_[i] = 0;
91           notes_.del (i);
92           i--;
93         }
94     }
95
96   Moment now = now_mom ();
97   for (int i=0; i < notes_.size (); i++)
98     {
99       play_element (notes_[i]);
100     }
101   notes_.clear ();
102   note_evs_.clear ();
103   for (int i=0; i < delayeds_.size (); i++)
104     {
105       Audio_note* n = delayeds_[i];
106       if (n->delayed_until_mom_ <= now)
107         {
108           play_element (n);
109           delayeds_[i] = 0;
110           delayeds_.del (i);
111           i--;
112         }
113     }
114 }
115  
116 bool
117 Drum_note_performer::try_music (Music* ev)
118 {
119   if (ev->is_mus_type ("note-event"))
120     {
121       note_evs_.push (ev);
122       return true;
123     }
124   else if (ev->is_mus_type ("busy-playing-event"))
125     return note_evs_.size ();
126   
127   return false;
128 }
129
130 ENTER_DESCRIPTION(Drum_note_performer,
131                   "Play drum notes.","",
132                   "note-event busy-playing-event","","","");
133
134 Drum_note_performer::Drum_note_performer()
135 {
136 }