]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/command-request.hh
488728d2d9143f3df50045a7126dfdffed267086
[lilypond.git] / lily / include / command-request.hh
1 /*
2   command-request.hh -- declare Non musical requests
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9
10 #ifndef COMMANDREQUEST_HH
11 #define COMMANDREQUEST_HH
12
13 #include "request.hh"
14 #include "varray.hh"
15
16 /** Request which are  assumed to be "happening" before the
17   musical requests. */
18 struct Command_req : virtual Request {
19     REQUESTMETHODS(Command_req, command);
20
21     virtual Measure_grouping_req * measuregrouping() { return 0; }
22     virtual Clef_change_req * clefchange() { return 0; }
23     virtual Key_change_req * keychange() { return 0; }
24     virtual Partial_measure_req * partial() { return 0; }
25     virtual Meter_change_req * meterchange() { return 0; }
26     virtual Bar_req *bar() { return 0; }
27     virtual Cadenza_req *cadenza() { return 0; }
28     virtual Timing_req*timing() {  return 0; }
29 };
30
31
32 /** Baseclass for meter/partial req. It has to be handled by
33   Staff_{walker,column} baseclass.  */
34 struct Timing_req : Command_req {
35     REQUESTMETHODS(Timing_req, timing);
36 };
37
38
39 struct Partial_measure_req : Timing_req {
40     Moment duration_;
41
42     Partial_measure_req(Moment);
43     REQUESTMETHODS(Partial_measure_req, partial);
44 };
45
46 /**
47   todo: allow C meter
48  */
49 struct Meter_change_req : Timing_req {
50     int beats_i_, one_beat_i_;
51
52     int compare(Meter_change_req const&);
53     Meter_change_req();
54     void set(int,int);
55     REQUESTMETHODS(Meter_change_req, meterchange);
56 };
57
58 /// toggle Cadenza mode
59 struct Cadenza_req : Timing_req {
60     /// turn on?
61     bool on_b_;
62     Cadenza_req(bool);
63     REQUESTMETHODS(Cadenza_req,cadenza);
64 };
65
66 /// check if we're at start of a  measure.
67 struct Barcheck_req : Timing_req {
68
69     REQUESTMETHODS(Barcheck_req,barcheck);
70 };
71
72 struct Measure_grouping_req: Timing_req {
73     Array<int> beat_i_arr_;
74     Array<Moment> elt_length_arr_;
75
76     REQUESTMETHODS(Measure_grouping_req, measuregrouping);
77 };
78
79 struct Group_change_req : Command_req {
80     String newgroup_str_;
81     REQUESTMETHODS(Group_change_req, groupchange);
82 };
83
84 /** draw a (repeat)-bar. This something different than #Barcheck_req#,
85   the latter should only happen at the start of a measure.  */
86 struct Bar_req : Command_req {
87     String type_str_;
88     Bar_req(String);
89     int compare(const Bar_req&)const;
90     REQUESTMETHODS(Bar_req,bar);
91 };
92 struct Terminate_voice_req : Command_req {
93     REQUESTMETHODS(Terminate_voice_req,terminate);
94 };
95
96 struct Group_feature_req : Command_req {
97     int stemdir_i_;
98     Group_feature_req();
99     REQUESTMETHODS(Group_feature_req, groupfeature);
100 };
101
102
103 /**
104     Handle key changes.
105     Routines for sharps and flats are separated, 
106     so that caller may identify non-conventional keys.
107 */
108 struct Key_change_req : Command_req {
109     Array<Melodic_req*> melodic_p_arr_;
110     bool minor_b_;
111   
112     Key_change_req();
113     Key_change_req(Key_change_req const&);
114     ~Key_change_req();
115     REQUESTMETHODS(Key_change_req, keychange);
116
117     /// return number of flats in key
118     int flats_i();
119
120     /// return number of sharps in key
121     int sharps_i();
122
123     void transpose(Melodic_req const & d) const;
124     /// is minor key?
125     int minor_b();
126 };
127
128 struct Clef_change_req : Command_req {
129     String clef_str_;
130     Clef_change_req(String);
131     REQUESTMETHODS(Clef_change_req, clefchange);
132 };
133
134 #endif // COMMANDREQUEST_HH