X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmidi-item.cc;h=9806910b55a382b1058f82847f92e47099260c8a;hb=0e0a18dbaa12275d0a07b76104243a15da821a15;hp=39883f8328e138f2b9065dbf32a4f2d5d3c8f5ce;hpb=3d59b15cfcb500305c85f2f58d708e09c81a6b95;p=lilypond.git diff --git a/lily/midi-item.cc b/lily/midi-item.cc index 39883f8328..9806910b55 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -3,10 +3,9 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1999 Jan Nieuwenhuizen + (c) 1997--2000 Jan Nieuwenhuizen */ -#include "proto.hh" #include "debug.hh" #include "misc.hh" #include "string.hh" @@ -27,6 +26,10 @@ Midi_item::midi_p (Audio_item* a) return i->str_.length_i () ? new Midi_instrument (i) : 0; else if (Audio_note* i = dynamic_cast (a)) return new Midi_note (i); + else if (Audio_dynamic* i = dynamic_cast (a)) + return new Midi_dynamic (i); + else if (Audio_piano_pedal* i = dynamic_cast (a)) + return new Midi_piano_pedal (i); else if (Audio_tempo* i = dynamic_cast (a)) return new Midi_tempo (i); else if (Audio_time_signature* i = dynamic_cast (a)) @@ -88,7 +91,8 @@ Midi_event::Midi_event (Moment delta_mom, Midi_item* midi_p) String Midi_event::str () const { - int delta_i = delta_mom_ * Moment (Duration::division_1_i_s); + int delta_i = delta_mom_ * Moment (384 * 4); // ugh. + String delta_str = Midi_item::i2varint_str (delta_i); String midi_str = midi_p_->str (); assert (midi_str.length_i ()); @@ -112,7 +116,10 @@ Midi_header::Midi_header (int format_i, int tracks_i, int clocks_per_4_i) set ("MThd", str, ""); } + /* why doesn't this start at 0 ? + + TODO: -> IN GUILE! */ char const* const instrument_name_sz_a_[ ] = { /* default is usually piano */ @@ -300,7 +307,7 @@ Midi_instrument::str () const if (!found) { - warning (_f("No such instrument: `%s'", audio_l_->str_.ch_C ())); + warning (_f ("no such instrument: `%s'", audio_l_->str_.ch_C ())); } String str = to_str ((char) (0xc0 + channel_i_)); @@ -348,8 +355,9 @@ Midi_key::Midi_key (Audio_key*a) String Midi_key::str () const { - int sharps_i = audio_l_->key_.sharps_i (); - int flats_i = audio_l_->key_.flats_i (); + // fxime. + int sharps_i = 0; //audio_l_->key_.sharps_i (); + int flats_i = 0; //audio_l_->key_.flats_i (); // midi cannot handle non-conventional keys if (flats_i && sharps_i) @@ -362,7 +370,9 @@ Midi_key::str () const String str = "ff5902"; str += String_convert::i2hex_str (accidentals_i, 2, '0'); - str += String_convert::i2hex_str ((int)audio_l_->key_.minor_b (), 2, '0'); + + // (int)audio_l_->key_.minor_b () + str += String_convert::i2hex_str (0, 2, '0'); return String_convert::hex2bin_str (str); } @@ -454,6 +464,58 @@ Midi_note_off::str () const return str; } +Midi_dynamic::Midi_dynamic (Audio_dynamic* a) +{ + audio_l_ = a; +} + +String +Midi_dynamic::str () const +{ + Byte status_byte = (char) (0xB0 + channel_i_); + String str = to_str ((char)status_byte); + + /* + Main volume controller (per channel): + 07 MSB + 27 LSB + */ + static Real const full_scale = 127; + + int volume = (int)(audio_l_->volume_*full_scale); + if (volume <= 0) + volume = 1; + if (volume > full_scale) + volume = (int)full_scale; + + str += to_str ((char)0x07); + str += to_str ((char)volume); + return str; +} + +Midi_piano_pedal::Midi_piano_pedal (Audio_piano_pedal* a) +{ + audio_l_ = a; +} + +String +Midi_piano_pedal::str () const +{ + Byte status_byte = (char) (0xB0 + channel_i_); + String str = to_str ((char)status_byte); + + if (audio_l_->type_str_ == "Sostenuto") + str += to_str ((char)0x42); + else if (audio_l_->type_str_ == "Sustain") + str += to_str ((char)0x40); + else if (audio_l_->type_str_ == "UnaChorda") + str += to_str ((char)0x43); + + int pedal = ((1 - audio_l_->dir_) / 2 ) * 0x7f; + str += to_str ((char)pedal); + return str; +} + Midi_tempo::Midi_tempo (Audio_tempo* a) { audio_l_ = a; @@ -544,12 +606,12 @@ String Midi_track::data_str () const { String str = Midi_chunk::data_str (); - if (check_debug && !monitor->silent_b ("Midistrings")) + if (flower_dstream && !flower_dstream->silent_b ("Midistrings")) str += "\n"; for (Cons *i=event_p_list_.head_; i; i = i->next_) { str += i->car_->str (); - if (check_debug && !monitor->silent_b ("Midistrings")) + if (flower_dstream && !flower_dstream->silent_b ("Midistrings")) str += "\n"; } return str;