source file of the GNU LilyPond music typesetter
- (c) 1997--1998 Jan Nieuwenhuizen <janneke@gnu.org>
+ (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
*/
#include "proto.hh"
-#include "plist.hh"
-#include "pcursor.hh"
#include "debug.hh"
#include "misc.hh"
#include "string.hh"
#include "midi-stream.hh"
#include "audio-item.hh"
-IMPLEMENT_IS_TYPE_B (Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_chunk, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_duration, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_header, Midi_chunk);
-IMPLEMENT_IS_TYPE_B1 (Midi_instrument, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_key,Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_time_signature, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_note, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_note_off, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_tempo, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_text, Midi_item);
-IMPLEMENT_IS_TYPE_B1 (Midi_track, Midi_chunk);
+#include "killing-cons.tcc"
Midi_chunk::Midi_chunk ()
: Midi_item (0)
set ("MThd", str, "");
}
+/* why doesn't this start at 0 ?
+ */
char const* const instrument_name_sz_a_[ ] = {
-
/* default is usually piano */
/* 0 "piano", */
- /* (1-8 piano) */
- /* 1 */ "acoustic grand",
+ /* (1-8 piano) */
+ /* 1 */ "acoustic grand",
/* 2 */ "bright acoustic",
/* 3 */ "electric grand",
/* 4 */ "honky-tonk",
Midi_instrument::str () const
{
Byte program_byte = 0;
- for (int i = 0; instrument_name_sz_a_[i]; i++)
+ bool found = false;
+ for (int i = 0; !found && instrument_name_sz_a_[i]; i++)
if (instrument_str_ == String (instrument_name_sz_a_[ i ]))
{
program_byte = (Byte)i;
- break;
+ found = true;
}
+ if (!found)
+ {
+ warning (_f("No such instrument: `%s'", instrument_str_.ch_C ()));
+ }
+
String str = to_str ((char) (0xc0 + channel_i_));
str += to_str ((char)program_byte);
return str;
: Midi_item (audio_item_l)
{
dynamic_byte_ = 0x7f;
+ assert (dynamic_cast<Audio_note*> (audio_item_l));
}
Moment
-Midi_note::duration () const
+Midi_note::length_mom () const
{
- Moment m = dynamic_cast <Rhythmic_req *> (audio_item_l_->req_l_)->duration ();
+ Moment m = dynamic_cast <Rhythmic_req *> (audio_item_l_->req_l_)->length_mom ();
if (m < Moment (1, 1000))
{
warning (_ ("silly duration"));
Midi_note::pitch_i () const
{
int p = dynamic_cast <Melodic_req*> (audio_item_l_->req_l_)->pitch_.semitone_pitch ()
- + ((Audio_note*)audio_item_l_)->transposing_i_;
+ + dynamic_cast<Audio_note*>(audio_item_l_)->transposing_i_;
if (p == INT_MAX)
{
warning (_ ("silly pitch"));
String str = to_str ((char)status_byte);
str += to_str ((char) (pitch_i () + c0_pitch_i_c_));
- // poor man's staff dynamics:
- str += to_str ((char) (dynamic_byte_ - 0x10 * channel_i_));
-
+ str += to_str ((char)dynamic_byte_);
return str;
}
Midi_note_off::pitch_i () const
{
return dynamic_cast <Melodic_req *> (audio_item_l_->req_l_)->pitch_.semitone_pitch ()
- + ((Audio_note*)audio_item_l_)->transposing_i_;
+ + dynamic_cast<Audio_note*>(audio_item_l_)->transposing_i_;
}
String
Midi_tempo::Midi_tempo (Audio_item* audio_item_l)
: Midi_item (audio_item_l)
{
- per_minute_4_i_ = ( (Audio_tempo*)audio_item_l_)->per_minute_4_i_;
+ per_minute_4_i_ = dynamic_cast<Audio_tempo*>(audio_item_l_)->per_minute_4_i_;
}
Midi_tempo::Midi_tempo (int per_minute_4_i)
Midi_text::Midi_text (Audio_item* audio_item_l)
: Midi_item (audio_item_l)
{
- text_str_ = ( (Audio_text*)audio_item_l_)->text_str_;
- type_ = (Type) ( (Audio_text*)audio_item_l_)->type_;
+ text_str_ = dynamic_cast<Audio_text*>(audio_item_l_)->text_str_;
+ type_ = (Type) dynamic_cast<Audio_text*>(audio_item_l_)->type_;
}
Midi_text::Midi_text (Midi_text::Type type, String text_str)
{
assert (delta_time_mom >= Moment (0));
- event_p_list_.bottom ().add (new Midi_event (delta_time_mom, mitem_p));
+ Midi_event * e = new Midi_event (delta_time_mom, mitem_p);
+ event_p_list_.append (new Killing_cons<Midi_event> (e, 0));
}
String
String str = Midi_chunk::data_str ();
if (check_debug && !monitor->silent_b ("Midistrings"))
str += "\n";
- for (PCursor<Midi_event*> i (event_p_list_); i.ok (); i++)
+ for (Cons<Midi_event> *i=event_p_list_.head_; i; i = i->next_)
{
- str += i->str ();
+ str += i->car_->str ();
if (check_debug && !monitor->silent_b ("Midistrings"))
str += "\n";
}