source file of the GNU LilyPond music typesetter
- (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+ (c) 1997--1998 Jan Nieuwenhuizen <janneke@gnu.org>
*/
#include "proto.hh"
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_meter, 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);
Midi_chunk::str () const
{
String str = header_str_;
+ String dat = data_str ();
+#if 1
+ String length_str = String_convert::i2hex_str (dat.length_i ()
+#else
+ // huh, huh??
String length_str = String_convert::i2hex_str (data_str_.length_i ()
+#endif
+ footer_str_.length_i (), 8, '0');
length_str = String_convert::hex2bin_str (length_str);
str += length_str;
- str += data_str ();
+ str += dat;
str += footer_str_;
return str;
}
String
Midi_duration::str () const
{
- return String ("<duration: ") + String (seconds_f_) + ">";
+ return String ("<duration: ") + to_str (seconds_f_) + ">";
}
Midi_event::Midi_event (Moment delta_mom, Midi_item* mitem_p)
char const* const instrument_name_sz_a_[ ] = {
/* default is usually piano */
- /* 0 */ "piano",
+ /* 0 "piano", */
/* (1-8 piano) */
/* 1 */ "acoustic grand",
/* 19 */ "rock organ",
/* 20 */ "church organ",
/* 21 */ "reed organ",
- /* 22 */ "accoridan",
+ /* 22 */ "accordion",
/* 23 */ "harmonica",
- /* 24 */ "tango accordian",
+ /* 24 */ "concertina",
/* (25-32 guitar) */
/* 25 */ "acoustic guitar (nylon)",
/* 28 */ "electric guitar (clean)",
/* 29 */ "electric guitar (muted)",
/* 30 */ "overdriven guitar",
- /* 31 */ "distortion guitar",
+ /* 31 */ "distorted guitar",
/* 32 */ "guitar harmonics",
/* (33-40 bass) */
break;
}
- String str = String ( (char) (0xc0 + channel_i_));
- str += String ( (char)program_byte);
+ String str = to_str ((char) (0xc0 + channel_i_));
+ str += to_str ((char)program_byte);
return str;
}
String str;
while (1)
{
- str += (char)buffer_i;
+ str += to_str ((char)buffer_i);
if (buffer_i & 0x80)
buffer_i >>= 8;
else
String
Midi_key::str () const
{
- Key_change_req* k = audio_item_l_->req_l_->command ()->keychange ();
+ Key_change_req* k = dynamic_cast <Key_change_req *> (audio_item_l_->req_l_);
int sharps_i = k->sharps_i ();
int flats_i = k->flats_i ();
// midi cannot handle non-conventional keys
if (flats_i && sharps_i)
- return "";
+ {
+ String str = _f ("unconventional key: flats: %d, sharps: %d", flats_i,
+ sharps_i);
+ flats_i = sharps_i = 0;
+ }
int accidentals_i = sharps_i - flats_i;
String str = "ff5902";
return String_convert::hex2bin_str (str);
}
-Midi_meter::Midi_meter (Audio_item* audio_item_l)
+Midi_time_signature::Midi_time_signature (Audio_item* audio_item_l)
: Midi_item (audio_item_l)
{
clocks_per_1_i_ = 18;
}
String
-Midi_meter::str () const
+Midi_time_signature::str () const
{
- Meter_change_req* m = audio_item_l_->req_l_->command ()->meterchange ();
+ Time_signature_change_req* m = dynamic_cast <Time_signature_change_req *> (audio_item_l_->req_l_);
int num_i = m->beats_i_;
int den_i = m->one_beat_i_;
Moment
Midi_note::duration () const
{
- return audio_item_l_->req_l_->musical ()->rhythmic ()->duration ();
+ Moment m = dynamic_cast <Rhythmic_req *> (audio_item_l_->req_l_)->duration ();
+ if (m < Moment (1, 1000))
+ {
+ warning (_ ("silly duration"));
+ m = 1;
+ }
+ return m;
}
int
Midi_note::pitch_i () const
{
- return audio_item_l_->req_l_->musical ()->melodic ()->pitch ();
+ int p = dynamic_cast <Melodic_req*> (audio_item_l_->req_l_)->pitch_.semitone_pitch ()
+ + ((Audio_note*)audio_item_l_)->transposing_i_;
+ if (p == INT_MAX)
+ {
+ warning (_ ("silly pitch"));
+ p = 0;
+ }
+ return p;
}
String
Midi_note::str () const
{
- if (pitch_i () == INT_MAX)
- return String ("");
-
Byte status_byte = (char) (0x90 + channel_i_);
- String str = String ( (char)status_byte);
- str += (char) (pitch_i () + c0_pitch_i_c_);
+ String str = to_str ((char)status_byte);
+ str += to_str ((char) (pitch_i () + c0_pitch_i_c_));
// poor man's staff dynamics:
- str += (char) (dynamic_byte_ - 0x10 * channel_i_);
+ str += to_str ((char) (dynamic_byte_ - 0x10 * channel_i_));
return str;
}
int
Midi_note_off::pitch_i () const
{
- return audio_item_l_->req_l_->musical ()->melodic ()->pitch ();
+ return dynamic_cast <Melodic_req *> (audio_item_l_->req_l_)->pitch_.semitone_pitch ()
+ + ((Audio_note*)audio_item_l_)->transposing_i_;
}
String
Midi_note_off::str () const
{
- if (pitch_i () == INT_MAX)
- return String ("");
-
Byte status_byte = (char) (0x80 + channel_i_);
- String str = String ( (char)status_byte);
- str += (char) (pitch_i () + Midi_note::c0_pitch_i_c_);
- str += (char)aftertouch_byte_;
+ String str = to_str ((char)status_byte);
+ str += to_str ((char) (pitch_i () + Midi_note::c0_pitch_i_c_));
+ str += to_str ((char)aftertouch_byte_);
return str;
}
void
Midi_track::add (Moment delta_time_mom, Midi_item* mitem_p)
{
- assert (delta_time_mom >= 0);
+ assert (delta_time_mom >= Moment (0));
+
event_p_list_.bottom ().add (new Midi_event (delta_time_mom, mitem_p));
}