lilypond-0.1.17
[lilypond.git] / mi2mu / mudela-item.cc
blob7a69984b9a618825f010908bea1cf632ad36c4f9
1 //
2 // mudela-item.cc -- implement Mudela_item
3 //
4 // copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
6 #include <assert.h>
7 #include "mi2mu-global.hh"
8 #include "string-convert.hh"
9 #include "duration-convert.hh"
10 #include "mudela-column.hh"
11 #include "mudela-item.hh"
12 #include "mudela-stream.hh"
13 #include "mudela-score.hh"
15 Mudela_item::Mudela_item (Mudela_column* mudela_column_l)
17 mudela_column_l_ = mudela_column_l;
20 Moment
21 Mudela_item::at_mom ()
23 return mudela_column_l_->at_mom ();
26 Moment
27 Mudela_item::duration_mom ()
29 return Moment (0);
32 void
33 Mudela_item::output (Mudela_stream& mudela_stream_r)
35 mudela_stream_r << str () << String (" ");
38 Mudela_key::Mudela_key (int accidentals_i, int minor_i)
39 : Mudela_item (0)
41 accidentals_i_ = accidentals_i;
42 minor_i_ = minor_i;
45 String
46 Mudela_key::str ()
48 int key_i = 0;
49 if (accidentals_i_ >= 0)
50 key_i = ((accidentals_i_ % 7)[ "cgdaebf" ] - 'a' - 2) % 7;
51 else
52 key_i = ((-accidentals_i_ % 7)[ "cfbeadg" ] - 'a' - 2) % 7;
53 String str = "\\key ";
54 if (!minor_i_)
55 str += String ((char) ((key_i + 2) % 7 + 'A'));
56 else // heu, -2: should be - 1 1/2: A -> fis
57 str += String ((char) ((key_i + 2 - 2) % 7 + 'a'));
58 str = String ("% \"") + str
59 + String ('"') + "; % not supported yet\n";
60 return str;
63 String
64 Mudela_key::notename_str (int pitch_i)
66 // this may seem very smart,
67 // but it-s only an excuse not to read a notename table
69 // major scale: do-do
70 // minor scale: la-la (= + 5)
71 static int notename_i_a[ 12 ] = { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6 };
72 int notename_i = notename_i_a[ (minor_i_ * 5 + pitch_i) % 12 ];
74 static int accidentals_i_a[ 12 ] = { 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 };
75 int accidental_i = accidentals_i_a[ minor_i_ * 5 + pitch_i % 12 ];
76 if (accidental_i && (accidentals_i_ < 0))
78 accidental_i = - accidental_i;
79 notename_i = (notename_i + 1) % 7;
82 String notename_str = (char) ( ((notename_i + 2) % 7) + 'a');
83 while (accidental_i-- > 0)
84 notename_str += "is";
85 accidental_i++;
86 while (accidental_i++ < 0)
87 if ((notename_str == "a") || (notename_str == "e"))
88 notename_str += "s";
89 else
90 notename_str += "es";
91 accidental_i--;
93 String de_octavate_str = String ('\'', (Mudela_note::c0_pitch_i_c_ + 11 - pitch_i) / 12);
94 String octavate_str = String ('\'', (pitch_i - Mudela_note::c0_pitch_i_c_) / 12);
95 return de_octavate_str + notename_str + octavate_str;
98 Mudela_meter::Mudela_meter (int num_i, int den_i, int clocks_4_i, int count_32_i)
99 : Mudela_item (0)
101 sync_dur_.durlog_i_ = 3;
102 sync_f_ = 1.0;
103 if (count_32_i != 8)
104 warning (String ("#32 in quarter: ") + String (count_32_i));
105 num_i_ = num_i;
106 den_i_ = den_i;
107 clocks_1_i_ = clocks_4_i * 4;
110 Moment
111 Mudela_meter::bar_mom ()
113 Duration d;
114 d.durlog_i_ = den_i_;
115 return Moment (num_i_) * Duration_convert::dur2_mom (d);
119 Mudela_meter::clocks_1_i ()
121 return clocks_1_i_;
125 Mudela_meter::den_i ()
127 return den_i_;
131 Mudela_meter::num_i ()
133 return num_i_;
136 String
137 Mudela_meter::str ()
139 String str = "\\meter "
140 + String (num_i_) + "/" + String (1 << den_i_)
141 + ";\n";
142 return str;
146 // statics Mudela_note
148 this switch can be used to write simple plets like
149 c4*2/3
151 \plet 2/3; c4 \plet 1/1;
153 bool const Mudela_note::simple_plet_b_s = true;
155 Mudela_note::Mudela_note (Mudela_column* mudela_column_l, int channel_i, int pitch_i, int dyn_i)
156 : Mudela_item (mudela_column_l)
158 // junk dynamics
159 (void)dyn_i;
160 channel_i_ = channel_i;
161 pitch_i_ = pitch_i;
162 end_column_l_ = 0;
165 Duration
166 Mudela_note::duration ()
168 assert (end_column_l_);
169 Moment mom = end_column_l_->at_mom () - at_mom ();
170 return Duration_convert::mom2_dur (mom);
173 Moment
174 Mudela_note::duration_mom ()
176 // ugh
177 // return Duration_convert::dur2_mom (duration ());
178 return end_column_l_->at_mom () - at_mom ();
181 String
182 Mudela_note::str ()
184 Duration dur = duration ();
185 if (dur.durlog_i_ < -10)
186 return "";
188 String name_str
189 = mudela_column_l_->mudela_score_l_->mudela_key_l_->notename_str (pitch_i_);
191 if (simple_plet_b_s)
192 return name_str + Duration_convert::dur2_str (dur) + " ";
194 //ugh
195 String str;
196 if (dur.plet_b ())
197 str += String ("\\plet ")
198 + String_convert::i2dec_str (dur.plet_.iso_i_, 0, 0)
199 + "/"
200 + String_convert::i2dec_str (dur.plet_.type_i_, 0, 0)
201 + "; ";
203 str += name_str;
205 Duration tmp = dur;
206 tmp.set_plet (1,1);
207 str += Duration_convert::dur2_str (tmp);
209 if (dur.plet_b ())
210 str += String (" \\plet 1/1;");
212 return str + " ";
215 Mudela_skip::Mudela_skip (Mudela_column* mudela_column_l, Moment skip_mom)
216 : Mudela_item (mudela_column_l)
218 mom_ = skip_mom;
221 Duration
222 Mudela_skip::duration ()
224 return Duration_convert::mom2_dur (mom_);
227 Moment
228 Mudela_skip::duration_mom ()
230 return Duration_convert::dur2_mom (duration ());
233 String
234 Mudela_skip::str ()
236 if (!mom_)
237 return String ("");
239 Duration dur = duration ();
240 if (dur.durlog_i_<-10)
241 return "";
243 String str = "\\skip ";
244 str += Duration_convert::dur2_str (dur) + "; ";
246 return str;
249 Mudela_tempo::Mudela_tempo (int useconds_per_4_i)
250 : Mudela_item (0)
252 useconds_per_4_i_ = useconds_per_4_i;
253 seconds_per_1_f_ = (Real)useconds_per_4_i_ * 4 / 1e6;
256 String
257 Mudela_tempo::str ()
259 String str = "\\tempo 4=";
260 str += String (get_tempo_i (Moment (1, 4)));
261 str += ";\n";
262 return str;
265 int
266 Mudela_tempo::useconds_per_4_i ()
268 return useconds_per_4_i_;
272 Mudela_tempo::get_tempo_i (Moment moment)
274 return Moment (60) / moment / Moment (seconds_per_1_f_);
277 Mudela_text::Mudela_text (Mudela_text::Type type, String text_str)
278 : Mudela_item (0)
280 type_ = type;
281 text_str_ = text_str;
284 String
285 Mudela_text::str ()
287 if (!text_str_.length_i ()
288 || (text_str_.length_i () != (int)strlen (text_str_.ch_C ())))
289 return "";
291 return "% " + text_str_ + "\n";