]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/input-music.hh
release: 0.0.55
[lilypond.git] / lily / include / input-music.hh
1 /*
2   input-music.hh -- part of LilyPond
3
4   (c) 1996,97 Han-Wen Nienhuys
5 */
6
7 #ifndef INPUTMUSIC_HH
8 #define INPUTMUSIC_HH
9
10 #include "plist.hh"
11 #include "proto.hh"
12 #include "voice.hh"
13 #include "moment.hh"
14
15 struct Voice_list : public PointerList<Voice*> {
16     void translate_time(Moment dt);
17 };
18
19 /**
20
21   A set voices.
22   Input_music is anything that can simply be regarded as/converted to
23   a set of voices "cooperating" or independant. It has some basic
24   characteristics that real music has too:
25
26   - it is rhythmic (it has a length, and can be translated horizontally)
27   - a pitch (it can be transposed)
28
29   */
30 struct Input_music {
31     virtual Voice_list convert()const=0;
32     void check_plet(Voice_element* velt_l);
33     virtual Moment length()const=0;
34     virtual void translate_time(Moment dt)=0;
35     virtual ~Input_music(){}
36     virtual void print() const =0;
37     virtual void set_default_group(String)=0;
38     virtual bool find_plet_start_b(char c, Moment& moment_r) = 0;
39     virtual void set_plet_backwards(Moment& now_moment_r, Moment until_moment, int num_i, int den_i) = 0;
40     virtual void transpose(Melodic_req const&) const =0;
41     
42     
43     virtual Input_music *clone() const = 0;
44     virtual Simple_music *simple() { return 0; }
45 };
46
47 /// Simple music consists of one voice
48 struct Simple_music : Input_music {
49     Voice voice_;
50
51     /* *** */
52     virtual void transpose(Melodic_req const&) const ;
53
54     virtual Simple_music*simple() { return this; }  
55     void add(Voice_element*);
56     virtual void set_default_group(String g) { voice_.set_default_group(g); }
57     virtual Moment length()const;
58     virtual Voice_list convert()const;
59     virtual void translate_time(Moment dt);
60     virtual void print() const;
61     virtual bool find_plet_start_b(char c, Moment& moment_r);
62     virtual void set_plet_backwards(Moment& now_moment_r, Moment until_moment, int num_i, int den_i);
63     virtual Input_music *clone() const {
64         return new Simple_music(*this);
65     }
66 };
67
68 /// Complex_music consists of multiple voices
69 struct Complex_music : Input_music {
70     IPointerList<Input_music*> elts;
71     /* *************** */
72     virtual void transpose(Melodic_req const&) const ;
73     virtual void set_default_group(String g);
74     void add(Input_music*inmusic_p);
75     Complex_music();
76     Complex_music(Complex_music const &);
77     virtual void print() const ;
78     void concatenate(Complex_music*);
79     virtual bool find_plet_start_b(char c, Moment& moment_r);
80     virtual void set_plet_backwards(Moment& now_moment_r, Moment until_moment, int num_i, int den_i);
81 };
82
83
84 /**
85   A voice like list of music.
86
87   different music forms which start after each other ( concatenated,
88   stacked "horizontally )
89  
90  */
91
92 struct Music_voice : Complex_music {
93  
94     
95     /* *************** */
96     Moment length()const;
97     virtual void translate_time(Moment dt);
98     virtual Voice_list convert()const;
99     void add_elt(Voice_element*);
100     virtual Input_music *clone() const {
101         return new Music_voice(*this);
102     }
103     virtual void print() const ;
104 };
105
106 /**
107   Multiple musicstuff stacked on top of each other
108   chord like :
109
110   - different music forms which start at the same time ( stacked "vertically" )
111   
112   */
113 struct Music_general_chord : Complex_music {
114
115
116     /* *************** */
117
118     virtual Moment length()const;
119     virtual Voice_list convert()const;
120     virtual void translate_time(Moment dt);
121     void add_elt(Voice_element*);
122     virtual Input_music *clone() const {
123         return new Music_general_chord(*this);
124     }
125     
126     virtual void print() const ;
127 };
128
129 struct Multi_voice_chord : Music_general_chord {
130     void set_default_group(String);
131     virtual Input_music *clone() const {
132         return new Multi_voice_chord(*this);
133     }
134 };
135 struct Voice_group_chord : Music_general_chord {
136
137     virtual Input_music *clone() const {
138         return new Voice_group_chord(*this);
139     }
140 };
141 #endif // INPUTMUSIC_HH