1 // mpp96's second egg of columbus!
8 /// a voice element wants something printed
14 virtual void print()const ;
15 virtual Note_req *note() {return 0;}
16 virtual Rest_req *rest() {return 0;}
17 virtual Rhythmic_req*rhythmic() { return 0;}
18 Request(Voice_element*);
20 virtual Real duration() const { return 0.0; }
24 Any Voice_element can do a number of requests. A request is done
25 to the #Staff# which contains the #Voice_element#. The staff decides
26 whether to to honor the request, ignore it, or merge it with other
27 requests. Merging of requests is preferably done with other
28 requests done by members of the same voicegroups (beams, brackets, stems)
30 Please refer to the documentation of the Child classes of
31 #Request# for explanation of each request type.
33 The result of a request will be an #Item# or a #Spanner#, which
34 will be put on a #PStaff#. Note that the #PStaff# and the original
35 #Staff# need not have anything in common. For example, the
36 ``double'' piano Staff could interpret commands which juggle
37 melodies across the left and right hand, and may put the result in
38 two five-line PStaffs (maybe with extra PStaffs to carry the dynamic
41 The class #Staff# should be thought as a container for the
42 #Voice#s, and an interpreter for #Request#s and #Command#s.
43 Different staffs can produce different outputs; a melodious voice
44 which is put into a percussion-Staff, will be typeset as the rythm of
47 After #Staff# made up her mind (Would #Staff# be a smart
48 name? How about #struct Lily {}# :-), the resultant items and
49 spanners are put on the PScore, and pointers to these items are
50 stored in the #Voice_element#. This construction enables the
51 beams/stems to look up the balls it has to connect to. */
54 /// a request with a duration
55 struct Rhythmic_req : Request {
61 Real duration() const;
62 Rhythmic_req(Voice_element*);
63 Rhythmic_req*rhythmic() { return this;}
67 /// Put a note of specified type, height, and with accidental on the staff.
68 struct Note_req : Rhythmic_req {
76 // return height from central c (in halflines)
78 Note_req(Voice_element*v);
79 Note_req*note() { return this;}
80 virtual void print() const;
83 Staff has to decide if the ball should be hanging left or right. This
84 influences the horizontal dimensions of a column, and this is why
85 request processing should be done before horizontal spacing.
87 Other voices' frivolities may cause the need for accidentals, so this
88 is also for the Staff to decide. The Staff can decide on positioning
89 based on ottava commands and the appropriate clef.
93 ///Put a rest on the staff.
94 struct Rest_req : Rhythmic_req {
96 Rest_req(Voice_element*v) : Rhythmic_req(v) { }
97 Rest_req * rest() { return this;}
100 Why a request? It might be a good idea to not typeset the rest, if the paper is too crowded.
105 ///Put a lyric above or below (?) this staff.
106 struct Lyric_req : Request {
111 ///Put a script above or below this ``note''
112 struct Script_req : Request {
117 eg upbow, downbow. Why a request? These symbols may conflict with slurs and brackets, so this
124 ///Draw a (Guitar) chord above or below this ``note''
125 struct Chord : Request {
126 // don't know how this looks.
130 Because everything else is done in requests.
134 /// for absolute dynamics
136 FFF, FF, F, MF, MP, P, PP, PPP
139 /// attach a stem to the noteball
140 struct Stem_req : Request {
144 /// requests to start or stop something.
145 struct Span_req : Request {
146 /// should the spanner start or stop, or is it unwanted?
152 This type of request typically results in the creation of a #Spanner#
156 ///Start / stop a beam at this note.
157 struct Beam_req : Span_req {
160 /** Staff will have to combine this with the stem_request, since the
161 number of flags that a stem wants to carry will determine the
162 number of beams. if #nplet# is set, the staff will try to put an
163 appropriate number over the beam
165 [what to do if the nplet fields of start and stop conflict?]
168 ///Start / stop a slur or a bracket.
169 struct Bracket_req : Span_req {
173 Start/stop a bracket at this note. if #nplet# is set, the staff will
174 try to put an appropriate number over the bracket
178 struct Slur_req : Span_req {
182 /// helper in the hierarchy
186 /** Each dynamic is bound to one note ( a crescendo spanning multiple
187 notes is thought to be made of two "dynamics": a start and a stop).
188 Dynamic changes can occur in a smaller time than the length of its
189 note, therefore fore each Dynamic request carries a time, measured
190 from the start of its note.
192 This subfield would come in handy, if mpp96 was adapted for midi
195 Dynamic should have been derived from request, but I don't want to
196 fuss with virtual baseclasses. */
199 struct Cresc_req : Span_req, Dynamic {
204 struct Decresc_req : Span_req, Dynamic {
208 /// do a dynamic like "fff" or "mp"
209 struct Absdynamic_req : Request, Dynamic {