2 // mudela-item.cc -- implement Mudela_item
4 // copyright 1997 Jan Nieuwenhuizen <janneke@gnu.org>
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 Mudela_item::~Mudela_item ()
25 Mudela_item::at_mom ()
27 return mudela_column_l_->at_mom ();
31 Mudela_item::duration_mom ()
37 Mudela_item::output (Mudela_stream& mudela_stream_r)
39 mudela_stream_r << str () << " ";
42 Mudela_key::Mudela_key (int accidentals_i, int minor_i)
45 accidentals_i_ = accidentals_i;
53 if (accidentals_i_ >= 0)
54 key_i = ((accidentals_i_ % 7)[ "cgdaebf" ] - 'a' - 2) % 7;
56 key_i = ((-accidentals_i_ % 7)[ "cfbeadg" ] - 'a' - 2) % 7;
58 String keyname = (1) // !minor_i_)
59 ? to_str ((char) ((key_i + 2) % 7 + 'A'))
60 : to_str ((char) ((key_i + 2 - 2) % 7 + 'a'));
61 // heu, -2: should be - 1 1/2: A -> fis
63 return String("\\key " + keyname + ";\n");
67 Mudela_key::notename_str (int pitch_i)
69 // this may seem very smart,
70 // but it-s only an excuse not to read a notename table
73 // minor scale: la-la (= + 5)
74 static int notename_i_a[ 12 ] = { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6 };
75 int notename_i = notename_i_a[ (minor_i_ * 5 + pitch_i) % 12 ];
77 static int accidentals_i_a[ 12 ] = { 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 };
78 int accidental_i = accidentals_i_a[ (minor_i_ * 5 + pitch_i) % 12 ];
79 if (accidental_i && (accidentals_i_ < 0))
81 accidental_i = - accidental_i;
82 notename_i = (notename_i + 1) % 7;
85 String notename_str = to_str ((char)(((notename_i + 2) % 7) + 'a'));
86 while (accidental_i-- > 0)
89 while (accidental_i++ < 0)
90 if ((notename_str == "a") || (notename_str == "e"))
96 String de_octavate_str = to_str (',', (Mudela_note::c0_pitch_i_c_ + 11 - pitch_i) / 12);
97 String octavate_str = to_str ('\'', (pitch_i - Mudela_note::c0_pitch_i_c_) / 12);
98 return notename_str +de_octavate_str + octavate_str;
101 Mudela_time_signature::Mudela_time_signature (int num_i, int den_i, int clocks_4_i, int count_32_i)
104 sync_dur_.durlog_i_ = 3;
107 warning (_f ("#32 in quarter: %d", count_32_i));
110 clocks_1_i_ = clocks_4_i * 4;
114 Mudela_time_signature::bar_mom ()
117 d.durlog_i_ = den_i_;
118 return Moment (num_i_) * Duration_convert::dur2_mom (d);
122 Mudela_time_signature::clocks_1_i ()
128 Mudela_time_signature::den_i ()
134 Mudela_time_signature::num_i ()
140 Mudela_time_signature::str ()
142 String str = "\\time "
143 + to_str (num_i_) + "/" + to_str (1 << den_i_)
149 // statics Mudela_note
151 this switch can be used to write simple plets like
154 \plet 2/3; c4 \plet 1/1;
157 UGH: .hh says false, .cc says true.
160 bool const Mudela_note::simple_plet_b_s;
162 Mudela_note::Mudela_note (Mudela_column* mudela_column_l,
163 int channel_i, int pitch_i, int dyn_i)
164 : Mudela_item (mudela_column_l)
168 channel_i_ = channel_i;
174 Mudela_note::duration ()
176 assert (end_column_l_);
177 Moment mom = end_column_l_->at_mom () - at_mom ();
178 return Duration_convert::mom2_dur (mom);
182 Mudela_note::duration_mom ()
184 assert (end_column_l_);
185 return end_column_l_->at_mom () - at_mom ();
191 Duration dur = duration ();
192 if (dur.durlog_i_ < -10)
196 = mudela_column_l_->mudela_score_l_->mudela_key_l_->notename_str (pitch_i_);
199 return name_str + Duration_convert::dur2_str (dur) + " ";
205 str += String ("\\[")
206 + String_convert::i2dec_str (dur.plet_.iso_i_, 0, 0)
208 + String_convert::i2dec_str (dur.plet_.type_i_, 0, 0);
214 str += Duration_convert::dur2_str (tmp);
217 str += String (" \\]");
220 note of zero duration is nonsense,
221 but let's output anyway for convenient debugging
223 if (!duration_mom ())
224 return String ("\n% ") + str + "\n";
229 Mudela_skip::Mudela_skip (Mudela_column* mudela_column_l, Moment skip_mom)
230 : Mudela_item (mudela_column_l)
236 Mudela_skip::duration ()
238 return Duration_convert::mom2_dur (mom_);
242 Mudela_skip::duration_mom ()
244 return Duration_convert::dur2_mom (duration ());
253 Duration dur = duration ();
254 if (dur.durlog_i_<-10)
257 String str = "\\skip ";
258 str += Duration_convert::dur2_str (dur) + "; ";
263 Mudela_tempo::Mudela_tempo (int useconds_per_4_i)
266 useconds_per_4_i_ = useconds_per_4_i;
267 seconds_per_1_mom_ = Moment(useconds_per_4_i_ *4, 1e6);
273 String str = "\\tempo 4=";
274 str += to_str (get_tempo_i (Moment (1, 4)));
280 Mudela_tempo::useconds_per_4_i ()
282 return useconds_per_4_i_;
286 Mudela_tempo::get_tempo_i (Moment moment)
288 Moment m1 = Moment (60) / moment;
289 Moment m2 = seconds_per_1_mom_;
293 Mudela_text::Mudela_text (Mudela_text::Type type, String text_str)
297 text_str_ = text_str;
303 if (!text_str_.length_i ()
304 || (text_str_.length_i () != (int)strlen (text_str_.ch_C ())))
307 return "% " + text_str_ + "\n";