]> git.donarmstrong.com Git - lilypond.git/blob - lily/key-performer.cc
8d00b911cd026e0f93c6ef56df4d0ce0b63be789
[lilypond.git] / lily / key-performer.cc
1 /*
2   key-performer.cc -- implement Key_performer
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2004 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "audio-item.hh"
10 #include "performer.hh"
11 #include "warn.hh"
12
13 class Key_performer : public Performer
14 {
15 public:
16   TRANSLATOR_DECLARATIONS (Key_performer);
17   ~Key_performer ();
18
19 protected:
20   virtual bool try_music (Music* req);
21   virtual void create_audio_elements ();
22   virtual void stop_translation_timestep ();
23
24 private:
25   Key_change_ev* key_req_;
26   Audio_key* audio_;
27 };
28
29 Key_performer::Key_performer ()
30 {
31   key_req_ = 0;
32   audio_ = 0;
33 }
34
35 Key_performer::~Key_performer ()
36 {
37 }
38
39 void
40 Key_performer::create_audio_elements ()
41 {
42   if (key_req_) 
43     {
44       SCM pitchlist = key_req_->get_property ("pitch-alist");
45       SCM proc = ly_scheme_function ("alterations-in-key");
46       
47       SCM acc = scm_call_1 (proc, pitchlist);
48       
49       Pitch key_do (0, 
50                     scm_to_int (scm_caar (pitchlist)),
51                     scm_to_int (scm_cdar (pitchlist)));
52
53       Pitch c_do (0, 0, 0);
54                   
55       SCM c_pitchlist
56         = ly_transpose_key_alist (pitchlist,
57                                   pitch_interval (key_do, c_do).smobbed_copy ());
58
59       /* MIDI keys are too limited for lilypond scales.
60          We check for minor scale and assume major otherwise.  */
61       SCM minor = scm_c_eval_string ("minor");
62       audio_ = new Audio_key (scm_to_int (acc),
63                               SCM_BOOL_T != scm_equal_p (minor, c_pitchlist));
64
65       Audio_element_info info (audio_, key_req_);
66       announce_element (info);
67       key_req_ = 0;
68     }
69 }
70
71 void
72 Key_performer::stop_translation_timestep ()
73 {
74   if (audio_)
75     {
76       play_element (audio_);
77       audio_ = 0;
78     }
79 }
80
81 bool
82 Key_performer::try_music (Music* req)
83 {
84   if (Key_change_ev *kc = dynamic_cast <Key_change_ev *> (req))
85     {
86       if (key_req_)
87         warning (_ ("FIXME: key change merge"));
88
89       key_req_ = kc;
90       return true;
91     }
92
93   return false;
94 }
95
96 ADD_TRANSLATOR (Key_performer,
97                   "","",
98                   "key-change-event",
99                   "","","");