]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/musical-request.hh
release: 0.1.11
[lilypond.git] / lily / include / musical-request.hh
1 /*
2   musical-request.hh -- declare Musical requests
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9
10 #ifndef MUSICALREQUESTS_HH
11 #define MUSICALREQUESTS_HH
12
13 #include "lily-proto.hh"
14 #include "request.hh"
15 #include "duration.hh"
16
17
18 /**
19   A request which is coupled to a #Request_chord#
20   Base class only
21  */
22 class Musical_req  : public virtual Request  {
23 public:
24     
25   virtual Lyric_req* lreq_l() { return 0; }
26   virtual Note_req *note() { return 0;}
27   virtual Stem_req *stem() { return 0;}
28   virtual Melodic_req *melodic() { return 0; }
29   virtual Slur_req *slur() { return 0 ; }
30   virtual Beam_req *beam() { return 0 ; }
31   virtual Rhythmic_req*rhythmic() { return 0; }
32   virtual Musical_script_req*musicalscript() { return 0; }
33   virtual Text_req*text() { return 0; }
34   virtual Rest_req *rest() { return 0; }
35   virtual Skip_req* skip() { return 0; }
36   virtual Dynamic_req* dynamic() { return 0; }
37   virtual Absolute_dynamic_req * absdynamic() { return 0; }
38   virtual Tie_req * tie() { return 0; }
39   virtual Span_dynamic_req * span_dynamic() { return 0; }
40   REQUESTMETHODS(Musical_req, musical);
41 };
42
43
44
45 /** a request with a duration.
46   This request is used only a base class.
47  */
48 class Rhythmic_req  : public virtual Musical_req  {
49 public:
50   Duration duration_;
51     
52   /* *************** */
53   void set_duration (Duration);
54   bool do_equal_b (Request*) const;
55   virtual Moment duration() const;
56   Rhythmic_req();
57   static int compare (Rhythmic_req const&,Rhythmic_req const&);
58   REQUESTMETHODS(Rhythmic_req, rhythmic);
59 };
60
61 class Skip_req  : public Rhythmic_req  {
62 public:
63   REQUESTMETHODS(Skip_req, skip);
64 };
65 struct Spacing_req :virtual Request {
66   Moment next;
67   Real distance;
68   Real strength;
69   /* *************** */
70   Spacing_req();
71   REQUESTMETHODS(Spacing_req, spacing);
72 };
73
74 class Blank_req  : public Spacing_req, Rhythmic_req  {
75 public:
76   REQUESTMETHODS(Spacing_req, spacing);
77     
78 };
79
80 /// Put a text above or below (?) this staff.
81 class Text_req  : public virtual Musical_req  {
82 public:
83   /// preferred position (above/below)
84   Direction dir_;
85   /// the characteristics of the text
86   Text_def *tdef_p_;
87
88   /* *************** */
89   Text_req (int d, Text_def*);
90   ~Text_req();
91   Text_req (Text_req const&);
92
93   REQUESTMETHODS(Text_req,text);
94 };
95
96 /** Put a text in lyric_staff
97   @see Lyric_staff
98   */
99 class Lyric_req  : public  Rhythmic_req, public Text_req  {
100 public:
101   Lyric_req (Text_def* t_p);
102   REQUESTMETHODS(Lyric_req, lreq_l);
103 };
104
105 /// request which has some kind of pitch
106 struct Melodic_req :virtual Musical_req
107 {
108   /// 0 is c, 6 is b
109   int notename_i_;
110   /// 0 is central c
111   int octave_i_;
112
113     /// 0 natural, 1 sharp, etc
114   int accidental_i_;
115
116   /// return height from central c (in halflines)
117   int height() const;
118
119   /// transpose. #delta# is relative to central c.
120   void transpose (Melodic_req const &delta);
121   /// return pitch from central c (in halfnotes)
122   int pitch() const; 
123   Melodic_req();
124   bool do_equal_b (Request*) const;
125   static int compare (Melodic_req const&,Melodic_req const&);
126   REQUESTMETHODS(Melodic_req,melodic);
127 };
128
129 /// Put a note of specified type, height, and with accidental on the staff.
130 class Note_req  : public Rhythmic_req, virtual public Melodic_req  {
131 public:
132     
133   /// force/supress printing of accidental.
134   bool forceacc_b_;
135   Note_req();
136   bool do_equal_b (Request*) const;
137   Rhythmic_req* rhythmic() { return Rhythmic_req::rhythmic (); }
138   REQUESTMETHODS(Note_req, note);
139 };
140
141 /**
142 Put a rest on the staff. Why a request? It might be a good idea to not typeset the rest, if the paper is too crowded.
143 */
144 class Rest_req : public Rhythmic_req {
145 public:
146   REQUESTMETHODS(Rest_req,rest);
147 };
148
149
150
151 /**
152   Requests to start or stop something.
153  This type of request typically results in the creation of a #Spanner#
154 */
155 class Span_req  : public virtual Musical_req  {
156 public:
157   /// should the spanner start or stop, or is it unwanted?
158   enum {
159     NOSPAN, START, STOP
160   } spantype ;
161   bool do_equal_b (Request*) const;
162   REQUESTMETHODS(Span_req,span);
163
164   Span_req();
165   
166 };
167
168 /** Start / stop a beam at this note.  if #nplet# is set, the staff
169 will try to put an appropriate number over the beam */
170 class Beam_req  : public Span_req  {
171 public:
172   int nplet;
173
174   /* *************** */
175   REQUESTMETHODS(Beam_req,beam);
176
177   Beam_req();
178 };
179
180 /**
181   Start a tie at this voice element, end it at the next
182  */
183 class Tie_req : public Musical_req {
184 public:
185   REQUESTMETHODS(Tie_req, tie);
186 };
187
188 /// a slur
189 class Slur_req  : public Span_req  {
190 public:
191   REQUESTMETHODS(Slur_req,slur);
192
193 };
194
195 class Musical_script_req : public Musical_req,  public Script_req {
196 public:
197   REQUESTMETHODS(Musical_script_req, musicalscript);
198 };
199
200
201 class Dynamic_req  : public virtual Musical_req  {
202 public:
203   /// for absolute dynamics
204   enum Loudness {
205     FFF, FF, F, MF, MP, P, PP, PPP
206   };
207   static String loudness_str (Loudness);
208   REQUESTMETHODS(Dynamic_req, dynamic);
209 };
210
211 class Absolute_dynamic_req  : public Dynamic_req  {
212 public:
213   Loudness loudness_;
214   Absolute_dynamic_req();
215   REQUESTMETHODS(Absolute_dynamic_req, absdynamic);
216 };
217
218 class Span_dynamic_req  : public Dynamic_req, public Span_req  {
219 public:
220   /// Grow or shrink the volume: 1=cresc, -1 = decresc 
221   Direction dynamic_dir_;
222   Span_dynamic_req();
223   REQUESTMETHODS(Span_dynamic_req, span_dynamic);
224 };
225
226 #endif // MUSICALREQUESTS_HH