2 key-performer.cc -- implement Key_performer
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2004 Jan Nieuwenhuizen <janneke@gnu.org>
9 #include "lily-guile.hh"
11 #include "audio-item.hh"
12 #include "performer.hh"
16 class Key_performer
: public Performer
19 TRANSLATOR_DECLARATIONS (Key_performer
);
23 virtual bool try_music (Music
* req
);
24 virtual void create_audio_elements ();
25 virtual void stop_translation_timestep ();
28 Key_change_ev
* key_req_
;
32 Key_performer::Key_performer ()
38 Key_performer::~Key_performer ()
43 Key_performer::create_audio_elements ()
47 SCM pitchlist
= key_req_
->get_property ("pitch-alist");
48 SCM proc
= ly_scheme_function ("alterations-in-key");
50 SCM acc
= scm_call_1 (proc
, pitchlist
);
53 ly_scm2int (ly_caar (pitchlist
)),
54 ly_scm2int (ly_cdar (pitchlist
)));
59 = ly_transpose_key_alist (pitchlist
,
60 interval (key_do
, c_do
).smobbed_copy ());
62 /* MIDI keys are too limited for lilypond scales.
63 We check for minor scale and assume major otherwise. */
64 SCM minor
= scm_c_eval_string ("minor");
65 audio_
= new Audio_key (ly_scm2int (acc
),
66 SCM_BOOL_T
!= scm_equal_p (minor
, c_pitchlist
));
68 Audio_element_info
info (audio_
, key_req_
);
69 announce_element (info
);
75 Key_performer::stop_translation_timestep ()
79 play_element (audio_
);
85 Key_performer::try_music (Music
* req
)
87 if (Key_change_ev
*kc
= dynamic_cast <Key_change_ev
*> (req
))
90 warning (_ ("FIXME: key change merge"));
99 ENTER_DESCRIPTION (Key_performer
,