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;
156 bool const Mudela_note::simple_plet_b_s
= true;
158 Mudela_note::Mudela_note (Mudela_column
* mudela_column_l
,
159 int channel_i
, int pitch_i
, int dyn_i
)
160 : Mudela_item (mudela_column_l
)
164 channel_i_
= channel_i
;
170 Mudela_note::duration ()
172 assert (end_column_l_
);
173 Moment mom
= end_column_l_
->at_mom () - at_mom ();
174 return Duration_convert::mom2_dur (mom
);
178 Mudela_note::duration_mom ()
180 assert (end_column_l_
);
181 return end_column_l_
->at_mom () - at_mom ();
187 Duration dur
= duration ();
188 if (dur
.durlog_i_
< -10)
192 = mudela_column_l_
->mudela_score_l_
->mudela_key_l_
->notename_str (pitch_i_
);
195 return name_str
+ Duration_convert::dur2_str (dur
) + " ";
200 str
+= String ("\\[")
201 + String_convert::i2dec_str (dur
.plet_
.iso_i_
, 0, 0)
203 + String_convert::i2dec_str (dur
.plet_
.type_i_
, 0, 0);
209 str
+= Duration_convert::dur2_str (tmp
);
212 str
+= String (" \\]");
215 note of zero duration is nonsense,
216 but let's output anyway for convenient debugging
218 if (!duration_mom ())
219 return String ("\n% ") + str
+ "\n";
224 Mudela_skip::Mudela_skip (Mudela_column
* mudela_column_l
, Moment skip_mom
)
225 : Mudela_item (mudela_column_l
)
231 Mudela_skip::duration ()
233 return Duration_convert::mom2_dur (mom_
);
237 Mudela_skip::duration_mom ()
239 return Duration_convert::dur2_mom (duration ());
248 Duration dur
= duration ();
249 if (dur
.durlog_i_
<-10)
252 String str
= "\\skip ";
253 str
+= Duration_convert::dur2_str (dur
) + "; ";
258 Mudela_tempo::Mudela_tempo (int useconds_per_4_i
)
261 useconds_per_4_i_
= useconds_per_4_i
;
262 seconds_per_1_mom_
= Moment(useconds_per_4_i_
*4, 1e6
);
268 String str
= "\\tempo 4=";
269 str
+= to_str (get_tempo_i (Moment (1, 4)));
275 Mudela_tempo::useconds_per_4_i ()
277 return useconds_per_4_i_
;
281 Mudela_tempo::get_tempo_i (Moment moment
)
283 Moment m1
= Moment (60) / moment
;
284 Moment m2
= seconds_per_1_mom_
;
288 Mudela_text::Mudela_text (Mudela_text::Type type
, String text_str
)
292 text_str_
= text_str
;
298 if (!text_str_
.length_i ()
299 || (text_str_
.length_i () != (int)strlen (text_str_
.ch_C ())))
302 return "% " + text_str_
+ "\n";